파이썬 시각화 라이브러리, Seaborn ‘mpg’의 수치형 데이터 시각화하기


1. 학습 목표

  • seaborn의 mpg 데이터셋을 이용하여 수치형 변수에 대해 시각화
  • 히스토그램, displot, kdeplot, rugplot, boxplot, violinplot 그려보기
  • 스케일링에 대해 이해하기


2. 라이브러리, 데이터 로드

# 라이브러리 로드
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# seaborn 내장 데이터셋인 'mpg' 데이터를 df에 저장
df = sns.load_dataset("mpg")


3. 데이터 살펴보기

(1) 데이터 구조

# 데이터셋 구조 파악
df.shape
>> (398, 9)

(2) 데이터 형태

# 상위 5개 데이터만 불러오기
df.head()
# 하위 5개 데이터만 불러오기
df.tail()


(3) 데이터 요약

# 데이터 기본 정보 요약
df.info()
df.info()의 결과물


  • 데이터셋은 총 398개의 데이터를 가지고 있다.
  • origin, name은 type이 object 이다.
  • 데이터 타입, 결측치의 유무, 메모리 사용량 등의 정보를 알 수 있다.
  • horsepower 에 결측치가 존재한다.


(4) 결측치

  • print(plt.colormaps()) : colormap 종류 확인
  • coolwarm : heatmap에서 한눈에 파악하기 좋은 컬러
  • Sequential, Diverging, Cyclinc 등 다양한 상황에서 색상 적용할 수 있음
plt.figure(figsize=(6, 4))
sns.heatmap(df.isnull(), cmap="gray")
결측값을 heatmap으로 시각화한 결과


  • 그래프에서 y축(왼) : 데이터 인덱스 번호 / x축 : 컬럼명 을 나타낸다.
  • mpg 데이터셋에서 결측치는 horsepower에서 총 6개 존재한다.


(5) 기술통계

# 데이터 기술 통계값(수치형)
df.describe()
수치데이터에 대한 기술통계값


# 데이터 기술 통계값(범주형)
df.describe()
범주형데이터에 대한 기술통계값


(6) 유일값

# 데이터 unique 개수
df.nunique()
df.nunique()의 결과물


  • cylinders, model_year, origin 의 유일값을 보면 전체 데이터 개수(398개)에 비해 매우 적다.
    • 수치형 변수이지만 범주형 변수에 가깝다고 생각할 수 있다.


4. 데이터 시각화

🔍 수치형 데이터(numberical data)

  • 관측된 값이 수치로 측정되는 자료를 말한다.
  • 양적 자료(quantitative data)라고도 불린다.
  • 관측되는 값의 성질에 따라 연속형 자료(continuous data), 이산형 자료(discrete data)로 구분된다.

(1) 히스토그램

hist : 각 변수에 대한 따른 y축(count) 관계이다.
bins : 막대그래프의 개수이다.

# 막대 개수 50개로 설정
df.hist(figsize=(12, 10), bins=50)
plt.show()
히스토그램 결과물


🔍 그래프 해석

  • cylinders 는 범주형 데이터로 볼 수 있다.
  • mpg, displacement, horsepower, weight 는 왼쪽으로 치우쳐있다.
  • acceleration 은 15를 기준으로 대칭성을 보인다.
  • 수치형 데이터로 시각화 해 볼 column은 mpg, displacement, horsepower, weight 이다.


(2) Displot

  • Displot: 히스토그램과 kdeplot을 동시에 그릴 수 있는 그래프
  • y축 기본값 : 개수(count)
  • hue : 설정한 값에 대해 색상 부여
  • col : 설정한 값에 대해 subplot 생성
# hist, kde 그래프를 한번에 그리기
sns.displot(data=df, x="mpg", kde=True)
displot 결과(왼쪽), countplot 결과(오른쪽)


  • 수치형 데이터를 countplot으로 그리기엔 적절하지 않다.
    • 연속형 변수에 대해서 x축에 모든 값이 포함되기 때문
  • 수치형 데이터의 범위별 count 값을 확인하고자할 때 displot 을 사용하면 된다.


# hist, kde 그래프를 한번에 그리기 
# origin에 대해 subplot 생성
sns.displot(data=df, x="mpg", kde=True,
			hue="origin", col="origin", bins=30)
