3. 데이터의 폭격: 파이썬으로 구하는 평균과 표준편차
[도입부] 학습 목표 (Learning Objectives)
- ‘평균’이라는 대푯값 하나만 믿었다가 망하는 경우를 대비해, 데이터들이 평균으로부터 얼마나 도망쳐(?) 있는지를 보여주는 ‘산포도(분산과 표준편차)’의 개념을 마스터합니다.
- 왜 편차(떨어진 거리)를 그냥 더하면 안 되고 굳이 ‘제곱(Square)’ 해서 더한 뒤 뻥튀기 된 값을 다시 루트($\sqrt{}$)를 씌워 원래 크기로 복원하는지, 미친 듯이 보이는 수학자들의 꼼수를 파헤칩니다.
- 파이썬(Python) 내장
statistics모듈을 로드하여 눈으로만 봤던 분산과 표준편차를 1줄의 코드로 박살 내는 데이터 사이언스를 경험합니다.
1. 지휘관(평균)과 병사들(데이터)의 ‘거리’
A반과 B반의 평균이 똑같이 $60$점이었던 1장 기억하시나요? 평균(60점)이라는 지휘관 옆에 데이터(학생 성적)라는 병사들이 찰싹 달라붙어 있는지, 아니면 탈영병처럼 아주 멀리 뿔뿔이 흩어져 있는지를 체계적으로 숫자로 나타낸 것을 산포도(Measure of Dispersion) 라고 부릅니다. 내가 맞은 점수에서 평균 지휘관의 점수를 뺀 거리를 편차(Deviation)라고 합니다.
- 90점 맞은 학생의 편차 = $90 - 60$ = $+30$ (지휘관보다 앞서감)
- 30점 맞은 학생의 편차 = $30 - 60$ = $-30$ (지휘관보다 쳐짐)
문제는! 모든 반 학생들의 편차를 싹 다 더해서 “이 반이 얼마나 흩어졌나?” 평균 거리를 구하려고 하면 언제나 0(Zero) 이 튀어나온다는 것입니다. (+)와 (-) 거리가 서로 상쇄되어 도망간 거리가 증발해 버립니다!
2. 분산(Variance)과 표준편차(Standard Deviation)의 위력
통계학자들은 마이너스(-)를 암살하기 위해 아주 교활한 수를 썼습니다. 모든 편차 거리를 제곱(Square, $\times 2$번 곱함) 해버리는 것입니다! $-30 \times -30 = +900$ 앗싸! 마이너스가 영원히 죽어버리고 모든 거리가 양수($+$)가 되었습니다. 이렇게 뻥튀기 된 놈들을 모조리 더해서 인원수로 나눈 ‘흩어진 뻥튀기 평균’을 분산(Variance) 이라고 부릅니다.
하지만 분산은 값 자체가 제곱되어 코끼리처럼 너무 뻥튀기 되어 있습니다(점수인데 갑자기 $900$단위). 그래서 마지막 제초 작업으로 다시 머리에 루트 기호($\sqrt{}$)를 씌워서 껍질을 까고 제곱을 죽여 원래 숫자의 사이즈로 돌려놓습니다. 이 녀석의 이름이 바로 그 유명한 데이터 세계의 황제, 표준편차(Standard Deviation) 입니다.
3. 💻 파이썬(Python) 1타 강사: 표준편차 원클릭 폭격
빅데이터 전문가, 주식 퀀트 트레이더, 머신러닝 프로그래머들은 분산을 손으로 계산하지 않습니다. 파이썬 statistics 모듈 안에는 아예 제곱과 루트를 알아서 포장하고 해체하는 공장이 풀가동 중입니다.
🐍 파이썬 예제: A반 B반의 진짜 민낯(표준편차) 스캔하기
# 파이썬 통계 알고리즘 코어 로드
import statistics
print("--- 🔬 Python 데이터 스캐너: 분산과 표준편차 산출 ---")
# (데이터 셋) 앞서 보았던 극단적으로 퍼진 A반과, 따닥따닥 모여있는 B반
class_A = [10, 15, 20, 25, 30, 60, 90, 95, 100, 100, 100] # 평균 58.6
class_B = [55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65] # 평균 60
# 1. 분산 (Variance) - pvariance(모집단 분산)
# 마이너스를 죽이기 위해 거리를 몽땅 제곱해서 덩치가 무식하게 커진 상태
var_A = statistics.pvariance(class_A)
var_B = statistics.pvariance(class_B)
# 2. 표준편차 (Standard Deviation) - pstdev(모표준편차)
# 분산 대가리에 루트(√)를 씌워서 뻥튀기된 숫자를 다시 현실 점수로 압축 복원!
std_A = statistics.pstdev(class_A)
std_B = statistics.pstdev(class_B)
print("[A반] 분산(뻥튀기):", f"{var_A:.1f}", "-> 🎯 찐 표준편차:", f"{std_A:.1f} 점 (미친듯이 퍼짐)")
print("[B반] 분산(뻥튀기): ", f"{var_B:.1f}", "-> 🎯 찐 표준편차: ", f"{std_B:.1f} 점 (완벽히 모여있음)")
print("-" * 50)
if std_A > std_B:
print(f"🚨 경고: A반의 편차({std_A:.1f})가 압도적으로 높습니다! \n수준 불균형이 심각합니다. 난이도별 분반 수업을 렌더링해야 합니다.")
# 결과창:
# --- 🔬 Python 데이터 스캐너: 분산과 표준편차 산출 ---
# [A반] 분산(뻥튀기): 1343.5 -> 🎯 찐 표준편차: 36.7 점 (미친듯이 퍼짐)
# [B반] 분산(뻥튀기): 10.0 -> 🎯 찐 표준편차: 3.2 점 (완벽히 모여있음)
# --------------------------------------------------
# 🚨 경고: A반의 편차(36.7)가 압도적으로 높습니다!
# 수준 불균형이 심각합니다. 난이도별 분반 수업을 렌더링해야 합니다.
주식 시장에서 ‘표준편차’가 높은 상품에 투자했다는 뜻은 “내일 상한가를 갈 수도 있고 하한가를 갈 수도 있는 개잡주(변동성이 미친 주식)” 에 돈을 걸었다는 심장 쫄리는 뜻입니다. 표준편차가 작으면 적금처럼 수익/손실의 진폭이 작고 안정된 그룹이라는 뜻입니다.
[결론] 학습 정리 (Summary)
- 산포도 (Measure of Dispersion): 병사(데이터)들이 지휘관(평균) 옆에 오밀조밀 모여있는 훈련된 부대인지, 사방팔방으로 흩어져 도망간 오합지졸인지 판단하는 “수치의 흩어짐(거리)” 지표입니다.
- 제곱($\times 2$)과 루트($\sqrt{}$)의 해킹: 흩어진 거리의 $(+)$와 $(-)$가 더하면 소멸해 버리는 수학의 뇌정지 에러를 피하기 위해, “전부 제곱해서 뻥튀기 합산(분산)”한 뒤 마지막에 “다시 루트를 씌워 원래 부피로 되돌리는(표준편차)” 고도의 눈속임 트릭입니다.
- 파이썬 라이브러리
pstdev: 파이썬은 이 번거로운평균 구하기 -> 편차 빼기 -> 제곱하기 -> 다 더하기 -> 인원수로 나누기 -> 루트 씌우기라는 6콤보 스킬을 단어 하나로 처리해 버리는 괴물 렌더링 엔진을 제공합니다.