บทนำ: "เครื่องจำลองการบิน" ของนักคณิตศาสตร์ประกันภัย

ยินดีต้อนรับเข้าสู่หนึ่งในบทเรียนที่เน้นการนำไปใช้งานจริงมากที่สุดบทหนึ่งในหลักสูตร CS1! ใน Paper B คุณไม่ได้มีหน้าที่แค่คำนวณความน่าจะเป็นเท่านั้น แต่คุณกำลังสร้างแบบจำลอง ลองจินตนาการว่า การจำลองตัวแปรสุ่ม (Simulating random variables) เปรียบเสมือนเครื่องจำลองการบิน (Flight Simulator) สำหรับนักคณิตศาสตร์ประกันภัย ก่อนที่บริษัทประกันจะเปิดตัวผลิตภัณฑ์ใหม่ พวกเขาจะทำการ "ทดลองบิน" โดยการจำลองสถานการณ์การเคลมที่อาจเกิดขึ้นนับพันครั้ง เพื่อดูว่าบริษัทจะยังคงมีฐานะทางการเงินที่มั่นคง (Solvent) หรือไม่ ในบทนี้ เราจะมาเรียนรู้วิธีการใช้โปรแกรม R เพื่อสร้าง "เที่ยวบินทดสอบ" เหล่านี้ โดยใช้ฟังก์ชันสำเร็จรูปและ วิธีการแปลงผกผัน (Inverse Transform Method)

1. ตระกูลฟังก์ชันขึ้นต้นด้วย "r"

ในโปรแกรม R การแจกแจงความน่าจะเป็นส่วนใหญ่จะมีฟังก์ชันเฉพาะสำหรับการสร้างกลุ่มตัวอย่างแบบสุ่ม โดยฟังก์ชันเหล่านี้จะขึ้นต้นด้วยตัวอักษร r (ย่อมาจาก "random") เสมอ

โครงสร้างทั่วไปมักจะเป็น: r[ชื่อการแจกแจง](n, [พารามิเตอร์]) โดยที่ \(n\) คือจำนวนข้อมูลที่คุณต้องการสร้างขึ้นมา

การแจกแจงแบบไม่ต่อเนื่อง (Discrete Distributions) ที่พบบ่อย

  • Binomial: rbinom(n, size, prob) — สร้างกลุ่มตัวอย่างจำนวน \(n\) ชุดจาก \(X \sim Bin(size, prob)\)
  • Poisson: rpois(n, lambda) — สร้างกลุ่มตัวอย่างจำนวน \(n\) ชุดจาก \(X \sim Pois(\lambda)\)
  • Geometric: rgeom(n, prob) — สร้างจำนวน ครั้งที่ล้มเหลว ก่อนจะพบความสำเร็จครั้งแรก
  • Negative Binomial: rnbinom(n, size, prob) — สร้างจำนวน ครั้งที่ล้มเหลว ก่อนจะพบความสำเร็จตามจำนวนที่กำหนด

การแจกแจงแบบต่อเนื่อง (Continuous Distributions) ที่พบบ่อย

  • Normal: rnorm(n, mean, sd) — ข้อควรระวัง: R ใช้ ส่วนเบี่ยงเบนมาตรฐาน (Standard Deviation) \(\sigma\) ไม่ใช่ความแปรปรวน (Variance) \(\sigma^2\)
  • Exponential: rexp(n, rate) — ใช้พารามิเตอร์อัตรา (Rate) \(\lambda\)
  • Gamma: rgamma(n, shape, rate) — สามารถใช้ scale (\(1/rate\)) แทนได้เช่นกัน
  • Uniform: runif(n, min, max) — สร้างค่าระหว่างขอบเขตล่างและขอบเขตบน
  • Lognormal: rlnorm(n, meanlog, sdlog)
  • Beta: rbeta(n, shape1, shape2)

ทบทวนสั้นๆ: หากคุณต้องการจำลองการเคลม 100 รายการจากการแจกแจงแบบพัวซองที่มีค่าเฉลี่ยเท่ากับ 5 คุณต้องใช้คำสั่ง rpois(100, 5)

2. การทำซ้ำได้: ฟังก์ชัน set.seed()

