[파이썬 통계분석]추론 통계 강의 요약

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

흠.. 솔직히 이번 정리는 너무 빠진 부분이 많다. 추론 통계 부분은 간단하고 빠르게 넘어가셔서 이 정리보다는 책을 보는게 더 나을 것 같지만 그래도 올려보겠다.👴


추론 통계(Predictive Analysis)

  • 일부 데이터로부터 전체의 통계적 성질을 추측
  • 표본 정보(통계량)에 입각해 모집단의 정보를 얻어내는 과정
    • 추정 : 점추정, 구간추정
    • 검정 : 가설검정

확률(probability)

  • 어떤 사건이 일어날 가능성
  • 예시) 동전 던지기에 앞면이 나올 가능성, 주사위에서 1이 나올 확률

1) 객관적 확률

  • 실험이나 관찰의 필요에 따라 구분

논리적 확률(수학적 확률)

  • 어떤 한 시행에서 나타날 수 있는 결과의 개수
  • 동전던지기, 주사위던지기

경험적 확률(통계적 확률)

  • 동일한 조건하에서 같은 실험을 반복했을 때 어떤 특정한 사건이 발생한 비율, 상대도수로 계산

2) 주관적 확률

3) 공리적 해석

  • 모든 확률은 다음의 공리를 만족
  • A.N. Kolmogorov(1933)의 확률의 공리

4) 주변확률과 결합확률

5) 조건부 확률(conditional probability)

  • 일부 조건이 주어진 경우에 사건이 발생할 수 있는 경우

6) 독립 사상

7) 합률의 합법칙과 곱법칙

8) 전확률의 정리

9) 베이즈 정리(Bayes’ theorem)

확률분포와 확률변수

1) 확률분포(probability distribution)

  • 도수분포표 및 히스토그램을 확률분포라 한다.

2) 확률변수(random variable)

  • 실험이나 관찰의 결과 값을 1:1 실수로 대응시키는 함수
  • 동전을 던지는 실험에서 앞면이 나온 횟수에 대한

3) 확률 변수의 구분

  • 이산확률변수 : 변수가 취할 수 있는 값의 개수가 유한(히스토그램)
  • 연속확률변수 : 변수가 취할 수 있는 값의 개수가 무한(막대그래프)

4) 확률 함수

5) 확률 분포의 평균(mean)

  • 기대값(expected value)
  • E(X) 로 표시
  • 이산확률 분포의 기대값 : 확률을 가중값으로 사용한 가중평균
  • 연속확률분포의 기대값 : 적분개념의 면적

6) 확률 분포 종류

  • 이산형 확률분포
    • 이항분포(binomial distribution)
    • 포아송분포(poisson distribution)
  • 연속형 확률분포
    • t 분포 : 소표본 모집단 평균 추론 시 활용
    • 표준정규분포 : 대표본 모집단의 합, 평균 추론 시 활용
    • 카이제곱 분포 : 모집단 분산 추론 시(데이터 정규분포 가정) 활용
    • F 분포 : 두 모집단 분산 차이 비교 시 활용(데이터 정규분포 가정)

이항 분포

  • 베르누이 시행(Bernoulli trial)
    • 시행 또는 실험의 결과가 두가지 중 하나인 경우
  • 이항분포
    • X = 성공의 확률이 p인 베르누이 시행을 n번 반복할 대 성공의 수
    • 성공확률이 0.5에 가까우면 시행회수 n의 크기에 관계 없이 좌우대칭 종 모양을 함

정규분포

  • 가장 대표적인 분포
  • 가우지안(Gaussian) 분포
  • 연속형 확률변수에 대한 분포
  • 평균과 표준편차로 모양이 결정
    • 좌우대칭, 종모양
    • 중앙 한점이 뾰족
  • 자연계, 사회현상에 많이 나타남
  • 평균 주위로 +-1표준편차, +-2표준편차, +-3표준편차 안에 약 68%, 95%, 99%의 데이터가 있다.
  • 평균을 0, 표준편차를 1로 변환하면 표준정규분포(Z분포)


