[U] Week 3 - Matplotlib 2

JaeJun Lee ·2022년 10월 6일
0

부스트캠프 AI Tech

목록 보기
22/30

Bar Plot

Bar Plot은 직사각형 막대를 사용하여 데이터의 값을 표현하는 차트 및 그래프로 막대 그래프, bar chart, bar graph 등의 이름으로 사용된다.

  • 범주(category)에 따른 수치 값을 비교하기에 적합한 방법
    • 개별 비교, 그룹 비교 모두 적합

막대의 방향에 따라 .bar(), .barh()로 분류된다.

  • .bar(): 수직(vertical)로 x축에 범주, y축에 값을 표기 (default)
  • .barh(): 수평(horizontal)로 y축에 범주, x축에 값을 표기 (범주가 많을 때 적합)
fig, axes = plt.subplots(1, 2, figsize=(12, 7))

x = list('ABCDE')
y = np.array([1, 2, 3, 4, 5])

axes[0].bar(x, y)
axes[1].barh(x, y)

plt.show()

Bar에 색은 list를 활용하여 지정할 수도 있다.

clist = ['blue', 'gray', 'gray', 'gray', 'red']
color = 'green'
axes[0].bar(x, y, color=clist)
axes[1].barh(x, y, color=color)

Bar Plot에서는 범주에 대해 각 값을 표현하기 때문에 1개의 feature에 대해서만 볼 수 있어서 여러 group으로 보여주기 위한 방법들이 사용한다.

  • plot을 여러 개 그린다
  • 한 개의 플롯에 동시에 나타낸다
    • 쌓아서 표현
    • 겹쳐서 표현
    • 이웃에 배치하여 표현

쌓아서 표현 (Stacked bar plot)

2개 이상의 그룹을 쌓아서 표현하는 bar plot으로 각 bar에서 나타나는 그룹의 순서는 항상 유지된다.

  • 맨 밑의 bar의 분포는 파악하기 쉽지만 그 외의 분포들은 파악하기 어렵기 때문에 수치들에 annotation을 추가해 이를 보완할 수 있고 2개의 그룹이 positive, negative라면 축 조절이 가능하다
    • .bar()에서는 bottom, .barh()에서는 left 파라미터를 사용
  • 응용으로 전체에서 비율을 나타내는 percentage stacked bar chart 등도 있다

겹쳐서 표현 (Overlapped bar plot)

2개 그룹만 비교한다면 겹쳐서 만드는 것도 활용할 수 있지만 3개 이상에서는 파악이 어렵다.

  • 같은 축을 사용하니 비교가 쉽고 투명도를 조정해 겹치는 부분을 파악한다 (alpha)
  • bar plot 보다는 area plot에서 더 효과적이다

이웃에 배치하여 표현 (Grouped bar plot)

그룹별 범주에 따른 bar를 이웃되게 배치하는 방법이다.

  • Matplotlib은 범주형보다는 수치형 데이터를 표현하기 용이해 비교적 구현이 까다롭다
    • ticks, ticklabels 등 적당한 테크닉이 필요하다

세 가지 표현 방법은 모두 그룹이 5~7개 이하일 때 효과적이지만 그룹이 더 많다면 적은 그룹은 ETC로 처리하는 방법도 있다.

정확한 표현을 하기 위한 방법

  • Principle of proportion link
    • 반드시 x축의 시작은 0으로 하고 실제 값과 그에 표현되는 그래픽으로 표현되는 잉크 양은 비례해야 한다
      • 차이점을 부각시키고 싶으면 figure의 세로 길이를 늘린다
  • 데이터 정렬
    • 더 정확한 정보를 전달하기 위해서는 정렬이 필수
      • pandas에서는 sort_values(), sort_index()를 사용하여 정렬
    • 여러 가지 기준으로 정렬을 하여 패턴을 발견할 수 있고 대시보드에서는 interactive로 제공하는 것이 유용하다
  • 적절한 공간 활용
    • 여백과 공간만 조정해도 가독성이 높아진다
    • .margins(), .set_xlim(), set_ylime(), set_spines[spine], set_visible() 등
  • 복잡함과 단순함
    • 무의미한 복잡성은 만들지 않는다
  • ETC
    • 오차 막대를 추가하여 Uncertainty 정보를 추가 가능하다
    • bar 사이 gap이 0이 되도록 히스토그램을 사용하여 연속된 느낌을 줄 수 있다
    • 다양한 text 정보를 활용한다

Line Plot

