💛 단순 선형 회귀 분석
주어진 키와 몸무게 데이터로 회귀모델을 구축하고 각 소문제의 값을 구하시오.
- 키: 종속변수
- 몸무게: 독립변수
💛 시험에서는 물론 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) 설정이 필요함
'자격증 > [빅분기] 빅데이터분석기사' 카테고리의 다른 글
[작업형3] 분산분석 개념 (0) | 2024.11.16 |
---|---|
[작업형3] 다선형회귀, 범주형이 섞여있다면? (0) | 2024.11.14 |
[작업형3] 회귀분석- 상관관계 (2) (0) | 2024.11.12 |
[작업형3] 회귀분석(1) (0) | 2024.11.11 |
[작업형3] 범주형 데이터 분석 - 적합도검정 (1) | 2024.11.09 |