단변수 통계(1)

Chapter 03에서 배울 내용

  1. 주요 분포
  2. 모수적 검정 5가지
  3. 비모수적 검정 3가지
  4. 선형 모델

01 주요 분포

Normal distribution

정규분포는 평균 \inline \dpi{100} \fn_jvn \mu와 표준편차 \inline \dpi{100} \fn_jvn \sigma를 모수로 합니다. 측정값(Estimator)는 \dpi{100} \fn_jvn \over x\dpi{100} \fn_jvn \small \sigma_x입니다.

Chi-Square distribution

카이분포는 \inline \dpi{80} \fn_jvn N(0,1)의 정규분포를 따르는 서로 독립인 \dpi{80} \fn_jvn n개의 랜덤변수의 합이 이루는 분포입니다. 이때의 자유도(degree of freedom, df)는 \dpi{80} \fn_jvn n입니다. \inline \dpi{80} \fn_jvn X \sim N(\mu, \sigma^2) 라면 \dpi{80} \fn_jvn Z = (X-\mu)/\sigma \sim N(0,1 )이고 다음이 성립합니다.

  • \dpi{80} \fn_jvn Z^2 \sim \chi^2_1 (one df)
  • \dpi{80} \fn_jvn n개의 표준정규변수의 합: \dpi{80} \fn_jvn \Sigma^n_i Z_i^2 \sim \chi^2_n

Fisher’s F-distribution

F 분포는 두 개의 독립적인 Chi 변수의 비율이 따르는 분포입니다. \dpi{100} \fn_jvn \small X \sim \chi^2_n ,~ Y\sim \chi_p^2 일 때 다음이 성립합니다.

\dpi{100} \fn_jvn \small F_{n,p} = \frac {X/n} {Y/n}

import numpy as np
from scipy.stats import f
import matplotlib.pyplot as plt

fvalues = np.linspace(0.1, 5, 100)

plt.plot(fvalues, f.pdf(fvalues, 1, 30), 'b-', label = "F(1, 30)")
plt.plot(fvalues, f.pdf(fvalues, 5, 30), 'r-', label = "F(5, 30)")
plt.legend()

# cdf: Cumulative distribution function of F
proba_at_f_inf_3 = f.cdf(3, 1, 30)
print(proba_at_f_inf_3)

# ppf(q, df1, df2): Percent point function (inverse of cdf) at q of F
f_at_proba_inf_95 = f.ppf(0.95, 1, 30)
print(f_at_proba_inf_95)

# sf(x, df1, df2): Survival function (1 - cdf) at x of F.
proba_at_f_sup_3 = f.sf(3, 1, 30) # P(F(1,30) > 3)
assert proba_at_f_inf_3 + proba_at_f_sup_3 == 1

# p-value: P(F(1, 30)) < 0.05
low_proba_fvalues = fvalues[fvalues > f_at_proba_inf_95]
plt.fill_between(low_proba_fvalues, 0, f.pdf(low_proba_fvalues, 1, 30), alpha=0.8, label = "P < 0.05")

plt.show()

The Student’s t-distribution

\inline \dpi{100} \fn_jvn \small M \sim N(0,1) 이고 \inline \dpi{100} \fn_jvn \small V \sim \chi_n^2 라면 \inline \dpi{100} \fn_jvn \small T_n 은 다음과 같이 나타날 수 있습니다.

\dpi{100} \fn_jvn \small T_n = \frac{M}{\sqrt {V/n}}

02 모수적 검정

Pearson correlation test: test association between two quantitative variables

이 테스트는 Pearson 상관계수와 귀무가설(Non-correlation)에 대한 p-value 값을 구해줍니다. Linear correlation coefficient는 다음과 같이 정의됩니다.

\dpi{100} \fn_jvn \small r = \frac {\Sigma^n_{i=1} (x_i - \bar x)(y_i - \bar y)}{\sqrt{\Sigma^n _{i=1} (x_i - \bar x)^2}\sqrt{\Sigma^n_{i=1}(y_i - \bar y)^2}}

import numpy as np
import scipy.stats as stats

n = 50
x = np.random.normal(size=n)
y = 2 * x + np.random.normal(size=n)

