مقدمة

علم البيانات هو مجال مثير يتيح لك تحويل البيانات الخام إلى فهم، ورؤى، ومعرفة. إن الهدف من كتاب «R لعلم البيانات» هو مساعدتك في تعلم أهم الأدوات في لغة R والتي ستمكنك من ممارسة علم البيانات بكفاءة وقابلية للتكرار، وأن تستمتع بوقتك أثناء ذلك 😃. بعد قراءتك لهذا الكتاب، ستكون لديك الأدوات اللازمة لمواجهة مجموعة واسعة ومتنوعة من تحديات علم البيانات باستخدام أفضل ما تقدمه لغة R.

ماذا ستتعلم

علم البيانات هو مجال شاسع للغاية، ولا توجد طريقة تمكنك من إتقانه بالكامل بمجرد قراءة كتاب واحد. يهدف هذا الكتاب إلى إعطائك أساساً متيناً في أهم الأدوات والمعرفة الكافية التي تمكنك من العثور على المصادر الإضافية للاستزادة والتعلم عند الحاجة. يبدو نموذجنا لخطوات مشروع علم البيانات النموذجي شبيهًا بما يوضحه الشكل 1.

مخطط يوضح دورة علم البيانات: الاستيراد -> الترتيب -> الفهم (والذي يتضمن مراحل: التحويل -> التصور -> النمذجة في دورة تكرارية) -> التواصل. ويحيط بكل هذه العمليات البرمجة.
الشكل 1: في نموذجنا لعملية علم البيانات، تبدأ باستيراد البيانات وترتيبها. بعد ذلك، تفهم بياناتك عبر دورة تكرارية من التحويل،والتصور والنمذجة. وتنهي العملية بالتواصل ومشاركة نتائجك مع الآخرين.

أولاً، يجب عليك استيراد بياناتك إلى بيئة R. يعني هذا عادةً أن تأخذ البيانات المخزنة في ملف، أو قاعدة بيانات، أو الواجهة البرمجية لتطبيقات الويب web application programming interface (API)، ثم تقوم بتحميلها في إطار بيانات (data frame) داخل R. إذا لم تتمكن من إدخال بياناتك إلى R، فلن تتمكن من إجراء علم البيانات عليها!

بمجرد استيراد بياناتك، من الجيد أن تقوم بـ تنسيقها أو ترتيبها. تنسيق البيانات يعني تخزينها في شكل متناسق يطابق المعاني والمفاهيم الكامنة في مجموعة البيانات مع طريقة تخزينها ماديّاً. باختصار، عندما تكون بياناتك منسقة، يمثل كل عمود متغيراً، ويمثل كل صف مشاهدة. البيانات المنسقة مهمة لأن البنية المتسقة تتيح لك تركيز جهودك على الإجابة عن الأسئلة المتعلقة بالبيانات، بدلاً من المعاناة لإدخال البيانات في الشكل المناسب للدوال المختلفة.

بمجرد الحصول على بيانات منسقة، فإن الخطوة التالية الشائعة هي تحويلها. يتضمن التحويل تضييق النطاق والتركيز على مشاهدات معينة تهمك (مثل جميع الأشخاص في مدينة واحدة، أو جميع البيانات من العام الماضي)، وإنشاء متغيرات جديدة تكون دوالاً لمتغيرات موجودة بالفعل (مثل حساب السرعة من المسافة والزمن)، وحساب مجموعة من الإحصاءات الملخصة (مثل التكرارات أو المتوسطات الحسابية). يُطلق على التنسيق والتحويل معاً مصطلح تطويع البيانات wrangling ؛ لأن تجهيز بياناتك لتصبح في شكل طبيعي ومريح للعمل غالباً ما يشبه المعركة!

بمجرد توفر بيانات منسقة تحتوي على المتغيرات التي تحتاجها، تبرز أداتان رئيسيتان لتوليد المعرفة: التمثيل البصري والنمذجة. لكل منهما نقاط قوة ونقاط ضعف يكمل بعضها بعضاً، لذا فإن أي تحليل بيانات حقيقي سيتنقل بينهما عدة مرات في دورة تكرارية.

