빅데이터 분석기사/작업 유형 3 (stats)

t-test 실습, 분류모델에서 t-test 활용 함수

유방울 2023. 6. 10. 12:12

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')