Statistics/Concepts(+codes)

Two-Samples 𝜒2 test

metamong 2022. 5. 3.

✈️ 저번 시간에 여러 statistical hypothesis test 중 chi-square test 첫 번째인 'one sample 𝜒2 test'에 대해서 배웠다.

✈️ 이젠 그 두 번째! 훨씬 더 많이 쓰이는 two-samples 𝜒2 test에 대해 다루려고 함!

 

 

𝜒2 distribution + One-Sample 𝜒2 test

😽 저번 시간에 parametric vs. non-parametric 차이에 대해서 배웠다. 😽 이번 포스팅에는 non-parametric test를 처음으로 배워보려 함! 카이제곱 검정 첫번째 test - 적합도 검정에 대해서 알아보ZA! 🤩 (독

sh-avid-learner.tistory.com

* test of independence 검정원리

✌🏿 2개의 범주형 변수가 있다고 가정하고 이를 요약하는 rxc의 2차원 분할표가 존재한다

👏🏿 이 때 두 변수가 서로 독립인 경우 예상되는 각 셀 별 기대빈도를 도출한다

🤞🏿 도출된 각 셀 별 기대빈도 & 각 셀 별 빈도의 차이의 크기를 이용하여 검정!

(차이가 작으면 두 변수는 독립 / 차이가 크면 두 변수는 독립이 아님 - 서로 연관이 있다)

🤙🏿 기대빈도 계산> i행과 j열 범주가 독립인 경우

(ex) P[X=1 & Y=2] = P[X=1] x P[Y=2] (독립사건 곱셈규칙) 결과에 전체 n을 곱한 결과 = 기대빈도)

 

* test of independence - 카이제곱 독립성 검정 절차

1> 가설검정

H0) 두 범주형 변수는 서로 독립이다 (관계가 없다) = 빈도와 기대빈도의 차이가 작다

H1) 두 범주형 변수는 독립적인 관계가 아니다 (관계가 있다)

 

2> 검정통계량 구하기

→ 1) 귀무가설이 사실인 경우 + 2) 표본의 수가 충분히 큰 경우 (모든 기대빈도 5 이상)

→ 빈도 + 기대빈도 차의 제곱(음수도 있어서) 형태로 모든 셀에 대해 더함

{(빈도 + 기대빈도 차)^2}/기대빈도 값을 '카이제곱 분포'로 표현

 

 

귀무가설이 사실이라면, 빈도와 기대빈도 차이는 작으므로 검정통계량 X값은 작게 표현됨 (표본 추출할 때마다 달라짐)

☆ 표본의 수가 크다면 카이제곱 분포로 표현

자유도는 (r-1)(c-1)이다 (각 행별 자유도는 행 개수에서 1을 뺀 것)

 

3> 유의확률 계산 & 검정

 

💙 p-value = '귀무가설 H0가 사실일 때, 검정통계량 X의 표본분포(위 식)에서, x0(표본 자료로부터 계산된 검정통계량의 값)보다 더 큰 값이 나올 확률' (즉 p-value는 대립가설이 참이 될 확률 - 위 내용 참조!)

(귀무가설 H0이 사실이라는 것은, 두 범주형 변수가 독립인 뜻 - 즉 빈도와 기대빈도의 차이가 작다는 것으로 위 표본분포의 X값이 작게 측정 - 따라서! p-value는 그 반대로 X값이 더 커지는 방향이어야 H0이 기각된다! - 오른꼬리 검정)

 

💙 귀무가설의 방향은 오른쪽

 

💙 유의수준(significance level) 100α%의 검정법

'자료로부터 계산된 유의확률(p-value)가 주어진 유의수준 α보다 작은 경우 귀무가설 H0 기각'

 

Q 예제

책상을 생산하는 A기없은 생산된 책상에 대해 네 부분의 결함 여부(상판, 다리, 서랍, 도색)를 체크하여 불량품을 선별하고 있다. 그런데 책상이 어떤 생산라인을 통해 생산되었는 지가 결함유형에 영향을 미칠 것이라는 주장이 있어 이를 확인하고자 이번 달에 생산된 책상 중 결함이 있었던 300개에 대하여 생산라인과 결함 유형을 아래와 같이 분류해 보았다. 이 자료를 토대로 생산라인과 결함 유형은 무관한 것인지에 관하여 유의수준 5%로 검정하여라

 

 

1> 가설검정

→ H0) 결함 유형과 생산라인은 서로 독립이다 / Ha) 결함 유형과 생산라인은 서로 독립이 아니다

 

2> 검정통계량과 표본분포 계산하기

→ 귀무가설 H0이 사실이라면

 

- (왼) 검정통계량 표본분포 / (오) 기댓값 모음 -

 

→ 검정통계량 X는 위(왼)와 같은 표본분포를 따른다

 

