t-test
실시전에 정규성 및 등분산성이 만족되어야 함
One sample t-test
20대 평균 수면시간에 대한 one samle t-test
유의수준 0.05 사용
숫자 소수점 아래 4번째 자리까지 표시
one sample이기 때문에 등분산성 검정 생략 가능
# 정규성 검정
from scipy.stats import shapiro
statistic, pvalue = shapiro(pd['stime20s'])
print(round(statistic, 4), round(pvalue, 4))
print('기각' if pvalue <0.05 else '채택')
표현 1
round(sllep, 4)
표현2 f 플롯 사용하면 0이어도 지정한 자리까지 0으로 나옴
f'{sleep:.04}'
sleep = df['stime20s'].mean()
print(round(sleep, 4), f'{sleep:.04}')
6.15 6.1500
가설 1
0.0023으로 기각
평균수면이 6시간이다!
# 가설 alternative='two-sided'
# 귀무 : 20대는 평균 수면이 6시간
# 대립 : 20대는 평균 수면이 6시간이 아니다
from scipy.stats import ttest_1samp
popmean = 5
statistic, pvalue = ttest_1samp(df['stime20s'],popmean, alternative='two-sided')
print(f'{statistic:.4},{pvalue:.4}')
3.5204 0.0023
가설결과 함수 동일해서 생략!
가설 2 alternative='less'
귀무 : 20대 여성은 평균수면이 6보다 크거나 같다.
대립 : 작다
기각 -> 같다.
채택 -> 같다.
가설 3 alternative='greater'
귀무 : 20대는 평균 수면시간이 작거나 같다.
대립 : 크다
기각 -> 작거나 같다.
채택 -> 크다.
95% 신뢰구간 구하기
from scipy.stats import t, sem
target = df['stime20s']
lower, upper = t(df=len(target)-1).interval(0.95, loc=target.mean(), scale=sem(target))
print(f'{lower:.4f} ~ {upper:.4f}')
two sample t-test
두집단 a,b의 평균 차이가 유의미한지 확인
등분산이 아닌 경우 Welch's t-test 수행 -> ttest_inp(a,b, equl_var=False)
# 분리하기
gA = df.loc[:,'stime20s']
gB = df.loc[:,'stime40s']
# 정규성 검정
from scipy.stats import shapiro
statistic, pvalueA = shapiro(gA)
statistic, pvalueB = shapiro(gB)
# 등분산 검정
from scipy.stats import levene, fligner, bartlett
print(f'{pvalueA:.4f},{pvalueB:.4f}')
statisticA, pvalueA = levene(gA,gB)
statisticB, pvalueB = fligner(gA,gB)
statisticC, pvalueC = bartlett(gA,gB)
print(f'{pvalueA:.4f},{pvalueB:.4f},{pvalueC:.4f}')
가설 1 alternative='two-sided'
귀무 : ga,gb 평균 차이가 0이다. 평균이 동일하다
대립 : 0이 아니다, 평균이 동일하지 않다.
from scipy.stats import ttest_ind
statistic, pvalue = ttest_ind(groupA, groupB)
print(f'statistic: {statistic:.4f}, pvalue: {pvalue:.4f}')
paired t-test
gA = df.loc[df['group']==1,'extra']
gB = df.loc[df['group']==2,'extra']
정규성 검증 -> 비분산성 검증 -> 시이
ttest_rel 사용
귀무 : 평균이 같다.
대립 : 평균이 다르다
statistic이 양수 -> 그룸a 평균이 크고 b가 작음
음수 -> a가 작고 그룹 b평균이 큼
분류 모델에서 활용
정규성 만족안 하면 wilcoxon rank sum test, mann-whitney U test 사용
여기에서는 t-test 시용
정규성 만족 안할 때 등분산성 검정은 levene 사용
from scipy.stats import shapiro, kstest, bartlett
from scipy.stats import ttest_ind
# 피쳐 연속형 변수
feature = 'Cost_of_the_Product'
# condition 범주형 변수 0과 1
condition_0 = data['Reached.on.Time_Y.N'] == 0
condition_1 = data['Reached.on.Time_Y.N'] == 1
# 그룹 0, 1
group_0 = data.loc[condition_0.'feature']
group_1 = data.loc[condition_1.'feature']
# 정규성 검정 -> 만족 안 함
statistic, pvalue = shapiro(group0)
print(f'shapiro - statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
statistic, pvalue = shapiro(group1)
print(f'shapiro - statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
# n이 5000보다 크기 때문에 kstest 사용
# 만족 안 함
statistic, pvalue = kstest(group0)
print(f'kstest - statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
statistic, pvalue = kstest(group1)
print(f'kstest - statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
# 등분산성 검정
statistic, pvalue = bartlett(group0, group1)
print(f'bartlett - statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
# 가설 검정
statistic, pvalue = ttest_ind(group0, group1)
print(f'{statistic:.4f},{pvalue:.4f}')
# 결론
print('기각' if pvalue <0.05 else '채택')
#
mean_g0, mean_g1 = group0.mean(), group1,mean()
print(f'{mean_g0:.4f}, {mean_g1:.4f}')
Cost_of_the_Product (4436,) (6563,)
shapiro - statistic:0.9719, pvalue:0.0000
shapiro - statistic:0.9723, pvalue:0.0000
kstest - statistic:1.0000, pvalue:0.0000
kstest - statistic:1.0000, pvalue:0.0000
bartlett - statistic:0.2039, pvalue:0.6516
statistic:7.7378, pvalue:0.0000
귀각
214.4986, 207.2892
분류 때 사용할 피처를 선택하기 위함
성능 향상시키기 위해서는 서로 다른 피처를 사용하면 유의미함
가설 검정 후 기각되어서 평균이 다르면 -> 성능 높이는 데에 역할
평균이 같으면 큰 의미없
# feature : 연속형 변수
# target : 범주형 변수
def my_ttest_ind(data, feature, target):
# 분할
g0 = data.loc[data[target] ==0, 'feature']
g1 = data.loc[data[target] ==1, 'feature']
# 가설 검정
statistic, pvalue = ttest_ind(g0, g1)
print(f'statistic:{statistic:.4f}, pvalue:{pvalue:.4f}')
# 확인
print('기각! 다르므로 유의미' if pvalue < 0.05 else '채택! 같으므로 무의미')
for feature in ['Cost_of_the_Product', 'Weight_in_gms', 'Discount_offered']:
print(feature)
my_ttest_ind(data, feature, 'Reached.on.Time_Y.N')
'빅데이터 분석기사 > 작업 유형 3 (stats)' 카테고리의 다른 글
대립가설 기준, loc 인덱싱 (0) | 2023.06.22 |
---|---|
사후검정 이론 및 실습 - 시험 안나올 가능성 높음 (0) | 2023.06.10 |
ANOVA 이론 및 실습 (0) | 2023.06.10 |
T-test 이론 (0) | 2023.06.08 |