위 코드의 결과물


  • kde=False(default) 일 땐 히스토그램과 같은 그래프가 그려진다.
  • 전체 데이터에 대한 연비는 약 10 ~ 45 범위에서 왼쪽으로 치우쳐져 있다. (positive skewness)
  • usa : 연비는 10~25 사이로 치우쳐져 있다.
  • europe에 대한 연비는 정규 분포에 가깝다는 것을 알 수 있다.


(3) Kdeplot, Rugplot

KDE(Kernel Density Estimate)

  • 관측치에 대한 확률밀도함수를 그림 (히스토그램의 밀도를 추정한 것)
  • y축 기본값 : 밀도(Density)

RUG(선분)

  • 작은 선분(rug)으로 데이터들의 위치 및 분포를 보여줌
# kdeplot
sns.kdeplot(data=df, x="mpg")

# rugplot 
sns.rugplot(data=df, x="mpg")

# kde + rug plot
sns.kdeplot(data=df, x="mpg")
sns.rugplot(data=df, x="mpg")
위 코드의 결과물


  • kdeplot, rugplot으로 어디에 데이터가 몰려있는지 알 수 있다.
  • violinplot : kdeplot을 x축을 기준으로 데칼코마니 한 모양


(4) Boxplot, Violinplot

boxplot : 사분위 수, 이상치를 나타내는 그래프
violinplot : kdeplot을 마주보고 그린 그래프(그래프에서 흰 점, 중간값)

# boxplot으로 전체 변수 시각화
sns.boxplot(data=df)

# violinplot으로 전체 변수 시각화
sns.violinplot(data=df)
boxplot(왼쪽), violinplot(오른쪽)


  • 전체 변수에 대해 시각화를 해보면 범위가 커서 그래프가 전달하고자하는 의미를 파악하기 힘들다.
  • 범위를 스케일링하여 위 문제를 해결해보자.


🔍 스케일링

모든 특성의 범위(또는 분포)를 같게 만드는 것으로 주로 사용되는 스케일링 개념은 아래와 같다.

(1) Standardization (표준화)

  • 특성들의 평균을 0, 분산을 1로 스케일링하는 것
  • 즉, 특성들을 정규분포로 만드는 것

(2) Normalization (정규화)

  • 특성들을 특정 범위 (주로 [0, 1]) 로 스케일 하는 것
  • 가장 작은 값은 0, 가장 큰 값은 1로 변환되므로, 모든 특성들은 [0, 1] 범위를 갖게 됨


🔍 스케일링 과정(표준화)

# 수치형 데이터를 변수 df_num에 할당 
df_num = df.select_dtypes(include="number")

# 정규화 : (관측치 - 평균) / 표준편차
df_std = (df_num - df_num.mean())/df_num.std()

# 정규화 후, 전체 변수에 대한 기술통계값 확인 (소수점 2자리까지)
df_std.describe().round(2)
위 코드의 결과물


🔍 정규화된 변수에 대한 밀도함수

# boxplot으로 전체 변수 시각화 
sns.boxplot(data=df_std)

# Violinplot으로 전체 변수 시각화
sns.violinplot(data=df_std)
boxplot(왼쪽), violinplot(오른쪽)


  • 범위가 중구난방인 변수를 스케일링 하게 되면, 위와 같이 그래프가 한 눈에 파악하기 쉬워진다.
  • 특히, violinplot 을 보면, 값의 분포를 더 잘 확인할 수 있다.


5. 회고

주어진 데이터가 수치형인지 범주형인지 판단하는 방법을 배웠다. dtype이 object가 아닌 경우에도 범주형 데이터로 취급하는 경우가 있다. 이는 unique 값을 구해보거나 histogram을 그려보면 알 수 있다.

  • 히스토그램을 그려보았을 때, 연속적이지 않고 뚝뚝 끊기는 경우엔 그 변수를 범주형 변수에 가깝다고 생각할 수 있다.
  • 이번에 그려본 히스토그램, kdeplot, displot, 등의 그래프는 1개의 변수에 대한 count, 밀도, 사분위 등을 의미했다.
  • 다음엔 2개 이상의 변수에 대한 상관 관계를 알아보기 위해 scatterplot, 회귀 등을 시각화해 보아야겠다.

boxplot과 violinplot은 전체 변수를 모아서 한 그래프로 볼 수 있다. 하지만 범위가 준구난방이라면 한 그래프에 담게 되었을 때, 어떤 의미를 담고있는지 파악하기 힘들다. 이럴 땐, 범위를 스케일링하여 그래프를 보기 쉽게, 이해하기 쉽게 만들 수 있도록 여러 실습을 통해 감을 익혀야겠다.


6. Reference

👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기