إن التمثيل البصري هو نشاط بشري في جوهره. سيعرض لك التمثيل البصري الجيد أشياء لم تكن تتوقعها، أو يثير أسئلة جديدة حول البيانات. كما قد يشير التمثيل البصري الجيد أيضًا إلى أنك تطرح السؤال الخاطئ أو أنك بحاجة إلى جمع بيانات مختلفة. يمكن للتمثيلات البصرية أن تفاجئك، ولكنها لا تتوسع في الحجم بشكل تلقائي لأنها تتطلب دائمًا وجود عنصر بشري لتفسيرها.

تُعد النماذج أدوات مكملة للتمثيل البصري. بمجرد صياغة أسئلتك بدقة كافية، يمكنك استخدام نموذج للإجابة عنها. النماذج هي في الأساس أدوات رياضية أو حوسبية، لذا فهي تتوسع في الحجم بشكل ممتاز عمومًا. وحتى عندما لا تفعل ذلك، فعادةً ما يكون شراء المزيد من أجهزة الكمبيوتر أرخص من توظيف عقول إضافية! ولكن كل نموذج يرتكز على افتراضات معينة، وبسبب طبيعته ذاتها، لا يمكن للنموذج التشكيك في افتراضاته الخاصة. وهذا يعني أن النموذج لا يمكنه مفاجأتك في جوهر الأمر.

الخطوة الأخيرة في علم البيانات هي التواصل، وهي جزء بالغ الأهمية في أي مشروع لتحليل البيانات. لا يهم مدى جودة نماذجك وتمثيلاتك البصرية في فهم البيانات ما لم تكن قادراً أيضاً على إيصال ومشاركة نتائجك مع الآخرين.

ويحيط بجميع هذه الأدوات عملية البرمجة. البرمجة هي أداة متقاطعة تستخدمها في كل جزء تقريباً من مشروع علم البيانات. لا تحتاج إلى أن تكون مبرمجاً خبيراً لتكون عالم بيانات ناجحاً، ولكن تعلم المزيد عن البرمجة يؤتي ثماره دائماً؛ لأن كونك مبرمجًا جيداً يتيح لك أتمتة المهام الشائعة وحل المشكلات الجديدة بسهولة أكبر.

ستستخدم هذه الأدوات في كل مشروع لعلم البيانات، لكنها قد لا تكون كافية لبعض المشاريع. تنطبق هنا قاعدة تقريبية (80/20): يمكنك معالجة حوالي 80% من كل مشروع باستخدام الأدوات التي ستتعلمها في هذا الكتاب، لكنك ستحتاج إلى أدوات أخرى للتعامل مع الـ 20% المتبقية. سنرشدك طوال هذا الكتاب إلى المصادر والمراجع التي يمكنك من خلالها معرفة المزيد.

كيف تم تنظيم هذا الكتاب

إن الوصف السابق لأدوات علم البيانات منظم تقريباً وفقاً للترتيب الذي تستخدمه به في التحليل العملي (على الرغم من أنك بالطبع ستمر عبرها بشكل تكراري لعدة مرات). ومع ذلك، فإن تجربتنا تشير إلى أن تعلم استيراد البيانات وتنسيقها أولاً هو أمر غير مثالي؛ لأنه في 80% من الأوقات يكون روتينياً ومملاً، وفي الـ 20% المتبقية يكون غريباً ومحبطاً. هذه بداية سيئة لتعلم موضوع جديد تماماً! بدلاً من ذلك، سنبدأ بالتمثيل البصري وتحويل البيانات التي تم استيرادها وتنسيقها بالفعل مسبقاً. بهذه الطريقة، عندما تبدأ في استيراد وتنسيق بياناتك الخاصة، ستظل دافعيتك وحماسك مرتفعين لأنك تدرك تماماً أن العناء يستحق الجهد المبذول.

