풀스택 웹🌐 개발자 지망생 🧑🏽‍💻
➕ 인공지능 관심 🤖


Categories


Recent views

  • 1
  • 2
  • 3
  • 4
  • 5

데이터 시각화 기본

  1. 시각화의 요소
  2. 기본적인 차트의 사용
  3. 차트의 요소

데이터 시각화 기본

데이터를 그래픽 요소로 매핑하여 시각적으로 표현하는 것

시각화의 다양한 고려 요소

  1. 목적 : 왜 시각화 하는가?
  2. 독자 : 시각화 결과는 누구를 위한 것인가?
  3. 데이터 : 어떤 데이터를 시각화할 것인가?
  4. 스토리 : 어떤 흐름으로 인사이트를 전달할 것인가?
  5. 방법 : 전달하고자 하는 내용에 맞게 효과적인 방법을 사용하고 있는가?
  6. 디자인 : UI에서 만족스러운 디자인을 가지고 있는가?

시각화의 요소

시각화를 위해서 데이터의 관점을 먼저 생각해봐야한다.

크게 1. 데이터셋 관점 (global)과

  1. 개별 데이터의 관점 (local) 관점이 존재한다.

데이터셋, 데이터의 종류

정형 데이터, 시계열 데이터, 지리 데이터, 관계형(네트워크) 데이터, 계층적 데이터, 다양한 비정형 데이터 등이 존재한다.

이때, 정형 데이터는 테이블 형태로 제공되는 데이터로 csv, tsv 파일 등으로 제공됨.

Row가 데이터 1개 item, Column은 attribute(feature)를 의미하며, 시각화가 비교적 쉽다.

시간 흐름에 따른 데이터를 Time-Series 데이터

기온, 주가 등의 정형 데이터와 음성, 비디오 같은 비정형 데이터가 존재

추세(Trend), 계절성(Seasonality), 주기성(Cycle) 등을 살핌

지리/ 지도 데이터의 경우, 지도 정보와 보고자 하는 정보간의 조화 중요 + 지도 정보를 단순화 시킨 경우가 중요하며, 거리 경로, 분포 등을 Visualization

관계 데이터(Graph, Network Visualization)의 경우 객체와 객체 간의 관계를 시각화,

객체를 Node, 관계를 Link라고 하며, 크기, 색, 수 등으로 객체와 관계의 가중치 표현

계층적 데이터의 경우, 관계 중에서도 포함관계가 분명한 데이터, Tree, Treemap, Sunburst 등이 대표적

데이터의 종류는 4가지로 분류 가능

수치형(numerical): 수로 표현 가능한 데이터

  • 연속형(continuous) : 실수값으로 표현 가능한 연속적인 데이터
    • 길이, 무게, 온도 등
  • 이산형(discrete) : 정수값으로 표현 가능한 데이터
    • 주사위 눈금, 사람 수 등

범주형(categorical): class로 표현 가능한 데이터

  • 명목형(norminal) : 순서나 대소 관계, 우열관계가 존재하지 않음
    • 혈액형, 종교 등
  • 순서형(ordinal) : 순서, 대소관계, 우열 관계가 존재
    • 학년, 별점, 등급 등

시각화의 이해

Mark는 기본적인 시각적 요소로, 점, 선, 면으로 이루어진 시각화 방법이다.

질의 데이터, 시계열 데이터 등이 표현 가능

위의 기본적인 점선면 Mark에 다양성을 줄 수 있는 요소이다, 크기, shape, color 등을 바꾸어 다차원적인 요소를 표현 가능하다.

전주의적 속성(Pre-attentive Attribute)는 시작적인 주의를 주지 않아도 인지하게 되는 요소를 의미한다.

동시에 사용하면 인지하기 어려우므로 적절하게 사용할 때, 시각적 분리(visual pop-out)이 필요하다.

기본적인 차트의 사용

기본 Bar Plot

Bar plot이란 직사각형 막대를 사용하여 데이터의 값을 표현하는 차트/그래프를 의미하며, 범주(category)에 따른 수치 값을 개별 또는 그룹 별로 비교하기에 적합하다.

막대의 방향에 따라 .bar() / .barh()으로 수직과 수평형 그래프를 만들 수 있다.

  • 수평은 범주가 많을 때 적합하다.

여러 Bar plot

