الإحصاء والبرمجةتحليل البيانات

كيفية إنشاء رسم بياني للبواقي في بايثون

دليل أكاديمي شامل يوضح كيفية إنشاء وتفسير مخطط البواقي (Residual Plot) في بايثون للتحقق من كفاءة وافتراضات نماذج الانحدار الخطي.

تاريخ النشر

يُعد تحليل الانحدار الإحصائي أحد الركائز الجوهرية في علوم البيانات والتعلم الآلي الكلاسيكي، حيث يُسهم في تفسير العلاقات المعقدة بين المتغيرات وتوقع النتائج المستقبلية بدقة. ومع ذلك، فإن نجاح النموذج الإحصائي لا يُقاس فقط بمؤشرات الأداء العامة مثل معامل التحديد ($R^2$) أو متوسط مربعات الأخطاء (MSE)، بل يتطلب تحققاً عميقاً وصارماً من تلبية البيانات للفرضيات الرياضية الأساسية التي يقوم عليها النموذج، مثل خطية العلاقة، وتجانس تباين الأخطاء، واستقلاليتها وتوزيعها الطبيعي.

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

توفر لغة البرمجة بايثون منظومة متكاملة ومتطورة من المكتبات المتخصصة في التحليل الإحصائي والتصور البياني، مثل Statsmodels، وScikit-Learn، وMatplotlib، وSeaborn، بالإضافة إلى أدوات متقدمة مثل Yellowbrick. يستهدف هذا المقال تقديم دليل أكاديمي شامل ومفصل يتناول كيفية إنشاء مخطط البواقي في بايثون وفهمه وتفسيره نقدياً، بدءاً من الأسس الرياضية العميقة للبواقي وانتهاءً باستراتيجيات المعالجة المتقدمة للتشوهات وتطبيق مسار عمل تحليلي متكامل.

1. مفهوم مخطط البواقي (Residual Plot) وأهميته الإحصائية

1.1 تعريف البواقي الرياضية (Residuals)

تُمثل البواقي الرياضية في سياق الانحدار الخطي الفروق الفردية المحسوبة بين القيم الفعلية المرصودة للمتغير التابع والقيم المقدرة أو المتوقعة التي ينتجها النموذج الإحصائي. من الناحية الرياضية الصارمة، يُعبر عن الباقي للمشاهدة رقم $i$ بالمعادلة: $e_i = y_i – \hat{y}_i$، حيث يمثل $y_i$ القيمة الحقيقية للمتغير التابع، بينما يمثل $\hat{y}_i$ القيمة المتنبأ بها الناتجة عن تعويض قيم المتغيرات التفسيرية في معادلة الانحدار المقدرة. تعكس هذه القيمة مقدار الخطأ الذي عجز النموذج الرياضي عن استيعابه أو تفسيره من خلال المتغيرات المستقلة المتاحة، وتعتبر بمثابة المقابل التجريبي العيني للخطأ العشوائي النظري ($\epsilon_i$) غير القابل للرصد المباشر في المجتمع الإحصائي الأصلي.

تكتسب البواقي دلالة إحصائية جوهرية بوصفها مقياساً نقياً للتباين غير المفسر؛ فإذا كان النموذج قد استخلص كافة المعلومات الهيكلية والأنماط النظامية الكامنة في مجموعة البيانات، فإن ما يتبقى (أي البواقي) يجب أن يحمل خصائص الضوضاء البيضاء العشوائية البحتة (White Noise). يتضمن التحليل الإحصائي التمييز الدقيق بين البواقي العادية الخام (Raw Residuals) والبواقي المقيسة أو المعيارية (Standardized Residuals) والبواقي الطالبية (Studentized Residuals). تُحسب البواقي المعيارية بقسمة الباقي الخام على الانحراف المعياري المقدر للنموذج، بينما تأخذ البواقي الطالبية في الحسبان تباين النقطة المفردة وموقعها في فضاء المتغيرات التفسيرية عبر مصفوفة الإسقاط (Hat Matrix)، مما يجعلها أداة بالغة الحساسية لاكتشاف المشاهدات غير الطبيعية وتوحيد مقاييس المقارنة عبر النماذج المختلفة.

تؤدي دراسة البواقي دوراً محورياً في تقييم جودة توفيق النموذج الإحصائي (Goodness-of-Fit)، حيث تكشف عن مدى اتساق البنية الرياضية المفترضة مع السلوك الواقعي للظاهرة المدروسة. إن تقييم النموذج لا يقتصر على تعظيم قدرته التفسيرية، بل يتطلب التأكد من أن التقديرات الناتجة غير منحازة وفعالة بالمعنى الإحصائي الدقيق (BLUE – Best Linear Unbiased Estimator)، وهو ما لا يمكن التثبت منه إلا عبر فحص سلوك البواقي وخصائص توزيعها الاحتمالي.

1.2 الغرض المنهجي من استخدام مخطط البواقي

يتمثل الغرض المنهجي الأساسي من إنشاء مخطط البواقي في إجراء تقييم بصري دقيق وشامل لمدى ملاءمة النموذج الرياضي المختار للبيانات التجريبية. يُرسم المخطط عادةً بوضع القيم المتوقعة أو المجهزة ($\hat{y}$) على المحور الأفقي، بينما توضع البواقي ($e$) على المحور الرأسي، مع رسم خط أفقي مرجعي يمر بنقطة الصفر. يتيح هذا التمثيل البصري الفوري رصد أي انحراف منهجي عن السلوك العشوائي المتوقع؛ إذ إن النموذج الخطي الصحيح يجب أن يولد سحابة نقطية مشتتة بانتظام وعشوائية متماثلة حول الخط الصفري، دون إظهار أي تشكيلات هندسية منتظمة كالمخاريط أو المنحنيات القطعية.

يُسهم المخطط في الكشف المبكر عن التشوهات الهيكلية في العلاقات بين المتغيرات، مثل وجود علاقات غير خطية جرى اختزالها قسراً في معادلة خطية بسيطة، أو وجود تأثيرات تفاعلية مهملة بين المتغيرات التفسيرية. كما يساعد المخطط في تحديد المشكلات الإحصائية المعقدة كعدم ثبات تباين الأخطاء والارتباط الذاتي بين المشاهدات، وهي مشكلات تؤدي، في حال تجاهلها، إلى تضليل فترات الثقة، وتضخيم قيم الدلالة الإحصائية لاختبارات الفروض (مثل اختبارات $t$ واختبارات $F$)، مما يجعل الاستنتاجات العلمية الناتجة عرضة للخطأ من النوع الأول (Type I Error).

علاوة على ذلك، يدعم مخطط البواقي القرارات المنهجية المتعلقة بالحاجة إلى إعادة صياغة النموذج، مثل إضافة حدود تربيعية أو تكعيبية (Polynomial Terms)، أو تطبيق تحويلات رياضية على المتغير التابع (مثل التحويل اللوغاريتمي أو تحويل Box-Cox)، أو استبعاد بعض المتغيرات أو التحول إلى أساليب انحدار متينة غير معلمية قادرة على استيعاب تعقيدات البيانات الفعلية دون تشويه بنيوي.

Residual vs. fitted plot
Residual vs. fitted plot

1.3 موقع المخطط ضمن مراحل تشخيص النماذج

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

يتكامل الفحص البصري عبر مخططات البواقي مع الاختبارات الإحصائية الفرضية العددية، مثل اختبار بروش-باغان (Breusch-Pagan) لفحص تجانس التباين، واختبار دوربين-واتسون (Durbin-Watson) للارتباط الذاتي، واختبار شابيرو-ويلك (Shapiro-Wilk) للاعتدالية. ومع أن هذه الاختبارات توفر قيماً احتمالية ($p$-values) قاطعة، إلا أنها قد تتأثر بشدة بحجم العينة؛ ففي العينات الكبيرة جداً، قد تصبح الاختبارات الفرضية حساسة للغاية للانحرافات الطفيفة غير الجوهرية، بينما تفقد قوتها الاختبارية في العينات الصغيرة. من هنا يبرز الفحص البصري كأداة تكميلية توفر سياقاً نوعياً يوضح طبيعة الخلل وحجمه وموقعه الدقيق عبر نطاق القيم المتوقعة.

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

2. الافتراضات الإحصائية للإنحدار الخطي المرتبطة بالبواقي

2.1 فرضية الخطية (Linearity)

تفترض طريقة المربعات الصغرى العادية (Ordinary Least Squares – OLS) أن العلاقة بين المتغير التابع والمتغيرات المستقلة هي علاقة خطية في المعلمات (Linear in Parameters). تعني هذه الفرضية رياضياً أن التغير المتوقع في المتغير التابع الناتج عن تغير وحدة واحدة في متغير مستقل معين يظل ثابتاً بغض النظر عن مستوى ذلك المتغير، بشرط ثبات باقي المتغيرات في النموذج. يُعد التحقق من هذه الفرضية شرطاً أساسياً لضمان صحة التقديرات وتفسير المعاملات بوصفها معدلات تغير حقيقية تعبر عن الظاهرة محل الدراسة.

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

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

2.2 تجانس التباين (Homoscedasticity) مقابل عدم التجانس (Heteroscedasticity)

