데이터 분석/통계(Statistics)

[Python] 분산 분석(ANOVA) : feat.(SST,SSE,SSB) - (1)

Jerry Jun 2020. 9. 9. 20:49
728x90

분산 분석(ANOVA : Analysis of Variance)

  k 개의 집단을 비교하여 다름을 판단하는 것. (k : 3개 이상의 유한한 개수)

 

분산 분석의 대립가설은 많은 경우의 수를 가지고 있다. 그래서 최소한 2개의 집단은 차이가 있을 것으로 판단한다.

일표본 검정 -> 독립 2표본 -> 분산분석 -> 회귀분석으로 확장된다.

 

 

 

anovaimage

 

모집단 A, B, C 가 있고 모두 정규분포를 따른다고 가정한다. 각각의 모집단에서 표본을 추출하는데 데이터 2개씩 가져온다고 가정해보자.

 

 

anovaimage2

우리는 뽑아낸 표본들의 데이터들에 대해 Y의 다름이 얼마나 되는지 측정하고 싶다.

하지만 데이터에서 전체 평균을 빼고 모두를 더하면 무조건 0 이 나온다.

그래서 그 편차를 제곱을 한다. 

 

gongsik

SST = SSE(Sum of Square Error) + SSB(Sum of Square Between)

SST : Y의 다름의 양 #두 가지 다름의 양으로 나누어진다.

SSE : 집단 내부 다름의 양

SSB : 각 집단 사이의 다름의 양

 

[SSE 와 SSB 비교하기]

SSESSB
gongsik

 

예를 들어 SST(100) = SSE(90) + SSB(10) 이라고 한다면 집단 내부적인 이유 때문에 Y의 다름이 생겼다.

결국 각 집단들이 다르다고 할 수 없고, 집단이 같다고 할 수 있다. (귀무가설 가능성 증가)

 

반대로, SST(100) = SSE(10) + SSB(90) 이라고 한다면 집단이 달라 대립가설로 갈 가능성이 높다.

 

 

#다른 예시

pyobon

 

SST(20202) = SSE(20202) + SSB(0) 으로 볼 수 있어 집단 내부적인 이유로 Y의 다름이 생겼다고 볼 수 있다.

표본의 내부만 보아도 집단 내부의 차이가 많다는 것을 알 수 있다.

 

분산분석은 SSE에 비해서 SSB가 얼마나 더 큰 지에 대해 초점을 맞추어야 한다.

(집단 내부적인 이유보다는 각 집단이 달라서 생기는 것에 더 초점)

 

하지만 SSB를 구하기 위해 사용하는 데이터의 양과 SSE를 구하기 위해 사용하는 데이터의 양이 각각 다르기 때문에 여기에 관해서도 알고 있어야만 할 것이 있다. (상대적으로 SSE가 SSB보다 항상 많다.)

 

집단 간의 차이가 있어도 SSE가 데이터의 양이 많아 상대적으로 높아지기 때문에 차이가 없다는 결론이 나올 수 있다. 그래서 데이터의 양이 많으면 많이 나누면 되고, 적다면 적게 나누면 된다고 생각하게 된다.

 

 

# MSB(Mean Square Between) / MSE(Mean Square Error)

fgumjung

 

k : 집단의 개수

n : 모든 표본의 개수

 

통계적으로 분모와 분자가 모두 제곱의 형태이면 F 라고 불린다. (*등분산 검정 일 때도 출현함.)

 

 


[파이썬(Python)]

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as stats
import researchpy as rp
import pingouin as pg

귀무가설 : iris 품종(setosa, versicolor, virginica)에 따라 꽃잎의 길이(petal_length)에 차이가 없다.

대립가설 : iris 품종(setosa, versicolor, virginica)에 따라 꽃잎의 길이(petal_length)에 차이가 있다.

 

 

정규성을 만족한다고 가정하고 진행한다.

 

1) EDA

rp.summary_cont(iris.petal_length)

result5

 

* 참고 : SE(Standard Error) - 표준오차

mozipdan

모집단에서 표본으로 나올 수 있는 무수한 후보들이 있다. 그래서 표본의 평균 또한 많을 것이고, 이것을 통해 평균(μ)을 구할 수 있다.  표본의 평균(bar_y) 의 표준편차를 표준오차라고도 부른다. 

표준오차가 작다는 것은 어떤 표본이 뽑히더라도 결과가 상당히 비슷하다는 것이다. 그래서 이 표본에 대한 결과를 신뢰할 수 있다.

 

 

rp.summary_cont(iris.petal_length.groupby(iris.species))

result6

 

 

@ 품종별 꽃잎의 길이에 대한 boxplot

sns.boxplot(x = "species", y = "petal_length", data = iris)
plt.show()

boxplot

setosa는 확실하게 versicolor 와 virginica 와 차이가 있는 것으로 보인다.

versicolor의 가장 큰 쪽과 virginica의 가장 작은 쪽의 범위 내에 겹치는 범위도 보인다.

 

 

 

2) 등분산 검정

귀무가설 : 등분산이다.

대립가설 : 이분산이다.

stats.levene(iris.loc[iris.species == "setosa",     "petal_length"],
             iris.loc[iris.species == "versicolor", "petal_length"],
             iris.loc[iris.species == "virginica",  "petal_length"])
-----------------------------------------------------------------------
LeveneResult(statistic=19.480338801923573, pvalue=3.1287566394085344e-08)

F(검정통계량) = 19.480

p-value = 0.000

 

유의확률이 0.000 이므로 유의수준 0.05에서 이분산이다.

 

 

3) (이분산이 가정된) 분산분석

pg.welch_anova(dv = "petal_length", between = "species", data = iris)

result8

ddof1 : 자유도(k-1) = 2 # k 가 3이다. (품종 3개)

ddof2 : 자유도(n-k) = 78.073

F(검정통계량) = 1828.092

p-unc(유의확률 p-value) = 0.000

 

유의확률이 0.000 이므로 유의수준 0.05에 대하여 대립가설로 가는 것을 알 수 있다.

 

pvalue

 


* 실습출처 :  2020 SBA아카데미 AI 데이터분석 개발자과정 : 기초 통계 (이부일 CEO님)

300x250