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

[작업형3] 다선형회귀, 범주형이 섞여있다면?

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

😊 다중선형회귀를 예측해보고 싶습니다.

 

일단 간단한 데이터를 만들었습니다. 아래의 데이터로 최종예측까지 해보려고합니다.

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)

 

😊 모델학습을 하고 summary를 뽑아보면 rmse, r-squared, 등을 한 번에 볼 수 있습니다.

# 모델 학습 summary 출력 (종속변수: 매출액, 독립변수: 광고비, 플랫폼)

from statsmodel.formula.api import ols

model = ols('매출액~ 광고비+플랫폼', data=df).fit()

print(model.summary())

 

😊 예측하기

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

pred = model.predict(data)
pred

 

😊 외에도 잔차 예측하기도 할 수 있습니다.

잔차는 제곱을 해야한다는걸 까먹지 말아야해요!

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

잔차는 resid 를 쓴다는것도 체크해두기!!

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

😊 mse는 mean을 구하는것인것도 체크해두기!!

 


😊 회귀계수에 신뢰구간을 설정해서 확인할 수 있습니다.

conf_int(alpha=)를 사용하면 됩니다.

# 광고비, 플랫폼 회귀계수의 95% 신뢰구간

model.conf_int(alpha=0.5)

 

 

😊매출액에 대한 95% 신뢰구간과 예측구간까지 구할 수 있습니다.

# 광고비 50, 플랫폼 20일 때 매출액에 대한 95% 신뢰구간과 예측구간

pre2 = pd.DataFrame({
    '광고비':[50],
    '플랫폼':[20]
})

pred = model.get_prediction(pre2)

pred2 = model.conf_int(alpha=0.05)
print(pred2)
pred.summary_frame(alpha=0.05)

# 신뢰구간 268.612221	352.52844
# 예측구간 179.700104	441.440556

😊 범주형 변수

범주형 변수를 적어보려고 합니다. 

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],
    '유형':['B','B','C','A','B','B','B','B','B','B'
        ,'C','B','B','B','B','B','B','A','A','A']
    })
df.head(3)

유형이라는 부분이 A,B,C로 수치가 아닌 범주형으로 구성되어있는걸 확인할 수 있습니다.

 

여기서 종속변수는 '매출액'이라는 부분 체크하고 갈거구요.

 

똑같이 MODEL을 만들어줍니다.

from statsmodels.formula.api import ols
model = ols('매출액 ~ 광고비 + 유형', data=df).fit()
print(model.summary())

**사실 ols를 하면 알아서 원핫인코딩을 진행해줍니다!!

그래서 원핫인코딩을 하지 않아도 됩니다. (아래 결과를 보면 됨)

*********단 OLS는 범주형으로 따로 바꿔줘야한다고 알고있다. 

OLS ols는 다름!

 

A가 없는 이유는 다중공선성이라는 이유때문에 따로 DROP을 해줬다는것만 가볍게 알고 넘어가도 됩니다.