👀 데이터셋 정보
‘mpg’ 데이터셋에 대한 정보와 변수 한 개를 대상으로 한 시각화 과정은 이전 게시물 에 자세히 기록하였다.

1. 학습 목표

  • seaborn의 mpg 데이터셋을 이용하여 수치형 변수에 대해 시각화해 본다.
  • 2개 이상의 변수에 대한 그래프 Scatterplot, regplot, residplot, lmplot, jointplot, pairplot, lineplot, heatmap 를 그려 변수들 간의 상관 관계를 알아본다.


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

두 개 변수 간의 관계를 나타내는 그래프 방법이다.

# 전체 변수에 대한 관계
sns.scatterplot(data=df)

# 연비와 마력의 관계
sns.scatterplot(data=df, x="mpg", y="horsepower")
전체 변수에 대한 결과(왼쪽), 연비와 마력의 관계에 대한 결과(오른쪽)


  • 전체 변수에 대해 Scatterplot을 그려보니, 범위가 준구난방이라서 그래프가 어떤 의미를 담고있는지 알기 어렵다.
  • 비교해볼 변수를 x, y로 지정하여 그리면 어떤 관계를 가지는지 알 수 있다.
  • 연비와 마력은 반비례 관계를 가진다
  • 특히, 연비가 10~20 사이에서 급격하게 마력이 떨어진다.


(2) 회귀(Regplot), 잔차(Residplot)

Regplot(회귀) : scatterplot에 회귀선이 추가 된 그래프
Residplot(잔차) : 회귀선을 y=0인 축으로 Regplot을 옮긴 그래프
cf. 회귀와 잔차 그래프를 그릴 때, x, y값에 컬럼을 기입해줘야 실행 됨

# 1) regplot 으로 회귀선 그리기
sns.regplot(data=df, x="mpg", y="horsepower")

# 2) 회귀선의 잔차를 시각화 하기
sns.residplot(data=df, x="mpg", y="horsepower")
regplot(왼쪽), residplot(오른쪽)


🔍 회귀분석의 필요성

관찰이나 실험으로 얻은 샘플자료(적은 수의 자료)를 분석하고 설명하기 위해서는 그 자료를 잘 표현할 수 있는 ‘방정식’을 예측해야 한다.
cf. 자료를 가장 잘 설명하는 방정식이란, 원래 자료와의 오차(error)를 가장 적게 만든 식이다.


(3) Lmplot

범주값에 따라 색상을 다르게 할 수 있으며 subplot을 그릴 수 있다. lmplot은 regplot에서 지원하지 않는 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")


  • 연비가 10~20 사이에서 급격하게 마력이 떨어지는데 usa 제품이다.
  • japan, europe 에서 생산된 것은 비교적 연비와 마력 관계가 완만해 보인다.


(4) Jointplot

두 개의 수치형 변수 간의 관계를 연구 할 수 있다. 차트의 중앙에서 상관 관계 그래프를 표시해주는데 스캐터 플롯(산점도), 헥스 빈 플롯, 2D 히스토그램 또는 2D 밀도(density) 플롯을 사용하는 것이 일반적이다.

중앙 그래프 선택
kind = “scatter” | “reg” | “resid” | “kde” | “hex” 등 타입명 입력

# 1) 전체 변수의 상관관계
sns.jointplot(data=df)
전체변수에 대한 jointplot 결과
# 2) 연비와 마력의 상관관계
sns.jointplot(data=df, x="mpg", y="horsepower")

# 3) 연비와 마력의 상관관계 - kde(밀도함수)로 보기
sns.jointplot(data=df, x="mpg", y="horsepower", kind="kde")

# 4) 연비와 마력의 상관관계 - hex(헥스빈)으로 밀집도 보기
sns.jointplot(data=df, x="mpg", y="horsepower", kind="hex")
2번 코드에 대한 결과(왼쪽), 3번 결과(중앙), 4번 결과(오른쪽)


  • 전체 데이터에 대한 jointplot 을 그리면 변수간의 상관관계를 한눈에 알아보기 힘들다.
  • 변수가 많고 범위가 넓은 경우 따로 그래프를 그리는 것이 이해하기 쉽다.
  • kind 를 설정하여 어디에 밀집되어있는지 등의 원하는 분석이 가능하다.
  • jointplot의 default는 scatterplot과 히스토그램이다.


(5) Pairplot

각 column 별 데이터에 대한 상관관계나 분류적 특성 확인 가능한 그래프이다.
대각선 방향으로는 하나의 열의 히스토그램을 나타내고 대각선 기준 위 아래는 축이 전환된 것일 뿐 보여주는 결과는 같다.
cf. hue 를 추가하여 기존 pairplot에 hue에 지정한 것을 기준으로 나누어 그릴 수 있음

# 1) 전체 데이터에 대한 pairplot
sns.pairplot(data=df)

# 2) origin에 대한 pairplot
sns.pairplot(data=df, hue="origin")
전체 데이터에 대한 결과(왼쪽), hue="origin"을 추가한 결과(오른쪽)


  • pairplot 을 그리면 여러 그래프를 한 번에 처리하기 때문에 대량의 데이터를 사용하면 시간이 오래 걸린다.
  • 데이터가 많을 땐 sample()로 데이터를 무작위로 선정하여 빠르게 변수들간의 관계를 파악하는 것이 좋다.
  • 전체적인 상관관계를 빠르게 확인하고싶을 때 사용하면 좋은 기능이다.


(6) Lineplot

지정한 변수 간의 선형 관계를 알 수 있다.
cf. hue 별 구분이 가능함

# 1) 전체 변수에 대한 선형 그래프
sns.lineplot(data=df)