نحاول في كل فصل الالتزام بنمط ثابت: البدء ببعض الأمثلة التحفيزية لتتمكن من رؤية الصورة الكبيرة، ثم الغوص في التفاصيل الدقيقة. يقترن كل قسم من أقسام الكتاب بتمارين وتدريبات لمساعدتك على ممارسة وتطبيق ما تعلمته. ورغم أنه قد يكون من المغري تخطي التمارين، إلا أنه لا توجد طريقة أفضل للتعلم من التدريب على حل المشكلات الحقيقية.

ما لن تتعلمه في هذا الكتاب

هناك العديد من الموضوعات المهمة التي لا يغطيها هذا الكتاب. نحن نؤمن بأهمية التركيز الشديد والدقيق على الأساسيات لتمكينك من البدء والعمل بأسرع وقت ممكن. وهذا يعني أن هذا الكتاب لا يمكنه تغطية كل موضوع مهم.

النمذجة (Modeling)

تُعد النمذجة الإحصائية بالغة الأهمية لعلم البيانات، ولكنها موضوع ضخم للغاية، وللأسف لا نملك المساحة الكافية لإعطائها التغطية التي تستحقها هنا. لمعرفة المزيد حول النمذجة، نوصي بشدة بقراءة كتاب Tidy Modeling with R من تأليف زملائنا ماكس كون (Max Kuhn) وجوليا سيلج (Julia Silge). سيعلمك هذا الكتاب مجموعة حزم tidymodels، والتي تشترك —كما قد تخمن من اسمها— في العديد من القواعد والاصطلاحات المتبعة مع حزم tidyverse التي نستخدمها في هذا الكتاب.

البيانات الضخمة (Big data)

يركز هذا الكتاب بفخر وبشكل أساسي على مجموعات البيانات الصغيرة المخزنة في الذاكرة (in-memory). وهذا هو المكان الصحيح للبدء، لأنه لا يمكنك التعامل مع البيانات الضخمة ما لم تكن لديك خبرة كافية في التعامل مع البيانات الصغيرة. يمكن للأدوات التي ستتعلمها طوال معظم هذا الكتاب معالجة مئات الميجابايت من البيانات بسهولة، ومع قليل من العناية والحرص، يمكنك استخدامها عادةً للعمل مع بضعة جيجابايت من البيانات. سنوضح لك أيضاً كيفية استخراج البيانات من قواعد البيانات وملفات parquet، وكلاهما يُسخدم بشكل شائع لتخزين البيانات الضخمة. لن تحتاج بالضرورة للعمل مع مجموعة البيانات بأكملها، وهذا لا يمثل مشكلة لأنك تحتاج فقط إلى جزء أو عينة فرعية للإجابة عن السؤال الذي يثير اهتمامك.

إذا كنت تعمل بانتظام مع بيانات أكبر حجماً (من 10 إلى 100 جيجابايت مثلاً)، فنحن نوصي بتعلم المزيد حول حزمة data.table. نحن لا نقوم بتدريسها هنا لأنها تستخدم واجهة برمجية مختلفة عن tidyverse وتتطلب منك تعلم قواعد واصطلاحات مختلفة. ومع ذلك، فهي سريعة للغاية، والاستفادة من أدائها العالي تستحق استثمار بعض الوقت في تعلمها إذا كنت تتعامل مع بيانات ضخمة.

لغات بايثون وجوليا وأقرانهما (Python, Julia, and friends)

لن تتعلم في هذا الكتاب أي شيء عن بايثون أو جوليا أو أي لغة برمجية أخرى مفيدة لعلم البيانات. ليس هذا لأننا نرى أن هذه الأدوات سيئة، فهي ليست كذلك على الإطلاق! وفي التطبيق العملي، تستخدم معظم فرق علم البيانات مزيجاً من اللغات، وغالباً ما تتضمن لغتي R وبايثون على الأقل. لكننا نؤمن بشدة أنه من الأفضل إتقان أداة واحدة في كل مرة، وتعد لغة R مكاناً رائعاً للبدء.

المتطلبات المسبقة

