이번에는 기초 통계에 대해서 알아보도록 하겠습니다.
대표적인 것으로 평균(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
'공부 > 통계학' 카테고리의 다른 글
로지스틱 회귀분석 (Logistic Regression) python (0) | 2022.02.21 |
---|---|
일원분산분석 (One-way ANOVA) python (0) | 2022.02.15 |
PACF (Partial Auto Correlation Function, 편자기상관함수) python (0) | 2022.01.20 |
ACF (auto-correlative function, 자기상관함수) python (0) | 2022.01.20 |
Differential (차분) python (2) | 2022.01.19 |
댓글