การสร้างการแจกแจงแบบสุ่ม
สุ่มตัวอย่างจากการแจกแจงแบบปกติ สม่ำเสมอ ทวินาม และปัวซง
การสร้างการแจกแจงแบบสุ่ม เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
ฟังก์ชันการแจกแจงของ R
R มีฟังก์ชันสี่แบบสำหรับการแจกแจงแต่ละชนิด ได้แก่ r (สุ่ม), d (ความหนาแน่น), p (ความน่าจะเป็นสะสม) และ q (ควอนไทล์) ฟังก์ชัน r* ใช้สร้างตัวอย่างสุ่ม
# Pattern: r<dist>(n, param1, param2, ...)
# d<dist>(x, ...) -> density/probability
# p<dist>(q, ...) -> cumulative probability
# q<dist>(p, ...) -> quantile
# Example with normal distribution:
rnorm(5, mean = 0, sd = 1) # 5 random draws
dnorm(0, mean = 0, sd = 1) # density at x=0
pnorm(1.96, mean = 0, sd = 1) # P(X <= 1.96)
qnorm(0.975, mean = 0, sd = 1) # z-score for 97.5%
cat('Four functions: r, d, p, q for each distribution')rnorm(): การแจกแจงปกติ
rnorm(n, mean, sd) สร้างตัวอย่าง n ค่า จาก N(mean, sd²) ค่าเริ่มต้นคือการแจกแจงปกติมาตรฐาน N(0,1) การแจกแจงปกติเป็นเครื่องมือหลักของสถิติ เพราะทฤษฎีบทขีดจำกัดส่วนกลางรับรองว่าการแจกแจงนี้พบได้อย่างแพร่หลาย
set.seed(42)
# Standard normal (mean=0, sd=1)
z_scores <- rnorm(1000)
mean(z_scores) # ~0
sd(z_scores) # ~1
# Custom normal (IQ scores: mean=100, sd=15)
set.seed(42)
iq_scores <- rnorm(100, mean = 100, sd = 15)
mean(iq_scores) # ~100
sd(iq_scores) # ~15
summary(iq_scores)
# About 68% within 1 sd
mean(abs(iq_scores - 100) < 15) # ~0.68runif(): การแจกแจงสม่ำเสมอ
runif(n, min, max) สร้างตัวอย่าง n ค่าที่มีการแจกแจงสม่ำเสมอระหว่าง min และ max ทุกค่าในช่วงมีโอกาสเกิดเท่ากัน ค่าเริ่มต้นคือ runif(n) ซึ่งให้ค่าจากช่วง [0, 1]
set.seed(7)
# Default: uniform on [0, 1]
u <- runif(5)
print(u) # values in (0, 1)
# Uniform on [a, b]
temps <- runif(100, min = -10, max = 40) # temperatures
mean(temps) # ~15 (midpoint)
range(temps) # should be within [-10, 40]
# Discrete simulation using floor()
dice_rolls <- floor(runif(10, min = 1, max = 7))
print(dice_rolls) # integers 1-6
table(floor(runif(600, 1, 7))) # roughly equal countsrbinom(): การแจกแจงทวินาม
rbinom(n, size, prob) จำลองการทดลองทวินาม n ครั้ง โดยแต่ละครั้งประกอบด้วยการทดลองแบบเบอร์นูลลี size ครั้ง และมีความน่าจะเป็นสำเร็จเท่ากับ prob ใช้ size=1 สำหรับการสุ่มแบบเบอร์นูลลี
set.seed(123)
# 10 coin flips (prob=0.5), repeated 5 times
coin_flips <- rbinom(5, size = 10, prob = 0.5)
print(coin_flips) # number of heads each time
# Bernoulli: single flip (size=1)
flips <- rbinom(20, size = 1, prob = 0.5)
print(flips) # 0s and 1s
mean(flips) # ~0.5
# Biased coin (prob=0.7)
biased <- rbinom(1000, size = 1, prob = 0.7)
mean(biased) # ~0.7
# Many trials: normal approximation kicks in
hundred_flips <- rbinom(1000, size = 100, prob = 0.5)
mean(hundred_flips) # ~50rpois(): การแจกแจงปัวซง
rpois(n, lambda) สร้างตัวอย่าง n ค่าจากการแจกแจงปัวซงที่มีอัตรา λ ใช้จำลองข้อมูลจำนวนนับหรือจำนวนเหตุการณ์ต่อช่วงเวลา เช่น จำนวนผู้เข้าชมเว็บไซต์ต่อนาที จำนวนข้อบกพร่องต่อหน่วย หรือจำนวนสายต่อชั่วโมง
set.seed(5)
# Calls received per hour (average 3)
calls <- rpois(24, lambda = 3) # 24 hours
print(calls) # integers, mostly 1-6
mean(calls) # ~3 (expectation = lambda)
var(calls) # ~3 (variance = lambda for Poisson)
# Count the distribution
table(calls)
# Rare events (lambda=0.5)
rare_events <- rpois(100, lambda = 0.5)
table(rare_events) # mostly 0s and 1s
mean(rare_events) # ~0.5rexp(): การแจกแจงเอ็กซ์โพเนนเชียล
rexp(n, rate) สร้างตัวอย่าง n ค่าจากการแจกแจงเอ็กซ์โพเนนเชียลด้วยอัตราที่ระบุ ใช้จำลองเวลาระหว่างเหตุการณ์หรือเวลาระหว่างการมาถึง ค่าเฉลี่ย = 1/rate และมีสมบัติไร้ความจำ
set.seed(42)
# Time between customer arrivals (rate=2 per minute)
# Mean wait time = 1/2 = 0.5 minutes
arrival_times <- rexp(100, rate = 2)
mean(arrival_times) # ~0.5
sd(arrival_times) # ~0.5 (mean = sd for exponential)
# Simulate a queue
cumulative_arrivals <- cumsum(rexp(10, rate = 3))
print(round(cumulative_arrivals, 3))
# Exponential CDF: P(X <= x) = 1 - exp(-rate*x)
pexp(0.5, rate = 2) # P(wait <= 0.5 min)
mean(arrival_times <= 0.5) # empirical estimatesample(): การสุ่มตัวอย่างแบบไม่ต่อเนื่อง
sample(x, size, replace) สุ่มสมาชิกจำนวน size ตัวจากเวกเตอร์ x replace=FALSE (ค่าเริ่มต้น) คือการสุ่มโดยไม่คืนกลับ ส่วน replace=TRUE อนุญาตให้ค่าซ้ำกันได้
set.seed(10)
# Sample without replacement (like drawing cards)
cards <- 1:52
hand <- sample(cards, size = 5, replace = FALSE)
print(hand) # 5 unique cards
# Sample with replacement (bootstrap)
x <- c(10, 20, 30, 40, 50)
bootstrap_sample <- sample(x, size = 5, replace = TRUE)
print(bootstrap_sample) # may have repeats
# Simulate rolling two dice 1000 times
dice <- function() sum(sample(1:6, 2, replace = TRUE))
rolls <- replicate(1000, dice())
table(rolls) / 1000 # empirical probabilitiesการสุ่มตัวอย่างแบบมีน้ำหนัก
sample(x, size, replace, prob) ใช้น้ำหนักความน่าจะเป็น เวกเตอร์ prob กำหนดความน่าจะเป็นสัมพัทธ์ให้สมาชิกแต่ละตัว เหมาะสำหรับการแจกแจงแบบไม่ต่อเนื่องที่ไม่สม่ำเสมอ
set.seed(99)
# Loaded die: 6 is twice as likely
faces <- 1:6
weights <- c(1, 1, 1, 1, 1, 2) # relative
norm_weights <- weights / sum(weights)
rolls <- sample(faces, size = 1000, replace = TRUE,
prob = norm_weights)
table(rolls) / 1000
# 6 appears ~2/7 ~= 0.286 of the time
# Categorical sampling
categories <- c('A', 'B', 'C')
probs <- c(0.5, 0.3, 0.2)
sample(categories, 10, replace = TRUE, prob = probs)rgeom() และ rnbinom(): การแจกแจงจำนวนนับ
rgeom(n, prob) นับจำนวนครั้งที่ล้มเหลวก่อนสำเร็จครั้งแรก rnbinom(n, size, prob) นับจำนวนครั้งที่ล้มเหลวก่อนสำเร็จครบ size ครั้ง ทั้งสองฟังก์ชันใช้จำลองข้อมูลจำนวนนับที่มีการกระจายเกิน ซึ่งมีความแปรปรวนมากกว่าการแจกแจงปัวซง
set.seed(42)
# Geometric: flips until first head (prob=0.3)
# Number of FAILURES before first success
flips_until_head <- rgeom(10, prob = 0.3) + 1 # +1 for the success
print(flips_until_head)
mean(flips_until_head) # ~1/0.3 = 3.33
# Negative binomial: overdispersed count data
# e.g., number of parasites per host
counts <- rnbinom(100, size = 2, prob = 0.4)
mean(counts) # ~3 (theoretical: size*(1-p)/p)
var(counts) # much larger than mean -> overdispersed
# Compare variance to Poisson with same mean
pois_counts <- rpois(100, lambda = mean(counts))
var(counts) / var(pois_counts) # > 1rt() และ rf(): การแจกแจง t และ F
rt(n, df) สร้างตัวอย่างที่มีการแจกแจง t โดยมีองศาอิสระ df เมื่อ df → ∞ การแจกแจงจะเข้าใกล้การแจกแจงปกติ ส่วน rf(n, df1, df2) สร้างตัวอย่างที่มีการแจกแจง F ซึ่งเป็นอัตราส่วนของตัวแปรไคสแควร์
set.seed(1)
# t distribution: heavier tails than normal
t_vals <- rt(1000, df = 5)
mean(t_vals) # ~0
sd(t_vals) # > 1 (inflated by heavy tails)
# Compare to normal
n_vals <- rnorm(1000)
# t has more extreme values (heavy tails)
sum(abs(t_vals) > 3) # e.g., ~30
sum(abs(n_vals) > 3) # e.g., ~3
# F distribution: used in ANOVA F-tests
f_vals <- rf(1000, df1 = 5, df2 = 20)
range(f_vals) # always positive
mean(f_vals) # ~df2/(df2-2) = 20/18 = 1.11การแสดงภาพการแจกแจงแบบสุ่ม
ฮิสโตแกรมและกราฟความหนาแน่นใช้แสดงรูปร่างของการแจกแจงที่จำลองขึ้น เปรียบเทียบความหนาแน่นเชิงประจักษ์กับเส้นโค้งความหนาแน่นตามทฤษฎีได้โดยใช้ hist() ร่วมกับการซ้อนเส้น curve(dnorm(...))
set.seed(42)
x <- rnorm(10000, mean = 5, sd = 2)
# Quick summary statistics
summary(x)
cat('Mean:', mean(x), '\n')
cat('SD:', sd(x), '\n')
cat('Skewness (should be ~0 for normal):',
mean(((x - mean(x))/sd(x))^3), '\n')
# Empirical quantiles vs theoretical
quantile(x, c(0.025, 0.25, 0.5, 0.75, 0.975))
# Compare to theoretical:
qnorm(c(0.025, 0.25, 0.5, 0.75, 0.975),
mean = 5, sd = 2)ตรวจสอบอย่างรวดเร็ว
ทดสอบความรู้ของคุณเกี่ยวกับฟังก์ชันการแจกแจงแบบสุ่มของ R
สรุป: การแจกแจงแบบสุ่ม
ประเด็นสำคัญ: ใช้ rnorm(n, mean, sd) สำหรับการแจกแจงปกติ, runif(n, min, max) สำหรับการแจกแจงสม่ำเสมอ, rbinom(n, size, prob) สำหรับการแจกแจงทวินาม, rpois(n, lambda) สำหรับจำนวนนับแบบปัวซง, rexp(n, rate) สำหรับเวลารอแบบเอ็กซ์โพเนนเชียล และ sample(x, size, replace) สำหรับการสุ่มตัวอย่างแบบไม่ต่อเนื่อง ในการวิเคราะห์ที่ทำซ้ำได้ ควรใช้ set.seed() ก่อนสร้างจำนวนสุ่มเสมอ
set.seed(42)
# Quick reference of common distributions:
rnorm(3, mean = 0, sd = 1) # Normal
runif(3, min = 0, max = 1) # Uniform
rbinom(3, size = 10, prob = 0.5) # Binomial
rpois(3, lambda = 3) # Poisson
rexp(3, rate = 1) # Exponential
rt(3, df = 10) # Student t
rf(3, df1 = 5, df2 = 20) # F distribution
rgeom(3, prob = 0.3) # Geometric
sample(1:10, 3, replace = TRUE) # Discrete uniform
cat('R has 20+ built-in distributions')คำถามที่พบบ่อย
บทเรียน “การสร้างการแจกแจงแบบสุ่ม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างการแจกแจงแบบสุ่ม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างการแจกแจงแบบสุ่ม”
สุ่มตัวอย่างจากการแจกแจงแบบปกติ สม่ำเสมอ ทวินาม และปัวซง คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างการแจกแจงแบบสุ่ม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- set.seed() และการทำซ้ำผลลัพธ์ได้
- การสร้างการแจกแจงแบบสุ่ม
- พื้นฐานการจำลองแบบมอนติคาร์โล
- การสุ่มตัวอย่างแบบบูตสแตรปใน R