통계,검정,머신러닝

검정 | 통계적 가설 검정 실습1 (T검정/ 카이제곱 검정)

성장하는 쿠키의 로그 기록 2025. 1. 24. 22:55

☑️  필수 1. 기초 통계

[문제]

  • statistics csv 파일을 읽고, 성별 Review Rating 에 대한 평균과 중앙값을 동시에 구해주세요. 결과는 소수점 둘째 자리까지 표현해주세요.
  • 그리고 이에 대한 해석을 간략하게 설명해주세요.

[문제 풀이]

내 코드

import pandas as pd
import numpy as np 
import scipy.stats as stats
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import seaborn as sns

df=pd.read_csv('statistics.csv')
df.groupby('Gender')['Review Rating'].agg(['mean','median']).round(2)

 

피드백 및 결과 해석

  • 성별 review rating의 평균과 중앙값 df형태로 추출
  • agg 메소드
    • 다양한 집계값 출력시 리스트로 전달 → agg(['함수1','함수2'])
    • 컬럼별 다른 집계값 적용시 딕셔너리로 전달 → agg({'total_bill': 'max','tip': 'sum'}) 
  • 결과 해석 : 성별간 평균값과 중앙값이 거의 차이가 없음 
    • (내 해석 오류) 남성이 여성보다 평균 (+0.01p) 중앙값 (+0.1p) 으로 미약하지만 남성의 중앙값이 더 우측으로 치우쳐져 있으므로 '남성의 리뷰점수가 여성대비 더 높은 경향이 있다' 
    • (피드백) : 내 해석은 확대 해석되었음. 표본 데이터의 평균과 중앙값의 차이가 있어도, 아주 살짝분포가 다를뿐 그게 남녀의 리뷰주는 것 에대해 분포가 다르다는 증거가 되지 못함. → 그래서 검정 과정이 후행 되어야함 
  • 조건별 데이터 필터링 ( `암묵적 체이닝` vs  `loc` )
    • 성별(조건별) 컬럼 필터링  -> loc 권장, 암묵적 체이닝은 오류 있을수있음
#1) 암묵적 체이닝 -> df[조건][컬럼] 
male = df[df['Gender'] == 'Male']['Review Rating']

#2) loc 사용 
con = df['Gender'] == 'Male'
male_df = df.loc[con,'Review Rating']
  • 시각화
# 성별 히스토그램으로 분포 비교해보기
male = df[df['Gender'] == 'Male']['Review Rating']
female = df[df['Gender'] == 'Female']['Review Rating']

plt.figure(figsize = (4,3))
plt.hist(male)
plt.hist(female)
plt.xlim(0,5) #MIN-MAX 범위가 동일함 
plt.show()

한줄 포인트

  • 여러 방식으로 집계시 리스트로 전달 →  agg(['함수1','함수2'])
  • 표본 집단의 기술통계치(점 추정) 만으로 모집단을 설명할 수없음 → 검정 추가 진행 (전체 고객의 데이터가 아닌 이상 all 표본 데이터)

☑️  필수 2. 통계적 가설검정

[문제]

  • 성별, Review Rating 컬럼에 대한 T-TEST 를 진행해주세요.
    • 해당 데이터셋의 컬럼들은 정규성을 만족한다고 가정하겠습니다.
    • 귀무가설과 대립가설을 작성해주세요.
    • t-score, P-value 를 구해주세요.
  • 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요.

[문제 풀이]

내 코드

import pandas as pd
import numpy as np 
import scipy.stats as stats
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import seaborn as sns

# 2표본 t검정, 정규성 만족, 성별은 두표본은 독립적임 
con = df['Gender'] == 'Male'
male_df = df.loc[con,'Review Rating']

con = df['Gender'] == 'Female'
female_df = df.loc[con,'Review Rating']

alpha=0.05
t_score, p_val = stats.ttest_ind(male_df,female_df) 

print('귀무가설 : 성별간 리뷰점수는 차이가 없다') #리뷰점수는 같다 , 독립이 아니다 
print('대립가설 : 성별간 리뷰점수는 차이가 있다')
print(f't-score: {t_score:.3f}, P-value : {p_val:.3f}')

if p_val < alpha:
    print('귀무가설을 기각합니다. 성별간 리뷰 점수는 차이가 있습니다.')
else:
    print('귀무가설을 채택합니다. 성별간 리뷰 점수는 차이가 없습니다.')

 