لقد وضعنا بعض الافتراضات حول ما تعرفه بالفعل لتحقيق أقصى استفادة من هذا الكتاب. يجب أن تكون ملمّاً بالمبادئ الرياضية والعددية العامة، ومن المفيد أن تكون لديك بالفعل بعض الخبرة البرمجية الأساسية. إذا لم تكن قد قمت بالبرمجة من قبل، فقد تجد كتاب Hands on Programming with R من تأليف غاريت (Garrett) رافداً ومساعداً قيماً للغاية لهذا الكتاب.

تحتاج إلى أربعة أشياء لتشغيل الأكواد في هذا الكتاب: لغة R، وبرنامج RStudio، ومجموعة من حزم R تسمى tidyverse، وبعض الحزم المتنوعة الأخرى. تُعد الحزم (packages) الوحدات الأساسية لأكواد R القابلة للتكرار؛ حيث تشتمل على دوال قابلة لإعادة الاستخدام، ووثائق تشرح كيفية استخدامها، وبيانات توضيحية.

لغة R

لتنزيل لغة R، انتقل إلى شبكة أرشيف R الشاملة (CRAN - comprehensive R archive network) عبر الرابط https://cloud.r-project.org. يصدر إصدار رئيسي جديد من لغة R مرة واحدة في السنة، وهناك إصداران أو ثلاثة إصدارات فرعية كل عام. من الأفكار الجيدة تحديث البرنامج بانتظام. قد تكون الترقية مزعجة بعض الشيء، خاصة بالنسبة للإصدارات الرئيسية التي تتطلب منك إعادة تثبيت جميع الحزم الخاصة بك، ولكن تأجيل الترقية يجعل الأمر أكثر صعوبة لاحقاً. نوصي باستخدام إصدار R 4.2.0 أو إصدار أحدث للعمل مع هذا الكتاب.

برنامج RStudio

برنامج RStudio هو بيئة تطوير متكاملة، أو IDE، لبرمجة R، ويمكنك تنزيله من الرابط https://posit.co/download/rstudio-desktop/. يتم تحديث RStudio عدة مرات في السنة، وسيقوم تلقائياً بإعلامك عند توفر إصدار جديد، لذلك لا داعي للتحقق يدوياً بانتظام. ومن الجيد الترقية باستمرار للاستفادة من أحدث وأفضل الميزات المضافة. بالنسبة لهذا الكتاب، تأكد من توفر إصدار RStudio 2022.02.0 أو أحدث لديك.

عند تشغيل برنامج RStudio، كما يظهر في الشكل 2، سترى منطقتين رئيسيتين في الواجهة: لوحة وحدة التحكم (console pane) ولوحة المخرجات (output pane). في الوقت الحالي، كل ما تحتاج إلى معرفته هو أنك تكتب كود R في لوحة وحدة التحكم وتضغط على مفتاح الإدخال (Enter) لتشغيله. ستتعلم المزيد من التفاصيل مع تقدمنا في فصول الكتاب!1

واجهة برنامج RStudio مع تحديد وتظليل لوحتي Console و Output.
الشكل 2: تتكون بيئة تطوير RStudio IDE من منطقتين رئيسيتين: تكتب أكواد R في لوحة وحدة التحكم (console) على اليسار، وتبحث عن الرسوم البيانية والمخططات في لوحة المخرجات (output) على اليمين.

مجموعة حزم Tidyverse

ستحتاج أيضاً إلى تثبيت بعض حزم R. إن الحزمة (package) في لغة R هي عبارة عن مجموعة من الدوال، والبيانات، والوثائق التوضيحية التي تُوسّع قدرات وميزات لغة R الأساسية (base R). يُعد استخدام الحزم أمراً أساسياً للاستخدام الناجح للغة R. غالبية الحزم التي ستتعلمها في هذا الكتاب هي جزء مما يُسمى بمجموعة tidyverse. تشترك جميع الحزم في tidyverse في فلسفة مشتركة حول البيانات وبرمجة R، وهي مصممة للعمل معاً بسلاسة وتناغم تام.

يمكنك تثبيت حزم tidyverse بأكملها باستخدام سطر برمجي واحد فقط:

install.packages("tidyverse")

على جهاز الكمبيوتر الخاص بك، اكتب هذا السطر البرمجي في لوحة وحدة التحكم (console)، ثم اضغط على مفتاح الإدخال (enter) لتشغيله. ستقوم لغة R بتنزيل الحزم من شبكة CRAN وتثبيتها على جهازك.

