기댓값, 분산, 공분산, 상관
분포를 숫자 몇 개로 요약하는 기댓값과 분산, 표준편차를 익히고, 기댓값의 선형성으로 복잡한 계산을 쉽게 푸는 법을 배워요. 두 변수가 함께 움직이는 정도인 공분산과 상관계수, 분산 투자의 원리, 상관관계가 인과관계가 아닌 이유를 실제 계산으로 확인해요.
분포 전체를 늘 들고 다닐 수는 없어요. 그래서 "보통 얼마쯤인가"와 "얼마나 들쭉날쭉한가"를 숫자 하나씩으로 요약해요. 앞의 것이 기댓값, 뒤의 것이 분산이에요. 그리고 두 변수가 "함께 움직이는가"를 재는 공분산과 상관까지 알면, 데이터 분석 보고서의 대부분을 읽을 수 있어요. 선형대수에서 PCA의 재료였던 공분산 행렬도 여기서 제대로 만나요.
기댓값: 확률로 가중한 평균
확률 변수의 기댓값은 각 값에 그 확률을 곱해 더한 거예요. 오랫동안 반복했을 때의 평균이라고 생각하면 돼요.
주사위의 기댓값은
주사위에서 3.5는 절대 나오지 않아요. 기댓값은 "가장 흔한 값"이 아니라 장기적인 평균이에요.
기댓값으로 판단하기
1,000원을 내고 주사위를 던져 6이 나오면 5,000원을 받는 게임이 있어요. 할 만할까요?
한 판에 평균 167원씩 잃어요. 운이 좋으면 몇 번은 딸 수 있지만, 오래 할수록 거의 확실하게 손해예요. 복권, 카지노, 보험의 수익 구조가 모두 기댓값으로 설계돼 있어요. 보험은 가입자 입장에서 기댓값이 음수지만, 감당할 수 없는 큰 손실을 피한다는 다른 가치가 있죠. 기댓값만으로 모든 결정을 내리면 안 되는 이유이기도 해요.
기댓값의 선형성
기댓값에는 아주 강력한 성질이 있어요.
두 번째 식은 X와 Y가 독립이 아니어도 항상 성립해요. 이게 왜 강력한지 예를 볼게요.
문제. 손님 100명이 모자를 맡겼다가, 직원이 모자를 무작위로 돌려줬어요. 자기 모자를 정확히 돌려받는 사람은 평균 몇 명일까요?
모든 경우의 수를 따지면 끔찍하게 복잡해요. 하지만 선형성을 쓰면 한 줄이에요. 손님 가 자기 모자를 받으면 1, 아니면 0인 변수 를 만들면, 각자 자기 모자를 받을 확률은 이니 이에요.
손님이 몇 명이든 평균 딱 1명이에요. 변수들이 서로 얽혀 있는데도(한 사람이 자기 모자를 받으면 다른 사람의 확률이 바뀌어요) 선형성은 그대로 통해요. 복잡한 것을 0과 1짜리 지시 변수의 합으로 쪼개는 이 기술은 알고리즘 분석에서도 자주 써요.
분산과 표준편차: 퍼진 정도
평균이 같아도 퍼진 정도는 다를 수 있어요. 월급이 매달 300만 원인 사람과, 0원과 600만 원을 번갈아 받는 사람은 평균이 같지만 삶이 전혀 다르죠.
분산은 평균에서 얼마나 떨어져 있는지를 제곱해서 평균 낸 거예요.
제곱을 하는 이유는 위아래로 떨어진 것이 서로 상쇄되지 않게 하려는 거예요. 그런데 제곱 때문에 단위도 제곱이 돼요(원² 같은). 그래서 다시 제곱근을 씌운 표준편차를 자주 써요.
주사위의 분산은 약 2.92, 표준편차는 약 1.71이에요.
import numpy as np
v = np.arange(1, 7)
print(v.mean(), v.var(), v.std()) # 3.5 2.9167 1.7078
분산의 성질
모든 값에 상수를 더하면 퍼진 정도는 그대로이고, 2배를 하면 분산은 4배(표준편차는 2배)가 돼요.
두 변수의 합의 분산은, 독립일 때만 단순히 더해져요.
독립이면 마지막 항 공분산이 0이에요. 이 식이 바로 분산 투자의 원리예요.
표본 분산은 왜 n-1로 나눌까
데이터에서 분산을 구할 때 이 아니라 로 나누라는 말을 들어 봤을 거예요. 표본 평균은 표본 자체에 가장 잘 맞춰진 값이라, 그 평균에서 잰 퍼짐은 진짜 퍼짐보다 살짝 작게 나와요. 로 나누면 그 과소 추정이 정확히 보정돼요. 넘파이의 var는 기본이 이고, ddof=1을 주면 이에요. 판다스는 기본이 이에요. 데이터가 많으면 거의 차이가 없지만, 적을 때는 주의하세요.
공분산: 함께 움직이는가
두 변수가 같이 커지고 같이 작아지는 경향을 재는 것이 공분산이에요.
- 둘 다 평균보다 크거나 둘 다 작으면 곱이 양수 → 공분산 양수
- 하나는 크고 하나는 작으면 곱이 음수 → 공분산 음수
- 아무 관계 없으면 상쇄되어 0 근처
문제는 크기의 해석이에요. 키를 cm로 재느냐 m로 재느냐에 따라 공분산이 100배 달라져요. 그래서 단위를 없앤 상관계수를 써요.
상관계수
항상 -1과 1 사이예요.
| 값 | 뜻 |
|---|---|
| 1 | 완벽한 양의 직선 관계 |
| 0.7 정도 | 강한 양의 관계 |
| 0 | 직선 관계 없음 |
| -1 | 완벽한 음의 직선 관계 |
공부 시간과 점수 데이터로 계산해 볼게요.
rng = np.random.default_rng(3)
hours = rng.uniform(0, 10, 200)
score = 50 + 4 * hours + rng.normal(0, 8, 200)
print(np.corrcoef(hours, score)[0, 1]) # 0.799
선형대수 관점으로 보면, 상관계수는 평균을 뺀 두 데이터 벡터의 코사인 유사도예요. 벡터 강의에서 배운 "방향이 얼마나 같은가"가 통계에서는 "얼마나 함께 움직이는가"가 돼요.
상관계수가 놓치는 것
상관계수는 직선 관계만 재요. 처럼 완벽한 관계라도 U자 모양이면 상관계수는 0이 나와요.
x = np.linspace(-3, 3, 200)
print(np.corrcoef(x, x ** 2)[0, 1]) # 0.0 (관계가 없는 게 아니라 직선이 아닐 뿐)
통계학자 앤스컴은 평균, 분산, 상관계수가 모두 같은데 그래프로 그리면 완전히 다른 데이터 네 쌍을 만들어 보였어요(앤스컴의 4중주). 숫자로 요약하기 전에 반드시 그려 보라는 교훈이에요.
분산 투자의 원리
수익률의 표준편차가 각각 20%인 두 자산에 반씩 투자하면, 묶음의 위험(표준편차)은 두 자산의 상관계수에 따라 달라져요.
| 두 자산의 상관계수 | 묶음의 위험 |
|---|---|
| 1 (똑같이 움직임) | 20% |
| 0.3 | 16.1% |
| 0 (무관) | 14.1% |
| -0.5 (반대로 움직임) | 10% |
같이 움직이는 자산끼리 묶으면 위험이 줄지 않아요. 함께 움직이지 않는 것들을 섞어야 위험이 줄어요. 이 공식이 현대 포트폴리오 이론의 핵심이고, 머신러닝에서 여러 모델의 예측을 섞는 앙상블이 잘 되는 이유와도 같아요. 서로 다르게 틀리는 모델들을 섞으면 오차가 상쇄돼요.
상관관계는 인과관계가 아니다
아이스크림 판매량과 물놀이 사고 건수는 강한 양의 상관이 있어요. 그럼 아이스크림이 사고를 일으킬까요? 아니죠. 더운 날씨가 둘 다를 늘려요. 이렇게 두 변수에 함께 영향을 주는 숨은 원인을 교란 변수라고 해요.
rng = np.random.default_rng(3)
temp = rng.normal(25, 5, 365) # 날씨
ice = 20 * temp + rng.normal(0, 40, 365) # 아이스크림 판매
drown = 0.3 * temp + rng.normal(0, 1.5, 365) # 물놀이 사고
print(np.corrcoef(ice, drown)[0, 1]) # 약 0.69 강한 상관!
날씨의 영향을 빼고(각각 날씨로 설명되는 부분을 제거하고) 다시 재면 상관이 0.07 근처로 거의 사라져요. 데이터에서 상관을 발견했을 때 물어야 할 질문은 이거예요.
- 우연일 수는 없나? (다음 강의들의 검정)
- 숨은 공통 원인은 없나? (교란 변수)
- 원인과 결과가 거꾸로는 아닌가? (역인과)
인과관계를 확인하는 가장 확실한 방법은 무작위로 나눠서 실험하는 거예요(A/B 테스트). 가설 검정 강의에서 다뤄요.
공분산 행렬
특징이 여러 개면 모든 쌍의 공분산을 행렬로 모아요. 번째 행 번째 열이 특징 와 의 공분산이에요.
대각선은 각자의 분산이고, 이라 대칭 행렬이에요. 그래서 고유벡터들이 서로 직교하고, 그 방향이 데이터가 퍼진 주축이에요. 선형대수의 고유값과 PCA 강의에서 본 그대로예요.
data = np.column_stack([hours, score, rng.normal(0, 1, 200)])
print(np.round(np.cov(data, rowvar=False), 2)) # 3 x 3 공분산 행렬
실습
- 동전을 던져 앞면이면 3, 뒷면이면 -1점을 받아요. 기댓값과 분산은?
- 주사위 두 개의 합의 기댓값과 분산을, 하나의 기댓값과 분산으로부터 구해 보세요(독립이니까요).
- 판다스로 아무 CSV 데이터를 불러와
df.corr()로 상관 행렬을 보고, 가장 강한 상관을 가진 두 열을 산점도로 그려 보세요. - 앤스컴의 4중주 데이터를 검색해 네 쌍의 평균, 분산, 상관계수를 직접 계산하고 그래프로 그려 비교해 보세요.
자주 하는 실수
- 기댓값을 "가장 흔한 값"으로 읽기. 기댓값은 장기 평균이에요.
- 합의 분산을 무조건 더하기. 독립(공분산 0)일 때만 그냥 더해요.
- 상관계수 0을 "관계 없음"으로 읽기. 직선 관계가 없을 뿐이에요. 그려 보세요.
- 상관을 인과로 해석하기. 교란 변수와 역인과를 먼저 의심하세요.
점검 문제
- 이면 는?
- 이면 은?
- 키를 cm 대신 m로 바꿔 재면 키와 몸무게의 상관계수는 어떻게 되나요?
- 위험을 줄이려면 어떤 자산끼리 섞어야 하나요?
정답
- . 상수 -1은 퍼짐에 영향이 없어요.
- 그대로예요. 상관계수는 단위에 영향을 받지 않아요.
- 서로 함께 움직이지 않는(상관이 낮거나 음수인) 자산끼리요.
다음 강의
지금까지는 분포를 안다고 가정했어요. 하지만 현실에서는 전체(모집단)를 볼 수 없고 일부(표본)만 봐요. 다음 강의에서는 표본으로 전체를 추정하는 원리, 큰 수의 법칙과 통계학 최고의 정리라 불리는 중심 극한 정리를 시뮬레이션으로 확인해요.