피드백 및 결과 해석 

  • T 검정 조건
    • 모 표준편차 모름 
    • 정규성 만족 (표본 크기가 상관없음) OR 표본크기가 30개 이상 (중심극한 정리)
  • 2표본 T검정 조건
    • 독립 표본
    • 정규성 검정
    • 등분산성
      • 등분산 검정 o : stats.ttest_ind (a,b,equal_var=True) -- 디폴트
      • 등분산 검정 x : stats.ttest_ind (a,b,equal_var=False)
      • 등분산 검정
        • 귀무: 각 그룹의 분산을 모두 동일하다 (등분산 만족)
        • 대립 : 적어도 하나의 분산이 다르다.
        • `Levenu` : 정규성 검정 스킵가능, 여러 그룹의 분산이 동일한지 확인
        • `Bartlett` : 정규성 만족 시 사용, `Levenu`보다 검정력이 높음
#Levene 등분산 검정 코드
_, p_value = stats.levene(a, b)

print(f'{p_value:.3f}')
if p_value < 0.05:
    print('대립가설 채택: 적어도 하나의 분산이 다름')
else:
    print('귀무가설 채택, 분산이 같음')
  • 문제에서 정규성 만족 but 등분산성 정보는 없으므로 등분산성 검정 선행 해주어야 함 

한줄 포인트

  • 2표본 t검정 진행시, 전제 조건3가지 사전 확인 필수 ( 독립 변수, 정규성,등분산성) 
  • 등분산성 가정이 어렵다면 ttest_ind 메소드 사용시 equal_var =False 옵션 활용 할것 

☑️  필수 3. 통계적 가설검정2

[문제]

  • Color, Season 컬럼에 대한 카이제곱 검정을 진행해주세요.
    • 귀무가설과 대립가설을 작성해주세요.
    • 두 범주형 자료의 빈도표를 만들어주세요. 이를 코드로 작성하여 기재해주세요.
    • 카이제곱통계량, P-value 를 구해주세요.
  • 그리고 이에 대한 귀무가설 채택/기각 여부와 그렇게 생각한 이유를 간략하게 설명해주세요.

[문제 풀이]

내 코드

#가설 설정
print('귀무가설 : 제품 컬러와 구매 시즌은 독립적이다')
print('대립가설 : 제품 컬러와 구매 시즌은 독립적이지 않다')

df_chi.groupby('Season')['Color'].count()

#피벗해서 빈도표 생성
observed = df_chi.pivot_table(index='Color', columns='Season', aggfunc='size')
display(observed)

# 독립성 검정
alpha=0.05
chi2_stat, p_val2, dof, expected = stats.chi2_contingency(observed)

print(f"독립성 검정 카이제곱 통계량: {chi2_stat:.3f}, p-value: {p_val2:.3f}\n")

if p_val2 < alpha:
    print('귀무가설을 기각 : 제품 컬러와 구매 시즌은 관련이 있습니다.')
else:
    print('귀무가설을 채택 :제품 컬러와 구매 시즌은 관련이 없습니다.')

 

피드백 및 결과 해석

  • 카이제곱 검정법
    • 적합도 검정 : 기대만큼 관측되었는가? -> 1차원 변수, 변수가 2이상이면 적용불가
    • 독립성 검정 : 두 변수가 연관이 있는가? -> 두 변수의 연관성 파악
    • 동질성 검정 : 변수들의 분포가 같은가 ? -> 계절에 따라 구매분포가 같은가 다른가.
  • 교차표 (빈도표 생성 ) 시  `crosstab` 함수나 `pivot_table` 함수 활용가능
#1. 피벗(그룹바이 후 -> 피벗)
df_chi.groupby('Season')['Color'].count()
observed = df_chi.pivot_table(index='Color', columns='Season', aggfunc='size')

#2. crosstab 함수 생성
color = df['Color'] #x축
season = df['Season'] #y축
data = pd.crosstab(index=color,columns=season)
  • 독립성 검정 가설
    • 귀무 : 두 변수는 독립적이다 = 두 변수는 연관이 없다 
    • 대립 : 두 변수는 독립적이지 않다 = 두 변수는 관련이 있다 

한줄 포인트

  • 카이제곱 검정 (독립/종속 변수가 범주형) 시, 변수가 1개 → 적합도 검정, 변수가 2개 → 독립/동질성 검정 
  • 독립/동질성 검정은 함수 방식은 동일하나 목적/해석의 차이가 있음 
  • 2원 분할표등 교차표 생선시 `crosstab` 함수 사용