회귀분석의 사전 진단 :: Python 기초 통계 - mindscale
Skip to content

회귀분석의 사전 진단

판다스를 불러들인다.

import pandas as pd

실습을 위해 cars.csv를 다운로드 받아 연다.

df = pd.read_csv('cars.csv')

cars 데이터는 speeddist 두 개의 변수로 이뤄져 있다. 여기서는 speed를 독립변수, dist를 종속변수로 사용한다.

df.head()
speed dist
0 4 2
1 4 10
2 7 4
3 7 22
4 8 16

사전작업

산점도에 추세선을 넣어 데이터에 선형적인 패턴이 있는지 확인한다. 아래와 같이 그려보면 대체로 speed가 증가할 수록 dist도 증가하는 관계가 있는 것을 볼 수 있다.

import seaborn as sns
sns.regplot('speed', 'dist', lowess=True, data = df)
<matplotlib.axes._subplots.AxesSubplot at 0x250129a7cc8>

극단값이 있을 경우 회귀분석의 결과가 왜곡될 수 있다. 상자 그림을 그려서 극단값이 있는지 확인해본다. 아래 그림을 보면 dist에서 값 하나가 크게 위에 있는 것을 볼 수 있다.

import matplotlib.pyplot as plt
# 1행 2열 형태로 2개의 그래프를 그린다
fig, (ax1, ax2) = plt.subplots(1, 2)  

# speed의 상자 그림을 첫번째(ax1)로 그린다. 방향은 수직(orient='v')
sns.boxplot('speed', data=df, ax=ax1, orient='v')
ax1.set_title('Speed')

# dist의 상자 그림을 두번째(ax2)로 그린다.
sns.boxplot('dist', data=df, ax=ax2, orient='v')
ax2.set_title('Distance')
Text(0.5, 1.0, 'Distance')

선형회귀분석은 독립변수와 종속변수가 정규분포를 따를 때 잘 작동한다. 밀도 플롯(density plot)을 그려서 정규분포의 형태인지 확인해본다.

# 1행 2열 형태로 2개의 그래프를 그린다
fig, (ax1, ax2) = plt.subplots(1, 2)  

# speed의 밀도 플롯
sns.kdeplot(df['speed'], ax=ax1)
ax1.set_title('Speed')

# dist의 밀도 플롯
sns.kdeplot(df['dist'], ax=ax2)
ax2.set_title('Distance')
Text(0.5, 1.0, 'Distance')

대체로 중심부에 데이터가 몰려있고 좌우로 갈 수록 줄어드는 정규분포와 비슷한 형태를 보인다. 앞에서 봤듯이 dist에 위로 치우친 값이 있기 하나 있기 때문에 밀도 플롯도 오른쪽으로 약간 늘어진 모습을 보인다.

데이터가 치우친 정도를 나타내는 왜도(skewness)를 구해본다. e1071 라이브러리가 없을 경우에는 install.packages('e1071')을 실행하여 설치한다.

import scipy.stats

scipy.stats.skew(df['speed'])
-0.11395477012828319
scipy.stats.skew(df['dist'])
0.7824835173114966

speed는 왜도가 -0.11이다 마이너스 쪽으로 약간 치우쳤다는 것을 뜻한다. dist의 왜도는 0.76으로 플러스 쪽으로 어느 정도 치우쳤다. 위에서 그래프로 본 것과 비슷한 결과이다.

문제가 심각해보이지는 않으므로 일단 분석을 실시해보자.