표본의 추출방법

  • 무작위 (임의)추출 : 임의로 표본을 추출하는 방법
  • 복원추출 : 여러 차례 동일한 표본을 선택하는 방법
  • 비복원추출 : 동일한 표본은 한번만 선택하는 방버
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%precision 3
%matplotlib inline
df = pd.read_csv('./data/ch4_scores400.csv')
scores = df['score']
scores[:10]
0    76
1    55
2    80
3    80
4    74
5    61
6    81
7    76
8    23
9    80
Name: score, dtype: int64
# 복원 추출 : 동일한 숫자가 추출 될 수 있음.
np.random.choice([1,2,3],3)
array([3, 3, 1])
# 비복원 추출 : 동일한 숫자가 추출 X
np.random.choice([1,2,3],3, replace=False)
array([2, 3, 1])
np.random.seed(123)
np.random.choice([1,2,3],3)
array([3, 2, 3])
# scores 데이터에서 sample 추출
np.random.seed(0)
sample = np.random.choice(scores, 20)

# 표본 평균
sample.mean()
70.4
# 전체 데이터의 평균
scores.mean()
69.530
for i in range(5):
    sample = np.random.choice(scores, 20)
    print(f'{i+1}번째 무작위 추출로 얻은 표본평균 {sample.mean()}')
1번째 무작위 추출로 얻은 표본평균 72.45
2번째 무작위 추출로 얻은 표본평균 63.7
3번째 무작위 추출로 얻은 표본평균 66.05
4번째 무작위 추출로 얻은 표본평균 71.7
5번째 무작위 추출로 얻은 표본평균 74.15

확률 모델

# 불공정한 주사위의 확률분포를 구하는 실험
# 확률 변수에 필요한 변수가 취할 수 있는 값 : dice
dice = [1,2,3,4,5,6]

# 그 값이 나올 수 있는 확률 : prob
prob=[1/21,2/21,3/21,4/21,5/21,6/21]
prob
[0.048, 0.095, 0.143, 0.190, 0.238, 0.286]
np.random.choice(dice, p=prob)
1
num_trial = 100
sample = np.random.choice(dice, num_trial, p=prob)
sample
array([4, 6, 4, 5, 5, 6, 6, 3, 5, 6, 5, 6, 6, 2, 3, 1, 6, 5, 6, 3, 4, 5,
       3, 4, 3, 5, 5, 4, 4, 6, 4, 6, 5, 6, 5, 4, 6, 2, 6, 4, 5, 3, 4, 6,
       5, 5, 5, 3, 4, 5, 4, 4, 6, 4, 4, 6, 6, 2, 2, 4, 5, 1, 6, 4, 3, 2,
       2, 6, 3, 5, 4, 2, 4, 4, 6, 6, 1, 5, 3, 6, 6, 4, 2, 1, 6, 4, 4, 2,
       4, 1, 3, 6, 6, 6, 4, 5, 4, 3, 3, 4])
freq, _ = np.histogram(sample, bins=6, range=(1,7))
pd.DataFrame({'frequency':freq,
             'rel.freq': freq/num_trial},
            index = pd.Index(np.arange(1,7), name = 'dice'))
frequency rel.freq
dice
1 5 0.05
2 9 0.09
3 13 0.13
4 27 0.27
5 19 0.19
6 27 0.27
# 100번의 시도는 정해져 있는 확률과는 차이가 있다.

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.hist(sample, bins=6, range=(1, 7), density=True, rwidth=0.8)
# 실제의 확률분포를 가로선으로 표시
ax.hlines(prob, np.arange(1, 7), np.arange(2, 8), colors='gray')
# 막대 그래프의 [1.5, 2.5, ..., 6.5]에 눈금을 표시
ax.set_xticks(np.linspace(1.5, 6.5, 6))
# 주사위 눈의 값은 [1, 2, 3, 4, 5, 6]
ax.set_xticklabels(np.arange(1, 7))
ax.set_xlabel('dice')
ax.set_ylabel('relative frequency')
plt.show()

