반응형

Intro


첫 게시글의 주제는 통계학입니다. 통계학을 공부하는 이유는 아래와 같습니다.

알고싶은 사실을 "예측"하는데 필요한 정보를 주어진 데이터로부터 얻기 위해서

오늘은 가장 기본 정보인 평균, 분산, 공분산 에 대해서 정리하겠습니다.

오픈한 지 $n$일이 지난 아이스크림 가게의 하루 매출을 의미하는 변수 $X={x_1, x_2, ..., x_n}$가 있습니다. $x_i\ (i\in[1,n])$는 $i$번째 날의 아이스크림 가게 매출을 의미합니다.

평균


평균은 아이스크림 가게의 총 매출영업일로 나눈 값입니다. 평균을 알면 아이스크림 가게가 하루에 얼마 정도 벌었는지 알 수 있습니다.

평균은 보통 $\mu$ (뮤)라고 표현하고, 아래와 같은 방법으로 구할 수 있습니다.

$\mu = \frac{1}{n}\sum_{i=1}^{n}x_i$

분산


분산은 각 데이터들이 평균으로부터 얼마나 멀리 떨어져있는 지를 나타냅니다.

분산이 크면 아이스크림 가게의 매출이 들쭉날쭉하다는 걸 의미하고, 분산이 작으면 아이스크림 가게의 매출이 비교적 일정하다고 볼 수 있습니다.

분산은 보통 $\sigma^2$ (시그마)라고 표현하고, _각 데이터와 평균의 차이의 제곱 합의 평균_으로 구할 수 있습니다. 수식은 아래와 같습니다.

$\sigma^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\mu)^2$

여기서 우리는 평균은 더한 값을 $n$으로 나누는 반면에, 분산은 $n-1$로 나누는 걸 볼 수 있습니다. 이때 $n-1$을 자유도(degree of freedom, dof)*라고 합니다.

표준편차


분산 $\sigma^2$의 양의 제곱근인 $\sigma$을 표준편차입니다. 분산은 크기에 단위가 없는 반면, 표준편차는 그 단위가 원래 데이터와 같아서 해석이 용이합니다.

Python coding


지금까지 정리한 내용을 간단한 python 코드로 확인해보겠습니다.

[code download]

import numpy as np

# 아이스크림 가게 A, B의 일주일 매출 (단위: 만원)
shopA_sales = np.array([47, 60, 51, 52, 58, 48, 55])
shopB_sales = np.array([31, 73, 56, 61, 44, 67, 39])

# 두 아이스크림 가게의 평균
mean_A = shopA_sales.mean()
mean_B = shopB_sales.mean()
print(mean_A) # 53.0
print(mean_B) # 53.0

두 아이스크림 가게의 평균 매출은 동일합니다.

# 두 아이스크림 가게의 분산
# FYI,numpy는 분산을 계산할 때 자유도를 고려하지 않습니다.
var_A = shopA_sales.var()
var_B = shopB_sales.var()

# 자유도 고려 X
print(var_A) # 20.571428571428573
print(var_B) # 204.28571428571428

# var()사용하지 않고 shopA_sales의 분산 계산하기
tmp_var_A = np.power(shopA_sales-mean_A, 2).sum()/ len(shopA_sales)
print(tmp_var_A)          # 20.571428571428573
print(var_A == tmp_var_A) # True


# 자유도 고려 O
print(shopA_sales.var(ddof=1)) # 24.0
print(shopB_sales.var(ddof=1)) # 238.33333333333334

Numpy를 이용해서 분산을 계산할 때는 자유도를 고려하지않습니다. 분산 계산시 자유도를 고려하기 위해서는 ddof변수를 1로 설정합니다.LINK

데이터의 수가 작기 때문에, 자유도의 고려 여부에 따라 꽤 많은 차이가 있음을 알 수 있습니다.

# 두 아이스크림 가게의 표준편차
std_A = shopA_sales.std()
std_B = shopB_sales.std()

print(std_A) # 4.535573676110727
print(std_B) # 14.292855358035156

# std()사용하지 않고 shopA_sales의 표준편차 계산하기
tmp_std_A = np.sqrt(np.power(shopA_sales-mean_A, 2).sum()/ len(shopA_sales))
print(tmp_std_A)                   # 4.535573676110727
print(std_A == tmp_std_A)          # True
print(std_A == np.sqrt(tmp_var_A)) # True

아이스크림 가게 A와 B의 매출 표준 편차를 반올림하면 각각 4.54만원, 14.29만원으로, 데이터의 단위와 일치합니다.

이로써 우리는 아이스크림 가게 B의 매출이 A보다 변동성이 크다고 볼 수 있습니다. 하지만, A가 B보다 장사가 잘된다고 볼 수 없습니다.

마무리


이 글에서는 평균, 분산, 표준편차를 정리해봤습니다. 이 세가지 통계량은 데이터의 특성을 나타내주는 좋은 지표이지만, 이상치(outlier)에 민감하게 반응하는 단점이 있습니다.

가끔은 이상치에 robust한 통계량을 확인하는 것도 필요하기 때문에, 평균대신 중앙값(median), 표준편차 대신 중위절대편차(MAD)를 사용하기도 합니다.

긴 글 읽어주셔서 감사합니다. 다음 글은 두 변수 사이의 상관관계에 대해서 다루겠습니다.

좋은 하루 보내세요 :)

* 자유도를 이해하기 위해서는 분산을 계산하기 위해선 평균을 알아야한다는 것에 집중할 필요가 있습니다. $\mu$를 알고있으면, 분산을 계산할 때 반드시 $x_1$부터 $x_n$까지 순서대로 계산되지 않더라도 마지막 순서의 변수 값을 알 수 있습니다.
즉, $n-1$개의 변수는 어느 값이든 가질 수 있지만 마지막 1개의 변수는 $\mu$에 의해서 특정되기 때문에, '자유로운' 변수의 개수는 $n-1$개 이므로 자유도는 $n-1$이 됩니다.
모집단의 분산을 표본의 분산을 통해 유추하기 위해서는 위와 같이 자유도를 고려하는 것이 바람직하다고 합니다.
최근 우리가 사용하는 데이터의 수는 매우 많기 때문에 자유도를 깊게 이해하고 넘어갈 필요는 없지만, Regression(회귀)을 학습할 때 주의해야하는 다중공선성(multicollinearity)을 이해하기 위해서는 어느정도 알고 있는게 좋을 거 같습니다.

References

Practical Statistics for Data Scientists

선형대수와 통계학으로 배우는 머신러닝 with 파이썬

반응형

+ Recent posts