카이제곱 검정(교차 분석)
카이제곱 분포에 기초한 통계적 방법이다.
관찰된 빈도가 기대되는 빈도와 의미있게 다른지의 여부를 검정하기 위해 사용되는 검정방법이다.
범주형 자료(명목척도, 서열척도)간의 관계를 알아보고자 할 때 사용된다.
적합도 검정, 독립성 검정, 동질성 검정에 사용된다.
교차분석표
두 범주형 변수를 교차해 데이터의 빈도를 표 형태로 나타낸 것이다.
두 변수를 분류한 분할표는 이차원 분할표, 세 변수를 이용한 경우 삼차원 분할표라고 한다.
일반적인 분할표 형태
독립변수(x) | 종속변수(y) | 행합계 | ||
열합계 |
예를 들어, 지역별 전자제품 브랜드 선호도를 교차분석표로 작성한다고 가정해보면
a사 | b사 | c사 | 계 | |
한국 | 30 | 55 | 15 | 100 |
미국 | 40 | 60 | 20 | 120 |
유럽 | 40 | 35 | 15 | 90 |
계 | 110 | 150 | 50 | 300 |
-> 우리나라와 미국에서는 b사 브랜드 선호도가 높은 반면, 유럽에서는 a사 브랜드의 선호도가 높다고 할 수 있다.
카이제곱 검정 방법
1. 적합도 검정
하나의 범주형 변수가 특정 분포를 따르는지 검정한다.
실험 데이터를 관측도수, 예측값을 기대도수라고 부른다.
예측 값이 옳은지 관측값과 비교하여 검정하는 것이다.
2. 독립성 검정
두 개의 변수에 의해 범주화 되었을 때 이 두 변수들의 관계가 독립적인지 아닌지 확인한다.
관계가 독립적이라면 변수들 사이에 유의한 관계가 없다고 판단한다.
두 범주형 변수 간에 관계가 있는지 없는지를 나타내지만 강도는 알 수 없다.
3. 동질성 검정
관측값들이 정해진 범주 내에서 서로 비슷하게 나타나고 있는지를 검정한다.
두 집단의 분포가 동일한 모집단에 추출된 것인지를 검정한다.
검정통계량을 계산할 때는 교차표를 촬용하며 계산 및 검증법은 독립성 검정과 같다.
제 1종 오류와 제 2종 오류
H0 채택 (H1 기각) | H0 기각 (H1 채택) | |
H0 사실 | 올바른 결정 | 제 1종 오류 |
H0 거짓 | 제 2종 오류 | 올바른 결정 |
제 1종 오류 : 귀무가설(H0)이 사실인데 틀렸다고 결정하는 오류
제 2종 오류 : 귀무가설이 사실이 아님에도 불구하고 귀무가설이 옳다고 결정하는 오류
*절대적인 건 아니지만 제 1종 오류를 범해선 안된다 (제2종 오류보다 더 조심해야함)
문제1 <적합도 검정>
검정 방법의 순서
1. 관찰빈도(observed), 기대빈도 설정(expected) -> 2. 귀무가설, 대립가설 설정 -> 3. 통계량(카이제곱량), p-value 확인 -> 4. 귀무가설 or 대립가설 결정
귀무가설 : 모든 혈액형이 같은 비율이다.
대립가설 : 모든 혈액형의 비율이 같지 않다.
#적합도 검정을 위한 scipy.stats 불러오기
import scipy.stats as stats
import numpy as np
#관찰값
observed = np.array([38, 43, 10, 5]) #[5000, 4000, 3800, 4200, 7000]
# 기대값 - 동일 비율 가정
total = 96
expected = np.array([total/4, total/4, total/4, total/4]) # []
#귀무가설 : 핼액행의 비율이 같다.
#대립가설 : 혈액형의 비율이 같지 않다.
# 카이제곱 검정 수행
chi2, p_value = stats.chisquare(f_obs=observed, f_exp=expected)
# 유의수준 설정
alpha = 0.05
# 결과 출력
print(f"Chi2 값: {chi2}")
print(f"p-값: {p_value}")
if p_value < alpha:
print("귀무가설 기각. 혈액형이 같은 비율이라고 할 수 없다.")
else:
print("귀무가설 채택. 혈액형이 같은 비율이라고 할 수 있다.")
문제2 <적합도 검정>
귀무가설 : 혈액형이 4:4:1:1 비율로 분포한다.
대립가설 : 혈액형이 4:4:1:1 비율이 아니다.
# 기대값 - 이번엔 4:4:1:1 비율에 따라 계산
expected_ratios = np.array([4, 4, 1, 1])
expected = expected_ratios / expected_ratios.sum() * total
#귀무가설 : 4:4:1:1의 비율로 분포한다.
#대립가설 : 4:4:1:1의 비율이 아니다.
# 카이제곱 검정 수행
chi2, p_value = stats.chisquare(f_obs=observed, f_exp=expected)
# 유의수준 설정
alpha = 0.05
# 결과 출력
print(f"Chi2 값: {chi2}")
print(f"p-값: {p_value}")
if p_value < alpha:
print("귀무가설을 기각. 혈액형이 4:4:1:1의 비율로 분포한다 할 수 없다.")
else:
print("귀무가설을 채택. 혈액형이 4:4:1:1의 비율로 분포한다.")
문제3 <동질성 검정>
귀무가설 : 새로운 상품의 시장에서의 위치는 도시와 무관하다.
대립가설 : 새로운 상품의 시장에서의 위치는 도시에 따라 차이가 있다.
observed = np.array([[36, 55, 109], # 도시 1
[45, 56, 49], # 도시 2
[54, 78, 168]]) # 도시 3
# 카이제곱 독립성 검정
chi2, p_value, dof, expected = stats.chi2_contingency(observed)
#dof: degree of freedom
#expected: 기대값
# 유의수준 설정
alpha = 0.05
# 결과 출력
print(f"Chi2 값: {chi2}")
print(f"p-값: {p_value}")
print(f"자유도: {dof}")
print("기대값 행렬:")
print(expected)
if p_value < alpha:
print("귀무가설 기각. 새로운 상품의 시장에서의 위치는 도시에 따라 차이가 있다.")
else:
print("귀무가설 채택.. 새로운 상품의 시장에서의 위치는 도시에 따라 차이가 없다.")
문제4 <독립성 검정>
귀무가설 : 예산 삭감과 특정 단체 가입 여부는 관계가 있다.
대립가설 : 예산 삭감과 특정 단체 가입 여부는 관계가 없다.
<독립성 검정>
observed = np.array([[112, 36, 28], #특정단체가입
[84, 68, 72]]) #특정단체비가입
chi2, p_value, dof, expected = stats.chi2_contingency(observed)
alpha = 0.05
# 결과 출력
print(f"Chi2 값: {chi2}")
print(f"p-값: {p_value}")
print(f"자유도: {dof}")
print("기대값 행렬:")
print(expected)
if p_value < alpha:
print("귀무가설 기각. 예산 삭감과 특정 단체 가입 여부는 관계가 있다.")
else:
print("귀무가설 채택.. 예산 삭감과 특정 단체 가입 여부는 관계가 없다.")
문제5
1. 표본크기를 늘리면 추정이 정확해져서 신뢰구간이 좁아진다.
2. p값이 0.05보다 크면 귀무가설은 채택된다.
3. 제1종오류가 감소되면 배타는 커진다.
4. p값이 단측검정일 때 양측검정보다 작다.
문제6
#(1)제1종오류 확률
# H0: 모평균은 65이다.
# H1: 모평균은 65보다 작다.
n = 64
mu = 65 #모평균
sigma = 5 #표준편차
#표본평균의 표준오차
se = sigma / (n ** 0.5)
#제1종오류 확률: P(표본평균 <= 64 | H0이 참일 때)
z_score = (64 - mu)/se
type1_prob = stats.norm.cdf(z_score) #cdf: 누적분포확률
print(f"제1종 오류 확률: {type1_prob}") #5.48%
#(2)제2종오류 확률
mu2 = 63.5 #모평균
z_score = (64 - mu2) / se
type2_prob = 1 - stats.norm.cdf(z_score) #cdf: 누적분포확률(Cumulative distribution function)
print(f"제2종 오류 확률: {type2_prob}")
#(3) 유의수준 1%일때, 즉 상위 1%일때의 임계값인 c 찾기
alpha_new = 0.01 #하위가 아닌, 상위분위수! 따라서, ppf함수에 0.99가 들어가야합니다!!
z_alpha = stats.norm.ppf(1-alpha_new) #ppf: Percent Point Function, 누적분포함수의 역함수. 즉, 누적확률이 나오는 우측단측검정의 z값을 먼저 찾기
c = mu2 + z_alpha * se #z값에 대해 임계값 계산해주기
print(f"c 값: {c}")
'스터디' 카테고리의 다른 글
[아티클 스터디] 머신러닝 10가지 알고리즘2 (랜덤 포레스트, XG부스트, 라이트GBM, K-평균 군집화, 주성분 분석) (0) | 2024.08.20 |
---|---|
[아티클 스터디] 머신러닝 10가지 알고리즘1 (선형, 로지스틱, knn, 나이브베이즈, 의사결정나무) (0) | 2024.08.20 |
[아티클 스터디] 머신러닝이란? (0) | 2024.08.13 |
[통계 스터디] 정규분포, 스튜던트 t분포 (0) | 2024.08.08 |
[아티클 스터디] 빅데이터 시대, 진짜 데이터 활용 능력이란? (데이터 문해력) (2) | 2024.07.23 |