본문 바로가기
공부/기초통계

기초 통계 (분산) python

by signature95 2022. 2. 8.
728x90
반응형

이전 포스트에 이어서 작성하는 내용입니다.

2022.02.04 - [공부/통계학] - 기초 통계 (중심도 이해) python

 

기초 통계 (중심도 이해) python

이번에는 기초 통계에 대해서 알아보도록 하겠습니다. 대표적인 것으로 평균(mean), 중위값(median) 등이 있고, 평균은 산술, 기하, 가중, 절사 평균등 다양하게 표현될 수 있습니다. 먼저 평균에 대

signature95.tistory.com

 

이번에는 분산에 대해 알아보고자 합니다.

 

분산은 편차의 제곱 합에 데이터 개수만큼 나눠주면 되는 것인데요, 이를 식으로 쓰면 다음과 같습니다.

 

 

확률변수 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

 

728x90

댓글