빅데이터분석기사 제3작업형(회귀 분석)
회귀 분석에는 단순 선형 회귀 분석, 다중 선형 회귀 분석, 로지스틱 회귀 분석이 있습니다. 회귀 분석 문제에서는 어떤 반응 변수(종속 변수, 결과 변수)를 설명하는 설명 변수의 계수, 그리고 절편을 구합니다. 다시 말해, 반응 변수를 잘 설명할 수 있는 선형식을 구하는 것이 선형 회귀 분석의 목적입니다. 선형이 아닌 비선형 회귀도 있지만 빅데이터분석기사에서는 아직 선형 회귀 분석까지만 다루는 것 같습니다.
회귀 분석에서 명심해야 할 것은, 모든 관측 값을 완벽하게 예측할 수 있는 선형식을 찾는 것은 거의 불가능하다는 것입니다. 완벽하게 데이터 포인트들에 핏한 선형식을 찾는 것은 거의 불가능하지만, 그 분포들을 어느 정도 잘 표현할 수 있는, 다시 말해 설명력이 있는 선형식을 찾는 것이 선형 회귀 분석의 목적이라고 보면 됩니다.
1차 식으로는 당연히 설명력에 한계가 있으니, 좀 더 곡선같은 비선형적인 형태를 데이터 분포를 설명하는게 비선형 회귀 분석인 것이라고 생각하면 됩니다.
1. 단순 선형 회귀 분석
반응 변수를 설명하는 설명 변수가 1가지이면 단순 선형 회귀 문제에 해당합니다.
앞 부분의 분산 분석에서 주구장창 사용했던 ols는 최소제곱법을 의미합니다. 이는 실제 값과 선형 회귀 모델이 예측해낸 예측 값의 차이인 잔차의 제곱합을 최소화하는 방향으로 선형회귀식을 만들어가는 방식입니다.
ols는 기본적으로 R스타일로 코드를 작성하며, 범주형 변수의 경우 알아서 잘 처리하지만, 이전에 언급했듯 만약 그 범주형 변수가 숫자로 만들어져 있다면, 이를테면 1, 2, 3, 4, 5 ... 이런 식이라면, 연속형 변수로 오인될 수 있으므로 C()로 감싸주는 것이 안전합니다.
예를 들어, 시험 점수와 공부 시간에 대해 생각해볼 수 있습니다. 여기서는 시험 점수가 반응 변수가 되고, 공부 시간이 설명 변수가 될 것입니다.
즉, 선형회귀식은 다음과 같습니다.
시험 점수 = a*공부 시간 + b + error
a는 공부 시간이 갖는 계수, b는 절편, error는 잔차항이라고 생각하면 됩니다.
회귀 분석을 위해 위와 같이 대략적인 공부 시간, 성적에 대한 데이터프레임을 짜주었습니다. 총 20명에 대한 데이터프레임입니다.
from statsmodels.formula.api import ols
import statsmodels.api as sm
model = ols('성적 ~ 공부시간', data=data).fit()
print(model.summary())
이런 식으로 선형 회귀 모델을 적합하고, model.summary()를 확인하여 계수, 절편, p-value, f-통계량 등을 확인할 수 있습니다.
위의 summary를 해석해봅시다.
우선 작성한 선형회귀 모델의 종류, 잔차의 자유도, F-통계량, 결정계수, 절편과 공부시간 계수, 표준 오차, p-value 등이 나와 있습니다.
intercept, 즉 절편은 44.1779입니다. 공부시간의 계수는 5.0125입니다.
즉, 성적에 대한 단순 선형 회귀식은 아래와 같습니다.
성적 = 5.0125*공부시간 + 44.1779
절편과 공부시간에 대한 p-value는 0으로, 유의 수준 5퍼센트 하에서 귀무 가설을 기각합니다. 즉 통계적으로 유의합니다.
결정계수인 R-squared는 선형 회귀식이 데이터들을 얼마나 잘 설명하는지를 나타냅니다. 0.986이 나왔습니다. Adj가 앞에 붙는 것은 조금 보정된 값인데, 불필요하게 사용된 설명 변수에 대해 일종의 페널티를 주어 계산합니다. 그래서 일반적으로는 그냥 결정계수에 비해 낮게 나오게 됩니다.
잔차의 자유도는 18이 나왔습니다. 이는 전체 데이터 개수인 20에서 설명 변수와 절편을 각각 제외하여 나온 결과입니다.(20-1-1=18)
위의 summary로 전체적인 결과를 볼 수도 있고, 보고 싶은 값만 보는 방법도 있습니다.
model.rsquared, model.pvalues['컬럼명'], model.params['컬럼명'], model.params['Intercept'] 뭐 이런 식으로 말입니다.
적합된 회귀 모형이 다른 새로운 데이터에 대해서 예측을 잘 수행하는지 확인해봅시다.
new data로 공부 시간 9시간인 테스트 케이스를 만들어주고, 적합된 모델로 예측을 수행합니다. 그 결과, 성적은 약 89.29점입니다. 직접 선형 회귀 식에 9를 대입하여 계산해도 거의 같은 결과가 나오는 것을 확인할 수 있습니다.
잔차 제곱합은 이와 같이, 실제 관측치에서 예측 값을 뺀 뒤 제곱하여 sum해줌으로써 직접 구해볼 수 있습니다. 약 35.73정도가 나옵니다.
MSE, RMSE 등등 다양한 회귀 모델 평가 지표를 구해볼 수 있는데, RMSE를 구해보면 다음과 같습니다.
RMSE는 약 1.34입니다.
사이킷런의 평가지표 라이브러리에서 가져온 MSE함수를 사용해 직접 RMSE를 구해본 결과 역시 위와 동일함을 확인할 수 있습니다.
신뢰구간의 경우, conf_int를 사용해 구하면 됩니다. alpha값을 조정하며 주어진 신뢰구간에 맞는 값을 출력할 수 있습니다.
get_prediction함수의 경우, 예측 값의 신뢰구간과 예측구간을 함께 구해줍니다. 아까 만들어준 공부시간 9시간에 대해 95%에서의 신뢰구간, 예측구간을 구해주면 위와 같습니다.
2. 다중 선형 회귀 분석
다중 선형 회귀는 단순 선형 회귀에서 설명 변수의 개수가 2개 이상으로 늘어난 경우입니다.
아까의 성적 케이스에서 설명 변수로 수면 시간을 추가해주겠습니다. 즉, 선형 회귀식은 다음과 같습니다.
성적 = a*공부시간 + b*수면시간 + c + error
회귀 분석 결과, 절편은 44.9709, 공부시간의 계수는 5.2394, 수면시간은 0.7091이 나왔습니다. 수면시간의 증가보다는 공부시간의 증가가 성적에 양의 방향으로 더 큰 영향을 주는 듯 합니다.
설명변수 간의 상관관계를 구해보겠습니다.
둘이 강력한 음의 상관관계를 보여주고 있습니다. 아무래도 공부시간이 늘면 수면시간이 줄어드니 그러는 것 같습니다.
다른 상관관계들은 이렇게 나오네요.
t검정의 p-value를 구할때는 pearsonr함수를 사용해줍니다. 사이파이 패키지에 있는 함수입니다.
적합된 회귀식을 사용하여 공부시간이 9시간이고 수면시간이 7시간일 때의 성적을 구해보면 약 97점입니다.
95퍼센트의 신뢰구간 및 예측구간은 다음과 같습니다.
3. 로지스틱 회귀 분석
로지스틱 회귀 분석은 반응 변수가 이진 범주인 경우 사용하는 회귀 분석입니다. statsmodels 라이브러리의 logit()을 사용하면 됩니다.
이번에는 공부 시간과 수면 시간에 따른 시험 합격/불합격을 예시로 들어보겠습니다.
해석하는 방법은 기존의 회귀 분석들과 동일합니다.
여기서 공부시간이 한 단위 증가 시 오즈비를 구해볼 수 있습니다. 이때는 numpy의 exp함수를 활용해야 합니다.
model.params로 공부시간의 계수를 가져와 exponential을 취해주면 오즈비를 구할 수 있습니다.