R: اختبار الفرضيات R
آخر تحديث: 2026-08-26
في الدرس السابق، تعرفنا على توزيعات الاحتمالات — من الناحية النظرية. في هذا الدرس، سنتعمق في اختبار الفرضيات — أي استخدام العينات لاستخلاص استنتاجات حول المجموع. هذا هو جوهر الإحصاء: هل الإعلان الذي يدعي «زيادة بنسبة 20% في المبيعات» صحيح أم مجرد دعاية؟ هل الفرق بين مجموعتين من البيانات ناتج عن الصدفة أم أنه أمر حتمي؟ يمكن لـ R الإجابة عن ذلك بأربع أسطر فقط من التعليمات البرمجية.
بعد الانتهاء من هذا الدرس، ستتمكن من استخدام لغة R لإجراء: اختبارات t (مقارنة المتوسطات)، واختبارات النسب (مقارنة معدلات النجاح)، واختبارات كاي-مربع (الاستقلالية)، وتحليل التباين (مقارنة مجموعات متعددة).
1. ما ستتعلمه
- عملية اختبار الفرضيات المكونة من 5 خطوات (الفرضية الصفرية/الفرضية البديلة/إحصائية الاختبار/قيمة p/القرار)
- t.test: عينة واحدة، عينتان، مقترنة
- prop.test: اختبار التناسب
- chisq.test: اختبار كاي-مربع (الاستقلالية/مدى ملاءمة النموذج)
- ANOVA (تحليل التباين)
- الاختبار غير البارامتري: wilcox.test
- تفسير قيم p والمزالق الشائعة
2. قصة عن اختبار A/B
(1) المشكلة: هل الإعلانات فعالة؟
أجرى بوب اختبارًا من النوع A/B:
- المجموعة أ (الإعلان القديم): 1,000 شخص، 80 عملية تحويل (8%)
- المجموعة ب (الإعلانات الجديدة): 1,000 شخص، 100 عملية تحويل (10%)
سأل المدير: "هل الفارق البالغ 2% حقيقي أم مجرد صدفة؟"
(2) الحل باستخدام لغة R
# Two-Proportion Test
prop.test(c(80, 100), c(1000, 1000))
# 2-sample test for equality of proportions
# X-squared = 2.46, df = 1, p-value = 0.117
# Conclusion: p > 0.05, Differences **Not significant** (It might be a coincidence.)
سطر واحد من التعليمات البرمجية → قيمة p → القرار.
3. العملية المكونة من 5 خطوات لاختبار الفرضيات
(1) عملية من 5 خطوات
graph TB
A[1. Propose a hypothesis] --> B[2. Calculate the statistic]
B --> C[3. Calculation p-value]
C --> D[4. Decision-making]
D --> E[5. Report]
A --> A1["H0 Null Hypothesis<br/>H1 Alternative Hypothesis"]
B --> B1["t/z/Chi-square/F"]
C --> C1["P Data Visualization H0 An equally extreme probability"]
D --> D1["p < 0.05 → Reject H0"]
E --> E1["Report p-value + Effect size + Confidence Interval"]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
(2) المفاهيم الأساسية
| المفهوم | المعنى |
|---|---|
| H0 (الفرضية الصفرية) | الافتراض الافتراضي: المجموعتان لا يمكن التمييز بينهما (الفرق = محض صدفة) |
| H1 (الفرضية البديلة) | ما نريد إثباته حقًّا: أن المجموعتين تختلفان |
| الإحصاء | رقم يقيس «مدى كبر الفرق» (t، z، χ²، F) |
| قيمة p | احتمال ملاحظة النتيجة الحالية أو نتيجة أكثر تطرفًا بافتراض صحة الفرضية الصفرية H0 |
| α (مستوى الدلالة الإحصائية) | عتبة قيمة p؛ وعادةً ما تكون 0.05 |
| رفض الفرضية الصفرية H0 | p < 0.05، الفرق ذو دلالة إحصائية |
| لا يتم رفض الفرضية الصفرية H0 | p ≥ 0.05؛ لا يمكن استنتاج وجود فرق (≠ لا يوجد فرق) |
4. t.test(): مقارنة المتوسطات
(1) ثلاثة أنواع من اختبارات t
| النوع | السيناريو | صيغة R |
|---|---|---|
| عينة واحدة | مجموعة واحدة مقابل قيمة معروفة | t.test(x, mu = 0) |
| عينتان مستقلتان | عينتان مستقلتان | t.test(x, y) |
| العينات المزدوجة | الاختبارات التمهيدية والنهائية لنفس المادة | t.test(x, y, paired = TRUE) |
(2) اختبار تي لعينة واحدة
# Example: Product Weight Standard 100g, test 10 products
weights <- c(98, 102, 99, 101, 100, 97, 103, 99, 101, 100)
t.test(weights, mu = 100)
# One Sample t-test
# t = 0, df = 9, p-value = 1
# 95% CI: [98.7, 101.3]
# mean of x = 100
# Conclusion: p = 1, **Don't reject H0**, the mean is equal to 100g
(3) اختبار t المستقل لعينتين
# Example: A/B Testing the conversion times for two groups
group_a <- c(12, 15, 14, 13, 16, 14, 15, 13, 14, 15)
group_b <- c(10, 11, 12, 13, 11, 10, 12, 11, 13, 12)
t.test(group_a, group_b)
# Welch Two Sample t-test
# t = 5.32, df = 14.6, p-value = 0.0001
# 95% CI: [1.36, 3.24]
# Conclusion: p < 0.05, **Reject H0**, Group A was significantly slower than Group B
(4) اختبار t المزدوج
# Example: Before medication vs after medication in the same group of patients
before <- c(180, 175, 190, 170, 185)
after <- c(165, 160, 175, 160, 170)
t.test(before, after, paired = TRUE)
# Paired t-test
# t = 8.5, df = 4, p-value = 0.001
# Conclusion: p < 0.05, **Significant decline** (The medication is effective)
(5) المعلمات الرئيسية
| المعلمة | المعنى | القيمة الافتراضية |
|---|---|---|
mu |
القيمة المعروفة لعينة واحدة | 0 |
paired |
هل تم إقرانه؟ | FALSE |
var.equal |
افتراض التماثل في التباين | FALSE (Welch) |
alternative |
اتجاه بديل | "two.sided" |
conf.level |
مستوى الثقة | 0.95 |
# One-sided test (right-tailed)
t.test(x, mu = 100, alternative = "greater")
# One-sided test (left-tailed)
t.test(x, mu = 100, alternative = "less")
5. prop.test(): اختبار التناسب
(1) اختبار النسبة الواحدة
# Example: Historical Product Pass Rate 95%, now 92 out of 100 are Qualified
prop.test(92, 100, p = 0.95)
# 1-sample proportions test
# X-squared = 1.27, df = 1, p-value = 0.26
# Conclusion: p > 0.05, Pass Rate **No significant decrease**
(2) اختبار النسبتين (جوهر اختبار A/B)
# Example: Group A 1000 people, 80 conversions; Group B 1000 people, 100 conversions
prop.test(c(80, 100), c(1000, 1000))
# 2-sample test for equality of proportions
# X-squared = 2.46, df = 1, p-value = 0.117
# 95% CI: [-0.046, 0.006]
# Conclusion: p > 0.05, **The difference is not significant** (It might be a coincidence.)
(3) اختبار النسبة مقابل اختبار كاي-مربع
prop.test(c(s1, s2), c(n1, n2))=chisq.test(matrix(c(s1, n1-s1, s2, n2-s2), 2))prop.testتمت إضافة تصحيح الاستمرارية (موصى به)
6. chisq.test(): اختبار كاي-مربع
(1) الاستخدامان الرئيسيان
| الغرض | السيناريو | الصيغة |
|---|---|---|
| مدى ملاءمة النموذج | القيم المرصودة مقابل القيم المتوقعة | chisq.test(observed) |
| الاستقلالية | هل هناك ارتباط بين المتغيرين التصنيفيين؟ | chisq.test(table(x, y)) |
(2) اختبار ملاءمة النموذج
# Example: Dice Fairness Test (toss 60 times)
observed <- c(8, 12, 10, 11, 9, 10) # Number of times each face appears
expected <- rep(10, 6) # Expect uniformity
chisq.test(observed, p = expected / sum(expected))
# Chi-squared test
# X-squared = 1.2, df = 5, p-value = 0.945
# Conclusion: p > 0.05, Dice **is fair** (Do not reject the uniformity assumption)
(3) اختبار الاستقلالية
# Example: Gender vs Purchasing Behavior
gender <- c("M", "M", "F", "F", "M", "F", "M", "F")
purchase <- c("Buy", "Not buying", "Buy", "Buy", "Not buying", "Buy", "Buy", "Not buying")
tab <- table(gender, purchase)
print(tab)
# Not buying Buy
# M 1 3
# F 1 3
chisq.test(tab)
# X-squared = 0, df = 1, p-value = 1
# Conclusion: p > 0.05, Gender and Purchasing **Independent**
# Note: Any 2x2 Table with Expected Frequencies < 5, use Fisher's Exact Test
fisher.test(tab)
(4) متطلبات التردد المتوقعة
# Chi-Square Test Requirements: Expected Frequency for Each Cell >= 5
# Use Fisher's Exact Test when not satisfied
result <- chisq.test(tab)
result$expected # View Expected Frequency
7. aov() تحليل التباين (ANOVA)
(1) الحالات التي ينطبق عليها ذلك
مقارنة المتوسطات لـ 3 مجموعات أو أكثر (يقتصر اختبار t على مجموعتين).
(2) التطبيق العملي
# Example: Effect of 3 Fertilizer Types on Crop Yields
fertilizer <- c(rep("A", 10), rep("B", 10), rep("C", 10))
yield <- c(20, 22, 21, 19, 23, 20, 21, 22, 19, 20, # A
25, 26, 24, 27, 25, 26, 27, 25, 24, 26, # B
18, 19, 17, 18, 19, 20, 19, 18, 19, 20) # C
df <- data.frame(fertilizer, yield)
# Single-factor ANOVA
model <- aov(yield ~ fertilizer, data = df)
summary(model)
# Df Sum Sq Mean Sq F value Pr(>F)
# fertilizer 2 220.0 110.0 91.7 <2e-16 ***
# Residuals 27 32.4 1.2
# Conclusion: p < 0.05, 3 Fertilizer Types **Significant difference**
# Post-hoc comparison: Tukey HSD
TukeyHSD(model)
# diff lwr upr p adj
# B-A 5.0 3.91 6.09 0.000
# C-A -1.5 -2.59 -0.41 0.005
# C-B -6.5 -7.59 -5.41 0.000
8. الاختبار غير البارامتري wilcox.test()
(1) متى ينبغي استخدامه؟
- البيانات غير طبيعية (لذلك لا يمكن استخدام اختبار t)
- حجم العينة الصغير (n < 30)
- توجد قيم متطرفة
- البيانات الترتيبية (مثل «ممتاز/جيد/متوسط/ضعيف»)
(2) التطبيق العملي
# Non-parametric paired test (Wilcoxon signed-rank)
before <- c(180, 175, 190, 170, 185)
after <- c(165, 160, 175, 160, 170)
wilcox.test(before, after, paired = TRUE)
# V = 15, p-value = 0.0625
# Conclusion: p > 0.05 (Not significant), however, the sample size is small
# Independent non-parametric (Mann-Whitney U)
group_a <- c(12, 15, 14, 13, 16)
group_b <- c(10, 11, 12, 13, 11)
wilcox.test(group_a, group_b)
# W = 25, p-value = 0.028
# Conclusion: p < 0.05, the difference is significant
9. تفسير قيم p والمزالق الشائعة
(1) الفهم الصحيح لقيم p
| الترجمة | الشرح |
|---|---|
| ✅ صحيح | احتمال ملاحظة النتيجة الحالية أو نتيجة أكثر تطرفًا عندما تكون الفرضية الصفرية (H0) صحيحة |
| ❌ خطأ | "احتمال صحة الفرضية الصفرية (H0)" |
| ❌ خطأ | "الفرق ناتج عن الصدفة" |
| ❌ خطأ | "شدة الفرق" |
(2) 5 أخطاء شائعة
graph TB
A[p Value Trap] --> B[p-hacking<br/>After trying it several times p<0.05]
A --> C[Large sample size p Bi Xiao<br/>Depends on the effect size]
A --> D[p<0.05 Does not mean it is useful<br/>Check effect size]
A --> E[Don't refuse ≠ Accept H0]
A --> F[Significance ≠ Practical Significance]
style A fill:#fff3cd
style B fill:#f8d7da
style C fill:#cce5ff
style D fill:#d4edda
style E fill:#e1d4ff
style F fill:#ffe1d4
(3) حجم التأثير
لا يكفي النظر إلى قيمة p وحدها؛ بل يجب النظر إلى حجم التأثير — أي مدى كبر الفرق:
| الاختبار | حجم التأثير |
|---|---|
| اختبار t | d كوهين = (m1 - m2) / s_pooled |
| ANOVA | η² (إيتا تربيع) |
| كاي-مربع | V كرامر |
| الارتباط | r (معامل الارتباط) |
# Cohen's d Calculation
cohens_d <- function(x, y) {
n1 <- length(x)
n2 <- length(y)
s_pooled <- sqrt(((n1-1)*var(x) + (n2-1)*var(y)) / (n1 + n2 - 2))
(mean(x) - mean(y)) / s_pooled
}
| د كوهين | المعنى |
|---|---|
| 0.2 | تأثير ضئيل |
| 0.5 | تأثير معتدل |
| 0.8 | تأثير كبير |
10. مثال كامل: اختبار A/B + المقارنة بين مجموعات متعددة
فيما يلي مثال على مسار عمل كامل يربط بين جميع مفاهيم اختبار الفرضيات التي تم تناولها في هذا الدرس.
▶ مثال: التقييم الشامل لأداء الحملة التسويقية
# ============================================
# Comprehensive Evaluation of Marketing Campaign Performance
# Features: t-test / Proportionality Test / ANOVA combined
# ============================================
set.seed(42)
# 1. A/B Test Conversion Time
group_a <- rnorm(50, mean = 15, sd = 3) # Original Page
group_b <- rnorm(50, mean = 13, sd = 3) # New Page
cat("=== A/B Test: Conversion Time ===\n")
cat("A Group Mean:", round(mean(group_a), 2), "s\n")
cat("B Group Mean:", round(mean(group_b), 2), "s\n")
cat("Differences:", round(mean(group_a) - mean(group_b), 2), "s\n\n")
# 2. t-test
t_result <- t.test(group_a, group_b)
print(t_result)
cat("\n")
# 3. Cohen's d
n1 <- length(group_a)
n2 <- length(group_b)
s_pooled <- sqrt(((n1-1)*var(group_a) + (n2-1)*var(group_b)) / (n1+n2-2))
cohens_d <- (mean(group_a) - mean(group_b)) / s_pooled
cat("Cohen's d (Effect size):", round(cohens_d, 3), "\n")
cat("Effect Size:", ifelse(abs(cohens_d) > 0.8, "L",
ifelse(abs(cohens_d) > 0.5, "Mid", "S")), "\n\n")
# 4. A/B Testing Conversion Rates
convert_a <- 80
convert_b <- 100
visitors_a <- 1000
visitors_b <- 1000
cat("=== A/B Test: Conversion Rate ===\n")
cat("A Group Conversion Rate:", round(convert_a / visitors_a * 100, 2), "%\n")
cat("B Group Conversion Rate:", round(convert_b / visitors_b * 100, 2), "%\n\n")
# 5. Proportionality Test
prop_result <- prop.test(c(convert_a, convert_b),
c(visitors_a, visitors_b))
print(prop_result)
cat("\n")
# 6. Comparison of 3 Marketing Strategies (ANOVA)
strategy <- c(rep("Email", 20), rep("Text Message", 20), rep("Push", 20))
sales <- c(rnorm(20, 100, 15),
rnorm(20, 110, 15),
rnorm(20, 105, 15))
df_strategy <- data.frame(strategy, sales)
cat("=== Comparison of 3 Sales Strategies (ANOVA) ===\n")
model <- aov(sales ~ strategy, data = df_strategy)
summary(model)
cat("\nPost-hoc comparison:\n")
print(TukeyHSD(model))
# 7. Gender and Purchasing Behavior (Chi-square)
gender <- sample(c("M", "F"), 200, replace = TRUE)
purchase <- sample(c("Buy", "Not buying"), 200, replace = TRUE,
prob = c(0.3, 0.7))
tab <- table(gender, purchase)
cat("\n=== Gender vs Purchase Chi-Square Test ===\n")
print(tab)
cat("\n")
chisq_result <- chisq.test(tab)
print(chisq_result)
# 8. Comprehensive Report
cat("\n=== Summary of Decisions ===\n")
cat("1. Conversion Time: Group A is", round(cohens_d, 2), "standard deviations slower than Group B",
ifelse(t_result$p.value < 0.05, " (Significant)", " (Not significant)"), "\n", sep = "")
cat("2. Conversion Rate: A vs B Difference",
ifelse(prop_result$p.value < 0.05, "Significant", "Not significant"), "\n")
cat("3. 3 Strategies:",
ifelse(summary(model)[[1]]$`Pr(>F)`[1] < 0.05, "Significant difference", "No difference"), "\n")
النتائج المتوقعة (مقتطف):
=== A/B Test: Conversion Time ===
A Group Mean: 14.87 s
B Group Mean: 12.94 s
Differences: 1.93 s
Welch Two Sample t-test
t = 3.18, df = 96.3, p-value = 0.002
Cohen's d (Effect size): 0.643
Effect Size: Mid
=== Summary of Decisions ===
1. Conversion Time: Group A is 0.64 standard deviations slower than Group B (Significant)
2. Conversion Rate: A vs B The difference is not significant
3. 3 Strategies: Significant difference
❓ أسئلة شائعة
📖 ملخص
- اختبار الفرضيات في 5 خطوات: H0/H1 → إحصائية الاختبار → قيمة p → القرار → إعداد التقرير
- اختبار t:
t.test(x, y)عينتان /paired = TRUEمقترنة /mu =عينة واحدة - الاختبار النسبي:
prop.test(c(s1, s2), c(n1, n2))يُستخدم في اختبار A/B - اختبار كاي-مربع:
chisq.test(table)الاستقلالية /chisq.test(observed)جودة الملاءمة - ANOVA:
aov(y ~ group)مقارنة المتوسطات بين مجموعات متعددة؛ يليهاTukeyHSD() - قيمة p ≠ مقدار التأثير — يجب استخدامها بالاقتران مع حجم التأثير (d كوهين / η²)
- 5 عيوب رئيسية: التلاعب بقيمة p، وحجم العينة الكبير الذي يؤدي إلى قيمة p صغيرة، وp < 0.05 ≠ ذات دلالة سريرية، وعدم الرفض ≠ القبول، والدلالة الإحصائية ≠ الدلالة العملية
- تُعد قيمة p < 0.05 عتبة الأهمية الإحصائية؛ أما الأهمية العملية فتعتمد على حجم التأثير والسياق التجاري
📝 تمارين
-
المسألة الأساسية: قم بمحاكاة درجات 30 طالبًا (المتوسط 80، الانحراف المعياري 10) وأجرِ اختبار t لعينة واحدة لتحديد ما إذا كان هناك انحراف ذو دلالة إحصائية عن 75 نقطة؛ ثم قم بمحاكاة درجات 30 طالبًا آخرين (المتوسط 78) وأجرِ اختبار t لعينتين. سجل قيم p.
-
المشكلة الأساسية: قم بمحاكاة اختبار A/B (المجموعة أ: 1,000 شخص، 50 عملية تحويل؛ المجموعة ب: 1,000 شخص، 80 عملية تحويل). استخدم
prop.testلاختبار ما إذا كان الفرق ذو دلالة إحصائية. احسب حجم التأثير «d» وفقًا لمعيار كوهين. -
تمرين أساسي: قم بإنشاء جدول ارتباط 3×3 (3 قنوات إعلانية × ما إذا حدثت نقرة أم لا)، واستخدم
chisq.testلاختبار ما إذا كانت القنوات والنقرات مستقلة عن بعضها. تحقق منresult$expected— هل جميع الترددات المتوقعة ≥ 5؟ -
تمرين متقدم: قم بمحاكاة درجات الاختبار لثلاث طرق تدريس (20 طالبًا في كل مجموعة)، وأجرِ تحليل التباين (ANOVA) باستخدام
aov، ثم استخدمTukeyHSDلتحديد المجموعتين اللتين تظهران أكبر فرق. -
التحدي: قم بإجراء اختبار A/B كامل — قم بمحاكاة وقت التحويل ومعدل التحويل لصفحتين (1,000 مستخدم لكل منهما). استخدم اختبار t واختبار النسبة (prop.test) ومؤشر Cohen’s d لإجراء تقييم شامل، واكتب تقريرًا بالقرارات (بما في ذلك قيمة p وحجم التأثير والتوصيات التجارية). التقط لقطة شاشة واحفظها.