코드스테이츠 AI 부트캠프/Section 1

AIB_123_복습정리 : ANOVA, CLT, CI

yourhm 2021. 9. 26. 15:44

ANOVA (분산 분석)

: 2개 이상 다수의 집단을 서로 비교하고자 할 때 F-분포를 이용하여 가설검정을 하는 방법

 

예를 들어서 집단이 가, 나, 다 3개가 있을 때 서로 비교한다고 하자.

ㄴ 기존에 배웠던 t-test를 통해 한번씩 해보면 되지 않나? 가vs나, 나vs다, 다vs가

ㄴ 이론상으로는 가능. 그러나 여러개를 하나하나씩 비교하면 집단 수가 늘어 날수록 에러도 커진다.

(왜냐하면, m개 그룹에 대한 가설 검정이라면 아래라는 것이, 수학적으로 증명이 되어있다고한다. 왜??)

 

ㄴ 이렇기 때문에 여러개의 집단을 한꺼번에 비교하는 방법이 필요하다.

 

 

 

큰 수의 법칙

시행횟수를 무한히 늘려가면, 통계적 확률이 수학적 확률에 가까워진다.

 

예시

동전 던지기를 생각해보자.

ㄴ 사건 A: 동전을 던져서 앞면이 나온다.

ㄴ n: 동전을 던진 횟수

ㄴ X: n번 던졌을 때 실제로 앞면이 나온 횟수

 

X/n: n번 던졌을 때 앞면이 나올 확률 (-> 통계적 확률)

p: 0.5 (-> 수학적 확률)

 

10번 던졌을 때보다 1,000번 던졌을 때가 0.5에 가까운 값이 나옴.

1,000번 던졌을 때보다 10,000번 던졌을 때가 0.5에 가까운 값이 나옴.

 

 

 

중심극한정리

- 수업중 나의 메모 -
우리가 실험을 할 때, 그 데이터가 어떤 분포에서 왔는지 항상 알 수가 없다. 이때 '중심극한정리'가 말한다. "걱정마 그래도 괜찮아. 몰라도 크게 상관 없어" 표본의 갯수가 클수록, 즉 표본의 크기가 클수록 표본의 평균은 정규분포에 근사한 형태로 나타난다. => 우리는 중심극한정리를 통해 표본의 평균들이 정규분포를 따른다는 것을 안다! 그렇기때문에 원래 데이터의 분포를 모른다고 해서 너무 걱정할 필요 No No! 왜냐하면 다양한 통계검정에 표본평균이 사용되기 때문에(T-test 가능. ANOVA 가능). 단, 중심극한정리가 잘 작동하기 위한 조건은 표본에서 평균값을 구할 수 있어야 한다는 것.

 

모집단의 분포와 상관없이 임의의 분포에서 추출된 표본들의 수가 많을 수록,

표본들의 평균 분포(=표본평균분포)는 정규분포에 근사한 형태로 나타난다는 정리.

단, 중심극한정리가 성립하기 위해서 표본크기(Sample Size)는 최소 30이상이어야한다.

 

이점을 이용하여, Z값을 구해 확률값을 구할 수 있게된다. (=확률적 판단 즉, 추정을 할 수 있게되는것.)

 

 

*표본평균분포: 모집단에서 표본 크기가 n인 표본을 여러번 반복해서 추출했을 때 각각의 표본 평균들이 이루는 분포

(ex. n=30인 표본을 200번 추출하면 X1(n=30), X2(n=30), X3(n=30), X4(n=30) ... X200(n=30))

 

*평균의 표준 오차(standard error of the mean, SEM)는 표본평균분포의 표준 편차를 가리킨다.

standard error = s/sqrt(n)

 

 

 

점추정보단 구간추정

- 점추정: 통계량 하나를 구하고 그것을 가지고 모수를 추정하는 방법

- 구간추정: 점추정의 정확성을 보완하는 방법. 신뢰구간을 만들어서 추정하는 것.

 

• 점추정에 비해 구간 추정을 하는 것이 더 의미가 있다. (신뢰도: 점 추정 < 구간 추정)

• 왜냐하면 구간 추정은 신뢰구간을 사용하기 때문에! 예측하는 '구간'이 넓어질 수록 맞을 확률(=신뢰도)이 높아짐.

• 내년 10월 평균기온은 18도야 라고 딱 정확하게 예측해서 맞추는 것은 거의 불가능하다.

• 내년 10월 평균기온은 15~20에 속할 확률이 90%야 라고 신뢰구간을 갖고 어떤 range를 예측하는 것이 더 믿을만 하다.

 

예시

한국 초등학교 3학년의 평균 키.

 

점 추정

130cm 일 것이다.

 

구간 추정

< 120 ~ 135cm 정도 일 것이다.

< 100 ~ 150cm 정도 일 것이다.

< 1 ~ 300cm 정도 일 것이다.

 

 

[참고자료]

파이썬으로 분산분석(ANOVA)

https://partrita.github.io/posts/ANOVA-python/

 

BioinformaticsAndMe 블로그, "중심극한정리"

https://bioinformaticsandme.tistory.com/277

 

 


파이썬 코딩 연습

 

1-1. 구글 드라이브에서 코랩으로 파일 불러오기

 

STEP 1) 아래 코드를 실행하면, 액세스가 필요한 구글계정을 선택하라는 화면이 나오고, 내가 원하는 계정을 고르기

from google.colab import drive
drive.mount('/content/drive')

 

STEP 2) 계정 고르고 나면, 인증코드가 뜨는데 그 코드 복붙.

STEP 3) Enter your authorization code: <-- 에 붙여넣기후 엔터.

