자격증/빅데이터분석기사

[빅분기 실기] 작업형 3유형 : 카이제곱 검정

기록자_Recordian 2025. 5. 31. 11:07
728x90
반응형
이전 내용
 

[빅분기 실기] 작업형 3유형 : 분산분석

이전 내용 [빅분기 실기] 작업형 3유형 : 가설검정이전 내용 [빅분기 실기] 작업형 2유형 : 회귀 실습이전 내용 [빅분기 실기] 작업형 2유형 : 다중 분류 실습이전 내용 [빅분기 실기] 작업형 2유형 :

puppy-foot-it.tistory.com


작업형 3유형

 

작업형 3유형은 데이터 분석 과정에서 필요한 통계학적 접근 방법을 이해하고 적용할 수 있는 능력을 평가하기 때문에, 1과 2유형보다 이론적 내용을 더 많이 포함한 시험 문제를 출제한다.

 

3유형에서는 사이파이(scipy)와 스태츠모델즈(statsmodels) 같은 통계 분석을 위한 주요 파이썬 라이브러리를 활용해 수행한다.

  • 가설검정: 주어진 데이터가 특정 가설을 지지하는지 여부를 통계적으로 검토하는 방법. 이를 통해 귀무가설과 대립가설을 설정하고 검정.
  • 분산 분석: 두 개 이상의 집단 간의 평균 차이를 검정하기 위한 통계적 기법으로, 집단 간 분산과 집단 내 분산을 비교.
  • 카이제곱 검정: 범주형 변수 간의 독립성을 검정하는 방법, 기대 빈도와 관측 빈도를 비교하여 결과 도출.
  • 회귀 분석: 하나 이상의 독립 변수가 종속 변수에 미치는 영향을 모델링하는 기법, 선형 회귀가 가장 일반적.
  • 로지스틱 회귀 분석: 이진 종속 변수를 예측하기 위해 사용되는 회귀 분석 기법, 사건의 확률을 추정하는 데 적합.

카이제곱 검정
(Chi-square test)

 

카이제곱 검정: 범주형 데이터의 관찰된 빈도와 기대된 빈도를 비교하여 두 변수 간의 독립성이나 분포의 적합성을 검정하는 방법

 

[빅데이터 분석기사] 3과목 빅데이터 모델링(3-2-2)

[목차] [빅데이터 분석기사] 시험 과목 및 주요 내용 (필기)빅데이터 분석기사 (필기) 시험 과목 및 주요 내용 출처: 데이터자격검정 (dataq.or.kr) 필기과목명 주요항목 세부항목 세세항목 빅데이터

puppy-foot-it.tistory.com

 

- 적합도 검정: 1개의 범주형 변수가 특정 분포를 잘 따르고 있는지 검정하는 데 사용

  • 귀무가설: 특정 분포를 따른다
  • 대립가설: 특정 분포를 따르지 않는다

- 독립성 검정: 2개의 변수가 서로 독립적인지, 연관이 있는지 검정하는 데 사용

  • 귀무가설: 두 범주형 변수가 독립적(서로 연관성이 없음)
  • 대립가설: 두 범주형 변수가 독립적이 아님(서로 연관성이 있음)

- 동질성 검정: 2개 이상의 집단에서 분산의 동질성을 가졌는지 검정하는 데 사용

  • 귀무가설: 모든 그룹의 분포나 비율이 동일
  • 대립가설: 모든 그룹의 분포나 비율이 동일하지 않음

카이제곱 검정 풀기

 

1. 적합도 검정 (Chi-Square Goodness-of-Fit Test)

적합도 검정은 scipy의 chisquare 사용

from scipy import stats

scipy.stats.chisquare(observed, expected, ddof, axis)
# observed: 관측된 빈도 리스트 (배열)
# expected: 기대 빈도 리스트
# ddof: 자유도 조정 (기본값 0)
# axis: 축 (기본값 0)

