회귀분석의 사전 진단
판다스를 불러들인다.
import pandas as pd
실습을 위해 cars.csv를 다운로드 받아 연다.
df = pd.read_csv('cars.csv')
cars
데이터는 speed
와 dist
두 개의 변수로 이뤄져 있다. 여기서는 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으로 플러스 쪽으로 어느 정도 치우쳤다. 위에서 그래프로 본 것과 비슷한 결과이다.
문제가 심각해보이지는 않으므로 일단 분석을 실시해보자.