728x90
728x90

제8회 기출 변형 문제 (제3유형)

들어가며

  • 빅데이터분석기사 실기 제8회 제3유형 기출 변형 문제를 올려본다.
  • 제8회 제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['변수']))@ 배수만큼 증가한다.
    • @result['변수']@는 @변수@의 회귀 계수(Coefficient) 값이다.
  • 로지스틱 회귀 분석에서 잔차 이탈도(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) 로지스틱 회귀 모델을 적용하여 유의하지 않은 변수 개수 구하기

(2) 유의미한 변수만을 독립 변수로 하여 로지스틱 회귀를 다시 적용하고, 회귀 계수의 평균 구하기

(3) @calls@ 변수가 5 증가할 때 오즈비 증가 배수 계산하기

import pandas as pd
import numpy as np
import statsmodels.api as sm

# 예시 데이터 생성
np.random.seed(23123123)
data = pd.DataFrame({
    'age': np.random.randint(18, 60, 100),
    'salary': np.random.randint(30000, 120000, 100),
    'calls': np.random.randint(0, 50, 100),
    'churn': np.random.randint(0, 2, 100)  # 고객이탈지수 (종속변수)
})

# (1) 로지스틱 회귀 모델을 적용하여 유의하지 않은 변수 개수 구하기

# 상수항 추가
X = data[['age', 'salary', 'calls']]
X = sm.add_constant(X)  # 상수항 추가
y = data['churn']

# 로지스틱 회귀 모델 적합
model = sm.Logit(y, X).fit()

summary = model.summary()
print(summary)

# p-value 확인
p_values = model.pvalues

# 유의미하지 않은 변수 (p-value > 0.05)
insignificant_vars = p_values[p_values > 0.05]
print(f"유의하지 않은 변수의 개수: {len(insignificant_vars)}")

# (2) 유의미한 변수만을 독립 변수로 하여 로지스틱 회귀를 다시 적용하고 회귀 계수의 평균 구하기
significant_vars = p_values[p_values <= 0.05].index  # 유의미한 변수 추출 (p-value <= 유의수준, 상수항 포함)

# 유의미한 변수가 있는지 확인
if len(significant_vars) > 0:
    X_significant = X[significant_vars]
    logit_model_significant = sm.Logit(y, X_significant).fit()

    # 회귀 계수의 평균 구하기
    coefficients = logit_model_significant.params
    mean_coefficient = coefficients.mean()
    print(f"유의미한 변수들에 대한 회귀 계수 평균: {mean_coefficient}")
else:
    print("유의미한 변수가 없습니다.")

# (3) 'calls' 변수가 5 증가할 때 오즈비 증가 배수 계산
if 'calls' in significant_vars:
    call_coeff = logit_model_significant.params['calls']
    odds_ratio_increase = np.exp(5 * call_coeff)
    print(f"calls 변수가 5 증가하면 오즈비는 {odds_ratio_increase}배 증가합니다.")
else:
    print("'calls' 변수는 유의미하지 않거나 모델에 포함되지 않았습니다.")
Optimization terminated successfully.
         Current function value: 0.630233
         Iterations 5
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                  churn   No. Observations:                  100
Model:                          Logit   Df Residuals:                       96
Method:                           MLE   Df Model:                            3
Date:                Fri, 15 Nov 2024   Pseudo R-squ.:                 0.09077
Time:                        01:46:47   Log-Likelihood:                -63.023
converged:                       True   LL-Null:                       -69.315
Covariance Type:            nonrobust   LLR p-value:                  0.005632
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          3.2608      1.060      3.075      0.002       1.182       5.339
age           -0.0345      0.019     -1.792      0.073      -0.072       0.003
salary     -1.611e-05   8.89e-06     -1.812      0.070   -3.35e-05    1.32e-06
calls         -0.0301      0.015     -2.026      0.043      -0.059      -0.001
==============================================================================
유의하지 않은 변수의 개수: 2
Optimization terminated successfully.
         Current function value: 0.669250
         Iterations 4
유의미한 변수들에 대한 회귀 계수 평균: 0.35029495471365896
calls 변수가 5 증가하면 오즈비는 0.8589494047822301배 증가합니다.

 

