Data Analytics | Insights & Research

PUAY101

EP.2: ผลตรวจเป็นบวก! สรุปว่าเราป่วยจริงไหม? – ไขปมความน่าจะเป็นแบบมีเงื่อนไข

ซีรีส์: Probability for Data Folks | เมื่อโค้ดไขความลับความน่าจะเป็น

ในตอนที่แล้ว เราได้เห็นพลังของ กฎว่าด้วยจำนวนมาก (Law of Large Numbers) ที่พิสูจน์ว่ายิ่งทดลองซ้ำๆ ผลลัพธ์ก็จะยิ่งวิ่งเข้าหาทฤษฎี

แต่ความน่าจะเป็นในโลกจริงนั้นซับซ้อนกว่าการโยนเหรียญ มันมักจะมาพร้อมกับ “เงื่อนไข” และข้อมูลแวดล้อมที่อาจทำให้เข้าใจผิดได้

ลองจินตนาการถึงสถานการณ์นี้ครับ…

สมมติว่ามีโรคหายากโรคหนึ่ง ซึ่งมีคนป่วยแค่ 1% ของประชากรทั้งหมด โชคดีที่มีชุดตรวจที่แม่นยำมากๆ ถึง 99% วันหนึ่งคุณไปตรวจสุขภาพ และได้รับผลว่า “เป็นบวก”

คำถาม: เราสามารถสรุปได้เลยว่าโอกาสที่คุณจะป่วยเป็นโรคนั้นจริงๆ คือ 99% ได้ไหม?

ถ้าคุณตอบว่า “ใช่” หรือ “ใกล้เคียง 99%”… คุณคือคนส่วนใหญ่ที่ตกหลุมพรางของสัญชาตญาณครับ คำตอบที่แท้จริงอาจจะน้อยกว่าที่คุณคิดไปไกลลิบเลยทีเดียว

ปรากฏการณ์นี้คือหัวใจของ ความน่าจะเป็นแบบมีเงื่อนไข (Conditional Probability) ซึ่งเป็นแนวคิดที่สำคัญอย่างยิ่งในโลกของ Data Science และวันนี้เราจะมาไขความลับข้อนี้กัน

มาวิเคราะห์โจทย์กันก่อน (The Devil is in the Details)

ปัญหานี้ซับซ้อนกว่าการโยนเหรียญ เพราะมีข้อมูลหลายส่วนที่เราต้องทำความเข้าใจให้ชัดเจน:

  1. ความชุกของโรค (Base Rate หรือ Prevalence): มีคนป่วยแค่ 1% ของประชากรทั้งหมด (หรือ 0.01) นี่คือข้อมูลสำคัญที่คนมักจะมองข้าม
  2. ความแม่นยำของชุดตรวจ (Accuracy): 99% แต่คำว่า “แม่นยำ” ต้องแยกเป็น 2 กรณี
    • ถ้าคุณป่วยจริงๆ ชุดตรวจจะบอกว่า “บวก” ถูกต้อง 99% (True Positive Rate) และจะพลาดบอกว่า “ลบ” แค่ 1% (False Negative Rate)
    • ถ้าคุณไม่ป่วยจริงๆ ชุดตรวจจะบอกว่า “ลบ” ถูกต้อง 99% (True Negative Rate) และจะพลาดบอกว่า “บวก” แค่ 1% (False Positive Rate)

คำถามของเราคือ P(textป่วย∣textผลเป็นบวก) หรือ “ความน่าจะเป็นที่จะป่วย เมื่อได้รับเงื่อนไขว่า ผลตรวจเป็นบวก”

คิดแบบไม่ใช้สูตร: ลองจินตนาการถึงคน 100,000 คน

การคำนวณด้วยสูตรอาจจะน่าปวดหัว งั้นเรามาใช้วิธีที่ “จับต้องได้” ที่สุดกันครับ ลองจินตนาการว่าเรามีประชากรอยู่ 100,000 คน

