이전 포스트에 이어서 작성하는 내용입니다.
2022.02.04 - [공부/통계학] - 기초 통계 (중심도 이해) python
이번에는 분산에 대해 알아보고자 합니다.
분산은 편차의 제곱 합에 데이터 개수만큼 나눠주면 되는 것인데요, 이를 식으로 쓰면 다음과 같습니다.
확률변수 X의 분산은 X의 기댓값과 X가 얼마나 떨어져 있는지 그 정도를 제곱한 것의 기댓값과 같다.
그렇다면 실습을 해보도록 하겠습니다.
먼저 데이터는 보스턴 집 값 데이터로 깃허브에 올라와있는 데이터를 불러와서 진행해보도록 하겠습니다.
코드는 다음과 같습니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
data = pd.read_csv("https://raw.githubusercontent.com/signature95/tistory/main/dataset/boston.csv")
print(data)
>>>
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \
0 0.00632 18.0 2.31 0 0.538 6.575 65.2 4.0900 1 296
1 0.02731 0.0 7.07 0 0.469 6.421 78.9 4.9671 2 242
2 0.02729 0.0 7.07 0 0.469 7.185 61.1 4.9671 2 242
3 0.03237 0.0 2.18 0 0.458 6.998 45.8 6.0622 3 222
4 0.06905 0.0 2.18 0 0.458 7.147 54.2 6.0622 3 222
.. ... ... ... ... ... ... ... ... ... ...
501 0.06263 0.0 11.93 0 0.573 6.593 69.1 2.4786 1 273
502 0.04527 0.0 11.93 0 0.573 6.120 76.7 2.2875 1 273
503 0.06076 0.0 11.93 0 0.573 6.976 91.0 2.1675 1 273
504 0.10959 0.0 11.93 0 0.573 6.794 89.3 2.3889 1 273
505 0.04741 0.0 11.93 0 0.573 6.030 80.8 2.5050 1 273
PTRATIO B LSTAT MEDV CAT. MEDV
0 15.3 396.90 4.98 24.0 0
1 17.8 396.90 9.14 21.6 0
2 17.8 392.83 4.03 34.7 1
3 18.7 394.63 2.94 33.4 1
4 18.7 396.90 5.33 36.2 1
.. ... ... ... ... ...
501 21.0 391.99 9.67 22.4 0
502 21.0 396.90 9.08 20.6 0
503 21.0 396.90 5.64 23.9 0
504 21.0 393.45 6.48 22.0 0
505 21.0 396.90 7.88 11.9 0
[506 rows x 15 columns]
그렇다면 MEDV 컬럼에 대한 분산을 구해보도록 하겠습니다.
물론 numpy의 매서드인 var()를 활용해도 되지만 분산을 구하는 식을 알고 있기 때문에 직접 구현을 먼저 해보겠습니다.
코드는 다음과 같습니다.
def varianve(data, columns):
n = len(data)
m = data[columns].mean()
# 제곱을 해주는 매서드 pow를 활용하여 편차의 제곱 도출
resid = pow(data[columns]-m, 2)
# 제곱합을 한 후, 변량의 개수로 나눠주면 분산 도출
print(f'분산은 {sum(resid)/n}입니다.')
# 분산값에 제곱근은 표준편차
print(f'표준편차는 {pow(sum(resid)/n, 1/2)}입니다.')
varianve(data,'MEDV')
>>>
분산은 84.41955615616561입니다.
표준편차는 9.188011545278206입니다.
np.var를 해도 동일한 결과가 도출됩니다.
# numpy로 분산 도출
print(np.var(data['MEDV']))
# 표준편차 구하기 (분산의 제곱근)
print(pow(np.var(data['MEDV']),1/2))
# numpy의 std 매서드로 표준편차 구현
print(np.std((data['MEDV'])))
>>>
84.41955615616556
9.188011545278203
9.188011545278203
이번엔 왜도를 구해보도록 하겠습니다.
왜도는 skewness로 비대칭도를 의미합니다.
왜도의 공식은 다음과 같습니다.
기본적으로 왜도가 음수이면, 확률밀도함수에서 왼쪽으로 꼬리가 치우쳐진 것으로 median(중앙값)이 우측에 치우쳐저 있습니다. 반대로 왜도가 양수이면 오른쪽으로 꼬리가 치우쳐진 형태가 나올 것입니다.
정규분포를 보이는 경우에는 왜도가 0이 되는 것이죠.
그렇다면 이를 코드로 구현하면 다음과 같이 표시할 수 있습니다.
앞서 np.var과 같이 skewness는 scipy 라이브러리로도 도출이 가능하지만, 이번에도 직접 도출해보도록 하겠습니다.
# 함수화 작업
def skewness(data):
n = len(data)
m = data.mean()
std = np.std(data)
tmp_result = pow((data - m)/std, 3)
result = sum(tmp_result)/n
return result
skewness(data['MEDV'])
>>>
1.1048108228646343
마찬가지로 동일한 결과를 출력할 수 있습니다.
# 라이브러리 import로 구한 skew
from scipy.stats import skew
print(skew(data['MEDV']))
>>>
1.104810822864635
마지막으로는 첨도입니다. 첨도는 뾰족한 정도를 의미합니다.
보통 정규분포의 첨도는 3을 가집니다. 식은 다음과 같습니다.
위처럼 첨도도 한번 직접 구현해보도록 하겠습니다.
# 함수화
def kurtosis_self(data):
n = len(data)
m = data.mean()
std = np.std(data)
tmp_result = pow(((data - m) / std), 4)
result = sum(tmp_result)/n - 3
return result
kurtosis_self(data['MEDV'])
>>>
1.4686287722747418
물론 scipy로도 구현할 수 있습니다.
# 라이브러리 import로 구한 kurtosis
from scipy.stats import kurtosis
kurtosis(data['MEDV'])
>>>
1.4686287722747462
'공부 > 기초통계' 카테고리의 다른 글
표본과 모집단의 이해 (0) | 2022.03.21 |
---|---|
오차, 잔차, 편차의 차이 (기초통계) python (0) | 2022.03.19 |
confusion matrix (혼동행렬) python (0) | 2022.03.17 |
Distribution (분포도) python (0) | 2022.02.10 |
기초통계 (상관계수) python (0) | 2022.02.09 |
댓글