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

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

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

이번에는 기초 통계에 대해서 알아보도록 하겠습니다.

 

대표적인 것으로 평균(mean), 중위값(median) 등이 있고, 평균은 산술, 기하, 가중, 절사 평균등 다양하게 표현될 수 있습니다.

 

먼저 평균에 대해서 알아보도록 합니다.

 

코드는 다음과 같습니다.

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의 산술평균 값을 구한다면 다음과 같습니다.

# 평균값 도출을 위한 함수입니다.
def mean(data, column_name):
    print(f'해당 데이터의 컬럼 중 {column_name}의 평균값(mean)은 {data[column_name].mean()} 입니다.')

mean(data, 'MEDV')

>>>

해당 데이터의 컬럼 중 MEDV의 평균값(mean)은 22.532806324110677 입니다.

 

산술평균은 파이썬의 기본 함수인 mean()을 활용하면 편하게 도출할 수 있습니다.

 

물론 제대로된 식으로 도출하려면 다음과 같이 표현할 수 있을 것입니다.

 

n = len(data)

# for 문을 활용한 MEDV 컬럼의 모든 데이터 합을 도출
summation = 0
for i in data['MEDV']:
    summation += i

# 데이터 합 / 데이터 개수 = 산술 평균 도출
print(summation/n)

>>>

22.532806324110698

 

그렇다면 이번에는 기하평균에 대해 알아보겠습니다.

 

기하평균은 데이터의 모든 값을 곱한 후, 이를 1/n의 제곱을 곱해주면 됩니다.

 

일반적으로 기하평균은 곱셈으로 계산하는 값에서 평균을 계산할 때 사용합니다.  즉 물가상승율이나 인구변동율, 펀드수익율, 채권 수익율 등을 계산할 때 정확한 평균을 구하기 위해서는 기하평균을 사용해야 합니다. 투자의 평균수익율을 구하기 위해서도 물론 기하평균을 사용해야 합니다. 

 주식투자를 예로 들어봅시다. 어느 해 갑이 A 기업에 투자 했다고 가정합시다. 최초 자본금을 천만원으로 시작하였다. 다음 년도에 주식이 2배로 증가하였습니다. 또 그 다음 년도에는 전년도의 8배로 증가하였다고 가정합시다. 이러할 경우, A 회사의 매년 평균적인 자본금의 증가율을 계산하고자 할 때 어떻게 해야 할까요?

산술평균으로 계산한다면 2배와 8배이므로 "2+8=10, 나누기 2개년은 5배"라는 답이 도출됩니다. 그러나 연평균증가율 5배는 실제의 자본금 증가율과 다르다는 것을 알 수 있습니다.

실제 자본금을 계산해봅시다. 2년동안 2배, 8배 늘어났으므로 2년 뒤 자본금은 " 1천만원 x(곱하기) a x a = 1천만원 x 2 x 8 " 이므로 평균 a값은 4가 되어야 합니다. 

 일반적으로 투자는 복리수익을 기준으로 하기 때문에 기하평균 수익률을 기본으로 하여야 합니다. 미국 펀드평가 회사에서도 기하평균 수익율을 기본으로 사용하고 있습니다.

 

그렇다면 코드로 한번 살펴보겠습니다.

# 기하평균
# 변수 설정
tem_data = np.random.randint(1, 11, 20) # 1부터 10까지 random하게 int를 10개 도출
mulScores = 1 # 곱셈에 대한 항등원 1

# 항목들로 반복 (tem_data의 모든 항목을 곱셈하기 위한 코드)
for item in tem_data:
    mulScores *= item
print(f'{tem_data} 내의 모든 값을 곱하면 {mulScores}가 됩니다.')    

# 제곱 연산자 '**'로 기하평균을 도츌합니다.
geometricMean1 = mulScores ** (1/len(tem_data)) 
print(f'해당 데이터의 기하평균 값은 {geometricMean1} 입니다.')


>>>

[ 4  1  4  2  8  1 10  9  5  5  2  3 10  1  1  5  2  6  2 10] 내의 모든 값을 곱하면 41472000000가 됩니다.
해당 데이터의 기하평균 값은 3.395375018400461 입니다.

 

 

이번에는 가중평균입니다.

 