output_39_0

# 10000번 시도
num_trial = 10000
sample = np.random.choice(dice, size=num_trial, p=prob)

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.hist(sample, bins=6, range=(1, 7), density=True, rwidth=0.8)
ax.hlines(prob, np.arange(1, 7), np.arange(2, 8), colors='gray')
# ax.set_xticks(np.linspace(1.5, 6.5, 6))
# ax.set_xticklabels(np.arange(1, 7))
ax.set_xlabel('dice')
ax.set_ylabel('relative frequency')
plt.show()

output_40_0

시도할수록 실제 확률 분포에 가까워진다.

추론 통계에서 확률

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)
ax.hist(scores, bins=100, range=(0, 100), density=True)
ax.set_xlim(20, 100)
ax.set_ylim(0, 0.042)
ax.set_xlabel('score')
ax.set_ylabel('relative frequency')
plt.show()

output_43_0

이산형/연속형 확률분포

image

사진 출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=tjgml1343&logNo=221979604865


통계적 추론(statistical inference)

  • 모집단에서 추출한 표본을 이용해 모집단의 특성(모수)를 예측하는 과정
  • 추정, 가설검정
import numpy as np
import pandas as pd
from scipy import stats

%precision 3
np.random.seed(1111)
import matplotlib.pyplot as plt

참고. 정규분포 관련 함수들

  • stat.norm(평균, 표준편차) : 평균과 표준편차의 정규분포를 따르는 확률변수 생성
  • .pdf(확률변수) : 밀도함수 계산
  • .cdf(확률변수) : 누적분포함수 P(<=확률변수)
  • .isf(alpha) : 상위 alpha%가 되는 확률변수값 반환
  • .interval(alpha) : 확률이 alpha가 되는 가운데 부분의 구간 반환

추정(estimation)

모평균의 구간추정

문제1

표준정규분포로부터 표본을 뽑아 95% 신뢰구간을 구하는 것을 20번 반복했을 때, 몇 개의 신뢰구간이 모평균을 포함할지 확인

# 성적 데이터

df = pd.read_csv('./data/ch4_scores400.csv')
scores = np.array(df['score'])
# 성적데이터 모집단의 평균과 분산 계산
p_mean = np.mean(scores)
p_var = np.var(scores)

p_mean, p_var
(69.53, 206.6691)
# 모집단의 분포
xs = np.arange(101)
rv = stats.norm(p_mean, np.sqrt(p_var))
plt.plot(xs, rv.pdf(xs), color='gray') # 평균 69.53, 부산 206.67인 정규분포
plt.hist(scores, bins=100, range = (0, 100), density=True)
plt.show()

output_57_0

# sample 데이터 생성
n_sam = 10000
n = 20
samples = np.random.choice(scores, (n_sam, n))
samples[:5]
array([[68, 75, 91, 60, 76, 70, 59, 56, 77, 54, 77, 60, 67, 86, 70, 54,
        52, 72, 57, 59],
       [97, 55, 61, 89, 80, 85, 70, 67, 77, 81, 48, 67, 56, 74, 94, 64,
        83, 65, 73, 71],
       [78, 67, 43, 63, 79, 46, 89, 79, 86, 85, 70, 57, 55, 63, 49, 83,
        83, 76, 62, 71],
       [74, 62, 48, 73, 45, 67, 58, 83, 49, 83, 67, 59, 66, 52, 54, 53,
        78, 80, 81, 57],
       [63, 83, 67, 75, 74, 73, 77, 78, 66, 86, 82, 67, 78, 54, 65, 92,
        64, 91, 61, 57]], dtype=int64)
rv = stats.norm()
rv.isf(0.025)
1.9599639845400545
# 모분산을 아는 경우 95% 신뢰구간 : 정규분포를 이용
rv = stats.norm()
n_samples = 20
n = 20
plt.vlines(p_mean, 0, 21)
for i in  range(n_samples):
    sample_ = samples[i]
    s_mean = np.mean(sample_)
    lcl = s_mean - rv.isf(0.025) * np.sqrt(p_var/n)
    ucl = s_mean + rv.isf(0.025) * np.sqrt(p_var/n)
