빅데이터 전문가 되기
두 집단의 평균 비교 t-test(독립표본) 본문
😸 두 평균의 비교 (대응표본 vs 독립표본)
- 대응표본 t-검정(Paired Samples t-Test)
- 동일한 개체 또는 그룹에서 얻은 두 관찰 값의 차이를 비교하는데 사용
- 개체 또는 그룹 간의 차이에 대한 통계적 유의성을 검정하기 위해 각 쌍의 차이에 대한 평균과 분산을 계산 합니다.
이 차이값들의 평균이 0과 유의하게 다른지를 검정합니다.
- 예시: 동일한 사람들의 전 후 체중 변화 비교
- 독립표본 t-검정(Two Independent Sample t-Test)
- 두 개의 별도된 그룹 간의 평균 차이를 비교하는데 사용
- 두 그룹의 평균과 분산을 계산하여, 두 그룹 간의 평균 차이가 통계적으로 유의미한지를 검정합니다.
- 예시: 남성과 여성의 평균 소득 차이
첫번째 예시를 들어 계산해보겠습니다.
- 기니피그 60마리의 치아 길이(len), 투여한 비타민 C종류(supp), 투여량(does)이 저장되어 있다. 이 때, 투여한 약제의 종류(supp)는 아스코르브산(VC), 오렌지주스(OJ)가 있다. 오렌지주스를 투여받은 기니피그의 치아 길이 평균이 아스코르브산을 투여받은 기니피그의 치아 길이 평균과 일치하는지 t-검정(Two Sample t-test)를 통해 구하라.
- 가설 설정
- 귀무가설 : 투여한 약제별 치아의 길이는 같다.
- 대립가설 : 투여한 약제별 치아의 길이는 같지 않다.
- 단, 데이터의 각 변수들은 정규분포를 만족하며, 두 그룹은 등분산을 띤다.
- 문제 1: 표본평균 Xoj, Xvc를 구하시오.
- 문제 2: 위의 가설을 검정하기 위한 검정통계량을 구하시오. (반올림하여 소숫점 둘째 자리까지 계산)
- 문제 3: 위의 통계량에 대한 p값을 구하고, (반올림하여 소숫점 넷째자리까지 계산) 유의수준 0.05하에서 가설검정 결과를 선택하시오.
# 데이터 불러오기
import pandas as pd
df = pd.read_csv("./data/toothgrowth.csv")
df.head()
👉 등분산성 검정
- 귀무가설 : 두 그룹의 분산이 동일하다.
- 대립가설 : 두 그룹의 분산이 다르다.
from scipy import stats
stats.levene(df.loc[df['supp'] == 'VC', 'len'], df.loc[df['supp'] == 'OJ', 'len'])
> LeveneResult(statistic=1.2135720656945064, pvalue=0.2751764616144053)
- 독립표본 T-검정은 정규성 검정 뿐만 아니라, 두 그룹이 등분산성을 띠는지 확인하는 작업이 필요합니다.
- Levene 검정을 사용한 등분산성 검정이 선행되어야 합니다.
- 이때 p-value는 0.275로 유의수준 이상입니다.
따라서 대립가설을 기각하고, 귀무가설을 채택하여 OJ 그룹과 len 변수의 분산이 유의한 차이가 없다고 볼 수 있습니다.
👉 문제 1: 표본평균 Xoj, Xvc를 구하시오.
VC_result1 = df.loc[df['supp'] == 'VC', 'len'].mean()
VC_result2 = df.loc[df['supp'] == 'OJ', 'len'].mean()
print('Xvc:', round(VC_result1, 2))
print('Xoj:', round(VC_result2, 2))
> Xvc : 16.96
Xoj : 20.66
👉 문제 2: 위의 가설을 검정하기 위한 검정통계량을 구하시오.
from scipy.stats import stats
from math import sqrt
t_score, p_value = stats.ttest_ind(df.loc[df['supp'] == 'VC', 'len'], df.loc[df['supp'] == 'OJ', 'len'], equal_var=True)
print('t_score:', round(t_score, 4), 'p_value:', round(p_value,2))
> t_score: -1.9153 p_value: 0.06
👉 문제 3: 위의 통계량에 대한 p값을 구하고, 가설검정 결과를 선택하시오.
print(round(p_value, 4))
> 0.0604
- p_value값이 유의수준 0.05 이상이므로 대립가설 기각, 귀무가설을 채택합니다.
- 따라서 투여한 약제별 치아의 길이는 같다고 볼 수 있습니다.
독립 표본을 이용하여 두번째 예시를 설명하겠습니다.
- 데이터는 각 tutor의 클래스별 학생들의 점수를 나열한 것이다.
- Anastasia(N=15) & Bernadette(N=18)일 때, 두 평균이 같다고 볼 수 있는지 확인하라.
- 가설 설정
- 귀무가설 : 두 그룹의 평균은 같다.
- 대립가설 : 두 그룹의 평균은 같지 않다.
# 데이터 불러오기
import pandas as pd
df= pd.read_csv("https://raw.githubusercontent.com/ethanweed/pythonbook/main/Data/harpo.csv")
df.head()
# 데이터 확인 및 분포 요약
import numpy as np
df.groupby('tutor')['grade'].agg(['mean','std','count']).reset_index()
👉 두 그룹 간 데이터 시각화
- 비교 그래프를 작성하여 분포도를 확인해보겠습니다.
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.hisplot(Anastasia['grade'], ax = axes[0], binwidth=5)
sns.hisplot(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의 점수분포보다 높다는 것을 확인할 수 있습니다.
👉 신뢰 구간확인하기
sns.pointplot(x='tutor', y='grade', data=df)
sns.despine()
- 신뢰 구간에서도 Anastasia의 평균점수가 Bernadette의 평균점수보다 높다는 것을 확인할 수 있습니다.
👉 검정을 통해 가설 검증하기
- Student's T-Tesst (모수 검정 : 엄격한 가정 적용)
- Welch's (비모수 검정 : 가정에 대해 유연함)
- 가정
① 독립된 관측치
: 두 그룹의 관측값은 서로 특별한 관계가 없다.
② 정규성 (Normality)
- 정규 분포를 따른다.
( Sample Size가 N > 30 이면 고려하지 않아도 됨.)
- 가정 위반 시, Mann-Whitney Test
③ 등분산성 가정
- Levene's 검정을 한다.
- Levene's 검정 위반 시, Welch Test
- 가설 검증하기
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, 'null hypothesis', size=20, ha='center')
ax2.text(0, 43, 'alternative hypothesis', 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()
- 귀무가설이 맞다면 두 그룹간의 평균 차이는 0 입니다.
: μ1 - μ2 = 0 으로 볼 수 있습니다.
- 만약, 차이(오차)가 있다면, t 통계량을 구할 때는 표준오차를 사용합니다.
👉 데이터 가공 및 확인
wide_df = pd.pivot(df, columns = 'tutor', values = 'grade')
widf_df.head()
- NaN은 숫자가 아님의 약자입니다.
- 이는 별도로 처리해야 하지만, Pingouin 라이브러리를 이용하여 결측치 값을처리할 수 있습니다.
- t-검정 수행시 NaN 데이터가 포함될 경우 자동으로 무시하고 분석을 진행합니다.
!pip install --upgrade pingouin
from pingouin import ttest
ttest(wide_df['Anastasia'], wide_df['Bernadette'], correction = False)
- 여기서 correction = False 는 실제로 indepdent t-test를 수행하라는 뜻입니다.
- 이 때, t-test 값은 2.11이며, p-value의 값은 유의수준 0.05이하로 귀무가설을 기각하고 대립가설을 채택합니다.
따라서, 두 그룹의 평균은 같지 않다고 해석할 수 있습니다.
👉 levene test
- 귀무가설 : 두 그룹의 분산은 같다.
- 대립가설 : 두 그룹의 분산은 다르다.
from pingouin import homoscedasticity
homoscedasticity(data= df, dv='grade', group='tutor')
- p_value가 0.05이상이므로 귀무가설을 채택합니다.
- 따라서, 두 그룹의 분산은 같다고 볼 수 있습니다.
wide_df.describe()
- 실제로 데이터 값을 확인했을 때, Anastasia의 평균 점수는 74.5점 (std dev =9.0)이고, Bernadette의 평균 점수는 69.1점 (std dev=5.8) 입니다. 독립 평균 샘플 t-test 결과 약 5.4점 차이가 유의미하게 다르게 나타난다고 볼 수 있습니다.
( t(31) = 2.1, p < 0.05 )
이상 독립표본 t-검정(Two Independent Sample t-Test)에 대하여 알아보았습니다.
'통계' 카테고리의 다른 글
분산 분석(The Analysis of Variance) (0) | 2023.06.15 |
---|---|
두 집단의 평균 비교 t-test(대응표본) (0) | 2023.06.15 |
One Sample t-test (0) | 2023.06.12 |
z-test(z-통계량) (0) | 2023.06.09 |
통계 관련 자료 모음 (0) | 2023.04.18 |