Study/통계

통계로 데이터 분석 이해하기_기술통계와 통계 실험 유의성 검정

김 도경 2024. 10. 8. 16:27

[2024.10.08] 필수 온라인 강의 Part3 통계로 데이터분석 능숙해지기 CH03 기술통계 , CH04 통계실험과 유의성 검정

모집단과 표본

 

모집단(Population)

  • 통계를 통해 알고 싶어하는 모든 집단
  • 모수(paramenter) : 모집단의 특성 (모평균, 모분산, 모표준편차 등)

표본(Sample)

  • 모집단의 분포, 특성을 알기 위해 모집단에서 추출된 일부 집단
  • 통계량(statistic) : 표본의 특성(표본평균, 표본 분산, 표본 표준편차 등)

추출(Sampling)

  • 모집단에서 표본을 추출하는 방법
  • 확률 표본 추출
      - 단순 샘플링 (Simple Random Sampling) : 모든 요소가 동등한 확률로 선택될 수 있도록 무작위
      - 층화 샘플링 (Stratified Sampling) : 모집단을 특정 기준에 따라 여러 '층'으로 나눈 후, 각 층에서 무작위 샘플링
      - 계통 샘플링 (Systematic Sampling) : 모집단의 리스트에서 일정 간격을 두고 샘플을 선택하는 방법
      - 군집 샘플링 (Cluster Sampling) : 모집단을 여러 '군집'으로 나눈 후, 그 중 일부 군집을 무작위로 선택하고, 선택된 군집 내의 모든 요소를 조사

추론(Inference)

  • 표본 통계량으로 모집단의 특성을 추론
정규분포와 중심극한정리

  • 정규 분포는 연속 확률 분포 중에서 가장 많이 사용
  • 평균에 대해서 좌우 대칭, 평균에서 최대값, 종 모양
  • 자연 현상이나 사회 여러 현상들이 정규 분포를 따른다.
  • 정규 분포는 평균과 표준편차에 의해 결정된다.

중심 극한 정리

  • 표본의 크기가 커질수록 표본 평균의 분포는 모집단의 분포 모양과는 관계없이 정규분포에 가까워짐
  • 표본 평균의 평균 = 모집단의 모평균
  • 표본 평균의 표준편차 = 모집단의 모표준편차 / 표본크기의 제곱근
카이 제곱 분포
(chi-squared distribution, x² 분포)

 

 

  • 검정 통계량이 카이제곱 분포를 따르는 통계 검정에 사용
  • 분산의 특정을 확률 분포로 만든 것 : 마이너스가 없음
  • 분포는 자유도에 의해 정의 : 자유도가 높을수록 정규분포에 근접 , 보통은 2~3정도다.
  • 카이제곱 분포의 자유도가 높을수록 정규 분포에 근접
  • y-skewed(y축에 편향된) 분포 : 그래프를 보기
  • 제공된 값의 분산을 다루기 때문에, - 값은 존재하지 않고 + 값만 존재
스튜던트 t분포

  • 모집단의 분산이 알려져 있지 않거나 소규모 표본일 경우 사용할 수 있음
  • t-분포는 정규 분포와 비슷하지만, 표본의 크기가 작을 때 꼬리 부분이 더 두껍고 길다
  • 표본의 크기가 30 이하일 때 t-분포를 사용
  • t-분포가 널리 사용되는 이유 : 중심극한정리에 의해 보통 통계량은 정규 분포를 따르기 때문
  • t-분포는 표본평균과 두 표본평균 사이의 차이, 회귀 파라미터 등의 분포를 위한 기준으로 사용
F분포
  • 스튜던트 t 분포는 집단 3개 이상은 검정이 불가 → F 분포로 검정
  • 집단간의 분산을 다룸
  • 분산분석에 주로 사용

가설 검정

 