จริงๆ แล้วคอมพิวเตอร์ไม่ได้สร้างตัวเลขที่ "สุ่ม" อย่างแท้จริง แต่ใช้อัลกอริทึมในการสร้าง "เลขสุ่มเทียม" (Pseudo-random numbers) ขึ้นมา หากคุณรันคำสั่ง rnorm(5, 0, 1) สองครั้ง คุณจะได้ผลลัพธ์ที่ต่างกัน ซึ่งอาจเป็นปัญหาสำหรับผู้ตรวจข้อสอบที่ต้องตรวจคำตอบของคุณ!

วิธีแก้: ใช้ฟังก์ชัน set.seed() โดยการพิมพ์ set.seed(123) (หรือตัวเลขจำนวนเต็มใดๆ) ก่อนโค้ดการจำลองของคุณ เพื่อให้มั่นใจว่า R จะสร้างชุดตัวเลข "สุ่ม" ที่ เหมือนเดิมทุกประการ ในทุกครั้งที่รันโค้ด

เคล็ดลับสำคัญสำหรับการสอบ: ตรวจสอบเสมอว่าโจทย์กำหนดค่า Seed มาให้หรือไม่ หากโจทย์บอกว่า "Use a seed of 42" บรรทัดแรกของโค้ดคุณต้องเป็น set.seed(42)

3. วิธีการแปลงผกผัน (Inverse Transform Method - ITM)

ในบางครั้ง คุณอาจถูกขอให้สร้างตัวแปรสุ่มด้วยตัวเองโดยไม่ใช้ฟังก์ชัน "r" เฉพาะเจาะจง วิธีการแปลงผกผัน เป็นวิธีมาตรฐานในการทำเช่นนี้สำหรับทั้งตัวแปรแบบไม่ต่อเนื่องและแบบต่อเนื่อง

หลักการเบื้องหลัง ITM

ฟังก์ชันการแจกแจงสะสม (CDF) ทุกตัว หรือ \(F(x)\) จะให้ค่าผลลัพธ์อยู่ระหว่าง 0 ถึง 1 เสมอ หากเราสุ่มตัวเลข \(U\) จากการแจกแจงแบบ Uniform(0,1) เราสามารถ "คำนวณย้อนกลับ" เพื่อหาค่าของ \(x\) ที่สอดคล้องกับค่าความน่าจะเป็นนั้นได้

ขั้นตอนการทำ:

  1. สร้างตัวเลขสุ่ม \(u\) จาก \(U \sim Uniform(0,1)\) โดยใช้คำสั่ง runif(1)
  2. กำหนดให้ \(F(x) = u\)
  3. แก้สมการหาค่า \(x\) โดยคำนวณหาค่าผกผัน (Inverse): \(x = F^{-1}(u)\)

ตัวอย่างสำหรับการแจกแจงแบบเอกซ์โพเนนเชียล (Exponential):
สูตร CDF คือ \(F(x) = 1 - exp(-\lambda x)\)
1. ตั้งสมการ \(u = 1 - exp(-\lambda x)\)
2. \(1 - u = exp(-\lambda x)\)
3. \(\ln(1 - u) = -\lambda x\)
4. \(x = -\frac{1}{\lambda} \ln(1 - u)\)

ในโปรแกรม R หากคุณมีเวกเตอร์ของตัวแปรสุ่มแบบสม่ำเสมอ u คุณจะเขียนโค้ดได้ว่า: x <- - (1/lambda) * log(1 - u)

รู้หรือไม่? เนื่องจากทั้ง \(U\) และ \(1-U\) ต่างก็มีการแจกแจงแบบ \(Uniform(0,1)\) เหมือนกัน นักคณิตศาสตร์ประกันภัยจึงมักจะลดรูปสูตรให้ง่ายขึ้นเป็น \(x = -\frac{1}{\lambda} \ln(u)\)

4. การสุ่มตัวอย่างจากข้อมูลที่มีอยู่

ในหลักสูตรยังระบุถึงการสร้างกลุ่มตัวอย่าง ไม่เพียงแต่จากการแจกแจงทางทฤษฎีเท่านั้น แต่ยังรวมถึงจากชุดข้อมูลที่มีอยู่ด้วย เราจะใช้ฟังก์ชัน sample() สำหรับกรณีนี้

