10분안에 배우는 Pingouin
Pingouin은 pandas
와 numpy
를 기반으로 한 오픈소스 통계 패키지입니다. 아래의 목록은 pingouin으로 할 수 있는 대표적인 기능입니다. 모든 기능에 대해서는 API 문서를 참고하세요.
- 분산 분석(ANOVAs): N-ways, repeated measures, mixed, ancova
- Pairwise 사후 검정(post-hocs tests), pairwise 상관관계
- 견고한(Robust), 부분(partial), 거리(distance), 반복 측정 상관관계
- 선형(Linear) 회귀, 로지스틱(logistic) 회귀, 매개(mediation) 분석
- 베이즈 인자(Bayes factor)
- 다변량(Multivariate) 테스트
- 신뢰성과 일관성 검정
- 효과 크기 및 검정력 분석
- 효과 크기 또는 상관 계수의 모수(Parametric) 혹은 부트스트랩(bootstrapped) 신뢰구간
- 순환(Circular) 통계
- 카이제곱 검정(chi-squared test)
- Bland-Altman plot, Q-Q plot, paired plot, robust correlation 시각화
Pingouin은 간단하지만 완전한 통계 기능를 위해 설계되었습니다. 예를 들어 기존의 SciPy 패키지의 ttest_ind
함수는 T-value
과 p-value
만 알려주지만 Pingouin의 ttest
함수는 T-value
, p-value
뿐만 아니라 자유도, 효과 크기(Cohen 's d), 95% 신뢰 구간, 통계적 검정력등을 동시에 출력합니다.
0. 설치법¶
Pingouin은 파이썬3 패키지이며 현재 버전 3.6, 3.7에서 테스트되었습니다. 따라서 파이썬 2.7에서는 작동하지 않습니다.
Pingouin의 주요 종속 패키지는 다음과 같습니다:
- NumPy (>= 1.15)
- SciPy (>= 1.3.0)
- Pandas (>= 0.24)
- Pandas-flavor (>= 0.1.2)
- Matplotlib (>= 3.0.2)
- Seaborn (>= 0.9.0)
또한 일부 기능에는 다음 패키지가 필요합니다:
- Statsmodels
- Scikit-learn
- Mpmath
가장 쉬운 방법은 아래와 같이 pip
명령어를 사용하는 것입니다.
pip install pingouin
혹은 conda
를 사용할 수도 있습니다.
conda install -c conda-forge pingouin
아직 Pingouin은 개발 중에 있으며 버그 수정을 위해 새로운 버전이 계속 배포되고 있습니다(한 달에 약 1 회). 그러니 항상 최신 버전의 Pingouin을 사용하고 있는지 확인하세요. 새로운 버전이 출시 될 때마다 터미널 창에 다음 명령어를 입력해 업그레이드 할 수 있습니다.
pip install --upgrade pingouin
# conda를 사용할 경우
conda update pingouin
자세한 내용은 Pingouin 공식 페이지을 참고하세요.
1. 예제 코드 살펴보기¶
필요한 패키지를 불러옵니다.
import numpy as np
import pingouin as pg
np.random.seed(42)
1.1. One-sample T-test¶
- 모집단의 평균은
4
로 가정
mu = 4
x = [5.5, 2.4, 6.8, 9.6, 4.2]
pg.ttest(x, mu)
자유도(dof)는 4, T-value
(T)는 1.3973 이며 p-Value
가 일반적인 기준(0.05) 이상이기 때문에 표본 x
의 평균은 모집단의 평균과 차이가 없다(귀무가설)고 볼 수 있다.
1.2. Paired T-test¶
꼬리를 one-sided
로 설정하면 pingouin이 알아서 꼬리의 방향을 알려줍니다. 아래 코드의 경우 T-value
가 음수이기 때문에 꼬리의 방향이 less
로 표현됩니다.
pre = [5.5, 2.4, 6.8, 9.6, 4.2]
post = [6.4, 3.4, 6.4, 11.0, 4.8]
pg.ttest(pre, post, paired=True, tail="one-sided")
꼬리의 방향이 less
라는 것은 표본 x
의 평균이 표본 y
의 평균보다 작다는 것을 뜻합니다.
일부러 꼬리의 방향을 반대(greater
)로 한 대립 가설을 확인해 봅니다.
pg.ttest(pre, post, paired=True, tail="greater")
x = np.random.normal(loc=7, size=20)
y = np.random.normal(loc=4, size=20)
pg.ttest(x, y, correction="auto")
1.3.2. 표본 크기가 다른경우¶
x = np.random.normal(loc=7, size=20)
y = np.random.normal(loc=4, size=15)
pg.ttest(x, y, correction="auto")
1.4. Pearson’s correlation¶
mean, cov, n = [4, 5], [(1, 0.6), (0.6, 1)], 30
x, y = np.random.multivariate_normal(mean, cov, n).T
pg.corr(x, y)
1.5. Robust correlation¶
# 표본 x에 아웃라이어 추가
x[5] = 18
# Use the robust Shepherd's pi correlation
pg.corr(x, y, method="shepherd")
1.6. 데이터의 정규성 테스트¶
pingouin.normality()
함수를 pandas의 데이터 프레임형식에 사용할 수 있습니다.
# 일변량 정규성(Univariate normality)
pg.normality(x)
# 다변량 정규성(Multivariate normality)
pg.multivariate_normality(np.column_stack((x, y)))
1.7. Q-Q plot 시각화¶
x = np.random.normal(size=50)
ax = pg.qqplot(x, dist="norm")
1.8. One-way ANOVA¶
기본 내장되어 있는 데이터프레임(mixed_anova
)을 사용합니다.
# Read an example dataset
df = pg.read_dataset("mixed_anova")
df.tail()
# Run the ANOVA
aov = pg.anova(data=df, dv="Scores", between="Group", detailed=True)
aov
1.9. Repeated measures ANOVA¶
pg.rm_anova(data=df, dv="Scores", within="Time", subject="Subject", detailed=True)
1.10. Post-hoc tests corrected for multiple-comparisons¶
# FDR-corrected post hocs with Hedges'g effect size
posthoc = pg.pairwise_ttests(
data=df,
dv="Scores",
within="Time",
subject="Subject",
parametric=True,
padjust="fdr_bh",
effsize="hedges",
)
posthoc
1.11. Two-way mixed ANOVA¶
# Compute the two-way mixed ANOVA and export to a .csv file
aov = pg.mixed_anova(
data=df,
dv="Scores",
between="Group",
within="Time",
subject="Subject",
correction=False,
effsize="np2",
)
aov
1.12. Bland-Altman plot¶
mean, cov = [10, 11], [[1, 0.8], [0.8, 1]]
x, y = np.random.multivariate_normal(mean, cov, 30).T
ax = pg.plot_blandaltman(x, y)
1.13. paired T-test 검정력 시각화¶
T-검정의 표본 크기와 효과 크기(Cohen'd)에 따른 검정력 곡선을 시각화합니다.
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks", context="notebook", font_scale=1.2)
d = 0.5 # Fixed effect size
n = np.arange(5, 80, 5) # Incrementing sample size
# Compute the achieved power
pwr = pg.power_ttest(d=d, n=n, contrast="paired", tail="two-sided")
plt.plot(n, pwr, "ko-.")
plt.axhline(0.8, color="r", ls=":")
plt.xlabel("Sample size")
plt.ylabel("Power (1 - type II error)")
plt.title("Achieved power of a paired T-test")
sns.despine()
1.14. Paired plot¶
mixed_anova
데이터셋을 가지고 명상이 학교 성적에 미치는 영향에 대한 시각화를 해본다.
df = pg.read_dataset("mixed_anova").query("Group == 'Meditation' and Time != 'January'")
pg.plot_paired(data=df, dv="Scores", within="Time", subject="Subject")
2. 마무리하며,¶
파이썬을 사용한 통계 분석은 R
언어에 비해 사용법과 기능이 부족했습니다. 그렇기 때문에 pingouin의 등장이 반갑습니다. 아직 0.3.6
버전이지만 기존에 존재했던 통계 분석 패키지들을 뛰어 넘는 성능과 완성도를 보여주고 있어 앞으로가 더 기대가 됩니다.
pg.__version__