يشكل تقسيم البيانات إلى مجموعات مستقلة للتدريب والتحقق والاختبار حجر الزاوية في بناء النماذج الإحصائية وخوارزميات تعلم الآلة المعاصرة. فعند تطوير أي نموذج تنبؤي، لا تكمن الغاية الأساسية في تحسين قدرة الخوارزمية على استيعاب البيانات التاريخية المتوفرة فحسب، بل في إكسابها القدرة على التعميم الاستقرائي بدقة وكفاءة عند مواجهة مشاهدات غير مسبوقة. يضمن هذا التقسيم المنهجي تقييم النماذج بمعايير موضوعية صارمة تحاكي البيئة الواقعية التي ستعمل فيها تلك النماذج بعد نشرها وتطبيقها العملي.
تعتبر بيئة R الحوسبية الإحصائية إحدى أقوى المنصات البرمجية وأكثرها موثوقية في الأوساط الأكاديمية والبحثية لإجراء التحليلات المتقدمة وتطوير النماذج التنبؤية. توفر هذه البيئة حزمة متكاملة من الأدوات والمنهجيات المتنوعة لتقسيم البيانات، بدءاً من الدوال الرياضية المضمنة في نواتها الأساسية، مروراً بالحزم المتخصصة في التحليل الاستكشافي والتصنيف الطبقي، وصولاً إلى المنظومات الحديثة المتوافقة مع فلسفة معالجة البيانات المرتبة. تتيح هذه المرونة للباحثين والمحللين اختيار الأسلوب الأنسب لمتطلباتهم الحسابية، سواء كان الهدف تحسين الأداء الذاكري للبيانات الضخمة أو الحفاظ على النسب الطبقية الدقيقة للمتغيرات التصنيفية النادرة.
يقدم هذا الدليل المرجعي تحليلاً شاملاً وتطبيقياً لثلاث من أبرز الطرق المعتمدة لتقسيم البيانات داخل بيئة R، مع التركيز على الأسس النظرية والمخاطر المنهجية المصاحبة لكل مرحلة. سنستعرض بعمق كيفية استخدام بيئة R الأساسية (Base R)، وتطبيق حزمة caTools المتخصصة في أخذ العينات الطبقية، واستثمار حزمة dplyr ضمن منظومة tidyverse لإجراء عمليات التقسيم التسلسلي الحديثة، مع توضيح الفروق الدقيقة في الكفاءة الحوسبية وأفضل الممارسات لضمان قابلية إعادة الإنتاج والنزاهة العلمية.
- 1. مقدمة حول تقسيم البيانات إلى مجموعات تدريب واختبار في R
- 2. الأسس النظرية لمشكلة الإفراط في التخصيص (Overfitting) والتقييم العادل
- 3. أهمية قابلية إعادة الإنتاج ودور الدالة set.seed في R
- 4. الطريقة الأولى: تقسيم البيانات باستخدام R الأساسي (Base R)
- 5. تطبيق عملي للطريقة الأولى باستخدام مجموعة بيانات Iris
- 6. الطريقة الثانية: تقسيم البيانات باستخدام حزمة caTools
- 7. أخذ العينات الطبقية (Stratified Sampling) في caTools
- 8. الطريقة الثالثة: تقسيم البيانات باستخدام حزمة dplyr
- 9. التعامل المتقدم في dplyr واستخدام دالة anti_join لعزل الاختبار
- 10. مقارنة شاملة وتقييم منهجي بين الطرق الثلاث
- 11. أفضل الممارسات والأخطاء الشائعة أثناء تقسيم البيانات في R
- 12. الخاتمة والآفاق المتقدمة لتقسيم البيانات والتحقق المتقاطع في R
- References
1. مقدمة حول تقسيم البيانات إلى مجموعات تدريب واختبار في R
1.1 أهمية تقسيم البيانات في النمذجة الإحصائية وتعلم الآلة
ترتكز النمذجة الإحصائية وتعلم الآلة على فرضية أساسية مفادها أن البيانات المتاحة بين أيدينا تشكل عينة تمثيلية مستمدة من فضاء احتمالي أوسع لمجتمع الدراسة المستهدف. وبناءً على ذلك، يتمثل الهدف الجوهري لأي خوارزمية تنبؤية في استخلاص النمط الهيكلي الحقيقي الذي يربط المتغيرات المستقلة بالمتغير التابع، وتجاهل التشويش أو التباينات العشوائية المتأصلة في العينة الفردية. ومن هنا تبرز الضرورة الرياضية والمنهجية للفصل القاطع بين بيانات التدريب (Training Set) وبيانات الاختبار (Test Set).
تُخصص بيانات التدريب لتمكين الخوارزمية من ضبط معاملاتها وتقدير أوزانها الداخلية عبر خوارزميات التحسين الرياضي المختلفة، مثل الانحدار الخطي أو خوارزميات تعظيم دالة الإمكان (Maximum Likelihood Estimation). في المقابل، تظل بيانات الاختبار معزولة تماماً في بيئة اختبارية مستقلة لا تطلع عليها الخوارزمية إطلاقاً خلال مرحلة البناء أو المعايرة. يؤدي هذا العزل الوظيفي دور الحاجز الوقائي الصارم ضد التحيز التأكيدي، إذ يتيح للباحث اختبار قدرة النموذج على التعميم (Generalization) وقياس خطأ التنبؤ الفعلي على بيانات خارجية لم تساهم في صياغة المعادلة التنبؤية.
توفر لغة R بيئة مثالية لتطبيق هذه المفاهيم بفضل فلسفتها القائمة على معالجة المتجهات (Vectorized Operations) ومكتبتها الغنية بالحزم الإحصائية المعتمدة أكاديمياً. تضمن البنية التحتية لـ R تنفيذ هذه العمليات بكفاءة برمجية عالية، مما يتيح التعامل مع مختلف أنواع البيانات الجداولية ومصفوفات المتغيرات المعقدة مع الحفاظ على النزاهة المنهجية للتقييم الإحصائي.
1.2 النسب المعيارية الشائعة لتقسيم مجموعات البيانات
يخضع اختيار نسبة تقسيم البيانات لمعايير إحصائية دقيقة توازن بين توفير حجم عينة كافٍ لتدريب النموذج وضمان وجود حجم كافٍ وموثوق لاختباره وتعميم نتائجه. تعتبر قاعدة 70/30 من أكثر النسب المعيارية شيوعاً في الأدبيات الإحصائية الكلاسيكية؛ حيث يُخصص 70% من إجمالي المشاهدات لبناء النموذج، بينما يُحجز 30% لاختبار أدائه النهائي. تمنح هذه النسبة الخوارزمية مساحة تدريبية متوازنة مع الاحتفاظ بعينة اختبارية ذات دلالة إحصائية تمكن من حساب فترات الثقة لمقاييس الأداء بدقة.
مع تنامي حجم مجموعات البيانات المعاصرة، أصبحت نسبة 80/20 خياراً مفضلاً في العديد من التطبيقات العملية ومجموعات البيانات المتوسطة إلى الكبيرة. في البيئات التي تحتوي على مئات الآلاف أو ملايين السجلات، يوفر اقتطاع 20% فقط من البيانات عينة اختبارية ضخمة تفي تماماً بمتطلبات التحقق الإحصائي، بينما يسمح تخصيص 80% للتدريب بتعليم الخوارزميات المعقدة ذات المعاملات المتعددة، مثل الشبكات العصبية العميقة ونماذج التجميع الشجري (Ensemble Methods)، دون استنزاف درجات الحرية (Degrees of Freedom).
في التجارب المتقدمة التي تتطلب ضبط المعاملات الفوقية (Hyperparameters)، يتم التوسع في التقسيم التقليدي ليتضمن مجموعة ثالثة تُعرف بمجموعة التحقق (Validation Set). وفي هذه الحالة، تُعتمد غالباً نسب مثل 60/20/20 أو 70/15/15؛ حيث تُستخدم مجموعة التدريب لبناء النماذج الأولية، ومجموعة التحقق لاختيار النموذج الأفضل وضبط المعاملات، بينما تُحفظ مجموعة الاختبار بمعزل تام للتقييم النهائي غير المتحيز للأداء العام.
1.3 نظرة عامة على الطرق الثلاث المعتمدة في R
توفر لغة R مسارات برمجية متعددة لإنجاز مهمة تقسيم البيانات، تتفاوت فيما بينها من حيث المتطلبات والخصائص التقنية. الطريقة الأولى تعتمد بالكامل على دوال البيئة الأساسية (Base R)، وتحديداً دالتي sample() وتطبيق الفهرسة المنطقية بالأقواس المربعة. تمتاز هذه الطريقة باستقلاليتها التامة عن أي تبعيات خارجية، وخفتها الحوسبية، وملاءمتها للبيئات الإنتاجية المقيدة التي تتطلب سرعة في التنفيذ وتجنب تثبيت مكتبات إضافية.
تتمثل الطريقة الثانية في استخدام الحزم الإحصائية المتخصصة، وتعد حزمة caTools النموذج الأبرز في هذا السياق بفضل دالتها الشهيرة sample.split(). توفر هذه الطريقة ميزة حاسمة تفتقر إليها الدوال العشوائية البسيطة، وهي القدرة التلقائية على أخذ العينات الطبقية (Stratified Sampling). تضمن هذه التقنية الحفاظ الدقيق على نسب توزيع الفئات للمتغير التابع في كل من مجموعتي التدريب والاختبار، وهو أمر بالغ الأهمية عند التعامل مع مشكلات التصنيف غير المتوازنة.
أما الطريقة الثالثة فتعتمد على حزمة dplyr المتطورة والتابعة لمنظومة Tidyverse. تركز هذه المنهجية على الجمع بين وضوح الشيفرة البرمجية وقابليتها للصيانة عبر استخدام المعامل الأنبوبي وعمليات المعالجة الحديثة مثل sample_frac() أو slice_sample() متبوعة بالربط الاستبعادي المتقدم anti_join(). تناسب هذه الطريقة مسارات العمل التحليلية المتكاملة التي تبدأ بتنظيف البيانات وتنتهي بنمذجتها ضمن نسق برمجي مقروء وأنيق.
2. الأسس النظرية لمشكلة الإفراط في التخصيص (Overfitting) والتقييم العادل
2.1 مفهوم ظاهرة الإفراط في التخصيص في النماذج الرياضية
تنشأ ظاهرة الإفراط في التخصيص (Overfitting) عندما يصبح النموذج الإحصائي مفرط التعقيد لدرجة تجعله يلتقط ويحفظ التباينات العشوائية والضوضاء (Noise) الخاصة بعينة التدريب، بدلاً من استيعاب العلاقة البنيوية الحقيقية بين المتغيرات. رياضياً، كلما زادت مرونة النموذج وعدد معاملاته المستقلة مقارنة بعدد المشاهدات المتاحة، تمكن النموذج من تشكيل منحنى قرار يمر بجميع نقاط بيانات التدريب بدقة مفرطة، مما يؤدي إلى انخفاض خطأ التدريب إلى مستويات تقارب الصفر.
تكمن المعضلة الأساسية في أن هذه الضوضاء الإحصائية غير قابلة للتكرار في المشاهدات المستقبلية؛ حيث تنفرد كل عينة بخصائصها العشوائية الخاصة. ونتيجة لذلك، يفقد النموذج المفرط في التخصيص قدرته على التنبؤ بمشاهدات جديدة، ويظهر تدهوراً حاداً في دقته عند تطبيقه خارج إطار البيانات التي تدرب عليها. يتمثل خطأ الاختبار هنا في مقياس حقيقي يكشف عجز النموذج عن التعميم، مشيراً إلى فجوة واسعة بين أدائه النظري وأدائه الواقعي.
يعد تقسيم البيانات إلى مجموعات منفصلة الإجراء المنهجي الأول والأكثر فاعلية لاكتشاف الإفراط في التخصيص وقياسه. فعندما نلاحظ أن مقاييس الخطأ، مثل متوسط المربعات المتبقية (MSE) أو دقة التصنيف، ممتازة على مجموعة التدريب ولكنها تتراجع بشكل ملحوظ على مجموعة الاختبار، يكون ذلك مؤشراً قاطعاً على ضرورة تبسيط بنية النموذج أو تطبيق أساليب الانتظام الرياضي (Regularization) للحد من التعقيد المفرط.
2.2 مقايضة التباين والانحياز (Bias-Variance Tradeoff)
تمثل مقايضة الانحياز والتباين الأساس النظري الأهم في نظرية التعلم الإحصائي لتقييم خطأ التعميم المتوقع. يُعرف الانحياز (Bias) بأنه الخطأ الناتج عن تبسيط افتراضات النموذج بصورة تجعله عاجزاً عن استيعاب العلاقات غير الخطية أو الهياكل المعقدة في البيانات، وهو ما يؤدي إلى ما يُعرف بظاهرة نقص التخصيص (Underfitting). في المقابل، يمثل التباين (Variance) حساسية النموذج الشديدة للتقلبات الطفيفة في بيانات التدريب؛ فالنماذج ذات التباين المرتفع تتغير مخرجاتها ومعاملاتها بشكل جذري بمجرد تغيير العينة المستخدمة في التدريب.
يمكن تفكيك الخطأ الإجمالي المتوقع لأي نموذج إحصائي إلى ثلاثة مكونات رئيسية: مربع الانحياز، والتباين، والخطأ غير القابل للاختزال المتأصل في الظاهرة المدروسة. يسعى الباحث الإحصائي دائماً إلى إيجاد النقطة المثلى التي تحقق التوازن الدقيق بين الانحياز والتباين لتقليل الخطأ الكلي على المشاهدات غير المرئية، كما هو موضح في الأدبيات المرجعية مثل An Introduction to Statistical Learning لسبيجلتر وهاستي وآخرين.
يتيح التقسيم المنهجي للبيانات للباحث مراقبة هذا المنحنى الديناميكي؛ حيث يمكن تقييم استقرار النموذج عبر مقارنة أدائه على بيانات التدريب والاختبار عبر مستويات مختلفة من التعقيد الرياضي. يضمن هذا الإجراء اختيار بنية النموذج التي لا تبالغ في التبسيط فتسقط في فخ الانحياز، ولا تفرط في التعقيد فتنزلق إلى فخ التباين المرتفع.
2.3 تسرب البيانات (Data Leakage) ومخاطره الأكاديمية
يُعد تسرب البيانات (Data Leakage) من أخطر الأخطاء المنهجية التي تشوب الأبحاث التطبيقية ونماذج تعلم الآلة، ويقصد به انتقال معلومات من خارج مجموعة التدريب – وتحديداً من مجموعة الاختبار أو المتغير المستهدف المستقبلي – إلى داخل عملية بناء النموذج أو معالجة متغيراته. يؤدي هذا التسرب إلى تضخيم غير واقعي في مقاييس الأداء خلال مراحل التقييم المخبري، لكنه ينهار بصورة مدوية بمجرد نشر النموذج في بيئة الإنتاج الواقعية وتلقيه بيانات حقيقية جديدة.
يتخذ تسرب البيانات أشكالاً خفية متعددة أثناء إعداد مجموعات العمل في R؛ من أبرزها تطبيق عمليات المعالجة المسبقة وهندسة الميزات على كامل مجموعة البيانات قبل إجراء التقسيم. فعلى سبيل المثال، إذا قام الباحث بحساب المتوسط الحسابي والانحراف المعياري لكامل الإطار لتقييس المتغيرات المستمرة (Standardization)، فإن معلومات التوزيع الإحصائي الخاص بمجموعة الاختبار تكون قد تسربت بالفعل إلى مجموعة التدريب، مما يلغي الاستقلالية المطلقة المطلوبة في الاختبارات الإحصائية.
لتجنب هذا الخطأ الأكاديمي والعملي، تفرض القواعد المنهجية الصارمة عزل مجموعة الاختبار تماماً كأول خطوة في خط معالجة البيانات. يجب حساب جميع المعالم الإحصائية – مثل المتوسطات، والوسائط، ونسب الفئات، ومصفوفات التضمين – حصرياً من مجموعة التدريب، ثم تطبيق نفس تلك المعالم المحسوبة مسبقاً لتحويل مجموعة الاختبار دون السماح للبيانات الأخيرة بالمساهمة في أي عملية حسابية.
3. أهمية قابلية إعادة الإنتاج ودور الدالة set.seed في R
3.1 آلية عمل مولدات الأرقام شبه العشوائية (PRNG) في R
تفتقر أجهزة الحاسوب بطبيعتها الرقمية إلى القدرة على توليد عشوائية حقيقية نابعة من ظواهر فيزيائية نقية، وتعتمد بدلاً من ذلك على خوارزميات حتمية متطورة تُعرف بمولدات الأرقام شبه العشوائية (Pseudorandom Number Generators – PRNG). تقوم هذه الخوارزميات بتوليد متتاليات طويلة جداً من الأرقام الرياضية التي تماثل التوزيعات العشوائية الإحصائية في خصائصها وتجانسها، لكنها في جوهرها متتاليات قطعية يمكن التنبؤ بها وإعادة إنتاجها بدقة متى عُرفت نقطة الانطلاق الرياضية.
تستخدم لغة R افتراضياً خوارزمية Mersenne Twister لتوليد الأرقام شبه العشوائية، وهي خوارزمية فائقة الكفاءة ذات دورة تكرار بالغة الطول تصل إلى (2^{19937}-1). تبدأ هذه الخوارزمية مسارها الحسابي من قيمة ابتدائية محددة تُعرف باسم “البذرة العشوائية” (Seed). وعند تغذية الخوارزمية بنفس قيمة البذرة، فإنها ستولد تماماً نفس السلسلة العددية في كل مرة يتم فيها تشغيل الكود البرمجي، بغض النظر عن عدد مرات التنفيذ أو الوقت المنقضي.
يعد فهم هذه الآلية أساسياً عند تنفيذ عمليات تقسيم البيانات؛ حيث تضمن البذرة العشوائية أن يكون السحب العشوائي للصفوف والمشاهدات متطابقاً وثابتاً في كل تشغيل. يتيح ذلك للباحثين والمطورين اختبار خوارزمياتهم ونماذجهم في ظروف متطابقة تماماً، وتتبع الأخطاء البرمجية أو الاختلافات في أداء النماذج دون القلق من تداخل عوامل التباين العشوائي الناتج عن تغيير عينات التدريب والاختبار.
3.2 تطبيق الدالة set.seed(1) في الممارسة الإحصائية
تمثل الدالة set.seed() في R الأداة القياسية المعتمدة للتحكم في الحالة الابتدائية لمولد الأرقام شبه العشوائية. يستقبل هذا الأمر معاملاً عددياً صحيحاً يمثل قيمة البذرة المراد تثبيتها، مثل استخدام المعامل التقليدي set.seed(1) أو أي رقم صحيح آخر يتم اختياره. بمجرد تنفيذ هذا السطر البرمجي، يتم ضبط الحالة الداخلية للمولد لتبدأ العمليات العشوائية اللاحقة – مثل sample() أو sample.split() – من مسار محدد وثابت.
لا تؤثر القيمة العددية المختارة للبذرة (سواء كانت 1 أو 42 أو 12345) على جودة الخصائص الإحصائية للعشوائية المولدة؛ فجميعها يطلق متتاليات تحقق المعايير الصارمة للتوزيعات العشوائية المتوازنة. ومع ذلك، فإن تثبيت هذه القيمة يضمن أن أي باحث آخر يقوم بتشغيل نفس الشيفرة المصدرية سيحصل على نفس مجموعة التدريب ونفس مجموعة الاختبار بدقة متناهية، وصولاً إلى نفس السجلات والصفوف المحددة.
تحظى هذه الممارسة بأهمية استثنائية في إطار الشفافية الأكاديمية ومعايير النشر العلمي المعتمدة من المجلات الدولية المحكمة. إن توثيق وتثبيت البذرة العشوائية يتيح للمراجعين والباحثين المستقلين التحقق من صحة النتائج المنشورة وإعادة إنتاج نفس المقاييس والمصفوفات الرياضية دون أدنى تباين، مما يعزز الموثوقية العلمية للورقة البحثية أو التقرير التحليلي.
3.3 إدارة العشوائية عبر الجلسات والبيئات الحاسوبية المختلفة
على الرغم من بساطة استخدام set.seed()، إلا أن هناك اعتبارات تقنية متقدمة يجب مراعاتها لضمان التوافق التام عبر البيئات البرمجية المختلفة وإصدارات R المتعاقبة. فقد شهد إصدار R 3.6.0 تعديلاً جوهرياً في خوارزمية التوليد الموحد العشوائي الافتراضية المخصصة لأخذ العينات المتقطعة (Discrete Random Sampling) لتفادي انحياز إحصائي طفيف كان موجوداً في الإصدارات السابقة. قد يؤدي هذا التغيير إلى توليد عينات مختلفة لنفس قيمة البذرة إذا تم تشغيل الكود على إصدارات أقدم من R.
لضمان التوافق العكسي الدقيق بين الأنظمة والإصدارات، توفر R دالة RNGkind() التي تسمح بتحديد نوع المولد وخوارزمية أخذ العينات صراحة. يمكن للباحثين استخدام الأمر المخصص لضبط نوع العشوائية ليتوافق مع البيئات المستهدفة، وهو ما يُعد ممارسة موصى بها في المشاريع البرمجية الحساسة التي تعمل عبر منصات تشغيل متنوعة مثل Linux وmacOS وWindows.
تشمل أفضل الممارسات المهنية أيضاً توثيق جلسة العمل بالكامل باستخدام الدالة المدمجة sessionInfo()، والتي تسجل بدقة إصدار R المستخدم، ونظام التشغيل، وإصدارات جميع الحزم المحملة. يضمن هذا التوثيق الشامل، إلى جانب الاستخدام المنهجي لـ set.seed()، عدم ظهور أي مفاجآت غير متوقعة عند تشغيل نماذج تقسيم البيانات عبر خوادم المعالجة السحابية أو منصات التكامل المستمر (CI/CD).
4. الطريقة الأولى: تقسيم البيانات باستخدام R الأساسي (Base R)
4.1 تحليل عمل الدالة sample() مع المتجهات المنطقية
تعتمد الطريقة الأولى لتقسيم البيانات في R على توظيف الدالة القياسية المدمجة sample() لتوليد متجهات منطقية (Logical Vectors) تحكم عملية الفرز. تعد هذه الدالة إحدى أكثر الدوال الحسابية كفاءة وسرعة؛ حيث تعمل مباشرة على مستوى الذاكرة الأولية دون الحاجة إلى هياكل وسيطة معقدة. يتمثل المنطق الرياضي لهذه الطريقة في إجراء سحب عشوائي ذي حدين (Binomial Sampling) لتحديد انتماء كل صف في مصفوفة البيانات إما إلى مجموعة التدريب أو إلى مجموعة الاختبار.
لتحقيق ذلك، يتم تمرير المتجه المنطقي المكون من القيمتين c(TRUE, FALSE) كعناصر أساسية لعملية السحب، مع تحديد حجم السحب ليكون مساوياً تماماً لعدد صفوف مجموعة البيانات عبر الدالة nrow(data). ولتمكين الدالة من تعيين هذه القيم لجميع الصفوف دون استثناء، يتم تفعيل معامل الإرجاع بتمرير replace = TRUE، وهو ما يضمن استقلالية السحب لكل مشاهدة عن الأخرى.
تتم إدارة نسب التقسيم المطلوبة بدقة متناهية عبر المعامل prob، والذي يستقبل متجهاً من الاحتمالات النسبية يحدد الوزن المخصص لكل قيمة منطقية. فعند الرغبة في تطبيق تقسيم معياري بنسبة 70% للتدريب و30% للاختبار، يتم تمرير المتجه الاحتمالي بالصيغة الرياضية prob = c(0.7, 0.3). ونتيجة لذلك، يتم تخصيص القيمة TRUE لكل صف باحتمال مقداره 0.70، بينما تخصص القيمة FALSE باحتمال 0.30، مما يولد قناعاً ثنائياً يغطي كامل حجم البيانات الأصلية.
4.2 استخدام الفهرسة المنطقية (Logical Indexing) لتقسيم الإطارات
بمجرد إنشاء المتجه المنطقي وتخزينه في كائن وسيط، ولنسمه sample_index، تتيح لغة R استخدام هذا المتجه مباشرة داخل نظام الفهرسة الثنائي المعتمد على الأقواس المربعة [rows, columns]. تمثل الفهرسة المنطقية إحدى أقوى ركائز لغة R وأكثرها تعبيراً؛ حيث تقوم الآلة البرمجية بمطابقة مواقع القيم TRUE في المتجه المنطقي مع المواقع المقابلة لها في صفوف إطار البيانات (Data Frame) واستخراجها بدقة متناهية.
يتم بناء مجموعة التدريب عبر تمرير المتجه المنطقي مباشرة في موقع الصفوف مع ترك موقع الأعمدة فارغاً للحفاظ على جميع المتغيرات: train_data <- df[sample_index, ]. تقوم هذه الشيفرة بنسخ جميع الصفوف التي تقابلها القيمة المنطقية TRUE في القناع العشوائي ونقلها إلى الكائن الجديد train_data. تتميز هذه العملية بالسرعة الفائقة حيث تنفذ على مستوى معالجة المتجهات دون استخدام أي حلقات تكرارية بطيئة.
أما مجموعة الاختبار، فيتم استخراجها بأناقة رياضية استثنائية عبر استخدام معامل النفي المنطقي !، وذلك بالصيغة: test_data <- df[!sample_index, ]. يقوم معامل النفي بعكس جميع القيم المنطقية داخل المتجه؛ فتحول القيمة FALSE إلى TRUE والعكس صحيح. يضمن هذا الإجراء أن تكون مجموعة الاختبار مكملة تماماً لمجموعة التدريب رياضياً، مما يستبعد بشكل قاطع أي احتمال لتكرار السجلات أو تداخل الصفوف بين المجموعتين المستقلتين.
4.3 المزايا التقنية والتحديات المرتبطة بطريقة Base R
تتمتع طريقة تقسيم البيانات عبر دوال Base R بالعديد من المزايا التقنية الحاسمة التي تجعلها الخيار المفضل في البيئات البرمجية المعقدة والأنظمة المدمجة. تأتي في مقدمة هذه المزايا ميزة انعدام التبعيات البرمجية الخارجية (Zero Dependencies)؛ حيث يعمل الكود بشكل فوري على أي بيئة R قياسية دون الحاجة للاتصال بالإنترنت أو تثبيت حزم من مستودع CRAN، مما يقضي تماماً على مشاكل تعارض إصدارات المكتبات ويضمن استقرار الشيفرة البرمجية على المدى الطويل.
تتميز الطريقة أيضاً بكفاءتها العالية في استهلاك الذاكرة وسرعة المعالجة الفائقة، إذ تعمل دوال البيئة الأساسية المكتوبة بلغة C المنخفضة المستوى مباشرة على المصفوفات، مما يجعلها ملائمة لمعالجة مجموعات البيانات الضخمة التي قد تعاني من بطء الاستجابة أو استنزاف الذاكرة العشوائية عند معالجتها بواسطة حزم خارجية ذات هياكل بيانية وسيطة.
في المقابل، يواجه هذا النهج تحدياً جوهرياً يتعلق بغياب آليات التقسيم الطبقي المدمجة. تعتمد الدالة sample() على العشوائية البسيطة المستقلة، مما يعني أنها لا تراعي التوزيع التكراري للفئات داخل المتغيرات التابعة. في مجموعات البيانات الصغيرة أو غير المتوازنة بشدة، قد يسفر التقسيم العشوائي البسيط عن تشويه نسب الفئات بين مجموعتي التدريب والاختبار، أو ربما اختفاء فئة نادرة تماماً من إحدى المجموعتين، وهو ما يتطلب تدخلاً برمجياً إضافياً لبناء أقنعة طبقية مخصصة.
5. تطبيق عملي للطريقة الأولى باستخدام مجموعة بيانات Iris
5.1 استكشاف وفحص بنية مجموعة بيانات Iris
لتطبيق الطريقة الأولى بصورة عملية وواقعية، سنستخدم مجموعة البيانات الكلاسيكية المعيارية Iris Data Set المدمجة افتراضياً في لغة R، والتي قدمها عالم الإحصاء الشهير رونالد فيشر عام 1936. تتألف هذه المجموعة من 150 مشاهدة موزعة بالتساوي على ثلاثة أصناف رئيسية من زهور السوسن هي: Setosa، وVersicolor، وVirginica، بواقع 50 مشاهدة لكل صنف، وتتضمن أربعة متغيرات مستمرة تقيس الخصائص المورفولوجية للكأس والبتلات.
يبدأ التحليل الاستكشافي الأولي باستدعاء بنية البيانات وفحص أبعادها للتأكد من سلامتها وخلوها من المشاكل الهيكلية. يمكن التحقق من توزيع المتغير المستهدف وتماسك المتغيرات المستقلة عبر الدوال الاستكشافية الأساسية مثل str(iris) وsummary(iris). يوضح الفحص الأولي أن البيانات تتميز بتوازن مثالي بين الأصناف الثلاثة، مع عدم وجود أي قيم مفقودة (Missing Values – NA) قد تؤثر سلباً على عملية السحب العشوائي أو تتطلب معالجة مسبقة قبل التقسيم.
يمثل الاستقرار الهيكلي لمجموعة بيانات Iris بيئة نموذجية لاختبار دقة خوارزميات التقسيم ومراقبة كيفية توزع الصفوف والمشغيرات المستمرة عبر العينات الناتجة، مما يتيح إجراء مقارنات رياضية واضحة بين النسب النظرية المستهدفة والنسب الواقعية المتحققة برمجياً.
5.2 تنفيذ كود التقسيم خطوة بخطوة بلغة Base R
نبدأ بتنفيذ الشيفرة البرمجية المنهجية لتقسيم بيانات Iris إلى مجموعة تدريب بنسبة 70% ومجموعة اختبار بنسبة 30%. الخطوة الأولى والأساسية هي تثبيت البذرة العشوائية لضمان استقرار وتطابق النتائج عبر جميع جلسات التشغيل المستقبلية، وذلك بكتابة الأمر:
set.seed(1)
في الخطوة الثانية، نقوم بتوليد المتجه المنطقي الذي سيحدد توزيع الصفوف. نمرر المتجه المنطقي الثنائي مع تفعيل الاستبدال وتحديد متجه الاحتمالات بدقة، كما يوضح السطر التالي:
split_vector <- sample(c(TRUE, FALSE), nrow(iris), replace = TRUE, prob = c(0.7, 0.3))
في الخطوة الثالثة والأخيرة، نطبق الفهرسة المنطقية بالأقواس المربعة لبناء كائني البيانات المستقلين؛ حيث ننشئ مجموعة التدريب ومجموعة الاختبار على النحو الآتي:
train_set <- iris[split_vector, ]
test_set <- iris[!split_vector, ]
تتم هذه العملية بالكامل في أجزاء من الألف من الثانية، وتنتج كائنين جديدين من نوع Data Frame يحتويان على نفس بنية الأعمدة الأصلية الخمسة، مع توزيع الصفوف وفقاً للمسار العشوائي المحدد بالبذرة المثبتة.
5.3 التحقق الرياضي من دقة التقسيم وأبعاد المصفوفات
عقب إتمام عملية التقسيم البرمجي، يتعين على الباحث التحقق الحسابي من سلامة الأبعاد وتوزيع المشاهدات في الكائنات الناتجة. نستخدم الدالة nrow() لحساب عدد الصفوف في كل مجموعة والتأكد من مطابقتها للعدد الإجمالي الأصلي البالغ 150 صفاً.
عند فحص المخرجات الناتجة عن البذرة set.seed(1)، نجد أن مجموعة التدريب train_set تحتوي على 102 مشاهدة، بينما تحتوي مجموعة الاختبار test_set على 48 مشاهدة. وبإجراء عملية جمع بسيطة (102 + 48 = 150)، نتأكد من عدم فقدان أي سجل أثناء عملية الفهرسة المنطقية.
لحساب النسبة المئوية الواقعية المتحققة، نقسم عدد صفوف التدريب على الإجمالي: ( (102 / 150) times 100 = 68% )، في حين تمثل مجموعة الاختبار نسبة ( (48 / 150) times 100 = 32% ). يظهر هذا الحساب تقارباً كبيراً مع النسبة المستهدفة 70/30. يعود هذا الفارق الطفيف (68% مقابل 70%) إلى الطبيعة الاحتمالية لتجربة برنولي المستقلة لكل صف على حدة؛ حيث يقترب التردد النسبي الفعلي من الاحتمال النظري كلما ازداد حجم العينة الإجمالي وفقاً لقانون الأعداد الكبيرة (Law of Large Numbers).
6. الطريقة الثانية: تقسيم البيانات باستخدام حزمة caTools
6.1 تثبيت واستدعاء حزمة caTools وأهدافها البرمجية
تمثل حزمة caTools إحدى أقدم وأشهر الحزم الإحصائية الموجهة لتحليل البيانات المتقدم في R، حيث صُممت لتوفير مجموعة من الأدوات الحسابية السريعة للعمليات الحسابية المتحركة، وتحليل منحنيات التمايز التشغيلي (ROC Curves)، وإجراء أخذ العينات الإحصائية المعقدة. تتميز الحزمة بكتابة جوهر عملياتها الرياضية بلغات منخفضة المستوى (C/C++)، مما يمنحها كفاءة حوسبية عالية وسرعة استثنائية في المعالجة.
لتثبيت الحزمة من المستودع الرسمي CRAN، يتم تشغيل الأمر المعتاد في بيئة R:
install.packages("caTools")
عقب اكتمال التثبيت، يتم تحميل المكتبة إلى مساحة العمل النشطة عبر استدعاء الأمر:
library(caTools)
تفضل الأوساط الأكاديمية والمهنية استخدام caTools عند بناء نماذج التصنيف (Classification Models) تحديداً، نظراً لتفوقها المعماري في حل مشكلة تباين توزيع الفئات وملاءمتها لمعالجة البيانات التي تحتوي على متغيرات تابعة نوعية تتطلب معالجة طبقية دقيقة.
6.2 شرح آلية عمل الدالة sample.split() ومعامل SplitRatio
يكمن الابتكار الأساسي لحزمة caTools في دالتها الشهيرة sample.split(). تختلف هذه الدالة جذرياً عن دالة sample() الأساسية في كونها تأخذ في الاعتبار المتغير التابع وتجري تقسيماً متوازناً داخلياً لكل فئة من فئاته على حدة. تستقبل الدالة معاملاً أساسياً يمثل متجه الاستجابة (Target Vector)، بالإضافة إلى معامل التحكم في النسبة SplitRatio.
تتميز الدالة بمرونة فائقة في التعامل مع المعامل SplitRatio؛ حيث يمكن تمريره كنسبة مئوية كسرية محصورة بين 0 و 1 (مثل 0.70 للدلالة على تخصيص 70% للتدريب)، أو كعدد صحيح يحدد العدد المطلق للمشاهدات المراد تضمينها في مجموعة التدريب. بناءً على هذه المدخلات، تقوم الدالة بحساب العدد المطلوب بدقة لكل مستوى من مستويات المتغير التابع وتجري سحباً عشوائياً داخلياً يضمن تمثيل كل فئة بنسبتها المحددة بدقة متناهية.
تكون مخرجات الدالة عبارة عن متجه منطقي يحتوي على القيمتين TRUE و FALSE بنفس طول المتجه المدخل الأصلي. يمثل هذا المتجه قناعاً تصنيفياً ثنائياً بالغ الدقة يمكن استخدامه مباشرة لفرز وتقسيم إطارات البيانات المعقدة بكفاءة عالية وبأقل قدر من التعليمات البرمجية.
6.3 استخراج المجموعات باستخدام دالة subset()
بعد توليد المتجه المنطقي الطبقي بواسطة sample.split()، يمكن للباحث استخدام الدالة المدمجة subset() كبديل أنيق ومقروء للفهرسة التقليدية بالأقواس المربعة. توفر هذه الدالة واجهة برمجية واضحة تعزز قابلية قراءة الشيفرة وتحد من الأخطاء النحوية الشائعة المرتبطة بالفواصل المنسية داخل الأقواس المربعة.
يتم تنفيذ الاستخراج باتباع البنية التالية:
split_mask <- sample.split(iris$Species, SplitRatio = 0.70)
train_data <- subset(iris, split_mask == TRUE)
test_data <- subset(iris, split_mask == FALSE)
تتميز دالة subset() بالوضوح الدلالي؛ حيث تعبر بوضوح عن الغرض التحليلي من السطر البرمجي، مما يسهل قراءة الأكواد ومراجعتها داخل الفرق البحثية المتعددة التخصصات. وعلى الرغم من أن الفهرسة بالأقواس المربعة تتفوق عليها بفارق طفيف جداً في السرعة الحوسبية على المصفوفات الضخمة، إلا أن استخدام subset() يوفر تجربة برمجية سلسة وتوافقاً تاماً مع كائنات البيانات المختلفة في R.
7. أخذ العينات الطبقية (Stratified Sampling) في caTools
7.1 المفهوم الإحصائي للعينات الطبقية وأهميتها
يُعرف أخذ العينات الطبقية (Stratified Sampling) بأنه أسلوب إحصائي متقدم لأخذ العينات يقوم على تقسيم مجتمع الدراسة الكلي إلى مجموعات فرعية متجانسة ومستقلة تُعرف باسم “الطبقات” (Strata) بناءً على خاصية أو متغير معين (مثل الفئات التصنيفية للمتغير التابع)، تليها عملية سحب عشوائي مستقل داخل كل طبقة على حدة بالنسب المحددة مسبقاً.
تكتسب هذه المنهجية أهمية استثنائية عند التعامل مع مشكلات الفئات غير المتوازنة (Imbalanced Classification)؛ مثل التنبؤ بالاحتيال المصرفي، أو تشخيص الأمراض النادرة، أو رصد الأعطال الصناعية النادرة، حيث تمثل فئة الاهتمام الإحصائي نسبة ضئيلة جداً (قد تقل عن 1% أو 5% من إجمالي المشاهدات). إذا تم تطبيق التقسيم العشوائي البسيط في هذه الحالات، فإن احتمالية عدم تمثيل الفئة النادرة في مجموعة التدريب أو الاختبار تصبح مرتفعة إحصائياً، مما يؤدي إلى فشل الخوارزمية في التعلم أو عجزها عن التقييم الدقيق للأداء.
تضمن العينات الطبقية الحفاظ على نفس البنية الاحتمالية ونفس نسب التوزيع للفئات المستهدفة عبر جميع المجموعات المشتقة، مما يقضي تماماً على تباين التوزيع (Distribution Drift) الناتج عن السحب العشوائي الصرف، ويوفر بيئة تقييم عادلة وصارمة تحاكي المجتمع الإحصائي الأصلي بكامل تعقيداته.
7.2 تطبيق العينات الطبقية على بيانات Iris بواسطة caTools
لتطبيق مفهوم العينات الطبقية عملياً، نستخدم حزمة caTools على بيانات iris مع تثبيت البذرة العشوائية لضمان الموثوقية:
set.seed(1)
split_strat <- sample.split(iris$Species, SplitRatio = 0.70)
train_strat <- subset(iris, split_strat == TRUE)
test_strat <- subset(iris, split_strat == FALSE)
لفحص مدى نجاح العينات الطبقية في الحفاظ على التوازن المثالي بين الأصناف الثلاثة، نطبق دالة الجداول التكرارية table() على عمود الأصناف في كلا المجموعتين:
table(train_strat$Species)
table(test_strat$Species)
تظهر المخرجات الحسابية نتيجة مذهلة تعكس دقة الدالة؛ حيث تحتوي مجموعة التدريب على 35 مشاهدة لكل صنف من الأصناف الثلاثة (Setosa: 35, Versicolor: 35, Virginica: 35) بإجمالي 105 مشاهدات (تمثل 70% تماماً من 150)، بينما تحتوي مجموعة الاختبار على 15 مشاهدة لكل صنف بدقة متناهية (Setosa: 15, Versicolor: 15, Virginica: 15) بإجمالي 45 مشاهدة (تمثل 30% تماماً). لقد تم الحفاظ على النسبة المتطابقة 1:1:1 عبر المجموعتين دون أي انحياز عشوائي.
7.3 الحالات المتقدمة لتطبيق sample.split في النمذجة الثنائية والمتعددة
تمتد قدرات الدالة sample.split() لتغطي بكفاءة عالية سيناريوهات النمذجة الثنائية (Binary Classification) والنمذجة متعددة الفئات (Multinomial Classification). في حالات النمذجة الثنائية – كالتنبؤ باستجابة العملاء لحملة تسويقية (نعم/لا) – تتولى الدالة تلقائياً ضمان وجود نفس نسبة الحالات الإيجابية والسلبية في مجموعتي التدريب والاختبار، مما يمنع حدوث انحياز في تقدير معالم نماذج الانحدار اللوجستي (Logistic Regression).
وفي المشكلات متعددة الفئات ذات المستويات المتعددة (Multiclass Problems)، تحافظ الدالة على التوزيع التكراري الدقيق لكل فئة مهما كان عدد المستويات في المتغير النوعي، مما يضمن تدريب نماذج شجر القرار أو الغابات العشوائية (Random Forests) على تمثيل متوازن لجميع الفئات وتفادي هيمنة الفئات الكبرى على حساب الفئات الأقل تمثيلاً.
ومع ذلك، تجدر الإشارة إلى وجود حد منهجي هام لحزمة caTools ودالتها sample.split()؛ إذ أنها مصممة خصيصاً للتعامل مع المتغيرات التابعة الفئوية والتصنيفية. عند التعامل مع مشكلات التراجع والانحدار المستمر (Regression)، حيث يكون المتغير التابع كمياً متصلاً، فإن استخدام sample.split() يتطلب تقسيم المتغير المستمر أولاً إلى فئات كمية (Binned Quantiles) أو اللجوء إلى دوال متخصصة أخرى مثل دالة createDataPartition() من حزمة caret التي تعالج المتغيرات المستمرة طبقياً عبر التوزيعات المئينية.
8. الطريقة الثالثة: تقسيم البيانات باستخدام حزمة dplyr
8.1 مفهوم منظومة Tidyverse ودور حزمة dplyr الحديث
أحدثت منظومة Tidyverse ثورة معرفية ومنهجية في طريقة كتابة وتحليل البيانات بلغة R، حيث أسسها هادلي ويكهام (Hadley Wickham) وفريقه وفق مبادئ هندسية متسقة تجعل الشيفرة البرمجية شبيهة باللغة الطبيعية المنظمة. تحتل حزمة dplyr قلب هذه المنظومة بصفتها النحوية المخصصة للتحكم في البيانات وتحويلها عبر أفعال واضحة الدلالة.
يعتمد سير العمل الحديث في dplyr على عامل الربط التسلسلي الأنبوبي (Pipe Operator)، سواء بالصيغة التقليدية للحزمة %>% أو بالصيغة المدمجة الأصلية في R الحديثة |>. يتيح المعامل الأنبوبي تدفق كائنات البيانات بسلاسة من دالة إلى أخرى كمدخلات متتابعة، مما يلغي الحاجة إلى إنشاء العديد من المتغيرات الوسيطة المعقدة أو تشبيك الدوال الرياضية داخل بعضها بشكل يصعب قراءته وتتبعه.
يتم تثبيت المنظومة بالكامل أو تثبيت حزمة dplyr بشكل منفصل عبر مستودع CRAN:
install.packages("dplyr")
library(dplyr)
يوفر استخدام dplyr في تقسيم البيانات تكاملاً سلساً مع بقية مراحل معالجة البيانات، حيث يمكن تنظيف البيانات، وتصفيتها، وهندسة ميزاتها، ثم تقسيمها إلى مجموعات تدريب واختبار ضمن سلسلة برمجية واحدة واضحة وقابلة للصيانة والتطوير المؤسسي.
8.2 إنشاء معرف فريد للصفوف كخطوة تحضيرية أساسية
عند الاعتماد على منهجية التقسيم عبر الربط العلائقي في dplyr، تقتضي أفضل الممارسات البرمجية إنشاء عمود مخصص للمعرف الفريد (Unique Identifier) لكل صف في إطار البيانات الأصلي. تضمن هذه الخطوة التحضيرية سلامة عمليات الدمج والاستبعاد اللاحقة وتمنع حدوث أي التباس في حال وجود صفوف مكررة تحمل نفس القيم في جميع المتغيرات المستقلة.
توفر حزمة dplyr دوال متعددة لإنشاء هذا المعرف بكفاءة، مثل الدالة mutate() مقترنة بدالة الترقيم row_number()، أو عبر الإسناد المباشر في Base R. يتم إنشاء عمود المعرف البرمجي بالصيغة التالية:
iris_with_id % mutate(row_id = row_number())
يؤدي هذا السطر إلى إضافة عمود عددي جديد باسم row_id يتضمن أرقاماً متسلسلة فريدة تمتد من 1 إلى إجمالي عدد المشاهدات (150). يمثل هذا المعرف مفتاحاً أساسياً (Primary Key) يسمح لعمليات الربط الاستبعادي بالتعرف على السجلات بدقة رياضية مطلقة وتجنب أي خطأ في مطابقة الصفوف أثناء عزل بيانات الاختبار.
8.3 استخراج عينة التدريب باستخدام دالة sample_frac()
تقدم حزمة dplyr الدالة المتخصصة sample_frac() لاقتطاع نسبة مئوية محددة من إطار البيانات بطريقة عشوائية ومنسقة. تستقبل هذه الدالة إطار البيانات عبر المعامل الأنبوبي، وتتطلب تحديد النسبة العشرية المطلوبة عبر المعامل size. لاستخراج 70% من البيانات لغرض التدريب، نكتب الشيفرة التالية:
set.seed(1)
train_df % sample_frac(size = 0.70, replace = FALSE)
تجري الدالة عملية سحب عشوائي بدون إرجاع (Without Replacement) بنسبة 70% من إجمالي الصفوف، وتنتج إطار بيانات جديداً يتضمن 105 صفوف تم اختيارها عشوائياً بدقة متناهية.
تجدر الإشارة إلى أن الإصدارات الأحدث من حزمة dplyr تقدم الدالة المطورة slice_sample() كبديل حديث وموصى به يحل محل دالة sample_frac()، حيث تتم كتابتها بالصيغة slice_sample(prop = 0.70). تعمل الدالتان بنفس الآلية الرياضية الأساسية، مع توفير خيارات إضافية للتحكم في الأوزان الاحتمالية وخيارات السحب المتقدمة.
9. التعامل المتقدم في dplyr واستخدام دالة anti_join لعزل الاختبار
9.1 الأسس الرياضية لعمليات الربط الاستبعادي (Anti Join)
ينتمي مفهوم الربط الاستبعادي (Anti Join) إلى نظرية المجموعات الجبرية وقواعد البيانات العلائقية، ويُصنف ضمن ما يُعرف في منظومة dplyr بـ “عمليات الربط الترشيحية” (Filtering Joins). لا تهدف هذه العمليات إلى إضافة أعمدة جديدة من جدول إلى آخر، بل تقتصر وظيفتها على تصفية وترشيح صفوف الجدول الأول استناداً إلى وجود أو غياب تطابق لها في الجدول الثاني.
رياضياً، إذا كان لدينا المجموعة الكلية للبيانات (U) ومجموعة التدريب المستقطعة (A subset U)، فإن مجموعة الاختبار المطلوبة (B) تمثل المتممة الجبرية لـ (A) بالنسبة إلى (U)، أي (B = U setminus A). تقوم دالة anti_join(U, A, by = "key") بمقارنة قيم المفتاح الأساسي في كلا الجدولين، ثم تُبقي فقط على الصفوف الموجودة في الجدول الأول (U) والتي لا يوجد لها أي أثر أو تطابق في الجدول الثاني (A).
تضمن هذه الآلية الرياضية استحالة تسرب أي صف من مجموعة التدريب إلى مجموعة الاختبار؛ إذ يتم فحص كل سجل بصورة مستقلة واستبعاده بمجرد ثبوت اختياره في مرحلة التدريب، مما يوفر عزلاً تاماً بين المجموعتين دون الاعتماد على مؤشرات المواقع المتغيرة أو الأقنعة المنطقية القابلة للخطأ.
9.2 تطبيق الكود البرمجي الكامل لـ dplyr على مجموعة البيانات
نستعرض فيما يلي التسلسل البرمجي الكامل والمتكامل لتنفيذ عملية التقسيم باستخدام حزمة dplyr وعزل مجموعة الاختبار عبر anti_join()، مع تنظيف وتجهيز المصفوفات النهائية للاستخدام المباشر في النمذجة:
library(dplyr)
set.seed(1)
# 1. إضافة المعرف الفريد
iris_prepared % mutate(row_id = row_number())
# 2. سحب مجموعة التدريب بنسبة 70%
train_data % sample_frac(0.70)
# 3. عزل مجموعة الاختبار باستخدام الربط الاستبعادي
test_data <- anti_join(iris_prepared, train_data, by = "row_id")
# 4. إزالة عمود المعرف الفريد لتنظيف البيانات النهائية
train_final % select(-row_id)
test_final % select(-row_id)
ينتج هذا السير البرمجي مجموعتي بيانات نهائيتين (train_final بعدد 105 صفوف وtest_final بعدد 45 صفاً) متطابقتين تماماً في بنية الأعمدة مع البيانات الأصلية، دون أي زوائد أو تشوهات في الفهارس، ومستعدتين فوراً للتغذية في خوارزميات التعلم الآلي.
9.3 إجراء التقسيم الطبقي المجمع باستخدام group_by() في dplyr
تتيح حزمة dplyr ميزة معمارية استثنائية تتمثل في دمج دوال التقسيم مع دالة التجميع الشهيرة group_by()، مما يسمح بإجراء أخذ عينات طبقية بمنتهى السهولة والوضوح دون الحاجة إلى استدعاء مكتبات إحصائية إضافية مثل caTools.
يتم تحقيق التقسيم الطبقي عبر تجميع البيانات أولاً وفق المتغير الفئوي المستهدف، ثم تطبيق دالة السحب العشوائي التي ستعمل تلقائياً على كل طبقة بصورة معزولة، كما توضح الشيفرة التالية:
set.seed(1)
iris_strat_prep % mutate(row_id = row_number())
# سحب 70% من كل صنف على حدة
train_strat_dplyr %
group_by(Species) %>%
sample_frac(0.70) %>%
ungroup()
# عزل مجموعة الاختبار الطبقية
test_strat_dplyr %
select(-row_id)
train_strat_dplyr % select(-row_id)
تضمن الدالة ungroup() فك التجميع بعد إتمام السحب ليعود إطار البيانات إلى حالته الطبيعية. تمنح هذه التقنية الباحث تحكماً كاملاً في موازنة الفئات المتعددة أو حتى التقسيم بناءً على تقاطع عدة متغيرات فئوية مركبة (مثل التصنيف حسب النوع والعمر معاً)، مما يجعلها واحدة من أكثر المنهجيات مرونة وقوة في بيئة R المعاصرة.
10. مقارنة شاملة وتقييم منهجي بين الطرق الثلاث
10.1 الأداء والكفاءة الحوسبية واستهلاك الذاكرة (Benchmarking)
عند تقييم الأداء والكفاءة الحوسبية لطرق تقسيم البيانات، تبرز فروق تقنية ملحوظة تتعلق بزمن التنفيذ واستهلاك الذاكرة العشوائية (RAM)، وتزداد هذه الفروق أهمية مع تضخم حجم مجموعات البيانات لتبلغ ملايين السجلات. يمكن قياس هذه الفروق بدقة مخبرية باستخدام حزمة microbenchmark في R لقياس سرعة المعالجة على مستوى النانو ثانية.
تتفوق طريقة R الأساسية (Base R) تفوقاً ساحقاً في معايير السرعة الصرفة؛ إذ تنفذ عمليات السحب والفهرسة المنطقية مباشرة في الذاكرة عبر مؤشرات لغة C دون أي استهلاك إضافي للذاكرة أو بناء هياكل وسيطة. تأتي حزمة caTools في المرتبة الثانية بكفاءة عالية جداً نظراً لاعتمادها أيضاً على كود C مجمع داخلياً لأداء التقسيم الطبقي السريع.
في المقابل، تتطلب طريقة dplyr زمناً حسابياً أطول واستهلاكاً أعلى للذاكرة، ويرجع ذلك إلى العمليات الإضافية المصاحبة؛ مثل إضافة عمود المعرف الفريد، وعمليات المقارنة والبحث المرافقة لدالة anti_join()، وعمليات التجميع وإلغاء التجميع في group_by(). على الرغم من أن هذا الفارق الزمني لا يتعدى بضعة أجزاء من الثانية في مجموعات البيانات الصغيرة والمتوسطة، إلا أنه قد يصبح عاملاً مؤثراً في بيئات الحوسبة السريعة والتطبيقات اللحظية للبيانات الضخمة.
10.2 سهولة القراءة، الصيانة، والتكامل البرمجي
تمثل سهولة قراءة الشيفرة وصيانتها معياراً محورياً في مشاريع تحليل البيانات المؤسسية والبحثية متعددة الأطراف. هنا تتجلى القوة الحقيقية لحزمة dplyr ومنظومة Tidyverse؛ إذ تتميز بأعلى درجات الوضوح التعبيري بفضل أسلوب المعالجة الأنبوبي المتسلسل والتسميات الدلالية الواضحة للدوال، مما يجعل مراجعة الكود البرمجي وتدقيقه أمراً سهلاً ومباشراً حتى لغير المتخصصين في البرمجة المتقدمة.
تتميز حزمة caTools بتقديم حل موجز ومباشر لمشكلة التقسيم الطبقي عبر سطر برمجي واحد، مما يقلل من احتمالية الأخطاء البرمجية الناتجة عن كتابة خوارزميات يدوية معقدة لوزن الفئات. وتتكامل الحزمة بشكل ممتاز مع أساليب التحليل الإحصائي التقليدية في R.
أما طريقة Base R، فرغم كفاءتها العالية، إلا أنها تتطلب فهماً عميقاً لآليات الفهرسة المنطقية بالأقواس المربعة والتعامل الدقيق مع معاملات النفي، وقد تصبح الشيفرة صعبة القراءة وعرضة للأخطاء النحوية غير المقصودة (مثل نسيان الفاصلة الإجبارية بعد الشرط المنطقي) في المشاريع البرمجية الطويلة، مما يرفع من تكلفة الصيانة البرمجية على المدى البعيد.
10.3 جدول المقارنة المعياري للاختيار بين الطرق الثلاث
يوضح الجدول المقارن التالي تقييماً شاملاً للمنهجيات الثلاث عبر المعايير التقنية والإحصائية الرئيسية لمساعدة الباحث والمطور على اتخاذ القرار الأمثل وفقاً لطبيعة المشروع البرمجي:
| المعيار التقني | Base R (دالة sample) | حزمة caTools | حزمة dplyr |
|---|---|---|---|
| التبعيات الخارجية | منعدمة تماماً (مدمجة) | تتطلب حزمة خارجية واحدة | تتطلب حزمة dplyr أو tidyverse |
| السرعة الحوسبية | فائقة السرعة ومباشرة | عالية جداً (مكتوبة بلغة C) | متوسطة إلى جيدة |
| أخذ العينات الطبقية | يتطلب كوداً برمجياً مخصصاً | مدمج وتلقائي بالكامل | متاح عبر دمج group_by() |
| استهلاك الذاكرة | منخفض للغاية ومثالي | منخفض وفعال | أعلى نسبياً بسبب العمليات الوسيطة |
| سهولة القراءة والصيانة | متوسطة (أقواس مربعة وفهارس) | جيدة جداً وموجزة | ممتازة واستثنائية (أسلوب أنبوبي) |
| الاستخدام المثالي | البيئات المقيدة والإنتاجية | مشكلات التصنيف غير المتوازنة | خطوط معالجة Tidyverse الشاملة |
يتبين من المقارنة أن اختيار الأداة المناسبة يرتبط بطبيعة التحدي التحليلي المطروح؛ حيث تظل Base R الخيار الأفضل للكفاءة والإنتاج المستقل، وcaTools الخيار المفضل لتصنيف الفئات الحساسة، بينما تتربع dplyr على عرش التجارب الاستكشافية وسلاسل التحليل المتكاملة.
11. أفضل الممارسات والأخطاء الشائعة أثناء تقسيم البيانات في R
11.1 تجنب الأخطاء المنهجية الشائعة في التقسيم
يقع العديد من الممارسين والباحثين في أخطاء منهجية متكررة أثناء مرحلة تقسيم البيانات قد تعصف بموثوقية النموذج بأكمله. يأتي في صدارة هذه الأخطاء إهمال تثبيت البذرة العشوائية عبر set.seed()، مما يؤدي إلى توليد مجموعات تدريب واختبار مختلفة في كل تشغيل للكود البرمجي، الأمر الذي يجعل من المستحيل تتبع التغيرات في دقة النموذج أو عزل أسباب تحسن أدائه الإحصائي بدقة علمية قابلة للمقارنة.
الخطأ الشائع الثاني هو تطبيق التقسيم العشوائي البسيط دون فحص توزيع المتغير المستهدف، خاصة في البيئات التي تتسم بظاهرة عدم توازن الفئات الحاد. يؤدي هذا التجاهل في كثير من الأحيان إلى وقوع معظم حالات الفئة النادرة في مجموعة التدريب وخلو مجموعة الاختبار منها تماماً، أو العكس، مما يعطي انطباعاً خادعاً بدقة النموذج بينما هو في الواقع عاجز تماماً عن التنبؤ بالظاهرة الحقيقية.
أما الخطأ المنهجي الأخطر فهو تطبيق التقسيم العشوائي المستقل على بيانات السلاسل الزمنية (Time Series) أو البيانات ذات التبعية المكانية؛ حيث يفترض التقسيم العشوائي استقلالية المشاهدات وتطابق توزيعها (i.i.d Assumption). في السلاسل الزمنية، يؤدي التقسيم العشوائي إلى استخدام مشاهدات من المستقبل للتنبؤ بالماضي، وهو تسرب زمني فادح يقتضي استبداله حصراً بتقنيات التقسيم الزمني التراكمي الموجه (Rolling Window or Time-Based Splitting).
11.2 الترتيب الصحيح لخطوات هندسة الميزات والتقسيم
تقتضي النزاهة الإحصائية الالتزام الصارم بالتسلسل الزمني والمنطقي لخطوات المعالجة المسبقة وهندسة الميزات لتفادي أي شكل من أشكال تسرب البيانات. تفرض القاعدة المنهجية الذهبية أن يتم التقسيم كأول خطوة فورية تلي الفحص الهيكلي الأولي للبيانات، وقبل تنفيذ أي عملية تحويل رياضي تعتمد على توزيعات العينة.
عند الحاجة إلى إجراء عمليات التقييس والمعايرة (Feature Scaling and Normalization)، مثل حساب الدرجات المعيارية Z-Scores، يجب حساب المتوسط الحسابي والانحراف المعياري حصرياً من مجموعة التدريب. بعد ذلك، يتم استخدام هذه القيم الإحصائية المحسوبة مسبقاً من التدريب لتطبيق التحويل الرياضي على مجموعة الاختبار، دون السماح لبيانات الاختبار بالتأثير على حساب المتوسط أو الانحراف المعياري المستقل.
ينطبق نفس المبدأ الصارم على معالجة القيم المفقودة (Missing Data Imputation) وهندسة الميزات التجميعية، وكذلك اختيار الميزات (Feature Selection). يجب أن تتم جميع هذه العمليات التحويلية داخل حدود مجموعة التدريب فقط، ثم تُطبق المعاملات الناتجة تحويلياً على مجموعة الاختبار كأنها بيانات خارجية واردة من المستقبل، وهو ما يضمن محاكاة حقيقية وصادقة للأداء التنبؤي للنموذج عند نشره الفعلي.
11.3 توثيق عمليات التقسيم في التقارير الأكاديمية القابلة للنشر
تشترط المعايير الأكاديمية والبحثية المتقدمة توثيقاً دقيقاً وشاملاً لكل خطوة من خطوات معالجة وتقسيم البيانات لضمان الشفافية المطلقة وتمكين المجتمع العلمي من تدقيق ومحاكاة التجارب المنشورة. يجب أن يتضمن قسم المنهجية في أي ورقة بحثية أو تقرير فني تفاصيل واضحة تشمل: النسبة المئوية المختارة للتقسيم وتبريرها الإحصائي، وقيمة البذرة العشوائية المستخدمة في set.seed()، والخوارزمية المعتمدة في التقسيم وما إذا تم تطبيق أخذ عينات عشوائية بسيطة أم طبقية.
من الممارسات الأكاديمية الموصى بها بشدة تقديم جدول إحصائي مقارن يوضح التوزيع التكراري والخصائص الإحصائية الوصفية (المتوسط، الانحراف المعياري، المدى الربيعي) للمتغيرات الأساسية عبر مجموعتي التدريب والاختبار مقارنة بالبيانات الأصلية. يثبت هذا الجدول للقراء والمراجعين عدم حدوث أي انحياز منهجي أو تشوه في بنية البيانات نتيجة لعملية التقسيم السحبية.
وأخيراً، يتعين توثيق البيئة البرمجية الكاملة عبر إرفاق مخرجات sessionInfo() أو إنشاء بيئة عمل قابلة للاستنساخ باستخدام حزم إدارة المشاريع مثل renv، مما يضمن تثبيت إصدارات R والحزم الإحصائية المعتمدة وحماية البحث العلمي من التغيرات البرمجية المستقبلية عبر المنصات الحوسبية المتنوعة.
12. الخاتمة والآفاق المتقدمة لتقسيم البيانات والتحقق المتقاطع في R
12.1 خلاصة المنهجيات والنتائج المستخلصة
استعرض هذا الدليل التحليلي الشامل المنهجيات الثلاث الرئيسية لتقسيم البيانات إلى مجموعات تدريب واختبار داخل بيئة R الحوسبية، مسلطاً الضوء على الخصائص الهيكلية والرياضية لكل أسلوب. لقد تبين بوضوح أن دوال البيئة الأساسية (Base R) توفر حلاً فائق السرعة وعديم التبعيات يناسب الأنظمة الإنتاجية الخفيفة ومجموعات البيانات الهائلة التي لا تتطلب موازنة فئوية معقدة.
في المقابل، أثبتت حزمة caTools جدارتها التقنية في معالجة مشكلات التصنيف عبر دالتها المتخصصة sample.split()، والتي تضمن أخذ عينات طبقية تحافظ على التوزيع النسبي الدقيق لفئات المتغير المستهدف في كلا المجموعتين وتمنع انحياز النماذج التنبؤية. بينما قدمت حزمة dplyr المنهجية الأكثر مرونة وأناقة لمسارات العمل التحليلية الحديثة، حيث تجمع بين وضوح الشيفرة، وسلاسة العمليات الأنبوبية، والقدرة الفائقة على أداء التقسيم الطبقي المجمع والربط الاستبعادي المتقدم anti_join().
يؤكد هذا التنوع البرمجي في R على ثراء المنظومة الإحصائية وقدرتها على تلبية مختلف الاحتياجات البحثية والتطبيقية، مشدداً على أن التقسيم المتقن ليس مجرد خطوة إجرائية عابرة، بل هو الركيزة المنهجية الأولى التي تُبنى عليها مصداقية الاستنتاجات الإحصائية ونماذج تعلم الآلة بالكامل.
12.2 الانتقال من التقسيم الفردي إلى التحقق المتقاطع (k-Fold Cross-Validation)
على الرغم من الأهمية الجوهرية لتقسيم البيانات الأحادي (Train/Test Split)، إلا أنه يواجه محدودية إحصائية واضحة عند التعامل مع مجموعات البيانات الصغيرة أو المتوسطة الحجم؛ حيث تصبح نتائج تقييم النموذج شديدة الحساسية والتباين اعتماداً على التوزيع العشوائي الخاص بتلك العينة الفردية. لتجاوز هذه المحدودية، ينتقل التحليل الإحصائي المتقدم نحو تقنيات التحقق المتقاطع (k-Fold Cross-Validation).
يقوم التحقق المتقاطع بتجزئة البيانات إلى (k) من الأجزاء المتساوية (عادة 5 أو 10 أجزاء)، حيث يتم تدريب النموذج على (k-1) من الأجزاء واختباره على الجزء المتبقي، وتتكرر هذه العملية بالتناوب (k) من المرات حتى تُختبر جميع المشاهدات بدقة. يتيح حساب متوسط أداء النموذج عبر جميع التكرارات تقديراً بالغ الاستقرار والدقة لخطأ التعميم، ويخفض التباين الإحصائي الناتج عن التقسيم الأحادي البسيط.
توفر بيئة R الحديثة أطر عمل متقدمة لإدارة عمليات التحقق المتقاطع المتكرر والطبقي، وعلى رأسها حزمة rsample المنضوية تحت منظومة Tidymodels وحزمة caret، والتي تمثل الامتداد الطبيعي والتطوير المنهجي المتقدم لمفاهيم تقسيم البيانات الأساسية المستعرضة في هذا المقال.
12.3 خارطة طريق لتطوير مهارات تحليل البيانات والنمذجة في R
يمثل إتقان مهارات تقسيم البيانات في R الخطوة التأسيسية الأولى في مسار احتراف التعلم الإحصائي وتعلم الآلة. وللانتقال نحو مراحل النمذجة المتقدمة، يُنصح الباحث والمحلل بتوسيع مهاراته البرمجية لتشمل استيعاب بيئة tidymodels المعاصرة، والتي توحد واجهات بناء النماذج، وضبط المعاملات الفوقية، وتطبيق خطوط المعالجة المسبقة المحمية ضد تسرب البيانات عبر حزمة recipes.
كما يُوصى بالتعمق في دراسة المراجع الأكاديمية المعيارية التي تؤصل للمفاهيم الرياضية المصاحبة لتقييم النماذج ومقايضة الانحياز والتباين، والاستمرار في تطبيق معايير النزاهة والشفافية الإحصائية عبر إدارة العشوائية وتوثيق التجارب البرمجية. إن التمكن من هذه الأدوات والمنهجيات يمنح الباحث القدرة على بناء حلول تنبؤية موثوقة تسهم بفاعلية في حل المشكلات العلمية والتطبيقية المعقدة في مختلف مجالات المعرفة المعاصرة.
References
- Breiman, L., Friedman, J. H., Olshen, R. A., & Stone, C. J. (1984). Classification and regression trees. Wadsworth & Brooks/Cole Advanced Books & Software.
- Hastie, T., Tibshirani, R., & Friedman, J. (2009). The elements of statistical learning: Data mining, inference, and prediction (2nd ed.). Springer. https://doi.org/10.1007/978-0-387-84858-7
- James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An introduction to statistical learning: With applications in R (2nd ed.). Springer. https://doi.org/10.1007/978-1-0716-1418-1
- Kuhn, M., & Johnson, K. (2013). Applied predictive modeling. Springer. https://doi.org/10.1007/978-1-4614-6849-3
- Kuhn, M., & Silge, J. (2022). Tidy modeling with R: A framework for modeling in the tidyverse. O’Reilly Media. https://www.tmwr.org/
- Matsumoto, M., & Nishimura, T. (1998). Mersenne twister: A 623-dimensionally equidistributed uniform pseudo-random number generator. ACM Transactions on Modeling and Computer Simulation, 8(1), 3–30. https://doi.org/10.1145/272991.272995
- R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
- Tuszynski, J. (2023). caTools: Tools: moving window statistics, GIF, Base64, ROC AUC, etc. (R package version 1.18.2). https://CRAN.R-project.org/package=caTools
- Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., … Yutani, H. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686
- Wickham, H., François, R., Henry, L., & Müller, K. (2023). dplyr: A grammar of data manipulation (R package version 1.1.4). https://CRAN.R-project.org/package=dplyr