#     ucl = s_mean - rv.isf(0.975) * np.sqrt(n_var/20)
    if lcl <= p_mean <= ucl:
        plt.scatter(s_mean, n_samples-i, color='gray')
        plt.hlines(n_samples-i, lcl, ucl, color='gray')
    else:
        plt.scatter(s_mean, n_samples-i, color='b')
        plt.hlines(n_samples-i, lcl, ucl, color='b')

plt.xticks([p_mean])
plt.xlabel('population mean')
plt.show()

output_60_0

# 모분산을 모르는 경우 95% 신뢰구간 : t-분포를 이용
n = 20
alpha = 0.025
sample_ = samples[0]
s_mean = np.mean(sample_)
s_var = np.var(sample_)
rv = stats.t(df=n-1) #자유도 = n-1
lcl = s_mean - rv.isf(alpha) * np.sqrt(s_var/n)
ucl = s_mean + rv.isf(alpha) * np.sqrt(s_var/n)
lcl, ucl
(61.94197882534913, 72.05802117465088)
n_samples = 20
n = 20
rv = stats.t(df = n-1)
alpha = 0.025
plt.vlines(p_mean, 0, 21)
for i in range(n_samples):
    sample_ = samples[i]
    s_mean = np.mean(sample_)
    lcl = s_mean - rv.isf(alpha) * np.sqrt(s_var / n)
    ucl = s_mean + rv.isf(alpha) * np.sqrt(s_var / n)
#     ucl = s_mean - rv.isf(0.975) * np.sqrt(n_var / 20)
    if lcl <= p_mean <= ucl:
        plt.scatter(s_mean, n_samples-i, color = 'gray')
        plt.hlines(n_samples - i, lcl, ucl, color = 'gray')
    else:
        plt.scatter(s_mean, n_samples-i, color = 'b')
        plt.hlines(n_samples - i, lcl, ucl, color = 'b')

plt.xticks([p_mean])
plt.xlabel('population mean')
plt.show()

output_62_0

문제2
만 7세 어린이 중 부모의 동의를 얻은 학생 중 10명을 표본으로 추출.
머리 둘레를 측정한 결과를 기준으로 모평균을 95% 신뢰수준에서 신뢰구간을 추정하시오.

# 표본 데이터
data = [520, 498, 481, 512, 515, 542, 520, 518, 527, 526]
s_mean = np.mean(data)
s_var = np.var(data)
print(s_mean, s_var)

n = len(data)
print(n)

# t-분포를 이용한 경우
alpha = 0.025 # 신뢰수준
rv = stats.t(df=n-1) #자유도 = n-1
lcl = s_mean - rv.isf(alpha) * np.sqrt(s_var/n)
ucl = s_mean + rv.isf(alpha) * np.sqrt(s_var/n)
lcl, ucl
515.9 249.89000000000001
10





(504.59170283295526, 527.2082971670446)
# 정규분포를 이용한 경우

rv = stats.norm() #자유도 = n-1
alpha = 0.025
lcl = s_mean - rv.isf(alpha) * np.sqrt(s_var/n)
ucl = s_mean + rv.isf(alpha) * np.sqrt(s_var/n)
lcl, ucl
(506.10233627489055, 525.6976637251095)

통계적 가설검정(test)

문제(p.294)
감자튀김 무게가 평균 130g으로 알려져있다.

# 감자 무게 측정데이터
df = pd.read_csv('./data/ch11_potato.csv')
sample = np.array(df['무게'])
sample
array([122.02, 131.73, 130.6 , 131.82, 132.05, 126.12, 124.43, 132.89,
       122.79, 129.95, 126.14, 134.45, 127.64, 125.68])
