[캐글 리팩터링] 04 데이터를 한눈에 - 주요 시각화 그래프
데이터를 이해하기 위한 다양한 시각화 기법의 개념, 효과 구현 방법 등에 대해 알아보자
데이터 종류
수치형 데이터
- 사칙 연산이 가능한 데이터
- 구분
- 연속형: 값이 연속된 데이터. ex_ 키, 몸무게
- 이산형: 정수로 딱 떨어져 셀 수 있는 데이터. ex_ 사과 개수, 책 페이지 수
범주형 데이터
- 범주를 나눌 수 있는 데이터, 사칙 연산이 불가능하다.
- 구분
- 순서형: 순위를 매길 수 있는 데이터. ex_학점, 메달
- 명목형: 순위가 없는 데이터. ex_ 성별, 우편번호
수치형 데이터 시각화
-
일정 범위 내에서 어떻게 분포되어 있는지가 중요하다.
-
고르게 퍼져 있는지, 특정 영역에 몰려 있는지
-
데이터를 어떻게 변환할 지, 어떻게 해석해서 활용할지 판단할 수 있다.
-
# 타이타닉 데이터 불러오기
import seaborn as sns
titanic = sns.load_dataset('titanic')
titanic.head()
survived pclass sex age sibsp parch fare embarked class \ 0 0 3 male 22.0 1 0 7.2500 S Third 1 1 1 female 38.0 1 0 71.2833 C First 2 1 3 female 26.0 0 0 7.9250 S Third 3 1 1 female 35.0 1 0 53.1000 S First 4 0 3 male 35.0 0 0 8.0500 S Third who adult_male deck embark_town alive alone 0 man True NaN Southampton no False 1 woman False C Cherbourg yes False 2 woman False NaN Southampton yes True 3 woman False C Southampton yes False 4 man True NaN Southampton no True
-
수치형 데이터(age, fare 등)와 범주형 데이터(sex, embarked, class 등)가 공존한다.
-
seaborn에서 제공하는 주요 분포도 함수이다.
-
히스토그램 : histplot()
-
커널밀도추정 : kdeplot()
-
분포도 : displot()
-
러그플롯 : rugplot()
-
히스토그램 histplot()
- 수치형 데이터의 구간별 빈도수를 나타낸다.
sns.histplot(data=titanic, x='age')
- bins: 구간 개수를 지정한다. 기본값은 20
sns.histplot(data=titanic, x='age', bins=10)
- 빈도를 특정 범주별로 구분해보자
# 생존여부에 따른 연령 분포 그래프
sns.histplot(data=titanic, x='age', hue='alive')
# 생존여부에 따른 연령 분포 그래프 - 겹쳐지지 않도록 누적해서 표현하기
sns.histplot(data=titanic, x='age', hue='alive', multiple='stack')
커널밀도추정 함수 그래프 kdeplot()
-
히스토그램을 매끄럽게 곡선으로 연결한 그래프이다.
-
실제로 탐색적 데이터 분석 시 많이 쓰지는 않는다.
sns.kdeplot(data=titanic, x='age')
<
sns.kdeplot(data=titanic, x='age', hue='alive', multiple='stack')
분포도 displot()
-
수치형 데이터 하나의 분포를 나타내는 그래프이다.
-
캐글에서 분포도를 그릴 때 displot()을 많이 사용한다.
- 히스토그램과 커널밀도추정 함수 그래프도 그릴 수 있기 때문
# 히스토그램
sns.displot(data=titanic, x='age')
# 커널밀도추정 함수 그래프
sns.displot(data=titanic, x='age', kind='kde')
# 히스토그램과 커널밀도추정 함수 그래프 동시에 그리기
sns.displot(data=titanic, x='age', kde=True)
러그플롯 rugplot()
-
주변 분포(marginal distribution)를 나타내는 그래프이다.
-
단일 피처가 어떻게 분포되어있는지 x축 위에 작은 선분으로 표시한다.
-
단독으로 사용하기보다는 다른 분포도 그래프와 함께 사용한다.
# 커널밀도추정 함수 그래프와 러그플롯 함께 그리기
sns.kdeplot(data=titanic, x='age')
sns.rugplot(data=titanic, x='age')
범주형 데이터 시각화
-
seaborn에서 제공하는 주요 분포도 함수이다.
-
막대 그래프 : barplot()
-
포인트플롯 : pointplot()
-
박스플롯 : boxplot()
-
바이올린플롯 : violinplot()
-
카운트플롯 : countplot()
-
파이 그래프 : pie()
-
막대 그래프 barplot()
-
범주형 데이터 값에 따라 수치형 데이터 값이 어떻게 달라지는지 파악할 때 사용한다.
-
범주형 데이터에 따른 수치형 데이터의 평균과 신뢰구간을 그려준다. 이때 원본 데이터가 아닌 샘플링한 데이터의 평균을 구해준다.
-
평균 - 막대 높이
-
신뢰구간 - 오차 막대
-
# 타이타닉 탑승자 등급별 운임
sns.barplot(x='class', y='fare', data=titanic)
-
막대 높이: 등급별 평균 운임
-
오차 막대: 신뢰구간
-
해석: 등급이 높을수록 평균 운임이 비싸고 신뢰구간이 넓어진다.
-
barplot()으로 평균이 아닌 중앙값, 최댓값, 최솟값을 구할 수 있다.
import numpy as np
sns.barplot(x='class', y='fare', data=titanic, estimator=np.median) # 중앙값
sns.barplot(x='class', y='fare', data=titanic, estimator=np.max) # 최댓값
sns.barplot(x='class', y='fare', data=titanic, estimator=np.min) # 최솟값
포인트플롯 pointplot()
-
막대 그래프와 모양만 다르고 동일한 정보를 제공한다.
-
범주형 데이터에 따른 수치형 데이터의 평균과 신뢰구간을 나타낸다.
-
한 화면에 여러 그래프를 그려 비교할 때 사용한다.
# 타이타닉 탑승자 등급별 운임
sns.pointplot(x='class', y='fare', data=titanic)
-
포인트플롯과 막대 그래프 비교 - 계절에 따른 시간대별 자전거 대여 수량
-
아래쪽 막대 그래프로는 계절별 차이를 알기 어렵다.
-
위쪽 포인트플롯은 계절별 차이가 한눈에 들어온다.
-
박스플롯 boxplot()
-
5가지 요약 수치를 제공한다.
-
최솟값(Q1-(1.5xIQR))
-
제1사분위수(Q1, 하위 25%)
-
제2사분위수(Q2, 중앙값)
-
제3사분위수(Q3, 상위 25%)
-
최댓값(Q4, Q3+(1.5xIQR))
-
IQR: Q3-Q1
-
이상치: 최댓값보다 큰 값과 최솟값보다 작은 값
-
# 탑승자 등급별 나이
sns.boxplot(x='class', y='age', data=titanic)
바이올린플롯 violinplot()
-
박스플롯과 커널밀도추정 함수 그래프를 합쳐 놓은 그래프이다.
# 등급별 나이 그래프
sns.violinplot(x='class', y='age', data=titanic)
-
박스플롯: 각 범주별로 5가지 요약 수치를 한눈에 보고 싶을 때
-
바이올린플롯: 수치형 데이터의 전체적인 분포 양상을 알고 싶을 때
# 성별에 따른 등급별 나이 분포
sns.violinplot(x='class', y='age', hue='sex', data=titanic, split=True)
카운트플롯 countplot()
-
범주형 데이터의 개수를 확인할 때 사용하는 그래프
-
범주형 피처나 범주형 타깃값의 분포가 어떤지 파악하는 용도로 사용
# 타이타닉 탑승자 등급별 인원수
sns.countplot(x='class', data=titanic)
# 그래프 방향 바꾸기
sns.countplot(y='class', data=titanic)
-
barplot() vs countplot()
- 피처를 두 개 받는다.
sns.barplot(x=’class’, y=’fare’, data=titanic)
- 피처를 한 개 받는다.
sns.countplot(x=’class’, data=titanic)
# 피처를 두 개 받는다.
sns.barplot(x='class', y='fare', data=titanic)
# 피처를 한 개 받는다.
sns.countplot(x='class', data=titanic)
파이 그래프 pie()
-
범주형 데이터별 비율을 알아볼 때 사용한다.
-
x: 범주형 데이터의 비율
-
labels: 범주형 데이터 레이블명
-
autopct: 비율을 숫자로 나타내기
import matplotlib.pyplot as plt
x = [10, 60, 30]
labels = ['A', 'B', 'C']
plt.pie(x=x, labels=labels, autopct='%.1f%%')
데이터 관계 시각화
-
여러 데이터 사이의 관계를 살펴보자
-
seaborn에서 제공하는 그래프
-
히트맵 : heatmap()
-
라인플롯 : lineplot()
-
산점도 : scatterplot()
-
회귀선을 포함한 산점도 : regplot()
-
히트맵 heatmap()
-
데이터 간 관계를 색상으로 표현한 그래프이다.
-
비교해야할 데이터가 많을 때 주로 사용한다.
-
pivot 함수를 활용해서 데이터 구조를 바꾼 후 사용한다.
# 비행기 탑승자 수 데이터
import seaborn as sns
flights = sns.load_dataset('flights')
flights.head()
year month passengers 0 1949 Jan 112 1 1949 Feb 118 2 1949 Mar 132 3 1949 Apr 129 4 1949 May 121
- 범주형 데이터 2개(year, month)와 수치형 데이터 1개(passengers)가 있다.
-
각 연도의 월별 승객 수 알아보자
-
month를 행으로
-
year를 열로 두고
-
합산할 데이터를 passenger로 지정한다.
-
flights_pivot = flights.pivot(index='month',
columns='year',
values='passengers')
flights_pivot
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 month Jan 112 115 145 171 196 204 242 284 315 340 360 417 Feb 118 126 150 180 196 188 233 277 301 318 342 391 Mar 132 141 178 193 236 235 267 317 356 362 406 419 Apr 129 135 163 181 235 227 269 313 348 348 396 461 May 121 125 172 183 229 234 270 318 355 363 420 472 Jun 135 149 178 218 243 264 315 374 422 435 472 535 Jul 148 170 199 230 264 302 364 413 465 491 548 622 Aug 148 170 199 242 272 293 347 405 467 505 559 606 Sep 136 158 184 209 237 259 312 355 404 404 463 508 Oct 119 133 162 191 211 229 274 306 347 359 407 461 Nov 104 114 146 172 180 203 237 271 305 310 362 390 Dec 118 140 166 194 201 229 278 306 336 337 405 432
- 히트맵을 사용하여 데이터를 이해하기 쉽게 시각화해보자
sns.heatmap(data=flights_pivot)
- 밝을 수록 passenger 수가 많으며 passenger 수를 한눈에 파악할 수 있다.
라인플롯 lineplot()
-
두 수치형 데이터 사이의 관계를 나타낼 때 사용한다.
-
x 파라미터에 전달한 값에 따라 y파라미터에 전달한 값의 평균과 95% 신뢰구간을 나타낸다.
sns.lineplot(x='year', y='passengers', data=flights)
<matplotlib.axes._subplots.AxesSubplot at 0x7f25c915d730>
- 해가 갈 수록 평균 승객 수가 많아지는 것을 알 수 있다.
산점도 scatterplot()
- 두 데이터의 관계를 점으로 표현한 그래프이다.
# 총 비용과 팁 정보를 모아둔 tips 데이터셋 활용
tips = sns.load_dataset('tips')
tips.head()
total_bill tip sex smoker day time size 0 16.99 1.01 Female No Sun Dinner 2 1 10.34 1.66 Male No Sun Dinner 3 2 21.01 3.50 Male No Sun Dinner 3 3 23.68 3.31 Male No Sun Dinner 2 4 24.59 3.61 Female No Sun Dinner 4
# 산점도
sns.scatterplot(x='total_bill', y='tip', data=tips)
-
총액이 늘면 팁도 따라서 늘고 있다는 것을 알 수 있다.
-
특정 범주형 데이터별로 나누어 그려보자
# 점심과 저녁을 구분해 그려보기
sns.scatterplot(x='total_bill', y='tip', hue='time', data=tips)
- 점심과 저녁의 전체적인 추이는 비슷해보인다.
회귀선을 포함한 산점도 그래프 regplot()
-
산점도와 선형 회귀선을 동시에 그려준다.
-
회귀선을 통해 전반적인 상관관계를 쉽게 파악할 수 있다.
-
선형 회귀선 주변으로 95% 신뢰구간을 나타낸다.
- 신뢰구간을 늘리려면 ci=99로 전달한다.
sns.regplot(x='total_bill', y='tip', data=tips)
sns.regplot(x='total_bill', y='tip', ci=99, data=tips)
지금까지 데이터를 이해하기 위한 데이터 탐색 기법으로 다양한 시각화 방법에 대해 알아봤다. 다음 포스트에서는 경진대회 문제 해결을 위한 머신러닝 주요 개념에 대해 다뤄볼 것이다.
댓글남기기