[업무 지식]/Statistics

[카이제곱검정] 가설검정

에디터 윤슬 2024. 11. 16. 12:31

카이제곱 검정

# 카이제곱 검정 확인 사항
    #1. 범주형 데이터
    #2. 관측값은 독립적
    #3. 각 셀의 기대빈도(expected frequency)는 5 이상이어야 함
    #4. 샘플 크기가 충분해야 함
    
print('귀무가설:', '''
색상과 계절은 독립적이다''')
print('대립가설:', '''
색상과 계절은 독립적이지 않다\n''')

chi_table = pd.crosstab(stat_df['Color'], stat_df['Season'])
result = chi2_contingency(chi_table)

print("카이제곱 통계량:", result.statistic.round(2))
print("p-value:", result.pvalue.round(2))
print("자유도:", result.dof)
print("기대빈도:\n", result.expected_freq)

if result.pvalue.round(2) > 0.05:
    print('귀무가설 채택: 색상과 계절은 독립적입니다')
else:
    print('대립가설 채택: 색상과 계절은 독립적이지 않습니다')

 

귀무가설: 
색상과 계절은 독립적이다
대립가설: 
색상과 계절은 독립적이지 않다

카이제곱 통계량: 64.65
p-value: 0.72
자유도: 72
기대빈도:
 [[36.75       37.65461538 35.99615385 36.59923077]
 [41.75       42.77769231 40.89358974 41.57871795]
 [38.         38.93538462 37.22051282 37.84410256]
 [35.25       36.11769231 34.52692308 35.10538462]
 [38.25       39.19153846 37.46538462 38.09307692]
 [41.5        42.52153846 40.64871795 41.32974359]
귀무가설 채택: 색상과 계절은 독립적입니다
  • 히트맵 시각화
# 히트맵 시각화

plt.figure(figsize=(10, 6))
sns.heatmap(data = chi_table, annot=True, fmt='d', cmap='YlGnBu')
plt.title('color & season expected frequency')
plt.show()

 

빈도표 그리기

# pandas 라이브러리의 crosstab 함수를 통해, 두 범주형 자료의 빈도표를 생성

result = pd.crosstab(df['Gender'], df['Size'])
result

가설검정 1

# 카이제곱검정을 stat 함수를 통해 구현
# chi2_contingency를 통해, 카이제곱통계량, p-value를 출력

stats.chi2_contingency(observed = result)

# 각 값들을 별도로 보기
# 카이제곱 검정통계량, pvalue, 자유도 확인

print('검정통계량:', stats.chi2_contingency(observed=result)[0])
검정통계량: 6.615107840598039

print('p-value:', stats.chi2_contingency(observed=result)[1])
p-value: 0.08523181331915766


# p-value 는 우연에 의해 나타날 확률에 대한 지표.
# p-value가 0.05 보다 크다 = 우연히 일어났을 가능성이 높다 = 인과관계가 없다고 추정 
# 여기서 p-value 값은 0.05 보다 크므로, 연관성이 없다고 추정. 
# 대립가설 기각
# 귀무가설 채택
# 귀무가설: 성별과 구매Size 에는 관련성이 없을 것이다 (독립적일 것이다)

 

가설검정 2

#자유도와 유의수준을 통해 귀무가설 기각 여부를 판단하기도 합니다. 
#(변수1 그룹의 수-1)*(변수2 그룹의 수-1) 
#(성별 2개 - 1 ) * (옷 사이즈 4개 -1 ) 
# 1*3 = 3 이 도출. 

print('자유도:', stats.chi2_contingency(observed=result)[2])
자유도: 3
# x 축은 유의수준, y 축은 자유도. 
# 자유도3, 유의수준을 0.05 로 본다면, 7.81 검정통계량. 
# 구한 카이제곱 검정통계량은 6.615 이므로 7.81 보다 작다.
# 표에 명시된 기준보다 값이 작을 경우 대립가설을 기각. 
# 대립가설 기각