꺼내먹는지식 준

Matplotlib Scatter Plot 본문

CS/데이터시각화

Matplotlib Scatter Plot

알 수 없는 사용자 2022. 2. 4. 02:32

Scatter plot(산점도)은 점을 사용하여 두 feature 간의 관계를 알기 위해 사용하는 그래프 

직교 좌표계에서 x축/ y축에 feature값을 매핑하여 사용 

.scatter() 사용

예시) 

Scatter Plot 요소 

1) 색 (color)

2) 모양 (marker)

3) 크기 (size)

점 자체는 2차원에서 그려지지만, 색 모양 크기를 사용하여 5 ~ 차원의 데이터도 그릴 수 있다. 

 

코드 구현 

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111, aspect=1)

np.random.seed(970725)

x = np.random.rand(20)
y = np.random.rand(20)
s = np.arange(20) * 20

ax.scatter(x, y, 
           s= s,
           c='white',
           marker='o',
           linewidth=1,
           edgecolor='black')

plt.show()

s 즉 size 에 0 ~ 400 의 수를 입력, 다양한 크기의 점이 scatter 된 것을 볼 수 있다. 

사용 데이터

Iris 데이터

iris.describe(include='all')

Scatter Plot 목적

상관 관계 확인

처음에 참고한 예시도 상관 관계를 파악하기 위하여 사용하였다. 

피어슨 계수, 공분산 등 value 로 파악도 가능 

 

데이터가 어떻게 묶여있는지도 파악할 수 있다. (분류)

값 사이의 차이, 이상치도 파악 가능하다. 

코드 구현 

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111)

slc_mean = iris['SepalLengthCm'].mean()
swc_mean = iris['SepalWidthCm'].mean()

ax.scatter(x=iris['SepalLengthCm'], 
           y=iris['SepalWidthCm'],
           c=['royalblue' if yy <= swc_mean else 'gray' for yy in iris['SepalWidthCm']]
          )

plt.show()

Sepal Width 가 평균보다 작으면 gray 색상, 아니면 royalblue 색상으로 지정했다. 

즉, 각각 데이터 마다 색상을 지정해 줄 수 있다. 

scatter 를 통해 두 데이터의 상관 관계도 볼 수 있다. 

fig = plt.figure(figsize=(7, 7))
ax = fig.add_subplot(111)

for species in iris['Species'].unique():
    iris_sub = iris[iris['Species']==species]
    ax.scatter(x=iris_sub['SepalLengthCm'], 
               y=iris_sub['SepalWidthCm'], 
               label=species)

ax.legend()    
plt.show()

약간 더 고차원 적인 방법을 사용하여 모든 Species 별로 색상을 다르게 지정해주었다. 

Species 내에 unique 한 값들, 즉 species 별로 figure 위에 scatter 그림을 그리고, 동시에 label 도 species 로 설정해준다. 

그 후, plt.show() 로 한번에 그리면 각 종류별로 색상이 다른 figure 가 그려진다. 

간단하게 선을 추가하여 더 큰 시각적 효과를 얻을 수 있다. 

ax.axvline(2.5, color='gray', linestyle=':')    
ax.axhline(0.8, color='gray', linestyle=':')

 

fig, axes = plt.subplots(4, 4, figsize=(14, 14))

feat = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']

for i, f1 in enumerate(feat):
    for j, f2 in enumerate(feat):
        if i <= j : 
            axes[i][j].set_visible(False)
            continue
        for species in iris['Species'].unique():
            iris_sub = iris[iris['Species']==species]
            axes[i][j].scatter(x=iris_sub[f2], 
                               y=iris_sub[f1], 
                               label=species, 
                               alpha=0.7)
        if i == 3: axes[i][j].set_xlabel(f2)
        if j == 0: axes[i][j].set_ylabel(f1)

plt.tight_layout()        
plt.show()

axes 도 visible(False) 처리가 가능하다. 

tight_layout() 메소드는 서브 플롯간에 올바른 간격을 자동으로 유지

Scatter Plot 사용 

점이 많아질수록 점의 분포를 파악하기 어렵다. 

1) 투명도 조절 

2) 지터링 (jittering) : 점의 위치를 약간씩 변경 (잘 사용 X)

3) 2차원 히스토그램 : 히트맵을 사용하여 깔끔한 시각화

4) Contour plot : 등고선을 사용하여 분포 표현

 

점의 요소와 인지

색: 연속은 gradient, 이산은 개별 색상 

마커: 거의 구별이 힘들다 + 크기가 고르지 않다. (잉크 비례 법칙에 따라 크기가 같아야 하나 각 마커(ex. 네모,세모)는 크기가 다르다.)

크기: 흔히 버블 차트라고 부름, 구별하기는 쉬우나 오용이 쉽다.(각 크기 차이 직관적 파악 어렵다.) 관계 보다는 각 점간 비율에 초점을 둔다면 사용 좋다. SWOT 분석 등에 활용 가능 

 

인과 관계와 상관관계

인관 관계와 상관 관계는 다르다. 

상관 관계: x축과 y축이 비슷한 점이 있어서 같이 커질 수 있다

인과 관계: x축 때문에 y축이 변한다. 

상관 관계가 있다고 꼭 인과 관계로 연결되는 것은 아니다. 인과 관계는 추측, Domain background 와 같이 제공되는 것. 

 

추세선 

추세선을 사용하면 scatter의 패턴을 유추할 수 있음

ETC

그리드를 사용하면 정보가 많이 겹쳐 보인다. 그리드를 사용하면 점이 적은 경우에, 그리고 색은 무채색으로 사용해야 한다. 

연속적인 값이 아닐 때는 heat map 또는 bubble chart가 낫다. 

 

'CS > 데이터시각화' 카테고리의 다른 글

Matplotlib Color  (0) 2022.02.07
Matplotlib 기본기에서 벗어나는 몇가지 팁  (0) 2022.02.07
Matplotlib Line Plot  (0) 2022.02.03
Matplotlib Bar Plot  (0) 2022.02.03
Matplotlib 기본  (0) 2022.02.03
Comments