※ expected의 경우, 주어지지 않으면 모든 카테고리의 관측 빈도가 균일하고 관측 빈도의 평균으로 주어진다고 가정

 

Q. 주사위의 공정성 검정

한 대학생이 6면체 주사위가 공정한지 궁금해서, 주사위를 60번 던지고 나온 눈의 개수를 기록

주사위 눈 1 2 3 4 5 6 총합
관측도수 (Observed) 5 8 9 10 13 15 60

 

유의수준(0.05)를 기준으로 이 주사위가 공정하다고 주장할 수 있는지를 검정

용어 설명
카이제곱 적합도 검정 관측된 데이터가 이론적인 기대 분포에 잘 맞는지 확인하는 검정
귀무가설 (H₀) 주사위는 공정하다 (각 눈이 나올 확률은 1/6)
대립가설 (H₁) 주사위는 공정하지 않다 (적어도 하나의 눈 확률이 다르다)
기대도수 (Expected) 각 눈이 1/6 확률로 나온다면 기대되는 도수. 예: 60 × (1/6) = 10

 

# 주사위 적합도 검정
from scipy import stats

observed = [5, 8, 9, 10, 13, 15]
expected = [10, 10, 10, 10, 10, 10]

statistic, p_value = stats.chisquare(observed, expected)

print(f"검정 통계량: {statistic}, p-value: {p_value}")

if p_value < 0.05:
  print("p-value가 유의수준보다 작으므로, 귀무가설 기각 -> 주사위는 공정하지 않다")
else:
  print("p-value가 유의수준보다 크므로, 귀무가설 채택 -> 주사위는 공정하다")

항목
귀무가설 주사위는 공정하다
대립가설 주사위는 공정하지 않다
검정 통계량 (χ²) 7.0
자유도 6 - 1 = 5
유의수준 α 0.05
p-value 약 0.269
결론 p-value > 0.05 → 귀무가설 채택

2. 카이제곱 독립성 검정(Test of independence)

독립성 검정은 scipy의 chi2_contingency() 함수를 사용하여 카이제곱 통계량과 p-value를 구한다.

 

1) 교차표 기반 카이제곱 검정

from scipy.stats import chi2_contingency

stats.chi2_contingency(table, correction=True)
# table: 교차표
# correction: 연속성 보정 여부 (기본값 True)

※ 교차표는 2차원 형태의 데이터

※ correction 은 연속성 수정을 적용한 것과 적용하지 않았을 때의 통계량이 다르다. (연속성 수정 하지 않는 조건이 있다면 False, 언급이 없다면 생략 또는 True)

 

교차표 데이터가 제시된다면, 해당 내용을 교차표 데이터(데이터프레임)로 만들어야 한다.

 

Q. 성별과 마라탕 선호도의 관계

한 마라탕 업체에서 성별과 마라탕 선호도의 관련이 있는지 설문조사를 했고, 그 결과는 아래와 같다.

성별 좋아함 좋아하지 않음 총합
남자 80 30 110
여자 90 10 100
총합 170 40 210

 

성별과 마라탕 선호도 사이에 통계적으로 유의한 관계가 있는지 유의 수준 0.05를 사용하여 검정

# 카이제곱 독립성 검정
# 1. 성별과 마라탕 선호도 관계
import pandas as pd

df = pd.DataFrame({
    '좋아함': [80, 90],
    '좋아하지 않음': [30, 10]},
    index=['남자', '여자'])

df

 

from scipy.stats import chi2_contingency

# 카이제곱 검정 수행
statistic, p_value, ddof, expected = chi2_contingency(df, correction=True)

# 결과 출력
print(f"카이제곱 검정 통계량: {statistic:.4f}, p-value: {p_value:.4f}, 자유도: {ddof}, 기대 빈도: {expected}")

if p_value < 0.05:
  print("p-value가 유의수준보다 작으므로, 귀무가설 기각 -> 성별과 마라탕은 독립적이지 않다.")