# 표본 평균 확인
s_mean = np.mean(sample)
s_mean
128.4507142857143
# 표본 분산 확인
s_var = np.var(sample)
s_var
14.735449489795883
# 모분산 = 9
rv = stats.norm(130, np.sqrt(9/14))
rv.isf(0.95) 
# 평균이 130이였을 때, 0.95부분이 128.6811831...
# 하지만 표본의 평균이 128.45 이므로  감자튀김의 평균 무게가 130g이라는 주장에 반대할 수 있다.
128.68118313069039

p값은 누적 분포 함수로 구할 수 있음

검정통계량 z는 아래와 같이 설정하자

  • 유의 수준은 0.05(5%)로 설정
# 검정 통계량 Z
Z = (s_mean - 130) / np.sqrt(9/14)
Z
# 검정 통계량 = -1.9322..
-1.932298779026813
# p-value
rv.cdf(Z)
0.0
  • p값을 기준으로 하는 가설 검정
    1. 가설을 세운다.
    2. 유의수준을 결정
    3. 검정통계량을 계산
    4. p값을 계산
    5. p값이 유의수분보다 크다면 귀무가설채택
      그렇지 않으면 귀무가설을 기각
rv=stats.norm()
rv.isf(0.95) # isf 는 확률에 대한 x값을 계산
-1.6448536269514722

단측검정과 양측검정에서는 기각역이 다르다.

# 검정 통계량
Z = (s_mean - 130) / np.sqrt(9/14)
Z
-1.932298779026813
# 양측검정, 임계값 : 표준 정규분포의 95% 구간에 따라 구할 수 있음
rv=stats.norm()
rv.interval(0.95) # 유의수준 0.95에 양쪽의 기각역의 위치라고 생각하면 될듯
(-1.959963984540054, 1.959963984540054)
  • 임곗값과 검정 통계량을 비교해 보면 검정통계량이 채택역에 들어 있다. => 귀무가설이 기각되지 않는다.
# 양측검정의 p값
rv.cdf(Z)*2 #cdf는 x가 주어지면 y값을 반환
0.05332263904625327

가설검정에서의 두가지 오류

  • 제 1종 오류
    • 실제로 ‘평균이 130g’인데도 ‘평균은 130g보다 작다’라는 결론을 내리는 상황
    • 본래 검출하지 말아야 할 것을 검출한 것이므로 오탐(false negative)
    • 위험률 : 제 1종 오류를 범하는 확률 a
  • 제 2종 오류
    • 실제로 ‘평균이 130g보다 작다’인데도 ‘평균은 130g보다 작다’라는 결론을 얻을 수 없는 상황
    • 본래 검출해야 하는 것을 검출하지 못했으므로 미탐(false negative)

모분산을 아는 경우

# 모분산을 아는 경우 모평균에 대한 양측검정을 위한 함수
# 정규분포를 기반

def pmean_test(sample, mean0, p_var, alpha=0.05):
    s_mean = np.mean(sample)
    n = len(sample)
    rv = stats.norm()
    interval = rv.interval(1-alpha)

    z = (s_mean - mean0) / np.sqrt(p_var/n)
    if interval[0] <= z <= interval[1]:
        print('귀무가설을 채택')
    else:
        print('귀무가설을 기각')

    if z < 0:
        p = rv.cdf(z) * 2
    else:
        p = (1 - rv.cdf(z)) * 2
    print(f'p값은 {p:.3f}')

모분산을 알지 못함

# 양측검정, t-분포를 이용

def pmean_test(sample, mean0, alpha=0.05):
    s_mean = np.mean(sample)
    u_var = np.var(sample, ddof=1)
    n = len(sample)
    rv = stats.t(df=n-1)
    interval = rv.interval(1-alpha) # 임계값 계산

    t = (s_mean - mean0) / np.sqrt(u_var/n)
    if interval[0] <= t <= interval[1]:
        print('귀무가설을 채택')
    else:
        print('귀무가설을 기각')

    if t < 0:
        p = rv.cdf(t) * 2 # p-value
    else:
        p = (1 - rv.cdf(t)) * 2
    print(f'p값은 {p:.3f}')