تنص فرضية تجانس التباين (Homoscedasticity) على أن تباين حدود الخطأ العشوائي يجب أن يكون ثابتاً وموحداً عبر جميع مستويات وتوليفات المتغيرات المستقلة، أي أن $\text{Var}(\epsilon_i | X) = \sigma^2$ لجميع المشاهدات $i$. تضمن هذه الفرضية أن كل نقطة بيانات تقدم نفس القدر من المعلومات والوثوقية الإحصائية للنموذج، مما يبرر إعطاء أوزان متساوية لجميع المشاهدات في خوارزمية تقدير المربعات الصغرى.

تتضح ظاهرة عدم تجانس التباين (Heteroscedasticity) بصرياً في مخطط البواقي من خلال تشتت يتغير حجمه بانتظام عبر المحور الأفقي؛ وغالباً ما يتخذ هذا التشتت شكل مروحة أو قمع (Funnel or Cone Shape)، حيث تكون البواقي متقاربة جداً من الخط الصفري عند القيم المتوقعة المنخفضة ثم تتسع الفجوة ويزداد التباعد بشكل تصاعدي حاد مع زيادة القيم المتوقعة، أو العكس. تشيع هذه الظاهرة في البيانات الاقتصادية والمالية حيث يزداد تباين الإنفاق مثلاً مع زيادة الدخل الإجمالي للأسر أو الشركات.

على الرغم من أن عدم تجانس التباين لا يسبب انحيازاً في قيم معاملات الانحدار المقدرة بذاتها (تظل التقديرات غير منحازة)، إلا أنه يقود إلى فقدان خاصية الكفاءة الرياضية (Efficiency)، مما يعني أن تباينات المعاملات لم تعد هي الأصغر بين فئات المقدرات الخطية غير المنحازة. والأخطر من ذلك، أن تباينات المعاملات المحسوبة بالطرق التقليدية تصبح مقدرات غير متسقة ومنحازة، مما يؤدي إلى تشويه حساب الأخطاء المعيارية (Standard Errors)، وبالتالي إبطال مصداقية اختبارات الفروض الإحصائية ($t$-tests و $F$-tests) وفترات الثقة المرتبطة بها، مما يرفع احتمالية قبول فرضيات خاطئة أو رفض فرضيات صحيحة.

2.3 استقلالية الأخطاء والتوزيع الطبيعي

تشترط منهجية الانحدار الخطي الكلاسيكي استقلالية حدود الأخطاء العشوائية عن بعضها البعض، أي انعدام التباين المشترك أو الارتباط الذاتي بين البواقي ($\text{Cov}(\epsilon_i, \epsilon_j) = 0$ لكل $i \neq j$). يُعد هذا الافتراض جوهرياً في بيانات السلاسل الزمنية والبيانات المقطعية المرتبة مكانياً؛ إذ إن وجود الارتباط الذاتي (Autocorrelation) يشير إلى أن الخطأ في فترة معينة ينقل أثره إلى الفترات اللاحقة، وهو ما يظهر في مخطط البواقي كمسارات متتالية من البواقي الموجبة المتتابعة تليها سلاسل من البواقي السالبة، بدلاً من التناوب العشوائي الحر حول الصفر.

بالإضافة إلى ذلك، تفترض مبرهنة الاستدلال الإحصائي في النماذج الخطية أن الأخطاء العشوائية تتبع توزيعاً طبيعياً معتدلاً بمتوسط حسابي يساوي صفراً وتباين ثابت، أي $\epsilon \sim \mathcal{N}(0, \sigma^2)$. لا يؤثر عدم اعتدالية الأخطاء بشكل جوهري على خاصية عدم الانحياز للمعاملات في العينات الكبيرة وفق نظرية النهاية المركزية (Central Limit Theorem)، ولكنه يمثل تحدياً بالغ الخطورة في العينات الصغيرة إلى المتوسطة الحجم، حيث تعتمد صحة فترات التنبؤ وفترات الثقة واختبارات المعنوية المباشرة اعتماداً كلياً على التوزيع الطبيعي الدقيق للأخطاء.

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

3. إعداد بيئة العمل وتثبيت المكتبات البرمجية في بايثون

3.1 تهيئة بيئة بايثون وحزم البيانات الأساسية

يتطلب التحليل الإحصائي الرصين وبناء النماذج التشخيصية إعداد بيئة عمل برمجية مستقرة ومتوافقة. تُعد بيئات العمل التفاعلية مثل Jupyter Notebook أو JupyterLab، بالإضافة إلى المنصات السحابية مثل Google Colab، من أفضل البيئات لتنفيذ سير عمل متكامل يدمج التحليل الرياضي مع التمثيل البصري والتوثيق المنهجي المباشر. يسمح استخدام البيئات الافتراضية (Virtual Environments) عبر أدوات مثل venv أو conda بعزل الاعتماديات البرمجية وتجنب تضارب الإصدارات بين الحزم المختلفة.

تبدأ تهيئة بيئة العمل باستدعاء وتثبيت الحزم الأساسية لمعالجة البيانات الرياضية والمصفوفات. تُعد مكتبة NumPy حجر الزاوية للعمليات الجبرية والحسابية الموجهة في بايثون؛ إذ توفر كائنات المصفوفات متعددة الأبعاد (Arrays) ودوال التوزيعات الاحتمالية والعمليات الرياضية السريعة المنفذة بلغة C. بجانبها، تبرز مكتبة Pandas كأداة لا غنى عنها لإدارة وهيكلة مجموعات البيانات المعقدة عبر كائنات إطارات البيانات (DataFrames)، مما يسهل معالجة السلاسل الزمنية، وتنظيف المتغيرات، وإجراء عمليات الفلترة والتحويل الرياضي بكفاءة عالية.

يمكن تثبيت هذه الحزم الأساسية في بيئة العمل البرمجية باستخدام مدير الحزم القياسي من خلال تشغيل الأمر المباشر التالي في سطر الأوامر:

pip install numpy pandas

يضمن هذا التثبيت المسبق توفير البنية التحتية اللازمة للتعامل مع البيانات وتنظيمها قبل تغذيتها إلى خوارزميات الانحدار ونماذج التصور الإحصائي.

3.2 مكتبات النمذجة والتصور الإحصائي

يتطلب إنشاء وتحليل مخططات البواقي استخدام مكتبات متخصصة في شقين متكاملين: النمذجة الإحصائية المتقدمة، والتصوير البياني البياني الاحترافي. في جانب النمذجة الإحصائية الصارمة، تحتل مكتبة Statsmodels موقع الصدارة؛ حيث تم تصميمها خصيصاً لتوفير مخرجات إحصائية شاملة تتضمن جداول تحليل التباين (ANOVA)، ومعاملات الانحدار، والأخطاء المعيارية، والقيم الاحتمالية، وأدوات تشخيص البواقي المتقدمة مثل البواقي الطالبية ومسافات كوك واختبارات الفروض الكلاسيكية.

في المقابل، تُعد مكتبة Scikit-Learn المعيار الصناعي والبحثي الأبرز في تطبيقات التعلم الآلي وهندسة الخصائص؛ وتتميز ببنيتها البرمجية الموحدة لتدريب النماذج، والتنبؤ، وإجراء عمليات التحقق المتقاطع (Cross-Validation). أما في جانب التصوير البياني، فتمثل مكتبة Matplotlib المحرك الأساسي للرسوم البيانية في بايثون، موفرةً تحكماً كاملاً في كافة التفاصيل الدقيقة للأشكال والمحاور، في حين تأتي مكتبة Seaborn مبنيةً فوق Matplotlib لتقدم واجهة برمجية رفيعة المستوى متخصصة في التصور الإحصائي الجذاب والمخططات التشخيصية المعقدة بأسلوب موجز. بالإضافة إلى ذلك، تقدم مكتبة Yellowbrick أدوات بصرية مخصصة للتعلم الآلي تدمج بين خوارزميات Scikit-Learn والتمثيل البصري الفوري لتشخيص النماذج.

لتثبيت كافة هذه الأدوات المتخصصة دفعة واحدة في بيئة العمل، يُنفذ الأمر التالي:

pip install statsmodels scikit-learn matplotlib seaborn yellowbrick

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

4. تجهيز وهيكلة مجموعة البيانات للتحليل

4.1 إنشاء وتنظيف إطار البيانات (DataFrame)

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

تعتبر معالجة القيم المفقودة (Missing Values) خطوة حاسمة؛ إذ تتطلب نماذج الانحدار التقليدية مصفوفات بيانات مكتملة. يمكن للباحثين التعامل مع الفقدان عبر الحذف المباشر (Listwise Deletion) في حال كانت نسبة الفقد ضئيلة وعشوائية تماماً (MCAR)، أو استخدام تقنيات التعويض الإحصائي المتقدم (Imputation) بالمتوسط أو الوسيط أو عبر خوارزميات أقرب الجيران (KNN). كما يجب في هذه المرحلة فحص القيم المتطرفة الأولية (Outliers) باستخدام المخططات الصندوقية ومقاييس المدى الربيعي (IQR) لفهم ما إذا كانت هذه القيم ناتجة عن أخطاء في الإدخال والقياس أم أنها تمثل تبايناً حقيقياً أصيلاً في الظاهرة المدروسة يجب الحفاظ عليه ونمذجته بعناية.

