Regression
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Statistics
Table of Contents
Regression(회귀분석) #
회귀분석은 주어진 속성(입력 변수)와 목적 속성(변수)가 긴밀하게 관계돼 있을 때 사용할 수 있는 방법이다. 좀 더 자세히 말하자면, 대표적인 지도학습(supervised learning)으로 관찰된 현상과 그 현상에 영향을 미치는 변수들로 통계 모델을 만들고 모델에 기반하여 새로운 입력 속성에 따른 목적 속성을 예측하는 분석법이다.
이 기법은 매우 고전적인 방법으로 그 발견 배경이 19세기 찰스 다윈(Charles Darwin)의 자연선택설과 무관하지 않다. 프랜시스 골튼(Francis Galton)은 유전에 관해 관심이 많았고 지능이 높은 아버지와 아들에 대한 정보를 수집하여 연구하고자 하였다. 그러나 지능을 측정할 방법이 없었기에 신장과 같은 유전에 대해 연구하기로 했다. 그는 부모와 자식 928명 신장을 조사했고 후에 칼 피어슨(Karl Pearson)은 아버지와 아들 1987명 신장을 조사해 선형 함수 관계임을 보였다. 골튼은 다윈의 가설과 다르게 자손의 신장은 계속 작아지거나 커지지 않고 평균 신장으로 회귀가 나타남을 발견했다. 수치를 예측하는 기법이 이때부터 그 이름의 의미와 상관없이 사용하게 됐다.
회귀 분석의 구분 #
회귀 분석은 독립변수의 개수에 따라 단순 회귀 분석, 다중 회귀 분석으로 나눌 수 있으며 독립변수와 종속변수의 관계에 따라 선형 회귀, 비선형 회귀로 나눌 수 있다. 또한, 종속변수가 연속형인지 명목형인지에 따라 일반 회귀 분석과 로지스틱 회귀 분석으로 구분된다.
회귀 분석의 전제 조건 #
통계학 분야가 아닌 타 도메인들에서 쓰는 통계는 보통 전제 조건을 무시하고 진행하는 경우가 많으며 이는 도메인의 실데이터가 전제조건을 모두 만족하기엔 무리가 있어서이기도 하고 분석자가 이론을 잘 모르고 통계 프로그램 및 코드 분석을 진행하기 때문이기도 하다. 그러나 통계학에서의 회귀 분석은 전제 조건이 생각보다 까다로운 편이며 사실 이 전제 조건들이 참이어야만 회귀 분석을 통해 얻은 결괏값과 의미가 비로소 참이라고 할 수 있다.
- 종속변수의 값은 정규성(정규 분포)을 지녀야 한다.
- 독립변수 간에는 다중 공선성이 존재하지 않아야 한다.
- 선형 회귀 분석의 경우 독립변수와 종속변수 간의 선형성이 보장되어야 한다.
- 오차항은 독립변수의 값과 관계없이 동일한 분산을 가지며(등분산성) 기댓값은 0이다.
이런 전제조건이 만족한지 아닌지는 회귀 분석으로 추정된 회귀 식을 만들고 난 뒤 여러 가지 회귀 분석 적합성 검정을 통해 확인할 수 있으며 몇 가지를 소개해 보겠다. 더 많은 검증 방법이 많으니 자세하게 찾아보기 바란다.
- 잔차의 정규성 : Shaprio-Wilk 검정, Q-Q plot
- 잔차의 등분산성 : Breusch-Pagan test, 잔차와 예측치의 산점도
- 선형 성 : 종속과 독립변수의 산점도
Python으로 회귀 분석 연습하기 #
아버지와 아들의 신장 데이터 시각화하기 #
이 고전적인 문제부터 파악해 본다. 관련 패키지를 임포트한 후 pearson.dat을 파일을 로드한다. 이를 위해 이전부터 사용했던 파이썬의 데이터 분석 stack인 numpy, 파이썬/라이브러리/Matplotlib을 사용하도록 한다. 데이터를 로드해 보자.
import numpy as np
data = np.loadtxt(‘pearson.dat’)
print(data.shape)
# (1078, 2)
1078개 데이터와 2개의 속성으로 이루어진 매트릭스를 얻었다. 데이터를 살펴보면 인치로 되어있는 것을 확인 할 수 있다. 먼저, 인치를 우리에게 익숙한 미터로 변경을 하도록 하자. 이 변경을 위해서는 각 값에 2.54를 곱하면 된다.
data = data * 2.54
father, son = data[:,0], data[:,1]
print('아버지의 평균키 {0}, 아들의 평균키 {1}'.format(father.mean(), son.mean()))
print('아버지의 키의 분산 {0}, 아들의 키의 분산 {1}'.format(father.std(), son.std()))
# 아버지의 평균키 171.925226036, 아들의 평균키 174.457536928
# 아버지의 키의 분산 6.96873126848, 아들의 키의 분산 7.14602525545
mean(), std()을 통해 아버지와 아들의 평균 키와 분산을 구할 수 있었고 미터로 변경된 데이터를 도식화하여 데이터를 좀 더 확인 해 보도록 하자.
import matplotlib.pyplot as plt
father, son = data[:,0], data[:,1]
plt.scatter(father, son)
plt.title('The heihgt of father and son')
plt.xlabel('The heihgt of father')
plt.ylabel('The heihgt of son')
plt.autoscale(tight=True)
plt.grid()
plt.show()
신장 데이터를 도식화했다.
Regression(회귀) #
그럼 시장 데이터에 대해 회귀 직선을 구해보자. scipy를 사용하면 매우 쉽게 구할 수 있다.
import scipy as sp
import matplotlib.pyplot as plt
polyorder, residuals, _, _, _ = sp.polyfit(x, y, 1, full=True)
model1 = sp.poly1d(polyorder)
l = np.linspace(x.min(), x.max(),1000)
plt.plot(l, model1(l))
plt.plot(xx, xx, 'r--')
plt.scatter(x, y)
plt.title('The heihgt of father and son')
plt.xlabel('The heihgt of father')
plt.ylabel('The heihgt of son')
plt.autoscale(tight=True)
plt.grid()
plt.show()
다윈의 가설이 맞다면 데이터 회귀 직선의 기울기가 45도보다 높아야 하기 때문에 지금보다 누워있지 않고 서 있어야 한다. 따라서, 아버지 신장에 따라 점점 커지는 것이 아니라 평균 신장으로 회귀한다는 골튼의 가설이 유효하다.