Line Plot은 연속적으로 변화하는 값을 순서대로 점으로 나타내고, 이를 선으로 연결한 그래프이다.

  • 꺾은선 그래프, 선 그래프, line chart, line graph 등의 이름으로 사용된다
  • 시계열 분석과 같은 시간/순서에 대한 변화에 적합하여 추세를 살피기 위해 사용한다
  • 중첩으로 인해 가독성이 하락될 수 있어 5개 이하의 선을 사용하는 것이 좋다
    • 구별은 색상, 마커, 선의 종류 등의 요소를 사용한다

시시각각 변동하는 데이터는 noise로 인해 패턴 및 추세가 파악하기 어렵다.

  • noise의 인지적인 방해를 줄이기 위해 smoothing을 사용한다

정확한 표현을 하기 위한 방법

  • 추세에 집중

    • 추세를 보기 위한 목적이기 때문에 Bar plot과 다르게 꼭 축을 0에 초점을 둘 필요는 없다
    • 너무 구체적인 line plot 보다는 생략된 line plot이 더 나을 수 있다
      • Grid, Annote 등 모두 제거
      • 디테일한 정보는 표로 제공이 나을 수 있다
    • 생략되지 않는 선에서 범위를 조정하여 변화율 관찰
      • .set_ylim()
  • 간격

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

    • Line은 점을 이어 만드는 요소로 점과 점 사이에 데이터가 없기에 이를 잇는 방법인 보간을 사용할 수 있다
    • 데이터의 error나 noise가 포함되어있는 경우, 데이터의 이해를 돕는 방법
      • Moving Average
      • Smooth Curve with Scipy
        • scipy.interpolate.make_interp_spline()
        • scipy.interpolate.interp1d()
        • scipy.ndimage.gaussian_filter1d()
    • Presentation에는 좋은 방법이 될 수 있으나 없는 데이터를 있다고 생각하게 할 수 있으며 작은 차이를 없앨 수 있다
      • 일반적인 분석에는 지양
  • 이중 축 사용

    • 한 plot에 대해 2개의 축을 이중 축(dual axis)라고 한다
    • 같은 시간 축에 대해 서로 다른 종류의 데이터를 표현하기 위해서는 축이 2개가 필요
      • .twinx() 사용
    • 한 데이터에 대해 다른 단위를 가진다 (ex: radian, dgree)
      • .secondary_xaxis(), secondary_yaxis() 사용
    • 범위가 다른데 임의로 조정해야 할 경우 상관관계가 있어보이는 단점이 있어 이중 축을 사용하는 것보단 2개의 plot을 그리는 것을 지향
  • ETC

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

Scatter Plot

Scatter plot은 점을 사용하여 두 feature간의 관계를 알기 위해 사용하는 그래프로 상관 관계를 확인하기 위해 사용한다.

  • 산점도 등의 이름으로 사용된다
  • 직교 좌표계에서 x축, y축에 feature 값을 매핑해서 사용한다
    • .scatter() 사용
  • 점에서 다양한 variation 사용이 가능하다 (2차원 데이터에서 N차원 데이터로 확장 가능)
    • 모양
    • 크기
  • 군집 (Cluster), 값 사의 차이 (Gap in values), 이상치 (Outliers)를 확인할 수 있다

정확한 표현을 하기 위한 방법

  • 점이 많아질수록 점의 분포를 파악하기 힘들다
    • 투명도 조정
    • 지터링 (jittering)
      • 점의 위치를 약간씩 변경
    • 2차원 히스토그램
      • 히트맵을 사용하여 깔끔한 시각화
    • Contour plot
      • 분포를 등고선을 사용하여 표현
  • 점의 요소와 인지
      • 연속은 gradient, 이산은 개별 색상으로 표시
    • 마커
      • 거의 구별하기 힘들고 크기가 고르지 않다
    • 크기
      • 흔히 버블 차트 (bubble chart)라고 부른다
      • 구별하기는 쉽지만 오용하기 쉽다 (원의 크기 비교)
      • 관계보다는 각 점간 비율에 초점을 둔다면 좋다
      • SWOT 분석 등에 활용 가능하다
  • 인과관계와 상관관계
    • 인과 관계 (casual relation)과 상관 관계 (correlation)은 다르다
      • 분석 과정에서 꼭 고민해봐야 한다
    • 인과 관계는 항상 사전 정보와 함께 가정으로 제시해야 한다
  • 추세선
    • 추세선을 사용하면 scatter의 패턴을 유추할 수 있다
      • 추세선이 2개 이상이 되면 가독성이 떨어질 수 있으므로 주의한다
  • ETC
    • Grid는 지양하고 사용한다면 색은 무채색으로 하여 최소한으로 한다
    • 범주형이 포함된 관계에서는 heatmap 또는 bubble chart가 더 좋다

0개의 댓글