يوضح المقطع البرمجي التالي كيفية توليد إطار بيانات تركيبي منظم يحتوي على متغيرات تفسيرية متعددة ومتغير تابع، مع تضمين علاقات خطية وضوضاء عشوائية منضبطة:

import numpy as np
import pandas as pd
# ضبط البذرة العشوائية لضمان تكرارية النتائج
np.random.seed(42)
# توليد 250 مشاهدة لمتغيرين مستقلين
n_samples = 250
x1 = np.random.uniform(10, 50, size=n_samples)
x2 = np.random.normal(100, 15, size=n_samples)
# توليد حد خطأ عشوائي يتبع توزيعاً طبيعياً مع تباين ثابت
error = np.random.normal(loc=0.0, scale=8.0, size=n_samples)
# تركيب المتغير التابع بناءً على معادلة خطية محددة
y = 15.0 + (2.5 * x1) - (0.8 * x2) + error
# إنشاء إطار البيانات وتنظيمه
df = pd.DataFrame({'Feature_1': x1, 'Feature_2': x2, 'Target': y})
print(df.head())

يوفر هذا التجهيز المنظم قاعدة صلبة ومتحكماً بها تمكننا من تتبع سلوك البواقي ومقارنتها بالافتراضات الرياضية النظرية بدقة تامة.

4.2 تعريف المتغيرات التابعة والمستقلة

تتطلب المرحلة اللاحقة تحديداً دقيقاً ومفصولاً للبنية الرياضية للنموذج من خلال فصل مصفوفة المتغيرات التفسيرية أو المستقلة (التي يُرمز لها رياضياً بالمصفوفة $X$) عن شعاع المتغير التابع أو المستهدف (الذي يُرمز له بالشعاع $y$). يُعد هذا التمييز ضرورياً لتهيئة البيانات للتغذية في دوال التقدير الإحصائي وخوارزميات المربعات الصغرى.

في سياق النمذجة التنبؤية والتعلم الآلي، يُفضل عادةً تقسيم مجموعة البيانات إلى مجموعتي تدريب واختبار (Train-Test Split)، مثلاً بنسبة 80% للتدريب و20% للاختبار، لتقييم قدرة النموذج على التعميم وفحص بواقي التنبؤ على بيانات غير مسبوقة. بينما في سياق الاستدلال الإحصائي الوصفي والتشخيص الأكاديمي، قد يُفضل استخدام كامل مجموعة البيانات لتقدير معاملات النموذج وفحص مدى توافقه الداخلي مع الفرضيات الكلاسيكية. كما يشتمل هذا الإجراء على إجراء فحص استكشافي وصفي للمتغيرات عبر مصفوفة الارتباط (Correlation Matrix) للتحقق من عدم وجود ارتباط خطي متعدد حاد (Multicollinearity) بين المتغيرات المستقلة ذاتها قبل الشروع في النمذجة.

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

# فصل المتغيرات التفسيرية (X) والمتغير التابع (y)
X = df[['Feature_1', 'Feature_2']]
y = df['Target']
# إجراء فحص وصفي إحصائي أولي للمتغيرات
descriptive_stats = df.describe()
print(descriptive_stats)

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

5. بناء نموذج الانحدار الخطي وحساب البواقي باستخدام Statsmodels

5.1 تطبيق طريقة المربعات الصغرى العادية (OLS)

تُعد حزمة statsmodels.api الخيار الأكاديمي الأمثل لبناء نماذج الانحدار الخطي في بايثون، نظراً لتركيزها على التقدير الإحصائي الصارم وتقديم تقارير تحليلية شاملة. عند التعامل مع دالة المربعات الصغرى sm.OLS، من الضروري الانتباه إلى نقطة تقنية أساسية: لا تقوم الدالة بإضافة الحد الثابت (Intercept / Constant $\beta_0$) تلقائياً إلى مصفوفة المتغيرات المستقلة، بل تفترض افتراضياً أن خط الانحدار يمر بنقطة الأصل ما لم يتم توجيهها لخلاف ذلك.

لضمان صحة النموذج وتقدير الحد الثابت، يجب استخدام الدالة sm.add_constant() التي تضيف عموداً من الآحاد إلى مصفوفة المتغيرات التفسيرية. بعد ذلك، يتم إنشاء كائن النموذج واستدعاء الدالة fit() لتطبيق طريقة المربعات الصغرى وحساب التقديرات الإحصائية. ينتج عن هذه العملية كائن نتائج (RegressionResultsWrapper) يحتوي على كم هائل من المؤشرات التشخيصية والمعاملات واختبارات الدلالة الإحصائية.

يوضح الكود التالي كيفية بناء النموذج وتدريبه واستعراض تقرير النتائج الكامل:

import statsmodels.api as sm
# إضافة الحد الثابت إلى مصفوفة المتغيرات المستقلة
X_with_const = sm.add_constant(X)
# بناء نموذج المربعات الصغرى العادية وملاءمته
ols_model = sm.OLS(y, X_with_const)
results = ols_model.fit()
# استعراض ملخص النتائج الإحصائية الشاملة
print(results.summary())

يقدم تقرير الملخص (Summary) تقييماً أولياً لجودة النموذج من خلال معامل التحديد وقيم اختبار $F$ وقيم $t$ الاحتمالية لكل متغير، مما يوفر أرضية صلبة للانتقال إلى المرحلة التالية المتمثلة في استخراج البواقي وتشخيصها.

5.2 استخراج القيم المتوقعة والبواقي برمجياً

بعد نجاح عملية ملاءمة النموذج، يوفر كائن النتائج في Statsmodels خصائص مباشرة لاستخراج القيم التنبؤية المجهزة (Fitted / Predicted Values) وقيم البواقي الخام لكل مشاهدة في مجموعة البيانات. يتم استخراج القيم المتوقعة عبر الخاصية results.fittedvalues، في حين تُستخرج البواقي المحسوبة ($y – \hat{y}$) عبر الخاصية results.resid.

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

يمكن استخراج وتخزين هذه البيانات برمجياً عبر الكود المباشر التالي:

# استخراج القيم المجهزة والبواقي وتخزينها في إطار البيانات
df['Fitted_Values'] = results.fittedvalues
df['Residuals'] = results.resid
# معاينة البواقي والقيم المتوقعة للمشاهدات الأولى
print(df[['Target', 'Fitted_Values', 'Residuals']].head())

تُشكل هذه القيم الأساس الرقمي المباشر الذي تُبنى عليه الرسوم البيانية التشخيصية للبواقي عبر مختلف مكتبات التصوير البياني في بايثون.

5.3 حساب البواقي الموحدة والمعيارية

على الرغم من الفائدة التحليلية للبواقي الخام، إلا أنها ترتبط بوحدات قياس المتغير التابع، مما يجعل من الصعب وضع عتبات موحدة وثابتة للحكم على مدى شذوذ الباقي أو بعده الإحصائي الحرج. للتغلب على هذه المشكلة، يلجأ الإحصائيون إلى استخدام البواقي المعيارية (Standardized Residuals) والبواقي الطالبية (Studentized Residuals).

توفر Statsmodels فئة تشخيصية متقدمة تُعرف باسم OLSInfluence، والتي يمكن الوصول إليها عبر results.get_influence(). تتيح هذه الفئة حساب البواقي الطالبية المحذوفة خارجياً (Studentized Deleted Residuals) أو داخلياً؛ حيث تأخذ هذه المقاييس في الاعتبار قيمة الرافعة (Leverage $h_{ii}$) لكل نقطة عبر قطر مصفوفة الإسقاط. تتبع البواقي الطالبية توزيع $t$ لستيودنت، مما يجعل أي باقٍ يتجاوز القيمة المطلقة $\pm 2$ أو $\pm 3$ مؤشراً قوياً على وجود نقطة شاذة (Outlier) تستحق الفحص المنهجي الدقيق.

يوضح المثال التالي كيفية حساب البواقي الطالبية وتخزينها في إطار البيانات:

# الحصول على كائن التأثير والتشخيص
influence = results.get_influence()
# استخراج البواقي الطالبية داخلياً وخارجياً
df['Studentized_Residuals'] = influence.resid_studentized_internal
# تحديد المشاهدات التي تتجاوز العتبة الحرجة (+2 أو -2)
potential_outliers = df[np.abs(df['Studentized_Residuals']) > 2]
print(f"عدد المشاهدات المشتبه في كونها قيماً شاذة: {len(potential_outliers)}")

يمكّن هذا الإجراء المعياري من توحيد مقاييس الحكم الإحصائي، مما يعزز دقة التشخيص البصري والكمي على حد سواء.

6. إنشاء مخطط البواقي باستخدام مكتبة Seaborn

6.1 التطبيق المباشر عبر دالة residplot

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

تتميز هذه الدالة بالعديد من الخيارات البارمة القوية؛ إذ تتيح رسم خط أفقي مرجعي تلقائي عند الصفر، والتحكم في مظهر النقاط، وتطبيق منحنى التنعيم الموضعي غير المعلمي المعروف باسم LOWESS (Locally Weighted Scatterplot Smoothing) عبر المعامل lowess=True. يساعد منحنى LOWESS في الكشف الفوري عن أي اتجاهات أو انحناءات غير خطية طفيفة في سحابة البواقي، والتي قد تصعب ملاحظتها بالعين المجردة وسط تشتت النقاط.

