R: تقرير تحليل البيانات الشامل
آخر تحديث: 2026-08-26
هذا هو الدرس الأخير من سلسلة دروس R — وهو يجمع كل ما تعلمته في الدروس الـ29 السابقة لإنشاء مشروع متكامل من البداية إلى النهاية. بدءًا من قراءة البيانات وتنقيحها، مرورًا بإجراء التحليل الاستكشافي للبيانات (EDA)، وبناء النماذج، وتصور النتائج، وصولاً إلى إعداد التقارير، يحاكي هذا الدرس يومًا عاديًا في حياة محلل البيانات.
بعد الانتهاء من هذا الدرس، ستتمكن من إنجاز مشروع كامل لتحليل البيانات باستخدام لغة R بشكل مستقل — على المستوى المطلوب لتقديمه ضمن ملف إنجازاتك في مقابلة عمل في مجال علم البيانات.
1. ما ستتعلمه
- مشروع شامل من 6 مراحل (البيانات → التنقية → التحليل الاستكشافي للبيانات → النمذجة → التصور → إعداد التقارير)
- الاستخدام الشامل لـ: readr + tidyr + dplyr + ggplot2 + broom + rmarkdown
- يقوم R Markdown بإنشاء التقارير تلقائيًا
- استدامة saveRDS ونشر النماذج
- إنشاء تقارير بتنسيق PDF/HTML
- دليل عملي: تقرير شامل حول تحليل سلوك العملاء
2. يوم في حياة محلل البيانات
(1) المشكلة: يستغرق تحويل البيانات إلى تقرير 3 أيام
أليس هي محللة بيانات كُلفت بمهمة تحليل سلوك العملاء في عام 2024 وتقديم تقرير شامل إلى مديرها.
الطريقة التقليدية: استيراد بيانات Excel → تنقية البيانات → إنشاء جدول محوري في Excel → إنشاء مخطط بياني → نسخه إلى PowerPoint → كتابة التحليل → يطلب المدير الاطلاع عليه بعد أسبوع.
(2) الحل باستخدام لغة R
# 1. One line R Markdown Report
rmarkdown::render('customer_analysis.Rmd')
سطر واحد من التعليمات البرمجية → تقرير كامل بتنسيق HTML/PDF (بما في ذلك التعليمات البرمجية والنتائج والرسوم البيانية والتحليل).
3. المراحل الست لمشروع من البداية إلى النهاية
graph TB
A[1. Data Loading] --> B[2. Data Cleaning]
B --> C[3. EDA Explore]
C --> D[4. Descriptive Statistics]
D --> E[5. Modeling and Analysis]
E --> F[6. Visualization and Reporting]
A --> A1[readr/DBI]
B --> B1[tidyr/stringr]
C --> C1[skimr/GGally]
D --> D1[dplyr summary]
E --> E1[lm/glm]
F --> F1[ggplot2/Rmd]
style A fill:#fff3cd
style B fill:#cce5ff
style C fill:#d4edda
style D fill:#f8d7da
style E fill:#e1d4ff
style F fill:#ffe1d4
(1) الأهداف ذات المراحل الست
| المرحلة | الهدف | النتائج |
|---|---|---|
| 1. تحميل البيانات | قراءة البيانات | tibble |
| 2. تنقية البيانات | التعامل مع القيم المفقودة/القيم الشاذة/القيم المكررة | تنقية tibble |
| 3. EDA | استكشاف التوزيع/العلاقات | الرسوم البيانية + الإحصاءات |
| 4. الإحصاء الوصفي | المؤشرات الرئيسية | جدول ملخص |
| 5. النمذجة | الانحدار/التصنيف/التجميع | كائنات النموذج |
| 6. تقرير | توليف + تحليل | HTML/PDF |
4. تدريب عملي: مشروع تحليل سلوك العملاء من البداية إلى النهاية
(1) النص الكامل لبرنامج R
# ============================================
# Customer Behavior Analysis - End-to-End Projects
# Stage: 1. Data Loading -> 6. Report Output
# ============================================
library(readr)
library(dplyr)
library(tidyr)
library(stringr)
library(lubridate)
library(ggplot2)
library(broom)
library(skimr)
# ========== Stage 1: Data Loading ==========
cat('=== Stage 1: Data Loading ===\n')
set.seed(42)
n <- 2000
customers_raw <- tibble(
customer_id = 1:n,
age = round(rnorm(n, 35, 12)),
gender = sample(c('M', 'F'), n, replace = TRUE),
city = sample(c('Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou'), n, replace = TRUE),
register_date = sample(seq(as.Date('2023-01-01'),
as.Date('2024-06-30'), by = 'day'), n, replace = TRUE),
monthly_visits = round(rnorm(n, 10, 5)),
avg_order_value = round(rnorm(n, 200, 80)),
support_calls = sample(0:10, n, replace = TRUE),
plan = sample(c('Basics', 'Advanced', 'Company'), n, replace = TRUE,
prob = c(0.5, 0.3, 0.2))
) |>
mutate(
logit_p = -2 + 0.02 * age - 0.05 * monthly_visits + 0.2 * support_calls,
p = 1 / (1 + exp(-logit_p)),
churn = rbinom(n, 1, p)
) |>
select(-logit_p, -p) |>
mutate(
age = ifelse(row_number() %in% sample(n, 10), NA, age),
avg_order_value = ifelse(row_number() %in% sample(n, 5), -999, avg_order_value),
register_date = ifelse(row_number() %in% sample(n, 8), NA, register_date)
)
write_csv(customers_raw, 'customer_raw.csv')
cat('Loaded', nrow(customers_raw), 'Raw Data Row\n\n')
# ========== Stage 2: Data Cleaning ==========
cat('=== Stage 2: Data Cleaning ===\n')
customers <- customers_raw |>
janitor::clean_names() |>
distinct() |>
mutate(
age = ifelse(is.na(age) | age < 0 | age > 150,
median(age[age > 0 & age < 150], na.rm = TRUE), age),
avg_order_value = ifelse(avg_order_value < 0, NA, avg_order_value)
) |>
drop_na(register_date) |>
filter(monthly_visits >= 0, support_calls >= 0)
cat('After cleaning:', nrow(customers), 'rows\n')
cat(' - Duplicates:', nrow(customers_raw) - nrow(distinct(customers_raw)), 'removed\n')
cat(' - Age Missing/Exception: Processed\n')
cat(' - Abnormal Order Amount: Set to NA\n\n')
# ========== Stage 3: EDA Explore ==========
cat('=== Stage 3: EDA Explore ===\n')
cat('Data Dimensions:', nrow(customers), 'rows x', ncol(customers), 'cols\n')
cat('Churn rate:', round(mean(customers$churn) * 100, 2), '%\n')
churn_by_plan <- customers |>
group_by(plan) |>
summarise(
n = n(),
churn_rate = round(mean(churn) * 100, 2),
avg_age = round(mean(age), 1),
avg_visits = round(mean(monthly_visits), 1)
)
cat('\nChurn Rate by Plan Type:\n')
print(churn_by_plan)
p1 <- ggplot(customers, aes(x = monthly_visits, y = avg_order_value,
color = factor(churn))) +
geom_point(alpha = 0.5) +
geom_smooth(method = 'lm', se = FALSE) +
scale_color_brewer(palette = 'Set1', labels = c('Not lost', 'Loss')) +
labs(title = 'Number of visits vs Average Order Value',
x = 'Monthly Visits', y = 'Average Order Value', color = 'Status') +
theme_minimal()
cat('Generate 2 Key Charts\n\n')
# ========== Stage 4: Descriptive Statistics ==========
cat('=== Stage 4: Descriptive Statistics ===\n')
key_metrics <- customers |>
summarise(
Total Number of Customers = n(),
Number of Lost Customers = sum(churn),
Churn rate = round(mean(churn) * 100, 2),
Average Age = round(mean(age), 1),
Average Monthly Visits = round(mean(monthly_visits), 1),
Average Order Value = round(mean(avg_order_value, na.rm = TRUE), 2),
Average Number of Customer Service Inquiries = round(mean(support_calls), 1)
)
print(key_metrics)
by_city <- customers |>
group_by(city) |>
summarise(
Number of customers = n(),
Churn rate = round(mean(churn) * 100, 2),
Average Order = round(mean(avg_order_value, na.rm = TRUE), 2)
) |>
arrange(desc(Number of customers))
cat('\nBy City:\n')
print(by_city)
cat('\n')
# ========== Stage 5: Modeling and Analysis ==========
cat('=== Stage 5: Modeling and Analysis ===\n')
# 5.1 Logistic Regression: Churn Prediction
churn_model <- glm(churn ~ age + gender + plan + monthly_visits +
avg_order_value + support_calls,
data = customers, family = binomial)
cat('Logistic Regression Model:\n')
summary(churn_model)
cat('\nOdds Ratio Analysis:\n')
or_df <- tidy(churn_model, conf.int = TRUE, exponentiate = TRUE) |>
filter(term != '(Intercept)')
print(or_df |> select(term, estimate, std.error, p.value, conf.low, conf.high))
# 5.3 Linear Regression: Visits Forecast
visit_model <- lm(monthly_visits ~ age + plan + avg_order_value,
data = customers)
cat('\nVisits Forecast Model:\n')
summary(visit_model)
# 5.4 Model Evaluation
library(pROC)
customers$churn_prob <- predict(churn_model, type = 'response')
roc_obj <- roc(customers$churn, customers$churn_prob)
cat('\nChurn Model AUC:', round(auc(roc_obj), 3), '\n\n')
# ========== Stage 6: Visualization and Reporting ==========
cat('=== Stage 6: Visualization and Reporting ===\n')
p2 <- customers |>
group_by(plan, churn) |>
summarise(n = n(), .groups = 'drop') |>
ggplot(aes(x = plan, y = n, fill = factor(churn))) +
geom_col(position = 'fill') +
scale_y_continuous(labels = scales::percent) +
scale_fill_brewer(palette = 'Set1', labels = c('Not lost', 'Loss')) +
labs(title = 'Churn Rates by Plan Type', x = 'Plan', y = 'Ratio', fill = 'Status') +
theme_minimal()
p3 <- customers |>
group_by(plan) |>
summarise(
n = n(),
churn_rate = mean(churn)
) |>
ggplot(aes(x = plan, y = churn_rate, fill = plan)) +
geom_col() +
geom_text(aes(label = paste0(round(churn_rate * 100, 1), '%')),
vjust = -0.5) +
scale_y_continuous(labels = scales::percent,
expand = expansion(mult = c(0, 0.15))) +
labs(title = 'Churn Rates by Plan Type', x = 'Plan', y = 'Churn rate') +
theme_minimal() +
theme(legend.position = 'none')
p4 <- ggplot(customers, aes(x = plan, y = monthly_visits, fill = plan)) +
geom_boxplot() +
labs(title = 'Distribution of Monthly Visits by Plan', x = 'Plan', y = 'Monthly Visits') +
theme_minimal() +
theme(legend.position = 'none')
# 6.2 Save Chart
ggsave('chart_visits_vs_order.png', p1, width = 8, height = 6, dpi = 300)
ggsave('chart_churn_by_plan.png', p2, width = 8, height = 6, dpi = 300)
ggsave('chart_churn_rate.png', p3, width = 8, height = 6, dpi = 300)
ggsave('chart_visits_by_plan.png', p4, width = 8, height = 6, dpi = 300)
# 6.3 Save Model
saveRDS(churn_model, 'churn_model.rds')
saveRDS(visit_model, 'visit_model.rds')
# 6.4 Save the processed data
write_csv(customers, 'customer_clean.csv')
saveRDS(customers, 'customer_clean.rds')
# 6.5 Summary of Business Insights
cat('\n=== Summary of Business Insights ===\n')
cat('1. Overall attrition rate:', round(mean(customers$churn) * 100, 2), '%\n')
cat('2. Customers with >5 support calls churn rate:',
round(mean(customers$churn[customers$support_calls > 5]) * 100, 2), '%\n')
cat('3. Customers with <5 monthly visits churn rate:',
round(mean(customers$churn[customers$monthly_visits < 5]) * 100, 2), '%\n')
cat('4. The Basic Plan has the highest churn rate (',
round(mean(customers$churn[customers$plan == 'Basics']) * 100, 2), '%)\n')
cat('5. Older age and fewer visits -> higher probability of attrition\n')
cat('6. Suggestion: Add customers with >5 support calls to the high-risk list, proactively retain\n')
cat('\n=== All Done ===\n')
cat('Output Files:\n')
cat(' - customer_raw.csv (Raw Data)\n')
cat(' - customer_clean.csv / .rds (Data After Cleaning)\n')
cat(' - chart_*.png (4 charts)\n')
cat(' - churn_model.rds (Churn Prediction Model)\n')
cat(' - visit_model.rds (Visits Forecast Model)\n')
(2) نموذج تقرير R Markdown (نسخة مبسطة)
قم بإنشاء ملف customer_report.Rmd جديد يتضمن هيكل قالب Rmd الكامل (YAML + 6 أقسام + كتل كود R + نص توضيحي):
بيانات تعريف YAML (في بداية الملف): تحدد العنوان / المؤلف / تنسيق الإخراج (html_document + theme: flatly + toc: true).
6 فصول رئيسية:
- نظرة عامة على المشروع - مقدمة موجزة عن الخلفية + 3 أهداف تحليلية
- نظرة عامة على البيانات - تحميل البيانات التي تم تنقيحها + ملخص Skimr
- التحليل الاستكشافي - معدل توقف الاشتراك + التوزيع حسب الخطة + مخطط الانتشار
- النموذج الإحصائي - قم بتحميل ملف churn_model.rds المحفوظ وقم بتنظيمه لعرضه أو
- النتائج الرئيسية - قائمة نقطية، 3–5 بنود أو تفسير
- توصيات العمل - 3 توصيات قابلة للتنفيذ + قائمة بالملاحق
يتم فصل كل فصل بواسطة كتل من كود R (عناوين ```{r}) embedding analysis code, with ## 1. xxx / ## 2. xxx بين الأقسام.
(3) إنشاء تقرير
# Generate HTML Report
rmarkdown::render('customer_report.Rmd',
output_format = 'html_document',
output_file = 'customer_report.html')
# Generate PDF Report (LaTeX installation required)
rmarkdown::render('customer_report.Rmd',
output_format = 'pdf_document',
output_file = 'customer_report.pdf')
النتيجة المتوقعة:
- تقرير واحد بتنسيق HTML يتألف من 10 إلى 15 صفحة (يشمل الكود والنتائج والرسوم البيانية والتحليل)
- 4 رسوم بيانية بتنسيق PNG
- طرازات 2.rds
- ملف CSV واحد يحتوي على بيانات خالية من الأخطاء
5. مسار تعليمي شامل لدروس لغة R
(1) 5 مراحل
graph TB
A[Phase 1 Basics 10 lessons] --> B[Phase 2 Data 7 lessons]
B --> C[Phase 3 Visualization 5 lessons]
C --> D[Phase 4 Statistics 5 lessons]
D --> E[Phase 5 Practical Application 3 lessons]
E --> F[End Able to work independently on projects]
style A fill:#cce5ff
style B fill:#d4edda
style C fill:#f8d7da
style D fill:#e1d4ff
style E fill:#ffe1d4
style F fill:#fff3cd
(2) قائمة تضم 30 درسًا
| المرحلة | الفصل | الموضوع |
|---|---|---|
| 1 الأساسيات | 01-10 | مقدمة إلى لغة R / قواعد اللغة الأساسية / أنواع البيانات / المتجهات / العوامل الحسابية / تدفق التحكم / الدوال / المصفوفات / القوائم / إطارات البيانات |
| 2 بيانات | 11-17 | CSV / Excel / JSON / قاعدة البيانات / السلسلة / التعبيرات النمطية / إعادة الهيكلة |
| 3 التصور | 18–22 | أساسيات الرسم البياني / مقدمة إلى ggplot2 / المستوى المتقدم / السمات / الخرائط |
| 4 إحصاء | 23–27 | الإحصاء الوصفي / توزيعات الاحتمالات / اختبار الفرضيات / الانحدار الخطي / الانحدار اللوجستي |
| 5 تمارين عملية | 28–30 | التحليل التمهيدي للبيانات (EDA) / تنقية البيانات / التقرير الشامل |
6. اقتراحات لمزيد من الدراسة
(1) حزم R المتقدمة
| الحقيبة | الغرض |
|---|---|
| لامع | تطبيق ويب (لوحة تحكم تفاعلية) |
| سباك | واجهة برمجة التطبيقات REST (نشر التعلم الآلي) |
| tidymodels | التعلم الآلي الحديث (بديل caret) |
| torch | التعلم العميق |
| سهم | البيانات الضخمة (ملفات Parquet) |
(2) الموارد الأساسية
| المورد | الوصف |
|---|---|
| R لعلوم البيانات (الطبعة الثانية) | الكتاب الرسمي لـ هادلي، hadley/r4ds |
| R المتقدم (الطبعة الثانية) | البرمجة المتقدمة بلغة R |
| ggplot2: رسومات أنيقة | كتاب مبادئ ggplot2 |
| كتاب وصفات R Markdown | إنشاء التقارير |
| أوراق مرجعية لـ RStudio | بطاقات مرجعية سريعة |
(3) مشاريع واقعية
- Kaggle (kaggle.com) — مسابقات في مجال علم البيانات تستند إلى حالات واقعية
- TidyTuesday (tidytues.day) — مجموعات بيانات أسبوعية مجانية
- بياناتي الخاصة (العمل / الهوايات / الاستثمارات)
❓ أسئلة شائعة
.Rmd (بيانات تعريف YAML + نص Markdown + كتل كود R). rmarkdown::render() قم بإنشاء ملف HTML/PDF. استخدم زر "Knit" في RStudio لإنشاء تقرير بنقرة واحدة.📖 ملخص
- المراحل الست لمشروع متكامل: البيانات → التنقية → التحليل الاستكشافي للبيانات (EDA) → الوصف → النمذجة → إعداد التقارير
- R Markdown = أداة لإعداد التقارير تجمع بين التوثيق والكود والنتائج والرسوم البيانية
saveRDSيحفظ كائنًا واحدًا، وwrite_csvيحفظ جدولًا، وggsaveيحفظ مخططًا- مشروع RStudio + renv + Git = الثلاثي في علم البيانات
- تغطي الدروس الثلاثون 80% من الأعمال المتعلقة بتحليل البيانات باستخدام لغة R؛ أما الـ20% المتبقية فتتطلب استخدام امتدادات التعلم الآلي/التعلم العميق.
- التالي: tidymodels (التعلم الآلي) / Shiny (لوحات المعلومات) / plumber (واجهة برمجة التطبيقات) / tidytext (النص)
- المفهوم الأساسي: مسار العمل الشامل من البيانات إلى الرؤى = المهارات الأساسية لعالم البيانات
- اكتمل البرنامج التعليمي — يمكنك الآن إنجاز مشاريع تحليل البيانات في R بشكل مستقل
📝 تمارين
مهمة مشروع التخرج (مشروع تحليل بيانات متكامل من البداية إلى النهاية، المشروع النهائي للدرس 30 من دورة R التعليمية):
- اختيار البيانات: اختر مجموعة بيانات عامة واحدة (يُوصى بـ: Titanic / Iris / mtcars / mpg / nycflights13)
- العملية الكاملة:
- الخطوة 1: قراءة البيانات (باستخدام
readrأوdatasets) - المرحلة 2: التنقية (البيانات المفقودة/الشاذة/المكررة/الأخطاء المطبعية)
- المرحلة 3: EDA (ملخص + skimr + تصور بياني)
- المرحلة الرابعة: الإحصاء الوصفي (مجمَّع حسب المجموعة)
- الخطوة 5: النمذجة (lm أو glm)
- المرحلة 6: التقرير (R Markdown HTML)
- الخطوة 1: قراءة البيانات (باستخدام
- النتائج المتوقعة:
analysis.Rالنص الرئيسي (أكثر من 200 سطر)report.Rmdتقرير R Markdown- 5+ رسوم بيانية
-
- ملخص رؤى الأعمال (500 حرف)
- معايير التقييم:
- يعمل البرنامج (20 نقطة)
- العملية الكاملة (20 نقطة)
- عمق التحليل (20 نقطة)
- رسوم بيانية جذابة من الناحية الجمالية (20 نقطة)
- سهولة قراءة التقرير (20 نقطة) إنجاز مشروع التخرج = إنجاز البرنامج التعليمي الخاص بلغة R!
▶ مثال: ملخص الدرس 30
# ============================================
# R Tutorial 30 Lesson Study Summary Script
# After running, it outputs the topic for each lesson
# ============================================
lessons <- c(
"01 UnderstandingR", "02 Basic Grammar", "03 Data Types", "04 Vector",
"05 Operators", "06 Control Flow", "07 Function", "08 Matrices and Arrays",
"09 List", "10 Data Frames and Factors",
"11 CSV", "12 Excel", "13 JSON and XML", "14 Database",
"15 String", "16 Regular", "17 Data Reimagined",
"18 Basic Drawing", "19 ggplot2 Getting Started", "20 ggplot2 Advanced",
"21 Theme Customization", "22 Map",
"23 Descriptive Statistics", "24 Probability Distribution", "25 Hypothesis Testing",
"26 Linear Regression", "27 Logistic Regression",
"28 EDA", "29 Data Cleaning", "30 Comprehensive Report"
)
cat("R Tutorial 30 Course List:\n")
for (i in seq_along(lessons)) {
cat(sprintf("%2d. %s\n", i, lessons[i]))
}
النتيجة المتوقعة:
R Tutorial 30 Course List:
1. 01 UnderstandingR
2. 02 Basic Grammar
...
30. 30 Comprehensive Report
7. تهانينا على إتمام الدرس 30 من دليل R التعليمي
لقد أكملت الآن بشكل منهجي الدروس الثلاثين في دورة «علم البيانات باستخدام R» — بدءًا من قواعد الصياغة الأساسية وصولاً إلى المشاريع المتكاملة — وأصبحت جاهزًا للتعامل مع مهام تحليل البيانات الواقعية بنفسك. والخطوة التالية هي التدريب العملي — حيث ستبحث عن بيانات حقيقية، وتعمل على مشاريع حقيقية، وتبني محفظة أعمالك. نتمنى لك كل النجاح في أن تصبح عالم بيانات متميزًا!