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()
'코드스테이츠 AI 부트캠프 > Section 1' 카테고리의 다른 글
AIB_133_복습정리 : 선형변환, 고유값, 고유벡터, PCA (0) | 2021.12.04 |
---|---|
AIB_122_복습정리 : More Hypothesis Testing (0) | 2021.09.26 |
AIB_121_복습정리 : 가설검정, T-test (0) | 2021.09.26 |
AIB_121_복습정리 : Introduction to Data Science (1) (0) | 2021.09.26 |
[비공개] AIB_11x : 1주차 Challenge (0) | 2021.09.26 |