기술통계
기술통계(Descriptive Statistics)는 데이터의 특성을 수치로 요약하는 방법입니다. 수백만 건의 데이터를 몇 개의 숫자로 압축하여 전체 그림을 파악할 수 있습니다.
학습 목표
평균, 중앙값, 최빈값의 차이를 이해하고 적절히 선택할 수 있다
분산, 표준편차, IQR로 데이터의 퍼짐 정도를 측정할 수 있다
왜도와 첨도로 분포의 형태를 판단할 수 있다
pandas와 scipy로 기술통계를 계산하고 해석할 수 있다
왜 중요한가
데이터 분석의 첫 단계는 항상 기술통계입니다. 평균과 표준편차만으로도 데이터의 중심과 퍼짐을 파악할 수 있고, 왜도를 통해 비대칭 분포를 감지할 수 있습니다. ML에서는 피처의 분포 특성이 스케일링 전략, 이상치 처리, 모델 선택의 근거가 됩니다.
중심경향 — 데이터의 대표값
import numpy as np
import pandas as pd
from scipy import stats
np.random.seed( 42 )
# 예시 데이터: 직원 연봉 (만원)
salary = pd.Series(
np.concatenate([
np.random.normal( 4000 , 800 , 90 ), # 일반 직원
np.random.normal( 12000 , 2000 , 10 ) # 임원
])
)
# 평균 (mean): 모든 값의 합 / 개수
print ( f "평균: { salary.mean() :.0f} 만원" )
# 중앙값 (median): 정렬 후 중간 위치의 값
print ( f "중앙값: { salary.median() :.0f} 만원" )
# 최빈값 (mode): 가장 자주 나타나는 값
# 연속형 데이터에서는 구간별 빈도로 확인
print ( f "최빈값: { salary.mode().values } " )
# 절사평균 (trimmed mean): 극단값 제거 후 평균
trimmed = stats.trim_mean(salary, proportiontocut = 0.1 )
print ( f "10% 절사평균: { trimmed :.0f} 만원" )
측정값 특징 적합한 상황 평균 모든 데이터 반영, 이상치에 민감 정규분포, 이상치 없는 데이터 중앙값 이상치에 강건, 순서만 고려 편향된 분포, 이상치 있는 데이터 최빈값 범주형 데이터에 유용 범주형 데이터, 다봉분포 절사평균 극단값 제거 후 평균 이상치가 소수인 경우
연봉처럼 오른쪽으로 치우친 분포에서는 평균이 중앙값보다 크게 나타납니다. 이런 경우 중앙값이 더 대표성 있는 값입니다.
산포도 — 데이터의 퍼짐
# 분산 (variance): 편차 제곱의 평균
print ( f "분산: { salary.var() :.0f} " )
# 표준편차 (standard deviation): 분산의 제곱근
print ( f "표준편차: { salary.std() :.0f} 만원" )
# 범위 (range): 최댓값 - 최솟값
print ( f "범위: { salary.max() - salary.min() :.0f} 만원" )
# IQR (Interquartile Range): Q3 - Q1
q1 = salary.quantile( 0.25 )
q3 = salary.quantile( 0.75 )
iqr = q3 - q1
print ( f "Q1: { q1 :.0f} , Q3: { q3 :.0f} , IQR: { iqr :.0f} 만원" )
# 변동계수 (CV): 표준편차 / 평균 — 단위 무관 비교
cv = salary.std() / salary.mean()
print ( f "변동계수: { cv :.2f} ( { cv * 100 :.1f} %)" )
측정값 공식 특징 분산 mean((x - mean)^2) 단위가 제곱, 직관적 해석 어려움 표준편차 sqrt(분산) 원래 단위, 가장 보편적 범위 max - min 이상치에 극도로 민감 IQR Q3 - Q1 이상치에 강건, 박스플롯의 기준 변동계수 std / mean 단위 무관, 그룹 간 비교에 유용
분위수와 백분위수
# 주요 분위수 계산
percentiles = [ 10 , 25 , 50 , 75 , 90 , 95 , 99 ]
for p in percentiles:
print ( f " { p } th 백분위수: { salary.quantile(p / 100 ) :.0f} 만원" )
# describe()로 한 번에 요약
print (salary.describe())
describe()는 count, mean, std, min, 25%, 50%, 75%, max를 한 번에 제공합니다. EDA의 첫 단계에서 반드시 실행하세요.
왜도와 첨도 — 분포의 형태
from scipy.stats import skew, kurtosis
# 왜도 (skewness): 분포의 비대칭도
skewness = skew(salary)
print ( f "왜도: { skewness :.2f} " )
# > 0: 오른쪽 꼬리 (양의 편향)
# = 0: 대칭
# < 0: 왼쪽 꼬리 (음의 편향)
# 첨도 (kurtosis): 분포의 뾰족한 정도
kurt = kurtosis(salary)
print ( f "첨도: { kurt :.2f} " )
# > 0: 정규분포보다 뾰족 (두꺼운 꼬리)
# = 0: 정규분포와 유사
# < 0: 정규분포보다 평탄
# 시각적 확인
import matplotlib.pyplot as plt
import seaborn as sns
fig, axes = plt.subplots( 1 , 3 , figsize = ( 15 , 4 ))
# 왜도 비교: 왼쪽 편향, 대칭, 오른쪽 편향
np.random.seed( 42 )
left_skew = - np.random.exponential( 2 , 1000 ) + 10
symmetric = np.random.normal( 5 , 1 , 1000 )
right_skew = np.random.exponential( 2 , 1000 )
for ax, data, title in zip (axes,
[left_skew, symmetric, right_skew],
[ f '음의 왜도 ( { skew(left_skew) :.2f} )' ,
f '대칭 ( { skew(symmetric) :.2f} )' ,
f '양의 왜도 ( { skew(right_skew) :.2f} )' ]):
sns.histplot(data, kde = True , ax = ax, color = '#4a9eca' )
ax.set_title(title)
ax.axvline(np.mean(data), color = 'red' , linestyle = '--' , label = '평균' )
ax.axvline(np.median(data), color = 'green' , linestyle = '-' , label = '중앙값' )
ax.legend()
plt.tight_layout()
plt.show()
왜도 범위 해석 권장 대표값 -0.5 ~ 0.5 대략 대칭 평균 -1 ~ -0.5 또는 0.5 ~ 1 약간 편향 평균 또는 중앙값 < -1 또는 > 1 강한 편향 중앙값
pandas의 기술통계 메서드
np.random.seed( 42 )
df = pd.DataFrame({
'salary' : np.random.normal( 4500 , 800 , 200 ),
'experience' : np.random.uniform( 1 , 20 , 200 ),
'performance' : np.random.normal( 75 , 10 , 200 ),
'department' : np.random.choice([ '개발' , '영업' , '마케팅' ], 200 )
})
# 전체 요약
print (df.describe())
# 수치형 컬럼별 통계
print (df[[ 'salary' , 'experience' ]].agg([ 'mean' , 'median' , 'std' , 'skew' ]))
# 그룹별 기술통계
print (df.groupby( 'department' )[ 'salary' ].describe())
# 상관계수 행렬
print (df[[ 'salary' , 'experience' , 'performance' ]].corr())
AI/ML에서의 활용
피처 분포 파악 : 각 피처의 평균, 표준편차, 왜도를 확인하여 전처리 전략을 결정합니다
이상치 탐지 : IQR 기반(Q1 - 1.5IQR, Q3 + 1.5 IQR)으로 이상치를 식별합니다
스케일링 판단 : 표준편차가 크게 다른 피처들은 StandardScaler로 정규화합니다
모델 해석 : 평균과 표준편차를 기준으로 예측값의 정상 범위를 판단합니다
모집단 분산을 추정할 때 표본 평균을 사용하면 편향(bias)이 생깁니다. n-1로 나누면(베셀 보정) 불편추정량(unbiased estimator)이 됩니다. pandas의 var(), std()는 기본적으로 ddof=1(n-1)을 사용합니다.
로그 변환(np.log1p), 제곱근 변환(np.sqrt), Box-Cox 변환 등을 적용하여 정규분포에 가깝게 만들 수 있습니다. 트리 기반 모델은 왜도에 덜 민감하지만, 선형 모델에서는 변환이 성능에 큰 영향을 줍니다.
체크리스트
다음 문서