
시작하며
연속형 변수를 요약할 때 사용하는 기술통계량으로는 중심(center), 산포도(spread), 왜도(skewness), 첨도(kurtosis), 상관계수(correlation coefficient)가 있다. 이 포스팅에서는 서울 아파트 실거래가 데이터를 예시로 각 통계량의 의미와 파이썬 코드를 정리한다.
연속형 변수 요약 통계량
(1) 중심(center) : 평균, 중위수, 절사평균
중위수와 절사평균은 극단치의 영향을 덜 받으므로 평균의 단점을 보완한다.
import pandas as pd
apt = pd.read_excel('data/아파트_실거래가_서울.xlsx')
apt.shape # 데이터프레임의 행·열 수
apt.columns
# 변수명 변경
apt.rename(columns={'전용면적(㎡)': '면적', '거래금액(만원)': '가격'}, inplace=True)
apt.columns
apt.head()
# 평균
apt.가격.mean()
# 중위수
apt.가격.median()
# 기초통계량
tb = apt.단가.describe()
from scipy import stats
stats.trim_mean(apt.단가, 0.2) # 절사평균은 pandas에서 지원하지 않으므로 scipy로 계산한다.(2) 산포도(spread) : 범위, 분산, 표준편차, 사분위수
산포도는 그 값 자체보다는 비슷한 그룹과의 비교를 통해 크고 작음을 판단할 수 있다.
# 표준편차
apt.단가.std()
# 범위 (최대값 - 최소값)
tb['max'] - tb['min']
# 사분위수 범위
Q1 = tb['25%']
Q3 = tb['75%']
IQR = Q3 - Q1
print('IQR = ', IQR) # IQR 값 자체만으로 산포를 판단하기는 어렵고 비교군 간의 IQR 값을 본다.
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
print("lower : ", lower, "upper : ", upper)
tf = apt.단가.between(lower, upper)
outliers = apt.loc[~tf, :] # 이상치에 해당하는 값들의 범위
outliers# 실제 사용 예시 : 구별로 단가의 중심, 산포도를 계산하고 비교
apt.groupby('구').단가.describe()
apt.groupby('구').단가.median()
apt.groupby('구').단가.median().sort_values()
apt.groupby('구').단가.median().sort_values(ascending=False)
apt.groupby('구').단가.std().sort_values()
# 용산구 자료만 추출
s = apt[apt.구 == '용산구']
s_tb = s.단가.describe()
Q1 = s_tb['25%']
Q3 = s_tb['75%']
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
tf = s.단가.between(lower, upper)
outliers = s.loc[~tf, :]
outliers(3) 왜도(skewness)
평균과의 거리의 세제곱이 포함된다.
import pandas as pd
apt = pd.read_excel('data/아파트_실거래가_서울.xlsx')
apt.columns
apt.rename(columns={'전용면적(㎡)': '면적', '거래금액(만원)': '가격'}, inplace=True)
apt['단가'] = apt.가격 / apt.면적
# 왜도
# 왜도 값이 양수(1.446649)이므로 오른쪽으로 긴 꼬리를 가진 분포임을 유추할 수 있음
apt.단가.skew()
# 왜도의 값이 가장 작은 경우인 중구는 음수이므로 왼쪽으로 긴 꼬리를 가진 분포
# 왜도의 값이 가장 큰 경우인 노원구는 양수이므로 오른쪽으로 긴 꼬리를 가진 분포
apt.groupby('구').단가.skew().sort_values()(4) 첨도(kurtosis)
평균과의 거리의 네제곱이 포함된다. 정규분포를 기준으로 하며, 정규분포의 첨도는 0으로 한다.
# 첨도 값이 양수이므로 정규분포에 비해서 두꺼운 꼬리를 가진 분포임
apt.단가.kurtosis()
# 중구의 경우 첨도 값이 양수이고 절대값이 크므로 더 두꺼운 꼬리를 가진 분포
apt.단가[apt.구 == '중구'].kurtosis()
# 금천구의 경우 첨도 값이 0에 가까우므로 정규분포와 비슷한 정도의 꼬리 분포를 가지고 있음
apt.단가[apt.구 == '금천구'].kurtosis()(5) 상관계수(correlation coefficient)
두 변수와의 선형관계의 강도와 방향을 나타낸다(일반적으로 피어슨 상관계수). 두 변수의 공분산(covariance)을 각각의 표준편차의 곱으로 나눈 값이다. 두 변수의 값이 아닌 순위(rank)에 관심이 있다면 스피어만 상관계수, 켄달 타우 등을 고려한다.
# 0.7014... -> 상관계수가 0.7이므로 가격과 면적은 상당히 높은 양의 상관관계를 가지고 있는 것으로 보임.
# 상관관계는 -1 ~ 1 사잇값
apt['가격'].corr(apt['면적'])
# 예시 : y값이 x로부터 계산되어 서로 연관되어 있지만 계산된 상관계수는 0 : 비선형 관계를 반영하지 못함
import numpy as np
x = pd.Series(np.arange(-20, 21))
y = x ** 2 # 비선형임.
x.corr(y)정리하며
연속형 변수의 기술통계량은 단독으로도 유용하지만 비교군 간에 함께 살펴볼 때 더 큰 의미를 가진다. 중심과 산포도만으로는 분포의 형태를 완전히 파악할 수 없으므로 왜도와 첨도를 함께 확인하는 것이 좋다. 상관계수는 선형 관계만 반영하므로 비선형 관계의 경우 시각화를 통해 추가 확인이 필요하다.