# Compute with scipy
cor, pval = stats.pearsonr(x, y)

One sample t-test

모집단의 평균이 어떠한 값과 일치하는 지를 확인하는 테스트입니다. 예를 들어 어떤 집단의 키의 평균이 1.75m인지 테스트해보도록 하겠습니다.

1) Model the data

키가 정규분포를 따른다고 가정합니다. \inline \dpi{100} \fn_jvn \small X \sim N(\mu , \sigma^2)

2) Fit: estimate the model parameters

\dpi{100} \fn_jvn \small \bar x, ~ \sigma_x 는 \dpi{100} \fn_jvn \small \mu, ~ \sigma의 측정치입니다.

3) Test

귀무가설 하에서 \inline \dpi{100} \fn_jvn \small t는 다음과 같습니다.

\dpi{100} \fn_jvn \small t = \frac{\bar x - \mu_0}{\sigma_x / \sqrt{n}}

import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt

np.random.seed(seed=42)
n = 100
x = np.random.normal(loc = 1.78, scale = 0.1, size = n)

tval, pval = stats.ttest_1samp(x, 1.75)

tvalues = np.linspace(-10, 10, 100)
plt.plot(tvalues, stats.t.pdf(tvalues, n-1), 'b-', label = "T(n-1)")
upper_tval_tvalues = tvalues[tvalues > tval]
plt.fill_between(upper_tval_tvalues, 0, stats.t.pdf(upper_tval_tvalues, n-1), label = "p-value")
plt.legend()

plt.show()

Two-sample (Student) t-test: compare two means

이 테스트는 서로 다른 두 집단의 평균이 같은지 알아보고자 할 때 사용합니다. 만약 짝지어진 두 경우(ex. 한 집단에 대하여 치료 전과 치료 후)에는 one-sample t-test of difference(Paired t-test)를 시행합니다. 두 집단의 변수의 분산이 같은 경우를 homoscedasticity라 하며, 다른 경우를 heteroscedasticity라 합니다.

1) Model data

두 랜덤변수가 각각 정규분포를 따른다고 가정합니다. \inline \dpi{100} \fn_jvn \small x\sim N(\mu_x, \sigma_x^2), ~ y \sim N(\mu_y, \sigma_y^2)

2) Fit: estimate the model parameters

각 집단의 모수를 측정합니다. \dpi{100} \fn_jvn \small \bar x, s_x, \bar y, s_y

3) t-test

두 집단의 분산이 같은 경우에는 기존과 비슷합니다.

\dpi{100} \fn_jvn \small t = \frac{\bar x - \bar y}{s \sqrt{\frac{1}{n_x} + \frac{1}{n_y} }}, ~ s= \sqrt{\frac{s_x^2(n_x - 1) + s_y^2(n_y -1)}{n_x+n_y -2}}

두 집단의 분산이 다른 경우에는 Welch’s t-test를 이용합니다.

\dpi{100} \fn_jvn \small t = \frac{\bar x - \bar y}{ \sqrt{\frac{\sigma_x^2}{n_x} + \frac{\sigma_y^2}{n_y}}}, ~ \nu \approx \frac{ (\frac{sigma_x^2}{n_x} + \frac{\sigma_y^2}{n_y})^2 }{\frac{\sigma_x^4}{n^2_x(n_x-1)} + \frac{\sigma_y^4}{n_y^2(n_y-1)}}

import scipy.stats as stats
nx, ny = 50, 25
x = np.random.normal(loc=1.76, scale=0.1, size=nx)
y = np.random.normal(loc=1.70, scale=0.12, size=ny)

# Compute with scipy
tval, pval = stats.ttest_ind(x, y, equal_var=True)

Anova F-test(quantitative ~ categorical(> 2 levels))

Analysis of variance(ANOVA)는 여러 개의 그룹의 평균이 같은지를 비교합니다. t-test의 일반화된 형태라고 생각하면 됩니다. 하나의 변수를 기준으로 하는 one-way ANOVA에 대해 알아봅시다.

1) Model the data