else:
  print("p-value가 유의수준보다 크므로, 귀무가설 채택 -> 성별과 마라탕은 독립적이다.")

※ 기대 빈도는 관찰된 데이터가 독립적일 경우 예상되는 빈도수를 나타낸다.

  • 89.0476: 남자가 좋아함을 선택할 것으로 기대되는 수
  • 20.9523: 남자가 좋아하지 않음을 선택할 것으로 기대되는 수
  • 80.9523: 여자가 좋아함을 선택할 것으로 기대되는 수
  • 19.0476: 여자가 좋아하지 않음을 선택할 것으로 기대되는 수

[결과 해석]

항목
귀무가설 H₀ 성별과 마라탕 선호는 독립이다 (서로 관련 없음)
대립가설 H₁ 성별과 마라탕 선호는 독립이 아니다 (관련 있음)
p-value 약 0.0026
유의수준 α 0.05
결론 p-value < 0.05 → 귀무가설 기각

 

▶ 즉, 성별과 마라탕 선호 사이에는 통계적으로 유의한 관련이 있음
(남자와 여자가 마라탕을 좋아하는 비율이 유의하게 다름)

 

2) 로우 데이터 기반 카이제곱 검정

문제에서 로우(원) 데이터 형태로 주어졌을 경우에는 로우 데이터를 pd.crosstab() 함수를 활용해 교차표로 변경한다.

교차표는 주로 변수 간의 관계를 비교할 때 사용한다.

import pandas as pd

df = pd.crosstab(df['요인1'],df['요인2'])

 

앞서 마라탕과 성별의 선호도 관계에 대한 문제가 아래와 같이 주어졌다면,

성별 마라탕
남자 (110명) 좋아함 (80명)
좋아하지 않음(30명)
여자 (100명) 좋아함 (90명)
좋아하지 않음 (10명)
import pandas as pd

data = {
    '성별': ['남자']*110 + ['여자']*100,
    '마라탕': ['좋아함']*80 + ['좋아하지 않음']*30 + ['좋아함']*90 + ['좋아하지 않음']*10
}

df = pd.DataFrame(data)
df = pd.crosstab(df['성별'], df['마라탕'])
df

 

 

Q. 성별과 선호하는 커피 종류의 관계

한 대학의 마케팅 동아리는 성별과 커피 취향이 관련이 있는지를 조사하기 위해 설문조사를 했고, 그 결과는 아래와 같다.

성별 아메리카노 라떼 콜드브루 총합
남성 30 10 10 50
여성 20 25 5 50
총합 50 35 15 100

 

성별과 선호 커피 종류 사이에 통계적으로 유의한 관계가 있는지 유의수준 0.05를 사용하여 검정

# 2. 성별과 선호하는 커피 종류 관계
import pandas as pd

# 행방향 데이터
df = pd.DataFrame([[30, 10, 10], [20, 25, 5]],
                   columns=['아메리카노', '라떼', '콜드브루'],
                   index=['남자', '여자'])
df

 

from scipy.stats import chi2_contingency

# 카이제곱 검정 수행
statistic, p_value, ddof, expected = chi2_contingency(df)

# 결과 출력
print(f"검정 통계량: {statistic:.4f}, p-value: {p_value:.4f}, 자유도: {ddof}, 기대빈도: {expected}")

# 결과 해석
if p_value < 0.05:
  print("p-value가 유의수준보다 작으므로, 귀무가설 기각 -> 성별과 선호하는 커피는 독립적이지 않다")
else:
  print("p-value가 유의수준보다 크므로, 귀무가설 채택 -> 성별과 선호하는 커피는 독립적이다")

 

[결과 해석]

항목
귀무가설 H₀ 성별과 커피 선호는 독립이다
대립가설 H₁ 성별과 커피 선호는 독립이 아니다
자유도 (2-1)×(3-1) = 2
검정 통계량 10.0952
p-value 0.0064
결론 p < 0.05 → 귀무가설 기각성별과 커피 선호는 관련 있음!

 