범주형 A, B, C, D, E column을 가진 두 그룹 파랑 = [1,2,3,4,3], 분홍 = [4,3,2,5,1]이 있을 때,

  1. 플롯을 여러 개 그리는 방법

  1. 한 개의 플롯에 동시에 나타내는 방법

1) Stacked Bar Plot : 위에 쌓여있는 bar의 분포는 파악하기 쉬움, 2개의 그룹이면 y axis = 0를 중심으로 +, - 로 축조절로 극복 가능

  • .bar()에서는 bottom 파라미터로 사용, .barh()에서는 left 파라미터로 사용

1-1) Percentage Stacked Bar Chart : Stacked Bar Plot의 응용 형태

2) Overlapped Bar Plot : 3개 미만의 급룸 비교는 겹쳐서 표현 가능, 투명도(alpha)를 조정해 겹치는 부분 파악, Area plot에 효과적

3) Grouped Bar Plot: 구현이 까다로움, 그룹이 5~7개 이하일때 효과적 그 이상은 etc로 처리할 것

  • (.set_xticks(), .set_xticklabels())로 구현

정확한 Bar plot

Principle of Proportion Ink : x축의 시작은 zero(0)부터이며, 실제 값과 그래픽으로 표현 되는 잉크양은 비례해야 한다.

데이터의 정렬을 통해 데이터의 패턴을 발견할 수 있다.

시게열(시간순), 수치형(크기순), 순서형(범주의 순서), 명목형(범주의 값)에 따라 정렬이 가능하며, 대시보드에서는 Interactive 하게 제공하는 것이 유용하다.

pandas에서는 sort_values(), sort_index()를 사용하여 정렬 가능

여백과 공간을 조정해서 가독성을 높일 수 있다

  • X/Y axis Limit (.xset_xlim(), .set_ylim())

  • Spines(.spines[spine].set_visible())
  • Gap(width)
  • Legend(.legend())
  • Margins.(.margins())

등으로 조절 가능하다.

무의미한 3D, 직사각형 의외의 bar 형태 지양

  • Grid(.grid())

  • Ticklabels(.set_ticklabels())
    • Major & Minor
  • Text 추가 장소 (.text(), .annotate())
    • Bar의 middle/ upper
    • 제목 (.set_titile())
    • 라벨 (.set_xlabel(), .set_ylabel())

오차 막대 (error bar)로 Uncertainty 정보 추가 가능

Bar 사이의 Gap이 없으면 히스토그램(Histogram)이 되며, 연속된 느낌이며, .hist()를 통해 사용 가능

Line Plot

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

Line Plot의 기본

Line plot은 꺾은선 그래프, 선 그래프, line chart, line graph 등의 이름으로도 불리며, 시간/순서에 대한 변화에 적합하여 추세(시계열 분석)를 살피기 위해 사용함.(.plot()으로 사용)

가독성을 위해 5개 이하의 선을 여러 요소로 구별하며 사용하는 것이 좋다.

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

또한, Noise로 인하여 패턴 및 추세 파악이 힘들 경우 smoothing을 통해 가독성을 늘릴 수 있다.

정확한 Line plot

  1. 추세에 집중하기
  • 추세가 목적이므로 굳이 0을 시작점으로 두지 않아도 된다.

  • Grid, Annotate 등을 제거한 뒤, 디테일한 정보는 표로 제공하자.

  • 생략되지 않는 성에서 범위를 조정해 변화율 관찰 (.set_ylim())

  1. 간격 조정
  • 규칙적인 간격이 아닐 경우 점을 추가하여 데이터가 있는 부분만 표시하자.
  1. 보간
  • Line은 점을 이어 만드는 요소이므로 데이터가 없어도 이를 이어서 만드는 보간을 하게 된다.
  • 데이터의 이해를 도울 수 있지만, 없는 데이터를 있다고 생각하거나 적은 차이를 못보게 할 수 있으므로 일반적인 분석에서는 지향 하자.
    • 특히 곡선 보간은 조심하자
  • 데이터의 error나 noise가 포함되어 있는 경우, Moving Average 방법, Smooth Curve with Scipy(scipy의 interpolate 내부의 make_interp_spline(), interp1d() 또는 scipy의 ndimage.gaussian_filter1d() 등을 사용 가능)

  1. 이중 축 사용

  • 한 plot에 대해 2개의 축을 사용하는 것을 이중 축(dual axis)라고 함, 왠만하면 이중 축보단 다중 plot으로 해결하는 게 좋다.
    • 상관관계가 있어보이는 착시를 일으킨다.
  • 같은 시간 축에 대해 서로 다른 종류의 데이터를 표현하기 위해 축이 2개 필요 (.twinx() 사용)
  • 한 데이터에 대해 단위가 다른 경우, .secondary_xaxis(), .secondary_yaxis()를 사용해 보자.
  1. 기타

  • 범례 대신 라인 주위에 레이블을 추가하면 가독성이 좋다.

  • Min/Max 정보(또는 특정 포인트)를 추가(annotation)로 가독성 증가

  • 보다 연한 색을 사용하여 uncertainty 표현 가능 (신뢰구간, 분산 등)