يوضح الكود التالي التطبيق العملي لإنشاء المخطط باستخدام دالة residplot:

import matplotlib.pyplot as plt
import seaborn as sns
# ضبط النمط البصري العام للرسم
sns.set_theme(style="whitegrid")
# إنشاء الشكل البياني
plt.figure(figsize=(10, 6), dpi=100)
# رسم مخطط البواقي مع إضافة منحنى Lowess للكشف عن الانحناءات
sns.residplot(
 x='Fitted_Values',
 y='Residuals',
 data=df,
 lowess=True,
 scatter_kws={'alpha': 0.7, 'color': '#1f77b4'},
 line_kws={'color': '#d62728', 'linewidth': 2}
)
plt.title("مخطط البواقي مقابل القيم المجهزة باستخدام Seaborn", fontsize=14, fontweight='bold')
plt.xlabel("القيم المتوقعة (Fitted Values)", fontsize=12)
plt.ylabel("البواقي (Residuals)", fontsize=12)
plt.tight_layout()
plt.show()
Residual plot in Python
Residual plot in Python

يوفر هذا المخطط وسيلة بصرية سريعة وفعالة للتحقق من خلو البواقي من أي أنماط غير خطية منتظمة حول الخط المرجعي الصفري.

6.2 تخصيص المظهر الجمالي والبياني

يتطلب إعداد المخططات البيانية للأوراق البحثية والتقارير الأكاديمية تخصيصاً دقيقاً للمظهر البصري لضمان وضوح الرسالة الإحصائية ومطابقتها لمعايير النشر العلمي. يتيح نظام Seaborn تخصيص السمات (Themes)، والخطوط، ولوحات الألوان، وهوامش المحاور بسهولة فائقة من خلال دوال مثل sns.set_context() و sns.set_palette().

يشمل التخصيص الأكاديمي المتقدم ضبط مقاييس الرسم لتكون متماثلة حول المحور الصفري، وتعديل حجم وحواف النقاط (Markers)، وإضافة خطوط شبكة دقيقة، والتحكم في دقة الحفظ وجودة الصورة (DPI). كما يمكن إضافة خطوط أفقية إرشادية تمثل انحرافين معياريين ($\pm 2\sigma$) لتمييز النطاق الطبيعي للبواقي عن القيم الشاذة المتطرفة.

يوضح المثال التالي كيفية بناء مخطط بواقي مخصص بأعلى المعايير الأكاديمية وحفظه بصيغة عالية الجودة:

# ضبط البيئة البصرية للسياق الأكاديمي
sns.set_context("paper", font_scale=1.3)
fig, ax = plt.subplots(figsize=(10, 6), dpi=300)
# رسم مخطط البواقي المعياري
sns.scatterplot(
 x='Fitted_Values',
 y='Studentized_Residuals',
 data=df,
 ax=ax,
 color='#2b5c8f',
 s=50,
 edgecolor='black',
 alpha=0.8
)
# إضافة الخطوط المرجعية الأساسية وخطوط الحدود الحرجة
ax.axhline(0, color='black', linestyle='--', linewidth=1.2)
ax.axhline(2, color='red', linestyle=':', linewidth=1.5, label='العتبة الحرجة (+2)')
ax.axhline(-2, color='red', linestyle=':', linewidth=1.5, label='العتبة الحرجة (-2)')
# ضبط العناوين والمحاور
ax.set_title("مخطط البواقي الطالبية لتشخيص النموذج (عرض أكاديمي)", fontsize=14, pad=15)
ax.set_xlabel("القيم المتنبأ بها ($\hat{Y}$)", fontsize=12)
ax.set_ylabel("البواقي الطالبية (Studentized Residuals)", fontsize=12)
ax.legend(loc='upper right', frameon=True)
# تحسين توزيع الهوامش وحفظ الشكل
plt.tight_layout()
plt.savefig("academic_residual_plot.png", dpi=300, bbox_inches='tight')
plt.show()

يضمن هذا التخصيص البصري إبراز النقاط الحرجة بوضوح وتسهيل تفسير النتائج لقراء التقارير والدراسات الأكاديمية.

6.3 التعامل مع الانحدار المتعدد في Seaborn

في نماذج الانحدار الخطي المتعدد التي تحتوي على أكثر من متغير تفسيري، لا يكفي الاقتصار على فحص البواقي مقابل القيم المتوقعة الكلية ($\hat{y}$)، بل يجب فحص البواقي مقابل كل متغير مستقل على حدة. يساعد هذا التشخيص التفصيلي في تحديد المتغير المحدد المسؤول عن إدخال علاقة غير خطية أو عدم تجانس في التباين إلى النموذج.

توفر مكتبة Seaborn أداة قوية تُعرف باسم FacetGrid أو الدالة التكميلية pairplot التي تتيح تقسيم مساحة الرسم إلى شبكة من المخططات المتجاورة، بحيث يمثل كل رسم بياني البواقي مقابل أحد المتغيرات المستقلة. كما يمكن استخدام المعامل hue للتحقق مما إذا كان توزيع البواقي يختلف بصورة نظامية بين الفئات النوعية المختلفة (Categorical Groups) في البيانات، مثل الفروق بين المناطق الجغرافية أو الفئات العمرية.

يوضح الكود التالي كيفية إنشاء شبكة تشخيصية لفحص البواقي مقابل كل متغير مستقل بشكل منفصل:

# إعادة هيكلة البيانات لتناسب الرسم الشبكي (Melted Format)
df_melted = df.melt(
 id_vars=['Residuals'],
 value_vars=['Feature_1', 'Feature_2'],
 var_name='Feature_Name',
 value_name='Feature_Value'
)
# إنشاء شبكة المخططات التشخيصية
g = sns.FacetGrid(df_melted, col='Feature_Name', sharex=False, sharey=True, height=5, aspect=1.2)
g.map_dataframe(sns.scatterplot, x='Feature_Value', y='Residuals', alpha=0.7, color='#2ca02c')
g.map(plt.axhline, y=0, color='red', linestyle='--')
# ضبط العناوين العامة
g.set_axis_labels("قيمة المتغير", "البواقي")
g.fig.subplots_adjust(top=0.85)
g.fig.suptitle("فحص البواقي مقابل كل متغير تفسيري على حدة", fontsize=14, fontweight='bold')
plt.show()

تُعد هذه الشبكة البيانية وسيلة تشخيصية بالغة الأهمية لتحديد مواضع الخلل البنيوي الموضعي في نماذج الانحدار المتعدد بكفاءة مطلقة.

7. إنشاء مخطط البواقي باستخدام مكتبة Matplotlib

7.1 بناء المخطط المبعثر (Scatter Plot) خطوة بخطوة

على الرغم من البساطة والجمالية التي تقدمها Seaborn، فإن استخدام مكتبة Matplotlib يمنح الباحثين والمطورين أقصى درجات التحكم الهندسي والبرمجي الدقيق في كافة طبقات الرسم البياني. يتيح التعامل المباشر مع واجهة الكائنات الموجهة (Object-Oriented API) في Matplotlib، عبر fig, ax = plt.subplots()، بناء المخطط من الصفر وضبط كل عنصر رسومي بدقة متناهية.

يبدأ بناء مخطط البواقي برسم النقاط المبعثرة للقيم المجهزة مقابل البواقي باستخدام ax.scatter(). من الضروري هنا التحكم في خاصية الشفافية (alpha) لتقليل تأثير التداخل وتراكم النقاط (Overplotting) في المناطق ذات الكثافة العالية للبيانات. يتبع ذلك إضافة الخط المرجعي الأفقي عند $y = 0$ باستخدام ax.axhline()، وهو الخط الذي يجب أن تتوزع حوله البواقي بتماثل كامل.

يوضح المثال البرمجي التالي البناء التدريجي لمخطط البواقي باستخدام واجهة Matplotlib الأساسية:

import matplotlib.pyplot as plt
# إنشاء الكائن الأساسي للرسم
fig, ax = plt.subplots(figsize=(9, 5.5), dpi=100)
# رسم سحابة البواقي
scatter = ax.scatter(
 df['Fitted_Values'],
 df['Residuals'],
 color='#4A90E2',
 alpha=0.6,
 edgecolors='w',
 s=60,
 label='البواقي المرصودة'
)
# رسم الخط الأفقي المرجعي عند الصفر
ax.axhline(y=0.0, color='#D0021B', linestyle='-', linewidth=1.5, label='خط الباقي الصفري')
# ضبط العناوين وتسميات المحاور
ax.set_title("مخطط البواقي مقابل القيم المجهزة (Matplotlib)", fontsize=13, fontweight='bold')
ax.set_xlabel("القيم المتوقعة للنموذج ($\hat{y}_i$)", fontsize=11)
ax.set_ylabel("البواقي ($e_i = y_i - \hat{y}_i$)", fontsize=11)
# إظهار وسيلة الإيضاح
ax.legend(loc='upper right')
plt.tight_layout()
plt.show()

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

7.2 التخصيص المتقدم للعناصر البيانية

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

