사전 표본 편향
문제

표본 편향

gabury1고친 사람 github-actions[bot]

표본 편향은 일부를 뽑는 방식이 한쪽으로 기울어서 그 일부로 낸 답이 전체와 어긋나는 고장입니다. 느린 요청이 기록에서 빠지면 기록으로 잰 응답 시간은 늘 실제보다 빠르게 나옵니다. 이 어긋남은 데이터를 더 모아도 줄지 않습니다. 고치려면 뽑는 방식을 고쳐야 합니다.

쉽고 빠른 이해

표본 편향은 일부를 뽑는 방식이 기울어서, 뽑은 것으로 낸 답이 전체와 늘 같은 쪽으로 어긋나는 일입니다. 타임아웃으로 끊긴 요청이 로그에 안 남으면 로그로 잰 평균 응답 시간은 언제나 실제보다 짧습니다.

따로 이름이 붙은 까닭은 많이 뽑아도 안 사라지기 때문입니다. 우연히 빗나가는 오차는 표본을 키우면 줄어듭니다. 이 어긋남은 뽑는 방식에서 나오므로 백 건을 보든 백만 건을 보든 같은 쪽으로 빗나갑니다.

  1. 어떤 쪽은 잘 뽑히고 어떤 쪽은 덜 뽑히거나 아예 안 뽑힙니다
  2. 덜 뽑히는 쪽이 재려는 값에서도 다릅니다. 느린 요청이 로그에서 빠지는 식입니다
  3. 뽑힌 것만으로 낸 평균이 한쪽으로 밀립니다

게다가 알아채기도 어렵습니다. 빠진 쪽은 표본 안에 흔적을 남기지 않습니다. 표본만 들여다봐서는 안 보입니다. 뽑는 절차를 따라가 봐야 드러납니다.

상세

국 간을 볼 때 젓지 않고 맨 위에서만 떠 먹는다고 해 봅시다. 소금이 바닥에 가라앉아 있으면 위쪽 국물은 싱겁습니다. 한 숟가락을 뜨든 백 숟가락을 뜨든 싱겁다는 답만 나옵니다.

알고 싶은 대상 전체를 모집단이라고 부릅니다. 모집단에서 뽑아 낸 일부가 표본입니다. 한 달 동안 들어온 요청 전부가 모집단이면, 그중 로그에 남은 요청이 표본입니다.

표본 편향은 뽑는 방식이 모집단의 한 부분을 덜 뽑거나 더 뽑아서 생깁니다. 그러면 표본으로 낸 평균 같은 수가 모집단의 참값에서 늘 같은 쪽으로 벗어납니다. 이렇게 짐작이 한쪽으로 꾸준히 빗나가는 정도를 통계에서는 편향이라고 부릅니다. 편향을 따로 가려 보는 까닭은 빗나감이 늘 같은 쪽이면 데이터를 더 모아도 고쳐지지 않기 때문입니다.

이 절은 먼저 응답 시간 열 건짜리 예로 표본 편향이 우연한 오차와 어떻게 다른지 봅니다. 이어서 편향이 생기는 조건과 흔한 모양, 머신러닝 평가에서 나타나는 모습을 봅니다. 마지막으로 알아채는 법과 줄이는 법, 편향이 문제가 안 되는 경우를 봅니다.

늘려도 줄지 않는 오차

모집단이 요청 열 건뿐인 작은 예에서 시작합니다. 응답 시간을 밀리초로 재면 아홉 건은 10 이고 한 건은 100 입니다. 열 건을 다 더하면 190 이므로 모집단 평균은 19 입니다.

그런데 서버가 50 을 넘긴 요청을 타임아웃으로 끊는다고 합시다. 끊긴 요청은 로그를 남기지 않습니다. 100 짜리 요청은 로그에 없습니다. 로그에 남은 아홉 건의 평균은 10 입니다.

같은 일이 요청이 많아져도 되풀이됩니다. 느린 요청의 비율이 같다면 로그를 얼마나 모으든 평균은 이렇게 나옵니다.

