R: توزيعات الاحتمالات في لغة R
آخر تحديث: 2026-08-26
في الدرس السابق، تعرفنا على «تحليل البيانات» — الإحصاء الوصفي. في هذا الدرس، سنتعرف على «تحليل العشوائية» — التوزيعات الاحتمالية. تستند جميع الاستدلالات الإحصائية في لغة R (اختبارات t، والانحدار، واختبار الفرضيات) إلى التوزيعات الاحتمالية. في هذا الدرس، سنتناول
d/p/q/rالمجموعات الأربع الرئيسية من الدوال في لغة R بالإضافة إلى أربعة توزيعات شائعة الاستخدام.
بعد الانتهاء من هذا الدرس، ستتمكن من استخدام لغة R لمحاكاة أي ظاهرة عشوائية، وإجراء حسابات الاحتمالات، وإرساء الأسس اللازمة لاختبار الفرضيات في المستقبل.
1. ما ستتعلمه
- العائلات الأربع الرئيسية لدوال توزيع الاحتمالات (d/p/q/r)
- التوزيع الطبيعي (الأكثر استخدامًا)
- التوزيع الثنائي (النجاح/الفشل)
- توزيع بواسون (عدد الأحداث)
- التوزيع التاي / التوزيع F / التوزيع كاي-مربع
- set.seed: بذرة عشوائية
- تجربة عملية: محاكاة فحص الجودة
2. قصة عن فحص الجودة
(1) المشكلة: ما هو معدل النجاح الطبيعي للمنتج؟
أليس هي مفتشة لمراقبة الجودة، وقد وجدت أن متوسط وزن المنتجات في خط إنتاج معين يبلغ 100 غرام، مع انحراف معياري قدره 2 غرام. سألها مديرها: «ما هي نسبة المنتجات التي يقل وزنها عن 95 غرامًا؟»
البحث عن جدول التوزيع الطبيعي في أحد الكتب؟ أم استخدام صيغة في إكسل؟ أم مجرد سطر واحد من كود لغة R—
(2) الحل باستخدام لغة R
# Weight < 95g the probability
pnorm(95, mean = 100, sd = 2)
# [1] 0.00621 ← 0.6%
# Extract 1000 Product Simulation Testing
set.seed(42)
samples <- rnorm(1000, mean = 100, sd = 2)
mean(samples < 95) # 0.6% ← Verification
سطران من التعليمات البرمجية → الإجابة + التحقق من خلال المحاكاة.
3. المجموعات الأربع الرئيسية لدوال توزيع الاحتمالات في لغة R
(1) مقارنة بين الوظائف الأربع الرئيسية
| بادئة الدالة | المعنى | الغرض |
|---|---|---|
d |
الكثافة | دالة كثافة الاحتمال (PDF) |
p |
الاحتمال | دالة التوزيع التراكمي (CDF) |
q |
الشريحة | الدالة العكسية (إيجاد شريحة معينة بناءً على احتمال معين) |
r |
عشوائي | إنشاء رقم عشوائي |
جميع التوزيعات لها هذه الوظائف الأربع: dnorm pnorm qnorm rnorm (العادية)؛ dbinom pbinom... (الثنائية)، وهكذا دواليك.
(2) العبارات المساعدة على الحفظ
graph LR
A[d Density] -->|Find the probability| B[p Cumulative]
B -->|Inverse Quantile| C[q quantile]
A -->|Simulation| D[r Random]
style A fill:#cce5ff
style B fill:#d4edda
style C fill:#f8d7da
style D fill:#fff3cd
(3) شرح مفصل للوظائف الأربع الرئيسية
# Take the normal distribution as an example (Mean 0, Standard Deviation 1)
dnorm(0) # 0.3989 ← Probability Density
pnorm(0) # 0.5 ← Cumulative Probability
qnorm(0.975) # 1.96 ← Given that 97.5% Find the percentile
rnorm(5) # 5 A random number
# Custom Parameters (Mean 100, Standard Deviation 2)
dnorm(95, 100, 2) # 95 Density at that point
pnorm(95, 100, 2) # 95 Left-sided cumulative probability
qnorm(0.975, 100, 2) # Given that 97.5% Find the percentile
rnorm(5, 100, 2) # 5 Per capita average 100 Random Number
4. التوزيع الطبيعي (الأكثر استخدامًا)
(1) ما هو التوزيع الطبيعي؟
graph TB
A[Normal Distribution N mu sigma] --> B[Bell-shaped symmetry]
A --> C[68-95-99.7 Principles]
A --> D[Central Limit Theorem]
A --> E[Widely found in nature/Social Phenomena]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
التوزيع الطبيعي = توزيع على شكل جرس، متماثل، وهو أكثر التوزيعات شيوعًا في الطبيعة.
(2) قاعدة 68-95-99.7
μ ± 1σ → 68.27% Data
μ ± 2σ → 95.45% Data
μ ± 3σ → 99.73% Data
(3) الدوال العادية القياسية الأربع
# Standard Normal N(0, 1)
dnorm(0) # 0.3989
pnorm(1.96) # 0.975 ← 1.96 On the left 97.5%
qnorm(0.975) # 1.96 ← 97.5% quantile = 1.96
rnorm(5) # 5 A standard normal random number
# General Normal N(μ, σ)
mu <- 100
sigma <- 2
# P(X < 95) = ?
pnorm(95, mean = mu, sd = sigma) # 0.00621
# P(95 < X < 105) = ?
pnorm(105, mu, sigma) - pnorm(95, mu, sigma) # 0.9876
# 99% Data Range
qnorm(0.005, mu, sigma) # The Lower World
qnorm(0.995, mu, sigma) # Upper Realm
(4) اختبار التوزيع الطبيعي
# 1. Visual: QQ plot
qqnorm(x)
qqline(x, col = "red")
# 2. Statistical Tests
shapiro.test(x) # Shapiro-Wilk (n < 5000)
# p < 0.05 Indicates non-normal distribution
5. التوزيع الثنائي (النجاح/الفشل)
(1) ما هو التوزيع الثنائي؟
توزيع عدد حالات النجاح في n تجارب برنولي مستقلة. احتمال النجاح في كل تجربة يساوي p، واحتمال الفشل يساوي 1-p.
Example: Toss 10 coins, number of times facing up X ~ Binomial(10, 0.5)
(2) الوظائف الثنائية الأربع الرئيسية
# Toss 10 coins, number of heads
dbinom(5, size = 10, prob = 0.5) # 0.246 <- P(5 heads)
pbinom(5, size = 10, prob = 0.5) # 0.623 <- P(<= 5 heads)
qbinom(0.5, size = 10, prob = 0.5) # 5 ← Median
rbinom(1000, size = 10, prob = 0.5) # 1000 sets of 10 trials, number of successes each
# Example: 100 shots, hit rate 80%, probability of at least 90 hits
1 - pbinom(89, size = 100, prob = 0.8)
# [1] 0.0227 ← 2.3%
(3) التصور الثنائي
n <- 10
p <- 0.5
x <- 0:n
# Probability Mass Function
plot(x, dbinom(x, n, p), type = "h",
main = paste0("Binomial(", n, ",", p, ")"),
xlab = "Number of Successes", ylab = "Probability",
col = "blue", lwd = 2)
points(x, dbinom(x, n, p), pch = 19, col = "red")
6. توزيع بواسون (عدد الأحداث)
(1) ما هو توزيع بواسون؟
توزيع عدد الأحداث التي تحدث خلال فترة زمنية أو مساحة محددة. ويُستخدم عادةً في:
- عدد العملاء الذين يصلون إلى المتجر خلال ساعة واحدة
- عدد حوادث المرور لكل كيلومتر من الطرق
- عدد المكالمات المستلمة في يوم واحد
المعامل λ = متوسط عدد الأحداث في الوحدة الزمنية.
(2) دوال بواسون الأربع
# Example: Average 10 customers per hour
dpois(8, lambda = 10) # P(X = 8) = 0.1126
ppois(8, lambda = 10) # P(X ≤ 8) = 0.3328
qpois(0.5, lambda = 10) # Median = 10
rpois(100, lambda = 10) # 100 Number of customers visiting the store per hour
# Example: 5 complaints per day, probability of more than 10
1 - ppois(10, lambda = 5) # 0.0137 ← 1.4%
(3) العلاقة بين توزيع بواسون والتوزيع الطبيعي
عندما تكون قيمة λ كبيرة، فإن توزيع بواسون يقارب التوزيع الطبيعي N(λ, √λ):
# λ = 100
lambda <- 100
# Poisson P(90 ≤ X ≤ 110)
ppois(110, lambda) - ppois(89, lambda) # ≈ 0.728
# Equivalent Normal Approximation
pnorm(110, 100, 10) - pnorm(90, 100, 10) # ≈ 0.683
# Approximate but not exactly equal
7. توزيع t / توزيع F / توزيع كاي-مربع
(1) مرجع سريع للتوزيعات الثلاثة الرئيسية لعينات التوزيع
| التوزيع | الغرض | دالة R |
|---|---|---|
| التوزيع t | استنتاج المتوسط في العينات الصغيرة | dt/pt/qt/rt |
| توزيع F | تحليل التباين (ANOVA) | df/pf/qf/rf |
| توزيع كاي-مربع | المتغيرات الفئوية، ملاءمة النموذج | dchisq/pchisq/qchisq/rchisq |
(2) شرح مفصل لتوزيع t
# Degrees of freedom df = 10
qt(0.975, df = 10) # 2.228 <- t threshold (larger than the normal distribution's 1.96)
pt(2.228, df = 10) # 0.975
# As df -> inf, t distribution -> standard normal
qt(0.975, df = 1000) # 1.962 ← Approach 1.96
qt(0.975, df = 10000) # 1.960
(3) توزيع كاي-مربع
# Degrees of freedom df = 5
dchisq(3, df = 5) # Density
pchisq(11.07, df = 5) # 0.95 <- Chi-square critical value (95%)
qchisq(0.95, df = 5) # 11.07
# Example: Observed 8 events, expected 5, p-value
1 - pchisq(8, df = 5) # 0.846
(4) التوزيع F
# Degrees of freedom df1 = 5, df2 = 10
qf(0.95, df1 = 5, df2 = 10) # 3.326 ← F Threshold
pf(3.326, df1 = 5, df2 = 10) # 0.95
8. set.seed: البذرة العشوائية
(1) لماذا نحتاج إلى البذور؟
«الأرقام العشوائية» في لغة R هي في الواقع أرقام شبه عشوائية — فبمجرد تحديد بذرة، يمكن إعادة إنتاج النتائج:
# No seeded players
rnorm(3) # The results are different every time
# Let $s$ be a seed
set.seed(42)
rnorm(3) # The First Time
set.seed(42)
rnorm(3) # Exactly the same
set.seed() في بحثك/تقريرك — لضمان إمكانية تكرار النتائج.
(2) التطبيقات العملية
# 1. Simulate Preset Seeds
set.seed(42)
sim_data <- rnorm(1000, 100, 15)
# 2. Set a seed before training the model
set.seed(123)
model <- lm(y ~ x, data)
# 3. Set a seed before cross-validation
set.seed(2024)
folds <- createFolds(data$y, k = 5)
9. أخذ العينات والمحاكاة
(1) sample() أخذ العينات
# 1. Simple Random Sampling
sample(1:100, 10) # Draw 10 from 1-100 (no duplicates)
sample(1:100, 10, replace = TRUE) # Sampling with replacement
# 2. Data Frame Sampling
sample_n(df, 10) # Draw 10 rows (old)
slice_sample(df, n = 10) # Draw 10 rows (dplyr 1.0+)
# 3. Stratified Sampling
df |>
group_by(class) |>
slice_sample(n = 5) # Draw one from each group 5 row
# 4. Set Up Probability Sampling
sample(c("A", "B", "C"), 100, replace = TRUE,
prob = c(0.5, 0.3, 0.2))
(2) محاكاة مونت كارلو
# Example: Estimate pi
set.seed(42)
n_sim <- 100000
x <- runif(n_sim, -1, 1)
y <- runif(n_sim, -1, 1)
inside <- sqrt(x^2 + y^2) <= 1
pi_est <- 4 * mean(inside)
# [1] 3.14116 ← Approach π = 3.14159
10. مثال كامل: محاكاة فحص الجودة
فيما يلي مثال على مسار عمل كامل يربط بين جميع مفاهيم التوزيع الاحتمالي التي تم تناولها في هذا الدرس.
▶ مثال: محاكاة عملية فحص الجودة على خط الإنتاج
# ============================================
# Production Line Quality Inspection Simulation
# Features: Comprehensive Application of 4 Distributions
# ============================================
set.seed(42)
# 1. Product Weight Inspection (Normal Distribution)
# Specifications: Mean 100g, Standard Deviation 2g
n_products <- 10000
weights <- rnorm(n_products, mean = 100, sd = 2)
cat("=== Weight Inspection (Normal Distribution N(100, 2)) ===\n")
cat("Sample size:", length(weights), "\n")
cat("Actual Mean:", round(mean(weights), 4), "\n")
cat("Actual standard deviation:", round(sd(weights), 4), "\n")
cat("Theory < 95g Ratio:", round(pnorm(95, 100, 2), 4), "\n")
cat("Actual < 95g Ratio:", round(mean(weights < 95), 4), "\n")
cat("Theory < 105g Ratio:", round(pnorm(105, 100, 2), 4), "\n")
cat("Actual < 105g Ratio:", round(mean(weights < 105), 4), "\n\n")
# 2. Inspection of Nonconforming Products (Binomial Distribution)
# Sample 100 items, probability of at least 95 passing
n_sample <- 100
p_pass <- 0.95
prob_at_least_95 <- 1 - pbinom(94, n_sample, p_pass)
cat("=== Random Sampling Inspection (Binomial(100, 0.95)) ===\n")
cat("P(95 Qualified) =", round(prob_at_least_95, 4), "\n\n")
# 3. Customers Visit the Store (Poisson Distribution)
# Average 10 customers per hour
n_hours <- 1000
customers <- rpois(n_hours, lambda = 10)
cat("=== Customers Visit the Store (Poisson(10)) ===\n")
cat("Theoretical mean: 10\n")
cat("Actual Mean:", round(mean(customers), 2), "\n")
cat("Theory P(>15):", round(1 - ppois(15, 10), 4), "\n")
cat("Actual P(>15):", round(mean(customers > 15), 4), "\n\n")
# 4. Sample Survey (t Distribution)
# Sample 30 products, estimate mean
sample_size <- 30
sample_data <- sample(weights, sample_size)
cat("=== Sample Survey (t Distribution) ===\n")
cat("Sample size:", sample_size, "\n")
cat("Sample mean:", round(mean(sample_data), 2), "\n")
cat("95% Confidence Interval: [\n")
ci <- t.test(sample_data)$conf.int
cat(" ", round(ci[1], 2), ",", round(ci[2], 2), "]\n\n")
# 5. Hypothesis Testing (use qnorm)
# I want to know if the weight deviates significantly 100g
z_score <- (mean(sample_data) - 100) / (sd(sample_data) / sqrt(sample_size))
p_value <- 2 * (1 - pnorm(abs(z_score)))
cat("=== Hypothesis Testing (Z Test) ===\n")
cat("Z score:", round(z_score, 4), "\n")
cat("P value:", round(p_value, 4), "\n")
cat("Conclusion:", ifelse(p_value < 0.05, "Significant deviation from 100g", "No significant difference"), "\n\n")
# 6. Outlier Detection (The Concept of the Chi-Square Distribution)
# Use 3-sigma principle
outliers <- weights[abs(weights - 100) > 3 * 2]
cat("=== Outlier Detection (3-sigma Principle) ===\n")
cat("Theoretical Anomaly Ratio:", round(2 * pnorm(-3), 6), "(i.e. 0.27%)\n")
cat("Actual Number of Exceptions:", length(outliers), "/", n_products, "\n")
cat("Actual Exception Rate:", round(length(outliers) / n_products, 6), "\n")
# 7. Sampling Design (Stratified Sampling)
cat("\n=== Stratified Sampling ===\n")
# Simulate 3 production lines (Different Pass Rates)
production <- tibble::tibble(
line = rep(c("Line A", "Line B", "Line C"), each = 1000),
weight = c(rnorm(1000, 100, 2),
rnorm(1000, 101, 2),
rnorm(1000, 99, 2))
)
# Draw 50 from each line
library(dplyr)
sampled <- production |>
group_by(line) |>
slice_sample(n = 50)
cat("Draw 50 per line, Estimated Overall Mean:\n")
cat("Overall Sample Mean:", round(mean(sampled$weight), 2), "\n")
cat("Total True Mean:", round(mean(production$weight), 2), "\n")
الناتج المتوقع (مقتطف):
=== Weight Inspection (Normal Distribution N(100, 2)) ===
Sample size: 10000
Actual Mean: 99.9898
Actual standard deviation: 1.9973
Theory < 95g Ratio: 0.0062
Actual < 95g Ratio: 0.0063
=== Random Sampling Inspection (Binomial(100, 0.95)) ===
P(95 Qualified) = 0.5647
❓ أسئلة شائعة
📖 ملخص
- توزيعات الاحتمالات في لغة R: 4 مجموعات رئيسية من الدوال:
dالكثافة /pالتراكمي /qالكوانتيل /rالعشوائي - التوزيع الطبيعي (الأكثر استخدامًا): على شكل جرس ومتماثل، قاعدة 68-95-99.7،
pnorm/qnorm/rnorm - التوزيع الثنائي: عدد المرات الناجحة في n تجارب مستقلة،
dbinom/pbinom/qbinom/rbinom - توزيع بواسون: عدد الأحداث في الوحدة الزمنية،
dpois/ppois/qpois/rpois - توزيع t: تقدير المتوسط في العينات الصغيرة (n < 30)؛ توزيع F: نسبة التباينات؛ توزيع كاي-مربع: البيانات التصنيفية
set.seed(42)جعل العشوائية قابلة للتكرار — عنصر لا غنى عنه في التقارير البحثية- أخذ العينات:
sample(x, n)بدون إعادة /replace = TRUEمع إعادة - محاكاة مونت كارلو = إنشاء عدد كبير من العينات باستخدام لغة R والإحصاء لتقدير الاحتمالات المعقدة
📝 تمارين
-
المسألة الأساسية: استخدم
pnormلحساب ما يلي بالنسبة لتوزيع N(100, 2): ① P(X < 95)، ② P(X > 105)، ③ P(95 < X < 105)، و④ فاصل الثقة بنسبة 99%. تحقق من صحة النتائج. -
المسألة الأساسية: استخدم
rbinom(1000, 10, 0.5)لمحاكاة 1,000 تجربة لـ «رمي عملة معدنية 10 مرات»، واحسب المتوسط والتباين والانحراف المعياري للعينة. قارن هذه القيم بالقيم النظرية (5، 2.5، 1.58). -
المسألة الأساسية: استخدم
rpois(1000, 5)لمحاكاة 1,000 حالة لـ «عدد المكالمات المستلمة خلال 5 دقائق»، وارسم رسمًا بيانيًّا تكراريًّا ودالة الكثافة الاحتمالية النظرية لتوزيع بواسون، وقارن بين التوزيعين. -
مشكلة متقدمة: قم بمحاكاة 10,000 قيمة لوزن المنتجات (موزعة توزيعًا عاديًّا N(100, 2))، واستخدم قاعدة 3σ لتحديد عدد القيم المتطرفة، وقارنها بالقيمة النظرية البالغة 0.27% للتحقق من صحة نظرية الحد المركزي (CLT).
-
التحدي: تقدير قيمة π باستخدام محاكاة مونت كارلو: ① قم برمي النرد 10,000 مرة؛ ② احسب نسبة المرات التي تقع فيها النرد داخل ربع دائرة؛ ③ قم بتقدير 4 × هذه النسبة = π؛ ④ قم بتغيير عدد مرات رمي النرد (100، 1,000، 10,000، 100,000) لملاحظة التغيرات في الدقة. التقط لقطات شاشة للنتائج الخاصة بمستويات الدقة الأربعة.