부스트캠프 AI Tech 3기(week3) Day11

정재욱·2022년 2월 4일
0

📌Data Visualization

📖시각화의 요소

  • 데이터 시각화를 위해서는 데이터 가 우선적으로 필요

  • 시각화를 진행할 데이터

    1. 데이터셋 관점 (global)
    2. 개별 데이터의 관점 (local)

  • 데이터셋의 종류

    • 정형 데이터

      • 테이블 형태로 제공되는 데이터, 일반적으로 csv, tsv 파일로 제공
      • row가 데이터 1개 item
      • column은 attribute(feature)
      • 가장 쉽게 시각화할 수 있는 데이터셋
        • 통계적 특성과 feature 사이 관계
        • 데이터 간 관계
        • 데이터 간 비교
    • 시계열 데이터

      • 시간 흐름에 따른 데이터를 Time-Series
      • 기온, 주가 등 정형데이터와 음성, 비디오와 같은 비정형 데이터 존재
      • 시간 흐름에 따른 추세(Trend), 계절성(Seasonality), 주기성(Cycle) 등을 살핌
    • 지리 데이터

      • 지도 정보와 보고자 하는 정보 간의 조화 중요 + 지도 정보를 단순화 시키는 경우도 존재
      • 거리, 경로, 분포 등 다양한 실사용
    • 관계형(네트워크) 데이터

      • 객체와 객체 간의 관계를 시각화
        • Graph visualization / Network Visualization
      • 객체는 Node로, 관계는 Link로
      • 크기, 색, 수 등으로 객체와 관계의 가중치를 표현
      • 휴리스틱하게 노드 배치를 구성
    • 계층적 데이터

      • 관계 중에서도 포함 관계가 분명한 데이터
        • 네트워크 시각화로도 표현 가능
      • Tree, Treemap, Sunburst 등이 대표적
    • 비정형 데이터


  • 데이터의 종류

    • 수치형 (numerical)

      • 연속형 (continuous) : 길이, 무게, 온도 등
      • 이산형 (discrete) : 주사위 눈금, 사람 수 등
    • 범주형 (categorical)

      • 명목형 (norminal) : 혈액형, 종교 등
      • 순서형 (ordinal) : 학년, 별점, 등급 등

  • 마크와 채널

    • A mark is a basic graphical element in an image
      • 점, 선, 면으로 이루어진 데이터 시각화
    • A visual channel is a way to control the appearance of marks, independent of the dimensionality of the geometric primitive.
      • 각 마크를 변경할 수 있는 요소들 : Position, Color, Tilt, Shape, Size 등
  • 전주의적 속성

    • Pre-attentive Attribute

    • 주의를 주지 않아도 인지하게 되는 요소

      • 시각적으로 다양한 전주의적 속성이 존재
    • 동시에 사용하면 인지하기 어려움

      • 적절하게 사용할 때, 시각적 분리(visual popout)

📖Python과 Matplotlib

  • Matplotlib은 Python에서 사용할 수 있는 시각화 라이브러리.

  • 현재 사용되고 있는 다양한 데이터 분석 및 머신러닝/딥러닝은 Python에서 이뤄지고 있다.

  • numpy와 scipy를 베이스로 하여 다양한 라이브러리와 호환성이 좋다.

    • Scikit-Learn, PyTorch, Tensorflow
    • Pandas
  • 다양한 시각화 방법론을 제공한다.

    • 막대그래프
    • 선그래프
    • 산점도
    • ETC
  • 그 외에도 Seaborn, Plotly, Bokeh, Altair 등의 시각화 라이브러리가 존재

    • Matplotlib가 범용성이 제일 넓고, base가 되는 라이브러리

기본 Plot

Figure와 Axes

  • matplotlib에서 그리는 시각화는 Figure라는 큰 틀에 Ax라는 서브플롯을 추가해서 만든다.
  • 다만 Figure는 큰 틀이라 서브플롯을 최소 1개 이상 추가해야 하고, 추가하는 다양한 방법이 있다.
  • 그래프의 사이즈는 figure의 사이즈로 서브플롯 ax의 사이즈를 조정
  • 가로, 세로 길이(inch 단위)를 tuple 형태로 figsize 파라미터에 전달하여 조정.
fig = plt.figure(figsize=(12,7))
ax = fig.add_subplot()
plt.show()
  • 2개 이상을 그리고 싶다면 위치를 지정
fig = plt.figure(figsize=(12,7))
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
plt.show()
fig, axes = plt.subplots(2,1, figsize=(6,4))
# axes[0].plot()
# axes[1].plot()
plt.show()

plt로 그래프 그리기

  • 리스트 [1,2,3] 데이터를 ax에 그려보자.
fig = plt.figure()

x1 = [1, 2, 3]
x2 = [3, 2, 1]

ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 

ax1.plot(x1) 
ax2.plot(x2)
plt.show()

Plot의 요소들 알아보기

한 서브플롯에서 여러 개 그리기

동시에 그래프를 그리게 되면 색상이 자동적으로 구분된다.

✍입력

