본문 바로가기
TIL _Today I Learned/2024.07

[DAY 10] Data Visualization

by gamdong2 2024. 7. 24.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.07.24

📕 학습 목록

  • 분포형 데이터
  • 범주형 데이터
  • 기타 시각화

 

📗 기억할 내용

 

1) 분포형 데이터 (Dis Plot)

  • Dis Plot ⊃ Hist Plot, KDE Plot, Rug Plot, ECDF Plot

① Hist Plot(Histogram)

  • 데이터를 구간별로 나눔; 데이터 값의 범위를 일정한 간격(bin)으로 나눔 → 각 구간에 속하는 데이터의 개수를 막대로 표시
  • 데이터의 대칭성을 확인
  • sns.histplot(data, x, hue, multiple, bins)
  • multiple : 다른 범주를 어떻게 시각화할지 결정
* multiple 속성들
  - layer : 겹치기(기본값)
  - dodge : 겹치지 않게 나란히
  - stack : 쌓기
  - fill : 비율

 
② KDE Plot (Kernel Density Estimation)

  • 데이터의 분포를 곡선으로 표현
  • 히스토그램 보다 데이터의 모양•구조를 정확하게 파악(히스토그램 : 이산적인 bin을 사용)
  • 비모수적방법으로 데이터  분포를 모델링; 데이터에 대한 가정이 필요x
  • sns.kdeplot(data, x)

③ Rug Plot

  • 데이터의 각 포인트를 축 위에 작은 선분(or 틱)으로 나타냄
  • 다른 Plot 과 함께 사용 가능
  • sns.rugplot()

④ displot() 을 활용하여 histplot/kdeplot + rugplot 함께 시각화

  • sns.displot(data, x, y, hue, kind(메인 plot), rug(True))

 

2) 범주형 데이터 (Cat Plot)

  • Cat Plot ⊃ Bar Plot, Count Plot, Box Plot, Boxen Plot, Violin Plot, Swarm Plot, Strip Plot, Point Plot

① Bar Plot

  • 막대's 높이(길이) :  해당 범주의 값•빈도
  • x 축 : 카테고리 변수
  • y 축 : 수치 변수
  • sns.barplot(data, x, y)

② Count Plot

  • 범주형 데이터의 빈도 시각화
  • 이산적인 데이터 항목 or 범주를 가진 열(column)
  • x or y 매개변수; 범주를 표시할 축을 선택
  • sns.countplot(data, x(or y), hue)

③ Box Plot

  • 데이터's 중심 경향, 분산, 분포 형태 확인 → 데이터 그룹 간 비교
  • 통계적 정보 제공; 중앙값, 사분위수(25%, 75%), 이상치 등
  • 상자 수염(데이터의 최대•최소 값)을 벗어난 값 : 이상치
  • sns.boxplot(data, x, y, hue)

④ Boxen Plot

  • 상자 크기로 값의 분포 정도를 추측
  • 비대칭 분포 확인
  • box plot 보다 대형 데이터 출력에  유리
  • 수염 無, 박스를 벗어나는 값 : 이상치
  • sns.boxenplot(data, x, y, hue)

⑤ Violin Plot

  • 데이터의 분포를 곡선으로 출력(≓ KDE Plot)
  • 너비; 데이터의 밀도 확인
  • 비대칭 분포 확인
  • sns.violinplot(data, x, y, hue, split, inner)
- split : true일 경우, hue 에 따라 분포를 좌우로 분할
- inner : 그래프 안에 그려 넣을 요소(box, quartile, point, stick)

 

 
3) 기타 시각화 도구

  • Heatmap, Pair Plots, Pie Chart

① Heatmap

  • 수치형 자료형 간의 상관관계를 시각적으로 표현
  • 색상 맵; 값의 크기(상대적)에 따라 다양한 색으로 셀을 채움
  • sns.heatmap(corr_matrix)
  • .corr() 메서드를 활용하여 상관 행렬 계산

② Pair Plots

  • 데이터프레임 내의 수치형 변수에 대한 산점도 매트릭스를 생성
  • 변수 간의 관계 파악에 용이
  • 대각선(변수 자기 자신에 대한 위치); 히스토그램 or KDE 플롯
  • sns.pairplot(dataframe, hue, vars)
  • vars : 시각화에 사용할 데이터를 리스트에 저장하여 지정

③ Pie Chart

  • 전체 데이터에 대한 각 부분 데이터를 비율로 시각화(라벨링)
  • seaborn 에는 Pie Chart 생성 기능x; matplotlib 사용하여 구현
  • plt.pie(x, labels, autopctm)
  • x : 원형 차트 내부 각 조각의 크기
  • labels : 원형 차트 내부 각 조각의 레이블
  • autopctm : 각 조각의 비율을 계산하여 표시(일반적으로 %1.1f%% 사용)

 

📘 트러블 슈팅

[문제]

  • 문제 내용
heatmap plot 결과, 타켓한 열("carat", "depth", "price") 외에 다른 데이터도 출력됨
# Q) 다이아몬드 데이터 중 carat, depth, price 열에 대해서 Heatmap을 시각화하시오

import seaborn as sns
import matplotlib.pyplot as plt

diamonds = sns.load_dataset("diamonds")
# diamonds.info()

numeric_diamonds = diamonds.select_dtypes(include=["float64", "int64"])

# 상관 행렬 계산; 얼마나 상관관계가 있는지 ~
# correlation(상관관계)
corr_matrix = numeric_diamonds.corr()

sns.heatmap(
    corr_matrix, 
    annot=True,
)  

plt.show()
  • 문제 원인
타겟한 열만 선택하는 과정이 생략됨

 
[해결]

  • 해결 방법
pandas 라이브러리를 이용하여 데이터프레임에서 타겟열을 복수 선택 → Heatmap을 통해 상관관계를 시각화
  • 해결 결과
import seaborn as sns
import matplotlib.pyplot as plt

diamonds = sns.load_dataset("diamonds")

# 단순 복수 열 선택
# diamonds[["carat", "depth", "price"]]

# loc를 활용한 복수 열 선택
selected_diamonds = diamonds.loc[:, ["carat", "depth", "price"]]

# 상관행렬 계산 .corr()
corr_diamonds = selected_diamonds.corr()

# heatmap 기능 : 상관행렬 시각화
sns.heatmap(
    data=corr_diamonds,
    annot=True,
)

plt.show()

 

📙 내일 일정

  • Plotly, Folium