Bar Plot
- 직사각형 막대를 사용해 데이터 값을 표현하는 차트/그래프
- 범주(category)에 따른 수치 값을 비교하기에 적합한 방법
- 수직(vertical): x축에 범주, y축에 값을 표기(default)
- 수평(horizontal): y축에 범추, x축에 값을 표기(범주가 많을 때 적합)
Multiple Bar Plot
가정
임의의 그룹 데이터 Sky, Pink에 A,B,C,D,E 데이터가 존재
- Group Sky: [1,2,3,4,3]
- Group Pink: [4,3,2,5,1]
- 범주에 대해 각 값을 표현 --> 1개의 feature에 대해서만
- 여러 group을 보여주려면 여러 방법이 필요
- 플롯을 여러 개 그리는 방법
- 한 개의 플롯에 동시에 나타내는 방법(5~7개 이하일 때 효과적)
1) 쌓아서
2) 겹쳐서
3) 이웃해서 배치해서
Stacked Bar Plot
- 2개 이상의 그룹을 쌓아서(stack) 표현
- 각 bar에서 나나타는 그룹의 순서는 항상 유지
- 2개의 그룹이 positive/negative라면 축 조정 가능
- .bar()에서는 bottom 파라미터, .barh()에서는 left 파라미터 이용
- 전체적인 분포를 살피기엔 적합하지만 개별 분표는 파악하기 어려움
--> 주석을 달아서 해결
- 전체에서 비율을 나타내는 Percentage Stacked Bar Chart로 주석, 비율을 달아 표현 가능
Overlapped Bar Plot
- 같은 축을 사용해 비교가 쉬움
- 투명도(α), 명도, 채도 등을 조절해 잘 보이게 해야함
- 3개 이상 겹칠때부터는 보기 어려워서 지양하는편
Grouped Bar Plot
- 그룹별 범주에 따른 bar를 이웃되게 배치
- 수치형 데이터(numpy등)으로는 쉬우나, Matplotlib으로는 구현이 까다로움
- .set_xticks(), .set_xticklabels()를 활용
정확한 Bar Plot
Principle of Proportion Ink
The representation of numbers, as physically measured on the surface of the graphic itself, should be directly proportional to the numerical quantities represented.
- 실제 값과 그에 표현되는 그래픽으로 표현되는 잉크 양은 비례해야함
- 반드시 x축의 시작은 zero(0)!!
- 차이를 늘리고 싶다면 plot 세로 비율을 늘린다
데이터 정렬하기
- 더 정확한 정보를 전달하기 위해서는 정렬이 필수
- Pandas에서는 sort_values(), sort_index()를 이용
- 데이터의 종류에 따라 다음 기준으로
- 시계형: 시간순
- 수치형: 크기순
- 순서형: 범수의 순서대로 (i.e. 초-중-고등학교)
- 명목형: 범주의 값에 따라(최대값/최소값, 오름차순/내림차순)
- 대시보드에서 interactive를 제공하는 것이 유용
적절한 공간 활용
- 여백과 공간만 조정해도 가독성이 높아진다
- Matplotlib은 bar plot이 ax에 꽉 차서 좀 답답함
- Matplotlib techniques
- X/Y axis limit: .set_xlim(), .set_ylim()
- Spines: .spines[spine].set_visible
- Gap: width
- Legend: .legend()
- Margins: .margins()
복잡함과 단순함
- 필요없는 복잡함은 No, 무의미한 3D는 Never...
- 정확한 차이(EDA), 큰 틀에서의 비교 및 추세 파악(Dashboard)
- 축과 디테일 등의 복잡함
ETC
- 오차 막대를 추가해 Uncertainty 정보를 추가 가능(errorbar)
- Bar 사이 Gap이 0이라면 --> Histogram
- .hist()를 사용
- 연속된 느낌을 줄 수 있음
- 다양한 text 정보 활용하기
- 제목: .set_title()
- 라벨: .set_xlabel(), .set_ylabel()
Line Plot
- 연속적으로 변화하는 값을 순서대로 점으로 나타내고, 이른 선으로 연결한 그래프
- 꺾은선 그래프, 선 그래프, line chart, line graph 등으로 불림
- 시간/순서에 대한 변화에 적합해 추세를 살피기 위해 사용
- .plot()를 사용
Line Plot의 요소
- 5개 이하의 선을 사용하는 것을 추천
- 선을 구별하는 요소
- 색상(color)
- 마커(marker, markersize)
- 선의 종류(linestyle, linewidth)
Line Plot을 위한 전처리
- noise의 인지적 방해를 준이기 위해 smoothing을 사용
정확한 Line Plot
추세에 집중
- 추세를 보기 위한게 목적이기 때문에 꼭 축을 0에 둘 필요 없음
- Grid, annotate 등을 모두 제거해 생략된 line plot이 더 나을 수 있다
- 생략되지 않는 선에서 범위를 조정해 변화율 관찰(.set_ylin())
간격
- 규칙적인 간격이 아니라면 오해를 줄 수 있다!
- 그래프 상에서 규칙적일 때: 기울기 정보의 오해
- 그래프 상에서 간격이 다를 때: 없는 데이터에 대해 있다고 오해
- 규칙적인 간격의 데이터가 아니라면 각 관측 값에 점으로 표시해 오해를 줄이자
보간
이중 축 사용
- 한 plot에 대해 2개의 축을 이중 축(dual axis)라고 함
- 같은 시간 축에 대해 서로 다른 종류의 데이터를 표현하기 위해 축이 2개 필요
- 한 데이터에 대해 다른 단위(ex. raidan과 degree)
- .secondary_xaxis(), .secondary_yaxis() 사용
- 같은 시간축/x축에 대해 서로 다른 종류의 데이터를 표현하는 데엔 이중축을 지양(서로 상관관계가 있어보이기 때문)
ETC
- 라인 끝 단에 레이블을 추가하면 식별에 도움이 됨(범례 대신)
- Min/Max 같은 원하는 정보는 추가해주면 도움이 될 수 있음(annotation)
- 보다 연한 색을 이용해 uncertainty 표현 가능(신뢰구간, 분산 등)
Scatter Plot
- 점을 사용해 두 feature간의 관계를 알기 위해 사용하는 그래프
- 산점도라고도 함
- .scatter()
Scatter Plot의 요소
- 점에서 다양한 variation 사용 가능(2차원 데이터에서 N차원 데이터로 확장 가능)
- 색(color)
- 모양(marker)
- 크기(size)
Scatter Plot의 목적
- 세 가지 특성
- 군집(Cluster): 데이터가 어떻게 묶여있는가
- 값 사이의 차이(Gap in Values): 보간, 전처리를 위해 사용
- 이상치(Outlier)
정확한 Scatter Plot
Overplotting
- 점이 많아질수록 분포를 파악하기 힘들다
- 투명도 조정
- 지터링(jittering): 점의 위치를 약간씩 변경, 효율성이 크지는 않다
- 2차원 히스토그램: 히트맵을 사용해 깔끔한 시각화
- Contour plot: 분포를 등고선을 사용해 표현
점의 요소와 인지
- 색
- 연속은 gradient, 이산은 개별 색상으로
- 마커
- 크기
- 흔히 버블 차트(bubble chart)라고 부름
- 구별하기 쉽지만 오용하기도 쉬움(원의 크기 비교에서)
- 관계보다는 각 점간 비율에 초점을 둔다면 좋음
- SWOT 분석 등에 활용 가능
인과관계와 상관관계
- 인과 관계(casual relation)과 상관 관계(correlation)은 다름!
- 인과 관계: x축 때문에 y축이 변한다
- 상관 관계: x축과 y축이 같이 커진다
- 분석 과정에서 고민해볼 것
- 인과 관계는 항상 사전 정보와 함께 가정으로 제시할 것
추세선
- 추세선을 사용해 scatter의 패턴을 유추할 수 있음
하지만 2개 이상이 되면 가독성이 떨어지므로 주의
ETC