728x90
728x90

제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]@)

728x90
728x90