무작위 표본
고친 사람 github-actions[bot]
무작위 표본은 누구를 뽑을지를 사람 대신 우연에게 맡겨서 얻은 표본입니다. 전체 가운데 어느 것이든 뽑힐 기회가 똑같습니다. 그래서 뽑는 사람의 버릇이나 편의가 표본에 끼어들지 않습니다. 일부만 보고 전체를 짐작할 때 그 짐작을 믿을 수 있게 해 주는 기본 방법입니다.
쉽고 빠른 이해
무작위 표본은 전체에서 일부를 뽑을 때 누가 뽑힐지를 우연에 맡긴 표본입니다. 한 달 치 요청마다 주사위를 굴리듯 판정해서 백 건 중 한 건꼴로 남기면 무작위 표본이 됩니다.
사람이 고르면 손에 닿기 쉬운 쪽으로 쏠립니다. 접속하기 편한 서버 한 대의 로그만 보면 나머지 서버에서 오래 걸린 요청을 놓칩니다. 우연에 맡기면 이런 쏠림이 끼어들 틈이 없습니다.
- 뽑을 대상 전체를 정합니다
- 대상마다 뽑힐 기회를 똑같이 주고 우연으로 뽑습니다
- 뽑힌 것만 재서 전체를 짐작합니다
대가는 우연이 만드는 빗나감이 남는다는 것입니다. 뽑을 때마다 답이 조금씩 다릅니다. 수가 적은 무리는 표본에 몇 건 안 들어와서 그 무리에 대해서는 거의 알 수 없습니다.
전부 재는 비용이 작으면 뽑지 않고 다 잽니다. 한 건만 빠져도 틀리는 과금 내역도 표본으로 대신하지 않습니다.
상세
반 대표를 제비뽑기로 정합니다. 이름을 적은 쪽지를 상자에 넣어 잘 흔듭니다. 눈을 감은 채 한 장을 꺼냅니다. 누가 나올지는 뽑는 사람도 모릅니다. 쪽지마다 나올 기회가 같습니다.
알고 싶은 대상 전체를 모집단이라고 부릅니다. 한 달 동안 들어온 요청이 어떤지 알고 싶다면, 그 요청 전부가 모집단입니다.
모집단에서 골라 낸 일부가 표본입니다. 한 달 치 요청 가운데 골라 낸 천 건이 표본입니다. 전부 재기에는 너무 많을 때 일부만 재려고 표본을 뽑습니다.
무작위 표본은 모집단의 구성원 하나하나가 똑같은 확률로 뽑히게 해서 얻은 표본입니다. 요청 백 건 중 한 건꼴로 남기되, 어느 요청을 남길지는 우연이 정합니다. 그러면 모든 요청이 백분의 일이라는 같은 확률로 표본에 듭니다.
컴퓨터에서 우연을 맡는 것은 난수입니다. 난수는 앞에 나온 값으로 다음 값을 짐작할 수 없게 만든 수입니다. 뽑을지 말지를 난수에 물으면 사람의 판단을 막을 수 있습니다.
아무렇게나 고른 표본과의 차이
일상에서 「무작위로 골랐다」는 말은 흔히 「별생각 없이 골랐다」는 뜻입니다. 통계에서 말하는 무작위는 그 뜻이 아닙니다. 별생각 없이 고르면 대개 손에 닿기 쉬운 것을 고르게 됩니다.
서버 열 대의 응답 시간을 알고 싶습니다. 그런데 접속 설정이 이미 되어 있는 한 대에만 들어가 그 서버 로그만 봅니다. 이렇게 손에 닿는 대로 모은 표본이 편의 표본입니다.
그 한 대가 가장 새 장비라면 나머지 아홉 대보다 빠를 수 있습니다. 로그를 아무리 많이 모아도 아홉 대의 요청은 한 건도 안 들어옵니다. 표본이 이렇게 한쪽으로 계속 어긋나는 것이 표본 편향입니다.
무작위 표본은 뽑는 일을 우연에게 넘겨서 이 치우침을 끊습니다. 열 대에서 들어온 요청 전부를 놓고 요청마다 같은 확률로 뽑으면, 어느 서버의 요청도 덜 뽑히거나 더 뽑히지 않습니다.
빗나감의 크기를 잴 수 있다
무작위 표본도 모집단을 꼭 닮지는 않습니다. 어떤 요청이 걸리느냐가 매번 우연이라서 표본의 평균은 모집단의 평균에서 조금씩 벗어납니다. 이 벗어남이 표본 오차입니다.
표본 오차는 뽑는 방식이 우연이라서 생깁니다. 그런데 바로 그 점 덕분에 크기를 계산할 수 있습니다. 뽑힐 확률이 정해져 있으면 「이만한 표본이면 대개 이만큼 빗나간다」를 확률 계산으로 구합니다.
그 계산으로 얻는 것이 신뢰 구간입니다. 표본 평균 하나만 내놓지 않고 「모집단의 평균은 대개 이 값부터 저 값 사이에 있다」처럼 짐작에 폭을 붙인 것입니다. 표본을 크게 뽑을수록 이 폭이 좁아집니다.
편의 표본에는 이 계산을 붙일 수 없습니다. 무엇이 왜 뽑혔는지를 확률로 적을 수 없어서입니다. 계산을 돌리면 숫자는 나옵니다. 그 숫자가 무엇을 뜻하는지는 아무도 보장하지 못합니다.
넓은 뜻과 좁은 뜻
「무작위 표본」은 두 가지 뜻으로 씁니다. 넓게는 앞에서 본 대로 구성원마다 뽑힐 확률이 같은 표본입니다.
좁게는 뽑을 수 있는 묶음마다 뽑힐 확률이 같은 표본입니다. 여섯 건에서 세 건을 뽑는다면, 세 건짜리 묶음은 1·2·3, 1·2·4 부터 4·5·6 까지 세어 보면 모두 스무 가지입니다. 이 스무 가지가 모두 같은 확률로 나와야 합니다. 이 좁은 뜻의 표본을 따로 단순 무작위 표본이라고 부릅니다.
둘이 갈리는 예가 계통 표본 추출입니다. 줄 세운 목록에서 일정한 간격마다 하나씩 뽑는 방식입니다. 요청 여섯 건이라면 첫 건을 동전으로 정한 뒤 한 칸씩 건너 세 건을 뽑습니다. 두 방식을 나란히 놓으면 다음과 같습니다.
| 방식 | 나올 수 있는 표본 | 요청 한 건이 뽑힐 확률 |
|---|---|---|
| 한 칸씩 건너 뽑기 | 1·3·5 또는 2·4·6 의 두 가지 | 2분의 1 |
| 단순 무작위 표본 | 세 건짜리 묶음 스무 가지 전부 | 2분의 1 |
요청 한 건이 뽑힐 확률은 두 방식이 같습니다. 그래서 둘 다 넓은 뜻의 무작위 표본입니다. 차이는 함께 뽑히는 짝에 있습니다. 한 칸씩 건너 뽑으면 이웃한 1번과 2번은 절대 같이 뽑히지 않습니다.
이 차이는 목록이 규칙적으로 놓였을 때 드러납니다. 목록의 홀수 번째가 모두 A 서버의 요청입니다. 짝수 번째는 모두 B 서버의 요청입니다. 한 칸씩 건너 뽑으면 표본에는 언제나 한 서버의 요청만 들어 있습니다. 단순 무작위 표본에서 그런 표본은 스무 가지 가운데 두 가지뿐입니다.
코드로 뽑는 방법
백엔드에서 무작위 표본을 뽑는 길은 대개 둘입니다. 대상을 다 모아 둔 목록이 있으면 거기서 정해진 개수를 뽑습니다. 요청처럼 하나씩 흘러들어오는 대상이면 들어올 때마다 남길지 말지를 정합니다.
목록이 있으면 표준 라이브러리 함수 하나로 끝납니다. 아래는 파이썬의 random.sample 로 주문 번호
열 개 가운데 세 개를 뽑는 코드입니다.
import random
orders = list(range(1, 11)) # 1부터 10까지
random.sample(orders, 3) # 예: [7, 2, 9]
random.sample(orders, 3) # 예: [4, 8, 1]
같은 줄을 두 번 불렀는데 결과가 다릅니다. 부를 때마다 난수를 새로 뽑기 때문입니다. 한 번 뽑힌 번호는 같은 호출 안에서 다시 나오지 않아서 세 번호는 늘 서로 다릅니다. 이 함수는 세 개짜리 묶음 어느 것이든 같은 확률로 내놓으므로 단순 무작위 표본을 줍니다.
흘러들어오는 요청은 끝을 모르므로 목록처럼 다 모아 둘 수 없습니다. 그래서 요청이 올 때마다 0 이상 1 미만의 난수를 뽑습니다. 그 값이 정해 둔 비율보다 작으면 남깁니다.
def keep(rate):
return random.random() < rate
keep(0.01) # 100번에 1번꼴로 True
비율을 0.01 로 두면 요청마다 백분의 일 확률로 남습니다. 모든 요청이 같은 확률을 받으므로 넓은 뜻의 무작위 표본입니다. 대신 표본 크기가 딱 정해지지 않습니다. 만 건이 들어오면 대개 백 건 언저리가 남습니다. 어떤 날은 아흔 건이, 어떤 날은 백십 건이 남습니다.
끝을 모르는 흐름에서 개수까지 딱 맞추고 싶으면 리저버 샘플링을 씁니다. 지금까지 본 것 가운데 정해진 개수를 늘 쥐고 있다가 새 것이 오면 확률에 따라 바꿔 넣는 방법입니다.
세 방법 가운데 무엇을 쓸지는 두 물음으로 갈립니다. 대상을 다 모아 둘 수 있나, 그리고 개수를 딱 맞춰야 하나입니다.
flowchart TD
A["뽑을 대상"] --> B{"다 모아 둔 목록이 있나"}
B -->|있다| C["목록에서 정해진 개수를 뽑는다"]
B -->|"없다 · 하나씩 흘러들어온다"| D{"개수를 딱 맞춰야 하나"}
D -->|아니다| E["올 때마다 난수로 판정한다"]
D -->|그렇다| F["리저버 샘플링"]
무작위로 뽑아도 남는 문제
무작위 표본이 없애는 것은 뽑는 방식에서 오는 치우침입니다. 뽑을 후보 명단에 애초에 없는 것은 우연이 아무리 공정해도 뽑히지 않습니다.
뽑을 때 쓰는 이 후보 명단을 표본 틀이라고 부릅니다. 앞에서 코드로 뽑을 때 쓴 목록이 바로 표본 틀입니다. 표본 틀은 모집단과 늘 같지는 않습니다. 알고 싶은 모집단 가운데 일부가 이 명단에서 빠질 수 있습니다.
로그를 표본 틀로 삼는 경우가 그렇습니다. 정해 둔 시간을 넘겨 끊긴 요청은 로그에 안 남습니다. 로그에서 아무리 공정하게 뽑아도 그 요청들은 한 건도 표본에 들지 않습니다.
수가 적은 무리도 문제가 됩니다. 요청 백 건 중 한 건만 모바일 앱에서 온다면, 천 건짜리 무작위 표본에 앱 요청은 열 건 안팎만 들어옵니다. 열 건으로는 앱 사용자가 겪는 응답 시간을 거의 짐작할 수 없습니다.
이럴 때는 모집단을 무리로 먼저 나누고 무리마다 따로 무작위로 뽑습니다. 이 방식이 층화 표본 추출입니다. 앱 요청과 웹 요청에서 오백 건씩 뽑으면 앱 쪽도 넉넉히 볼 수 있습니다.
전부 재는 비용이 작으면 무작위 표본을 뽑을 이유가 없습니다. 데이터베이스에 다 쌓인 주문의 합계는 전부 더하면 답이 나옵니다. 이렇게 모두 재는 방식을 전수 조사라고 합니다. 한 건만 빠져도 틀리는 과금 내역도 표본으로 대신하지 않습니다.
무작위 배정과의 차이
A/B 테스트에도 「무작위」가 나옵니다. 사용자를 두 무리로 나누는 실험입니다. 한쪽에는 새 화면을, 다른 쪽에는 옛 화면을 보여 준 뒤 결과를 견줍니다. 누가 어느 무리로 갈지를 난수로 정합니다.
이렇게 무리를 우연으로 나누는 것을 무작위 배정이라고 부릅니다. 이름은 닮았지만 무작위 표본과는 우연에게 맡기는 일이 다릅니다. 두 방식을 나란히 놓으면 다음과 같습니다.
| 무작위 표본 | 무작위 배정 | |
|---|---|---|
| 우연이 정하는 것 | 누구를 볼지 | 볼 사람이 어느 무리로 갈지 |
| 막아 주는 것 | 표본이 모집단과 어긋나는 것 | 두 무리가 처음부터 달라서 생기는 차이 |
| 얻는 답 | 모집단 전체가 어떤가 | 새 화면이 결과를 바꿨나 |
둘은 따로 쓰일 수 있습니다. 손에 닿는 대로 모은 사용자를 무작위로 나누면, 새 화면이 그 사용자들에게 효과가 있었는지는 알 수 있습니다. 그 결과가 전체 사용자에게도 맞는지는 알 수 없습니다.
관련 항목
무작위 표본을 뽑아 오는 모집단 개념
모집단 · 표본 · 표본 틀 · 표본 크기 · 전수 조사
무작위 표본과 맞세워지는 치우친 표본
편의 표본 · 표본 편향 · 선택 편향 · 생존 편향 · 무응답 편향 · 자기 선택 편향
무작위 표본을 뽑는 추출 방법
샘플링 · 단순 무작위 표본 · 층화 표본 추출 · 계통 표본 추출 · 군집 표본 추출 · 복원 추출 · 비복원 추출 · 확률 표본 추출 · 리저버 샘플링
무작위 표본에 쓰는 우연을 만드는 도구
난수 · 의사 난수 · 난수 생성기 · 시드 · 피셔-예이츠 셔플
무작위 표본으로 모집단을 짐작하는 추론 도구
표본 오차 · 표준 오차 · 신뢰 구간 · 추정 · 통계량 · 모수 · 대수의 법칙 · 중심극한정리 · 대표성
무작위 표본과 헷갈리는 실험 설계 개념
무작위 배정 · A-B 테스트 · 무작위 대조 시험 · 대조군 · 인과 추론
무작위 표본으로 양을 줄이는 백엔드 기법
분산 추적 · 텔레메트리 · 로그 샘플링 · 다운샘플링 · 프로파일링
무작위 표본이 속하는 상위 분류
다른 이름: random sample · 랜덤 샘플 · 임의 표본 · 무작위 샘플