제공된 데이터(data/Titanic.csv)는 타이타닉호의 침몰 사건에서 생존한 승객 및 사망한 승객의 정보를 포함한 자료이다. 아래 데이터를 이용하여 생존 여부(Survived)를 예측하고자 한다. 각 문항의 답을 【제출 형식】에 맞춰 답안 작성 페이지에 입력하시오. (단, 벌점화(penalty)는 부여하지 않는다.)

① Gender와 Survived 변수 간의 독립성 검정을 실시하였을 때, 카이제곱 통계량은? (반올림하여 소수 셋째 자리까지 계산)
② Gender, SibSp, Parch, Fare를 독립변수로 사용하여 로지스틱 회귀모형을 실시하였을 때, Parch 변수의 계수값은? (반올림하여 소수 셋째 자리까지 계산)
③ 위 ②번 문제에서 추정된 로지스틱 회귀모형에서 SibSp 변수가 한 단위 증가할 때 생존할 오즈비(Odds ratio) 값은? (반올림하여 소수 셋째 자리까지 계산)
【제출 형식】
㉠ 소수 넷째 자리에서 반올림하여 소수 셋째 자리까지만 계산
Github 페이지의 Titanic.csv를 사용합니다.
Titanic.csv의 'Sex'를 'Gender'로 변경합니다.
import pandas as pd
df = pd.read_csv("Titanic.csv")
# 1. Gender와 Survived 변수 간 독립성 검정
# 교차표 생성
ct = pd.crosstab(df['Gender'], df['Survived'])
# 독립성 검정
from scipy import stats
# print(stats.chi2_contingency(ct))
print(f'카이제곱 통계량: {round(stats.chi2_contingency(ct).statistic, 3)}')
# 2. Gender, SibSp, Parch, Fare를 독립변수로 사용해 생성한 로지스틱 회귀 모델의 Parch 변수 계수
from statsmodels.formula.api import logit
model = logit('Survived ~ Gender + SibSp + Parch + Fare', df).fit()
# print(model.summary())
print(f'Parch 변수 계수: {round(model.params["Parch"], 3)}')
# 3. 2번 모델에서 SibSp가 한 단위 증가할 때 생존할 오즈비
import numpy as np
# print(model.params)
print(f'SibSp가 한 단위 증가할 때 생존할 오즈비: {round(np.exp(model.params["SibSp"]), 3)}')
🔗 제3유형 문제
import pandas as pd
df = pd.read_csv("data/bcc.csv")
# 1. 로그 리지스틴의 분산에 대한 F-통계량 (분자의 자유도가 분모의 자유도보다 큼)
print('===== 1번 =====')
df['log_resistin'] = np.log(df['Resistin'])
group1 = df[df['Classification'] == 1]['log_resistin']
group2 = df[df['Classification'] == 2]['log_resistin']
var1 = group1.var() # np.var(group1, ddof=1)
var2 = group2.var() # np.var(group2, ddof=1)
dof_1 = len(group1) - 1 # 51 (분모)
dof_2 = len(group2) - 1 # 63 (분자)
f_stat = var2/var1
print(f'F 통계량: {round(f_stat, 3)}')
# 2. 두 집단의 로그 리지스틴 값에 대한 합동 분산 추정량
print('\n===== 2번 =====')
n1 = len(group1)
n2 = len(group2)
pooled_var = ((n1-1)*var1 + (n2-1)*var2) / (n1+n2-2)
print(f'합동 분산 추정량: {round(pooled_var, 3)}')
# 3. 두 집단의 로그 리지스틴에 대한 독립표본 t-검정 p-value
print('\n===== 3번 (ttest_ind 함수 사용) =====')
from scipy import stats
print(f'p-value: {round(stats.ttest_ind(group1, group2, equal_var=True).pvalue, 3)}')
print('\n===== 3번 (p-value 직접 계산) =====')
import numpy as np
mean1 = group1.mean()
mean2 = group2.mean()
t_stat = (mean1 - mean2) / np.sqrt(pooled_var * (1/n1 + 1/n2))
p_value = 2*(1-stats.t.cdf(abs(t_stat), df=n1+n2-2))
print(f'p-value: {round(p_value, 3)}')