제7회 기출 변형 문제 (제3유형)
들어가며
- 빅데이터분석기사 실기 제7회 제3유형 기출 변형 문제를 올려본다.
- 제7회 제3유형에서는 고급 통계(회귀 분석)과 관련된 문제가 출제되었다.
참고
- 회귀 분석에서는 귀무 가설과 대립 가설이 다음과 같이 설정된다.
- 따라서 유의하지 않은 변수를 구하려면 귀무 가설을 채택(p-value > 0.05(유의수준))하는 변수를 선택하면 된다.
귀무 가설 : 해당 변수는 종속 변수에 미치는 영향력이 없다. (유의하지 않다.)
대립 가설 : 해당 변수는 종속 변수에 미치는 영향력이 있다. (유의하다.)
- 로지스틱 회귀 분석은 @statsmodels.api.Logit(y, X)@ 함수를 사용하고, 다중 선형 회귀 분석은 @statsmodels.api.OLS(y, X)@ 함수를 사용한다.
- p-value 값은 @result.pvalues@로, 회귀 계수(Coefficient) 값은 @result.params@을 통해 확인할 수 있다.
- 오즈비(Odds Ratio)는 @np.exp(result['변수'])@를 이용하여 구할 수 있다.
- 변수의 크기가 @N@ 증가할 때, 오즈비(Odds Ratio)는 @np.exp(N * np.exp(result['변수']))@ 배수만큼 증가한다.
- 로지스틱 회귀 분석에서 잔차 이탈도(Residual Deviance)는 GLM(Generalized Linear Model)을 통해 확인할 수 있다.
- @statsmodels.api.GLM(y, X, family=sm.families.Binomial())@
사용 예시 코드
import numpy as np
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv('./datasets/dataset.csv')
# 각 변수 간의 상관 계수 확인 하기
corr_df = df.corr(numeric_only=True)
print(corr_df)
""" 출력 예시
v1 v2 v3 v4 v5 Target
v1 1.000000 -0.066107 -0.036512 0.021895 -0.005389 0.872265
v2 -0.066107 1.000000 -0.124047 -0.061987 -0.114401 -0.383313
v3 -0.036512 -0.124047 1.000000 -0.115117 0.062719 0.310146
v4 0.021895 -0.061987 -0.115117 1.000000 0.033356 -0.011590
v5 -0.005389 -0.114401 0.062719 0.033356 1.000000 0.036221
Target 0.872265 -0.383313 0.310146 -0.011590 0.036221 1.000000
"""
##
## ===========================================================================
##
X = df[['변수1', '변수2', ...]] # 독립 변수
X = sm.add_constant(X) # 상수항 추가
y = df[['변수1']] # 종속 변수
# ✅ 로지스틱 회귀
model = sm.Logit(y, X).fit()
# Summary 확인
summary = model.summary()
""" 출력 예시
Logit Regression Results
==============================================================================
Dep. Variable: y_logit No. Observations: 100
Model: Logit Df Residuals: 96
Method: MLE Df Model: 3
Date: Fri, 15 Nov 2024 Pseudo R-squ.: 0.01884
Time: 02:25:50 Log-Likelihood: -66.748
converged: True LL-Null: -68.029
Covariance Type: nonrobust LLR p-value: 0.4640
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 1.5921 1.624 0.980 0.327 -1.591 4.775
X1 -0.0368 0.024 -1.540 0.124 -0.084 0.010
X2 -0.0020 0.015 -0.136 0.892 -0.031 0.027
X3 -4.16e-05 0.010 -0.004 0.997 -0.019 0.019
==============================================================================
"""
# ✅ 다중 선형 회귀
model = sm.OLS(y, X).fit()
# Summary 확인
summary = model.summary()
""" 출력 예시
OLS Regression Results
==============================================================================
Dep. Variable: y_ols R-squared: 0.989
Model: OLS Adj. R-squared: 0.988
Method: Least Squares F-statistic: 2795.
Date: Fri, 15 Nov 2024 Prob (F-statistic): 2.99e-93
Time: 02:25:50 Log-Likelihood: -304.81
No. Observations: 100 AIC: 617.6
Df Residuals: 96 BIC: 628.0
Df Model: 3
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 4.2031 4.072 1.032 0.305 -3.880 12.286
X1 1.9530 0.059 32.994 0.000 1.836 2.071
X2 2.9656 0.037 80.338 0.000 2.892 3.039
X3 -0.9938 0.025 -40.439 0.000 -1.043 -0.945
==============================================================================
Omnibus: 2.128 Durbin-Watson: 1.690
Prob(Omnibus): 0.345 Jarque-Bera (JB): 1.502
Skew: -0.040 Prob(JB): 0.472
Kurtosis: 2.405 Cond. No. 836.
==============================================================================
"""
# p-value 확인
p_values = model.pvalues
""" 출력 예시
const 3.045914e-01
X1 3.508077e-54
X2 7.613901e-90
X3 4.249762e-62
dtype: float64
"""
# 회귀 계수(coef) 확인
coefficients = model.params
""" 출력 예시
const 4.203092
X1 1.953025
X2 2.965557
X3 -0.993764
dtype: float64
"""
# 결정 계수(R-Squared) 확인
r_squared = model.rsquared
""" 출력 예시
0.046868286704138895
"""
# 로짓 우도값(Log-Likelihood) 확인
log_likelihood = model.llf
""" 출력 예시
-135.22741810901363
"""
# 오즈비(Odds Ratio) 구하기
odds_ratio = np.exp(model.params['변수'])
""" 출력 예시
0.072313213120958013
"""
# 잔차 이탈도(Residual Deviance) 확인
model = sm.GLM(y, X, family=sm.families.Binomial()).fit() # ✅ GLM(Generalized Linear Model) 모델링, Bionomial : 로지스틱 회귀
# Summary 확인
summary = model.summary()
""" 출력 예시
Generalized Linear Model Regression Results
==============================================================================
Dep. Variable: target No. Observations: 200
Model: GLM Df Residuals: 194
Model Family: Binomial Df Model: 5
Link Function: Logit Scale: 1.0000
Method: IRLS Log-Likelihood: -135.23
Date: Sat, 16 Nov 2024 Deviance: 270.45
Time: 20:07:33 Pearson chi2: 200.
No. Iterations: 4 Pseudo R-squ. (CS): 0.004967
Covariance Type: nonrobust
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.9495 1.424 -0.667 0.505 -3.740 1.841
age 0.0011 0.010 0.107 0.915 -0.019 0.021
chol 0.0012 0.003 0.370 0.712 -0.005 0.008
trestbps 0.0029 0.006 0.470 0.638 -0.009 0.015
thalach -0.0019 0.005 -0.376 0.707 -0.012 0.008
oldpeak 0.0549 0.102 0.537 0.591 -0.145 0.255
==============================================================================
"""
residual_deviance = model.deviance
""" 출력 예시
270.45483621802725
"""
문제 1
(1) 선형 관계 가장 큰 변수 찾아 상관 계수(Correlation Coefficient) 구하기
(2) Target 변수를 종속 변수로 하여 다중 선형 회귀 모델링을 진행했을 때 @v2@ 컬럼의 회귀 계수(Coefficient) 구하기
(3) 회귀 계수들이 가지는 p-값들 중 최대값 구하기
import pandas as pd
import numpy as np
import statsmodels.api as sm
# 가상 데이터 생성
np.random.seed(0) # 재현성을 위해 시드 설정
n_samples = 100
# 독립 변수(v1 ~ v5) 및 종속 변수(Target) 생성
data = {
'v1': np.random.rand(n_samples) * 100,
'v2': np.random.rand(n_samples) * 50,
'v3': np.random.rand(n_samples) * 200,
'v4': np.random.rand(n_samples) * 80,
'v5': np.random.rand(n_samples) * 10,
}
# Target 변수는 v1, v2, v3에 영향을 받도록 생성
data['Target'] = (
3 * data['v1'] - 2 * data['v2'] + 0.5 * data['v3'] +
np.random.randn(n_samples) * 20 # 노이즈 추가
)
# DataFrame으로 변환
df = pd.DataFrame(data)
# (1) 선형 관계 가장 큰 변수 찾아 상관 계수 구하기
corr_df = df.corr(numeric_only=True)
print(corr_df)
target_corr = corr_df['Target']
most_correlated_variable = target_corr.sort_values(ascending=False)[1] # 'Target' 제외한 가장 높은 상관 변수
print(f"(1) 선형 관계 가장 큰 변수의 상관 계수: {most_correlated_variable:.4f}")
# (2) Target 변수를 종속 변수로 하여 다중 선형 회귀 모델링을 진행했을 때 v2 컬럼의 회귀 계수 구하기
x = df.drop('Target', axis=1)
x = sm.add_constant(x) # 상수항 추가
y = df['Target']
# 다중 선형 회귀 분석 모델 생성
model = sm.OLS(y, x).fit()
summary = model.summary()
print(summary)
v2_coef = model.params['v2']
print(f"(2) v2 변수의 회귀 계수: {v2_coef:.4f}")
# (3) 회귀 계수들이 가지는 p-값들 중 최대값 구하기
max_pvalue = model.pvalues.max()
print(f"(3) 회귀 계수의 p-값 중 최대값: {max_pvalue:.4f}")
v1 v2 v3 v4 v5 Target
v1 1.000000 -0.066107 -0.036512 0.021895 -0.005389 0.872265
v2 -0.066107 1.000000 -0.124047 -0.061987 -0.114401 -0.383313
v3 -0.036512 -0.124047 1.000000 -0.115117 0.062719 0.310146
v4 0.021895 -0.061987 -0.115117 1.000000 0.033356 -0.011590
v5 -0.005389 -0.114401 0.062719 0.033356 1.000000 0.036221
Target 0.872265 -0.383313 0.310146 -0.011590 0.036221 1.000000
(1) 선형 관계 가장 큰 변수의 상관 계수: 0.8723
OLS Regression Results
==============================================================================
Dep. Variable: Target R-squared: 0.960
Model: OLS Adj. R-squared: 0.957
Method: Least Squares F-statistic: 447.0
Date: Sat, 16 Nov 2024 Prob (F-statistic): 7.20e-64
Time: 19:42:11 Log-Likelihood: -443.47
No. Observations: 100 AIC: 898.9
Df Residuals: 94 BIC: 914.6
Df Model: 5
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 3.2852 9.174 0.358 0.721 -14.929 21.500
v1 3.0453 0.073 41.575 0.000 2.900 3.191
v2 -2.1320 0.155 -13.754 0.000 -2.440 -1.824
v3 0.5132 0.036 14.452 0.000 0.443 0.584
v4 -0.0582 0.093 -0.624 0.534 -0.244 0.127
v5 -0.3720 0.705 -0.528 0.599 -1.771 1.027
==============================================================================
Omnibus: 2.625 Durbin-Watson: 1.810
Prob(Omnibus): 0.269 Jarque-Bera (JB): 2.212
Skew: -0.361 Prob(JB): 0.331
Kurtosis: 3.101 Cond. No. 577.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
(2) v2 변수의 회귀 계수: -2.1320
(3) 회귀 계수의 p-값 중 최대값: 0.7211
(1) 각 변수간 상관 계수는 @dataframe.corr()@ 메서드를 이용하여 확인할 수 있다. @Target@과 가장 높은 선형 관계를 가진 변수는 @v1@이며, 상관 계수는 약 0.7966이다.
(2) @Target@을 종속 변수로 하고 나머지 변수를 독립 변수로 설정했을 때, @v2@의 회귀 계수는 약 -2.0841이다. 이때, 상수항을 포함시켜서 구한다.
(3) 회귀 분석 결과 중 p-값이 가장 큰 것은 0.7643으로, 유의 수준 0.05보다 크다. (귀무 가설(해당 변수는 종속 변수에 미치는 영향이 없다.) 채택) 따라서 독립 변수가 통계적으로 유의미하지 않을 가능성이 높다.
문제 2
(1) train 데이터로 @target@을 종속 변수로 로지스틱 회귀를 진행할 때, @age@ 컬럼의 오즈비(Odds Ratio) 구하기
(2) train 데이터로 로지스틱 회귀를 진행했을 경우 잔차 이탈도(Residual Deviance) 계산하기
(3) train 데이터로 로지스틱 회귀를 진행했을 경우 로짓 우도값(Log-Likelihood) 도출하기
(4) test 데이터의 독립 변수로 @target@ 예측 후 오류율(Error Rate) 구하기
import numpy as np
import pandas as pd
import statsmodels.api as sm
from sklearn.metrics import accuracy_score, confusion_matrix
# 가상의 데이터 생성
np.random.seed(42)
n_samples = 300
data = {
'age': np.random.randint(30, 80, n_samples), # 나이 (30~80세)
'chol': np.random.randint(150, 300, n_samples), # 콜레스테롤 수치 (150~300)
'trestbps': np.random.randint(100, 180, n_samples), # 안정 시 혈압 (100~180)
'thalach': np.random.randint(100, 200, n_samples), # 최대 심박수 (100~200)
'oldpeak': np.random.uniform(0, 5, n_samples), # ST depression induced by exercise
'target': np.random.binomial(1, 0.4, n_samples) # 심장병 발병 여부 (0 또는 1, 40% 확률)
}
df = pd.DataFrame(data)
# train/test 데이터 분할
train_data = df[:200].reset_index(drop=True)
test_data = df[200:].reset_index(drop=True)
# [1] train 데이터로 로지스틱 회귀 분석 수행
X = train_data.drop('target', axis=1) # 독립 변수
X = sm.add_constant(X) # 상수항 추가
y = train_data['target'] # 종속 변수
# 로지스틱 회귀 모델 생성
model1 = sm.Logit(y, X).fit()
summary1 = model1.summary()
print(summary1)
# (1) 오즈비 계산 (age)
answer1 = np.exp(model1.params['age'])
print("(1) 오즈비 (age):", answer1)
# (2) 잔차 이탈도 계산
model2 = sm.GLM(y, X, family=sm.families.Binomial()).fit() # GLM(Generalized Linear Models) 모델링, Bionomial : 로지스틱 회귀
summary2 = model2.summary()
print(summary2)
answer2 = model2.deviance
print("(2) 잔차 이탈도:", answer2)
# (3) 로짓 우도값(Log-Likelihood) 계산
answer3 = model1.llf
print("(3) 로짓 우도값:", answer3)
# (4) test 데이터로 target 예측 후 오류율(Error Rate) 계산
X_test = test_data.drop('target', axis=1)
X_test = sm.add_constant(X_test) # 상수항 추가
y_test = test_data['target']
pred = model1.predict(X_test)
## 방법 1 (1 - Accuracy 구하기)
pred = (pred > 0.5).astype(int) # 예측된 확률값을 0.5 기준으로 이진 분류하여 변환 (0.5 초과 : 1, 0.5 이하 : 0)
error_rate = 1 - accuracy_score(y_test, pred) # Error Rate = 1 - Accuracy
# print("(4) 오류율:", error_rate)
## 방법 2 (혼동 행렬 이용하기)
cm = confusion_matrix(y_test, pred)
# 오류율 계산
error_rate = (cm[0, 1] + cm[1, 0]) / cm.sum() # 오차 행렬에서 오답의 합을 전체로 나누기
print("(4) 오류율:", error_rate)
Optimization terminated successfully.
Current function value: 0.676137
Iterations 4
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 200
Model: Logit Df Residuals: 194
Method: MLE Df Model: 5
Date: Sat, 16 Nov 2024 Pseudo R-squ.: 0.003669
Time: 20:29:45 Log-Likelihood: -135.23
converged: True LL-Null: -135.73
Covariance Type: nonrobust LLR p-value: 0.9629
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.9495 1.424 -0.667 0.505 -3.740 1.841
age 0.0011 0.010 0.107 0.915 -0.019 0.021
chol 0.0012 0.003 0.370 0.712 -0.005 0.008
trestbps 0.0029 0.006 0.470 0.638 -0.009 0.015
thalach -0.0019 0.005 -0.376 0.707 -0.012 0.008
oldpeak 0.0549 0.102 0.537 0.591 -0.145 0.255
==============================================================================
(1) 오즈비 (age): 1.001112327790342
Generalized Linear Model Regression Results
==============================================================================
Dep. Variable: target No. Observations: 200
Model: GLM Df Residuals: 194
Model Family: Binomial Df Model: 5
Link Function: Logit Scale: 1.0000
Method: IRLS Log-Likelihood: -135.23
Date: Sat, 16 Nov 2024 Deviance: 270.45
Time: 20:29:45 Pearson chi2: 200.
No. Iterations: 4 Pseudo R-squ. (CS): 0.004967
Covariance Type: nonrobust
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.9495 1.424 -0.667 0.505 -3.740 1.841
age 0.0011 0.010 0.107 0.915 -0.019 0.021
chol 0.0012 0.003 0.370 0.712 -0.005 0.008
trestbps 0.0029 0.006 0.470 0.638 -0.009 0.015
thalach -0.0019 0.005 -0.376 0.707 -0.012 0.008
oldpeak 0.0549 0.102 0.537 0.591 -0.145 0.255
==============================================================================
(2) 잔차 이탈도: 270.45483621802725
(3) 로짓 우도값: -135.22741810901363
(4) 오류율: 0.4
(1) 변수의 오즈비(Odds Ratio)는 @np.exp(df['변수'])@와 같이 구할 수 있다.
(2) 로지스틱 회귀를 진행할 때, 잔차 이탈도(Residual Deviance)는 GLM(Generalized Linear Model) 모델링을 통해 확인할 수 있다. (@sm.GLM(y, X)@) @summary@ 함수를 이용하여 결과값을 출력한 후, @Deviance@ 항목의 값을 확인하면 된다.
(3) 로지스틱 회귀를 진행할 때, 로짓 우도값(Log-Likelihood)은 @sm.Logit(y, X)@ 모델링 후 @summary@ 함수를 이용하여 결과값을 출력한 후, @Log-Likelihood@ 항목의 값을 확인하면 된다.
(4) 우선, 테스트 데이터의 독립 변수와 종속 변수를 분리한다. 그리고 훈련 데이터를 이용하여 미리 생성한 로지스틱 회귀 모델(@model1@)에 테스트 데이터의 독립 변수를 넣어준 후 예측해준다. (@pred = model1.predict(X_test)@) <오류율(Error Rate) = 1 - 정확도(Accuracy Score)>이므로 직접 구해주거나(방법①) 혼동 행렬(Confusion Matrix)을 이용(방법②)하여 구해준다.
(참고) GLM(Generalized Linear Models)
개념
- 일반화된 선형 모델
- 선형 회귀, 로지스틱 회귀, 포아송 회귀 등 다양한 회귀 모델을 하나의 프레임워크에서 처리할 수 있게 해주는 클래스
사용 예시
- @sm.GLM@ 클래스를 통해 다양한 회귀 모델을 피팅할 수 있다.
예시 코드 : 로지스틱 회귀
import statsmodels.api as sm
# 모델 정의
model = sm.GLM(y, X, family=sm.families.Binomial())
result = model.fit()
# 결과 출력
print(result.summary())
Generalized Linear Model Regression Results
==============================================================================
Dep. Variable: target No. Observations: 200
Model: GLM Df Residuals: 194
Model Family: Binomial Df Model: 5
Link Function: Logit Scale: 1.0000
Method: IRLS Log-Likelihood: -135.23
Date: Sat, 16 Nov 2024 Deviance: 270.45
Time: 20:29:45 Pearson chi2: 200.
No. Iterations: 4 Pseudo R-squ. (CS): 0.004967
Covariance Type: nonrobust
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.9495 1.424 -0.667 0.505 -3.740 1.841
age 0.0011 0.010 0.107 0.915 -0.019 0.021
chol 0.0012 0.003 0.370 0.712 -0.005 0.008
trestbps 0.0029 0.006 0.470 0.638 -0.009 0.015
thalach -0.0019 0.005 -0.376 0.707 -0.012 0.008
oldpeak 0.0549 0.102 0.537 0.591 -0.145 0.255
==============================================================================
⇒ Log-Likelihood : 로짓 우도
⇒ Deviance : 잔차 이탈도
@family@ 파라미터
- 모델이 따르는 확률 분포를 지정한다.
파라미터 값 | 설명 |
@sm.families.Binomial()@ | 로지스틱 회귀 (이항 분포) |
@sm.families.Poisson()@ | 포아송 회귀 (카운트 데이터) |
@sm.families.Gaussian()@ | 일반 선형 회귀 (연속형 종속 변수) |
@sm.familes.Gamma()@ | 감마 분포 (양의 연속형 데이터) |
참고 사이트
- 보다 자세한 내용은 아래의 공식 문서를 확인한다.
'Certificate > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사 실기] 제1유형 시험 준비 (0) | 2024.11.25 |
---|---|
[빅데이터분석기사 실기] help(), dir() 활용하기 (0) | 2024.11.25 |
[빅데이터분석기사 실기] corr() 함수와 numeric_only 옵션 (0) | 2024.11.25 |
[빅데이터분석기사 실기] 시험장 들어가기 전에 보기 빠르게 보기 좋은 강의 모음 (1) | 2024.11.17 |
[빅데이터분석기사 실기] 제6회 기출 변형 문제 (제3유형) (0) | 2024.11.16 |
[빅데이터분석기사 실기] 제8회 기출 변형 문제 (제3유형) (2) | 2024.11.15 |
[빅데이터분석기사 실기] 제3유형 시험 준비 (가설 검정, 고급 통계) (6) | 2024.11.15 |
[빅데이터분석기사 실기] 판다스(pandas) 출력 길이 제한 해제하기 (0) | 2024.10.27 |