لن تتمكن من استخدام الدوال، أو الكائنات (objects)، أو ملفات المساعدة الموجودة في أي حزمة حتى تقوم بتحميلها باستخدام الدالة library(). بمجرد تثبيتك للحزمة، يمكنك تحميلها باستخدام الدالة library():

library(tidyverse)
#> ── Attaching core tidyverse packages ───────────────────── tidyverse 2.0.0 ──
#> ✔ dplyr     1.2.1     ✔ readr     2.2.0
#> ✔ forcats   1.0.1     ✔ stringr   1.6.0
#> ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
#> ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
#> ✔ purrr     1.2.2     
#> ── Conflicts ─────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
#> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

يُخبرك هذا أن مجموعة tidyverse تقوم بتحميل تسعة حزم، وهي: dplyr، وforcats، وggplot2، وlubridate، وpurrr، وreadr، وstringr، وtibble، وtidyr. تُعتبر هذه الحزم هي القلب النابض (core) لمجموعة tidyverse لأنك ستستخدمها في كل عملية تحليل بيانات تقريباً.

تتغير الحزم في tidyverse وتتحدث بشكل متكرر إلى حد ما. يمكنك التحقق مما إذا كانت هناك تحديثات متاحة عن طريق تشغيل الدالة tidyverse_update().

حزم أخرى

هناك العديد من الحزم الممتازة الأخرى التي ليست جزءاً من مجموعة tidyverse لأنها تحل مشكلات في مجالات مختلفة، أو صُممت بمجموعة مختلفة من المبادئ الأساسية. هذا لا يجعلها أفضل أو أسوأ؛ بل يجعلها مختلفة فحسب. بعبارة أخرى، المكمّل لمجموعة tidyverse ليس بيئة فوضوية (messyverse)، بل هي عوالم أخرى عديدة من الحزم المترابطة. بينما تخوض في المزيد من مشاريع علم البيانات باستخدام لغة R، ستتعلم حزماً جديدة وطرقاً جديدة للتفكير في البيانات.

سنستخدم في هذا الكتاب العديد من الحزم من خارج مجموعة tidyverse. على سبيل المثال، سنستخدم الحزم التالية لأنها توفر مجموعات بيانات مثيرة للاهتمام لنعمل عليها أثناء عملية تعلم R:

install.packages(
  c("arrow", "babynames", "curl", "duckdb", "gapminder", 
    "ggrepel", "ggridges", "ggthemes", "hexbin", "janitor", "Lahman", 
    "leaflet", "maps", "nycflights13", "openxlsx", "palmerpenguins", 
    "repurrrsive", "tidymodels", "writexl")
  )

سنستخدم أيضاً مجموعة مختارة من الحزم الأخرى لبعض الأمثلة العابرة (التي تُستخدم لمرة واحدة). لا تحتاج إلى تثبيتها الآن، فقط تذكر أنه كلما رأيت خطأً مثل هذا:

library(ggrepel)
#> Error in library(ggrepel) : there is no package called ‘ggrepel’

ستحتاج إلى تشغيل الأمر install.packages("ggrepel") لتثبيت الحزمة.

تشغيل أكواد R

أظهر لك القسم السابق عدة أمثلة على تشغيل أكواد R. تبدو الأكواد البرمجية في هذا الكتاب على النحو التالي:

1 + 2
#> [1] 3

إذا قمت بتشغيل الكود نفسه في لوحة وحدة التحكم المحلية لديك (local console)، فسيبدو الأمر كالتالي:

> 1 + 2
[1] 3

هناك اختلافان رئيسيان: في لوحة وحدة التحكم لديك (console)، تكتب الكود بعد العلامة > والتي تسمى المحث (prompt)؛ ونحن لا نظهر هذا المحث في الكتاب. أما في الكتاب، فإن المخرجات تظهر مسبوقة بعلامة التعليق #>؛ بينما في لوحة التحكم لديك، تظهر المخرجات مباشرة بعد الكود البرمجي الخاص بك. يعني هذان الاختلافان أنه إذا كنت تعمل باستخدام نسخة إلكترونية من الكتاب، فيمكنك بسهولة نسخ الكود من الكتاب ولصقه مباشرة في لوحة وحدة التحكم.

