~11 min · selection-bias, self-selection, non-response, polling
Level 0통계 초심자
0 XP0/55 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete
"*분석한 데이터가 *신경 쓴 인구의 무작위 샘플이 아니야*. *거의 어떤 데이터도 아니야*. *필터를 아는 게 *시민-통계학자의 주요 방어*."
선택 편향이 무엇
*선택 편향이 *샘플을 생산한 과정이 *측정하려는 결과와 상관될 때 일어남*. *고전 형태*:
자기-선택: *피실험자가 참여 자원*. *자원자가 *비자원자와 *자주 결과와 상관되는 방식으로 다름*.
비응답 편향: *피실험자가 답변 거부*. *거부자가 *응답자와 다름*.
생존: *오직 일부 피실험자만 측정에 도달 가능* (lesson 3 에서 다룸).
지리적/인구통계적 필터링: *샘플이 *연구자에게 접근 가능한 장소나 그룹의 사람만 포함*.
편의 샘플링: *연구자가 '주변에 있는 누구든' 사용, *드물게 대표적 슬라이스*.
*각각이 *구성이 더 이상 인구의 것이 아닌 샘플 생산*, *그리고 샘플에서 그려진 추론이 *일반화 안 됨*.
1948 선거 여론조사 재앙
*1948 미국 대통령 선거에서, *모든 주요 선거-전 여론조사가 *Dewey 가 Truman 을 패배시킬 거라 예측*. *여론조사가 *극적으로 틀림*. *원인은 선택 편향*: *여론조사가 전화로 수행*, *그리고 1948 년에 *전화가 *비례적으로 더 부유하고 더 공화당원 유권자가 가짐*. *여론조사 샘플이 *공화당-편향 응답자 쪽으로 체계적으로 비대칭*, *그리고 샘플에서 인구로의 투영이 *그래서 편향됨*. *'Dewey Defeats Truman' 헤드라인이 *저널리즘 역사상 가장 유명한 사진 중 하나*, *그리고 정치 여론조사 방법론이 *결과적으로 실질적으로 바뀜*.
현대 형태: 온라인 여론조사와 'engagement'
*현대 온라인 여론조사와 *소셜 미디어 'sentiment' 지표가 *같은 선택 편향 겪음*. *온라인 여론조사 채우는 사람이 *인구의 무작위 슬라이스가 아니야*; *더 engaged, 더 의견 있음, 더 온라인*. *한 플랫폼 (Twitter/X vs Reddit vs Instagram) 에서 draw 하는 여론조사가 *다른 인구통계적·이념적 분포에서 draw*. *플랫폼 가로질러 집계나 신중히 가중치 부여로 *부분적으로 교정 가능*, *근데 *기저 필터가 절대 완전히 사라지지 않음*. *'인터넷 sentiment' 가 *그것을 표현하기로 선택한 사람의 sentiment*, *그게 *인구의 sentiment 와 같지 않음*.
운영 원칙
*어떤 샘플에서든 추론을 그리기 전에 물어*: *어떤 필터링 과정이 이 샘플을 생산했어*? *누가 안에 있고, 누가 제외돼*? *필터가 *측정 중인 결과와 상관*? *Yes 면, 샘플이 편향됐고 *그것으로부터의 추론이 *교정 없이는 더 넓은 인구로 일반화 안 됨*. *대부분 대중-향 데이터 — *여론조사, 설문, 온라인 sentiment, 고객 피드백, 앱 리뷰 — *가 *실질적 선택 편향 겪음*, *자주 헤드라인에서 이름 안 붙음*. *필터 이름 붙이기가 *시민의 첫 정상성 체크*.
Code
선택 편향: 응답이 결과와 상관·python
import numpy as np
rng = np.random.default_rng(270)
# *어떤 질문에 대해 *참 50/50 분할인 인구 시뮬*.
# *근데 *(양쪽 모두) 그것에 대해 *강하게 느끼는 사람이 *3배 더 응답할 가능성*.
# *여론조사 샘플이 *강한 의견 쪽으로 편향*.
N = 100_000
true_opinion = rng.choice(['yes', 'no'], size=N, p=[0.5, 0.5])
strength = rng.choice(['mild', 'strong'], size=N, p=[0.7, 0.3])
# *응답 확률이 강도에 의존*.
response_prob = np.where(strength == 'strong', 0.6, 0.2)
responded = rng.random(N) < response_prob
sample = true_opinion[responded]
yes_pct_sample = (sample == 'yes').mean() * 100
yes_pct_true = (true_opinion == 'yes').mean() * 100
print(f"참 인구 yes 율: {yes_pct_true:.2f}%")
print(f"여론조사 샘플 yes 율: {yes_pct_sample:.2f}%")
# *이 시뮬에서 yes 율이 *방향이 아니라 강도에 필터가 있어서 *비슷*.
# *이제 *강도를 *방향과 상관되게 변경* ('yes' 라 말하는 사람이 더 열정적)...
response_prob2 = np.where(
(true_opinion == 'yes') & (strength == 'strong'), 0.7,
np.where((true_opinion == 'no') & (strength == 'strong'), 0.5,
0.2)
)
responded2 = rng.random(N) < response_prob2
sample2 = true_opinion[responded2]
yes_pct_sample2 = (sample2 == 'yes').mean() * 100
print(f"\n*'yes' 지지자가 더 응답할 때 (선택 편향):*")
print(f"여론조사 샘플 yes 율: {yes_pct_sample2:.2f}%")
print(f"참 yes 율: {yes_pct_true:.2f}%")
# *여론조사가 이제 *'yes' 를 *과대-추정*, *단순히 'yes' 유권자가 *더 응답할 의향이 있어서*.
# *이게 *평이한 숫자로의 선택 편향*.
*만난 최근 데이터셋 고르기* (여론조사, 설문, 온라인 sentiment, 앱 평점, 고객 피드백 보고). *선택 필터 식별*: *누가 샘플에 있고, 누가 제외돼*? *필터가 *측정 중인 결과와 상관돼*? *Yes 면, *누락된 그룹이 대표되면 헤드라인이 어떻게 바뀔까*?
Hint
*거의 모든 온라인 데이터가 *engaged, 의견 있는, 클릭할 의향 있는 쪽으로 선택-편향됨*. *비대표가 *침묵하는 다수*, *그리고 그들의 부재가 *읽는 대부분 데이터를 체계적으로 비대칭*.
Progress
Progress is local-only — sign in to sync across devices.