다시 이음

데이터 통계 - 3 (신뢰구간 설정과 ANOVA) 본문

AI 일별 공부 정리

데이터 통계 - 3 (신뢰구간 설정과 ANOVA)

Taeho(Damon) 2021. 7. 19. 22:07

신뢰구간과 ANOVA에 대해 설명 하기 전에 이해를 도울 수 있도록 기초 설명을 한다.

 

큰 수의 법칙 ( Law of large numbers )

sample 데이터의 수가 커질 수록, sample의 통계치는 점점 모집단의 모수와 같아진다.

 

중심극한정리 ( Central Limit Theorem, CLT )

Sample 데이터의 수가 많아질 수록, sample의 평균은 정규분포에 근사한 형태로 나타난다.

 

 

신뢰구간

신뢰도가 95% 라는 의미는 표본을 100번 뽑았을때 95번은 신뢰구간 내에 모집단의 평균이 포함된다.

즉, 신뢰구간이 95%->99%가 된다면 99%의 확률로 해당 구간에 평균이 포함되어 있을 것이다.

그러나 신뢰구간이 넓어짐에 따라 해당 되는 값들이 너무 많아 유의미한 결과를 얻기는 힘들다.

 

또한 표본의 수가 많아질수록 데이터가 많아져서 신뢰구간은 점점 좁아진다.

 

신뢰구간을 표현한 식

x̄ = 표본의 평균

t = t-value

s = 표본의 표준편차

n = 표본의 개수

- t * s / √n = 표준오차(Standard Error of Mean, SEM)

 

**  표본의 평균 - 표준오차 <  신뢰구간  < 표본의 평균 + 표준오차

 

참조)

Z-distribution : 평균은 0 , 분산은 1인 표준정규분포. - 신뢰구간 설정 시 x̄  +- z(1.96) * 𝜎(모집단 표준편차) / √n

T-distribution : 표준정규분포보다 양측 tail을 두껍게 변형한 것으로 표본의 크기가 충분하지 않을 때 z분포 대신 많이 쓰인다.

자유도(df)가 커질수록 z분포와 같게 된다. - 신뢰구간 설정시 모집단의 표준편차를 모를 경우 t를 사용하여 신뢰구간을 구함.

 

문제는 모집단의 평균과 표준편차를 모른다는 점으로 그래서 표본집단에 대한 평균과 표준편차를 사용하여 신뢰구간을 구한다.

from scipy import stats

def confidence_interval(data, confidence = 0.95):
  
  """
  주어진 데이터의 표본 **평균**에 대한 신뢰구간을 계산.
  기본 값으로 t-분포와 양방향 (two-tailed), 95%의 신뢰도를 사용합니다. 
  
  입력 값 : 
    data - 여러 개로 이루어진 (list 혹은 numpy 배열) 표본 관측치
    confidence - 신뢰구간을 위한 신뢰도 
  
  반환 되는 값:
    (평균, 하한, 상한구간)으로 이루어진 tuple
  """

  data = np.array(data)
  mean = np.mean(data)
  n = len(data)
  
  # std / sqrt(n)
  stderr = stats.sem(data) 
  # Standard Error of Mean (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.sem.html)
  # s / sqrt(n)

  # length_of_one_interval
  interval = stderr * stats.t.ppf( (1 + confidence) / 2 , n - 1) # ppf : inverse of cdf
  return (mean, mean - interval, mean + interval)

# cdf -> t 를 넣으면 %
# ppf -> % 를 넣으면 t

# 1 + 0.95 / 2 -> 0.975
# (1 - 0.95) / 2 -> 0.025
from scipy.stats import t

# 표본의 크기
n = len(sample)
# 자유도
dof = n-1
# 평균의 평균
mean = np.mean(sample)
# 표본의 표준편차
sample_std = np.std(sample, ddof = 1)
# 표준 오차
std_err = sample_std / n ** 0.5 # sample_std / sqrt(n)

CI = t.interval(.95, dof, loc = mean, scale = std_err) # https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.t.html
print("95% 신뢰구간: ", CI)

 

ANOVA (ANalysis Of VAriance; 분산 분석)

 

여러 그룹간의 평균의 차이가 통계적으로 유의미 한지를 판단하기 위한 검정방법

특징 1. 집단 평균값 의 분산이 클수록 그리고, 2. 집단 내 분산이 작아질수록 평균의 차이가 분명해집니다.

Multiple Comparision

3개의 표본을 각각 2개씩 짝을 묶어서 비교를 하면 안될까 싶지만 각각 표본에서 생길 수 있는 오차 5% = 𝛼이 서로 비교를 통해 점점 오차확률이 커짐으로 한꺼번에 비교할 수 있는 방법이 필요하다.

 

ANOVA를 위한 전제조건

 

여러 그룹들이 하나의 분포에서부터 왔다 라는 가정

그를 위한 지표 F-statistic

 

F-statistic는 F = 𝑉𝑎𝑟𝑖𝑎𝑛𝑐𝑒−𝑏𝑒𝑡𝑤𝑒𝑒𝑛−𝑔𝑟𝑜𝑢𝑝 / 𝑉𝑎𝑟𝑖𝑎𝑛𝑐𝑒−𝑤𝑖𝑡ℎ−𝑖𝑛−𝑔𝑟𝑜𝑢𝑝

k는 클래스 수 , n은 데이터 수 , SS(between) = 클래스별 평균 분산 , SS(tot) = 전체 분산

(참조 https://tensorflow.blog/f-%EA%B0%92-%EC%9C%A0%EB%8F%84%EC%8B%9D/)

 

즉, F값이 높다는 것은 

  1. 분자(다른 그룹끼리의 분산)는 크고, 분모 (전체 그룹의 분산)는 작아야 할겁니다.
  2. 즉 다른 그룹끼리의 분포가 다를 것이다 라는 가정이 붙는거죠.

 

일원분산분석(One-way ANOVA)과 이원분산분석(Two-way ANOVA)

 

1.일원분산분석(One-way ANOVA)

종속변인은 1개이며, 독립변인의 집단도 1개인 경우입니다. 한가지 변수의 변화가 결과 변수에 미치는 영향을 보기 위해 사용

 

from scipy.stats import f_oneway

f_oneway(그룹1, 그룹2, 그룹3)