로그에 남은 요청 로그로 낸 평균 모집단 평균
9건 10 19
9,000건 10 19
900,000건 10 19

표에서 보듯 로그를 백만 건 가까이 모아도 평균은 10 에서 움직이지 않습니다. 빠지는 쪽이 늘 느린 요청이라서 늘 같은 방향으로 9 만큼 빗나갑니다.

공정하게 뽑아도 표본 평균은 참값과 조금씩 다릅니다. 무엇이 뽑히느냐가 우연이기 때문입니다. 이 우연한 빗나감이 표본 오차입니다. 표본 오차는 표본을 키울수록 작아집니다. 표본 편향은 이와 뿌리가 다릅니다.

표본 오차 표본 편향
어디서 오나 무엇이 뽑히느냐의 우연 뽑는 방식의 기울기
빗나가는 방향 뽑을 때마다 위아래로 바뀐다 늘 같은 쪽이다
표본을 키우면 줄어든다 그대로 남는다
줄이는 법 더 많이 뽑는다 뽑는 방식을 고친다

큰 표본은 편향을 오히려 더 믿음직해 보이게 만듭니다. 표본이 커지면 우연한 흔들림이 줄어서 답이 한 값으로 단단히 모입니다. 그 값이 틀린 값이어도 그렇습니다. 짐작의 폭을 나타내는 신뢰 구간도 좁아지지만, 좁아진 구간 안에 참값이 없습니다.

편향이 생기는 조건

표본 편향은 두 조건이 함께 설 때 생깁니다. 첫째는 구성원마다 표본에 들어갈 확률이 다르다는 것입니다. 확률이 0 이라서 아예 못 들어오는 구성원도 여기에 듭니다.

둘째는 그 확률의 차이가 재려는 값과 엮여 있다는 것입니다. 앞의 예에서는 응답이 느릴수록 로그에 못 남습니다. 뽑힐 확률이 바로 재려는 값인 응답 시간에 따라 갈립니다.

둘 중 하나가 빠지면 그 값에 대한 편향은 없습니다. 모든 요청이 똑같은 확률로 뽑히면 첫째 조건이 빠집니다. 이렇게 뽑은 표본을 무작위 표본이라고 부릅니다.

둘째 조건만 빠지는 경우도 있습니다. 짝수 초에 들어온 요청만 로그에 남긴다고 해 봅시다. 홀수 초에 들어온 요청은 뽑힐 확률이 0 입니다. 그래도 요청이 짝수 초에 왔느냐는 응답 시간과 상관이 없으므로 평균 응답 시간은 기울지 않습니다.

flowchart TD
    A["구성원마다 뽑힐 확률이 같나"] -->|같다| B["편향 없음 · 무작위 표본"]
    A -->|다르다| C["그 차이가 재려는 값과 엮였나"]
    C -->|안 엮였다| D["이 값에는 편향 없음"]
    C -->|엮였다| E["표본 편향"]

그림은 두 조건을 차례로 묻습니다. 두 물음에 모두 걸려야 맨 아래 표본 편향에 닿습니다. 그래서 표본 편향은 표본 하나에 붙는 성질이 아니라 표본과 재려는 값의 짝에 붙는 성질입니다. 같은 표본이 어떤 값을 재기에는 기울었고 다른 값을 재기에는 멀쩡할 수 있습니다.

흔히 보이는 모양

표본이 기우는 모양에는 이름이 붙은 것이 여럿 있습니다. 모양마다 표본에서 빠지는 쪽이 다릅니다.

뽑을 후보를 적어 둔 명단을 표본 틀이라고 부릅니다. 설문을 돌릴 때 쓰는 가입자 명단이 표본 틀의 예입니다.

이름 빠지는 쪽 백엔드에서 만나는 예
편의 표본 손에 닿기 어려운 쪽 서버 열 대 가운데 접속하기 쉬운 한 대의 로그만 본다
자기 선택 편향 스스로 나서지 않는 쪽 앱 평점은 아주 만족했거나 아주 화난 사용자가 주로 남긴다
무응답 편향 물었지만 답하지 않은 쪽 설문 메일에 답하지 않은 사용자
생존 편향 도중에 사라진 쪽 끊긴 요청이 없는 로그 · 이미 탈퇴한 사용자가 없는 사용 통계
표본 틀 누락 명단에 처음부터 없는 쪽 가입자 명단으로 설문 대상을 뽑으면 비회원 방문자는 뽑힐 수 없다