검정(Test) : 내가 세운 가설이 통계적으로 유의한지 살펴보는 것

  • 검정 순서 : 귀무가설과 대립가설을 설정한다. -> p-value를 구한다. -> p-value를 기준으로 가설의 채택/기각 여부를 결정한다.

  • 귀무가설 (Null hypothesis: H0)
        - 검정 대상이 되는 가설
        -  관습적이고 보수적인 가설
        -  표본을 보고 "이러할 것이다."라고 세운 가설
        -  연구자가 주장하고 싶은 대립가설과 반대되는 진술
        -  귀무가설은 기각(Reject)이 목표
  • 대립가설 (Alternative hypothesis: H1)
        -   귀무가설에 대립되는 가설
        -   지금까지 알려지지 않은 새로운 주장
        -   연구자가 원하는 주장 혹은 가설
        -   대립가설은 채택(accept)이 목표
  • 귀무가설과 대립가설은 정반대이다

  • P-value : 귀무가설이 참이라는 가정 하에서, 실제로 관찰된 데이터나 그보다 더 극단적인 결과가 나올 확률
        - 작을수록 관찰된 결과가 우연에 의해 발생할 가능성이 적다는 것을 의미
              - 값이 작다 : 귀무가설을 기각할 수 있는 증거가 강함 : 대립가설이 맞음
              - 값이 크다 : 귀무가설을 기각할 수 없다 : 귀무가설이 맞다
       - p-value ≤ 0.05: 통계적으로 유의미
       - p-value > 0.05: 통계적으로 유의미하지 않음
            ex) 어떤 실험에서 새로운 약물이 기존 약물보다 효과가 더 좋다는 가설을 세움, 실험 결과에서 p-value가 0.03
                    -> 이 가설이 맞을 확률이 97% , 새로운 약물이 효과가 더 좋을 확률이 97%이다.
  • 단측 검정 (one-tailed test) : 한 방향성으로 가능성이 크다고 생각될때
  • 양측 검정 (two-tailed test) : 방향성은 모르겠지만, 차이가 있다고 생각이 될 때
  • 검정에서 조심해야할 실수
       - 제 1종 오류 : 귀무가설이 옳은데도 불구하고 이를 기각
                              우연에 의한 효과를 실제라고 생각하고 잘못된 결론, 설레발
       - 제 2종 오류 : 귀무가설이 옳지 않은데도 이를 채택
                              실제 효과를 우연에 의한 효과라고 생각한 경우, 믿는 도끼에 발등

  • t 검정 (t test)
     - 모집단의 분산이나 표준편차를 알지 못할 때 모집단을 대표하는 표본으로부터 추정된 분산이나 표준편차를 가지고 검정
    - “두 모집단의 평균간의 차이는 없다”라는 귀무가설과 “두 모집단의 평균 간에 차이가 있다”라는 대립가설 중 선택
         - 평균으로 한다!라는 걸 알아야한다! 평균을 이용하는 검정이다!
    - t 값 (t-value) : 검정에 이용되는 검정통계량, 두 집단의 차이의 평균(X)을 표준오차(SE)로 나눈 값
                             - 표준오차와 [표본평균차이의 차이]의 비율
    - 기각역 (Critical Region) : 귀무가설이 기각되기 위한 검정통계량(t값)이 위치하는 범위
                    - 면적=α (유의수준)과 자유도(n-1)에 의해 결정
                    -  단측검정(one-tailed test)의 경우 기각역이 한 쪽에 존재, 양측검정(two-tailed test)의 경우 기각역이 양쪽에 존재
    - 독립표본 t test : 서로 독립인 두 집단 비교
    - 대응표본 t test : 동일 그룹에 어떤 처리 후 전후 비교

* 독립표본 t test 실습

if 표본의 크기가 10~30이면, 정규성 검정 -> 정규성이라면, 등분산 검정, 아니라면 순위합 검정
if 표본의 크기가 30 이상이면, 등분산 검정 -> 등분산이라면, 등분산 가정 독립표본 t test, 아니라면 이분산 가정 독립표본 t test

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as stats

house_a = np.random.normal(6, 5, 40)              #집값은 랜덤으로 생성
house_b = np.random.normal(3, 5, 40)              #집값은 랜덤으로 생성