# 2) model_year와 mpg에 대한 선형 그래프
sns.lineplot(data=df, x="model_year", y="mpg")
전체 변수에 대한 라인플롯(왼쪽), model_year와 mpg에 대한 라인플롯(오른쪽)


# 3) origin 을 기준으로 구분 된 그래프
sns.lineplot(data=df, x="model_year", y="mpg", hue="origin")
origin 을 기준으로 구분된 라인플롯


  • 전체 변수에 대해 선형 그래프를 그리게 되면, 알아보기 쉽지않다.
  • 변수를 지정하여 그림을 그리면 한 눈에 알아보기 쉽다.
  • 최근에 출시된 모델이 연비가 크다.
  • 80년도에 연비가 약 32 이상인 데이터 때문에 급격히 상승한 구간이 존재한다.
  • hue 를 추가하면 더 의미있는 분석이 될 것으로 생각된다.
  • 나라별로 출시년도가 82년도에 가까워지면서 연비가 상승했다.
  • 72 ~ 74 년도 사이에 연비 개선이 이루어지지 않음이 발견되었다.


(7) Relplot

scatterplot과 lineplot를 그릴 수 있으며 서브플롯을 지원한다.
cf. errorbar: 신뢰구간을 의미함 (defalt: 포함되어 있음), kind로 그래프의 모양을 변경할 수 있음

# kind의 defalt : scatterplot
sns.relplot(data=df, x="model_year", y="mpg", hue="origin", col="origin")
# 신뢰구간 포함 X, 라인플롯을 origin을 기준으로 서브플롯 그리기
sns.relplot(data=df, x="model_year", y="mpg",
			hue="origin", col="origin", kind='line', errorbar=None)


🔍 replot의 필요성

  • Relplot 을 그리면 추정 회귀선과 신뢰구간을 함께 볼 수 있다.
  • 신뢰 구간은 bootstrapping을 사용하여 계산되며, 대규모 데이터셋에 대해 시간이 많이 소요될 수 있으므로 errorbar=None( 버전에 따라 ci=None 사용)을 이용해 비활성화시킬 수 있다.
  • ci=”sd” 로 설정하면 신뢰구간을 표준 편차로 표시할 수 있다.
  • return 값이 FacetGrid(여러개의 AxesSubplot를 포함)이다.
  • scatterplot(), lineplot()의 return 값은 AxesSubplot(1장의 그림에 모든 것을 담음)이다.


(8) Heatmap

열을 뜻하는 히트(heat)와 지도를 뜻하는 맵(map)을 결합시킨 단어이다.
색상으로 표현할 수 있는 다양한 정보를 일정한 이미지 위에 열분포 형태로 출력된다.
cf. heatmap는 수치형 변수간의 상관계수를 시각화하기 용이함

🔍 상관계수

  • 확률론과 통계학에서 두 변수 간에 어떤 선형적 관계를 갖고 있는 지를 분석하는 방법이다.
  • 두 변수는 서로 독립적인 관계이거나 상관된 관계일 수 있으며 이때 두 변수간의 관계의 강도를 상관관계(Correlation, Correlation coefficient)라 한다.
  • 옵션을 따로 쓰지 않으면, 피어슨 상관 계수로 구한다.


🔍 피어슨 상관계수

  • r 값은 X와 Y가 완전히 동일하면 +1, 전혀 다르면 0, 반대방향으로 완전히 동일하면 -1 을 가진다.
  • 결정계수(coefficient of determination)는 r^2로 계산하며 이것은 X로부터 Y를 예측할 수 있는 정도를 의미한다.
이미지 출처: https://ko.wikipedia.org/wiki/상관_분석


  • 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 그리기

# 1) heatmap으로 상관계수 시각화  
sns.heatmap(corr, cmap="coolwarm")

# 2) 대각선을 기준으로 윗부분 제거 + 각 셀에 숫자 입력 
sns.heatmap(corr, cmap="coolwarm", annot=True, mask=mask)
1번 결과(왼쪽), 2번 결과(오른쪽)


  • 히트맵 위에 표기된 상관계수 값을 보면, 빨간색으로 되어 있는(+1 값에 가까운) 부분은 양적 선형 관계에 가깝다는 것을 의미 한다.
  • 예를 들어, displavement와 cylinders는 선형 관계가 강하다는 뜻이다.


(iii) 상관관계를 lineplot으로 확인해 보기

상관계수가 0.95인(가장 높은 상관성을 보임) ‘cylinders’와 ‘displacement’간의 라인플롯을 그려보았다.

# 위 히트맵에서 알아낸 'cylinders'와 'displacement'의 선형관계를 그래프로 그려보기 
sns.lineplot(data=df, x="cylinders", y="displacement")


  • 상관계수를 계산하여 heatmap을 그려보면 변수 간의 선형성을 파악할 수 있다.
  • 위 그래프에서 cylinders가 5 부분에서 신뢰구간이 커지는 것을 볼 수 있다.
    • 이상치때문에 신뢰구간이 급격히 커진 것으로 생각된다.
  • 선형 그래프를 그려본 결과 5 구간을 제외하곤 신뢰구간이 라인과 붙어 있어서 선형성이 강한 것으로 보인다, 즉 상관성이 큰 것으로 보인다.


4. 회고

2개 이상의 변수에 대한 그래프를 그려보았다. 그릴 수 있는 그래프는 거의 다 그려본 것 같다. 이렇게 배운 것을 데이터셋이 주어졌을 때 무엇을 전달하기 위해 어떤 그래프를 그릴 것인지 선택하기 위해선 여러 실습이 중요하겠다고 생각했다.

Kaggle에 올라온 데이터를 이용해서 배운 것들을 적용시켜봐야겠다.


5. Reference

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

댓글남기기