728x90
반응형
이전 글
이론 : [T-test] 독립표본과 대응표본의 평균 검정
실습 1 : [Python 통계 분석 실습] 1. Z-TEST & One-Sample T-TEST
실습의 과정과 목표
- Python (Google colab) 사용
- 다시 한번 이론 정리
- 간단한 예제 코드로 분석해 보기
- 그래프 시각화 해보기
이 글의 내용과 예제코드의 출처는 연세 IT미래교육원의 수업 과정 중 정지훈 강사님의 교육을 바탕으로 작성되었습니다.
두 번째 실습 예제는 Independent-Sample(독립표본) T-Test에 대한 예제이다.
목차
- 두 평균의 비교
- Independent Sample T-Test
- Independent Sample T-Test 예제 실습
1. 두 평균의 비교
- 두 집단의 평균 비교는 실무에서 자주 쓰이는 테스트이다.
- '하나의 모수에 대해 두 집단의 값이 같은가'를 검정하는 것이다.
- 즉, '두 표본 집단의 평균치가 동일한 모집단에서 추출되었는가'를 알아보는 것이다.
2. Independent Sample T-Test
- Independent-Sample(독립표본) T-Test는 세 가지 전제조건이 있다.
- 두 집단은 정규분포를 따른다. (정규성) >>>>> 미충족일 경우 : Mann-Whitney Test
- 두 집단은 분산이 같다. (등분산성) >>>>> 미충족일 경우 : 근사 독립표본 T-Test
- 두 집단은 서로 독립적이다. (독립성) >>>>> 미충족일 경우 : 대응표본 T-Test
3. Independent Sample T-Test 예제 실습
3-1. 데이터 불러오기 및 요약
# 데이터 불러오기
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/ethanweed/pythonbook/main/Data/harpo.csv")
# 데이터 요약 (평균, 표준편차, 개수)
import numpy as np
df.groupby('tutor')['grade'].agg(['mean', 'std', 'count']).reset_index()
- 데이터는 각 tutor의 클래스별 학생들의 점수이다.
- Anastasia tutor의 클래스 학생들은 15명이며 평균이 약 74.53, 표준편차가 약 9.00이다
- Bernadette tutor의 클래스 학생들은 18명이며 평균이 약 69.06, 표준편차가 약 5.77이다
3-2. 데이터 시각화
# 두 그룹의 점수 분포를 히스토그램으로 나타내기
import matplotlib.pyplot as plt
import seaborn as sns
fig, axes = plt.subplots(1, 2, figsize=(15, 5))
Anastasia = pd.DataFrame(df.loc[df['tutor'] == 'Anastasia']['grade'])
Bernadette = pd.DataFrame(df.loc[df['tutor'] == 'Bernadette']['grade'])
sns.histplot(Anastasia['grade'], ax = axes[0], binwidth = 5)
sns.histplot(Bernadette['grade'], ax = axes[1], binwidth = 5)
axes[0].set_xlim(50,100)
axes[1].set_xlim(50,100)
axes[0].set_ylim(0,7)
axes[1].set_ylim(0,7)
axes[0].set_title('Anastasia')
axes[1].set_title('Bernadette')
sns.despine()
plt.show()
- 그래프를 비교해 보면 Anastasia의 점수 분포가 Bernadette의 점수 분포보다 높게 보인다.
3-2-1. pointplot() : 두 그룹의 학생에 대한 평균과 신뢰구간
# pointplot()을 사용하면 평균과 신뢰구간을 쉽게 시각화 할 수 있다.
sns.pointplot(x = 'tutor', y = 'grade', data = df)
sns.despine()
3-3. 가설 검정
3-3-1. 가설 검정의 종류
- 정규성과 독립성을 만족하는 경우 사용할 수 있는 Independent-Sample(독립표본) T-Test에는 두 가지가 있다.
- Student's T-test : 두 집단의 분산의 추정치가 같을 때(등분산성 만족), 모수 검정(엄격한 가정 적용)
- Welch's T-test : 두 집단의 분산의 추정치가 다를 때(등분산성 불만족), 비모수적 검정(가정에 대해 유연함)
- 위 데이터의 경우 표본의 개수가 15개, 18개로 충분히 많다(N>30)고 할 수 없기 때문에 정규성 검정(Shapiro-Wilk's test)을 진행해야 하지만 생략하겠다.
- 등분산성을 확인하기 위해서는 Levene's test를 진행하여야 한다.
3-3-2. 가설 설정
- 귀무가설(H0) : 두 그룹의 평균은 같다.
- 대립가설(H0) : 두 그룹의 평균은 같지 않다.
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import scipy.stats as stats
mu1 = 0
sigma = 1
mu2 = 2
x1 = np.linspace(mu1 - 4*sigma, mu1 + 4*sigma, 100)
y1 = 100* stats.norm.pdf(x1, mu1, sigma)
x2 = np.linspace(mu2 - 4*sigma, mu2 + 4*sigma, 100)
y2 = 100* stats.norm.pdf(x2, mu2, sigma)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
sns.lineplot(x=x1,y=y1, color='black', ax = ax1)
sns.lineplot(x=x1,y=y1, color='black', ax = ax2)
sns.lineplot(x=x2,y=y2, color='black', ax = ax2)
ax1.text(0, 43, r'$H_0 : \mu_1 = \mu_2$', size=20, ha="center")
ax2.text(0, 43, r'$H_0 : \mu_1 \neq \mu_2$', size=20, ha="center")
ax1.axvline(x=mu1, color='black', linestyle='--')
ax2.axvline(x=mu1, color='black', linestyle='--')
ax2.axvline(x=mu2, color='black', linestyle='--')
ax1.text(mu1+0.35,30, r'$\mu_1$', size=20, ha="center")
ax2.text(mu1+0.35,30, r'$\mu_1$', size=20, ha="center")
ax2.text(mu2+0.35,30, r'$\mu_2$', size=20, ha="center")
ax1.set_frame_on(False)
ax2.set_frame_on(False)
ax1.get_yaxis().set_visible(False)
ax2.get_yaxis().set_visible(False)
ax1.get_xaxis().set_visible(False)
ax2.get_xaxis().set_visible(False)
ax1.axhline(y=0, color='black')
ax2.axhline(y=0, color='black')
plt.show()
- 위 그림을 보자 만약 귀무가설(H0)이 맞다면 두 그룹 간의 평균 차이는 0이다.
- mu1−mu2=0
- 그러나, 만약 약간의 차이가 있다면 이를 어떻게 봐야 할까?
- 이것을 일반적으로 오차로 부르고, t통계량을 구할 때는 표준오차를 사용한다.
3-3-3. 데이터 가공
- T-test를 진행하기 위해서는 데이터 테이블을 기존의 Long형태에서 Wide 형태로 변경해야 한다.
# 테이블 형태 변경
wide_df = pd.pivot(df, columns = 'tutor', values = 'grade')
wide_df.head()
3-3-4. 테스트
- 위 테이블에서 NaN이란 Not a Nunber의 약자로 숫자가 아닌 것을 의미한다.
- 이 값은 별도로 처리해야 하지만, ttest()는 이를 적절하게 처리할 수 있는 기능이 있다.
# 앞서 실습해본 pingouin 라이브러리의 ttest 사용
!pip install --upgrade pingouin
from pingouin import ttest
ttest(wide_df['Anastasia'], wide_df['Bernadette'], correction = False)
# correction = False : Independent T-test 수행
wide_df.describe()
3-4. 결론
- 결과 보고서는 아래와 같이 작성할 수 있다.
- Independent-Sample T-test 결과 자유도 31의 T-분포의 검정통계량은 2.11로 p-value는 약 0.04이다
- p-value가 0.05보다 작으므로 귀무가설(H0)은 기각된다.
- 즉, 두 집단의 평균은 같지 않다.
- Anastasia’s 클래스의 평균 점수는 약 74.53점이고 표준편차는 약 9.00
- Bernadette's 클래스의 평균 점수는 약 69.06점이고 표준편차는 약 5.77
- 약 5.47점 차이가 있다. (유의미)
4. 마치며
이번 글에서는 서로 다른 두 집단의 평균 비교 Independent-Sample T-test 에 대해 공부하였다.
다음 글에서는 같은 내용으로 다른 검정 방법에 대해 알아보도록 하겠다.
다음 글 : [Python 통계 분석 실습] 3. Independent-Sample(독립표본) T-TEST의 비모수적 검정
728x90
반응형
'Python > 실습' 카테고리의 다른 글
[Python 통계 분석 실습] 1. Z-TEST & One-Sample T-TEST (0) | 2023.04.27 |
---|---|
[Python Streamlit] IRIS 데이터를 활용한 머신러닝 대시보드 개발 (2) | 2023.04.25 |