제6회 기출 변형 문제 (제3유형)
들어가며
- 빅데이터분석기사 실기 제6회 제3유형 기출 변형 문제를 올려본다.
- 제6회 제3유형에서는 가설 검정과 관련된 문제가 출제되었다.

문제 1
- 감기약을 복용할 때 부작용에 대한 분류와 비율 데이터
- 위약 효과가 있는지 253건의 데이터를 추출하여 검증하려고 한다.
- 감기 부작용에 대한 비율이 위약 효과 부작용 비율과 같은지 카이제곱 검정하기
부작용 유형 | 코드 | 비율 |
두통 | 1 | 0.05 |
졸림 | 2 | 0.1 |
속쓰림 | 3 | 0.05 |
부작용 없음 | 4 | 0.8 |
합계 | 1 |
(1) 위약 샘플 데이터가 부작용 없음
인 데이터를 0~1 사이의 확률로 출력하기 (반올림하여 소수점 셋째 자리로 출력)
(2) 카이제곱 검정으로 검정 통계량 출력하기 (반올림하여 소수점 셋째 자리로 출력)
(3) 유의확률(p-value) 출력하기 (반올림하여 소수점 셋째 자리로 출력)
import pandas as pd import numpy as np from scipy.stats import chisquare # 가상 데이터 생성 np.random.seed(42) sample_size = 253 effect_rates = { 1: 0.05, # 두통 2: 0.1, # 졸림 3: 0.05, # 속쓰림 4: 0.8 # 부작용 없음 } sample_data = np.random.choice(list(effect_rates.keys()), size=sample_size, p=list(effect_rates.values())) df = pd.DataFrame(sample_data, columns=['코드']) # (1) 위약 샘플 데이터가 '부작용 없음'인 데이터를 0~1 사이의 확률로 출력하기 df_placebo = df.groupby('코드').size().reset_index(name='건수') print(df_placebo) total_count = len(df) df_placebo['비율'] = df_placebo['건수'] / total_count # '부작용 없음' 비율 answer1 = round(df_placebo['비율'][df_placebo['코드'] == 4].values[0], 3) print("(1) 위약 샘플 데이터 '부작용 없음' 확률:", answer1) # (2) 카이제곱 검정으로 검정 통계량 구하기 df_rate = pd.DataFrame({ '코드': [1, 2, 3, 4], '비율' : [0.05, 0.1, 0.05, 0.8] }) ## 기대값 계산 expected_counts = df_rate['비율'] * total_count print(expected_counts) ## 카이제곱 검정 statistics, pvalue = chisquare(df_placebo['건수'], f_exp=expected_counts) answer2 = round(statistics, 3) print("(2) 카이제곱 검정 통계량:", answer2) # (3) 유의확률(p-value) 구하기 answer3 = round(pvalue, 3) print("(3) 유의확률(p-value):", answer3)
코드 건수 0 1 15 1 2 25 2 3 17 3 4 196 (1) 위약 샘플 데이터 '부작용 없음' 확률: 0.775 0 12.65 1 25.30 2 12.65 3 202.40 Name: 비율, dtype: float64 (2) 카이제곱 검정 통계량: 2.138 (3) 유의확률(p-value): 0.544
이 문제는 적합도 검정을 이용하여 풀 수 있는 문제이다. 적합도 검정은 도수 분포와 기대 분포의 차이가 있는지 검정하는 것이다.
(1) df_placebo
에서 코드별로 건수를 세고, 비율을 계산한 후, 부작용 없음
에 해당하는 코드 4
의 비율을 출력한다.
(2, 3) 문제에서 제시된 표의 내용을 데이터프레임 형태로 생성한 후(df_rate
), 각 비율(df_rate['비율']
)과 전체 데이터의 개수(total_count
)를 곱하여 각 코드별 기대값을 계산한다. (expected_counts
) 그리고 카이제곱 검정을 수행한 후 반환되는 결과값 statistics
, pvalue
을 문제의 조건에 맞게 반올림하여 출력한다.
문제 2
- 날씨 데이터
- 다중 선형 회귀 모델을 사용하여 오존(
O3
), 일사량(Solar
), 풍속(Wind
) 변수에 대한 온도(Temperature
)를 예측하는 모델 생성하기
(1) 오존농도 변수에 대한 회귀계수 추정값 출력하기 (반올림하여 소수점 셋째 자리로 출력)
(2) 오존농도, 일사량이 고정일 때 풍속이 증가함에 따라 온도가 낮아진다는 것을 검증했다. t-검증 값의 유의확률(p-value) 구하기 (반올림하여 소수점 셋째 자리로 출력)
(3) 어떤 날이 오존농도 10, 일사량 90, 풍속 20일 때 온도의 예측값 구하기 (반올림하여 소수점 셋째 자리로 출력)
방법 1 :sklearn.linear_model.LinearRegression()
,scipy.stats.ttest_ind()
이용하기
import pandas as pd import numpy as np from scipy.stats import ttest_ind from sklearn.linear_model import LinearRegression # 가상의 날씨 데이터 생성 np.random.seed(42) n_samples = 100 O3 = np.random.uniform(0, 200, n_samples) # 오존 농도 (0~200 사이의 값) Solar = np.random.uniform(0, 1000, n_samples) # 일사량 (0~1000 사이의 값) Wind = np.random.uniform(0, 20, n_samples) # 풍속 (0~20 사이의 값) Temperature = 25 + 0.05 * O3 - 0.03 * Solar - 0.2 * Wind + np.random.normal(0, 5, n_samples) # 온도 df = pd.DataFrame({ 'O3': O3, 'Solar': Solar, 'Wind': Wind, 'Temperature': Temperature }) # 선형 회귀 모델 학습 X = df[['O3', 'Solar', 'Wind']] # 독립 변수 y = df['Temperature'] # 종속 변수 model = LinearRegression().fit(X, y) coefs = pd.DataFrame({ 'Feature': ['O3', 'Solar', 'Wind'], 'Coefficient': model.coef_ }) print(coefs) # (1) 오존농도 변수에 대한 회귀 계수 추정값 구하기 answer1 = round(float(coefs[coefs['Feature'] == 'O3']['Coefficient'].iloc[0]), 3) print("(1) 오존농도 변수에 대한 회귀 계수:", answer1) # (2) 오존농도, 일사량이 고정일 때 풍속이 증가함에 따라 온도가 낮아지는 것을 t-검증을 이용하여 유의 확률(p-value) 구하기 statistic, p_value = ttest_ind(x['Wind'], y) answer2 = round(p_value, 3) print("(2) t-검증 p-value:", answer2) # (3) 어떤 날이 오존농도 10, 일사량 90, 풍속 20일 때 온도의 예측값 구하기 df_oneday = pd.DataFrame({ 'O3': [10], 'Solar': [90], 'Wind': [20] }) answer3 = model.predict(df_oneday) answer3 = np.round(answer3[0], 3) print("(3) 예측된 온도:", answer3)
Feature Coefficient 0 O3 0.060398 1 Solar -0.028957 2 Wind -0.117663 (1) 오존농도 변수에 대한 회귀 계수: 0.06 (2) t-검증 p-value: 0.026 (3) 예측된 온도: 18.644
방법 2 :statsmodels.api.OLS()
이용하기
OLS(Ordinary Least Squares)
모델은 선형 회귀 모델을 기반으로 하는 방법이다.
import pandas as pd import numpy as np import statsmodels.api as sm # 가상의 날씨 데이터 생성 np.random.seed(42) n_samples = 100 O3 = np.random.uniform(0, 200, n_samples) # 오존 농도 (0~200 사이의 값) Solar = np.random.uniform(0, 1000, n_samples) # 일사량 (0~1000 사이의 값) Wind = np.random.uniform(0, 20, n_samples) # 풍속 (0~20 사이의 값) Temperature = 25 + 0.05 * O3 - 0.03 * Solar - 0.2 * Wind + np.random.normal(0, 5, n_samples) # 온도 df = pd.DataFrame({ 'O3': O3, 'Solar': Solar, 'Wind': Wind, 'Temperature': Temperature }) # 독립 변수에 상수항 추가 (statsmodels에서는 상수항을 명시적으로 추가해야 함) X = df[['O3', 'Solar', 'Wind']] # 독립 변수 X = sm.add_constant(X) # 상수항 추가 y = df['Temperature'] model = sm.OLS(y, X).fit() summary = model.summary() print(summary) # (1) 회귀 계수 추정값 출력 (오존농도에 대한 회귀 계수) answer1 = round(model.params['O3'], 3) print("(1) 오존농도(O3) 변수에 대한 회귀 계수:", answer1) # (2) t-검증 p-value 출력 answer2 = round(model.pvalues['Wind'], 3) print("(2) 풍속(Wind)에 대한 t-검증 p-value:", answer2) # (3) 예측값 계산 new_data = pd.DataFrame({ 'const': [1], # 상수항 'O3': [10], 'Solar': [90], 'Wind': [20] }) answer3 = model.predict(new_data) answer3 = np.round(answer3[0], 3) print("(3) 예측된 온도:", answer3)
OLS Regression Results ============================================================================== Dep. Variable: Temperature R-squared: 0.786 Model: OLS Adj. R-squared: 0.779 Method: Least Squares F-statistic: 117.4 Date: Sat, 16 Nov 2024 Prob (F-statistic): 5.35e-32 Time: 21:49:16 Log-Likelihood: -299.12 No. Observations: 100 AIC: 606.2 Df Residuals: 96 BIC: 616.7 Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ const 22.9999 1.639 14.032 0.000 19.746 26.253 O3 0.0604 0.008 7.261 0.000 0.044 0.077 Solar -0.0290 0.002 -16.978 0.000 -0.032 -0.026 Wind -0.1177 0.085 -1.381 0.170 -0.287 0.051 ============================================================================== Omnibus: 5.375 Durbin-Watson: 2.376 Prob(Omnibus): 0.068 Jarque-Bera (JB): 4.964 Skew: -0.402 Prob(JB): 0.0836 Kurtosis: 3.738 Cond. No. 1.94e+03 ============================================================================== Notes: [1] Standard Errors assume that the covariance matrix of the errors is correctly specified. [2] The condition number is large, 1.94e+03. This might indicate that there are strong multicollinearity or other numerical problems. (1) 오존농도(O3) 변수에 대한 회귀 계수: 0.06 (2) 풍속(Wind)에 대한 t-검증 p-value: 0.17 (3) 예측된 온도: 18.644
이 문제는 독립성 검정을 이용하여 풀 수 있는 문제이다. 독립성 검정은 두 변수가 독립적인지 아닌지 검정하는 검정하는 것이다.
아래의 2가지 방법 중 하나를 사용하여 문제를 해결하면 된다.
> 방법 1 : sklearn.linear_model.LinearRegression()
함수 + scipy.stats.ttest_ind()
> 방법 2 : statsmodels.api.OLS()
함수 이용하기
- summary()
함수를 통해 T-검증의 유의 확률(p-value)을 확인할 수 있다.
- 새로운 데이터를 이용하여 예측값을 구할 때, 반드시 새로운 변수에 상수항을 추가해준다. (const: [1]
)
'Certificate > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사 실기] 제1유형 시험 준비 (0) | 2024.11.25 |
---|---|
[빅데이터분석기사 실기] help(), dir() 활용하기 (0) | 2024.11.25 |
[빅데이터분석기사 실기] corr() 함수와 numeric_only 옵션 (0) | 2024.11.25 |
[빅데이터분석기사 실기] 시험장 들어가기 전에 보기 빠르게 보기 좋은 강의 모음 (1) | 2024.11.17 |
[빅데이터분석기사 실기] 제7회 기출 변형 문제 (제3유형) (0) | 2024.11.16 |
[빅데이터분석기사 실기] 제8회 기출 변형 문제 (제3유형) (2) | 2024.11.15 |
[빅데이터분석기사 실기] 제3유형 시험 준비 (가설 검정, 고급 통계) (6) | 2024.11.15 |
[빅데이터분석기사 실기] 판다스(pandas) 출력 길이 제한 해제하기 (0) | 2024.10.27 |