제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 |