pmean_test(sample, 130)
귀무가설을 채택
p값은 0.169
# scipy.stats에 구현
t, p = stats.ttest_1samp(sample,130)
t, p # 통계량, p-value
(-1.4551960206404198, 0.16933464230414275)

t-test(t-검정)

  • one sample t-test
    • 정규성 가정
    • stats.ttest_1samp()
  • two sample t-test
    • 정규성, 등분산성 가정
    • 등분산 stats.ttest_ind(a,b, equal_var=True)
    • 이분산 stats.ttest_ind(a,b, equal_var=False)
    • 정규성 만족하지 않는 경우 : Mann-Whitney rank test
      • stats.mannwhitneyu(a,b)
  • paired sample t-test
    • 정규성 만족 : stats.ttest_1samp(a,b, popmean=모집단평균)
    • 정규성 만족하지 않는 경우 : Wilcoxon signed-rank test
      • stats.wilcoxon(before, after)

대응표본 t-test

  • 근력 운동 전후 집중력 비교
  • 귀무가설 : 전 == 후
  • 대립가설 : 전 != 후
# 대응표본 샘플데이터
data = pd.read_csv('./data/ch11_training_rel.csv')
print(data.shape)
data.head()
(20, 2)
0 59 41
1 52 63
2 55 68
3 61 59
4 59 84
# 기술 통계
data.describe()
count 20.000000 20.000000
mean 52.850000 58.250000
std 4.295346 11.964311
min 45.000000 37.000000
25% 50.500000 51.750000
50% 52.000000 58.500000
75% 55.500000 65.750000
max 61.000000 84.000000
# 데이터의 시각화 : 상자그림표
import matplotlib.pyplot as plt

plt.boxplot(data)
plt.show()

output_99_0

정규성 검정

# 정규성 검정
stats.shapiro(data.)
ShapiroResult(statistic=0.9670043587684631, pvalue=0.6907904148101807)
stats.shapiro(data.)
ShapiroResult(statistic=0.9786623120307922, pvalue=0.9156785011291504)
diff = data. - data.
diff
0     18
1    -11
2    -13
3      2
4    -25
5      8
6     -5
7     -3
8    -19
9    -18
10    -6
11    -8
12     3
13    13
14    -2
15    -6
16   -16
17   -16
18    -2
19    -2
dtype: int64
stats.shapiro(diff)
ShapiroResult(statistic=0.9785391688346863, pvalue=0.9138697981834412)
plt.boxplot(diff)
plt.show()

output_105_0

대응표본 t 검정 수행

stats.ttest_1samp(data.-data., 0)
Ttest_1sampResult(statistic=-2.204154108716127, pvalue=0.04004419061842953)

=> 귀무가설을 기각하므로, 근력운동이 집중력에 영향이 있다고 볼 수 있다.

독립 표본 t-test

  • 독립된 두 집단의 평균 비교
  • 귀무가설 : 두 집단의 평균은 같다.
  • 대립가설 : 두 집단의 평균은 차이가 있다.

  • 반별 점수 차가 있는지?
  • 두 집단은 정규성을 띄어야 한다, 두 집단의 분산에 따라 다른 검정식을 사용한다.

선행조건

  • 독립성 : 두 그룹은 서로 독립적이어야 함
  • 정규성 : 데이터는 정규분포를 따라야 함
    • 만약, 정규성을 띄지 않으면 비모수적인 방법인 부호검정을 진행
  • 등분산성 : 두 그룹의 데이터에 대한 분산이 같아야 함
    • Levene의 등분산 검정

예제 데이터

  • 두 학급(A,B)에 근력운동을 수행하여 집중력 테스트
  • 귀무가설 : 두 학급의 집중력 차이가 없다.
  • 대립가설 : 두 학급의 집중력 차이가 있다.(양측검정)