يمكن استخدام الدالة ax.annotate() لربط أسهم توضيحية بنقاط البيانات التي تتجاوز حداً إحصائياً معيناً، مع ذكر رقم المشاهدة (Index) وقيمة الباقي. كما يمكن تلوين النقاط تدرجياً بناءً على بُعد إحصائي ثالث، مثل مسافة كوك (Cook’s Distance) أو مقدار الرافعة، عبر تمرير مصفوفة ألوان إلى المعامل c وخريطة ألوان مثل cmap='viridis' مع إضافة شريط ألوان جانبي (Colorbar).

يوضح الكود التالي كيفية تطبيق هذه التخصيصات المتقدمة لإثراء المخطط التشخيصي:

fig, ax = plt.subplots(figsize=(10, 6), dpi=120)
# تلوين النقاط وفقاً للقيمة المطلقة للبواقي لإبراز الانحرافات
scatter = ax.scatter(
 df['Fitted_Values'],
 df['Residuals'],
 c=np.abs(df['Residuals']),
 cmap='coolwarm',
 alpha=0.8,
 s=55,
 edgecolors='gray'
)
# إضافة شريط الألوان
cbar = plt.colorbar(scatter, ax=ax)
cbar.set_label('القيمة المطلقة للبواقي (|e|)', fontsize=10)
# إضافة الخط الصفري والشبكة
ax.axhline(0, color='black', linestyle='--', linewidth=1.2)
ax.grid(True, linestyle=':', alpha=0.6)
# التعليق التوضيحي على أكبر نقطة باقية
max_res_idx = df['Residuals'].abs().idxmax()
ax.annotate(
 f"مشاهدة شاذة رقم: {max_res_idx}nالباقي: {df.loc[max_res_idx, 'Residuals']:.2f}",
 xy=(df.loc[max_res_idx, 'Fitted_Values'], df.loc[max_res_idx, 'Residuals']),
 xytext=(df.loc[max_res_idx, 'Fitted_Values'] + 5, df.loc[max_res_idx, 'Residuals'] + 5),
 arrowprops=dict(facecolor='black', shrink=0.05, width=1, headwidth=6),
 fontsize=9,
 fontweight='bold',
 backgroundcolor='white'
)
ax.set_title("مخطط البواقي المتقدم مع تظليل الشدة والتعليقات التوضيحية", fontsize=13)
ax.set_xlabel("القيم المجهزة", fontsize=11)
ax.set_ylabel("البواقي", fontsize=11)
plt.tight_layout()
plt.show()

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

7.3 إنشاء لوحة تشخيصية متعددة الرسوم

في الممارسات الإحصائية المتقدمة، لا يتم الاكتفاء بمخطط واحد للبواقي، بل يتم تجميع عدة رسوم تشخيصية متكاملة في لوحة بيانية موحدة (Dashboard) باستخدام الدالة plt.subplots(nrows, ncols). يتيح هذا النهج الشامل للباحث فحص سلوك البواقي من عدة زوايا متكاملة في آن واحد: تشتت البواقي مقابل القيم المتوقعة، والتوزيع التكراري للبواقي (Histogram) لفحص الاعتدالية، ومخطط التسلسل الزمني للبواقي لفحص الاستقلالية والارتباط الذاتي.

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

يوضح المثال البرمجي التالي كيفية بناء لوحة تشخيصية ثلاثية الأبعاد للبواقي:

fig, axes = plt.subplots(1, 3, figsize=(18, 5), dpi=100)
# الرسم الأول: البواقي مقابل القيم المجهزة
axes[0].scatter(df['Fitted_Values'], df['Residuals'], alpha=0.6, color='#1f77b4')
axes[0].axhline(0, color='red', linestyle='--')
axes[0].set_title("البواقي مقابل القيم المجهزة")
axes[0].set_xlabel("القيم المجهزة")
axes[0].set_ylabel("البواقي")
axes[0].grid(True, linestyle=':', alpha=0.5)
# الرسم الثاني: مدرج تكراري للبواقي مع منحنى الكثافة
sns.histplot(df['Residuals'], kde=True, ax=axes[1], color='#2ca02c', bins=20)
axes[1].set_title("توزيع تكرار البواقي")
axes[1].set_xlabel("قيمة الباقي")
axes[1].set_ylabel("التكرار")
# الرسم الثالث: تسلسل البواقي الزمني/الترتيبي
axes[2].plot(df.index, df['Residuals'], marker='o', linestyle='-', color='#9467bd', alpha=0.6)
axes[2].axhline(0, color='red', linestyle='--')
axes[2].set_title("تسلسل البواقي عبر المشاهدات")
axes[2].set_xlabel("رقم المشاهدة (Index)")
axes[2].set_ylabel("البواقي")
axes[2].grid(True, linestyle=':', alpha=0.5)
plt.suptitle("لوحة التشخيص الإحصائي الشامل للبواقي", fontsize=15, fontweight='bold', y=1.03)
plt.tight_layout()
plt.show()

تمثل هذه اللوحة التشخيصية المتكاملة أداة معيارية فائقة القوة تمنح الباحث ثقة تامة في استقرار النموذج وسلامة افتراضاته الرياضية.

8. بناء مخطط البواقي باستخدام Scikit-Learn و Yellowbrick

8.1 استخراج وتطبيق البواقي في Scikit-Learn

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

في بيئة Scikit-Learn، يتم تدريب النموذج باستخدام التابع fit(X_train, y_train)، ثم يتم توليد التنبؤات لكل من مجموعتي التدريب والاختبار عبر التابع predict(). يتم حساب مصفوفة البواقي بعد ذلك بعملية طرح مصفوفية مباشرة: $e = y – \hat{y}$. تكتسب هذه الخطوة أهمية قصوى في تعلم الآلة، حيث تتيح مقارنة سلوك بواقي التدريب (Training Residuals) مع بواقي الاختبار (Test Residuals)، مما يكشف فورياً عن مشكلات فرط التخصيص (Overfitting)؛ إذ يشير تباين البواقي الصغير جداً في التدريب مع اتساعه الشديد في الاختبار إلى فشل النموذج في التعميم.

يوضح الكود التالي كيفية تقسيم البيانات، وتدريب نموذج Scikit-Learn، وحساب البواقي لمجموعتي التدريب والاختبار:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# تقسيم البيانات إلى مجموعتي تدريب واختبار
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
# تدريب نموذج الانحدار الخطي
sklearn_model = LinearRegression()
sklearn_model.fit(X_train, y_train)
# توليد التنبؤات وحساب البواقي
y_train_pred = sklearn_model.predict(X_train)
y_test_pred = sklearn_model.predict(X_test)
train_residuals = y_train - y_train_pred
test_residuals = y_test - y_test_pred
print(f"متوسط مربعات خطأ التدريب (MSE): {np.mean(train_residuals**2):.3f}")
print(f"متوسط مربعات خطأ الاختبار (MSE): {np.mean(test_residuals**2):.3f}")

يوفر هذا الإجراء الأساس البرمجي اللازم لبناء مخططات مقارنة تبرز كفاءة النموذج التنبؤي على البيانات غير المرئية.

8.2 استخدام مكتبة Yellowbrick للتصوير الآلي

تُمثل مكتبة Yellowbrick إضافة نوعية لمنظومة تعلم الآلة في بايثون؛ إذ تقوم بتوسيع واجهة Scikit-Learn لإنتاج رسوم بيانية تشخيصية تفاعلية ومتقدمة عبر كائنات بصرية تُعرف باسم “Visualizers”. توفر المكتبة الفئة المتخصصة ResidualsPlot التي تقوم بإنشاء مخطط البواقي تلقائياً وبكفاءة برمجية فائقة، مدمجةً مقارنة بيانات التدريب والاختبار في رسم موحد.

ما يجعل مخطط Yellowbrick فريداً ومتقدماً هو أنه لا يكتفي برسم المخطط المبعثر للبواقي مقابل القيم المتوقعة فقط، بل يضيف تلقائياً على الهامش الأيمن (Marginal Axis) مدرجاً تكرارياً يوضح التوزيع الاحتمالي للبواقي لكل من مجموعتي التدريب والاختبار معاً. بالإضافة إلى ذلك، يعرض المخطط تلقائياً معاملات التحديد ($R^2$) المحسوبة لكل مجموعة، مما يوفر رؤية تشخيصية متكاملة تقيس دقة النموذج وتجانس أخطائه في خطوة برمجية واحدة موجزة.

يوضح المثال التالي كيفية استخدام الفئة ResidualsPlot لتوليد هذا المخطط الآلي المتكامل:

from yellowbrick.regressor import ResidualsPlot
import matplotlib.pyplot as plt
# إنشاء كائن النموذج والمصور البصري
model = LinearRegression()
visualizer = ResidualsPlot(
 model,
 train_color='#1f77b4',
 test_color='#2ca02c',
 train_alpha=0.6,
 test_alpha=0.6,
 hist=True
)
# ملاءمة النموذج على بيانات التدريب وتقييم بيانات الاختبار
plt.figure(figsize=(10, 6), dpi=100)
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
# إنهاء وتوليد الشكل البياني
visualizer.show()
Residual vs. fitted plot in Python
Residual vs. fitted plot in Python

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

