달나라 노트

Python Pandas : std() — 표준편차를 계산하는 메서드 본문

Python/Python Pandas

Python Pandas : std() — 표준편차를 계산하는 메서드

CosmosProject 2026. 5. 14. 19:47
728x90
반응형

Pandas .std() — 표준편차를 계산하는 메서드

데이터가 평균에서 얼마나 퍼져 있는지를 수치로 나타냅니다. 값이 클수록 데이터가 들쭉날쭉하고, 작을수록 고르게 모여 있습니다.

기본 문법

Series.std(ddof=1)
DataFrame.std(ddof=1, axis=0)
파라미터 설명
ddof 기본값 1은 표본 표준편차, 0으로 바꾸면 모 표준편차
axis 0이면 열 방향(각 컬럼의 std), 1이면 행 방향

예시 1 — Series 기본

import pandas as pd

s = pd.Series([2, 4, 4, 4, 5, 5, 7, 9])
s.std()
# 2.0

예시 2 — DataFrame (axis=0, 기본)

import pandas as pd

df = pd.DataFrame({
    '국어': [80, 90, 70, 100],
    '수학': [60, 95, 55, 90],
})

df.std()
# 국어    12.91
# 수학    19.76
# 수학이 국어보다 점수 편차가 크다는 뜻

ddof=1 vs ddof=0

표준편차를 계산할 때 분모가 달라집니다.

ddof=1  →  분모: n - 1   (표본 표준편차, pandas 기본값)
ddof=0  →  분모: n       (모 표준편차, numpy 기본값)
s = pd.Series([2, 4, 4, 4, 5, 5, 7, 9])

s.std(ddof=1)  # 2.0   ← 표본, 일반적으로 이걸 씀
s.std(ddof=0)  # 1.87  ← 모집단 전체를 갖고 있을 때
표본(설문 응답자, 실험 측정값 등 일부 데이터)을 다룰 때는 ddof=1, 모집단 전체 데이터를 갖고 있을 때는 ddof=0을 씁니다.

실무 활용 — 이상치 탐지

정규분포에서 표준편차 범위별 포함 비율은 다음과 같습니다.

±1σ  →  약 68.27%  포함  →  약 31.73% 가 바깥
±2σ  →  약 95.45%  포함  →  약  4.55% 가 바깥
±3σ  →  약 99.73%  포함  →  약  0.27% 가 바깥

평균 ± 2σ를 벗어나면 전체의 약 4.55%에 해당하는 극단값, ± 3σ를 벗어나면 약 0.27%에 해당하는 극단값입니다.

mean = df['매출'].mean()
std  = df['매출'].std()

# ±2σ 기준 — 조금 더 공격적으로 outlier를 잡음
outliers = df[(df['매출'] < mean - 2*std) | (df['매출'] > mean + 2*std)]

# ±3σ 기준 — 정말 극단적인 값만 잡음
outliers = df[(df['매출'] < mean - 3*std) | (df['매출'] > mean + 3*std)]
실무에서는 ±2σ 또는 ±3σ 기준을 가장 많이 씁니다.

pandas vs numpy — ddof 기본값이 다르다

numpy에도 np.std()가 있지만, ddof 기본값이 달라서 같은 데이터에 아무 설정 없이 쓰면 결과가 다르게 나옵니다.

import numpy as np
import pandas as pd

s   = pd.Series([2, 4, 4, 4, 5, 5, 7, 9])
arr = np.array([2, 4, 4, 4, 5, 5, 7, 9])

s.std()         # 2.0   ← ddof=1 기본 (표본 표준편차)
np.std(arr)     # 1.87  ← ddof=0 기본 (모 표준편차)

# ddof를 맞춰주면 결과가 같아짐
np.std(arr, ddof=1)  # 2.0  ← pandas와 동일
pandas .std() numpy np.std()
ddof 기본값 1 (표본) 0 (모집단)
대상 Series, DataFrame ndarray
728x90
반응형
Comments