fig = plt.figure()
ax = fig.add_subplot(111) 
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1]) # 파랑
ax.plot([1, 2, 3]) # 주황
ax.plot([3, 3, 3]) # 초록

plt.show()

💻출력


색상 지정하기

색을 직접 명시할 수 있고, 일반적으로 color 파라미터를 통해 전달.

✍🏻입력

fig = plt.figure()
ax = fig.add_subplot(111) 
# 3개의 그래프 동시에 그리기
ax.plot([1, 1, 1], color='r') # 한 글자로 정하는 색상
ax.plot([2, 2, 2], color='forestgreen') # color name
ax.plot([3, 3, 3], color='#000000') # hex code (BLACK)
plt.show()

💻출력


텍스트 사용하기

✍🏻 label과 범례(legend)

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')
ax.legend()
plt.show()

💻 출력


✍🏻 제목 title

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')
ax.set_title('Basic Plot')
ax.legend()
plt.show()

💻 출력


✍🏻 subplot title 과 figure title

fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

ax1.set_title("ax1")  # subplot 제목
ax2.set_title("ax2")

fig.suptitle("fig") # figure 제목 

plt.show()

💻


✍🏻 ticks은 축에 적히는 수 위치를 지정

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')

ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])

ax.legend()

plt.show()

💻


✍🏻 ticklabels은 축에 적히는 텍스트를 수정

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')

ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(['zero', 'one', 'two'])
ax.legend()

plt.show()

💻


✍🏻텍스트 추가 .text

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')

ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(['zero', 'one', 'two'])

ax.text(x=1, y=2, s='This is Text')

ax.legend()

plt.show()

💻

✍🏻텍스트 추가 .annotate

fig = plt.figure()
ax = fig.add_subplot(111) 
ax.plot([1, 1, 1], label='1') 
ax.plot([2, 2, 2], label='2') 
ax.plot([3, 3, 3], label='3')

ax.set_title('Basic Plot')
ax.set_xticks([0, 1, 2])
ax.set_xticklabels(['zero', 'one', 'two'])

ax.annotate(s='This is Annotate', xy=(1, 2))

ax.legend()

plt.show()

💻



📖Bar Plot

Bat Plot 이란?

  • Bar plot이란 직사각형 막대를 사용하여 데이터의 값을 표현하는 차트/그래프
  • 막대 그래프, bar chart, bar graph 등의 이름으로 사용됨
  • 범주(category)에 따른 수치 값을 비교하기에 적합한 방법
    • 개별 비교, 그룹 비교 모두 적합
  • 막대의 방향에 따른 분류 .bar(),.barh()
    • 수직 (vertical) : x축에 범주, y축에 값을 표기.(default)
    • 수평 (horizontal) : y축에 범주, x축에 값을 표기.(범주가 많을 때 적합)

다양한 Bar Plot

Multiple Bar Plot

  • Bar Plot에서는 범주에 대해 각 값을 표현 -> 즉 1개의 feature에 대해서만 보여줌
  • 여러 Group을 보여주기 위해서는 여러가지 방법이 필요.
  1. 플롯을 여러 개 그리는 방법
  2. 한 개의 플롯에 동시에 나타내는 방법
    2.1 쌓아서 표현하는 방법
    2.2 겹쳐서 표현하는 방법
    2.3 이웃에 배치하여 표현하는 방법

Stacked Bar Plot

  • 2개 이상의 그룹을 쌓아서(stack) 표현하는 bar plot
    • 각 bar에서 나타나는 그룹의 순서는 항상 유지
  • 맨 밑의 bar의 분포는 파악하기 쉽지만
    • 그 외의 분포들은 파악하기 어려움
    • 2개의 그룹이 positive/negative라면 축 조정 가능
  • .bar()에서는 bottom 파라미터를 사용
  • .barh()에서는 left 파라미터를 사용

Overlapped Bar Plot

  • 2개 그룹만 비교한다면 겹쳐서 만드는 것도 하나의 선택지

    • 3개 이상에서는 파악이 어렵기 때문
  • 같은 축을 사용하니 비교가 쉬움

    • 투명도를 조정하여 겹치는 부부 파악 (alpha)

Grouped Bar Plot

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

  • Matplotlib으로는 비교적 구현이 까다로움 (후에 seaborn에서 다룰 예정)

    • 적당한 테크닉 (.set_xticks(), .set_xticklabels())
  • 앞서 소개한 내용 모두 그룹이 5개~7개 이하일 때 효과적

    • 그룹이 많다면 적은 그룹은 ETC로 처리

정확한 Bar Plot

Principle of Proportion Ink

  • 실제 값과 그에 표현되는 그래픽으로 표현되는 잉크 양은 비례 해야 함

  • 반드시 x축의 시작은 zero(0)!!

    • 만약 차이를 나타내고 싶다면 plot의 세로 비율을 늘리기
  • 막대 그래프에만 한정되는 원칙은 아니다!

    • Area plot, Donut Chart 등등 다수의 시각화에서 적용됨