Scatter Plot

기본 Scatter plot

점을 사용하여 두 feature 간의 관계를 알기 위해 사용하는 그래프, 산점도라고도 말함

직교 좌표계에서 x축/y축에 feature r값을 매핑해서 사용, .scatter()로 사용

색, 모양, 크기 등을 바꾸어 다양한 차원의 데이터 표현 가능

Scatter plot을 통해 상관관계(양, 음의 상관 관계, 상관 없음), 군집, 값 사이의 차이, 이상치 등을 알 수 있다.

정확한 Scatter plot

  1. Overplotting 방지
  • 점이 너무 많으면 분포 파악이 힘드므로, 투명도 조정, 지터링(jittering, 점의 위치 약간 변경, 효율성이 조금 떨어짐), 2차원 히스토그램(히트맵을 사용하여 깔끔한 시각화), Contour plot(분포를 등고선을 사용해 표현) 등으로 표현하면 좋다.
    • 이외에도 joint plot 등이 있음

  1. 점의 요소와 인지
  • 색 : 연속은 gradient, 이산은 개별 색상으로 표시
  • 마커 : 거의 구별하기 힘들고, 크기가 달라 보이므로 사용 유의
  • 크기 : 흔히 버블 차트(bubble chart)라고 부름, 오용이 잦으며, 관계 보다는 각 점간의 비율에 초점을 두자, SWOT 분석등에 자주 사용
  1. 인과 관계와 상관 관계
  • 인과 관계(causal relation, x축 때문에 y축이 변한다)과 상관 관계(correlation, x축과 y축이 동시에 어떠한 요인에 의해 변하는 관계이다.)을 잘 구별하자
  • 인과 관계는 사전 정보와 함께 가정으로 제시

  1. 추세선
  • 추세선을 이용하면 scatter의 패턴을 유추할 수 있지만, 2개 이상 사용하면 가독성이 떨어진다.
  1. 기타
  • Grid는 왠만하면 사용하지 않으며 무채색을 활용하자
  • 범주형이 포함되어 있으면 heatmap 또는 bubble chart 추천

차트의 요소

Text 사용하기

Matplotlib에서 Text

Text는 Data Visualization에서 명확하고 오해를 방지할 수 있는 수단이지만 과용하면 가독성을 떨어뜨리고 오히려 이해를 방해할 수 도 있다.

Title : 가장 큰 주제를 설명

Label : 축에 해당하는 데이터 정보를 제공

Tick Label : 축에 눈금을 사용하여 스케일 정보를 추가

Legend : 한 그래프에서 2개 이상의 서로 다른 데이터를 분류하기 위해서 사용하는 보조 정보

Annotation(Text) : 그 외의 시각화에 대한 설명을 추가

Text 원하는 대로 사용하기

[Data_Visualization_3]3_1_Text.ipynb

Color 사용하기

Color에 대한 이해

Visualization에 있어서 위치와 색은 가장 효과적인 채널 구분 방법

특히, 위치와 달리 사람이 직접 개입하여 골라야 하며, 심미성을 가진다.

  • 하지만 심미성보다는 정보 전달에 좀 더 신경쓰자.

일부 색의 사용 장소는 사회적인 약속, 색이 주는 공통적인 느낌 그리고 자연에 대한 모방 등에 의해 이미 결정되어 있다.

  • 무지개 빛을 응용한 수치 표현
  • 파랑과 빨강을 이용한 온도 표현 등