🏄🏿‍♂️ 기대빈도 계산 예시

ex) 생산라인1에서 나온 상판결함의 기대빈도 = (생산라인 중 생산라인 1일 확률) x (결함유형 중 상판결함일 확률) x 전체 표본 수

= (80/300) x (63/300) x 300 = 16.8

→ 이렇게 각각의 기대빈도를 모두 계산해 위로 나타낸 것!

 

🏄🏿‍♂️ 위 검정통계량 X의 식에 의해 검정통계량을 구해보면

→ {(11 - 16.80)^2 / 16.80} + {(15 - 19.73)^2 / 19.73} + ... = 17.847

 

3> 유의확률 p-value 구하기 & 결론

 

🏄🏿‍♂️ 유의확률 p-value는 P[X > 17.847] = 0.0066

 

🏄🏿‍♂️ 결론으로 p-value는 유의수준 0.05보다 작으므로 귀무가설이 기각 - 결함유형과 생산라인은 연관되어 있다!

* w/ code

💓 scipy.stats.chi2_contingency docu() 💓

 

scipy.stats.chi2_contingency(observed, correction=True, lambda_=None)

 

'Chi-square test of independence of variables in a contingency table. This function computes the chi-square statistic and p-value for the hypothesis test of independence of the observed frequencies in the contingency table. The expected frequencies are computed based on the marginal sums under the assumption of independence'

 

'An often quoted guideline for the validity of this calculation is that the test should be used only if the observed and expected frequencies in each cell are at least 5. This is a test for the independence of different categories of a population. The test is only meaningful when the dimension of observed is two or more. Applying the test to a one-dimensional table will always result in expected equal to observed and a chi-square statistic equal to 0. This function does not handle masked arrays, because the calculation does not make sense with missing values. Like stats.chisquare, this function computes a chi-square statistic; the convenience this function provides is to figure out the expected frequencies and degrees of freedom from the given contingency table.

 

RETURNS>

1) 검정통계량

2) p-value

3) 자유도

4) expected frequencies table (기댓값들의 모음 table)

 

Q 위 문제를 chi2_contingency를 이용해서 풀어보자

A

 

from scipy.stats import chi2_contingency
chi2_contingency(np.array( [[11, 25, 27], [15, 31, 28], [44, 24, 52], [10, 17, 16]] ))

 

RETURN 결과>

더보기

(17.8473725144853,
 0.006625156046928181,
 6,
 array([[16.8       , 20.37      , 25.83      ],
        [19.73333333, 23.92666667, 30.34      ],
        [32.        , 38.8       , 49.2       ],
        [11.46666667, 13.90333333, 17.63      ]]))

 

* 결과 네 개 모두 알맞게 return되었으며, p-value가 0.05보다 작으므로 H0 기각됨!

 

+ 추가) 빈도 기댓값들만 따로 구할 수 있는 함수 있음!

 

scipy.stats.contingency.expected_freq(observed)

 

🟢 () 안에 원하는 2차원 numpy 배열을 집어넣으면 expected frequencies table 나옴 🟢


→ 2차원 frequency table을 따로 계산하기에는 무리가 있으므로 pd.crosstab()을 이용해 두 categorical variable간의 빈도를 계산한 table을 집어넣어 산출한다

 

★ pandas.crosstab() docu ★

https://pandas.pydata.org/docs/reference/api/pandas.crosstab.html

 

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)

 

'Compute a simple cross tabulation of two (or more) factors. By default computes a frequency table of the factors unless an array of values and an aggregation function are passed.'

 

→ expected frequency table을 구하기 이전에, 실제 두 data간의 frequency table을 먼저 구해야 카이제곱 검정을 시행할 수 있으므로 crosstab()은 MUST!

 

- coursera에서 배운 crosstable (더 정확하게는 contingency table이라 해야 맞음) -

 

 

Data Analysis with Python (1/2) (from Coursera)

1. Importing Datasets * Why Data Analysis? - data is everywhere - helps us answers from data - discovering useful info / answering questions / predicting future or the unkown * Understanding the..

sh-avid-learner.tistory.com

 

ex> 예를 들어 주어진 dataframe의 maritial status & education 두 categorical variables 간의 관계에 대해 카이제곱 검정을 하고 싶으면 아래와 같은 code를 짜면 된다 (아래는 p-value 산출!) ☆pd.crosstab☆ 사용

 

chi2_contingency(pd.crosstab(df['Education'],df['Marital_Status']))[1]

 

chi square test 개념 끝!


* 썸네일 출처) https://www.amazon.com/Expertif-Square-the-Number-Quiz/dp/B01N421V6A

* 출처1) ProDS (초급+중급)1

* 출처2) https://www.statisticshowto.com/what-is-a-contingency-table/

댓글