본문 바로가기
자격증/[빅분기] 빅데이터분석기사

[작업형3] 회귀분석-단순 선형 회귀 분석 (3)

by 바다의 공간 2024. 11. 13.

💛 단순 선형 회귀 분석

 

주어진 키와 몸무게 데이터로 회귀모델을 구축하고 각 소문제의 값을 구하시오.

  • 키: 종속변수
  • 몸무게: 독립변수

💛 시험에서는 물론 csv파일로 하나의 변수에 담기겠지만 일단 연습용으로 데이터를 구축했어요.

 

import pandas as pd

df = pd.DataFrame({
    '키': [150, 160, 170, 175, 165, 155, 172, 168, 174, 158,
          162, 173, 156, 159, 167, 163, 171, 169, 176, 161],
    '몸무게': [74, 50, 70, 64, 56, 48, 68, 60, 65, 52,
            54, 67, 49, 51, 58, 55, 69, 61, 66, 53]
})

 

💛 최소제곱법인 ols를 이용해서 모델학습을 하고 summary를 뽑아봅니다.

ols는 stats안에 있습니다. ols는 R처럼 사용해야하는데 일반 Python과 살짝 다를 수 있으니 제대로 확인!

 

#모델학습 summary출력

from statsmodels.formula.api import ols

model = ols('키~몸무게', data=df).fit()
print(model.summary())

결과값

 

사실 여기까지 뽑으면 어떤 값들이 나오는지 확인할 수있습니다.

 

그런데 하나씩 다 봅아보고싶다! 하면 아래처럼 할 수 있습니다.

# 결정계수 (위 값에서 확인 가능! R-squared)
# 0.28

#혹시 그냥 뽑으려면 아래처럼 하면 됨.
model.rsquared


# 기울기(회귀계수) (위 값에서 확인 가능! R-squared)
# 0.4938

#혹시 그냥 뽑으려면 아래처럼 하면 됨.
model.params['몸무게']

# 절편(회귀계수) (위 값에서 확인 가능! R-squared)
# 135.8209

#혹시 그냥 뽑으려면 아래처럼 하면 됨.
model.params['Intercept']

# 몸무게의 회귀계수가 통계적으로 유의한지 pvalue  (위 값에서 확인 가능! R-squared)
# 0.017

#혹시 그냥 뽑으려면 아래처럼 하면 됨.
model.pvalues['몸무게']

 

각각 위에있는 값과 같이 출력이 되는것을 확인할 수 있습니다.


 

 

💛  몸무게 예측을 해볼 수 있겠죠?

newdata= pd.DataFrame({'몸무게':[50]})

model.predict(newdata)

 

여기서 주의해야할 점은 '몸무게' 의 예상값을 리스트형태인 [50]으로 써서 새로운 변수로 담아야한다는것입니다.

이 부분은 많은 연습을 해야할것같습니다.

 

💛결과

몸무게가 50kg일때는 키가 160이라고 예측할 수 있습니다.


다중 선형 회귀 분석

주어진 매출액, 광고비, 플랫폼 데이터로 회귀모델을 구축하고 각 소문제의 값을 구하시오.

  • 매출액: 종속변수
  • 광고비, 플랫폼(유통 플랫폼 수), 투자: 독립변수
import pandas as pd
df = pd.DataFrame({
    '매출액': [300, 320, 250, 360, 315, 328, 310, 335, 326, 280,
            290, 300, 315, 328, 310, 335, 300, 400, 500, 600],
    '광고비': [70, 75, 30, 80, 72, 77, 70, 82, 70, 80,
            68, 90, 72, 77, 70, 82, 40, 20, 75, 80],
    '플랫폼': [15, 16, 14, 20, 19, 17, 16, 19, 15, 20,
            14, 5, 16, 17, 16, 14, 30, 40, 10, 50],
    '투자':[100, 0, 200, 0, 10, 0, 5, 0, 20, 0,
          0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    })
df.head(3)

이렇게 만들면 head(3)을 뽑으면 

가 나옵니다.

# 모델 학습 summary 출력 (종속변수: 매출액, 독립변수: 광고비, 플랫폼)
from statsmodels.formula.api import ols
model = ols('매출액 ~ 광고비 + 플랫폼', data=df).fit()
print(model.summary())

# 결정계수(R-squared)
# 0.512
model.rsquared

# 회귀계수(광고비)
# 1.8194
model.params['광고비']

# 회귀계수(플랫폼)
# 5.9288
model.params['플랫폼']

# 회귀계수(절편)
# 101.0239
model.params['Intercept']

# 광고비의 회귀계수가 통계적으로 유의한지 pvalue
# 0.038
model.pvalues['광고비']
####0.03764350647695994

# 플랫폼의 회귀계수가 통계적으로 유의한지 pvalue
# 0.001
model.pvalues['플랫폼']
####0.0006746810554564365

로 전체적인것들은 summary에서 확인할 수 있습니다.

 

💛  광고비 50, 플랫폼 20일때 매출액 예측

 

# 광고비 50, 플랫폼 20일 때 매출액 예측
newdata = pd.DataFrame({
    '광고비':[50],
    '플랫폼':[20]
})
model.predict(newdata)

 

💛   잔차제곱합

# 잔차 제곱합
(model.resid ** 2).sum()

계수가 -가나올수 있으니 **2를 통해서 제곱을 해줍니다. 그러면 양으로 변환이 됩니다.

모두 합치면 58686.17827156107이 나옵니다.

 

💛 MSE

# MSE
(model.resid ** 2).mean()

모두 합치니 2934.30891356780533이 나옵니다.

 

💛 95% 신뢰구간일때는 alpha=0.05를 쓰게되고 90%일때는 alpha = 0.1을 쓰게 됩니다.

# 광고비, 플랫폼 회귀계수의 95% 신뢰구간
# 광고비: 0.117       3.522
# 플랫폼: 2.912       8.945
model.conf_int(alpha=0.05)
# 광고비 50, 플랫폼 20일 때 매출액에 대한 95% 신뢰구간과 예측구간
newdata = pd.DataFrame({
    '광고비':[50],
    '플랫폼':[20]
})
pred = model.get_prediction(newdata)
pred.summary_frame(alpha=0.05)
# 신뢰구간 268.612221	352.52844
# 예측구간 179.700104	441.440556

# 시험환경에서는 컬럼을 모두 보기 위해서 pd.set_option('display.max_columns', None) 설정이 필요함