데이터 정렬하기

  • 더 정확한 정보를 전달하기 위해서는 정렬이 필수.

    • Pandas에서는 sort_values(), sort_index()를 사용하여 정렬
  • 데이터의 종류에 따라 다음 기준으로

    • 시계열 | 시간순
    • 수치형 | 크기순
    • 순서형 | 범주의 순서대로
    • 명목형 | 범주의 값 따라 정렬
  • 여러 가지 기준으로 정렬을 하여 패턴을 발견

  • 대시보드에서는 Interactive로 제공하는 것이 유용

적절한 공간 활용

  • 여백과 공간만 조정해도가독성이 높아진다.
  • Matplotlib의 bar plot은 ax에 꽉 차서 살짝 답답함
  • Matplotlib techniques
    • X/Y axis Limit (.set_xlim(), .set_ylime())
    • Spines (.spines[spine], .set_visible())
    • Gap (width)
    • Legend (.legend())
    • Margins (.margins())

복잡함과 단순함

  • 필요 없는 복잡함은 NO!!!

    • 무의미한 3D는 하지말자....
    • 직사각형이 아닌 다른 형태의 bar는 지양
  • 무엇을 보고 싶은가? (시각화를 보는 대상이 누구인가?)

    • 정확한 차이 (EDA)
    • 큰 틀에서 비교 및 추세 파악 (Dashboard)
  • 축과 디테일 등의 복잡함

    • Grid (.grid())
    • Ticklabels (.set_ticklabels())
      • Major & Minor
    • Text를 어디에 어떻게 추가할 것인가 (.text() or .annotate())
      • Bar의 middle / upper

ETC

  • 오차 막대를 추가하여 Uncertainty 정보를 추가 가능 (errorbar)

  • Bar 사이 Gap이 0이라면 -> 히스토그램(Histogram)

    • .hist()를 사용하여 가능
    • 연속된 느낌을 줄 수 있음
  • 다양한 Text 정보 활용하기

    • 제목 (.set_title())
    • 라벨 (.set_xlabel(), .set_ylabel())

📖Line Plot

기본 Line plot

Line plot이란?

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

  • 꺾은선 그래프, 선 그래프, line chart, line graph 등의 이름으로 사용됨

  • 시간/순서에 대한 변화에 적합하여 추세를 살피기 위해 사용

    • 시계열 분석에 특화!!
  • .line이 아니라 .plot()

Line plot의 요소

  • 5개 이하의 선을 사용하는 것을 추천

    • 더 많은 선은 중첩으로 인한 가독성 하락
  • 요소는 어떤 것이 있을까?

    1. 색상 (color)
    2. 마커 (marker, markersize)
    3. 선의 종류 (linestyle, linewidth)

Line plot을 위한 전처리

  • 시시각각 변동하는 데이터는 Noise로 인해 패턴 및 추세 파악이 어려움
  • Noise의 인지적인 방해를 줄이기 위해 smoothing을 사용

정확한 Line plot

추세에 집중

  • Bar plot과 다르게 꼭 축을 0에 초점을 둘 필요는 없음

    • 추세를 보기 위한 목적이므로
  • 너무 구체적인 line plot보다는 생략된 line plot이 더 나을 수 있다.

    • Grid, Annotate 등 모두 제거
    • 디테일한 정보는 표로 제공하는 것을 추천
  • 생략되지 않는 선에서 범위를 조정하여 변화율 관찰 (.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과 degree)

    • .secondary_xaxis(), .secondary_yaxis() 사용
  • 2개의 plot을 그리는 것 >>>> 이중 축 사용

    • 이중 축은 지양할 것.

ETC

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


📖Scatter Plot

기본 Scatter plot

Scatter plot 이란?

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

Scatter plot의 요소

  • 점에서 다양한 variation 사용 가능 (2차원 데이터에서 N차원 데이터로 확장 가능)
    1. 색 (color)
    2. 모양 (marker)
    3. 크기 (size)

Scatter plot의 목적

  • 상관 관계 확인 (양의 상관관계 / 음의 상관관계 / 없음)

정확한 Scatter plot

Overplotting

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

점의 요소와 인지

    • 연속은 gradient, 이산은 개별 색상으로
  • 마커

    • 거의 구별하기 힘들다 + 크기가 고르지 않음
  • 크기

    • 흔히 버블 차트 (bubble chart)라고 부름
    • 구별하기는 쉽지만 오용하기 쉬움 (원의 크기 비교)
    • 관계보다는 각 점간 비율에 초점을 둔다면 좋음
    • SWOT 분석 등에 활용 가능

인과관계와 상관관계

  • 인과 관계 (causal relation)과 상관 관계 (correlation)은 다름!

    • 분석 과정에서 꼭 고민해볼 것
  • 인과 관계는 항상 사전 정보와 함께 가정으로 제시할 것.

추세선

  • 추세선을 사용하면 scatter의 패턴을 유추할 수 있음
    • 단, 추세선이 2개 이상이 되면 가독성이 떨어지므로 주의.

ETC

  • Grid는 지양. 사용한다면 최소한으로

    • 색은 무채색으로
  • 범주형이 포함된 관계에서는 heatmap 또는 bubble chart를 추천



profile
AI 서비스 엔지니어를 목표로 공부하고 있습니다.

0개의 댓글

관련 채용 정보