Step 1: ใน 100,000 คนนี้ มีคนป่วยกี่คน? จากความชุกของโรค 1% หมายความว่า:

  • คนป่วยจริงๆ: 100,000 * 1% = 1,000 คน
  • คนที่ไม่ป่วย: 100,000 – 1,000 = 99,000 คน

Step 2: เอาคนป่วย 1,000 คนไปตรวจ จากความแม่นยำ 99% ของชุดตรวจ:

  • ผลตรวจเป็น “บวก” (และป่วยจริง – True Positive): 1,000 * 99% = 990 คน
  • ผลตรวจเป็น “ลบ” (ทั้งที่ป่วยจริง – False Negative): 1,000 * 1% = 10 คน

Step 3: เอาคนที่ไม่ป่วย 99,000 คนไปตรวจ นี่คือจุดที่สำคัญที่สุด! แม้คนเหล่านี้จะไม่ป่วย แต่ชุดตรวจก็มีโอกาสพลาดได้ 1%:

  • ผลตรวจเป็น “บวก” (ทั้งที่ไม่ป่วย – False Positive): 99,000 * 1% = 990 คน
  • ผลตรวจเป็น “ลบ” (และไม่ป่วยจริง – True Negative): 99,000 * 99% = 98,010 คน

Step 4: หาคำตอบ! ตอนนี้เรามาตอบคำถามเดิมกัน: “ถ้าผลตรวจของคุณเป็นบวก โอกาสที่คุณจะป่วยจริงๆ เป็นเท่าไหร่?”

  • ก่อนอื่น มาดูกลุ่มคนที่ได้ผล “บวก” ทั้งหมดกันก่อน ซึ่งมาจาก 2 กลุ่ม:
    • คนที่ป่วยจริงและผลเป็นบวก: 990 คน
    • คนที่ไม่ป่วยแต่ผลเป็นบวก: 990 คน
    • รวมคนที่มีผลตรวจเป็นบวกทั้งหมด = 990 + 990 = 1,980 คน
  • ในบรรดา 1,980 คนที่เดินออกจากห้องตรวจพร้อมผล “บวก” นี้ มีคนที่ป่วยจริงๆ กี่คน?
    • คำตอบคือ 990 คน (กลุ่ม True Positive)

ดังนั้น ความน่าจะเป็นที่จะป่วยจริง เมื่อผลตรวจเป็นบวก คือ:

ใช่แล้วครับ… 50% เท่านั้น! น่าตกใจใช่ไหมครับ? แม้ชุดตรวจจะแม่นยำถึง 99% แต่โอกาสที่คุณจะป่วยจริงๆ กลับมีแค่ 50% เหตุผลก็เพราะโรคนี้มัน “หายาก” มากๆ ทำให้จำนวนคนที่ “ไม่ป่วยแต่ดันได้ผลบวก” (False Positive) มีจำนวนพอๆ กับคนที่ “ป่วยและได้ผลบวก” (True Positive) เลยทีเดียว

ให้ Code พิสูจน์ความจริง

ตอนนี้เรามาสร้าง Simulation ด้วย Python เพื่อยืนยันแนวคิดที่หักมุมนี้กันครับ เราจะสร้างประชากรเสมือนจริง 1 ล้านคน แล้วจำลองการตรวจโรคทั้งหมด

Python

