Skip to main content

기술통계

기술통계(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이상치에 극도로 민감
IQRQ3 - 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.5IQR)으로 이상치를 식별합니다
  • 스케일링 판단: 표준편차가 크게 다른 피처들은 StandardScaler로 정규화합니다
  • 모델 해석: 평균과 표준편차를 기준으로 예측값의 정상 범위를 판단합니다
모집단 분산을 추정할 때 표본 평균을 사용하면 편향(bias)이 생깁니다. n-1로 나누면(베셀 보정) 불편추정량(unbiased estimator)이 됩니다. pandas의 var(), std()는 기본적으로 ddof=1(n-1)을 사용합니다.
로그 변환(np.log1p), 제곱근 변환(np.sqrt), Box-Cox 변환 등을 적용하여 정규분포에 가깝게 만들 수 있습니다. 트리 기반 모델은 왜도에 덜 민감하지만, 선형 모델에서는 변환이 성능에 큰 영향을 줍니다.

체크리스트

  • 평균, 중앙값, 최빈값의 차이와 적절한 사용 상황을 설명할 수 있다
  • 분산, 표준편차, IQR을 계산하고 해석할 수 있다
  • 왜도와 첨도로 분포 형태를 판단할 수 있다
  • pandas describe()로 데이터를 빠르게 요약할 수 있다
  • 변동계수로 단위가 다른 변수를 비교할 수 있다

다음 문서