ความน่าจะเป็นและการแจกแจง
UAT 106 สถิติและการวิเคราะห์ข้อมูลสำหรับงานเทคโนโลยี
บทเรียน
เมื่อเรียนจบโมดูลนี้ ผู้เรียนจะสามารถ
- ใช้กฎการบวก การคูณ และความน่าจะเป็นแบบมีเงื่อนไข รวมทั้งทฤษฎีบทของเบย์
- คำนวณความน่าจะเป็นจากการแจกแจงทวินามและการแจกแจงปกติด้วย SciPy
- แปลงค่าเป็น z-score และใช้กฎ 68–95–99.7 ประเมินข้อมูล
- จำลองมอนติคาร์โลแบบกำหนด seed และอธิบายทฤษฎีบทขีดจำกัดกลาง
ทำไมต้องรู้
“ภารกิจสำเร็จ 95%” ฟังดูดี แต่ถ้าหน่วยงานบิน 20 เที่ยวต่อสัปดาห์ จะมีโอกาสสูงมากที่สัปดาห์หนึ่งมีเที่ยวที่ล้มเหลว ความน่าจะเป็นช่วยแปลงตัวเลขความเสี่ยงให้ตรงกับการใช้งานจริง และการแจกแจงของข้อมูลช่วยตอบคำถาม เช่น “มีโอกาสเท่าใดที่แบตเตอรี่ก้อนนี้บินได้ไม่ถึง 20 นาที” ซึ่งเป็นพื้นฐานของการทดสอบในโมดูล 3
กฎพื้นฐานของความน่าจะเป็น
ความน่าจะเป็น (probability) เป็นตัวเลขระหว่าง 0 ถึง 1 บอกว่าเหตุการณ์หนึ่งมีโอกาสเกิดมากเพียงใด
- ส่วนเติมเต็ม
- เหตุการณ์อิสระ (independent) ผลของเหตุการณ์หนึ่งไม่เปลี่ยนโอกาสของอีกเหตุการณ์ จึงคูณกันได้
- ความน่าจะเป็นแบบมีเงื่อนไข คือโอกาสเกิด เมื่อรู้แล้วว่า เกิด
ความน่าจะเป็นที่ทั้งสองเที่ยวสำเร็จคือ ปลายกิ่งทั้งสี่รวมกันได้ 1 เสมอ แต่การคูณแบบนี้ใช้ได้เฉพาะเมื่อเที่ยวบินเป็นอิสระกันจริง ถ้าล้มเหลวเพราะสาเหตุร่วม เช่น ลมแรงทั้งวันหรือซอฟต์แวร์รุ่นเดียวกันมีข้อบกพร่อง เที่ยวบินจะไม่อิสระกัน
การแจกแจงทวินาม
ถ้าทำการทดลองซ้ำ ครั้ง แต่ละครั้งสำเร็จหรือล้มเหลวด้วยโอกาสคงที่ และแต่ละครั้งเป็นอิสระกัน จำนวนครั้งที่ล้มเหลว มี การแจกแจงทวินาม (binomial distribution)
from scipy import stats
n, p_fail = 20, 0.05
print(f"P(at least one failure in {n} flights) = {1 - 0.95 ** n:.4f}")
failures = stats.binom(n, p_fail)
for k in range(4):
print(f"P(X = {k}) = {failures.pmf(k):.4f}")
print(f"P(X >= 2) = {failures.sf(1):.4f} expected failures = {failures.mean():.1f}")
P(at least one failure in 20 flights) = 0.6415
P(X = 0) = 0.3585
P(X = 1) = 0.3774
P(X = 2) = 0.1887
P(X = 3) = 0.0596
P(X >= 2) = 0.2642 expected failures = 1.0
แม้แต่ละเที่ยวสำเร็จ 95% แต่ใน 20 เที่ยวมีโอกาส 64% ที่จะล้มเหลวอย่างน้อยหนึ่งครั้ง และโดยเฉลี่ยคาดว่าล้มเหลว 1 ครั้ง ข้อมูลนี้ช่วยวางแผนอะไหล่และขั้นตอนรับมือเหตุฉุกเฉิน
ตัวอย่างที่ 1 สัญญาณเตือนมอเตอร์กับทฤษฎีบทของเบย์
ระบบตรวจการสั่นสะเทือนเตือนเมื่อสงสัยว่ามอเตอร์ชำรุด สมมติว่ามอเตอร์ชำรุดจริง 2% ระบบเตือนถูก 90% ของมอเตอร์ที่ชำรุด (ความไว) แต่ก็เตือนผิด 5% ของมอเตอร์ปกติ ถ้าระบบเตือน มอเตอร์ชำรุดจริงด้วยโอกาสเท่าใด
p_fault = 0.02
p_alarm_if_fault = 0.90
p_alarm_if_ok = 0.05
p_alarm = p_alarm_if_fault * p_fault + p_alarm_if_ok * (1 - p_fault)
p_fault_if_alarm = p_alarm_if_fault * p_fault / p_alarm
print(f"P(alarm) = {p_alarm:.4f} P(fault | alarm) = {p_fault_if_alarm:.3f}")
P(alarm) = 0.0670 P(fault | alarm) = 0.269
แม้ระบบจะไวถึง 90% แต่เมื่อเตือน มอเตอร์ชำรุดจริงเพียงประมาณ 27% เพราะมอเตอร์ปกติมีจำนวนมากกว่ามาก การเตือนผิดจากมอเตอร์ปกติจึงมากกว่าการเตือนถูก ข้อสรุปคือสัญญาณเตือนควรนำไปสู่ การตรวจยืนยัน ไม่ใช่เปลี่ยนมอเตอร์ทันที
การแจกแจงปกติ
ข้อมูลที่เกิดจากผลรวมของปัจจัยเล็ก ๆ หลายอย่าง เช่น เวลาบินที่ได้รับผลจากลม อุณหภูมิ และสภาพแบตเตอรี่ มักมีรูปร่างใกล้ การแจกแจงปกติ (normal distribution) ที่เป็นรูประฆังสมมาตร กำหนดด้วยค่าเฉลี่ย และส่วนเบี่ยงเบนมาตรฐาน
z-score บอกว่าค่าหนึ่งห่างจากค่าเฉลี่ยกี่ สำหรับการแจกแจงปกติ มีข้อมูลประมาณ 68.27% อยู่ภายใน , 95.45% ภายใน และ 99.73% ภายใน เรียกว่า กฎ 68–95–99.7
for k in (1, 2, 3):
print(f"within ±{k} sigma: {stats.norm.cdf(k) - stats.norm.cdf(-k):.4%}")
mu, sigma = 23.0, 1.5
print(f"z of 20 min = {(20 - mu) / sigma:.1f} P(endurance < 20 min) = {stats.norm.cdf(20, mu, sigma):.4f}")
print(f"99% of flights last at least {stats.norm.ppf(0.01, mu, sigma):.2f} min")
within ±1 sigma: 68.2689%
within ±2 sigma: 95.4500%
within ±3 sigma: 99.7300%
z of 20 min = -2.0 P(endurance < 20 min) = 0.0228
99% of flights last at least 19.51 min
ถ้าเวลาบินของแบตเตอรี่รุ่นหนึ่งมีการแจกแจงปกติ ค่าเฉลี่ย 23 นาที SD 1.5 นาที เกณฑ์ 20 นาทีอยู่ต่ำกว่าค่าเฉลี่ย 2 SD โอกาสที่เที่ยวหนึ่งบินได้ไม่ถึงเกณฑ์จึงประมาณ 2.3% norm.cdf ให้พื้นที่ทางซ้ายของค่าหนึ่ง ส่วน norm.ppf ทำกลับกัน คือหาค่าจากพื้นที่ที่กำหนด
ข้อมูลจริงไม่ได้ปกติเสมอ
ข้อมูลเวลาประมวลผลในโมดูล 1 เบ้ขวาชัดเจน การใช้สูตรของการแจกแจงปกติกับข้อมูลแบบนี้จะประเมินโอกาสเกิดเฟรมช้าต่ำเกินไป ต้องดู histogram ก่อนเลือกแบบจำลองเสมอ
การจำลองมอนติคาร์โลและทฤษฎีบทขีดจำกัดกลาง
เมื่อคำนวณด้วยสูตรยาก เราจำลองสถานการณ์ด้วยตัวเลขสุ่มจำนวนมากแล้วนับผล เรียกว่า การจำลองมอนติคาร์โล (Monte Carlo simulation) กำหนด seed ให้ตัวสร้างเลขสุ่มเสมอเพื่อให้ผลซ้ำได้
import numpy as np
rng = np.random.default_rng(116)
flights = rng.normal(mu, sigma, size=100_000)
print(f"simulated P(< 20 min) = {np.mean(flights < 20):.4f} exact = {stats.norm.cdf(20, mu, sigma):.4f}")
pairs = rng.normal(mu, sigma, size=(100_000, 2))
both_ok = np.mean((pairs >= 20).all(axis=1))
print(f"two batteries both reach 20 min: simulated {both_ok:.4f} exact {(1 - stats.norm.cdf(20, mu, sigma)) ** 2:.4f}")
simulated P(< 20 min) = 0.0234 exact = 0.0228
two batteries both reach 20 min: simulated 0.9550 exact 0.9550
ผลจำลองใกล้ค่าที่คำนวณจากสูตร และจะใกล้ขึ้นเมื่อจำลองมากขึ้น วิธีนี้ใช้ได้กับปัญหาที่ซับซ้อนกว่านี้มาก เช่น ภารกิจหลายขั้นที่แต่ละขั้นมีการแจกแจงต่างกัน
ทฤษฎีบทขีดจำกัดกลาง (central limit theorem) บอกว่าเมื่อเฉลี่ยค่าจากตัวอย่างอิสระจำนวนมากพอ ค่าเฉลี่ย จะมีการแจกแจงใกล้ปกติแม้ข้อมูลเดิมจะไม่ปกติ และส่วนเบี่ยงเบนมาตรฐานของค่าเฉลี่ยลดลงเป็น
import pandas as pd
lat = pd.read_csv("latency.csv")["latency_ms"].to_numpy()
means = rng.choice(lat, size=(20_000, 25)).mean(axis=1)
print(f"data: sd {lat.std(ddof=1):.2f} ms, skew {stats.skew(lat):.2f}")
print(f"means of 25 frames: sd {means.std(ddof=1):.2f} ms (sigma/sqrt(25) = {lat.std(ddof=1) / 5:.2f}), skew {stats.skew(means):.2f}")
data: sd 11.41 ms, skew 0.78
means of 25 frames: sd 2.30 ms (sigma/sqrt(25) = 2.28), skew 0.18
ข้อมูลเวลาประมวลผลเบ้ขวา (skew เป็นบวกชัด) แต่ค่าเฉลี่ยของทีละ 25 เฟรมเบ้น้อยลงมาก และกระจายน้อยลงประมาณห้าเท่าตาม นี่คือเหตุผลที่โมดูล 3 ใช้การแจกแจงของค่าเฉลี่ยสร้างช่วงความเชื่อมั่นได้
ปฏิบัติการประจำโมดูล
ปฏิบัติการ: ประเมินความเสี่ยงของภารกิจ
- หน่วยงานบิน 50 เที่ยวต่อเดือน แต่ละเที่ยวมีโอกาสต้องลงจอดฉุกเฉิน 1% คำนวณโอกาสที่เดือนหนึ่งไม่มีเหตุเลย และโอกาสที่มีมากกว่า 2 ครั้ง ด้วยทั้งสูตรและการจำลอง
- เปลี่ยนตัวเลขในตัวอย่างสัญญาณเตือนมอเตอร์ ให้โอกาสชำรุดเป็น 10% แล้วอธิบายว่าทำไม เปลี่ยนมาก
- วาด histogram ของ
hover_error.csvเทียบกับเส้นโค้งปกติที่มีค่าเฉลี่ยและ SD เดียวกัน แล้วใช้scipy.stats.shapiroทดสอบ ตัดค่าผิดปกติแล้วทดสอบซ้ำ - จำลองภารกิจที่ต้องบินต่อกันสามช่วง แต่ละช่วงใช้เวลาแจกแจงปกติต่างกัน หาโอกาสที่เวลารวมเกิน 60 นาที
ข้อผิดพลาดที่พบบ่อย
ระวัง
- คูณความน่าจะเป็นของเหตุการณ์ที่ไม่อิสระ เช่น เที่ยวบินในวันลมแรงเดียวกัน
- สับสน กับ ความไวของสัญญาณเตือนไม่ใช่โอกาสที่เตือนแล้วชำรุดจริง
- ใช้การแจกแจงปกติกับข้อมูลเบ้ โดยไม่ดูรูปร่างข้อมูลก่อน
- จำลองโดยไม่กำหนด seed ผลเปลี่ยนทุกครั้งที่รัน ผู้อื่นตรวจซ้ำไม่ได้
- คิดว่าทฤษฎีบทขีดจำกัดกลางทำให้ข้อมูลเดิมเป็นปกติ ทฤษฎีบทพูดถึงค่าเฉลี่ย ไม่ใช่ค่ารายตัว
สรุป
- ความน่าจะเป็นของเหตุการณ์อิสระคูณกันได้ ส่วนความน่าจะเป็นแบบมีเงื่อนไขต้องคำนวณด้วยทฤษฎีบทของเบย์
- การแจกแจงทวินามใช้นับจำนวนครั้งที่สำเร็จหรือล้มเหลวจากการทดลองซ้ำที่อิสระกัน
- การแจกแจงปกติกำหนดด้วย และ ใช้ z-score และกฎ 68–95–99.7 ประเมินข้อมูลได้เมื่อข้อมูลใกล้ปกติ
- การจำลองมอนติคาร์โลต้องกำหนด seed และค่าเฉลี่ยของตัวอย่างใกล้ปกติขึ้นตามทฤษฎีบทขีดจำกัดกลาง
แบบฝึกตรวจความเข้าใจ
- โดรนสามลำบินพร้อมกัน แต่ละลำมีโอกาสขัดข้อง 2% อย่างอิสระ โอกาสที่ไม่มีลำใดขัดข้องเป็นเท่าใด
- บิน 10 เที่ยว แต่ละเที่ยวล้มเหลว 10% คาดว่าจะล้มเหลวเฉลี่ยกี่เที่ยว
- เวลาบินเฉลี่ย 25 นาที SD 2 นาที เวลาบิน 21 นาทีมี z-score เท่าใด
- ข้อมูลปกติ มีข้อมูลประมาณกี่เปอร์เซ็นต์อยู่นอก
- ข้อมูลมี ms ค่าเฉลี่ยของตัวอย่างขนาด 36 มีส่วนเบี่ยงเบนมาตรฐานประมาณเท่าใด
เฉลย
- เที่ยว
- ms
สรุปสูตรสำคัญ
| กฎการคูณสำหรับเหตุการณ์อิสระ | |
| ทฤษฎีบทของเบย์ | |
| การแจกแจงทวินาม | |
| z-score | |
| ส่วนเบี่ยงเบนมาตรฐานของค่าเฉลี่ย |
แหล่งอ้างอิงหลัก
- Montgomery, D. C., & Runger, G. C. (2018). Applied statistics and probability for engineers (7th ed.). Wiley. link
- Diez, D. M., Çetinkaya-Rundel, M., & Barr, C. D. (2019). OpenIntro statistics (4th ed.). OpenIntro. link
- NIST/SEMATECH. Normal distribution (section 1.3.6.6.1). e-Handbook of statistical methods. link
- The SciPy community. Statistical functions (scipy.stats), SciPy 1.18 documentation. link
- NIST/SEMATECH. e-Handbook of statistical methods. National Institute of Standards and Technology. link
- Python Software Foundation. statistics — Mathematical statistics functions. The Python standard library (3.14). link
อ่านเพิ่มเติม
ศึกษาหน่วยความรู้ที่กำหนดล่วงหน้า ดูสื่อประกอบ และทำ quiz ประจำโมดูล
ในชั้นเรียน / ภาคสนาม
ปฏิบัติการในห้องแล็บหรือภาคสนามตามใบงาน พร้อม checklist ความปลอดภัย
หลักฐานการเรียนรู้: ใบงานที่ผ่านการตรวจและผล quiz