본문 바로가기

부스트캠프 AI Tech/Data visualization

[Data viz(1)] 기본적인 차트

1.Bar plot

 

  • 직사각형 막대를 사용하여 데이의 값을 표현하는 차트
  • 범주(category)에 따른 수치 값을 비교하기 적합
  • 막대의 방향에 따른 분류 (.bar() , .barh())
    • 수직(vertical) : x축에 범주, y축에 값 표기. (default)
    • 수평(horizontal) : y축에 범주, x축에 값 표기. (범주가 많을 때 적합)

 

2. Multiple Bar Plot

  • 플롯을 여러 개 그리는 방법

  • 한 개의 플롯에 동시에 나타내는 방법
    • Stacked Bar Plot - 맨 밑 bar 분포 파악만 쉬움, pos/neg 그룹이라면 축 조정 가능
    • Percentage Stacked Bar Chart - Stacked Bar Plot의 응용, 수치를 적어 비교 용이
    • Overlapped Bar Plot - 2개 그룹만 비교할때 사용, 같은 축을 사용하여 비교가 쉬움
    • Grouped Bar Plot - 그룹별 범주에 따른 bar를 이웃되게 배치, Matplotlib으로는 비교적 구현이 까다로움

Stacked Bar Plat & Percentage Stacked Bar Chart
Overlapped Bar Plot & Grouped Bar Plot

 

 

3. 데이터 정렬하기

  • 더 정확한 정보 전달을 위해 정렬은 필수.
    • pandas에서는 sort_values(), sort_index() 사용
  • 데이터의 종류에 따라 다음 기준으로
    1. 시계열 - 시간순
    2. 수치형 - 크기순
    3. 순서형 - 범주의 순서대로
    4. 명목형 - 범주의 값 따라 정렬
  • 여러 가지 기준으로 정렬하여 패턴을 발견
  • 대시보드에서는 interactive로 제공하는것이 유용

 

4. 실습

 

  1. Multiple Bar Plot

fig, axes = plt.subplots(1, 2, figsize=(15, 7))
axes[0].bar(group['male'].index, group['male'], color='royalblue')
axes[1].bar(group['female'].index, group['female'], color='tomato')
plt.show()

  • fig, axes = plt.subplots(1, 2, figsize=(15, 7), sharey=True) 를 통해 범위 통일
  • # y축 범위 지정
    for ax in axes:
        ax.set_ylim(0, 200)

 

 

  2. Stacked Bar Plot

fig, axes = plt.subplots(1, 2, figsize=(15, 7))

group_cnt = student['race/ethnicity'].value_counts().sort_index()
axes[0].bar(group_cnt.index, group_cnt, color='darkgray')
axes[1].bar(group['male'].index, group['male'], color='royalblue')
axes[1].bar(group['female'].index, group['female'], bottom=group['male'], color='tomato')

for ax in axes:
    ax.set_ylim(0, 350)
    
plt.show()

 

 

 

  3. Percentage Stacked Bar Plot

fig, ax = plt.subplots(1, 1, figsize=(12, 7))

group = group.sort_index(ascending=False) # 역순 정렬
total=group['male']+group['female'] # 각 그룹별 합


ax.barh(group['male'].index, group['male']/total, 
        color='royalblue')

ax.barh(group['female'].index, group['female']/total, 
        left=group['male']/total, 
        color='tomato')

ax.set_xlim(0, 1)
for s in ['top', 'bottom', 'left', 'right']:
    ax.spines[s].set_visible(False)

plt.show()

  4. Overlapped Bar Plot

 

group = group.sort_index() # 다시 정렬

fig, axes = plt.subplots(2, 2, figsize=(12, 12))
axes = axes.flatten()

for idx, alpha in enumerate([1, 0.7, 0.5, 0.3]):
    axes[idx].bar(group['male'].index, group['male'], 
                  color='royalblue', 
                  alpha=alpha)
    axes[idx].bar(group['female'].index, group['female'],
                  color='tomato',
                  alpha=alpha)
    axes[idx].set_title(f'Alpha = {alpha}')
    
for ax in axes:
    ax.set_ylim(0, 200)
    
    
plt.show()

 

 

2.5 Grouped Bar Plot

  • x축 조정
  • width 조정
  • xticks, xticklabels
fig, ax = plt.subplots(1, 1, figsize=(12, 7))

idx = np.arange(len(group['male'].index))
width=0.35

ax.bar(idx-width/2, group['male'], 
       color='royalblue',
       width=width)

ax.bar(idx+width/2, group['female'], 
       color='tomato',
       width=width)

ax.set_xticks(idx)
ax.set_xticklabels(group['male'].index)
ax.legend()

plt.show()

 

 

 

==========================================================================

 

 

2.Line Plot

 

1.1 Line plot

  • Line Plot은 연속적으로 변화하는 값을 순서대로 점으로 나타내고, 이를 선으로 연결한 그래프
  • 꺾은선 그래프, 선 그래프, line chart, line graph 등의 이름으로 사용
  • 시간/순서에 대한 변화에 적합하여 추세를 살피기 위해 사용
    • 시게열 분석에 특화
  • .plot()

 

 

