데이터과학 기초/통계

파이썬으로 독립표본 t-test 돌리기

eigenvector 2022. 7. 29. 00:26
반응형

파이썬에서 통계는 어렵다?

 

보통 사회과학에서 통계 프로그램은 SPSS나 STATA, 무료로는 R이나 Jamovi를 씁니다.

 

그러나, Python으로도 간단한 수준에서 논문 통계까지 모두 돌릴 수 있습니다.

 

Statsmodels나 Pingouin같은 간편한 통계 패키지가 발전했기 때문입니다.

 

(저를 포함하여 Python을 주로 사용하는 연구자는 Pandas와 연계되는 통계 패키지를 쓰는 것이 효율이 좋습니다.)

 

오늘은 간단한 t-test 보고서 작성을 통해, 파이썬에서 통계 분석 실습을 해 보도록 하겠습니다.

 


Pingouin/ Pandas

파이썬에서 통계 분석은 크게 두 가지 단계로 이뤄집니다.

 

- 데이터 탐색 ~시각화

- 통계 분석 ~시각화

 

그렇기 때문에, 실습 전에 세 패키지를 설치하는 것이 필요합니다.

 

각 패키지는 통계(Pingouin), 데이터 탐색(Pandas), 시각화(Seaborn)을 담당합니다.

 

다음과 같이 터미널에서 입력해 주세요.

(패키지 설치 과정을 잘 모르겠다면, 제가 작성한 conda 설치 및 사용법 을 참고해 주세요)

 

# Conda 사용자의 경우 (추천하는 방식)
conda install -c conda-forge seaborn pingouin pandas

# Pip 사용자의 경우
pip install seaborn pingouin pandas

 


T-test란?

t-test는 t 분포를 사용한 검정 방식입니다.

 

흔히, "광고를 본 그룹과 보지 않은 그룹 사이의 커피 맛 만족도는 다를 것이다"

 

같이 서로 다른(독립된) 두 그룹의 차이를 볼 때 사용하지만(Independent t-test, 독립표본 t검정)

 

그 외로

 

"커피에 대한 만족도 평균이 ~과 같은가?" (one-sample t-test, 단일표본 t검정)

"커피를 마시기 전과 후에 업무수행 능력 차이가 보이는가?"(Paired t-test, 대응표본 t검정)

 

와 같이 t-분포에 기반한 여러 검증이 가능합니다.

 

(다른 요인을 통제하지 않은 상태에서 t-test 결과만 보는 것은 부정확하지만 오늘은 넘어가도록 하겠습니다)


데이터 로드/기술적 분석

통계 분석 전에는 항상 데이터에 대한 기술적 분석을 해야 합니다.

 

데이터의 특징을 파악하고, 예상치 못한 이상값(outlier)이나 결측치(missing)을 확인할 필요가 있기 때문입니다.

 

기술적 분석을 충분히 하지 않을 경우, 잘못된 데이터로 분석이 이뤄지고, 엉뚱한 결과를 내릴 수 있습니다.

 

특히, 조사 인원이 많아질수록 이런 문제는 쉽게 발견되기 어렵기 때문에 시각화가 필요합니다.

 

(e.g. 식비 조사에서 만원 단위를 못 보고 억대 식비 기록 -> 평균 식비가 급격히 증가 -> ???)

 

일단 데이터를 로드해 보도록 하겠습니다.

 

샘플 데이터는 "학습방법(A그룹, B그룹)에 따른 시험 성적의 차이가 유의한가?"

 

를 분석한 결과입니다.

 

아래 데이터를 다운받아 파이썬 폴더에 넣어 주세요.

test.csv
0.00MB

 

우선 데이터셋을 로드해 보겠습니다.

 

import pandas as pd

df = pd.read_csv("test.csv")
df.head()

우리가 보려는 그룹에 따라 데이터를 나눠서 확인해야 하므로 그룹을 나눠준 후 describe()를 적용합니다.

 

그룹별 통계는 groupby를 써서 구할 수 있지만, 자세한 통계를 따로 확인하는 것이 더 편리하니까요.

 

# 필터링 기능으로 데이터셋 분리 후 인덱스 정리
class_A = test[test.Class=="A"].reset_index(drop=True)
class_B = test[test.Class=="B"].reset_index(drop=True)

# 각 데이터셋 통계 확인
print("A 그룹 수치 확인")
print(class_A.describe())
print()
print("B 그룹 수치 확인")
print(class_B.describe())

결과를 확인하니, B 그룹이 더 성적이 높게 나왔군요(5.8 정도 차이).

 

혹시 우리가 모르는 문제가 있는지 확인하기 위해 박스플롯을 그려 마무리 해 보겠습니다.

 

x축에는 각 그룹을, y축에는 각 값을 할당하여 seaborn으로 그려줍니다.

 

import seaborn as sns

sns.boxplot(x="Class", y="Score", data=test)

기술적 분석을 마무리 했으니, 이런 차이가 "유의미한" 통계적 차이일지 확인해 보겠습니다.

 


T-Test 수행

이제 t-test를 수행하도록 하겠습니다.

 

각 그룹의 성적(Score)과, 보정 여부(correction)을 설정한 후 t-test를 수행하겠습니다.

 

* 원래는 분산 차이를 먼저 검정하지만, 'auto' 옵션을 넣으면 자동으로 보정값을 적용하기 때문에 고려하지 않아도 됩니다.

 

import pingouin as pg

pg.ttest(class_A.Score, class_B.Score, correction='auto')

 

 

분석 결과 중 중요한 것은 T, dof, alternative, p-val, CI95% 입니다.

 

나머지 항목은 베이즈 통계, 효과크기, 검정력 등과 관계되는데 오늘은 다루지 않습니다.

 

각 컬럼의 의미를 확인하자면

 

T : T값

dof : 자유도

alternative : 통계 분석 방법

p-val : p값 (0.05 보다 작을 경우 일반적으로 통계적으로 유의하다고 함)

CI : 신뢰구간 (p 값을 보완하는 통계값, 보고서에 따라 같이 제공할 필요 있음)

 

결과를 확인해 보니, p값이 0.05보다 훨씬 작기 때문에 두 그룹 사이의 점수 차이가 유의미하다고 볼 수 있습니다.

 


결과 보고하기

통계 결과는 보통 세 파트로 나눠집니다.

 

1. 어떤 테스트를 수행했는지 : 독립 표본 검정

 

2. 결과값이 어떤지 : t(자유도) = t값, p-value와 신뢰구간

(위 실험 결과를 보면, t(48) = -2.85059, p<0.01, 95% 신뢰구간에서 [-9.89, -1.71])

- 논문에 따라 *표시로 p 값을 구분하는 경우도 있지만, 여기서는 생략합니다.

 

3. 해석은 어떤지 : B가 A보다 ~만큼 성적이 좋다 (혹은 성적 차이가 유의미하다 / 귀무가설을 기각한다)

 

이 세 파트를 적절히 조합해서 한 단락으로 적으면 통계 보고가 마무리 됩니다.

반응형