STEP 4) 세팅 끝. pd.read_csv 사용하여 불러오기.

import pandas as pd
pd.read_csv('/content/drive/My Drive/example.csv')

 

⚠ 주의사항 ⚠ 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 0: invalid continuation byte

 

: 만약 불어올 파일이 한글이 포함된 csv, txt 파일이라면 read_csv, read_table로 읽어올 때 위와 같은 오류 메세지와 함께 오류가 발생할 수 있다. 이런 경우 encoding 파라미터에 한글전용 인코딩 방식인 'cp949'를 사용하면 된다.

 

import pandas as pd
df=pd.read_csv('/content/drive/MyDrive/example.csv', encoding='cp949')

 

1-2. 특정 컬럼에서 'A'인 데이터만 사용하기

df=df[df['ColName1'].isin(['A'])]
df

 

1-3.  컬럼 여러개 선택하기 (복수 선택, 다중 선택)

# 특정 columns 다중 선택하기
df=df[['ColName1','ColName2','ColName3']]
df

 

1-4. 인덱스 초기화하기

# 인덱스 초기화하기
df.reset_index(drop=True, inplace=True)
df

 

 


2-1. 샘플 2개 생성하기

  • s1: 20개의 데이터
  • s2: 200개의 데이터
  • 모두 random_state로 42를 설정할 것

pandas.DataFrame.sample(n=None, frac=None, random_state=None)

# n : 특정 개수의 표본을 무작위로 추출
# frac :특정 비율(fraction)으로 무작위 표본 추출을 원하면 매개변수에 0 ~ 1 사이의 부동소수형(float) 값을 입력

# random_state : 무작위(확률) 표본 추출을 위한 난수(random number)를 생성할 때 초기값(seed number) 로서, 재현가능성(reproducibility)을 위해서 설정.

# pandas 이용하여 샘플 생성
s1=df.sample(n=20, random_state=42)
s2=df.sample(n=200, random_state=42)

 

 


3-1. 두 샘플에 대해서 특정 컬럼의 표본평균을 계산하기

import numpy as np

s1mean=np.mean(s1['ColName1'])
s2mean=np.mean(s2['ColName1'])
print("s1 ColName1 표본평균:",s1mean,",","s2 ColName1 표본평균:",s2mean)

 

 


4-1. 95%에 해당하는 신뢰구간 계산하기

  • CI1과 CI2에 계산하기
  • ddof는 1을 사용

 

🔽 방법1 : 함수 만들어서 계산

  • scipy.stats.sem(a, axis=0, ddof=1, nan_policy='propagate')
    : standard error of the mean 를 계산해주는 함수 (scipy 공식문서)
  • scipy.stats.t.ppf(q, df, loc=0, scale=1)
    : t-value 계산할 수 있음 (scipy 공식문서)

 

from scipy import stats

def confidence_interval(data, confidence = 0.95):
    
    data = np.array(data)
    mean = np.mean(data)
    n = len(data)

    # standard error of the mean.
    # scipy.stats.sem(a, axis=0, ddof=1, nan_policy='propagate')
    stderr = stats.sem(data) 

    # t-value.
    # scipy.stats.t.ppf
    # ddof = delta 자유도. 표본의 편향을 조정할 자유도. 기본값은 1
    interval = stderr * stats.t.ppf( (1 + confidence) / 2 , n - 1)

    # 리턴 값으로는 평균에서 구간을 빼고, 더한 값 두개를 리턴.
    return (mean - interval, mean + interval)

 

confidence_interval(s1['ColName1'], confidence = 0.95)

(0.015060460813957321, 0.028439539186042674)

 

confidence_interval(s2['ColName1'], confidence = 0.95)

(0.02100651526262625, 0.02483348473737375)

 

 

🔽 방법2 : 직접 계산

  • scipy.stats.t.interval(alpha, df, loc=0, scale=1)
from scipy.stats import t

# 표본크기
n1=len(s1)
n2=len(s2)
# 자유도
dof1=n1-1
dof2=n2-1
# 표본평균
s1mean
s2mean
# 표본의 표준편차
sample_std1=np.std(s1['ColName1'], ddof = 1)
sample_std2=np.std(s2['ColName1'], ddof = 1)
# 표준 오차
std_err1=sample_std1/n1**0.5 # sample_std1/sqrt(n1)
std_err2=sample_std2/n2**0.5 # sample_std2/sqrt(n2)

CI1=t.interval(.95, dof1, loc=s1mean, scale=std_err1)
CI2=t.interval(.95, dof2, loc=s2mean, scale=std_err2)
print("CI1:",CI1,",","CI2:",CI2)

CI1: (0.015060460813957323, 0.02843953918604268) , CI2: (0.021006515262626202, 0.0248334847373737)

 

 


5-1. plt.bar를 사용하여 신뢰구간 시각화

#모집단 평균 계산하기

pop_mean=np.mean(df['ColName1'])
pop_mean

0.023588709677419318

 

import matplotlib.pyplot as plt

pop_mean=np.mean(df['ColName1'])

fig = plt.figure()
ax = fig.add_axes([0,0,0.8,0.8])

plt.bar(x="s1", height=s1mean, yerr=(s1mean-CI1[0])/2, capsize=7)
plt.bar(x='s2', height=s2mean, yerr=(s2mean-CI2[0])/2, capsize=7)

plt.axhline(pop_mean, linestyle='--', color='#4000c7', linewidth=1)
plt.hlines(s1mean, xmin=-0.2, xmax=0.2, linestyles='solid')
plt.hlines(s2mean, xmin=0.8, xmax=1.2, linestyles='solid')

plt.show()