tmp1 = pd.concat([pd.DataFrame(['A']*40), pd.DataFrame(house_a.tolist())], axis=1)             #데이터프레임 포멧으로 바꿔줌
tmp2 = pd.concat([pd.DataFrame(['B']*40), pd.DataFrame(house_b.tolist())], axis=1)             #데이터프레임 포멧으로 바꿔줌

df.columns = ['grp', 'value']                # 컬럼 두개만 가져옴

sns.boxplot(x='grp', y='value', data=df)        #seaborn으로 그래프를 그림
plt.show()

 

등분산 검정

귀무가설 : 수도권(grp A), 지방(grp B) 집값의 분산이 같다.
대립가설 : 수도권(grp A), 지방(grp B) 집값의 분산이 다르다

stats.levene(np.array(df[df['grp'] == 'A']['value']), np.array(df[df['grp'] == 'B']['value']))     #A와 B의 value만으로 같은지 확인

stats.ttest_ind(np.array(df[df['grp'] == 'A']['value'])
              , np.array(df[df['grp'] == 'B']['value'])
              , equal_var=True)
LeveneResult(statistic=0.20332704798347626, pvalue=0.6532997090203332)         : p-value>0.05 

Ttest_indResult(statistic=3.566860440061266, pvalue=0.0006212594134944521)       : p-value<0.05 귀무가설을 기각하고 채택가능

-> 수도권과 지방의 짒값이 차이가 존재한다.

 

Levene’s Test (등분산 검정) : 두 집단의 분산이 동일한지 검정하는 방법

 

분산분석 (ANOVA, Analysis of variance)

 

분산분석(Anova)

  • 3개 이상의 다수 집단을 비교할 때 사용하는 검정 방법

 

등분산성 가정

  • 집단 내 분산이 서로 비슷한가? 비슷해야 비교 가능 : 위 사례에서 B는 비교 불가

검정순서

  • Omnibus F 검정 : 여러 집단 간의 평균 차이를 검정할 때 사용
              - 두 개 이상의 집단 평균이 모두 동일한지, 아니면 적어도 하나의 집단이 다른 집단과 차이가 있는지를 판단
        F값이 큰가? 차이가 있는가?
          - one way Anova : 한 가지 요인(변수)에 대해 여러 집단의 평균을 비교
                                       ( 세그룹의 성적)
          - two way Anova : 두 가지 요인(변수)에 대해 집단 간의 상호작용을 고려하여 평균을 비교하는 방식
                                       (성별과 학벌에 따른 성적영향 비교
  • post hoc 검정 : 구체적으로 얼마나 차이가 나는가?
    - ANOVA에서 유의미한 결과가 나왔을 때, 구체적으로 차이가 있는지를 확인하기 위해 추가적으로 수행하는 검정
  • 검정 실습
import pandas as pd
import seaborn as sns
import scipy.stats as stats
import matplotlib.pyplot as plt

from scipy.stats import shapiro
from scipy.stats import levene
from sklearn.datasets import load_iris
from statsmodels.stats.multicomp import pairwise_tukeyhsd

iris = load_iris()                             # iris 데이터 사용

iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)   # 데이터랑 타겟을 붙여주는 작업
target_df = pd.DataFrame(data=iris.target, columns=['target'])       # 데이터랑 타겟을 붙여주는 작업

df = pd.concat([iris_df, target_df], axis=1)
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'target']     # 컬럼명 바꿔주기

sns.boxplot(x='target', y='sepal_width', data=df)      # box플롯 그래프 만들기
plt.show()

 

일원 분산분석(One way ANOVA)

  • 귀무가설 : 집단(target) 간의 sepal_width 차이가 없다.
  • 대립가설 : 집단(target) 간의 sepal_width 차이가 있다.

1. 정규성 검정
- 귀무가설 : 정규분포를 따른다, 대립 가설 : 정규분포를 따르지 않는다.

print(shapiro(df.sepal_width[df.target==0]))         #정규성검사를 할 때 shapiro를 쓴다.
print(shapiro(df.sepal_width[df.target==1]))         #정규성검사를 할 때 shapiro를 쓴다.
print(shapiro(df.sepal_width[df.target==2]))         #정규성검사를 할 때 shapiro를 쓴다.

 