อาร์กิวเมนต์ที่สำคัญของ sample():

  • x: ข้อมูลหรือเวกเตอร์ที่ต้องการนำมาสุ่มตัวอย่าง
  • size: จำนวนข้อมูลที่ต้องการเลือก
  • replace: เราควรใส่ข้อมูลกลับคืนหลังจากเลือกมาแล้วหรือไม่? (TRUE หรือ FALSE)

การประยุกต์ใช้ในโลกจริง:

The Bootstrap: เพื่อประมาณค่าคุณสมบัติของตัวประมาณค่า (เช่น ความเอนเอียง หรือความแปรปรวน) เราสามารถใช้ "วิธีบูตสแตรป" (Bootstrap method) ซึ่งเกี่ยวข้องกับการสุ่มตัวอย่างจากข้อมูลของเรา แบบใส่คืน (replace = TRUE) เพื่อจำลองการสุ่มตัวอย่างใหม่จากประชากร

Permutation Tests: สำหรับการทดสอบสมมติฐานแบบนอนพารามิเตอร์ (Non-parametric) เรามักจะสุ่มตัวอย่าง แบบไม่ใส่คืน (replace = FALSE) เพื่อทำการ "สลับที่" ข้อมูลและดูว่ารูปแบบที่เกิดขึ้นนั้นเกิดขึ้นโดยบังเอิญหรือไม่

5. การเปรียบเทียบการจำลองกับทฤษฎี

เมื่อคุณได้ข้อมูลที่จำลองมาแล้ว หลักสูตรกำหนดให้คุณเปรียบเทียบข้อมูลนั้นกับการแจกแจงที่ทราบค่า โดยเฉพาะ การแจกแจงปกติ (Normal Distribution) ซึ่งเป็นส่วนหนึ่งของ ทฤษฎีบทขีดจำกัดล่างกลาง (Central Limit Theorem - CLT)

หากคุณจำลองค่าเฉลี่ยของกลุ่มตัวอย่าง 1,000 ชุดจากการแจกแจงใดๆ ก็ตาม CLT บอกเราว่าค่าเฉลี่ยเหล่านั้นควรจะมีรูปร่างเหมือนโค้งปกติ ใน R คุณสามารถตรวจสอบสิ่งนี้ได้โดย:

  1. วาดฮิสโทแกรมของข้อมูลที่จำลองมา: hist(sim_data)
  2. วาดเส้นโค้งความหนาแน่นทับลงไป: lines(density(sim_data))
  3. ใช้แผนภาพ Q-Q (Q-Q plot) เพื่อดูว่าจุดต่างๆ เรียงตัวเป็นเส้นตรงหรือไม่ (ซึ่งจะกล่าวถึงเพิ่มเติมในบท "Exploratory plots")

ประเด็นสำคัญ: การจำลองช่วยให้เราสามารถพิสูจน์ CLT ได้ แม้ว่าข้อมูลตั้งต้นจะมีความเบ้อย่างมาก (เช่น การแจกแจงแบบเอกซ์โพเนนเชียล) แต่ ค่าเฉลี่ย ของการจำลองเหล่านั้นจะเริ่มดูเป็น "ปกติ" มากขึ้นเมื่อขนาดกลุ่มตัวอย่างเพิ่มขึ้น

สรุปและทบทวนสั้นๆ

ข้อควรระวังที่พบบ่อย:

  • ส่วนเบี่ยงเบนมาตรฐาน vs ความแปรปรวน: จำไว้ว่า rnorm() ต้องการค่า \(\sigma\) แต่โจทย์สอบหลายข้อให้ค่า \(\sigma^2\) มา อย่าลืมใช้ sqrt() หากจำเป็น!
  • ลืมตั้งค่า set.seed(): หากคุณไม่ตั้งค่า seed คำตอบที่เป็นตัวเลขของคุณจะต่างไปจากเกณฑ์การให้คะแนน (Mark scheme)
  • ตรรกะของ ITM: จำไว้ว่า ITM เริ่มต้นด้วย runif() เสมอ เพราะคุณกำลังแปลง "ความน่าจะเป็น" กลับไปเป็น "ค่าของตัวแปร"

หมายเหตุ: สำหรับความช่วยเหลือในการคำนวณความน่าจะเป็นเฉพาะเจาะจงหรือสถิติเชิงพรรณนาของกลุ่มตัวอย่างที่จำลองเหล่านี้ โปรดดูในบท "Probabilities, quantiles and summary statistics in R"