더보기

(1) 회귀식에서 귀무 가설은 '해당 변수는 종속 변수에 미치는 영향이 없다.' 이다. 따라서 귀무 가설이 채택될 경우(p-value > 유의수준(0.05)), 유의하지 않다고 할 수 있다. 또한, 대립 가설이 채택될 경우(p-value < 유의수준(0.05)) 해당 변수는 유의하다고 볼 수 있다. 유의 하지 않은(p-value > 유의수준(0.05)) 변수는 @age@, @salary@ 2개이다.

(2) 회귀 계수의 평균을 구할 때, 상수항을 포함시켜서 구한다.

(3) @np.exp(5 * call_coeff)@와 같이 계산한다.

 

문제 2

(1) 다중 선형 회귀 모델을 적용하여 가장 유의미한 변수의 회귀 계수 구하기

(2) 결정 계수 구하기

(3) @size=200@, @location=5@, @age=10@ 일 때 @house_price@ 값 예측하기

import pandas as pd
import statsmodels.api as sm
import numpy as np

# 예시 데이터 생성
np.random.seed(123123)
data = pd.DataFrame({
    'size': np.random.randint(50, 300, 100),  # 주택 크기 (평수)
    'location': np.random.randint(1, 10, 100),  # 위치 (1~10)
    'age': np.random.randint(1, 50, 100),  # 나이 (년)
    'house_price': np.random.randint(100000, 1000000, 100)  # 주택 가격
})

# (1) 다중선형 회귀 모델을 적용하여 가장 유의미한 변수의 회귀계수 구하기
x = data[['size', 'location', 'age']]
y = data['house_price']

# 상수항 추가
x = sm.add_constant(x)

# 다중선형 회귀 모델 적합
model = sm.OLS(y, x).fit()

# 회귀 결과 출력
summary = model.summary()
print("회귀 결과 요약:")
print(summary)

# (2) 결정 계수 구하기
r_squared = model.rsquared
print(f"결정 계수 (R-squared): {r_squared}")

# (3) size=200, location=5, age=10 일 때 house_price 값 예측
size = 1
location = 5
age = 10

predicted_price = model.predict([1, size, location, age])  # 상수항(1)을 포함하여 예측
print(f"예측된 house_price: {predicted_price[0]}")
회귀 결과 요약:
                            OLS Regression Results                            
==============================================================================
Dep. Variable:            house_price   R-squared:                       0.047
Model:                            OLS   Adj. R-squared:                  0.017
Method:                 Least Squares   F-statistic:                     1.574
Date:                Fri, 15 Nov 2024   Prob (F-statistic):              0.201
Time:                        01:56:00   Log-Likelihood:                -1377.9
No. Observations:                 100   AIC:                             2764.
Df Residuals:                      96   BIC:                             2774.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const       7.002e+05   8.77e+04      7.988      0.000    5.26e+05    8.74e+05
size        -676.8792    319.354     -2.120      0.037   -1310.792     -42.967
location   -3044.8104   8910.179     -0.342      0.733   -2.07e+04    1.46e+04
age          216.6799   1701.382      0.127      0.899   -3160.536    3593.895
==============================================================================
Omnibus:                        9.060   Durbin-Watson:                   2.075
Prob(Omnibus):                  0.011   Jarque-Bera (JB):                3.390
Skew:                           0.038   Prob(JB):                        0.184
Kurtosis:                       2.101   Cond. No.                         703.
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
결정 계수 (R-squared): 0.046868286704138895
예측된 house_price: 551755.6794774851

 

더보기

(1) @size@ 변수의 p-value가 유의수준(0.05)보다 작으므로, 대립 가설(해당 변수는 종속 변수에 영향을 미친다.)를 채택하게 된다. 따라서 가장 유의미한 변수는 @size@이며, 이때 회귀 계수는 -676.8792이다.

(2) @model.rsquared@를 사용하여 결정 계수 값을 구할 수 있다. (@summary()@ 결과의 @R-squared@ 지표를 확인해도 된다.)

(3) @model.predict()@를 이용하여 예측한다. 이때 상수항의 값(@1@)을 포함시켜준다.

728x90
728x90