작성일자 : 2023-12-13
Ver 0.1.1
1. 다중 회귀분석
# sklearn 라이브러리 활용
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 독립변수와 종속변수 설정
x = x[['col1','col2','col3']]
print(x.head())
print(y.head())
# 모델링
model = LinearRegression()
model.fit(x,y)
# 회귀분석 관련 지표 출력
# 1. RSQ(결정계수) : model.score(x,y)
model.score(x,y)
print(round(model.score(x,y),2))
# 2. 회귀계수 출력 : model.coef_
print(np.round(model.coef_,2)) # 전체 회귀계수
print(np.round(model.coef_[0,0],2)) # x1의 회귀계수
print(np.round(model.coef_[0,1],2)) # x2의 회귀계수
print(np.round(model.coef_[0,2],2)) # x3의 회귀계수
# 3. 회귀계수(절편) : model.intercept_
print(np.round(model.intercept_,2))
# ---------------------------------------------------
# statsmodel 라이브러리 활용
import statsmodels.api as sm
# 독립변수와 종속변수 설정
x = x[['col1','col2','col3']]
y = y['target']
print(x.head())
print(y.head())
x = sm.add_constant(x) # 주의 : 반드시 상수항 추가해주어야 함
model = sm.OLS(y,x).fit() # sm.OLS(y,x).fit() 순임
# y_pred = model.fit()
summary = model.summary()
print(summary)
# 1. RSQ(결정계수)
# R-squared = 0.xxx
# 2. 회귀계수
# age = xxx.xxx
# sex = xxx.xxx
# bmi = xxx.xxx
# 3. 회귀계수(절편)
# const = xxx.xxx
# 4. 회귀식 p-value
# p-value = x.xxxe-xx
2. 로지스틱 회귀분석
# 분석 데이터 설정
df = df[['var1', 'var2','var3','var4']]
print(df.head())
### 회귀식 : P(1일 확률) = 1 / (1 + exp(-f(x)))
- f(x) = b0 + x1*1 + x2*2 + x3*3
- In(P / 1-P)
- 회귀식 : y = b0 + x1*1 + x2*2 + x3*3<br>
(P = 생존할 확률, x1 = var1, x2 = var2, x3 = var3)
# 데이터 전처리
# 변수처리
# 문자형 타입의 데이터의 경우 숫자로 변경해준다
# *** 실제 시험에서 지시사항을 따를 것 ***
# 성별을 map 함수를 활용하여 각각 1과 0으로 할당한다. (여성을 1, 남성을 0)
# (실제 시험의 지시 조건에 따를 것)
df['sex'] = df['sex'].map({'female' : 1,
'male' : 0})
print(df.head())
#sklearn 라이브러리 활용
# 독립변수와 종속변수 설정
x = df.drop(['survived'], axis = 1)
y = df['survived']
#(주의) LogisticRegression() 객체 안에서 반드시 penalty = None 으로 입력해야 함
# 모델링
from sklearn.linear_model import LogisticRegression # 회귀는 LinearRegression
# 반드시 penalty = None 옵션 입력해줄것. default = 'l2'
model1 = LogisticRegression(penalty=None)
model1.fit(x,y)
# 로지스틱 회귀분석 관련 지표 출력
# 1. 회귀계수 출력 : model.coef_
print(np.round(model1.coef_,4)) # 전체 회귀계수
print(np.round(model1.coef_[0,0],4)) # x1의 회귀계수
print(np.round(model1.coef_[0,1],4)) # x2의 회귀계수
print(np.round(model1.coef_[0,2],4)) # x3의 회귀계수
# 회귀계수(절편) : model.intercept_
print(np.round(model1.intercept_,4))
# 3-1. 로지스틱 회귀모형에서 sibsp 변수가 한단위 증가할 때 생존할 오즈가 몇 배 증가하는지 반올림하여 소수점 셋째 자리까지 구하시오.
# exp(b2) 를 구하면 된다
result = np.exp(model1.coef_[0][1]) # index 주의
# np.exp(model1.coef_[0,1])
print(round(result,3))
# 해석 : sibsp 변수가 한 단위 증가할 때 생존할 오즈가 0.669배 증가한다. ( = 생존할 오즈가 33% 감소한다)
# 3-2. 로지스틱 회귀모형에서 여성일 경우 남성에 비해 오즈가 몇 배 증가하는지 반올림하여 소수점 셋째 자리까지 구하시오.
# exp(b1)를 구하면 된다.
result2 = np.exp(model1.coef_[0,0])
print(round(result2,3))
# 해셕 : 여성일 경우 남성에 비해 생존할 오즈가 13.024배 증가한다. ( = 생존할 확률이 13배 증가한다)
# ------------------------------------------------------
# statsmodel 라이브러리 사용
# (주의) 실제 오즈가 몇 배 증가했는지 계한사는 문제가 나온다면, sklearn 라이브러리를 사용하여 회귀계수를 직접 구해서 계산할 것(소수점이 결과값에 영향을 줄 수 있음!)
import statsmodels.api as sm
x = sm.add_constant(x) # caution : 상수항 반드시 추가해줘야 함
model2 = sm.Logit(y,x).fit() # cuation : y,x 순서로 입력해야 함
summary = model2.summary()
print(summary)