산포 측도

Python으로 시작하는 통계학

Maggie Matsui

Content Developer, DataCamp

산포란 무엇인가?

두 개의 히스토그램: 하나는 데이터가 좁게 퍼져 있고, 다른 하나는 더 넓게 퍼져 있음.

Python으로 시작하는 통계학

분산

각 데이터 점과 데이터 평균 사이 거리의 평균

평균을 나타내는 빨간 선이 가운데에 있는 7개의 데이터 포인트로 이루어진 점도표

Python으로 시작하는 통계학

분산

각 데이터 포인트와 데이터 평균 사이 거리의 평균

평균을 나타내는 빨간 선이 가운데에 있는 7개의 데이터 포인트로 이루어진 점도표. 각 점과 평균선 사이에 화살표가 그려짐.

Python으로 시작하는 통계학

분산 계산하기

1. 각 데이터 포인트에서 평균 빼기

dists = msleep['sleep_total'] - 
        np.mean(msleep['sleep_total'])
print(dists)
0     1.666265
1     6.566265
2     3.966265
3     4.466265
4    -6.433735
      ...

2. 각 거리를 제곱

sq_dists = dists ** 2
print(sq_dists)
0      2.776439
1     43.115837
2     15.731259
3     19.947524
4     41.392945
      ...
Python으로 시작하는 통계학

분산 계산하기

3. 제곱거리의 합

sum_sq_dists = np.sum(sq_dists)
print(sum_sq_dists)
1624.065542

4. 데이터 포인트 수 - 1로 나누기

variance = sum_sq_dists / (83 - 1)
print(variance)
19.805677

np.var() 사용

np.var(msleep['sleep_total'], ddof=1)
19.805677

ddof=1을 지정하지 않으면 표본분산이 아닌 모분산이 계산됨:

np.var(msleep['sleep_total'])
19.567055
Python으로 시작하는 통계학

표준편차

np.sqrt(np.var(msleep['sleep_total'], ddof=1))
4.450357
np.std(msleep['sleep_total'], ddof=1)
```  

Python으로 시작하는 통계학

평균절대편차

dists = msleep['sleep_total'] - np.mean(msleep['sleep_total'])

np.mean(np.abs(dists))
3.566701

표준편차 vs. 평균절대편차

  • 표준편차는 거리를 제곱하므로, 짧은 거리보다 긴 거리에 더 큰 가중치를 부여합니다.
  • 평균절대편차는 모든 거리에 동일한 가중치를 부여합니다.
  • 어느 한쪽이 더 낫지는 않지만, SD가 MAD보다 더 널리 사용됩니다.
Python으로 시작하는 통계학

분위수

np.quantile(msleep['sleep_total'], 0.5)
10.1

$$

                   **_0.5 분위수 = 중앙값_**

사분위수:

np.quantile(msleep['sleep_total'], [0, 0.25, 0.5, 0.75, 1])
array([ 1.9 ,  7.85, 10.1 , 13.75, 19.9 ])
Python으로 시작하는 통계학

상자그림은 사분위수를 사용

import matplotlib.pyplot as plt
plt.boxplot(msleep['sleep_total'])
plt.show()

sleep_total boxplot.png

Python으로 시작하는 통계학

np.linspace()를 사용한 분위수 계산

np.quantile(msleep['sleep_total'], [0, 0.2, 0.4, 0.6, 0.8, 1])
array([ 1.9 ,  6.24,  9.48, 11.14, 14.4 , 19.9 ])

np.linspace(start, stop, num)

np.quantile(msleep['sleep_total'], np.linspace(0, 1, 5))
array([ 1.9 ,  7.85, 10.1 , 13.75, 19.9 ])
Python으로 시작하는 통계학

사분위수 범위(IQR)

상자그림의 상자 높이

np.quantile(msleep['sleep_total'], 0.75) - np.quantile(msleep['sleep_total'], 0.25)
5.9
from scipy.stats import iqr
iqr(msleep['sleep_total'])
5.9
Python으로 시작하는 통계학

이상치

이상치: 다른 값들과 현저하게 다른 데이터 포인트

어느 정도 달라야 이상치라고 할 수 있을까요? 다음 조건 중 하나를 만족하면 이상치입니다:

  • $\text{data} < \text{Q1} - 1.5\times\text{IQR}$ 또는
  • $\text{data} > \text{Q3} + 1.5\times\text{IQR}$
Python으로 시작하는 통계학

이상치 찾기

from scipy.stats import iqr
iqr = iqr(msleep['bodywt'])

lower_threshold = np.quantile(msleep['bodywt'], 0.25) - 1.5 * iqr upper_threshold = np.quantile(msleep['bodywt'], 0.75) + 1.5 * iqr
msleep[(msleep['bodywt'] < lower_threshold) | (msleep['bodywt'] > upper_threshold)]
                    name   vore  sleep_total    bodywt
4                    Cow  herbi          4.0   600.000
20        Asian elephant  herbi          3.9  2547.000
22                 Horse  herbi          2.9   521.000
...
Python으로 시작하는 통계학

한 번에 확인하기

msleep['bodywt'].describe()
count      83.000000
mean      166.136349
std       786.839732
min         0.005000
25%         0.174000
50%         1.670000
75%        41.750000
max      6654.000000
Name: bodywt, dtype: float64
Python으로 시작하는 통계학

연습해 봅시다!

Python으로 시작하는 통계학

Preparing Video For Download...