1.2 Line plot의 요소

  • 5개 이하의 선을 사용(그 이상은 가독성 하락)
  • 구분 요소
    • 색상(color)
    • 마커(marker, markersize)
    • 선의 종류(linestyle, linewidth)

 

1.3 Pre-processing

  • smoothing  ex) Moving-average filter

 

 

2.1 추세에 집중

  • 구체적인 line plot보다 생략된 line plot이 더 나을 수 있음
    • grid, annotate 등 모두 제거
    • 디테일한 정보는 표로 제공하는 것 추천
  • 생략되지 않는 선에서 범위를 조정하여 변화율 관찰(.set_ylim())

 

 

2.2 간격

  • x축의 간격이 규칙적인 간격이 아니라면 오해를 줄 수 있음
    • 그래프 상에서 규칙적일 때 : 기울기 정보의 오해
    • 그래프 상에서 간격이 다를 때 : 없는 데이터에 대해 있다고 오해
  • 규칙적인 간격의 데이터가 아니라면 각 관측 값에 점으로 표시하여 오해를 줄임

 

 

2.3 보간 (Interpolation)

  • 보간 : 점과 점 사이에 데이터가 없을 때 이를 잇는 방법
  • 데이터의 error나 noise가 포함되어 있는 경우
    • Moving Average
    • Smooth Curve with Scipy
      • scipy.interpolate.make_interp.spline()
      • scipy.interpolate.interp1d()
      • scipy.ndimage.gaussian_filter1d()
  • Presentation에는 좋을 수 있으나 일반적인 분석에서는 지양할 것

 

 

2.4 이중 축 사용

  • 한 plot에 대해 2개의 축을 이중 축(dual axis)라고 함
  • 같은 시간 축에 대해 서로 다른 종류의 데이터를 표현하기 위함
  • 한 데이터에 대해 다른 단위 (ex. radian, degree)
    • .secondary_xaxis(), .secondary_yaxis()
  • 함부로 사용하는것은 지양

 

 

2.5 ETC

  • 라인 끝 단에 레이블을 추가하면 식별에 도움(범례 대신)
  • Min/Max 정보(또는 원하는 포인트)는 추가해주면 도움이 될 수 있음 (annotation, )
  • 보다 연한 색을 사용하여 uncertainty 표현 가능(신뢰구간, 분산 등)

 

 

 

==========================================================================

 

 

 

3. Scatter Plot

 

1.1 Scatter Plot?

  • Scatter plot은 점을 사용하여 두 feature간의 관계를 알기 위해 사용하는 그래프
  • 산점도 등의 이름으로 사용
  • 직교 좌표계에서 x축/y축에 feature 값을 매핑해서 사용
  • .scatter()

 

 

1.2 Scatter plot의 요소

  • 점에서 다양한 variation 사용 가능
    • 색(color)
    • 모양(marker)
    • 크기(size)

 

1.3 Scatter plot의 목적

  • 상관 관계 확인 (양의 상관관계 / 음의 상관관계 / 없음)
  • 세 가지 확인 해야함

 

 

 

2.1 Overplotting

  • 점이 많아질수록 점의 분포를 파악하기 힘들다
    • 투명도 조정
    • 지터링(jittering) : 점의 위치를 약간씩 변경
    • 2차원 히스토그램 : 히트맵을 사용하여 깔끔한 시각화
    • Contour plot : 분포를 등고선을 사용하여 표현

2.2 점의 요소와 인지

  • 색 - 연속은 gradient, 이산은 개별 색상으로
  • 마커 - 거의 구별하기 힘들고 크기가 고르지 않음
  • 크기
    • 흔히 버블 차트 (bubble chart)라고 부름
    • 구별하기는 쉽지만 오용하기 쉬움
    • 관계보다는 각 점간 비율에 초점을 둔다면 좋음
    • SWOT 분석 등에 활용 가능

 

2.3 인과관계 상관관계

  • 인과 관계(causal relation)과 상관 관계(correlation)은 다름!
  • 인과 관계는 항상 사전 정보와 함께 가정으로 제시할 것
  • 인과관계 : 특정한 사건이 다른 사건에 직접적으로 영향을 줌.
  • 상관관계 : 두 가지 사건에 연관성은 존재하지만, 그 연관성이 직접적인 원인이 존재하고 그에 따른 결과인 것인지는 알 수 없음. 원인이 증명되지 않은 상태이기 때문에 제대로 된 논리성이 존재하지 않아 신뢰성이 많이 떨어짐

 

 

2.4 추세선

  • 추세선을 사용하면 scatter의 패턴을 유추할 수 있음
  • 추세선 2개 이상 사용 주의 (가독성)

 

 

2.5 ETC

  • Grid는 지양, 사용한다면 최소
  • 범주형이 포함된 관계에서는 heatmap 또는 bubble chart를 추천

 

'부스트캠프 AI Tech > Data visualization' 카테고리의 다른 글

[Data viz(5)] Pie Charts  (0) 2021.09.08
[Data viz(3)] Seaborn  (0) 2021.08.23
[Data viz(1)] Inroduction to Visualization  (0) 2021.08.09