[기대빈도(기대값) 비교]

성별 아메리카노 라떼 콜드브루
남자

관측값 30 10 10
기대값 25.0 17.5 7.5
잔차 5 -7.5 2.5
여자

관측값 20 25 5
기대값 25.0 17.5 7.5
잔차 -5 7.5 -2.5

▶ 관측값과 기대값이 꽤 차이나서 유의미한 차이가 있다고 판단

잔차(관측 -  기대) 가 크면 클수록, 관측값이 기대값과 많이 다르다는 뜻. 즉, 카이제곱 검정 통계량이 커질 수 있음.


3. 카이제곱 기반 동질성 검정 (Test of homogeneity)

카이제곱 기반 동질성 검정은 역시 독립성 검정과 동일하게 scipy의 chi2_contingency 를 사용

(계산하는 방식이 동일하나, 해석이 다름)

 

Q. 인문계와 이공계 학생의 선호과목 분포 동질성 검정

한 학교에서는 인문계와 이공계 학생들에게 어떤 과목을 가장 선호하는지 설문을 했다.
과목은 국어, 수학, 영어이며, 결과는 다음과 같다

계열 국어 수학 영어 합계
인문계 40 30 30 100
이공계 20 50 30 100

 

이 데이터를 바탕으로, 인문계와 이공계 학생들의 과목 선호 분포가 같은지 유의수준은 0.05를 사용하여 검정.

# 3. 동질성 검정
import pandas as pd

# 행방향 데이터
df = pd.DataFrame([[40, 30, 30], [20, 50, 30]],
                  columns=['국어', '수학', '영어'],
                  index=['인문계', '이공계'])
df

 

from scipy.stats import chi2_contingency

statistic, p_value, dof, expected = chi2_contingency(df)

# 결과 출력
print(f"검정 통계량: {statistic:.4f}, p-value: {p_value:.4f}, 자유도: {dof}, 기대빈도: {expected}")

# 결과 해석
if p_value < 0.05:
  print("p-value가 유의수준보다 작으므로, 귀무가설 기각 -> 두 계열의 선호 과목은 동일하지 않다")
else:
  print("p-value가 유의수준보다 므로, 귀무가설 채택 -> 두 계열의 선호 과목은 동일하다")

 

[결과 해석]

항목 해석
검정 통계량 11.6667 기대값과 관측값의 차이를 수치로 표현한 값 (차이가 클수록 값이 큼)
p-value 0.0029 유의수준(0.05)보다 작으므로, 귀무가설을 기각해야 함
자유도 2 (행 수 - 1) × (열 수 - 1) = (2-1) × (3-1) = 2
기대도수 [[30. 40. 30.], [30. 40. 30.]] 두 계열이 같은 분포를 보인다면 나올 것으로 기대되는 값들

▶ p-value가 0.0029로 0.05보다 작기 때문에, 귀무가설을 기각
따라서 인문계와 이공계는 과목 선호 분포가 다르다고 볼 수 있다.

 

[관측값과 기대빈도 차이]

과목 인문계 (관측) 인문계 (기대) 잔차
(관측 - 기대)
이공계 (관측) 이공계 (기대) 잔차
(관측 - 기대)
국어 40 30 10 20 30 -10
수학 30 40 -10 50 40 10
영어 30 30 0 30 30 0

▶ 잔차가 발생하므로, 통계적으로 같지 않다는 결론 도출


[참고]

유튜브 퇴근 후 딴짓

 


다음 내용

 

[빅분기 실기] 작업형 3유형 : 회귀 분석

이전 내용 [빅분기 실기] 작업형 3유형 : 카이제곱 검정이전 내용 [빅분기 실기] 작업형 3유형 : 분산분석이전 내용 [빅분기 실기] 작업형 3유형 : 가설검정이전 내용 [빅분기 실기] 작업형 2유형 :

puppy-foot-it.tistory.com

728x90
반응형