한 회사가 서로 다른 세 가지의 전략을 이용한 마케팅에 돌입하였습니다. 각각의 전략에 대한 증가량이 \inline \dpi{100} \fn_jvn \small y_1, y_2, y_3라고 할 때 이에 대한 one-way ANOVA를 시행해 봅시다. 단, 각각의 변수는 정규분포를 따릅니다.

2) Fit: estimate the model parameters

\inline \dpi{100} \fn_jvn \small \bar y_i, \sigma_i, ~ \forall _i \in \left \{1,2,3 \right \}

3) F-test

ANOVA 테스트의 장점은 차이가 있는지 알아보기 위해 세 가지 전략 중 어떤 것이 차이가 있는지를 굳이 선택하지 않아도 된다는 것입니다. 그냥 한 번에 모든 집단을 검사할 수 있다는 것입니다. 하지만 그와 동시에 단점은 귀무가설(모든 집단의 평균이 같다)을 기각하게 되었을 때 어떤 집단의 평균이 다른 집단들과 다른지는 알 수 없다는 것입니다.

F 통계량은 다음과 같습니다.

\dpi{100} \fn_jvn \small F = \frac{explained ~ variance}{unexplained ~ variance} = \frac{between-group~variability}{within-group~variability}

“explained variance” 혹은 “between-group variability”는 다음과 같습니다.

\dpi{100} \fn_jvn \small \sum_i n_i(\bar Y_{i\cdot } - \bar Y)^2 / (K-1)

\inline \dpi{100} \fn_jvn \small \bar Y_{i\cdot}\inline \dpi{100} \fn_jvn \small i번째 그룹의 평균, \inline \dpi{100} \fn_jvn \small n_i:  \inline \dpi{100} \fn_jvn \small i번째 그룹의 샘플 수, \dpi{100} \fn_jvn \small \bar Y: 전체 평균, \dpi{100} \fn_jvn \small K: 전체 그룹의 수

“unexplained variance” 혹은 “within-group variability”는 다음과 같습니다.

\dpi{100} \fn_jvn \small \sum_{ij} n_i(Y_{ij } - \bar Y_{i\cdot})^2 / (N-K)

\inline \dpi{100} \fn_jvn \small Y_{ij}: \inline \dpi{100} \fn_jvn \small i번째 그룹의 \inline \dpi{100} \fn_jvn \small j번째 관측치, \inline \dpi{100} \fn_jvn \small N: 전체 샘플 수

F-통계량은 귀무가설 하에서 자유도가 \inline \dpi{100} \fn_jvn \small K-1와 \inline \dpi{100} \fn_jvn \small N-K인 F-분포를 따릅니다. 만약 그룹간의 평균이 다를 경우에는 분자(explained variance, between-group variability)가 크기 때문에 F-통계량이 값이 크게 됩니다.

import numpy as np
import scipy.stats as stats

mu_k = np.array([1,2,3])
sd_k = np.array([1,1,1])
n_k = np.array([10,20,30])
grp = [0,1,2] # group label
n = np.sum(n_k)
label = np.hstack([[k] * n_k[k] for k in [0, 1, 2]])

y = np.zeros(n)
for k in grp:
    y[label == k] = np.random.normal(mu_k[k], sd_k[k], n_k[k])
    
fval, pval = stats.f_oneway(y[label==0], y[label==1], y[label==2])

Chi-square(categorical~categorical)

Chi-square test는 관측 테이블(cross-table)을 이용하여 변수 사이의 독립성을 검정하는 테스트입니다. 이때의 귀무가설은 “두 변수 사이에는 연관성이 없다”, 즉 “두 변수는 독립이다”입니다.

import numpy as np
import pandas as pd
import scipy.stats as stats

canalar_tumor = np.array([1] * 10 + [0] * 5)
meta = np.array([1] * 8 + [0] * 6 + [1])

crosstab = pd.crosstab(canalar_tumor, meta, rownames=['canalar_tumor'], colnames = ['meta'])
print("Observed table:")
print("------------")
print(crosstab)

chi2, pval, dof, expected = stats.chi2_contingency(crosstab)
print("Statistics:")
print("------------")
print("Chi2 = %f, pval = %f" %(chi2, pval))
print("Expected table:")
print("---------------")
print(expected)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다