가중치를 두어서 데이터의 평균을 도출하는 것인데요, 따라서 가중치의 합은 100%가 되어야 합니다. 만약 국어, 영어, 수학의 평균을 단순하게 산술평균하면 각 과목의 합을 더하고 3으로 나누면 되지만, 국어 30% 영어 30%, 수학 40%로 계산하게 된다면, 국어*0.3 + 영어 *0.3 + 수학*0.4로 가중평균이 계산되는 것이죠.

 

그러면 바로 코드를 확인해봅시다.

# 가중평균
def weight_avg(data, weights, avg):
    weight = data[weights]
    tem_data = data[avg]

    print(f'{avg}의 {weights}에 대한 가중평균 값 :', sum(tem_data * weight)/sum(weight))
    
weight_avg(data, 'AGE', 'MEDV')

>>>

MEDV의 AGE에 대한 가중평균 값 : 21.112517687880594

위에서 언급한 가중치는 weight / sum(seight)로 도출된 것을 확인할 수 있을 것 입니다.

 

 

그렇다면 이번에는 절사평균을 알아보도록 하겠습니다.

 

절사평균은 보통 이상치(outlier)값이 매우 큰 경우, 양 극단 5%를 제외하고 나머지의 평균을 도출하는 것입니다. 물론 5%로 양극단치를 제거할 수도 있고, outlier의 비중을 살펴본 다음 %를 결정해도 무방합니다.

 

%를 확인하기 위해선 보통 boxplot을 그려서 outlier에 대해 시각적으로 확인해보기도 합니다.

아니면, 1.5 *(Q3- Q1) + Q3 이상인 값 혹은 Q1 - 1.5 *(Q3- Q1) 이하인 값을 outlier로 보고 진행하기도 합니다.

 

바로 코드를 확인해보겠습니다.

 

def cut_mean(cut, data):
    # 변수 설정
    n = len(tem_data)
    cut_data = round(n * cut)

    # 인덱싱 데이터 출력
    print(f'{cut*100}% 비율로 절사한 후 data는 {tem_data[cut_data : -cut_data]}입니다.')

    # 인덱싱 후 데이터의 평균 출력
    print(f'{cut*100}% 비율로 절사한 후 data의 평균은 {np.mean(tem_data[cut_data : -cut_data])}입니다.')
    
# random한 데이터 형성
data = np.random.randint(1, 11, 20).tolist()

# 함수 적용
cut_mean(0.15, data)

>>>

15.0% 비율로 절사한 후 data는 [7, 10, 2, 7, 1, 8, 8, 8, 4, 2, 6, 9, 7, 3]입니다.
15.0% 비율로 절사한 후 data의 평균은 5.857142857142857입니다.

 

 

마지막은 median (중위값) 입니다.

 

중위값은 오름차순으로 데이터를 정렬한 경우, 가장 중앙에 위치한 값을 의미합니다. 최근들어 서울특별시 아파트 중위가격이 높은 수준에 있다는 기사를 많이 접할 수 있는데요, 여기서 중위값이란 서울특별시의 아파트 가격을 쭉 나열했을때 중앙에 위치한 아파트 가격을 의미하는 것이죠.

 

만약 가격이 1억, 5억, 12억으로 3개 데이터만 있는 경우, 중위값은 5억인 것입니다. 그렇지만 산술평균으로 계산하게 되면, 6억원이 되겠죠.

 

그렇다면 바로 코드를 확인해봅시다.

# 중위값(median) 도출을 위한 함수입니다. (파이썬 함수를 활용한 중위값 출력 부분)
def median(data):
    print(data)
    print(f'해당 데이터의 중위값(median)은 {np.median(data)} 입니다.')
    
data = np.random.randint(1, 11, 20).tolist()

median(data)

>>>

[1, 9, 1, 4, 7, 1, 7, 3, 3, 5, 3, 5, 1, 4, 6, 6, 4, 3, 5, 3]
해당 데이터의 중위값(median)은 4.0 입니다.

 

이처럼 이번에는 기초통계에서 중위수에 대해서 알아보았습니다.

감사합니다.

 

다음글에서 이어집니다.

2022.02.08 - [공부/통계학] - 기초 통계 (분산) python

 

기초 통계 (분산) python

이전 포스트에 이어서 작성하는 내용입니다. 2022.02.04 - [공부/통계학] - 기초 통계 (중심도 이해) python 기초 통계 (중심도 이해) python 이번에는 기초 통계에 대해서 알아보도록 하겠습니다. 대표적

signature95.tistory.com

 

728x90

댓글