data = pd.read_csv('./data/ch11_training_ind.csv')
data.shape
(20, 2)
data.head()
A B
0 47 49
1 50 52
2 37 54
3 60 48
4 39 51
data.describe()
A B
count 20.000000 20.000000
mean 48.750000 52.050000
std 6.711145 5.020746
min 37.000000 41.000000
25% 44.750000 49.000000
50% 48.500000 52.000000
75% 53.000000 54.250000
max 64.000000 64.000000
plt.boxplot(data)
plt.show()

output_115_0

1. 정규성 검정

# 정규성 검정
stats.shapiro(data.A)
ShapiroResult(statistic=0.9685941338539124, pvalue=0.7249506711959839)
stats.shapiro(data.B)
ShapiroResult(statistic=0.9730017781257629, pvalue=0.8165717720985413)

=> 두 학급의 데이터는 모두 정규성을 만족

2. 등분산성 검정

  • 귀무가설 : 두 집단의 분산이 같다.
stats.levene(data.A, data.B)
LeveneResult(statistic=2.061573118077718, pvalue=0.15923550057222613)

=> p값이 0.05보다 크므로 귀무가설을 기각하지 않는다. 즉, 두 집단의 분산은 같다.(등분산)

3. 독립표본 t-검정

# equal_var는 분산이 같니? 안같니?
# False로 지정된 경우 웰치 방법 사용
stats.ttest_ind(data.A, data.B, equal_var=True)
Ttest_indResult(statistic=-1.7608157246524712, pvalue=0.08631600572195147)

=> 귀무가설 채택 : 두 집단의 집중력 차이가 없다.

stats.ttest_ind(data.A, data.B, equal_var=False)
Ttest_indResult(statistic=-1.760815724652471, pvalue=0.08695731107259361)

정규성을 만족하지 않는 경우

  1. 대응표본 t-test는 윌콕슨 부호순위검정을 적용
    • stats.wilcoxon(전, 후)
  2. 독립표본 t-test는 맨휘트니 U검정 적용
    • stats.mannwhitneyu(A, B, alternative=’two-sided’) <- two-sided는 양측검정
# 앞의 20명 학생의 집중력 테스트 대응표본 데이터
stats.wilcoxon(diff)
WilcoxonResult(statistic=49.5, pvalue=0.03623390197753906)
# 두 학급의 학생들의 집중력 테스트 데이터(독립표본)
stats.mannwhitneyu(data.A, data.B)
MannwhitneyuResult(statistic=130.0, pvalue=0.02974305583063662)


카이제곱 검정

  • 범주형 데이터에 대하여
  • 카이제곱 분포 근거
  1. 적합도 검정 : 한 표본데이터가 어떤 분포를 하는지?
  2. 동질성 검정 : 두 범주형 데이터가 동일한 분포를 하는지?
  3. 독립성 검정 : 두 범주형 데이터가 서로 관련성 있는지(독립)

독립성 검정

  • 두 범주형 변수가 서로 독립적인지 검정
    • 귀무가설 : 두 변수가 서로 독립
    • 대립가설 : 두 변수가 서로 종속
  • 교차테이블로 시각화
# 모듈들 호출!!
import numpy as np
import pandas as pd
from scipy import stats

%precision 3
np.random.seed(1111)
# 예제 데이터
data = pd.read_csv('./data/ch11_ad.csv')
data.shape # 데이터 크기 확인
(1000, 2)
data.head()
광고 구입
0 B 하지 않았다
1 B 하지 않았다
2 A 했다
3 A 했다
4 B 하지 않았다
# 교차표 생성
cross = pd.crosstab(data.광고, data.구입)
cross
구입 하지 않았다 했다
광고
A 351 49
B 549 51
# 카이제곱 독립성검정
stat, p, df, exp_tab = stats.chi2_contingency(cross, correction = False)
stat # 통계량
3.75
p # p-value
0.052807511416113395
df # 자유도
1
exp_tab
array([[360.,  40.],
       [540.,  60.]])

2022

[web]jQuery 복습 3

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

16 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

6 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

9 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

2 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