유의수준
은 보통 0.05 또는 0.01로 설정됨"타이타닉 호에 탑승한 남성 승객들과 여성 승객들의 생존율이 같다"
import pandas as pd
import scipy as stats
# 데이터 가져오기
titanic_df=pd.read_csv('../data/Titanic_data.csv')
# 남성 승객과 여성 승객의 생존 여부에 따른 데이터 프레임 생성
male_df=titanic_df[titanic_df['Sex']=='male']
female_df=titanic_df[titanic_df['Sex']=='female']
# .mean()
male_survival_rate=male_df['Survived'].mean()
female_survival_rate=female_df['Survived'].mean()
print(male_survival_rate)
print(female_survival_rate)
# t-검정
t,p=stats.ttest_ind(male_df['Survived'],female_df['Survived'])
alpth=0.05
if p<alpth:
print(f'p-value : {p:.4f}, 귀무 가설 기각')
else:
print(f'p-value : {p:.4f}, 귀무 가설 채택')
0.18890814558058924
0.7420382165605095
p-value : 0.0000, 귀무 가설 기각
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
# 가상 데이터 생성
data={
'Gender' : ['M','M','M','M','F','F','F','F'],
'Smoker' : ['Yes','No','No','Yes','Yes','No','No','Yes'],
'Count' : [20,80,40,60,40,160,80,120]
}
df=pd.DataFrame(data)
print(df)
# 데이터 프레임을 이용한 분할표 생성
table=pd.pivot_table(df,values='Count',index='Gender',columns='Smoker')
print(table)
# chi2_contingency
stat,p,dof,expected=chi2_contingency(table)
alpha=0.05
if p<alpha:
print(f'p-value:{p:.4f}, 귀무가설 기각')
else :
print(f'p-value:{p:.4f}, 귀무가설 채택')
Gender Smoker Count
0 M Yes 20
1 M No 80
2 M No 40
3 M Yes 60
4 F Yes 40
5 F No 160
6 F No 80
7 F Yes 120
Smoker No Yes
Gender
F 120 80
M 60 40
p-value:1.0000, 귀무가설 채택
F-통계량
을 사용하여 검정, 각 그룹의 평균값들의 분산과 그룹 내 오차의 분산 비율로 계산됨import pandas as pd
import numpy as np
# 가상의 데이터 셋 생성
np.random.seed(1)
data={
'A':np.random.randint(1,6,10),
'B':np.random.randint(1,6,10),
'C':np.random.randint(1,6,10),
}
df=pd.DataFrame(data)
print(df)
# 일원 분산 분석 수행
from scipy.stats import f_oneway
f_stat,p_val=f_oneway(df['A'],df['B'],df['C'])
print('One-way ANOVA')
print('=============')
print(f'F-statistic: {f_stat:.4f}')
print(f'p-value: {p_val:.4f}')
alpha=0.05
if p_val<alpha:
print("귀무 가설 기각")
else:
print("귀무 가설 채택")
A B C
0 4 2 5
1 5 3 2
2 1 5 2
3 2 3 1
4 4 5 2
5 1 4 2
6 1 5 2
7 2 3 2
8 5 5 1
9 5 3 5
One-way ANOVA
=============
F-statistic: 2.2966
p-value: 0.1199
귀무 가설 채택
F-검정
은 분산 분석을 실시한 후 각 집단 간 평균 차이가 크게 나탔는지 여부를 검정import pandas as pd
import seaborn as sns
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
# 데이터 불러오기
titanic_df=pd.read_csv('../data/Titanic_data.csv')
# 이원 분산 분석 모델 생성
model=ols('Survived~C(Sex)+C(Pclass)+C(Sex):C(Pclass)',titanic_df).fit()
# 분산 분석 실행
annova_results =anova_lm(model,typ=2)
#시각화
sns.catplot(x='Sex',y='Survived',hue='Pclass',data=titanic_df,kind='bar')
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터 셋 load
titanic=sns.load_dataset('titanic')
print(titanic)
# pointplot 생성
sns.pointplot(x='sex',y='survived',hue='pclass',data=titanic)
plt.legend(title='Pclass',loc='best')
plt.title('Survived Rate by Sex and Pclass')
survived pclass sex age sibsp parch fare embarked class \
0 0 3 male 22.0 1 0 7.2500 S Third
1 1 1 female 38.0 1 0 71.2833 C First
2 1 3 female 26.0 0 0 7.9250 S Third
3 1 1 female 35.0 1 0 53.1000 S First
4 0 3 male 35.0 0 0 8.0500 S Third
.. ... ... ... ... ... ... ... ... ...
886 0 2 male 27.0 0 0 13.0000 S Second
887 1 1 female 19.0 0 0 30.0000 S First
888 0 3 female NaN 1 2 23.4500 S Third
889 1 1 male 26.0 0 0 30.0000 C First
890 0 3 male 32.0 0 0 7.7500 Q Third
who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
4 man True NaN Southampton no True
.. ... ... ... ... ... ...
886 man True NaN Southampton no True
887 woman False B Southampton yes True
888 woman False NaN Southampton no False
889 man True C Cherbourg yes True
890 man True NaN Queenstown no True
[891 rows x 15 columns]
Text(0.5, 1.0, 'Survived Rate by Sex and Pclass')