<jupyter_start><jupyter_text>Scipy를 이용한 기초 검정<jupyter_code>import numpy as np
import scipy as sp
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels as sm<jupyter_output><empty_output><jupyter_text>- 이항 검정 (Binomial test)- 카이 제곱 검정 (Chi-square test)- 단일 표본 z-검정 (One-sample z-test)- 단일 표본 t-검정 (One-sample t-test)- 독립 표본 t-검정 (Independent-two-sample t-test)- 대응 표본 t-검정 (Paired-two-sample t-test)- 분산 검정 (Chi squared variance test)- 등분산 검정 (Equal-variance test)- 정규성 검정 (Normality test)  이항 검정 `binom_test`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.binom_test.html- 이항 분포를 사용해서 베르누이 분포 모수에 대한 가설을 조사  - `binom_test` 명령 사용- 디폴트 귀무 가설 $\theta = 0.5$<jupyter_code># 데이터 10개, theta = 0.5
N = 10
theta_0 = 0.5
np.random.seed(0)
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n
sp.stats.binom_test(n, N)
# 데이터 100개, theta = 0.5
N = 100
theta_0 = 0.5
np.random.seed(0)
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n
sp.stats.binom_test(n, N)

# p-value 92%이므로, 귀무가설 기각할 수 없다.
# 데이터 100개, theta =0.35
N = 100
theta_0 = 0.35
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n
sp.stats.binom_test(n, N)

# p-value 0.04%이므로 귀무가설 기각할 수 있다. theta는 0.5가 아니다.<jupyter_output><empty_output><jupyter_text>연습 문제 1¶N = 10이고 유의 수준이 10%라면 앞면이 나온 횟수가 몇 번이어야지 동전이 fair하지 않다고 이야기 할 수 있을까?<jupyter_code># H0 채택
sp.stats.binom_test(2, 10)
# H0 채택
sp.stats.binom_test(8, 10)
# H0 기각
sp.stats.binom_test(9, 10)
# H0 기각
sp.stats.binom_test(1, 10)<jupyter_output><empty_output><jupyter_text>연습 문제 2¶N = 100이고 유의 수준이 1%라면 앞면이 나온 횟수가 몇 번이어야지 동전이 fair하지 않다고 이야기 할 수 있을까?<jupyter_code># 36이하 혹은 64이상 앞면이 나온다면, 동전이 fair하지 않다.
x_ls = []
for x in range(100):
    if sp.stats.binom_test(x, 100) < 0.01:
        x_ls.append(x)
    else:
        pass
print(x_ls)<jupyter_output>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]<jupyter_text>연습 문제 3¶N = 100이고 앞면이 나온 횟수는 40번이다. 유의 수준이 1%라면 앞면이 나온 횟수가 몇 번이어야지  θ=0.4 라고 이야기 할 수 있을까?<jupyter_code>38번

N = 100
theta_0 = 0.40
np.random.seed(0)
x = sp.stats.bernoulli(theta_0).rvs(N)
n = np.count_nonzero(x)
n
# 37번까지도 H0=0.4 채택

for x in range(100):
    if sp.stats.binom_test(x, 100) > 0.01:
        print(x)
        break<jupyter_output>37<jupyter_text>카이제곱 검정 `chisquare`**goodness of fit**이라고도 부른다. http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html- 카테고리 분포의 모수에 대한 가설을 조사하는 검정 방법.- 카테고리 k가 나와야할 횟수의 기댓값 $m_k$와 실제 나온 횟수 $x_k$의 차이를 이용한다.$$\sum_{k=1}^K \dfrac{(x_k - m_k)^2}{m_k^2}$$- 디폴트 귀무가설 $\theta = \left(\frac{1}{K}, \ldots, \frac{1}{K} \right)$<jupyter_code># 데이터 갯수  N=10 , 실제 모수  theta_0=(0.25,0.25,0.25,0.25) 인 경우

N = 10
K = 4
theta_0 = np.ones(K)/K
np.random.seed(0)
x = np.random.choice(K, N, p=theta_0)
n = np.bincount(x, minlength=K)
n
sp.stats.chisquare(n)