(0.97171950340271, 0.2715264856815338)           #귀무가설을 채택 -> 정규분포를 따름
(0.9741330742835999, 0.33798879384994507)
(0.9673910140991211, 0.1809043288230896)

 

2. 등분산성 검정
- 귀무가설 : 등분산성을 만족한다. , 대립 가설 : 등분산성을 만족하지 않는다

print(levene(df.sepal_width[df.target==0], df.sepal_width[df.target==1], df.sepal_width[df.target==2]))

 

LeveneResult(statistic=0.5902115655853319, pvalue=0.5555178984739075) 

# p>0.05, 귀무가설 채택 : 등분산성 만족

 

3. 일원 분산 분석 (One way ANOVA)

stats.f_oneway(df.sepal_width[df.target==0], df.sepal_width[df.target==1], df.sepal_width[df.target==2])

 

F_onewayResult(statistic=49.160040089612075, pvalue=4.492017133309115e-17)

# p<0.05         -> 결론 : 귀무가설 기각, 대립가설 채택

 

집단(target) 간의 sepal_width 차이가 있다.

 

4. 사후분석 (Post-hoc) : 구체적으로 어떤 차이가 나는지 검증하는 방법
Family Wise Error Rate : 하나의 가설에서 1종 오류가 발생할 가능성, 가설 검정을 많이 할 수록 FWER은 증가

hsd = pairwise_tukeyhsd(df['sepal_width'], df['target'], alpha=0.05)
hsd.summary()
group1 group2 meandiff p-adj lower upper reject
0 1 -0.658 0.001 -0.8189 -0.4971 True
0 2 -0.454 0.001 -0.6149 -0.2931 True
1 2 0.204 0.0088 0.0431 0.3649 True

 

카이제곱검정
  • 카이제곱 통계량은 데이터 분포와 가정된 분포 사이의 차이를 나타내는 측정값
  • 카이제곱 검정통계량이 카이제곱분포를 따른다면 카이제곱분포를 사용해서 검정 수행
  • 카이제곱분포에서 일어나기 불가능한 일이면 귀무가설 기각, 대립가설 채택 : t검정이랑 동일

독립성 검정: 두 변수는 서로 연관성이 있는가?
적합성 검정: 실제 표본이 내가 가정한 분포와 같은가?
동일성 검정: 두 집단의 분포가 같은가?

 

카이제곱검정 순서:
          1. 기대값을 구한다.
          2. 카이제곱을 구한다: (관측값 - 기대값)을 제곱하여 기대값으로 나눈다.
          3. 2번을 합하여 전체의 카이제곱 값을 구한다.
          4. 카이제곱의 자유도를 구한다.

 

A/B test에 대부분 카이제곱검정을 사용함

 

  • 카이제곱검정 실습
    - 독립성 검정 : 모집단을 범주화하는 두 변수 A, B가 서로 독립적으로 측정값에 영향을 미치는지 여부를 검정
                  귀무가설 : 유저 A군과 B군이 C페이지에 진입하는 것은 관련이 없다.
                  대립가설 : 유저 A군과 B군이 C페이지에 진입하는 것은 관련이 있다.

pow((200 - 240), 2)/240 + pow((100 - 60), 2)/60 + pow((400 - 360), 2)/360 + pow((50 - 90), 2)/90   # 테이블 설명

import pandas as pd
import scipy.stats as stats
import matplotlib.pyplot as plt

df = pd.DataFrame([[200, 100], [400, 50]], columns=['pv_t', 'pv_f']) # 데이터 프레임 불러오기

stats.chi2_contingency(observed=df)                            # 카이 제곱 검정을 진행

 

출력값 : (54.17534722222223, 1.833731033899248e-13, 1, array([[240., 60.], [360., 90.]]))

Chi-square : 54.17534722222223                  # 카이제곱값
p-value : 1.833731033899248e-13                 # p 값
df : 1                                                                # 자유도
expected value : array                        : array([[240., 60.], [360., 90.]]))는 기댓값

-> p<0.05 : 귀무가설 기각, 대립가설 채택   : 유저 A군과 B군이 C페이지에 진입하는 것은 관련이 있다.