Color Palette의 종류

범주형(Categorical, Discrete, Qualitative) Color Palette

범주형 변수에는 독립되고 구별하기 쉬운 색상을 사용한다.

  • 즉 채도, 명도로 구분하지 않고, 색상의 차이로 구분한다.

최대 10개의 색상까지 사용하며, 그외에는 기타로 묶는다.

연속형 (Sequential) Color Palette

정렬된 값을 가지는 순서형, 연속형 변수에 적합하며, 연속적인 색상 (주로 명도를 조절)을 통해 값을 표현한다.

단일 색조로 표현하는 것이 좋고, 균일한 색상 변화가 중요하다.

발산형(Diverge) Color Palette

연속형과 유사하지만 중앙을 기준으로 발산하며, 상반된 값, binary 값을 표현하는데 적합

양 끝으로 갈수록 색이 진해지며, 중앙의 색은 양쪽의 점에서 편향되지 않아야 함

그 외 색 Tips

색상 대비(Color Constrast)

  • 가까운 색은 차이가 더 크게 보임(파랑보라, 빨강보라)

명도 대비

  • 밝은 색과 어두운 색을 배치하면 밝은 색은 더 밝게, 어두운 색은 더 어둡게 보임 (회색검정)

채도 대비

  • 채도의 차이, 채도가 더 높아보임 (회색주황)
  • 더 선명해보여서 주로 사용함

보색 대비

  • 정반대 색상을 사용하면 더 선명해 보인다.(빨강초록)

를 통하여 강조(Highlighting)할 수 있다.

삼원색 (빨파노) 중 특정 색을 감지 못하면 색맹이라 하며, 부분적 인지 이상이 있다면 색약이라 한다.

색인지가 중요한 분야에서는 필수적으로 고려하자.

Facet

Facet은 분할이라는 의미로, 화면 상에 View를 분할 및 추가하여 다양한 관점을 전달함.

  • 같은 데이터셋에 서로 다른 인코딩을 통해 다른 인사이트
  • 같은 방법으로 동시에 여러 feature 보거나 큰 틀에서 볼 수 없는 부분 집합을 세세하게 보여줌.

Matplotlib에서 구현

Figure는 큰 틀, Ax는 각 플롯이 들어가는 공간, Figure는 언제나 1개, 플롯은 N개

주로

  • plt.subplot()
  • plt.figure() + fig.add_subplot()
  • plt.subplots()

으로 subplot을 더하며,

figuresize, dpi, sharex, sharey, squeeze, aspect 등의 argument를 조정할 수 있다.

가장 가본적인 형태로 subplot을 추가하면 위와 같다.

위 subplot을 표현하기 위해 Slicing 또는 x, y, dx, dy를 사용하며,

Slicing 방법의 경우 fig.add_spec() 함수를 통해 자세하게 구현할 수 있다.

위의 예시의 경우, 처럼 slicing한 모양이라 할 수 있다.

같은 모양일 경우, (x,y), dx, dy로 작성하려면, fig.subplot2grid() 함수를 통해 구현할 수 있으며, 의 비율을 통해 구현할 수 있다.

ax.inset_axes()(좌)를 통하여 Ax 내부에 서브플롯을 추가하여 외부 정보나 미니맵 같은 형태를 추가할 수 있으며, make_axes_locatable(ax)(우) 함수를 통하여 그리드 외부에 사이드 subplot을 추가하여 제목, 통계 정보등을 제공할 수 있다.

More Tips

Grid 이해하기

기본적인 Grid는 축과 평행한 선을 사용하여 거리 및 값 정보를 보조적으로 제공

색은 다른 표현들을 방해하지 않도록 무채색(color)이며,

항상 Layer 순서 상 맨 밑에 오도록 조정(zorder),

큰 격자/ 세부 격자(which=’major’, ‘minor’, ‘both’)

X축, Y축 또는 동시에(axis=’x’, ‘y’, ‘both’)

또한 numpy + matplotlib를 통하여 x+y=c, y=cx, xy=c, 2차 함수등 여러가지 형태로 구현이 가능하다.

심플한 처리

Setting 바꾸기

여러가지 미리 정의된 테마로 바꿀 수 있다.

ggplot, fivethirtyeight 이 대표적으로 많이 사용됨

실습