6 분 소요

데이터를 이해하기 위한 다양한 시각화 기법의 개념, 효과 구현 방법 등에 대해 알아보자

데이터 종류

수치형 데이터

  • 사칙 연산이 가능한 데이터
  • 구분
    • 연속형: 값이 연속된 데이터. 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')

image

  • bins: 구간 개수를 지정한다. 기본값은 20
sns.histplot(data=titanic, x='age', bins=10)

image

  • 빈도를 특정 범주별로 구분해보자
# 생존여부에 따른 연령 분포 그래프
sns.histplot(data=titanic, x='age', hue='alive')

image

# 생존여부에 따른 연령 분포 그래프 - 겹쳐지지 않도록 누적해서 표현하기
sns.histplot(data=titanic, x='age', hue='alive', multiple='stack')

image

커널밀도추정 함수 그래프 kdeplot()

  • 히스토그램을 매끄럽게 곡선으로 연결한 그래프이다.

  • 실제로 탐색적 데이터 분석 시 많이 쓰지는 않는다.

sns.kdeplot(data=titanic, x='age')

<image

sns.kdeplot(data=titanic, x='age', hue='alive', multiple='stack')

image

분포도 displot()

  • 수치형 데이터 하나의 분포를 나타내는 그래프이다.

  • 캐글에서 분포도를 그릴 때 displot()을 많이 사용한다.

    • 히스토그램과 커널밀도추정 함수 그래프도 그릴 수 있기 때문
# 히스토그램
sns.displot(data=titanic, x='age')

image

# 커널밀도추정 함수 그래프
sns.displot(data=titanic, x='age', kind='kde')

image

# 히스토그램과 커널밀도추정 함수 그래프 동시에 그리기
sns.displot(data=titanic, x='age', kde=True)

image

러그플롯 rugplot()

  • 주변 분포(marginal distribution)를 나타내는 그래프이다.

  • 단일 피처가 어떻게 분포되어있는지 x축 위에 작은 선분으로 표시한다.

  • 단독으로 사용하기보다는 다른 분포도 그래프와 함께 사용한다.

# 커널밀도추정 함수 그래프와 러그플롯 함께 그리기
sns.kdeplot(data=titanic, x='age')
sns.rugplot(data=titanic, x='age')

image

범주형 데이터 시각화

  • seaborn에서 제공하는 주요 분포도 함수이다.

    • 막대 그래프 : barplot()

    • 포인트플롯 : pointplot()

    • 박스플롯 : boxplot()

    • 바이올린플롯 : violinplot()

    • 카운트플롯 : countplot()

    • 파이 그래프 : pie()

막대 그래프 barplot()

  • 범주형 데이터 값에 따라 수치형 데이터 값이 어떻게 달라지는지 파악할 때 사용한다.

  • 범주형 데이터에 따른 수치형 데이터의 평균과 신뢰구간을 그려준다. 이때 원본 데이터가 아닌 샘플링한 데이터의 평균을 구해준다.

    • 평균 - 막대 높이

    • 신뢰구간 - 오차 막대

# 타이타닉 탑승자 등급별 운임
sns.barplot(x='class', y='fare', data=titanic)

image

  • 막대 높이: 등급별 평균 운임

  • 오차 막대: 신뢰구간

  • 해석: 등급이 높을수록 평균 운임이 비싸고 신뢰구간이 넓어진다.

  • 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)

image

  • 포인트플롯과 막대 그래프 비교 - 계절에 따른 시간대별 자전거 대여 수량

    image

    • 아래쪽 막대 그래프로는 계절별 차이를 알기 어렵다.

    • 위쪽 포인트플롯은 계절별 차이가 한눈에 들어온다.

박스플롯 boxplot()

  • 5가지 요약 수치를 제공한다.

    • 최솟값(Q1-(1.5xIQR))

    • 제1사분위수(Q1, 하위 25%)

    • 제2사분위수(Q2, 중앙값)

    • 제3사분위수(Q3, 상위 25%)

    • 최댓값(Q4, Q3+(1.5xIQR))

    • IQR: Q3-Q1

    • 이상치: 최댓값보다 큰 값과 최솟값보다 작은 값

      image

# 탑승자 등급별 나이
sns.boxplot(x='class', y='age', data=titanic)

image

바이올린플롯 violinplot()

  • 박스플롯과 커널밀도추정 함수 그래프를 합쳐 놓은 그래프이다.

    image

# 등급별 나이 그래프
sns.violinplot(x='class', y='age', data=titanic)

image

  • 박스플롯: 각 범주별로 5가지 요약 수치를 한눈에 보고 싶을 때

  • 바이올린플롯: 수치형 데이터의 전체적인 분포 양상을 알고 싶을 때

# 성별에 따른 등급별 나이 분포
sns.violinplot(x='class', y='age', hue='sex', data=titanic, split=True)

image

카운트플롯 countplot()

  • 범주형 데이터의 개수를 확인할 때 사용하는 그래프

  • 범주형 피처나 범주형 타깃값의 분포가 어떤지 파악하는 용도로 사용

# 타이타닉 탑승자 등급별 인원수
sns.countplot(x='class', data=titanic)

image

# 그래프 방향 바꾸기
sns.countplot(y='class', data=titanic)

image

  • 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)

image

# 피처를 한 개 받는다.
sns.countplot(x='class', data=titanic)

image

파이 그래프 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%%')

image

데이터 관계 시각화

  • 여러 데이터 사이의 관계를 살펴보자

  • 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)

image

  • 밝을 수록 passenger 수가 많으며 passenger 수를 한눈에 파악할 수 있다.

라인플롯 lineplot()

  • 두 수치형 데이터 사이의 관계를 나타낼 때 사용한다.

  • x 파라미터에 전달한 값에 따라 y파라미터에 전달한 값의 평균과 95% 신뢰구간을 나타낸다.

sns.lineplot(x='year', y='passengers', data=flights)
<matplotlib.axes._subplots.AxesSubplot at 0x7f25c915d730>

image

  • 해가 갈 수록 평균 승객 수가 많아지는 것을 알 수 있다.

산점도 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)

image

  • 총액이 늘면 팁도 따라서 늘고 있다는 것을 알 수 있다.

  • 특정 범주형 데이터별로 나누어 그려보자

# 점심과 저녁을 구분해 그려보기
sns.scatterplot(x='total_bill', y='tip', hue='time', data=tips)

image

  • 점심과 저녁의 전체적인 추이는 비슷해보인다.

회귀선을 포함한 산점도 그래프 regplot()

  • 산점도와 선형 회귀선을 동시에 그려준다.

  • 회귀선을 통해 전반적인 상관관계를 쉽게 파악할 수 있다.

  • 선형 회귀선 주변으로 95% 신뢰구간을 나타낸다.

    • 신뢰구간을 늘리려면 ci=99로 전달한다.
sns.regplot(x='total_bill', y='tip', data=tips)

image

sns.regplot(x='total_bill', y='tip', ci=99, data=tips)

image



지금까지 데이터를 이해하기 위한 데이터 탐색 기법으로 다양한 시각화 방법에 대해 알아봤다. 다음 포스트에서는 경진대회 문제 해결을 위한 머신러닝 주요 개념에 대해 다뤄볼 것이다.

댓글남기기