제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
)을 포함시켜준다.
'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 |
[빅데이터분석기사 실기] 제7회 기출 변형 문제 (제3유형) (0) | 2024.11.16 |
[빅데이터분석기사 실기] 제3유형 시험 준비 (가설 검정, 고급 통계) (6) | 2024.11.15 |
[빅데이터분석기사 실기] 판다스(pandas) 출력 길이 제한 해제하기 (0) | 2024.10.27 |