사전 무작위 표본
개념

무작위 표본

gabury1고친 사람 github-actions[bot]

무작위 표본은 누구를 뽑을지를 사람 대신 우연에게 맡겨서 얻은 표본입니다. 전체 가운데 어느 것이든 뽑힐 기회가 똑같습니다. 그래서 뽑는 사람의 버릇이나 편의가 표본에 끼어들지 않습니다. 일부만 보고 전체를 짐작할 때 그 짐작을 믿을 수 있게 해 주는 기본 방법입니다.

쉽고 빠른 이해

무작위 표본은 전체에서 일부를 뽑을 때 누가 뽑힐지를 우연에 맡긴 표본입니다. 한 달 치 요청마다 주사위를 굴리듯 판정해서 백 건 중 한 건꼴로 남기면 무작위 표본이 됩니다.

사람이 고르면 손에 닿기 쉬운 쪽으로 쏠립니다. 접속하기 편한 서버 한 대의 로그만 보면 나머지 서버에서 오래 걸린 요청을 놓칩니다. 우연에 맡기면 이런 쏠림이 끼어들 틈이 없습니다.

  1. 뽑을 대상 전체를 정합니다
  2. 대상마다 뽑힐 기회를 똑같이 주고 우연으로 뽑습니다
  3. 뽑힌 것만 재서 전체를 짐작합니다

대가는 우연이 만드는 빗나감이 남는다는 것입니다. 뽑을 때마다 답이 조금씩 다릅니다. 수가 적은 무리는 표본에 몇 건 안 들어와서 그 무리에 대해서는 거의 알 수 없습니다.

전부 재는 비용이 작으면 뽑지 않고 다 잽니다. 한 건만 빠져도 틀리는 과금 내역도 표본으로 대신하지 않습니다.

상세

반 대표를 제비뽑기로 정합니다. 이름을 적은 쪽지를 상자에 넣어 잘 흔듭니다. 눈을 감은 채 한 장을 꺼냅니다. 누가 나올지는 뽑는 사람도 모릅니다. 쪽지마다 나올 기회가 같습니다.

알고 싶은 대상 전체를 모집단이라고 부릅니다. 한 달 동안 들어온 요청이 어떤지 알고 싶다면, 그 요청 전부가 모집단입니다.

모집단에서 골라 낸 일부가 표본입니다. 한 달 치 요청 가운데 골라 낸 천 건이 표본입니다. 전부 재기에는 너무 많을 때 일부만 재려고 표본을 뽑습니다.

무작위 표본은 모집단의 구성원 하나하나가 똑같은 확률로 뽑히게 해서 얻은 표본입니다. 요청 백 건 중 한 건꼴로 남기되, 어느 요청을 남길지는 우연이 정합니다. 그러면 모든 요청이 백분의 일이라는 같은 확률로 표본에 듭니다.

컴퓨터에서 우연을 맡는 것은 난수입니다. 난수는 앞에 나온 값으로 다음 값을 짐작할 수 없게 만든 수입니다. 뽑을지 말지를 난수에 물으면 사람의 판단을 막을 수 있습니다.

아무렇게나 고른 표본과의 차이

일상에서 「무작위로 골랐다」는 말은 흔히 「별생각 없이 골랐다」는 뜻입니다. 통계에서 말하는 무작위는 그 뜻이 아닙니다. 별생각 없이 고르면 대개 손에 닿기 쉬운 것을 고르게 됩니다.

서버 열 대의 응답 시간을 알고 싶습니다. 그런데 접속 설정이 이미 되어 있는 한 대에만 들어가 그 서버 로그만 봅니다. 이렇게 손에 닿는 대로 모은 표본이 편의 표본입니다.

그 한 대가 가장 새 장비라면 나머지 아홉 대보다 빠를 수 있습니다. 로그를 아무리 많이 모아도 아홉 대의 요청은 한 건도 안 들어옵니다. 표본이 이렇게 한쪽으로 계속 어긋나는 것이 표본 편향입니다.

무작위 표본은 뽑는 일을 우연에게 넘겨서 이 치우침을 끊습니다. 열 대에서 들어온 요청 전부를 놓고 요청마다 같은 확률로 뽑으면, 어느 서버의 요청도 덜 뽑히거나 더 뽑히지 않습니다.

빗나감의 크기를 잴 수 있다

무작위 표본도 모집단을 꼭 닮지는 않습니다. 어떤 요청이 걸리느냐가 매번 우연이라서 표본의 평균은 모집단의 평균에서 조금씩 벗어납니다. 이 벗어남이 표본 오차입니다.

표본 오차는 뽑는 방식이 우연이라서 생깁니다. 그런데 바로 그 점 덕분에 크기를 계산할 수 있습니다. 뽑힐 확률이 정해져 있으면 「이만한 표본이면 대개 이만큼 빗나간다」를 확률 계산으로 구합니다.

그 계산으로 얻는 것이 신뢰 구간입니다. 표본 평균 하나만 내놓지 않고 「모집단의 평균은 대개 이 값부터 저 값 사이에 있다」처럼 짐작에 폭을 붙인 것입니다. 표본을 크게 뽑을수록 이 폭이 좁아집니다.

편의 표본에는 이 계산을 붙일 수 없습니다. 무엇이 왜 뽑혔는지를 확률로 적을 수 없어서입니다. 계산을 돌리면 숫자는 나옵니다. 그 숫자가 무엇을 뜻하는지는 아무도 보장하지 못합니다.

넓은 뜻과 좁은 뜻

「무작위 표본」은 두 가지 뜻으로 씁니다. 넓게는 앞에서 본 대로 구성원마다 뽑힐 확률이 같은 표본입니다.

좁게는 뽑을 수 있는 묶음마다 뽑힐 확률이 같은 표본입니다. 여섯 건에서 세 건을 뽑는다면, 세 건짜리 묶음은 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 로 주문 번호 열 개 가운데 세 개를 뽑는 코드입니다.

Python
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 미만의 난수를 뽑습니다. 그 값이 정해 둔 비율보다 작으면 남깁니다.

Python
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 · 랜덤 샘플 · 임의 표본 · 무작위 샘플