mpg
데이터셋을 이용하여 수치형 변수
에 대해 시각화히스토그램
, displot
, kdeplot
, rugplot
, boxplot
, violinplot
그려보기목차
1.import
pandas, numpy, seaborn, matplotlib.pyplot
2.load_dataset
3. seaborn 시각화
💡 Library
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt
💡 Dataset : mpg(mile per galon)
# 앤스컴 데이터셋 불러오기 df = sns.load_dataset("mpg")
# 데이터셋 구조 파악 df.shape >> (398, 9)
mpg
: 행 398, 열 9 로 구성된 데이터셋
💡 데이터셋 일부만 가져오기
# 상위 5개 데이터만 불러오기 df.head()
# 하위 5개 데이터만 불러오기 df.tail()
- 열 :
mpg
,cylinders
,displacement
,horsepower
,weight
,acceleration
,model_year
,origin
,name
💡 데이터셋 요약
# 데이터 기본 정보 요약 df.info()
- 데이터셋은 총 398개의 데이터를 가지고 있다.
origin
,name
은 type이object
이다.- 데이터 타입, 결측치의 유무, 메모리 사용량 등의 정보를 알 수 있다.
💡 데이터셋 결측치
# 데이터 결측치를 True, False로 확인 df.isnull()
🔥 결측치 시각화 해보기
plt.figure(figsize=(12, 8))
sns.heatmap(df.isnull(), cmap="Blues")
y축(왼) : 데이터 인덱스 번호
/ x축 : 컬럼명
을 나타낸다.mpg
데이터셋에서 결측치는 horsepower
에서 총 6개 존재한다.💡 데이터셋 기술통계
# 데이터 기술 통계값 df.describe()
💡 데이터셋 유일값# 데이터 unique 개수 df.nunique()
cylinders
,model_year
,origin
의 유일값을 보면 전체 데이터 개수(398개)에 비해 매우 적다.
- 수치형 변수이지만 범주형 변수에 가깝다고 생각할 수 있다.
히스토그램
, displot
, kdeplot
, rugplot
, boxplot
, violinplot
이전 복습시간에 그려보았다.Scatterplot
, regplot
, residplot
, lmplot
, jointplot
, pairplot
, lineplot
, heatmap
를 그려 변수들 간의 상관 관계를 알아본다.Scatterplot
: 두 개 변수 간의 관계를 나타내는 그래프 방법# 전체 변수에 대한 관계
sns.scatterplot(data=df)
# 연비와 마력의 관계
sns.scatterplot(data=df, x="mpg", y="horsepower")
Scatterplot
을 그려보니, 범위가 준구난방이라서 그래프가 어떤 의미를 담고있는지 알기 어려움Regplot(회귀)
: scatterplot에 회귀선이 추가 된 그래프Residplot(잔차)
: 회귀선을 y=0인 축으로 Regplot을 옮긴 그래프x
, y
값에 컬럼을 기입해줘야 실행 됨# 1) regplot 으로 회귀선 그리기
sns.regplot(data=df, x="mpg", y="horsepower")
# 2) 회귀선의 잔차를 시각화 하기
sns.residplot(data=df, x="mpg", y="horsepower")
관찰이나 실험으로 얻은 샘플자료(적은 수의 자료)를 분석하고 설명하기 위해서는 그 자료를 잘 표현할 수 있는 '방정식'을 예측해야 한다.
자료를 가장 잘 설명하는 방정식이란, 원래 자료와의 오차(error)를 가장 적게 만든 식 입니다.
출처 : 회귀 분석을 하는 이유(feat.회귀선, 회귀 계수)
Lmplot
: 범주값에 따라 색상을 다르게 할 수 있으며 subplot을 그릴 수 있다.# 1) 회귀 시각화 그래프에 origin으로 색상 부여
sns.lmplot(data=df, x="mpg", y="horsepower", hue="origin")
# 2) 그래프 나눠서 보기 - subplot 생성
sns.lmplot(data=df, x="mpg", y="horsepower", hue="origin", col="origin")
x=mpg
, y=horsepower
에 대한 변수를 origin
별로 색상을 부여하여 lmplot
을 그려봄usa
제품임japan
, europe
에서 생산된 것은 비교적 연비와 마력 관계가 완만해 보임jointplot
: 두 개의 수치형 변수 간의 관계를 연구 할 수 있다.kind
= "scatter" | "reg" | "resid" | "kde" | "hex" 등 타입명 입력(i) 전체 변수에 대한 상관관계
# 1) 전체 변수의 상관관계
sns.jointplot(data=df)
jointplot
을 그리면 변수간의 상관관계를 한눈에 알아보기 힘듦(ii) mpg
, horsepower
에 대한 상관관계
# 2) 연비와 마력의 상관관계
sns.jointplot(data=df, x="mpg", y="horsepower")
# 3) 연비와 마력의 상관관계 - kde(밀도함수)로 보기
sns.jointplot(data=df, x="mpg", y="horsepower", kind="kde")
#) 연비와 마력의 상관관계 - hex(헥스빈)으로 밀집도 보기
sns.jointplot(data=df, x="mpg", y="horsepower", kind="hex")
jointplot
을 그리면 변수간의 상관관계를 한눈에 볼 수 있음kind
를 설정하여 어디에 밀집되어있는지, 등 원하는 분석이 가능함pairplot
: 각 column 별 데이터에 대한 상관관계나 분류적 특성 확인 가능hue
를 추가하여 기존 pairplot에 hue에 지정한 것을 기준으로 나누어 그릴 수 있음(i) hue="origin"
을 기준으로 한 pairplot
# origin에 대한 pairplot
sns.pairplot(data=df, hue="origin")
(ii) 일부 데이터로 그린 pairplot
# sample(100) 설정하여 시각화 소요 시간 단축
sns.pairplot(data=df.sample(100), hue="origin") # 전체에서 무작위로 100개 데이터 선택
pairplot
을 그릴 땐, 여러 그래프를 한 번에 처리하기 때문에 대량의 데이터를 사용하면 시간이 오래 걸림sample()
로, 데이터를 무작위로 선정하기 lineplot
: 지정한 변수 간의 선형 관계를 알 수 있음hue
별 구분이 가능함(i) 전체 변수에 대한 선형 그래프
sns.lineplot(data=df)
(ii) model_year
와 mpg
에 대한 선형 그래프
sns.lineplot(data=df, x="model_year", y="mpg")
x
: 데이터 인덱스, y
: 수치형 변수에 대한 값)hue
를 추가하면 더 의미있는 분석이 될 것으로 생각 됨(iii) origin
을 기준으로 구분 된 그래프
sns.lineplot(data=df, x="model_year", y="mpg", hue="origin")
Relplot
scatterplot
과 lineplot
를 그릴 수 있다.ci
: 신뢰구간을 의미함 (defalt : 포함되어 있음)(i) scatterplot
서브플롯 그리기
# kind의 defalt : scatterplot
sns.relplot(data=df, x="model_year", y="mpg", hue="origin", col="origin")
(ii) lineplot
서브플롯 그리기
# 신뢰구간 포함
sns.relplot(data=df, x="model_year", y="mpg",
hue="origin", col="origin", kind='line')
# 신뢰구간 포함 X
sns.relplot(data=df, x="model_year", y="mpg",
hue="origin", col="origin", kind='line', ci=None)
Relplot
을 그리면 추정 회귀선과 신뢰구간을 함께 볼 수 있다.
- 신뢰 구간은 bootstrapping을 사용하여 계산되며, 대규모 데이터셋에 대해 시간이 많이 소요될 수 있으므로
ci=None
을 이용해 비활성화시킬 수 있다.ci="sd"
로 설정하면 신뢰구간을 표준 편차로 표시할 수 있다.
replot()
의 장점
return
값이 FacetGrid (여러개의 AxesSubplot를 포함)- scatterplot(), lineplot()의
return
값은 AxesSubplot (1장의 그림에 모든 것을 담음)
heatmap
: 열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어heatmap
을 통해 상관계수
를 시각화 해보자!r이 -1.0과 -0.7 사이이면, 강한 음적 선형관계, r이 -0.7과 -0.3 사이이면, 뚜렷한 음적 선형관계, r이 -0.3과 -0.1 사이이면, 약한 음적 선형관계, r이 -0.1과 +0.1 사이이면, 거의 무시될 수 있는 선형관계, r이 +0.1과 +0.3 사이이면, 약한 양적 선형관계, r이 +0.3과 +0.7 사이이면, 뚜렷한 양적 선형관계, r이 +0.7과 +1.0 사이이면, 강한 양적 선형관계
- 서로 다른 상관계수 값을 갖는 산포도 다이어그램의 예
(i) 상관계수 구하기
# 옵션을 따로 쓰지 않으면, 피어슨 상관계수로 구해짐
corr = df.corr()
# np.triu 함수를 이용해 matrix를 상삼각행렬로 만들기
mask = np.triu(np.ones_like(corr))
(ii) heatmap 그리기
# heatmap으로 상관계수 시각화
sns.heatmap(corr, cmap="coolwarm")
# 대각선을 기준으로 윗부분 제거 + 각 셀에 숫자 입력
sns.heatmap(corr, cmap="coolwarm", annot=True, mask=mask)
mask
: bool array or DataFrame, optional If passed, data will not be shown in cells where mask
is True.annot=True
: annotate each cell with numeric valuedisplavement
와 cylinders
는 선형 관계가 강하다는 뜻임
- 🔥 확인해 보기
# 위 히트맵에서 알아낸 'cylinders'와 'displacement'의 선형관계를 그래프로 그려보기 sns.lineplot(data=df, x="cylinders", y="displacement")
- 상관계수를 계산하여 heatmap을 그려보면 변수 간의 선형성을 파악할 수 있다.
- 위 그래프에서 cylinders가 5 부분에서 신뢰구간이 커짐
- 이유? 이상치때문에 신뢰구간이 급격히 커진 것으로 생각 됨
2개 이상의 변수에 대한 그래프를 그려보았다. 그릴 수 있는 그래프는 거의 다 그려본 것 같다. 이렇게 배운 것을 데이터셋이 주어졌을 때 무엇을 전달하기 위해 어떤 그래프를 그릴 것인지 선택하기 위해선 여러 실습이 중요하겠다고 생각했다.
Kaggle에 올라온 데이터를 이용해서 배운 것들을 적용시켜봐야겠다.
참고 1. 산점도
참고 2. 회귀 분석의 필요성
참고 3. 파이썬 seaborn : 시각화 유형 : 상관관계 - 조인트 플롯
참고 4. 상관 분석
참고 5. Seaborn - 관계 그래프 : pairplot
참고 6. Seaborn으로 시각화하기 - [relplot(), scatter(), lineplot()]
참고 7. 히트맵(heatmap)
참고 8. [Python] 히트맵 그리기 (Heatmap by python matplotlib, seaborn, pandas