نستخدم في جميع أنحاء هذا الكتاب مجموعة متسقة من الاصطلاحات للإشارة إلى الأكواد البرمجية:

  • تُعرض الدوال (Functions) بخط كود برمجي متبوعة بأقواس، مثل sum() أو mean().
  • تُعرض كائنات R الأخرى (R objects) (مثل البيانات أو وسائط الدوال) بخط كود برمجي، ولكن بدون أقواس، مثل flights أو x.
  • في بعض الأحيان، لتوضيح الحزمة التي يأتي منها الكائن، سنستخدم اسم الحزمة متبوعاً بنقطتين رأسيتين مزدوجتين، مثل dplyr::mutate() أو nycflights13::flights. وهذا يُعد أيضاً كود R صالحاً ومقبولاً.

شكر وتقدير

هذا الكتاب ليس مجرد نتاج جهد هادلي (Hadley)، وماين (Mine)، وغاريت (Garrett) فحسب، بل هو ثمرة العديد من المحادثات النقاشية (شخصياً وعبر الإنترنت) التي أجريناها مع العديد من الأشخاص في مجتمع لغة R. نحن ممتنون للغاية لجميع تلك النقاشات والمحادثات التي خضناها معكم جميعاً؛ شكراً جزيلاً لكم!

This book was written in the open, and many people contributed via pull requests. A special thanks to all 259 of you who contributed improvements via GitHub pull requests (in alphabetical order by username): @a-rosenberg, Tim Becker (@a2800276), Abinash Satapathy (@Abinashbunty), Adam Gruer (@adam-gruer), adi pradhan (@adidoit), A. s. (@Adrianzo), Aep Hidyatuloh (@aephidayatuloh), Andrea Gilardi (@agila5), Ajay Deonarine (@ajay-d), @AlanFeder, Daihe Sui (@alansuidaihe), @alberto-agudo, @AlbertRapp, @aleloi, pete (@alonzi), Alex (@ALShum), Andrew M. (@amacfarland), Andrew Landgraf (@andland), @andyhuynh92, Angela Li (@angela-li), Antti Rask (@AnttiRask), LOU Xun (@aquarhead), @ariespirgel, @august-18, Michael Henry (@aviast), Azza Ahmed (@azzaea), Steven Moran (@bambooforest), Brian G. Barkley (@BarkleyBG), Mara Averick (@batpigandme), Oluwafemi OYEDELE (@BB1464), Brent Brewington (@bbrewington), Bill Behrman (@behrman), Ben Herbertson (@benherbertson), Ben Marwick (@benmarwick), Ben Steinberg (@bensteinberg), Benjamin Yeh (@bentyeh), Betul Turkoglu (@betulturkoglu), Brandon Greenwell (@bgreenwell), Bianca Peterson (@BinxiePeterson), Birger Niklas (@BirgerNi), Brett Klamer (@bklamer), @boardtc, Christian (@c-hoh), Caddy (@caddycarine), Camille V Leonard (@camillevleonard), @canovasjm, Cedric Batailler (@cedricbatailler), Christina Wei (@christina-wei), Christian Mongeau (@chrMongeau), Cooper Morris (@coopermor), Colin Gillespie (@csgillespie), Rademeyer Vermaak (@csrvermaak), Chloe Thierstein (@cthierst), Chris Saunders (@ctsa), Abhinav Singh (@curious-abhinav), Curtis Alexander (@curtisalexander), Christian G. Warden (@cwarden), Charlotte Wickham (@cwickham), Kenny Darrell (@darrkj), David Kane (@davidkane9), David (@davidrsch), David Rubinger (@davidrubinger), David Clark (@DDClark), Derwin McGeary (@derwinmcgeary), Daniel Gromer (@dgromer), @Divider85, @djbirke, Danielle Navarro (@djnavarro), Russell Shean (@DOH-RPS1303), Zhuoer Dong (@dongzhuoer), Devin Pastoor (@dpastoor), @DSGeoff, Devarshi Thakkar (@dthakkar09), Julian During (@duju211), Dylan Cashman (@dylancashman), Dirk Eddelbuettel (@eddelbuettel), Edwin Thoen (@EdwinTh), Ahmed El-Gabbas (@elgabbas), Henry Webel (@enryH), Ercan Karadas (@ercan7), Eric Kitaif (@EricKit), Eric Watt (@ericwatt), Erik Erhardt (@erikerhardt), Etienne B. Racine (@etiennebr), Everett Robinson (@evjrob), @fellennert, Flemming Miguel (@flemmingmiguel), Floris Vanderhaeghe (@florisvdh), @funkybluehen, @gabrivera, Garrick Aden-Buie (@gadenbuie), Peter Ganong (@ganong123), Gerome Meyer (@GeroVanMi), Gleb Ebert (@gl-eb), Josh Goldberg (@GoldbergData), bahadir cankardes (@gridgrad), Gustav W Delius (@gustavdelius), Hao Chen (@hao-trivago), Harris McGehee (@harrismcgehee), @hendrikweisser, Hengni Cai (@hengnicai), Iain (@Iain-S), Ian Sealy (@iansealy), Ian Lyttle (@ijlyttle), Ivan Krukov (@ivan-krukov), Jacob Kaplan (@jacobkap), Jazz Weisman (@jazzlw), John Blischak (@jdblischak), John D. Storey (@jdstorey), Gregory Jefferis (@jefferis), Jeffrey Stevens (@JeffreyRStevens), 蒋雨蒙 (@JeldorPKU), Jennifer (Jenny) Bryan (@jennybc), Jen Ren (@jenren), Jeroen Janssens (@jeroenjanssens), @jeromecholewa, Janet Wesner (@jilmun), Jim Hester (@jimhester), JJ Chen (@jjchern), Jacek Kolacz (@jkolacz), Joanne Jang (@joannejang), @johannes4998, John Sears (@johnsears), @jonathanflint, Jon Calder (@jonmcalder), Jonathan Page (@jonpage), Jon Harmon (@jonthegeek), JooYoung Seo (@jooyoungseo), Justinas Petuchovas (@jpetuchovas), Jordan (@jrdnbradford), Jeffrey Arnold (@jrnold), Jose Roberto Ayala Solares (@jroberayalas), Joyce Robbins (@jtr13), @juandering, Julia Stewart Lowndes (@jules32), Sonja (@kaetschap), Kara Woo (@karawoo), Katrin Leinweber (@katrinleinweber), Karandeep Singh (@kdpsingh), Kevin Perese (@kevinxperese), Kevin Ferris (@kferris10), Kirill Sevastyanenko (@kirillseva), Jonathan Kitt (@KittJonathan), @koalabearski, Kirill Müller (@krlmlr), Rafał Kucharski (@kucharsky), Kevin Wright (@kwstat), Noah Landesberg (@landesbergn), Lawrence Wu (@lawwu), @lindbrook, Luke W Johnston (@lwjohnst86), Kara de la Marck (@MarckK), Kunal Marwaha (@marwahaha), Matan Hakim (@matanhakim), Matthias Liew (@MatthiasLiew), Matt Wittbrodt (@MattWittbrodt), Mauro Lepore (@maurolepore), Mark Beveridge (@mbeveridge), @mcewenkhundi, mcsnowface, PhD (@mcsnowface), Matt Herman (@mfherman), Michael Boerman (@michaelboerman), Mitsuo Shiota (@mitsuoxv), Matthew Hendrickson (@mjhendrickson), @MJMarshall, Misty Knight-Finley (@mkfin7), Mohammed Hamdy (@mmhamdy), Maxim Nazarov (@mnazarov), Maria Paula Caldas (@mpaulacaldas), Mustafa Ascha (@mustafaascha), Nelson Areal (@nareal), Nate Olson (@nate-d-olson), Nathanael (@nateaff), @nattalides, Ned Western (@NedJWestern), Nick Clark (@nickclark1000), @nickelas, Nirmal Patel (@nirmalpatel), Nischal Shrestha (@nischalshrestha), Nicholas Tierney (@njtierney), Jakub Nowosad (@Nowosad), Nick Pullen (@nstjhp), @olivier6088, Olivier Cailloux (@oliviercailloux), Robin Penfold (@p0bs), Pablo E. Garcia (@pabloedug), Paul Adamson (@padamson), Penelope Y (@penelopeysm), Peter Hurford (@peterhurford), Peter Baumgartner (@petzi53), Patrick Kennedy (@pkq), Pooya Taherkhani (@pooyataher), Y. Yu (@PursuitOfDataScience), Radu Grosu (@radugrosu), Ranae Dietzel (@Ranae), Ralph Straumann (@rastrau), Rayna M Harris (@raynamharris), @ReeceGoding, Robin Gertenbach (@rgertenbach), Jajo (@RIngyao), Riva Quiroga (@rivaquiroga), Richard Knight (@RJHKnight), Richard Zijdeman (@rlzijdeman), @robertchu03, Robin Kohrs (@RobinKohrs), Robin (@Robinlovelace), Emily Robinson (@robinsones), Rob Tenorio (@robtenorio), Rod Mazloomi (@RodAli), Rohan Alexander (@RohanAlexander), Romero Morais (@RomeroBarata), Albert Y. Kim (@rudeboybert), Saghir (@saghirb), Hojjat Salmasian (@salmasian), Jonas (@sauercrowd), Vebash Naidoo (@sciencificity), Seamus McKinsey (@seamus-mckinsey), @seanpwilliams, Luke Smith (@seasmith), Matthew Sedaghatfar (@sedaghatfar), Sebastian Kraus (@sekR4), Sam Firke (@sfirke), Shannon Ellis (@ShanEllis), @shoili, Christian Heinrich (@Shurakai), S’busiso Mkhondwane (@sibusiso16), SM Raiyyan (@sm-raiyyan), Jakob Krigovsky (@sonicdoe), Stephan Koenig (@stephan-koenig), Stephen Balogun (@stephenbalogun), Steven M. Mortimer (@StevenMMortimer), Stéphane Guillou (@stragu), Sulgi Kim (@sulgik), Sergiusz Bleja (@svenski), Tal Galili (@talgalili), Alec Fisher (@Taurenamo), Todd Gerarden (@tgerarden), Tom Godfrey (@thomasggodfrey), Tim Broderick (@timbroderick), Tim Waterhouse (@timwaterhouse), TJ Mahr (@tjmahr), Thomas Klebel (@tklebel), Tom Prior (@tomjamesprior), Terence Teo (@tteo), @twgardner2, Ulrik Lyngs (@ulyngs), Shinya Uryu (@uribo), Martin Van der Linden (@vanderlindenma), Walter Somerville (@waltersom), @werkstattcodes, Will Beasley (@wibeasley), Yihui Xie (@yihui), Yiming (Paul) Li (@yimingli), @yingxingwu, Hiroaki Yutani (@yutannihilation), Yu Yu Aung (@yuyu-aung), Zach Bogart (@zachbogart), @zeal626, Zeki Akyol (@zekiakyol).

خاتمة الطبع

تتوفر نسخة إلكترونية من هذا الكتاب عبر الإنترنت على الرابط https://r4ds.hadley.nz. وسوف تستمر هذه النسخة في التطور والتحديث بين فترات إعادة طبع الكتاب الورقي. كما يتوفر الكود المصدري (source code) الخاص بالكتاب على منصة جيتهاب عبر الرابط https://github.com/hadley/r4ds. تم بناء وتطوير هذا الكتاب باستخدام نظام Quarto، والذي يسهل عملية كتابة وتأليف الكتب التي تجمع بين النصوص والأكواد البرمجية القابلة للتنفيذ.


  1. إذا كنت ترغب في الحصول على نظرة شاملة لجميع ميزات RStudio، راجع دليل مستخدم RStudio عبر الرابط: https://docs.posit.co/ide/user.↩︎