9. القراءة النقدية وتفسير أنماط مخططات البواقي

9.1 النمط المثالي: التشتت العشوائي المتجانس

يُمثل النمط المثالي لمخطط البواقي الهدف الأسمى الذي يسعى المحلل الإحصائي للوصول إليه عند التحقق من صلاحية النموذج. يتميز هذا النمط بتشتت نقطي عشوائي تماماً (Random Scatter) يحيط بالخط المرجعي الأفقي $y = 0$، بحيث تشكل النقاط سحابة مستطيلة ذات عرض متجانس على طول نطاق القيم المجهزة بالمحور الأفقي، دون أي تركز غير متوازن أو انحراف هيكلي في اتجاه معين.

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

يوضح الرسم التوضيحي المفاهيمي والخصائص الوصفية التالية معالم هذا النمط الإحصائي السليم:

  • متوسط البواقي الصفري: توازن متماثل تتساوى فيه مساحة وتوزيع النقاط فوق وتحت خط الصفر عبر كافة نطاقات $\hat{y}$.
  • ثبات الاتساع الرأسي: بقاء التباعد الرأسي بين أقصى وأدنى نقطة ثابتاً من أقصى يسار المخطط إلى أقصى يمينه.
  • غياب التكتلات والانحناءات: عدم وجود مناطق ذات كثافة نقطية شاذة أو انحناءات تدريجية في مسار السحابة النقطية.

9.2 نمط القمع أو المروحة (Heteroscedasticity)

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

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

يتطلب ظهور هذا النمط تدخلاً منهجياً فورياً؛ إذ إن تجاهله يجعل الأخطاء المعيارية للمعاملات غير صالحة، مما يضخم مستويات الثقة الإحصائية الزائفة. تشمل المعالجات الشائعة تطبيق التحويلات المثبتة للتباين (Variance-Stabilizing Transformations) مثل التحويل اللوغاريتمي، أو اللجوء إلى مقدرات المربعات الصغرى الموزونة (Weighted Least Squares – WLS)، أو استخدام مصفوفات التباين المتينة (Robust Standard Errors).

9.3 الأنماط المنحنية وغير الخطية (Non-linear Patterns)

يحدث النمط المنحني أو غير الخطي (Curvilinear Pattern) عندما تتخذ سحابة البواقي شكلاً هندسياً واضحاً، مثل شكل القطع المكافئ (حرف U أو U مقلوب)، أو شكل موجة جيبية متذبذبة (S-shape). في هذا السيناريو، تكون البواقي موجبة في البداية عند القيم الدنيا، ثم تصبح سالبة بشكل متصل في النطاق الأوسط، لتعود موجبة مرة أخرى في النطاقات العليا (أو العكس بالعكس).

يقدم هذا النمط البصري دليلاً لا يقبل الشك على انتهاك فرضية الخطية (Linearity Violation) وخطأ في التحديد الهيكلي لمعادلة النموذج (Model Misspecification). يخبرنا المخطط بوضوح أن العلاقة الحقيقية بين المتغير التابع والمتغيرات المستقلة ليست خطاً مستقيماً، بل تحتوي على انحناء أو تسارع مهمل، وأن النموذج الخطي قاصر عن استيعاب هذا الالتواء الطبيعي.

يؤدي هذا الانتهاك إلى انحياز هيكلي كامل في معاملات الانحدار المقدرة؛ حيث يُساء تقدير الأثر الحقيقي للمتغيرات. تتمثل استراتيجية العلاج الأساسية في هذه الحالة في إعادة هيكلة النموذج الرياضي من خلال إضافة حدود ذات درجات عليا (Polynomial Terms مثل $X^2$ أو $X^3$)، أو تطبيق تحويلات غير خطية على المتغيرات المستقلة، أو التحول إلى نماذج الجمع المعممة (Generalized Additive Models – GAM) القادرة على التقاط العلاقات المنحنية المعقدة تلقائياً.

9.4 اكتشاف القيم الشاذة والنقاط ذات التأثير العالي

يُعد مخطط البواقي الأداة التشخيصية الأولى لرصد المشاهدات غير الطبيعية وتصنيفها بدقة. في هذا السياق، يجب على المحلل الإحصائي التمييز الدقيق بين ثلاثة مفاهيم متمايزة رياضياً ولكنها متداخلة تأثيراً: القيم الشاذة (Outliers)، ونقاط الرافعة العالية (High Leverage Points)، والنقاط المؤثرة (Influential Points).

تُعرف القيم الشاذة بأنها المشاهدات التي تمتلك بواقي كبيرة جداً وتبتعد رأسياً بشكل ملحوظ عن السحابة العامة للنقاط والخط الصفري (عادة ما تتجاوز $3\sigma$ أو $-3\sigma$ في البواقي الطالبية)، مما يعني أن النموذج فشل تماماً في التنبؤ بها. أما نقاط الرافعة العالية فهي تلك المشاهدات التي تمتلك قيماً متطرفة وغير معتادة في فضاء المتغيرات التفسيرية ($X$)، وتظهر في المخطط عند الأطراف الأفقية القصوى (اليسار أو اليمين البعيد)، بصرف النظر عن حجم الباقي المرتبط بها.

تصبح النقطة نقطة مؤثرة إذا جمعت بين كونها قيمة شاذة وذات رافعة عالية؛ حيث تمتلك هذه النقاط القدرة على سحب خط الانحدار باتجاهها بمفردها، وتغيير قيم المعاملات المقدرة بشكل جوهري عند استبعادها. يُعد مقياس مسافة كوك (Cook’s Distance) المعيار الرياضي الأبرز لقياس هذا التأثير؛ حيث تُعتبر أي نقطة تتجاوز مسافة كوك الخاصة بها العتبة $\frac{4}{n}$ أو $1.0$ نقطة حرجة تتطلب فحصاً معمقاً لبياناتها وسياقها التجريبي قبل اتخاذ قرار الاحتفاظ بها أو تعديلها أو استبعادها المبرر.

10. المخططات التشخيصية الإضافية المكملة لمخطط البواقي

10.1 مخطط الاحتمال الطبيعي (Q-Q Plot) للبواقي

يُمثل مخطط الاحتمال الطبيعي (Quantile-Quantile Plot / Q-Q Plot) الأداة البصرية المتممة لمخطط البواقي الأساسي للتحقق من فرضية التوزيع الطبيعي للأخطاء. يقوم هذا المخطط برسم المئينات والكميات المحسوبة تجريبياً من البواقي المعيارية ضد المئينات والكميات النظرية المتوقعة من توزيع طبيعي قياسي مفترض ($\mathcal{N}(0, 1)$). إذا كانت الأخطاء تتبع توزيعاً طبيعياً معتدلاً، فإن النقاط ستصطف بدقة متناهية على طول خط قطري مستقيم يمر بزاوية 45 درجة.

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

  • الذيول الثقيلة (Heavy Tails): تظهر عندما تبتعد النقاط في الطرف العلوي فوق الخط وفي الطرف السفلي تحت الخط، متخذة شكل حرف S مقلوب، مما يشير إلى وجود قيم شاذة متطرفة بتكرار أعلى مما يفترضه التوزيع الطبيعي.
  • الالتواء الموجب أو السالب (Skewness): يظهر كانحناء قوسي مستمر للنقاط فوق الخط القطري (التواء موجب نحو اليمين) أو تحته (التواء سالب نحو اليسار).

يوضح الكود التالي كيفية إنشاء مخطط Q-Q باستخدام مكتبة Statsmodels:

import statsmodels.api as sm
import matplotlib.pyplot as plt
# إنشاء مخطط الاحتمال الطبيعي للبواقي المعيارية
fig, ax = plt.subplots(figsize=(7, 7), dpi=100)
sm.qqplot(results.resid, line='45', fit=True, ax=ax, color='#1f77b4')
ax.set_title("مخطط الاحتمال الطبيعي للبواقي (Normal Q-Q Plot)", fontsize=13, pad=10)
ax.set_xlabel("الكميات النظرية (Theoretical Quantiles)", fontsize=11)
ax.set_ylabel("كميات العينة للبواقي (Sample Quantiles)", fontsize=11)
ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()

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

10.2 مخطط الموقع والقياس (Scale-Location Plot)

يُعرف مخطط الموقع والقياس (Scale-Location Plot)، ويُطلق عليه أحياناً اسم مخطط الانتشار والموقع (Spread-Location Plot)، بأنه أداة تشخيصية عالية الحساسية صُممت خصيصاً لفحص فرضية تجانس التباين بدقة تفوق المخطط المبعثر التقليدي. يقوم هذا المخطط برسم الجذر التربيعي للبواقي المعيارية المطلقة ($\sqrt{|e_{\text{standardized}}|}$) على المحور الرأسي مقابل القيم المتوقعة المجهزة ($\hat{y}$) على المحور الأفقي.

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

يوضح الكود التالي كيفية بناء مخطط الموقع والقياس برمجياً في بايثون:

# حساب الجذر التربيعي للقيم المطلقة للبواقي الطالبية المعيارية
sqrt_abs_studentized_resid = np.sqrt(np.abs(df['Studentized_Residuals']))
fig, ax = plt.subplots(figsize=(9, 5.5), dpi=100)
# رسم النقاط المبعثرة
sns.regplot(
 x=df['Fitted_Values'],
 y=sqrt_abs_studentized_resid,
 ax=ax,
 lowess=True,
 scatter_kws={'alpha': 0.6, 'color': '#2b5c8f'},
 line_kws={'color': '#d62728', 'linewidth': 2}
)
ax.set_title("مخطط الموقع والقياس (Scale-Location Plot)", fontsize=13, fontweight='bold')
ax.set_xlabel("القيم المتوقعة المجهزة ($\hat{y}$)", fontsize=11)
ax.set_ylabel(r"$\sqrt{|\text{Studentized Residuals}|}$", fontsize=11)
ax.grid(True, linestyle=':', alpha=0.5)
plt.tight_layout()
plt.show()

يمثل هذا المخطط الحساس إضافة تشخيصية بالغة الأهمية تكشف مشاكل التباين الخفية التي قد لا تظهر بوضوح في المخطط التقليدي.

10.3 مخطط البواقي مقابل الرافعة (Residuals vs Leverage)

يُعد مخطط البواقي مقابل الرافعة (Residuals vs Leverage Plot) المخطط التشخيصي الحاسم لتحديد المشاهدات الأكثر تأثيراً على نتائج ومعاملات النموذج الخطي. يقوم هذا المخطط بتمثيل قيم الرافعة الإحصائية ($h_{ii}$ المستخرجة من قطر مصفوفة Hat) على المحور الأفقي، مقابل البواقي المعيارية أو الطالبية على المحور الرأسي، مع رسم خطوط كنتورية تمثل مسافات كوك الحرجة (عادة عند مسافة 0.5 و 1.0).

تساعد قراءة هذا المخطط في التمييز الفوري بين:

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

يوفر استخدام الدالة sm.graphics.influence_plot() في Statsmodels طريقة مدمجة لإنشاء هذا المخطط، حيث يُرسم حجم النقطة متناسباً طردياً مع مسافة كوك الخاصة بها، مما يقدم نظرة تشخيصية فورية وشاملة للتأثير الإحصائي لكافة المشاهدات.

11. استراتيجيات المعالجة عند اكتشاف تشوهات في مخطط البواقي

11.1 التحويلات الرياضية للمتغيرات (Transformations)

عندما يكشف مخطط البواقي عن وجود مشكلات هيكلية مثل عدم تجانس التباين المتصاعد أو الالتواء الحاد في الأخطاء، تمثل التحويلات الرياضية للمتغيرات خط الدفاع المنهجي الأول. يُعد التحويل اللوغاريتمي ($ln(Y)$ أو $\log_{10}(Y)$) أكثر هذه التحويلات استخداماً وفاعلية، خصوصاً عندما تنمو البواقي طردياً مع زيادة حجم المتغير، أو عندما تكون البيانات المالية والديموغرافية موجبة وتحتوي على التواء يميني حاد. يؤدي أخذ اللوغاريتم للمتغير التابع إلى ضغط التشتت في القيم العليا وتثبيت التباين عبر كامل النطاق.

بالإضافة إلى التحويل اللوغاريتمي، يوفر تحويل بوكس-كوكس (Box-Cox Transformation) إطاراً رياضياً بارامترياً عاماً يبحث تلقائياً عن أفضل معامل تحويل ($lambda$) يحول البيانات غير الطبيعية إلى أقرب توزيع طبيعي متجانس التباين وفق المعادلة:

$$y^{(\lambda)} = \begin{\cases} \frac{y^\lambda – 1}{\lambda} &a\mp; \text{إذا كان } \lambda \neq 0 \ \ln(y) &a\mp; \text{إذا كان } \lambda = 0 \end{\cases}$$

يوضح الكود التالي كيفية تطبيق تحويل Box-Cox باستخدام مكتبة SciPy وإعادة تقييم النموذج:

from scipy import stats
import statsmodels.api as sm
# تطبيق تحويل بوكس-كوكس على المتغير التابع (بشرط أن تكون قيمه موجبة تماماً)
y_transformed, fitted_lambda = stats.boxcox(df['Target'] - df['Target'].min() + 1)
print(f"قيمة Lambda المثلى المحسوبة: {fitted_lambda:.3f}")
# إعادة تدريب النموذج بالمتغير المتحول
X_const = sm.add_constant(df[['Feature_1', 'Feature_2']])
model_transformed = sm.OLS(y_transformed, X_const).fit()
# استخراج البواقي الجديدة للتحقق من الإصلاح
df['Residuals_Transformed'] = model_transformed.resid
print(f"معامل التحديد الجديد بعد التحويل: {model_transformed.rsquared:.3f}")

يؤدي تطبيق هذا التحويل عادة إلى إزالة شكل القمع من مخطط البواقي واستعادة تجانس التباين والاعتدالية بصورة ملحوظة.

11.2 تعديل بنية النموذج الرياضي

إذا أظهر مخطط البواقي نمطاً انحنائياً واضحاً (مثل نمط القطع المكافئ)، فإن الحل المنهجي يكمن في تعديل الصياغة الرياضية للنموذج عبر إدراج الحدود متعددة الحدود (Polynomial Features). إن محاولة توفيق خط مستقيم على علاقة تربيعية أو تكعيبية يمثل خطأ في التحديد الهيكلي؛ وبالتالي فإن إضافة الحد التربيعي ($X^2$) للمتغير التفسيري المعني يتيح لخط الانحدار الانحناء لاستيعاب السلوك الواقعي للبيانات، مما يعيد تشتت البواقي إلى العشوائية المطلوبة.

علاوة على ذلك، قد يكشف فحص البواقي عن وجود تأثيرات تفاعلية مهملة (Interaction Effects)، حيث يتغير أثر أحد المتغيرات المستقلة اعتماداً على قيمة متغير مستقل آخر. في هذه الحالة، يجب تضمين حدود التفاعل (مثل $X_1 \times X_2$) داخل المعادلة. كما يجب البحث في احتمالية وجود انحياز المتغير المغفل (Omitted Variable Bias)؛ حيث يشير وجود نمط منتظم في البواقي أحياناً إلى أن هناك متغيراً حاسماً لم يتم تضمينه في النموذج، وتؤدي إضافته إلى استقرار التقديرات واختفاء النمط غير العشوائي في الأخطاء.

يمكن توليد هذه الحدود متعددة الحدود والتفاعلية برمجياً بسهولة باستخدام فئة PolynomialFeatures المتاحة في Scikit-Learn قبل تدريب النموذج ومراجعة مخطط البواقي المحدث.

11.3 طرق التقدير البديلة المقاومة للخلل

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

يتمثل الخيار الأول في استخدام المربعات الصغرى الموزونة (Weighted Least Squares – WLS)؛ حيث يتم تعيين وزن لكل مشاهدة يتناسب عكسياً مع تباين الخطأ المقدر لها ($w_i = \frac{1}{\sigma_i^2}$)، مما يمنح المشاهدات الدقيقة وزناً أكبر في تحديد خط الانحدار ويقلل من أثر المشاهدات ذات التشتت العالي. الخيار الثاني هو الاعتماد على مصفوفات التباين المتغاير المتينة (Heteroscedasticity-Consistent Standard Errors / White’s SE)، مثل HC3 أو HC1 المتوفرة في Statsmodels عبر المعامل cov_type='HC3' أثناء استدعاء التابع fit()؛ حيث تقوم هذه الطريقة بتصحيح حساب الأخطاء المعيارية واختبارات الفروض دون المساس بقيم المعاملات الأصلية.

أما إذا كانت البيانات لا تتبع التوزيع الطبيعي بصورة بنيوية أصيلة (مثل بيانات التعدادات أو الاحتمالات)، فيجب الانتقال إلى النماذج الخطية المعممة (Generalized Linear Models – GLM)، مثل انحدار بواسون (Poisson Regression) لبيانات التعداد، أو الانحدار اللوجستي (Logistic Regression) للبيانات الثنائية، حيث تضمن هذه النماذج توافق البنية الرياضية مع التوزيع الاحتمالي الأصيل للظاهرة المدروسة.

12. دراسة حالة متكاملة وأفضل الممارسات البرمجية

12.1 تنفيذ مسار عمل تحليلي متكامل (Pipeline)

لتتويج المفاهيم النظرية والتقنيات البرمجية التي جرى تفصيلها، سنقوم بتنفيذ مسار عمل تحليلي متكامل (End-to-End Analytical Pipeline) يحاكي سيناريو واقعياً يحتوي على علاقة غير خطية وعدم تجانس في التباين، ثم نقوم بتشخيصه عبر مخططات البواقي، ومعالجته، وإعادة تقييم النموذج المحسن وتوثيق النتائج بيانياً.

يوضح البرنامج النصي التالي خطوات التدفق التحليلي بالكامل:

import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
# 1. توليد بيانات تجريبية غير خطية مع تباين متزايد
np.random.seed(101)
n = 300
x = np.linspace(5, 50, n)
# توليد خطأ بتشتت متزايد طردياً مع x (Heteroscedasticity)
heteroscedastic_error = np.random.normal(0, scale=0.5 * x, size=n)
# علاقة تربيعية حقيقية
y_real = 10 + 0.8 * (x**1.8) + heteroscedastic_error
# 2. بناء النموذج الخطي البسيط الأولي (النموذج القاصر)
X_initial = sm.add_constant(x)
model_initial = sm.OLS(y_real, X_initial).fit()
# 3. بناء النموذج المحسن (معالجة التحويل اللوغاريتمي)
# تطبيق تحويل Log على المتغير التابع والمستقل لضبط الخطية والتباين
log_x = np.log(x)
log_y = np.log(np.maximum(y_real, 1)) # ضمان قيم موجبة
X_improved = sm.add_constant(log_x)
model_improved = sm.OLS(log_y, X_improved).fit()
# 4. مقارنة مخططات البواقي قبل وبعد التحسين في لوحة بيانية واحدة
fig, axes = plt.subplots(1, 2, figsize=(16, 6), dpi=120)
# مخطط البواقي للنموذج الأولي
axes[0].scatter(model_initial.fittedvalues, model_initial.resid, color='#d9534f', alpha=0.7)
axes[0].axhline(0, color='black', linestyle='--')
axes[0].set_title(f"النموذج الأولي (OLS بسيط)nنمط قمعي وانحناء واضح ($R^2={model_initial.rsquared:.2f}$)", fontsize=12)
axes[0].set_xlabel("القيم المجهزة ($\hat{y}$)", fontsize=10)
axes[0].set_ylabel("البواقي ($e$)", fontsize=10)
axes[0].grid(True, linestyle=':', alpha=0.5)
# مخطط البواقي للنموذج المحسن
axes[1].scatter(model_improved.fittedvalues, model_improved.resid, color='#5cb85c', alpha=0.7)
axes[1].axhline(0, color='black', linestyle='--')
axes[1].set_title(f"النموذج المحسن (تحويل Log-Log)nتشتت عشوائي متجانس ($R^2={model_improved.rsquared:.2f}$)", fontsize=12)
axes[1].set_xlabel("القيم المجهزة اللوغاريتمية ($\hat{\ln y}$)", fontsize=10)
axes[1].set_ylabel("البواقي اللوغاريتمية", fontsize=10)
axes[1].grid(True, linestyle=':', alpha=0.5)
plt.suptitle("مقارنة تشخيصية لمخطط البواقي قبل وبعد معالجة التشوهات الهيكلية", fontsize=14, fontweight='bold', y=1.02)
plt.tight_layout()
plt.show()

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

12.2 أفضل الممارسات البرمجية والتوثيق الأكاديمي

يتطلب التحليل الإحصائي الرصين الالتزام بمجموعة من القواعد وأفضل الممارسات البرمجية لضمان قابلية إعادة الإنتاج (Reproducibility) ونظافة الشيفرة المصدرية وسهولة صيانتها. يُعد كتابة دوال برمجية معيارية قابلة لإعادة الاستخدام (Reusable Functions) لتوليد المخططات التشخيصية ممارسة مثالية في المشاريع الأكاديمية والمهنية الضخمة، حيث تجنب تكرار كتابة الأكواد وتضمن اتساق المخرجات البيانية عبر مختلف مراحل المشروع.

يوضح المثال التالي تصميماً برمجياً مثالياً لدالة تشخيصية احترافية شاملة وموثقة توثيقاً دقيقاً:

def plot_diagnostic_residuals(model_results, data_df, target_col, figsize=(14, 5)):
 """
 دالة معيارية لتوليد لوحة تشخيصية ثنائية للبواقي والقيم المجهزة ومخطط Q-Q.
 
 المعاملات:
 -----------
 model_results : statsmodels.regression.linear_model.RegressionResultsWrapper
 كائن نتائج نموذج Statsmodels بعد الملاءمة.
 data_df : pandas.DataFrame
 إطار البيانات المحتوي على المتغيرات الأصلية.
 target_col : str
 اسم عمود المتغير التابع.
 figsize : tuple
 أبعاد الشكل البياني (العرض، الارتفاع).
 """
 fitted = model_results.fittedvalues
 residuals = model_results.resid
 student_res = model_results.get_influence().resid_studentized_internal
 
 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=figsize, dpi=100)
 
 # 1. مخطط البواقي مقابل القيم المجهزة
 sns.residplot(x=fitted, y=residuals, lowess=True, ax=ax1,
 scatter_kws={'alpha': 0.6, 'color': '#2b5c8f'},
 line_kws={'color': '#d9534f', 'linewidth': 1.8})
 ax1.set_title("البواقي مقابل القيم المتوقعة مع منحنى LOWESS", fontsize=11, fontweight='bold')
 ax1.set_xlabel("القيم المجهزة ($\hat{y}$)", fontsize=10)
 ax1.set_ylabel("البواقي الخام ($e$)", fontsize=10)
 ax1.grid(True, linestyle=':', alpha=0.5)
 
 # 2. مخطط الاحتمال الطبيعي للبواقي الطالبية
 sm.qqplot(student_res, line='45', fit=True, ax=ax2, color='#2ca02c')
 ax2.set_title("مخطط الاحتمال الطبيعي (Q-Q Plot)", fontsize=11, fontweight='bold')
 ax2.set_xlabel("الكميات النظرية", fontsize=10)
 ax2.set_ylabel("البواقي الطالبية", fontsize=10)
 ax2.grid(True, linestyle=':', alpha=0.5)
 
 plt.tight_layout()
 return fig, (ax1, ax2)

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

خاتمة واستنتاجات منهجية

يُمثل مخطط البواقي (Residual Plot) الركيزة الجوهرية والبوصلة المنهجية التي لا غنى عنها لأي تحليل انحدار إحصائي رصين. لقد استعرض هذا الدليل الأكاديمي الشامل الأسس الرياضية للبواقي ودورها كمرآة تعكس مدى مطابقة النموذج للبيانات الواقعية وتلبيته لفرضيات غاوس-ماركوف الكلاسيكية؛ كخطية العلاقة، وتجانس التباين، واستقلالية الأخطاء وتوزيعها الطبيعي. إن الاعتماد الحصري على مقاييس الأداء المجمعة مثل $R^2$ دون فحص البواقي يُعد مجازفة تحليلية قد تقود إلى تعميم نماذج معيبة بنيوياً وإنتاج استنتاجات مضللة.

أظهرت لغة بايثون، من خلال منظومتها المتطورة التي تجمع بين Statsmodels وScikit-Learn وMatplotlib وSeaborn وYellowbrick، مرونة فائقة في الانتقال السلس من مرحلة بناء النماذج وحساب البواقي المعيارية والطالبية، إلى مرحلة التصوير البياني المتقدم والتشخيص البصري الدقيق. كما وفر المقال دليلاً نقدياً لقراءة الأنماط المختلفة للبواقي؛ بدءاً من التشتت العشوائي المثالي، مروراً بنمط القمع الدال على عدم تجانس التباين والأنماط المنحنية الدالة على عدم الخطية، وانتهاءً برصد القيم الشاذة والنقاط ذات التأثير العالي عبر مسافات كوك ومخططات الرافعة.

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

References

  • Belsley, D. A., Kuh, E., & Welsch, R. E. (2005). Regression Diagnostics: Identifying Influential Data and Sources of Collinearity. John Wiley & Sons. https://doi.org/10.1002/0471725153
  • Box, G. E., & Cox, D. R. (1964). An analysis of transformations. Journal of the Royal Statistical Society: Series B (Methodological), 26(2), 211-243. https://doi.org/10.1111/j.2517-6161.1964.tb00553.x
  • Cook, R. D. (1977). Detection of influential observation in linear regression. Technometrics, 19(1), 15-18. https://doi.org/10.1080/00401706.1977.10489493
  • Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90-95. https://doi.org/10.1109/MCSE.2007.55
  • McKinney, W. (2010). Data structures for statistical computing in Python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51-56). https://doi.org/10.25080/Majora-92bf1921-003
  • Montgomery, D. C., Peck, E. A., & Vining, G. G. (2021). Introduction to Linear Regression Analysis (6th ed.). John Wiley & Sons.
  • Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., & Duchesnay, E. (2011). Scikit-learn: Machine learning in Python. Journal of Machine Learning Research, 12, 2825-2830.
  • Seabold, S., & Perktold, J. (2010). Statsmodels: Econometric and statistical modeling with Python. In Proceedings of the 9th Python in Science Conference (Vol. 57, p. 61). https://doi.org/10.25080/Majora-92bf1921-011
  • Waskom, M. L. (2021). Seaborn: Statistical data visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021
  • Wooldridge, J. M. (2020). Introductory Econometrics: A Modern Approach (7th ed.). Cengage Learning.

اقتباس هذا المقال

looti, M. (2026, أغسطس 28). كيفية إنشاء رسم بياني للبواقي في بايثون. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-create-residual-plot-python/
looti, Mohammed. “كيفية إنشاء رسم بياني للبواقي في بايثون.” عرب سايكلوجي, 28 أغسطس 2026, https://arabpsychology.com/statistics/how-to-create-residual-plot-python/.
looti, Mohammed. “كيفية إنشاء رسم بياني للبواقي في بايثون.” عرب سايكلوجي. أغسطس 28, 2026. https://arabpsychology.com/statistics/how-to-create-residual-plot-python/.