import random
# 1. Setup the parameters of our world
population_size = 1_000_000
disease_prevalence = 0.01 # 1% of the population is sick
test_accuracy = 0.99 # 99% accuracy
# For clarity in simulation
true_positive_rate = test_accuracy
false_positive_rate = 1 – test_accuracy
# 2. Create lists to hold our results
# We will store tuples of (is_sick, test_result)
population_data = []
# 3. Simulate the entire population
for i in range(population_size):
# Determine if this person is sick based on prevalence
is_sick = (random.random() < disease_prevalence)
test_result = ''
if is_sick:
# It's a sick person, use the true positive rate
if random.random() < true_positive_rate:
test_result = 'Positive'
else:
test_result = 'Negative'
else:
# It's a healthy person, use the false positive rate
if random.random() < false_positive_rate:
test_result = 'Positive'
else:
test_result = 'Negative'
population_data.append((is_sick, test_result))
# 4. Analyze the results
total_positives = 0
true_positives = 0
for person in population_data:
is_sick, test_result = person
if test_result == 'Positive':
total_positives += 1
if is_sick: # and they are actually sick
true_positives += 1
# 5. Calculate the final conditional probability
# Handle the case where total_positives might be zero
if total_positives > 0:
conditional_probability = true_positives / total_positives
else:
conditional_probability = 0
print(f"Simulation based on {population_size:,} people:")
print(f"Total people who tested 'Positive': {total_positives:,}")
print(f"People who are actually sick AND tested 'Positive': {true_positives:,}")
print("-" * 30)
print(f"The probability of being sick given a positive test is: {conditional_probability:.4f}")
view raw ep2.py hosted with ❤ by GitHub

Result:

Simulation based on 1,000,000 people:
Total people who tested 'Positive': 19,891
People who are actually sick AND tested 'Positive': 9,933
------------------------------
The probability of being sick given a positive test is: 0.4994

ผลลัพธ์จาก Code ยืนยันสิ่งที่เราคำนวณด้วยมืออย่างชัดเจน! ความน่าจะเป็นที่ได้เข้าใกล้ 0.5 หรือ 50% อย่างไม่น่าเชื่อ

เรื่องนี้เกี่ยวกับ Data Science อย่างไร?

สิ่งที่เราเพิ่งทำไปคือการประยุกต์ใช้แนวคิดของ ทฤษฎีของเบย์ (Bayes’ Theorem) ซึ่งเป็นหนึ่งในเครื่องมือที่สำคัญที่สุดของ Data Scientist สูตรของมันคือ:

โดยที่:

  • P(A∣B) คือสิ่งที่เราอยากรู้ (โอกาสป่วย เมื่อผลบวก)
  • P(B∣A) คือความแม่นยำของเทส (โอกาสผลบวก เมื่อป่วย)
  • P(A) คือความชุกของโรค (โอกาสที่จะป่วยตั้งแต่แรก)
  • P(B) คือโอกาสทั้งหมดที่จะได้ผลบวก

หลักการนี้ถูกนำไปใช้ในหลายๆ ที่:

  • Spam Filters: คำนวณความน่าจะเป็นที่อีเมลจะเป็น “สแปม” เมื่อ มันมีคำว่า “โปรโมชั่น” หรือ “ฟรี”
  • Recommendation Engines: แนะนำสินค้าโดยคำนวณความน่าจะเป็นที่ลูกค้าจะ “ชอบสินค้า A” เมื่อ พวกเขาเคย “ซื้อสินค้า B” มาก่อน
  • A/B Testing: ประเมินความน่าจะเป็นว่า “เวอร์ชัน B ดีกว่า” เมื่อ เราได้ “เห็นข้อมูลผลลัพธ์” แบบนี้

บทสรุปสุดท้าย

  • บทเรียนสำคัญที่สุดในวันนี้คือ “อย่าลืม Base Rate” หรือข้อมูลพื้นฐานเริ่มต้น
  • ความน่าจะเป็นแบบมีเงื่อนไขสอนให้เรามองภาพรวมและไม่ด่วนสรุปจากข้อมูลเพียงชิ้นเดียว

สุดท้าย>>ขอขอบคุณทุกๆคนเลยครับที่อ่านจนมาถึงตรงนี้หวังว่าจะชอบกันนะครับ

ในตอนหน้าของซีรีส์… เราจะไปคำนวณ “ความสิ้นหวัง” ที่ทุกคนคุ้นเคยกันดีในหัวข้อ: “EP.3: ทำไมเราถึงไม่เคยถูกหวย

ฝากติดตามตอนต่อไปด้วยนะคร้าบบ 😁😁😁

Comments

Leave a Reply

Discover more from PUAY101

Subscribe now to keep reading and get access to the full archive.

Continue reading