다섯 모양 모두 앞 소절의 두 조건으로 설명됩니다. 빠지는 쪽이 따로 있습니다. 그 쪽은 재려는 값에서도 다릅니다. 이 이름들을 선택 편향이라는 더 넓은 이름 아래 묶어 부르기도 합니다.

머신러닝 평가에서 보이는 모습

머신러닝 모델은 모아 둔 데이터에서 규칙을 배웁니다. 그 데이터가 기울어 있으면 모델도 기운 세상을 배웁니다. 실제 서비스에 들어오는 데이터는 기울지 않았으니 모델이 처음 보는 모양이 섞여 들어옵니다.

더 곤란한 점은 평가 점수가 이것을 못 잡는다는 것입니다. 모델을 평가할 때는 학습에 안 쓴 데이터를 떼어 두었다가 그것으로 잽니다. 이 떼어 둔 데이터를 테스트 세트라고 부릅니다. 테스트 세트도 같은 데이터에서 떼어 내므로 같은 쪽으로 기울어 있습니다.

스팸 필터로 따라가 봅니다. 사용자가 신고한 메일만 모아 학습 데이터를 만든다고 합시다. 신고는 한눈에 스팸인 메일에 몰립니다. 정상 메일인 척 꾸민 스팸은 신고가 적어서 데이터에 적게 들어옵니다.

재현율은 실제 스팸 가운데 필터가 걸러 낸 비율입니다. 이 필터를 테스트 세트로 재면 재현율이 높게 나옵니다. 테스트 세트에도 한눈에 보이는 스팸이 대부분이라 걸러 내기 쉽습니다. 실제 받은편지함에 꾸민 스팸이 많으면 실제 재현율은 그보다 낮습니다.

과적합과 견주면 차이가 뚜렷합니다. 과적합은 모델이 학습 데이터를 외워서 새 데이터를 못 맞히는 고장입니다. 과적합은 떼어 둔 테스트 세트로 재면 드러납니다. 표본 편향은 테스트 세트까지 같은 쪽으로 기울어서 드러나지 않습니다.

학습 때 본 데이터와 서비스에 들어오는 데이터의 모양이 다른 상태를 분포 이동이라고 부릅니다. 흔히 시간이 흘러 세상이 바뀌어서 생깁니다. 표본 편향이 있으면 첫날부터 이 상태로 시작합니다.

알아채는 법

표본만 들여다봐서는 표본 편향이 보이지 않습니다. 빠진 쪽은 표본 안에 흔적을 남기지 않기 때문입니다. 앞의 로그에는 느린 요청이 있었다는 표시가 한 줄도 없습니다.

그래서 첫째 방법은 뽑는 절차를 따라가며 묻는 것입니다. 물음은 「어떤 구성원이 이 표본에 들어올 수 없나」 하나입니다. 타임아웃, 오류가 나면 기록을 건너뛰는 코드, 특정 서버만 도는 수집기가 흔한 답입니다.

둘째 방법은 모집단 전체로 따로 세어 둔 수와 견주는 것입니다. 전체 요청 수는 로드 밸런서 같은 앞단 장비가 따로 셉니다. 로그 건수가 그보다 적으면 무엇이 빠졌는지 찾습니다. 지역별 비율이나 기기별 비율처럼 전체에서 알고 있는 비율이 있으면 그것과 표본의 비율을 견줘도 됩니다.

줄이는 법

줄이는 길은 둘입니다. 처음부터 고르게 뽑거나, 기울게 뽑았다면 뽑힌 확률을 알고 되돌리는 것입니다.