# p-value 17.8% 이므로 귀무가설 기각할 수 없다.
# 따라서 실제 모수를 따라간다.
#데이터 갯수  N=100, 실제 모수  theta_0=(0.35,0.30,0.20,0.15) 인 경우.

N = 100
K = 4
theta_0 = np.array([0.35, 0.30, 0.20, 0.15])
np.random.seed(0)
x = np.random.choice(K, N, p=theta_0)
n = np.bincount(x, minlength=K)
n
sp.stats.chisquare(n)

# p-value  0.08%이므로 귀무가설 기각할 수 있다.
# theta_0=(0.35,0.30,0.20,0.15)가 아니다.<jupyter_output><empty_output><jupyter_text>연습 문제 4¶4면체 주사위를 10번 던졌다.1. 만약 10번 모두 같은 면이 나왔다면 유의 확률은 얼마인가?2. 만약 9번이 같은 면이 나왔다면 유의 확률은 얼마인가?3. 만약 8번이 같은 면이 나오고 다른 면이 2번 나왔다면 유의 확률은 얼마인가?4. 만약 8번이 같은 면이 나오고 다른 두 면이 각각 1번씩 나왔다면 유의 확률은 얼마인가?5. 만약 7번이 같은 면이 나오고 다른 세 면이 각각 1번씩 나왔다면 유의 확률은 얼마인가?<jupyter_code>print(sp.stats.chisquare([10, 0, 0, 0]))  #1
print(sp.stats.chisquare([9, 1, 0, 0]))   #2
print(sp.stats.chisquare([0, 9, 1, 0]))   #2-2
print(sp.stats.chisquare([8, 2, 0, 0]))   #3
print(sp.stats.chisquare([8, 1, 1, 0]))   #4
print(sp.stats.chisquare([7, 1, 1, 1]))   #5<jupyter_output>Power_divergenceResult(statistic=30.0, pvalue=1.3800570312932553e-06)
Power_divergenceResult(statistic=22.799999999999997, pvalue=4.4450736470606521e-05)
Power_divergenceResult(statistic=22.799999999999997, pvalue=4.4450736470606521e-05)
Power_divergenceResult(statistic=17.199999999999999, pvalue=0.00064286025225389755)
Power_divergenceResult(statistic=16.399999999999999, pvalue=0.00093874205504504134)
Power_divergenceResult(statistic=10.800000000000001, pvalue=0.012858001156297613)<jupyter_text>단일 표본 z-검정 `norm`(One-sample z-test)http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html- 분산의 값을 정확히 아는 정규 분포의 표본에 대한 기대값 조사- `norm`과 `cdf`를 이용하여 구함. 데이터 수가 매우 부족하여, 결과가 오류인 경우, 유형 1 오류 (Type 1 Error) 라고 한다.  단일 표본 t-검정 `ttest_1samp`(One-sample t-test)http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_1samp.html- 정규분포의 표본에 대해 기대값을 조사하는 방법- `ttest_1samp`명령을 사용한다.- 디폴트 모수가 없으므로 `popmean`으로 직접 지정<jupyter_code>N = 10
mu_0 = 0
np.random.seed(0)
x = sp.stats.norm(mu_0).rvs(N)
sns.distplot(x, kde=False, fit=sp.stats.norm)
print(sp.stats.ttest_1samp(x, popmean=0))
plt.show()

# 유의 확률 4%, 하지만 Type 1 error
N = 100
mu_0 = 0
np.random.seed(0)
x = sp.stats.norm(mu_0).rvs(N)
sns.distplot(x, kde=False, fit=sp.stats.norm)
print(sp.stats.ttest_1samp(x, popmean=0))
plt.show()

# 유의 확률 55.62%<jupyter_output>Ttest_1sampResult(statistic=0.59042834028516977, pvalue=0.55624891586946745)<jupyter_text>독립 표본 t-검정 `ttest_ind`(Independent-two-sample t-test)http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html- 두 개의 독립적인 정규분포의 두 데이터셋을 사용- 두 정규 분포의 기대값이 동일한지 검사- 두 정규 분포의 분간 값이 같고 다르고에 따라 , 검정 통계량이 다르기 때문에, `equal_var`인수를 사용하여 지정<jupyter_code># 기대값이 다르고, 분산과 샘플의 수는 같은 경우

N_1 = 10; mu_1 = 0; sigma_1 = 1
N_2 = 10; mu_2 = 0.5; sigma_2 = 1
np.random.seed(0)
x1 = sp.stats.norm(mu_1, sigma_1).rvs(N_1)
x2 = sp.stats.norm(mu_2, sigma_2).rvs(N_2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()
sp.stats.ttest_ind(x1, x2, equal_var=True)<jupyter_output><empty_output><jupyter_text>기대값이 다름에도, p-value가 작기 때문에 귀무 가설을 기각할 수 없다. - Type 2 Error데이터 수가 증가하면 오류 발생 가능성도 줄어든다.<jupyter_code>N_1 = 50; mu_1 = 0; sigma_1 = 1
N_2 = 100; mu_2 = 0.5; sigma_2 = 1
np.random.seed(0)
x1 = sp.stats.norm(mu_1, sigma_1).rvs(N_1)
x2 = sp.stats.norm(mu_2, sigma_2).rvs(N_2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()
sp.stats.ttest_ind(x1, x2, equal_var=True)

# p-value가 낮기 때문에, 귀무가설 기각한다.<jupyter_output><empty_output><jupyter_text>연습 문제 5¶1반과 2반 학생 들의 성적이 각각 다음과 같다고 가정하자.  1반 : 80점, 75점, 85점, 50점, 60점, 75점, 45점, 70점, 90점, 95점, 85점, 80점  2반 : 80점, 85점, 70점, 80점, 35점, 55점, 80점      1반의 실력이 2반보다 좋다고 이야기 할 수 있는가?<jupyter_code>x1 = np.array([80, 75, 85, 50, 60, 75, 45, 70, 90, 95, 85, 80])
x2 = np.array([80, 85, 70, 80, 35, 55, 80])

sp.stats.ttest_ind(x1, x2, equal_var=True)

# 54% 채택? Type 2 Error , N이 너무 적다
# 정규분포
X = sp.stats.norm(x1.mean(), x1.std()).rvs(len(x1))
Y = sp.stats.norm(x2.mean(), x2.std()).rvs(len(x2))

sns.distplot(X, kde=False, fit=sp.stats.norm)
sns.distplot(Y, kde=False, fit=sp.stats.norm)
plt.show()<jupyter_output><empty_output><jupyter_text>대응 표본 검정 `ttest_rel`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html- 두 정규 분포의 기대값이 같은지 확인하기 위한 검정- 대응하는 정보를 알고 있다면, 샘플 간의 차이의 영향을 없앨 수 있으므로, 영향을 보다 정확하게 추정 가능.<jupyter_code># 평균이 달라진 경우, N = 5

N = 5
mu_1 = 0
mu_2 = 0.5
np.random.seed(1)
x1 = sp.stats.norm(mu_1).rvs(N)
x2 = x1 + sp.stats.norm(mu_2, 0.1).rvs(N)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()
sp.stats.ttest_rel(x1, x2)

# 두 데이터의 평균이 다르다.
# 정확도 p-value = 0.2%<jupyter_output><empty_output><jupyter_text>연습 문제 6¶어느 학급의 9월달 성적과 10월달 성적이 다음과 같다. 점수는 학생 번호 순으로 배열되어 있다.9월 : 80점, 75점, 85점, 50점, 60점, 75점, 45점, 70점, 90점, 95점, 85점, 80점  10월: 90점, 70점, 90점, 65점, 80점, 85점, 65점, 75점, 80점, 90점, 95점, 95점이 학급의 실력은 더 향상되었다고 이야기 할 수 있는가?<jupyter_code>x_9 = np.array([80, 75, 85, 50, 60, 75, 45, 70, 90, 95, 85, 80])
x_10 = np.array([90, 70, 90, 65, 80, 85, 65, 75, 80, 90, 95, 95])

print(x_9.mean(), x_10.mean())

X = sp.stats.norm(x_9.mean(), x_9.std()).rvs(len(x1))
Y = sp.stats.norm(x_10.mean(), x_10.std()).rvs(len(x2))

sns.distplot(X, kde=False, fit=sp.stats.norm)
sns.distplot(Y, kde=False, fit=sp.stats.norm)
plt.show()
sp.stats.ttest_rel(x_9, x_10)

# 유의확률 2%의 정확도로 9월보다 10월의 평균 점수가 향상되었다. 고 할 수 있다.<jupyter_output><empty_output><jupyter_text>카이 제곱 분산 검정 `chi2`정규 분포의 분산.- 샘플 분산 값을 정규화 $\rightarrow$ 카이 제곱 분포를 따른다.<jupyter_code>def chi2var_test(x, sigma2=1):
    v = x.var(ddof=1)
    t = (len(x) - 1)*v/sigma2
    return t, sp.stats.chi2(df=len(x)-1).sf(np.abs(t))
N = 10
mu_0 = 0
sigma_0 = 1.1
np.random.seed(0)
x = sp.stats.norm(mu_0, sigma_0).rvs(N)
sns.distplot(x, kde=False, fit=sp.stats.norm)
plt.show()
x.std()
chi2var_test(x)<jupyter_output><empty_output><jupyter_text>등분산 검정 `bartlett` `flinger` `levene`- scipy.stats.bartletthttp://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.bartlett.html- scipy.stats.flignerhttp://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.fligner.html- scipy.stats.levenehttp://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.levene.html두 정규 분포로부터 생성된 두 개의 데이터 집합에서, 두 정규 분포의 분산 모수가 같은지 확인하는 검정<jupyter_code>N1 = 100
N2 = 100
sigma_1 = 1
sigma_2 = 1.2
np.random.seed(0)
x1 = sp.stats.norm(0, sigma_1).rvs(N1)
x2 = sp.stats.norm(0, sigma_2).rvs(N2)
sns.distplot(x1, kde=False, fit=sp.stats.norm)
sns.distplot(x2, kde=False, fit=sp.stats.norm)
plt.show()
x1.std(), x2.std()
sp.stats.bartlett(x1, x2)
sp.stats.fligner(x1, x2)
sp.stats.levene(x1, x2)<jupyter_output><empty_output><jupyter_text>정규성 검정 (normality test)(매우 중요) 회귀분석에서 확률분포가 가우시안 정규분포를 따르는지 확인  statsmodels 정규성 검정 명령어- Omnibus Normality test- `statsmodels.stats.stattools.omni_normtest`http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.stattools.omni_normtest.html  - Jarque–Bera test- `statsmodels.stats.stattools.jarque_bera`http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.stattools.jarque_bera.html  - Kolmogorov-Smirnov test- `statsmodels.stats.diagnostic.kstest_normal`http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.diagnostic.kstest_normal.html  - Lilliefors test- `statsmodels.stats.diagnostic.lillifors`http://statsmodels.sourceforge.net/devel/generated/statsmodels.stats.diagnostic.lillifors.html  SciPy 정규성 검정 명령어- Kolmogorov-Smirnov test- `scipy.stats.ks_2samp`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ks_2samp.html  - Shapiro–Wilk test- `scipy.stats.shapiro`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.shapiro.html  - Anderson–Darling test- `scipy.stats.anderson`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.anderson.html  - D'Agostino's K-squared test- `scipy.stats.mstats.normaltest`http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.normaltest.html - 이 중에서 Kolmogorov-Smirnov 검정은 사실 정규 분포에 국한되지 않음- 두 샘플이 같은 분포를 따르는지 확인할 수 있는 방법.<jupyter_code>np.random.seed(0)
N1 = 50
N2 = 100
x1 = sp.stats.norm(0, 1).rvs(N1)
x2 = sp.stats.norm(0.5, 1.5).rvs(N2)
sns.distplot(x1)
sns.distplot(x2)
plt.show()
sp.stats.ks_2samp(x1, x2)

# p-value 4.95%<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1604862150973311, 'fraction_numerical': 0.09142957808508764, 'mean_word_length': 4.450792126740279, 'pattern_counts': {'":': 0, '<': 62, '<?xml version=': 0, '>': 62, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 5, 'word_list_counts': {'cursed_substrings.json': 33, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '407155', 'license': 'MIT', 'n_tokens_mistral': 7216, 'n_tokens_neox': 7325, 'n_words': 1177, 'path': '3_math_for_datascience/06_Test_ParameterEstimation/20180226_06_03_basic_testing_SciPy.ipynb', 'repo_name': 'lucaseo/TIL', 'size': '11353'}