기본은 무작위로 뽑는 것입니다. 모든 구성원이 같은 확률로 뽑히면 첫째 조건이 사라집니다. 모집단을 무리로 나눈 뒤 무리마다 정해진 만큼 뽑는 층화 표본 추출도 있습니다. 작은 무리가 표본에서 빠지는 것을 막습니다.

일부러 다르게 뽑았을 때는 뽑힌 확률을 알고 되돌립니다. 오류가 난 요청은 전부 남기고 정상 요청은 백 건에 한 건만 남기는 로그가 있습니다. 드문 오류를 빠짐없이 보려고 흔히 이렇게 합니다.

이 로그에서 건수를 그냥 세면 오류 비율이 부풀려집니다. 정상 기록 한 건을 정상 요청 백 건의 몫으로 세면 원래 비율로 돌아옵니다.

오류 정상 오류 비율
실제 요청 100 9,900 백 건에 한 건
로그에 남은 기록을 그냥 셈 100 99 두 건에 한 건꼴
정상 기록 한 건을 백 건으로 셈 100 9,900 백 건에 한 건

표의 둘째 줄이 기운 답이고 셋째 줄이 되돌린 답입니다. 뽑힐 확률이 백분의 일이었던 기록에 백 배의 무게를 주었습니다. 이렇게 뽑힌 확률의 역수만큼 무게를 주는 방법을 역확률 가중치라고 부릅니다.

뽑힐 확률이 0 인 쪽은 이 방법으로도 못 되돌립니다. 무게를 줄 기록이 한 건도 없기 때문입니다. 타임아웃으로 끊긴 요청이 로그에 없다면, 끊긴 요청도 기록을 남기도록 수집하는 쪽을 고쳐야 합니다.

문제가 안 되는 경우

앞의 두 조건은 모집단을 어떻게 잡느냐에 따라 서기도 하고 안 서기도 합니다. 지금 남아 있는 사용자의 만족도를 묻는다면 모집단이 곧 지금 사용자입니다. 탈퇴한 사용자는 애초에 모집단 밖이므로, 그들이 표본에 들어올 확률이 0 이어도 첫째 조건에 걸리지 않습니다.

반대로 같은 표본으로 전체 가입자의 만족도를 말하면 탈퇴자도 모집단에 듭니다. 이제 탈퇴자는 뽑힐 확률이 0 인 구성원이라 첫째 조건이 섭니다. 불만 때문에 떠난 사람이 많다면 둘째 조건도 서서 생존 편향이 됩니다. 표본은 같고 겨냥한 모집단만 바뀌었습니다.

일부러 기울여 뽑은 표본도 확률을 알고 되돌린다면 괜찮습니다. 앞의 오류 로그가 그런 예입니다. 뽑는 방식을 모른 채 쓴 표본이 위험합니다.

관련 항목

표본 편향이 어긋나게 만드는 짐작의 재료

모집단 · 표본 · 표본 크기 · 모수 · 통계량 · 추정 · 평균 · 편향 (통계)

표본 편향과 맞세워지는 우연한 오차

표본 오차 · 표준 오차 · 신뢰 구간 · 대수의 법칙 · 분산

표본 편향의 하위 종류

선택 편향 · 생존 편향 · 무응답 편향 · 자기 선택 편향 · 편의 표본 · 표본 틀 · 대표성

표본 편향을 막거나 되돌리는 표본 추출 방법

무작위 표본 · 샘플링 · 층화 표본 추출 · 계통 표본 추출 · 군집 표본 추출 · 역확률 가중치 · 전수 조사

표본 편향이 흐리는 머신러닝 평가

머신러닝 · 훈련 데이터 · 테스트 세트 · 재현율 · 정밀도 · 스팸 필터 · 교차 검증

표본 편향과 함께 평가를 어긋나게 하는 문제

과적합 · 데이터 누수 · 클래스 불균형 · 분포 이동 · 심슨의 역설

표본 편향이 숨어드는 백엔드 데이터 수집

로그 · 타임아웃 · 분산 추적 · 텔레메트리 · 로드 밸런서 · A-B 테스트 · 설문 조사

다른 이름: sampling bias · 샘플링 편향 · 표집 편향