البرمجة الإحصائيةتحليل البيانات في بايثون

كيفية إنشاء توزيع طبيعي في بايثون (مع أمثلة)

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

تاريخ النشر

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

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

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

Generate normal distribution in Python
Generate normal distribution in Python

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

1.1 تعريف التوزيع الطبيعي وخصائصه الهندسية والرياضية

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

من أهم الخصائص الهندسية الفريدة للتوزيع الطبيعي المثالي هو التطابق التام بين مقاييس النزعة المركزية الثلاثة: المتوسط الحسابي (Mean) الذي يمثل مركز الكتلة وموضع قمة المنحنى، والوسيط (Median) الذي يقسم المساحة الكلية تحت المنحنى إلى نصفين متساويين بنسبة 50% لكل منهما، والمنوال (Mode) الذي يشير إلى النقطة الأكثر تكراراً وكثافة احتمالية. يخلق هذا التطابق حالة مثالية من التناظر الصفري (Zero Skewness)، حيث تتوزع نصف البيانات بدقة متناهية على يمين المتوسط والنصف الآخر على يساره، وتتساوى المسافات والانحدارات على جانبي المنحنى عند أي نقطة متقابلة.

تخضع المساحة الكلية تحت منحنى الكثافة الاحتمالية، والتي تساوي دائماً واحداً صحيحاً (أو 100%)، لما يعرف بالقاعدة التجريبية (Empirical Rule) أو قاعدة 68-95-99.7. تنص هذه القاعدة الرياضية على أن ما يقارب 68.27% من إجمالي القيم تقع ضمن نطاق انحراف معياري واحد ($\pm 1\sigma$) حول المتوسط الحسابي ($\mu$)، بينما تقع 95.45% من القيم ضمن نطاق انحرافين معياريين ($\pm 2\sigma$)، وترتفع هذه النسبة لتشمل 99.73% من البيانات ضمن نطاق ثلاثة انحرافات معيارية ($\pm 3\sigma$). تحدد هذه الخصائص حدود التباين المتوقع بدقة رياضية صارمة تمكن الباحثين من نمذجة الظواهر بدقة استثنائية.

1.2 أهمية محاكاة وتوليد التوزيع الطبيعي في البحث العلمي والقياس النفسي

تحتل محاكاة التوزيع الطبيعي مكانة محورية في البحث العلمي المتقدم والعلوم السلوكية والقياس النفسي (Psychometrics). فالعديد من السمات الإنسانية والقدرات العقلية والسمات السلوكية—مثل معدلات الذكاء العام (General Intelligence)، وزمن الاستجابة الإدراكية (Reaction Time)، والميول النفسية المقاسة بالمقاييس متعددة البنود—تتبع افتراضياً توزيعات قريبة جداً من التوزيع الطبيعي داخل المجتمعات السكانية الكبيرة، مما يجعل توليد هذه المتغيرات اصطناعياً ركيزة أساسية لتصميم الاختبارات النفسية وتقنينها قبل تطبيقها الميداني.

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

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

1.3 مقارنة بين التوزيع الطبيعي القياسي والتوزيع الطبيعي العام

يُمثل التوزيع الطبيعي القياسي (Standard Normal Distribution) حالة خاصة ومبسطة من عائلة التوزيعات الطبيعية، حيث يتميز بمتوسط حسابي يساوي تماماً الصفر ($\mu = 0$) وانحراف معياري يساوي واحداً صحيحاً ($\sigma = 1$). يُرمز لمتغير هذا التوزيع عادة بالحرف اللاتيني $Z$. تكمن القوة المنهجية للتوزيع القياسي في قدرته على توحيد مقاييس القياس المتنوعة والمختلفة، مما يتيح مقارنة المتغيرات ذات الوحدات المتباينة بشكل مباشر وموضوعي بعد تحويلها إلى ما يعرف بالدرجات المعيارية (Z-scores).

تتم عملية الانتقال بين التوزيع الطبيعي العام ذي المتوسط $\mu$ والانحراف المعياري $\sigma$ والتوزيع الطبيعي القياسي عبر تحويل خطي بسيط ثنائي الاتجاه. يُحسب التحويل المعياري لأي قيمة $X$ من خلال المعادلة:

$$Z = \frac{X – \mu}{\sigma}$$

وعلى النقيض، يمكن استعادة القيمة الأصلية الخام من الدرجة المعيارية عبر التحويل الخطي العكسي: $X = \mu + Z\sigma$. هذا التحول يغير فقط من مقياس وموضع التوزيع دون المساس إطلاقاً بخصائصه التناظرية أو نسب المساحات الاحتمالية الكامنة أسفل المنحنى.

تتحكم معلمات التوزيع الطبيعي العام في سلوكه الهندسي؛ إذ يؤدي تغيير معامل الموضع (Location Parameter) المتمثل في المتوسط $\mu$ إلى إزاحة المنحنى بأكمله أفقياً على طول محور السينات يميناً أو يساراً دون تغيير شكله الهندسي أو درجة تفلطحه، بينما يتحكم معامل المقياس (Scale Parameter) المتمثل في الانحراف المعياري $\sigma$ في مدى انتشار أو انضغاط المنحنى؛ فكلما كبرت قيمة $\sigma$ اتسع المنحنى وأصبح أكثر تفلطحاً وتشتتاً، وكلما صغرت تضيق المنحنى وارتفعت قمته نحو الأعلى مع بقاء المساحة الكلية مساوية للواحد دائماً.

2. الأسس الرياضية والخوارزمية لتوليد الأرقام العشوائية الطبيعية

2.1 خوارزمية بوكس-مولر (Box-Muller Transform)

تعد خوارزمية تحويل بوكس-مولر، التي طورها العالمان جورج بوكس وميرفين مولر عام 1958، واحدة من أوائل وأشهر الطرق الرياضية وأكثرها أناقة لتوليد أرقام عشوائية تتبع التوزيع الطبيعي القياسي المستقل انطلاقاً من أرقام تتبع التوزيع المنتظم المستمر (Uniform Distribution) المحصور في الفترة $(0, 1)$. تعتمد الخوارزمية على حقيقة هندسية رياضية مفادها أن دالة الكثافة الاحتمالية المشتركة لمتغيرين طبيعيين قياسيين مستقلين $Z_1$ و $Z_2$ تمتلك تناظراً دائرياً تاماً في المستوى الديكارتي الثنائي.

من خلال التحويل إلى الإحداثيات القطبية $(R, Theta)$، يتبع مربع نصف القطر $R^2 = Z_1^2 + Z_2^2$ توزيعاً أسياً بمتوسط 2 (وهو ما يكافئ توزيع كاي-تربيعي بدرجتي حرية)، بينما تتوزع الزاوية القطبية $Theta$ بانتظام على الفترة $[0, 2\pi)$. بتوليد متغيرين عشوائيين منتظمين مستقلين $U_1, U_2 \sim \text{Uniform}(0, 1)$، يمكن صياغة التحويل الرياضي المباشر لإنتاج زوج مستقل تماماً من القيم الطبيعية القياسية كالتالي:

$$Z_1 = \sqrt{-2 \ln(U_1)} \cos(2\pi U_2)$$

$$Z_2 = \sqrt{-2 \ln(U_1)} \sin(2\pi U_2)$$

على الرغم من دقة وجمال خوارزمية بوكس-مولر النظرية، إلا أنها تعاني من كلفة حسابية ملحوظة عند التطبيق البرمجي الضخم؛ إذ تتطلب حساب دوال مثلثية ولوغاريتمية وجذور تربيعية لكل زوج من الأرقام المولدة، وهي عمليات تستهلك دورات معالجة مركزية (CPU cycles) مرتفعة مقارنة بالعمليات الحسابية الأساسية. وقد دفع هذا القصور الباحثين لتطوير الصيغة القطبية لمرساليا (Marsaglia polar method) التي تتجنب الدوال المثلثية، ومن ثم تطوير خوارزميات أسرع بكثير مثل خوارزمية زيغورات.

2.2 خوارزمية زيغورات (Ziggurat Algorithm)

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

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

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

2.3 دالة الكثافة الاحتمالية (PDF) ودالة التوزيع التراكمي (CDF)

تُعرف دالة الكثافة الاحتمالية (Probability Density Function – PDF) للتوزيع الطبيعي العام بالصيغة الرياضية الشهيرة:

$$f(x; \mu, \sigma) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left( -\frac{(x – \mu)^2}{2\sigma^2} \right)$$

حيث يمثل الثابت $\pi \approx 3.14159$ نسبة محيط الدائرة إلى قطرها، بينما يمثل $e \approx 2.71828$ أساس اللوغاريتم الطبيعي (ثابت أويلر). يُعد التعبير $\frac{1}{\sigma \sqrt{2\pi}}$ معامل معايرة وتطبيع (Normalizing Constant) يضمن هندسياً أن تكامل الدالة عبر كامل خط الأعداد الحقيقية من $-\infty$ إلى $+\infty$ يساوي تماماً 1.

بالمقابل، تعبر دالة التوزيع التراكمي (Cumulative Distribution Function – CDF)، والتي يُرمز لها بالرمز $F(x)$ أو $Phi(z)$، عن الاحتمال التراكمي بأن يأخذ المتغير العشوائي $X$ قيمة أقل من أو تساوي قيمة محددة $x$. وتُعرف بالتكامل التالي:

$$F(x) = P(X le x) = \int_{-\infty}^{x} f(t) , dt$$

نظراً لعدم إمكانية حل هذا التكامل بصيغة جبرية مغلقة باستخدام الدوال الأولية البسيطة، يُحسب التوزيع التراكمي باستخدام دالة الخطأ التكاملي الخاصة (Error Function – $\text{erf}$) عبر العلاقة:

$$F(x) = \frac{1}{2} \left[ 1 + \text{erf}\left( \frac{x – \mu}{\sigma \sqrt{2}} \right) \right]$$

تكتسب هذه الدوال أهمية قصوى في توليد الأرقام العشوائية عبر ما يُعرف بطريقة تحويل الاحتمال العكسي (Inverse CDF Method أو Quantile Function). في هذه الطريقة، يتم توليد رقم عشوائي منتظم $U \sim \text{Uniform}(0, 1)$ وتمريره إلى مقلوب دالة التوزيع التراكمي $X = F^{-1}(U)$ للحصول على قيمة تتبع التوزيع الطبيعي. ورغم أن هذه الطريقة ممتازة نظرياً وتُستخدم بكثرة في المحاكاة الإحصائية لحساب نقاط المئين والدرجات الحرجة، إلا أنها تتطلب تقريبات عددية معقدة لدالة الخطأ العكسية تجعلها أبطأ في التطبيقات الإنتاجية مقارنة بخوارزمية زيغورات.

3. إعداد بيئة العمل وتجهيز حزم بايثون المتخصصة

3.1 تثبيت وضبط المكتبات الأساسية للحوسبة العلمية

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

  • NumPy: الحزمة الأساسية للحوسبة المصفوفية وتوليد المصفوفات متعددة الأبعاد وإجراء العمليات الحسابية الموجهة (Vectorized Operations) فائقة السرعة.
  • SciPy: تضم مكتبة scipy.stats التي تحتوي على ترسانة ضخمة من دوال التوزيعات الاحتمالية النظرية، والاختبارات الإحصائية الاستدلالية، وتقدير المعالم.
  • Matplotlib: المكتبة القياسية للرسم البياني وتوليد المخططات عالية الجودة وإعداد الرسوم للمنشورات الأكاديمية.
  • Seaborn: مكتبة مبنية فوق Matplotlib توفر واجهة رسومية راقية لتمثيل البيانات الإحصائية، وتقدير الكثافة الاحتمالية، وتوليد الخرائط الحرارية والمخططات التوزيعية المعقدة.
  • Pandas: لمعالجة وتنظيم البيانات الإحصائية في هياكل جداول متقدمة (DataFrames) تسهل استخراج التقارير والتحليلات الوصفية.

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

pip install numpy scipy matplotlib seaborn pandas

يضمن التثبيت السليم لهذه الحزم توافق المعالجات الرياضية وقدرتها على استغلال تسريع العمليات الحسابية المكتوبة بلغات منخفضة المستوى مثل C وFortran المدمجة في صلب مكتبتي NumPy وSciPy.

3.2 هيكلة دفتر العمل البرمجي واستدعاء الوحدات المعيارية

يتطلب العمل الإحصائي المنهجي كتابة تعليمات برمجية واضحة ومنظمة وفق أعلى معايير هندسة البرمجيات العلمية (PEP 8). يبدأ دفتر العمل أو البرنامج باستدعاء الحزم واستيراد الوحدات الفرعية الضرورية مع ضبط خيارات العرض البياني وتنسيق الأرقام العشرية لضمان قراءة أكاديمية مريحة للنتائج. فيما يلي الهيكلية المعيارية الموصى بها لبدء أي مشروع محاكاة إحصائية:

يتم استيراد الحزم بأسماء الاختصار المعيارية المتفق عليها عالمياً:

  • استيراد numpy بالاسم المختصر np.
  • استيراد scipy.stats بالاسم المختصر stats.
  • استيراد matplotlib.pyplot بالاسم المختصر plt.
  • استيراد seaborn بالاسم المختصر sns.
  • استيراد pandas بالاسم المختصر pd.

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

4. التوليد الأساسي للتوزيع الطبيعي باستخدام دالة numpy.random.normal

4.1 البنية التركيبية والمعاملات المحددة لدالة numpy.random.normal

تُعد الدالة numpy.random.normal إحدى الدوال الأساسية والأكثر استخداماً في تاريخ مكتبة NumPy لإنشاء مصفوفات من الأرقام العشوائية التي تتبع التوزيع الطبيعي المستمر. تعتمد هذه الدالة على ثلاثة معاملات رئيسية تحدد معالم العينة الناتجة بدقة متناهية:

  • loc (المتوسط الحسابي – Float or Array-like): يمثل مركز التوزيع وقيمته المتوقعة ($\mu$). يحدد هذا المعامل موقع قمة منحنى الجرس على المحور الأفقي. القيمة الافتراضية له هي 0.0.
  • scale (الانحراف المعياري – Float or Array-like): يمثل مقياس التشتت والانتشار ($\sigma$). يجب أن تكون هذه القيمة موجبة تماماً وغير سالبة أو صفرية، حيث يؤدي تمرير قيمة سالبة إلى إطلاق خطأ استثنائي (ValueError). القيمة الافتراضية له هي 1.0.
  • size (حجم وشكل المصفوفة – Int or Tuple of Ints): يحدد الأبعاد الهندسية للمصفوفة المولدة وعدد العينات. إذا تُرك فارغاً (None)، فإن الدالة تعيد قيمة عددية مفردة (Scalar). وإذا تم تمرير رقم صحيح مثل size=1000 تُنتج مصفوفة أحادية البعد تحتوي على ألف عنصر، في حين يتيح تمرير زوج مرتب مثل size=(50, 10) توليد مصفوفة ثنائية الأبعاد تتألف من 50 صفاً و10 أعمدة.

عند استدعاء الدالة بدون تمرير أي معاملات إطلاقاً، أي بالشكل numpy.random.normal()، تعيد الدالة تلقائياً رقماً عشوائياً واحداً مسحوباً من التوزيع الطبيعي القياسي ذي المتوسط 0 والانحراف المعياري 1، مما يبرز التناسق التصميمي لواجهة الدالة البرمجية.

4.2 كتابة وتنفيذ أول كود لتوليد عينة بيانات موزعة طبيعياً

لتوليد أول عينة بيانات إحصائية موزعة طبيعياً، نستعرض خطوات إنشاء مصفوفة أحادية البعد تحتوي على 200 قيمة موزعة بمتوسط حسابي محدد مسبقاً وليكن $\mu = 0$ وانحراف معياري $\sigma = 1$. يتم تنفيذ ذلك برمجياً عبر استدعاء الدالة كالتالي:

sample_1d = np.random.normal(loc=0.0, scale=1.0, size=200)

عند فحص المصفوفة المولدة sample_1d، نجد أن نوع البيانات الافتراضي (Data Type) هو أرقام عشرية ذات دقة مزدوجة float64 بعرض 64 بت في الذاكرة، وهو المعيار الذي يوفر دقة تصل إلى حوالي 15-17 منزلة عشرية ذات مغزى رياضي. وعند استعراض القيم الأولى للعينة، نلاحظ تباين القيم الإيجابية والسلبية حول الصفر، حيث تقع معظم الأرقام داخل النطاق $[-2, +2]$ مع ظهور قيم نادرة تتجاوز ذلك.

تتميز الدالة بمرونة استثنائية في التحكم بأبعاد المصفوفات؛ إذ يمكن توليد مصفوفة ثنائية الأبعاد تمثل مثلاً درجات 100 مشارك في 5 اختبارات نفسية عبر ضبط size=(100, 5)، أو حتى مصفوفة ثلاثية الأبعاد size=(10, 20, 30) لنمذجة تجارب متعددة الأبعاد. عند حساب المتوسط الحسابي والانحراف المعياري الفعلي للعينة المولدة حديثاً، نلاحظ وجود فروق طفيفة بين المعالم التجريبية (Empirical Sample Parameters) والمعالم النظرية المحددة سلفاً في المعاملات، وهو تباين طبيعي يعزى إلى خطأ المعاينة العشوائية (Sampling Variability) الذي يتلاشى تدريجياً كلما زاد حجم العينة.

4.3 مقارنة دالة numpy.random.normal مع الدوال البديلة في NumPy

تقدم مكتبة NumPy عدة دوال بديلة لتوليد المتغيرات الطبيعية، مما يثير تساؤلات منهجية حول الفروق الدقيقة بينها واستخداماتها المثلى. من أبرز هذه الدوال التاريخية دالة numpy.random.randn. صُممت randn كواجهة ملائمة تحاكي بيئة برنامج MATLAB، وتستقبل أبعاد المصفوفة كمعاملات موضعية مفردة (مثل np.random.randn(100, 5)) بدلاً من تمرير كائن (tuple). ومع ذلك، تقتصر randn حصراً على توليد التوزيع الطبيعي القياسي ($mu=0, sigma=1$)، مما يتطلب من الباحث إجراء عمليات ضرب وجمع خطية يدوية لتعديل المتوسط والانحراف المعياري.

كذلك توفر المكتبة دالة numpy.random.standard_normal، والتي تؤدي نفس الوظيفة الرياضية لـ randn من حيث تقييد المخرجات بالتوزيع القياسي، لكنها تستقبل معاملات الحجم والأبعاد كـ tuple متسق برمجياً مع سائر دوال بايثون الحديثة (مثل size=(100, 5)).

يُفضل مجتمع علوم البيانات والحوسبة الأكاديمية استخدام دالة numpy.random.normal أو واجهة المولدات الحديثة لعدة أسباب منهجية: وضوح الكود (Readability)، والتحكم المباشر في معلمتي الموضع والمقياس عبر وسائط مسماة صراحة دون الحاجة للتحويلات اليدوية، وتقليل احتمالات الأخطاء البرمجية الناتجة عن نسيان ترتيب العمليات الحسابية عند تعديل المقاييس. ومن حيث استهلاك الذاكرة وسرعة المعالجة، تتطابق هذه الدوال تقريباً في الكفاءة لكونها تعتمد جميعها في الخلفية على ذات المحركات الخوارزمية المكتوبة بلغة C.

5. ضمان قابلية إعادة الإنتاج العلمي وإدارة البذور العشوائية (Random Seeds)

5.1 أهمية البذرة العشوائية (Seed) في النمذجة الأكاديمية والتجريبية

تعتمد الحواسيب الرقمية على خوارزميات حتمية (Deterministic Algorithms) لتوليد ما يُعرف تقنياً بالأرقام شبه العشوائية (Pseudo-random Numbers – PRNGs). هذه الأرقام ليست عشوائية بالمعنى الفلسفي المطلق، بل هي متتاليات عددية تبدو عشوائية إحصائياً وتتحدد بالكامل بواسطة قيمة ابتدائية تُعرف بالبذرة العشوائية (Random Seed). إذا بدأت الخوارزمية من نفس البذرة، فإنها ستولد بالضبط نفس المتتالية من الأرقام العشوائية في كل مرة وبدقة مطلقة.

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

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

5.2 التحول نحو النظام الحديث لتوليد الأرقام العشوائية عبر Generator و BitGenerator

أجرت مكتبة NumPy في إصدارها 1.17 تحولاً معمارياً جذرياً في فلسفة توليد الأرقام العشوائية، حيث أعلنت رسمياً تقادم المولد العام القديم (Legacy RandomState المرتبط بـ np.random.seed) والانتقال التام إلى النظام الحديث القائم على كائنات المولد المستقلة (Generator API). يفصل النظام الحديث بذكاء بين محرك توليد البتات العشوائية النقية (BitGenerator مثل PCG64 الافتراضي) وبين طبقة التوزيعات الإحصائية (Generator) التي تحول تلك البتات إلى توزيعات احتمالية محددة كالتوزيع الطبيعي.

تتم التوصية البرمجية المعيارية اليوم بإنشاء كائن مولد مخصص باستخدام الدالة المصنعية np.random.default_rng(seed). يتميز هذا النهج الحديث بعدة مزايا حاسمة:

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

لتوليد توزيع طبيعي باستخدام النظام الحديث، ننشئ المولد أولاً ثم نستدعي دالة normal الملحقة به:

rng = np.random.default_rng(seed=12345)
modern_sample = rng.normal(loc=10.0, scale=2.5, size=1000)

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

6. التحليل الإحصائي الاستكشافي والوصفي للبيانات المولدة

6.1 حساب معالم النزعة المركزية والتشتت ومقارنتها بالقيم النظرية

بمجرد توليد العينة العشوائية، تأتي مرحلة الفحص الإحصائي الاستكشافي (Exploratory Data Analysis – EDA) لتقييم مدى تطابق خصائص البيانات المولدة تجريبياً مع المعالم النظرية المستهدفة. نبدأ بحساب المتوسط الحسابي التجريبي باستخدام دالة numpy.mean، والذي يُعد مقدراً غير متحيز لمتوسط المجتمع الإحصائي. يُحسب خطأ التقدير عبر إيجاد الفرق المطلق أو النسبي بين متوسط العينة والمتوسط النظري المستهدف ($\mu$).

عند حساب الانحراف المعياري التجريبي باستخدام numpy.std أو التباين باستخدام numpy.var، يبرز تفصيل إحصائي دقيق وحاسم يتعلق بدرجات الحرية (Degrees of Freedom). افتراضياً، تحسب مكتبة NumPy الانحراف المعياري بقسمة مجموع المربعات على حجم العينة الكلي $N$ (أي ddof=0)، وهو ما يمثل مقدر التباين للمجتمع الكامل ولكنه مقدر متحيز لعينة مأخوذة من مجتمع. لضمان الحصول على مقدر العينة غير المتحيز (Sample Standard Deviation – تصحيح بيسل Bessel’s Correction)، يتعين دائماً ضبط المعامل ddof=1، والذي يقسم مجموع المربعات على $N – 1$.

يلعب حجم العينة ($N$) دوراً حاسماً ومباشراً في تقارب المعالم التجريبية من القيم الحقيقية، وفقاً لقانون الأعداد الكبيرة (Law of Large Numbers). فعند توليد عينة صغيرة بحجم $N = 30$، قد نلاحظ انحراف المتوسط التجريبي عن المتوسط النظري بقيم محسوسة، ولكن مع زيادة حجم العينة إلى $N = 10,000$ أو $N = 1,000,000$، يتقارب المتوسط والانحراف المعياري التجريبيان بشكل مذهل ليتطابقا مع القيم النظرية حتى المنازل العشرية الثالثة والرابعة. كما يتم حساب الوسيط والمدى الربيعي (Interquartile Range – IQR) كإجراء مكمل للتحقق من استقرار التوزيع ومقاومة التقديرات لأي قيم طرفية نادرة.

6.2 تقييم التماثل والتفرطح (Skewness and Kurtosis)

لا يكتمل التحليل الوصفي للتوزيع الطبيعي دون فحص العزوم الإحصائية العليا (Higher Statistical Moments)، وتحديداً العزم الثالث المتمثل في معامل الالتواء (Skewness)، والعزم الرابع المتمثل في معامل التفرطح (Kurtosis). توفر مكتبة scipy.stats دوال متخصصة ودقيقة لحساب هذه المؤشرات الحيوية.

يقيس معامل الالتواء، المحسوب بدالة scipy.stats.skew، مدى تناظر التوزيع حول متوسطه الحسابي. في التوزيع الطبيعي النظري المثالي، تكون قيمة الالتواء مساوية تماماً للصفر ($Skew = 0$). تشير القيمة الموجبة لالتواء العينة إلى وجود ذيل طويل يمتد نحو اليمين (Right-skewed)، في حين تشير القيمة السالبة إلى امتداد الذيل نحو اليسار (Left-skewed). في العينات المولدة عشوائياً ذات الحجم الكافي، يجب أن تكون قيمة الالتواء قريبة جداً من الصفر (مثلاً بين $-0.05$ و $+0.05$)، وتُعزى أي فروق طفيفة إلى التذبذب العشوائي للمعاينة.

من جانب آخر، يقيس معامل التفرطح، المحسوب عبر scipy.stats.kurtosis، ثقل وسمك أطراف التوزيع وارتفاع قمته المركزية مقارنة بالتوزيع الطبيعي. تطبق دالة SciPy افتراضياً تعريف التفرطح الزائد (Excess Kurtosis)، والذي يطرح القيمة 3 (وهي التفرطح المطلق للتوزيع الطبيعي) من الناتج. وبذلك، يكون التفرطح الزائد النظري للتوزيع الطبيعي مساوياً للصفر تماماً ($Kurtosis_{excess} = 0$)، ويُطلق على التوزيع في هذه الحالة اسم التوزيع معتدل التفرطح (Mesokurtic). تدل القيم الموجبة على توزيع ثقيل الأطراف ومدبب القمة (Leptokurtic)، بينما تدل القيم السالبة على توزيع خفيف الأطراف ومفلطح القمة (Platykurtic).

6.3 بناء جدول ملخص إحصائي شامل للعينات المولدة

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

يتضمن هذا الجدول عادةً حساب الخطأ المعياري للمتوسط (Standard Error of the Mean – SEM) الذي يقيس دقة تقدير متوسط المجتمع ويُحسب بالصيغة:

$$SEM = \frac{s}{\sqrt{N}}$$

بالإضافة إلى حساب فترة الثقة للمتوسط بمستوى ثقة 95% (95% Confidence Interval)، والتي تُحدد النطاق الذي يُتوقع أن يقع داخله متوسط المجتمع الحقيقي بنسبة يقين إحصائي تبلغ 95% وفق المعادلة:

$$\text{CI}_{95%} = \bar{X} \pm 1.96 \times SEM$$

يوضح الجدول التالي مثالاً أكاديمياً شاملاً يلخص مقارنة المعالم لعينة مولدة برمجياً بحجم $N = 100,000$ تم استهداف توليدها بمتوسط نظري $\mu = 100.0$ وانحراف معياري $\sigma = 15.0$:

المعلم الإحصائي (Parameter / Statistic) القيمة النظرية المستهدفة (Theoretical) القيمة التجريبية للعينة (Empirical Sample) الخطأ المطلق (Absolute Error) دالة بايثون المستخدمة (Python Function)
حجم العينة (Sample Size – N) 100,000 100,000 0 len(data)
المتوسط الحسابي (Mean – $\mu$) 100.0000 100.0124 +0.0124 np.mean(data)
الانحراف المعياري (Std Dev – $\sigma$) 15.0000 14.9918 -0.0082 np.std(data, ddof=1)
التباين (Variance – $\sigma^2$) 225.0000 224.7541 -0.2459 np.var(data, ddof=1)
الوسيط (Median) 100.0000 100.0086 +0.0086 np.median(data)
معامل الالتواء (Skewness) 0.0000 +0.0031 +0.0031 stats.skew(data)
التفرطح الزائد (Excess Kurtosis) 0.0000 -0.0074 -0.0074 stats.kurtosis(data)
الخطأ المعياري (SEM) 0.0474 0.0474 0.0000 stats.sem(data)
حد الثقة 95% الأدنى 99.9070 99.9195 +0.0125 mean - 1.96*sem
حد الثقة 95% الأعلى 100.0930 100.1053 +0.0123 mean + 1.96*sem

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

7. التمثيل البصري المتقدم ومنحنيات التوزيع الطبيعي

7.1 رسم المدرج التكراري (Histogram) وحساب الكثافة التكرارية

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

عند بناء المدرج التكراري باستخدام دالة matplotlib.pyplot.hist، يتعين الانتباه بدقة لمعامل التطبيع والمطابقة الاحتمالية density=True. فبشكل افتراضي، يعرض المحور الرأسي التكرارات العددية الخام (Counts)، وهي قيم تعتمد كلياً على حجم العينة ولا يمكن مقارنتها مباشرة بالمنحنى الرياضي النظري. ولكن عند تفعيل density=True، يقوم Matplotlib بمعايرة المدرج بحيث تصبح المساحة الإجمالية لكافة الأعمدة التكرارية مساوية تماماً للواحد الصحيح، مما يحول المحور الرأسي إلى مقياس للكثافة الاحتمالية (Probability Density) المتطابق في وحداته مع دالة الكثافة النظرية.

تؤثر استراتيجية اختيار عدد الفئات التكرارية (Number of Bins) وعرضها على إدراكنا لشكل التوزيع؛ فاختيار عدد قليل جداً من الفئات يؤدي إلى فرط التبسيط (Oversmoothing) وإخفاء معالم التوزيع، بينما يؤدي اختيار عدد كبير جداً إلى تفتيت البيانات وظهور تقلبات وتعرجات عشوائية مضللة (Undersmoothing). تتيح بايثون استخدام خوارزميات تحسين تلقائية لتقدير العرض المثالي للفئات، مثل قاعدة فريدمان-دياكونيس (Freedman-Diaconis rule الممررة بالخيار bins='fd') التي تعتمد على المدى الربيعي وحجم العينة لمقاومة القيم الشاذة، أو قاعدة ستورجز (bins='sturges')، مما يضمن بناء مدرج تكراري متوازن يبرز التناظر الغوسي بأعلى دقة ممكنة.

7.2 ملاءمة منحنى الجرس النظري فوق المدرج التكراري

لإجراء تقييم بصري مقارن، يتم تراكب منحنى دالة الكثافة الاحتمالية النظرية (Theoretical PDF Curve) مباشرة فوق المدرج التكراري التجريبي. تُنفذ هذه العملية عبر استدعاء دالة scipy.stats.norm.pdf التي تحسب الكثافة الرياضية الدقيقة عند كل نقطة بناءً على المتوسط والانحراف المعياري المحددين.

تبدأ الخطوات البرمجية بإنشاء مجال قيمي مستمر ومنتظم بدقة عالية عبر دالة numpy.linspace، يمتد من أدنى قيمة في العينة إلى أقصى قيمة فيها (أو ضمن نطاق $\mu \pm 4\sigma$) وبعدد نقاط كافٍ (مثلاً 1000 نقطة) لضمان انسيابية المنحنى:

x_axis = np.linspace(mu - 4*sigma, mu + 4*sigma, 1000)
pdf_fitted = stats.norm.pdf(x_axis, loc=mu, scale=sigma)

يتم بعد ذلك رسم المدرج التكراري التجريبي باللون الأزرق المهدأ مع درجة شفافية (alpha=0.6) لمنع حجب الرؤية، ثم يُرسم منحنى الكثافة النظري فوقه كخط متصل بارز باللون الأحمر أو الأسود (color='crimson', linewidth=2.5). يتيح هذا التراكب المزدوج للباحث والمراجع التحقق بالعين المجردة من مدى محاذاة قمم وأطراف الأعمدة التكرارية للمسار الرياضي لمنحنى غاوس المثالي، ورصد أي فجوات أو تشوهات قد تكون نتجت عن خطأ في التوليد الخوارزمي.

7.3 التمثيل المتقدم باستخدام مكتبة Seaborn ومخططات KDE

توفر مكتبة Seaborn إمكانات تمثيل إحصائي متقدمة تتفوق في جاذبيتها البصرية وثرائها التحليلي عبر دوال مثل sns.histplot و sns.kdeplot. تقدم هذه الدوال تقنية تقدير الكثافة بالنواة (Kernel Density Estimation – KDE)، وهي وسيلة إحصائية لا معلمية (Non-parametric) لتنعيم البيانات وبناء منحنى كثافة تجريبي مستمر انطلاقاً من النقاط العينية مباشرة دون افتراض مسبق لشكل التوزيع.

عند دمج المدرج التكراري مع منحنى KDE عبر تمرير المعامل kde=True في دالة sns.histplot، يمكننا في آن واحد مشاهدة التوزيع التجريبي الخام والمنحنى الأملس المقدر. كما تتيح تقنيات التخصيص الرسومي تظليل المساحات الواقعة أسفل المنحنى لتمثيل فترات الثقة ونطاقات الانحرافات المعيارية ($\pm 1\sigma, \pm 2\sigma, \pm 3\sigma$) بألوان متباينة، مع إضافة خطوط عمودية متقطعة تشير بدقة إلى موضع المتوسط والوسيط.

عند إعداد هذه المخططات للنشر في المجلات العلمية والتقارير الأكاديمية المحكمة، يُوصى بضبط لوحة الألوان لتكون متوافقة مع الطباعة ومعايير إمكانية الوصول لذوي عمى الألوان (مثل لوحات colorblind أو viridis)، وضبط التسميات التوضيحية للمحاور (X-label و Y-label) بوحدات القياس الدقيقة، وكتابة عناوين رئيسية وفرعية شارحة، وحفظ الرسوم بصيغ متجهة عالية النقاء مثل PDF أو SVG، أو بصيغة PNG بدقة 300 DPI عبر استدعاء plt.savefig('distribution_plot.png', dpi=300, bbox_inches='tight').

8. التحقق الإحصائي واختبارات افتراض التوزيع الطبيعي (Normality Testing)

8.1 اختبار شابيرو-ويلك (Shapiro-Wilk Test)

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

تتم صياغة الفرضيات الإحصائية في اختبار شابيرو-ويلك وفق الهيكلية المعيارية التالية:

  • فرضية العدم ($H_0$): العينة مسحوبة من مجتمع يتبع التوزيع الطبيعي.
  • الفرضية البديلة ($H_1$): العينة مسحوبة من مجتمع لا يتبع التوزيع الطبيعي.

يُنفذ الاختبار في بايثون بسهولة فائقة باستخدام الدالة scipy.stats.shapiro(data)، والتي تعيد قيمتين: إحصاء الاختبار $W$ والقيمة الاحتمالية للدلالة الإحصائية (p-value). تتراوح قيمة $W$ بين 0 و1؛ حيث تشير القيم القريبة جداً من 1 (مثل 0.998) إلى تطابق ممتاز مع الطبيعية. تتلخص قاعدة اتخاذ القرار الإحصائي في مقارنة قيمة p-value بمستوى الدلالة المعياري المختار مسبقاً (عادة $\alpha = 0.05$):

  • إذا كانت $\text{p-value} > 0.05$: نفشل في رفض فرضية العدم ($H_0$)، ونستنتج أنه لا يوجد دليل إحصائي كافٍ على عدم طبيعية البيانات، مما يعني قبول افتراض التوزيع الطبيعي.
  • إذا كانت $\text{p-value} le 0.05$: نرفض فرضية العدم ونقبل الفرضية البديلة، مما يدل على أن البيانات تنحرف بشكل دال إحصائياً عن التوزيع الطبيعي.

من المهم التنبيه منهجياً إلى حساسية اختبار شابيرو-ويلك الشديدة لحجم العينة؛ فهو مصمم أساساً للعينات الصغيرة والمتوسطة (حتى $N = 5000$). في العينات الضخمة جداً، يصبح الاختبار مفرط الحساسية لأتفه الانحرافات العشوائية الميكروسكوبية التي لا قيمة عملية لها، مما يؤدي لرفض فرضية العدم بشكل مضلل، ولذا يُفضل الاعتماد على اختبارات بديلة أو الفحص البصري في العينات المليونية.

8.2 اختبار كولموجوروف-سميرنوف (Kolmogorov-Smirnov Test) واختبار داجوستينو

يقدم التحليل الإحصائي الاستدلالي اختبارات تكميلية هامة لمعالجة مختلف أحجام البيانات وطبيعتها. من أبرز هذه الاختبارات اختبار كولموجوروف-سميرنوف للعينة الواحدة (One-sample K-S Test)، والمطبق عبر دالة scipy.stats.kstest. يعتمد هذا الاختبار على قياس أقصى مسافة رأسية مطلقة (تُعرف بالإحصاء $D$) بين دالة التوزيع التراكمي التجريبية للعينة ($F_n(x)$) ودالة التوزيع التراكمي النظرية المستهدفة ($F_0(x)$). يتميز اختبار K-S بكونه اختباراً عاماً غير مقيد بحجم عينة محدد، إلا أنه يتطلب تحديد معالم المجتمع ($\mu$ و $\sigma$) بشكل مسبق ومستقل عن العينة لضمان دقة القيمة الاحتمالية.

أما لاختبار العينات المتوسطة والكبيرة، فيبرز اختبار داجوستينو وبيرسون الشامل (D’Agostino’s K-squared Test)، والذي توفره دالة scipy.stats.normaltest. يمتلك هذا الاختبار قوة إحصائية فائقة وتصميماً رياضياً بديعاً؛ إذ يقوم بدمج اختباري الالتواء والتفرطح معاً في إحصاء كاي-تربيعي مركب بدرجتي حرية ($K^2 = Z_{skew}^2 + Z_{kurt}^2$). يختص هذا الاختبار بالكشف المباشر عن أي تشوه في شكل التوزيع، سواء كان ناجماً عن عدم التناظر أو عن ثقل الأطراف، مما يجعله الخيار الأمثل لفحص عينات البيانات الضخمة التي تفشل معها خوارزمية شابيرو-ويلك.

يقارن الجدول المنهجي التالي بين الاختبارات الثلاثة من حيث القوة الإحصائية ونطاق التطبيق الموصى به:

اسم الاختبار الإحصائي الدالة البرمجية في SciPy حجم العينة المثالي (N) الأساس الرياضي للاختبار نقاط القوة والقيود المنهجية
اختبار شابيرو-ويلك (Shapiro-Wilk) stats.shapiro $3 le N le 5000$ معامل الانحدار الخطي للرتب ضد نقاط المئين الطبيعية أعلى قوة إحصائية للعينات الصغيرة والمتوسطة؛ يفقد دقته مع العينات الضخمة جداً.
اختبار داجوستينو-بيرسون (D’Agostino’s $K^2$) stats.normaltest $N ge 20$ (ممتاز للعينات الضخمة) تحويل الالتواء والتفرطح إلى درجات معيارية ودمجهما في كاي-تربيعي كفاءة استثنائية في كشف أسباب عدم الطبيعية (ذيل ثقيل أو التواء)؛ يتطلب حجماً لا يقل عن 20.
اختبار كولموجوروف-سميرنوف (KS-Test) stats.kstest كافة الأحجام (مع تحديد المعالم المسبقة) المسافة القصوى المطلقة بين منحنيي التوزيع التراكمي التجريبي والنظري اختبار لامعلمي مرن؛ حساسيته في مركز التوزيع أعلى من حساسيته عند الأطراف.

8.3 التقييم التشخيصي البصري باستخدام مخطط الاحتمال الطبيعي (Q-Q Plot)

على الرغم من الأهمية الحاسمة للاختبارات الإحصائية الرقمية، إلا أن اتخاذ قرار منهجي قطعي حول طبيعية البيانات يتطلب دائماً دمجه بالتشخيص البصري عبر مخطط التجزيء-التجزيء الطبيعي (Quantile-Quantile Plot أو Q-Q Plot). يقوم هذا المخطط برسم نقاط التجزيء المئينية الملاحظة في العينة التجريبية على المحور الرأسي في مواجهة نقاط التجزيء النظرية المتوقعة من التوزيع الطبيعي القياسي المقابل على المحور الأفقي.

يتم بناء المخطط في بايثون باستخدام دالة scipy.stats.probplot المدمجة مع Matplotlib عبر الأمر البرمجي:

stats.probplot(data, dist="norm", plot=plt)

ينتج عن هذا الاستدعاء خط مرجعي مستقيم بزاوية 45 درجة تقريباً يمثل مسار الطبيعية المثالية (Theoretical 45-degree Reference Line)، وتتوزع نقاط العينة الفعلية حول هذا الخط.

يتيح التفسير البصري لمخطط Q-Q تشخيصاً دقيقاً لطبيعة أي خلل في بنية البيانات المولدة وفق القواعد الإكلينيكية والتشخيصية التالية:

  • التوزيع الطبيعي المثالي: تصطف جميع نقاط البيانات بدقة متناهية على طول الخط المرجعي المستقيم من البداية إلى النهاية دون أي انحرافات جوهرية.
  • الالتواء الموجب (يميني): تنحرف النقاط عند كلا الطرفين لتشكل منحنى مقعراً للأعلى يرتفع فوق الخط المستقيم عند الأطراف العليا وينحرف أسفله عند الأطراف الدنيا.
  • الالتواء السالب (يساري): تتخذ النقاط شكلاً محدباً للأسفل ينحني تحت الخط المستقيم.
  • ذيول ثقيلة (Heavy Tails / Leptokurtic): تتخذ النقاط شكلاً حرفياً يشبه الحرف الإنجليزي “S”، حيث تسقط النقاط في الطرف الأيسر أسفل الخط، بينما ترتفع نقاط الطرف الأيمن أعلى الخط، مما يدل على وجود قيم متطرفة بأكثر مما يتنبأ به التوزيع الطبيعي.
  • ذيول خفيفة (Light Tails / Platykurtic): ترتفع نقاط الطرف الأيسر فوق الخط وتسقط نقاط الطرف الأيمن أسفله في نمط عكسي يدل على غياب القيم المتطرفة وانضغاط التوزيع.

9. توليد التوزيعات الطبيعية متعددة المتغيرات (Multivariate Normal Distribution)

9.1 الأسس الرياضية للتوزيع الطبيعي ثنائي ومتعدد الأبعاد

في العديد من الدراسات النفسية، والطبية، والاقتصادية، لا تأتي المتغيرات بمعزل عن بعضها البعض، بل تترابط في منظومات متكاملة تتسم بالتغاير والارتباط المشترك. يمثل التوزيع الطبيعي متعدد المتغيرات (Multivariate Normal Distribution) التعميم الرياضي للتوزيع أحادي البعد ليشمل متجهاً من المتغيرات العشوائية $k$-الأبعاد: $\mathbf{X} = [X_1, X_2, dots, X_k]^T$.

يتحدد هذا التوزيع بالكامل من خلال معلمتين أساسيتين:

  • متجه المتوسطات (Mean Vector – $boldsymbol{\mu}$): متجه ذو طول $k$ يحتوي على المتوسط الحسابي النظري لكل متغير من المتغيرات الفردية: $boldsymbol{\mu} = [\mu_1, \mu_2, dots, \mu_k]^T$.
  • مصفوفة التباين والتغاير المشترك (Covariance Matrix – $boldsymbol{\Sigma}$): مصفوفة مربعة متناظرة ذات أبعاد $k \times k$. تحتوي عناصر القطر الرئيسي للمصفوفة على التباينات الفردية لكل متغير ($\sigma_i^2 = \text{Var}(X_i)$)، بينما تحتوي العناصر خارج القطر على التغايرات المشتركة بين كل زوج من المتغيرات ($\sigma_{ij} = \text{Cov}(X_i, X_j)$).

يُعبر التغاير عن طبيعة العلاقة الخطية؛ فالقيمة الموجبة تدل على تزايد طردي مشترك بين المتغيرين، والسالبة تدل على تناقص عكسي، بينما تعني القيمة الصفرية انعدام الارتباط الخطي التام، وهو ما يكافئ الاستقلال الإحصائي في حالة التوزيع الطبيعي تحديداً. يشترط رياضياً في مصفوفة التغاير $boldsymbol{\Sigma}$ أن تكون مصفوفة متناظرة وشبه موجبة ومحددة (Symmetric Positive Semi-Definite Matrix)، أي أن تكون جميع قيمها الذاتية (Eigenvalues) غير سالبة، وهو الشرط الهندسي الذي يضمن أن تكون التباينات الناتجة قيماً حقيقية وموجبة دائماً.

تُعطى دالة الكثافة الاحتمالية المشتركة للتوزيع متعدد المتغيرات بالمعادلة المصفوفية:

$$f(\mathbf{x}) = \frac{1}{\sqrt{(2\pi)^k |boldsymbol{\Sigma}|}} \exp\left( -\frac{1}{2} (\mathbf{x} – boldsymbol{\mu})^T boldsymbol{\Sigma}^{-1} (\mathbf{x} – boldsymbol{\mu}) \right)$$

حيث يمثل $|boldsymbol{\Sigma}|$ محدد المصفوفة (Determinant)، بينما يمثل $boldsymbol{\Sigma}^{-1}$ مقلوب مصفوفة التغاير (Inverse Covariance Matrix أو مصفوفة الدقة Precision Matrix).

9.2 التطبيق البرمجي باستخدام numpy.random.multivariate_normal

تتيح لغة بايثون توليد التوزيعات الطبيعية متعددة المتغيرات بسهولة وكفاءة فائقة عبر دالة multivariate_normal المتاحة ضمن كائن المولد الحديث في مكتبة NumPy. لتوضيح ذلك عملياً، نفترض أننا نرغب في توليد عينة لمتغيرين نفسيين مرتبطين (مثل: مستوى القلق $X_1$ ودرجة الاكتئاب $X_2$) لعينة من 5000 مشارك، بمتوسطات $\mu_1 = 50, \mu_2 = 100$، وتبايانات $\sigma_1^2 = 25, \sigma_2^2 = 64$، ومعامل ارتباط خطي مقصود $r = 0.70$.

يتم أولاً حساب التغاير النظري المشترك بالمعادلة:

$$\text{Cov}(X_1, X_2) = r \times \sigma_1 \times \sigma_2 = 0.70 \times 5 \times 8 = 28.0$$

تتم صياغة الكود البرمجي التنفيذي على النحو التالي:

mean_vector = [50.0, 100.0]
cov_matrix = [[25.0, 28.0], [28.0, 64.0]]
rng = np.random.default_rng(seed=42)
bivariate_sample = rng.multivariate_normal(mean=mean_vector, cov=cov_matrix, size=5000)

تنتج عن هذه العملية مصفوفة بيانات ذات أبعاد (5000, 2). للتحقق الإحصائي الصارم من دقة التوليد، نطبق دالة حساب مصفوفة التغاير التجريبية numpy.cov مع تمرير المعامل rowvar=False للإشارة إلى أن الأعمدة تمثل المتغيرات:

empirical_cov = np.cov(bivariate_sample, rowvar=False)

وعند فحص المصفوفة الناتجة، نجد أن التباينات والتغايرات التجريبية تقترب بدقة استثنائية من القيم المدخلة في مصفوفة التغاير النظرية، مما يؤكد سلامة واستقرار المحاكاة الرياضية.

9.3 التمثيل البصري للتوزيعات متعددة المتغيرات

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

  • مخطط الانتشار مع خطوط الكفاف (Scatter Plot with Contour Lines): يتم رسم نقاط البيانات الفردية في المستوى الثنائي، وتراكب خطوط الكفاف متساوية الكثافة فوقها. تتخذ هذه الخطوط شكل قطع ناقص متحدة المركز (Concentric Ellipses)؛ حيث يشير امتداد وميلان المحور الرئيسي للقطع الناقص إلى اتجاه وقوة التغاير المشترك.
  • مخطط التوزيعات المشتركة والهامشية (Seaborn Jointplot): توفر دالة sns.jointplot(x=..., y=..., kind='kde') تمثيلاً بيانياً شاملاً يجمع في لوحة موحدة بين خريطة الكثافة الثنائية في المركز، والمدرجات التكرارية أو منحنيات KDE الهامشية (Marginal Distributions) أحادية البعد لكل متغير على حدة أعلى ويمين المخطط.
  • التمثيل السطحي ثلاثي الأبعاد (3D Surface Plot): يمكن استخدام وحدة mpl_toolkits.mplot3d في Matplotlib لإنشاء شبكة إحداثيات ثنائية عبر numpy.meshgrid وحساب الكثافة الاحتمالية المشتركة عند كل نقطة، ثم رسم سطح ثلاثي الأبعاد يعكس قمة الجرس المتناظرة الشاهقة وانحدارها الانسيابي في الفضاء الفراغي ثلاثي الأبعاد.

10. تطبيقات ونمذجة المحاكاة في أبحاث العلوم السلوكية والنفسية

10.1 محاكاة درجات اختبارات الذكاء والمقاييس النفسية المعيارية

تعتمد أبحاث القياس النفسي والسلوكي اعتماداً جوهرياً على التوزيع الطبيعي في تقنين وتفسير درجات المقاييس العقلية. يُعد مقياس ستانفورد-بينيه ومقياس ويكسلر لمعدل الذكاء العام (IQ) المثال الكلاسيكي الأبرز؛ إذ تم تصميم وتقنين هذه الاختبارات معيارياً لتتبع توزيعاً طبيعياً دقيقاً بمتوسط حسابي ثابت $\mu = 100$ وانحراف معياري ثابت $\sigma = 15$.

باستخدام بايثون، يمكن لمحاكاة مجتمع افتراضي يتألف من 100,000 فرد استخراج تقديرات إحصائية بالغة الأهمية لتوزيع القدرات العقلية وتصنيفها معيارياً وفق القواعد السيكومترية المعتمدة عالمياً:

  • فئة الموهبة الفائقة والذكاء العبقري المرتفع ($IQ ge 130$): تمثل الأفراد الذين تتجاوز درجاتهم نطاق انحرافين معياريين فوق المتوسط ($+2\sigma$). وتكشف المحاكاة البرمجية أن نسبتهم تشكل دائماً حوالي 2.27% من إجمالي المجتمع.
  • فئة متوسط الذكاء الطبيعي ($85 le IQ le 115$): تقع ضمن نطاق انحراف معياري واحد ($\pm 1\sigma$) حول المتوسط، وتشكل النسبة العظمى من البشر بما يقارب 68.26%.
  • فئة التأخر العقلي والاحتياجات الإدراكية الخاصة ($IQ le 70$): تمثل الأفراد الذين تنخفض درجاتهم عن انحرافين معياريين تحت المتوسط ($-2\sigma$)، وتبلغ نسبتهم النظرية حوالي 2.27%.

تُطبق هذه المحاكاة أيضاً في دراسة سلوك مقاييس ليكرت (Likert Scales). فعلى الرغم من أن مقاييس ليكرت تُنتج بيانات ترتيبية منفصلة (مثل: 1 إلى 5)، إلا أن السمة الكامنة المقاسة تُفترض مستمرة وموزعة طبيعياً. تتيح بايثون تحويل التوزيع الطبيعي المستمر المولّد إلى درجات منفصلة عبر تجزئة النطاق إلى عتبات محددة (Threshold Binning)، ومن ثم دراسة أثر تقييد المدى (Range Restriction) وتشويه القياس على معاملات الارتباط وثبات الاختبارات النفسية.

10.2 محاكاة أزمنة الاستجابة السلوكية ونمذجة البيانات المبتورة (Truncated Normal)

في تجارب علم النفس المعرفي والعلوم العصبية السلوكية، يُعد زمن الاستجابة الحركية والإدراكية (Reaction Time – RT) أحد أهم المتغيرات التابعة المقاسة بدقة الميلي ثانية. عند محاكاة أزمنة رد الفعل باستخدام التوزيع الطبيعي القياسي، تبرز معضلة منهجية خطيرة تتمثل في أن التوزيع النظري يمتد رياضياً إلى اللانهاية السالبة، مما قد يُنتج قيماً عشوائية سالبة أو قيماً زمنية قريبة جداً من الصفر، وهي نتائج مستحيلة فيزيولوجياً وبيولوجياً نظراً للحاجة لزمن أدنى لانتقال السيال العصبي ومعالجة الإشارة في القشرة الدماغية (والذي لا يقل عادة عن 150 إلى 200 ميلي ثانية).

لحل هذه المعضلة الحسابية، نلجأ إلى توليد التوزيع الطبيعي المبتور (Truncated Normal Distribution) باستخدام دالة scipy.stats.truncnorm. يقوم هذا التوزيع بفرض حدود دنيا وقصوى قاطعة $[a, b]$ على دالة الكثافة الاحتمالية وإعادة تطبيع المساحة المتبقية لتساوي 1، مما يمنع توليد أي قيم تقع خارج هذه الحدود الفيزيولوجية المنطقية.

تتطلب دالة scipy.stats.truncnorm في بايثون تمرير حدود البتر $a$ و $b$ محولة إلى درجات معيارية قياسية مقسومة على الانحراف المعياري:

a_cutoff, b_cutoff = 180.0, 800.0 # الحدود الدنيا والقصوى بالميلي ثانية
mu_rt, sigma_rt = 350.0, 60.0 # المتوسط والانحراف المعياري المستهدف
a_std = (a_cutoff - mu_rt) / sigma_rt
b_std = (b_cutoff - mu_rt) / sigma_rt
rt_sample = stats.truncnorm.rvs(a_std, b_std, loc=mu_rt, scale=sigma_rt, size=10000, random_state=42)

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

10.3 توليد مصفوفات البيانات للاختبارات السيكومترية وتحليل العوامل

يمثل القياس السيكومتري المتقدم وتحليل العوامل (Factor Analysis) أحد أرقى تطبيقات محاكاة التوزيعات الطبيعية متعددة المتغيرات. تعتمد النظرية الكلاسيكية للاختبارات (Classical Test Theory – CTT) على افتراض أن الدرجة الملاحظة للمفحوص على أي بند ($X$) تتكون من مركبين أساسيين: الدرجة الحقيقية الكامنة للسمة ($T$) وخطأ القياس العشوائي غير المنتظم ($E$):

$$X = T + E$$

باستخدام بايثون، يمكن للباحثين محاكاة نموذج العامل الواحد (Single Latent Factor Model) لبناء اختبار نفسي افتراضي يتألف مثلاً من 10 بنود تقيس سمة كامنة واحدة (مثل: القلق العام $\theta \sim \mathcal{N}(0, 1)$). يتم توليد درجات البنود عبر ضرب السمة الكامنة في أوزان تشبع العامل (Factor Loadings – $\lambda_i$) لكل بند، ثم إضافة حد خطأ عشوائي فريد يتبع توزيعاً طبيعياً مستقلاً بمتوسط 0 وتباين يتناسب مع التباين الفرعي للبند:

$$X_i = \lambda_i \theta + \epsilon_i \quad \text{where} \quad \epsilon_i \sim \mathcal{N}(0, \sigma_{\epsilon_i}^2)$$

تتيح مصفوفة البيانات الاصطناعية الناتجة تطبيق خوارزميات التحقق من موثوقية وثبات المقياس، وحساب معامل الاتساق الداخلي الشهير ألفا كرونباخ (Cronbach’s Alpha) برمجياً، واختبار استقرار تحليلات العوامل الاستكشافية (EFA) والتوكيدية (CFA) في استعادة أوزان التشبع الحقيقية، مما يمنح الباحثين أداة تدريبية وبحثية استثنائية لفحص جودة أدوات القياس النفسي قبل النزول إلى الميدان.

11. التحويلات الإحصائية ومعالجة البيانات غير الطبيعية

11.1 تحويل بوكس-كوكس (Box-Cox Transformation)

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

تُعرف الدالة الرياضية لتحويل بوكس-كوكس كالتالي:

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

يُشترط لتطبيق تحويل بوكس-كوكس الكلاسيكي أن تكون جميع قيم المتغير $y$ موجبة تماماً وأكبر قطيعاً من الصفر ($y > 0$). توفر مكتبة scipy.stats دالة تلقائية فائقة التطور scipy.stats.boxcox، تقوم بفحص البيانات وتقدير قيمة $lambda$ المثلى عددياً باستخدام طريقة الإمكان الأعظم (Maximum Likelihood Estimation – MLE) التي تجعل تفرطح والتواء البيانات المحولة أقرب ما يكون للتوزيع الطبيعي:

transformed_data, best_lambda = stats.boxcox(raw_skewed_data)

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

11.2 تحويل ييو-جونسون (Yeo-Johnson Transformation)

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

تُعرف معادلة ييو-جونسون بتجزئة المتغير إلى دالتين تعتمدان على إشارة $y$ وقيمة $lambda$:

$$\psi(\lambda, y) = \begin{\cases} \frac{(y + 1)^\lambda – 1}{\lambda} &a\mp; \text{if } \lambda \neq 0, y ge 0 \ln(y + 1) &a\mp; \text{if } \lambda = 0, y ge 0 -\frac{(-y + 1)^{2 – \lambda} – 1}{2 – \lambda} &a\mp; \text{if } \lambda \neq 2, y < 0 -\ln(-y + 1) &a\mp; \text{if } \lambda = 2, y < 0 \end{\cases}$$

يمكن تطبيق هذا التحويل المتقدم في بايثون إما مباشرة عبر scipy.stats.yeojohnson أو باستخدام كائن التحويل الشامل PowerTransformer(method='yeo-johnson') المتاح في مكتبة Scikit-Learn. يتيح كائن Scikit-Learn ميزة إضافية بالغة الأهمية في خطوط المعالجة للتعلم الآلي (Pipelines)، حيث يتيح إجراء التحويل العكسي (Inverse Transformation) لإعادة التنبؤات والبيانات المصنفة بعد التحليل إلى مقياسها الأصلي ووحداتها الطبيعية المفهومة للباحث وصناع القرار.

11.3 التحويل اللوغاريثمي والتربيعي والتعامل مع القيم الشاذة

بالإضافة إلى التحويلات الأسية المعقدة، توفر الحوسبة الإحصائية مجموعة من التحويلات الرياضية البسيطة والبديهية التي تُستخدم في حالات محددة:

  • التحويل اللوغاريثمي الطبيعي ($ln(X)$ أو $\log_{10}(X)$): التحويل الكلاسيكي الأكثر شيوعاً لمعالجة البيانات ذات الالتواء الإيجابي الشديد والمتغيرات التي تتضاعف قيمها مضاعفة أسية (مثل الدخل المالي، أو أحجام المدن، أو تركيزات الهرمونات). يتطلب قيماً موجبة قطيعاً، ويُطبق عبر numpy.log أو numpy.log1p للقيم التي تقترب من الصفر.
  • تحويل الجذر التربيعي ($\sqrt{X}$): يُستخدم بكثرة مع بيانات التعدادات المتقطعة (Count Data) التي تتبع توزيع بواسون لتقليص التشتت وتثبيت التباين عبر numpy.sqrt.
  • تحويل المقلوب ($1/X$): تحويل حاد يُستخدم لعكس المقاييس وتقليص القيم العالية جداً مثل أزمنة قطع المسافات وتحويلها إلى سرعات.

ترتبط معالجة التوزيع الطبيعي ارتباطاً وثيقاً بكشف وعلاج القيم الشاذة المتطرفة (Outliers). تُعد طريقة الدرجة المعيارية (Z-score Method) الوسيلة القياسية المباشرة لتشخيص الشذوذ؛ حيث تُعتبر أي مشاهدة تتجاوز درجتها المعيارية النطاق $|Z| > 3.0$ (أي تبعد بأكثر من 3 انحرافات معيارية عن المتوسط) قيمة متطرفة نادرة الحدوث إحصائياً (أقل من 0.27% احتمالية ظهور).

تتضمن استراتيجيات التعامل المنهجي مع هذه القيم الشاذة: إما الحذف المشروط للقيم الناتجة عن أخطاء إدخال واضحة، أو تطبيق عملية الوينزرة (Winsorization عبر scipy.stats.mstats.winsorize) التي تقوم باستبدال القيم المتطرفة بقيم العتبات المئينية القصوى (مثل المئين 1 والمئين 99) لمنع تشويه المتوسط الحسابي، أو استخدام التقديرات الحصينة (Robust Estimators) مثل الوسيط والمدى الربيعي لضمان استقرار ونزاهة النماذج الإحصائية.

12. أفضل الممارسات البرمجية وتحسين الأداء عند توليد البيانات الضخمة

12.1 التحسين الحسابي وإدارة الذاكرة مع العينات المليونية (Big Data Simulation)

عند الانتقال من التجارب الأكاديمية المصغرة إلى دراسات المحاكاة الضخمة في النمذجة الإحصائية وعلم الجينوم والبيانات الكبيرة، يصبح الاستهلاك الراموي (RAM Utilization) وزمن التنفيذ الحسابي (Computational Latency) عائقين رئيسيين إن لم تُدار الموارد البرمجية بحكمة وكفاءة هندسية.

تتمثل أولى استراتيجيات التحسين في الاختيار الدقيق والمدروس لنوع البيانات المخزنة (Data Types). افتراضياً، تنشئ مكتبة NumPy المصفوفات العائمة بدقة 64 بت (float64)، حيث يستهلك كل رقم عشري مفرد 8 بايتات من الذاكرة العشوائية. في التطبيقات التي تتطلب توليد 100 مليون رقم، يستهلك هذا التوزيع حوالي 800 ميجابايت من الذاكرة دفعة واحدة. في المقابل، يتيح التحويل الصريح إلى الدقة الأحادية 32 بت (float32) أو تمرير المعامل dtype=np.float32 تقليص استهلاك الذاكرة إلى النصف تماماً (400 ميجابايت فقط)، مع الحفاظ على دقة تصل إلى 7 منازل عشرية، وهي دقة فائقة وكافية تماماً لمعظم التطبيقات السلوكية والإحصائية.

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

تتيح بايثون أدوات دقيقة لقياس كفاءة الأداء البرمجي وإدارة الذاكرة، مثل التعليمة السحرية %timeit في بيئات Jupyter لقياس زمن التنفيذ بالأجزاء من الألف من الثانية، واستخدام مكتبة tracemalloc القياسية لتتبع ذروة استهلاك الذاكرة (Peak Memory Allocation) بدقة بايتية مطلقة، مما يمكن المطور من تحسين الشيفرة ومقارنة الحلول الخوارزمية بموضوعية تامة.

12.2 التوازي والتوليد العشوائي المتعدد عبر النوى (Parallel Random Generation)

مع تطور المعالجات متعددة الأنوية (Multi-core Processors) والحوسبة الموزعة، أصبحت موازاة عمليات المحاكاة الإحصائية مطلباً أساسياً لتقليص أزمنة التشغيل من ساعات إلى ثوانٍ معدودة. ومع ذلك، ينطوي التوليد العشوائي المتوازي على خطر منهجي جسيم وشائع يُعرف بتداخل الحالات وارتباط العينات (Statistical Cross-Correlation).

يقع هذا الخطأ الكارثي عندما يقوم المبرمج بتمرير نفس البذرة العشوائية (Seed) لجميع خيوط المعالجة المتوازية (Processes/Threads) عبر مكتبة multiprocessing أو concurrent.futures. يؤدي هذا التكرار إلى قيام جميع الأنوية بتوليد نفس الأرقام العشوائية المتطابقة بدقة، مما يدمر فرضية استقلال العينات ويجعل نتائج دراسات مونت كارلو باطلة علمياً وإحصائياً.

لحل هذه المعضلة حاسوبياً، يوفر النظام الحديث في NumPy كائن متتالية البذور المتقدمة (SeedSequence). يقوم هذا الكائن بتفريع الحالة الابتدائية بأمان وتوليد بذور مستقلة تماماً إحصائياً لكل نواة معالجة عبر دالة SeedSequence.spawn:

ss = np.random.SeedSequence(123456789)
child_seeds = ss.spawn(num_workers) # توليد بذور مستقلة بعدد خيوط المعالجة
generators = [np.random.default_rng(s) for s in child_seeds]

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

12.3 دليل الأخطاء الشائعة واستكشاف المشكلات البرمجية وحلها

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

الخطأ الشائع (Common Pitfall) التشخيص والتأثير السلبي (Impact) الحل البرمجي الصحيح (Best Practice Solution)
الخلط بين التباين والانحراف المعياري تمرير التباين ($\sigma^2$) كمدخل لمعامل scale بدلاً من الانحراف المعياري ($\sigma$)، مما يضاعف التشتت بصورة كارثية. التأكد دائماً من أن scale = np.sqrt(variance) أو استخدام قيمة الانحراف المعياري مباشرة.
استخدام ddof=0 الافتراضي في حساب تباين العينة الحصول على مقدر تباين متحيز يقلل من تشتت المجتمع في العينات الصغيرة والمتوسطة. تمرير المعامل ddof=1 صراحة دائماً عند حساب الانحراف المعياري للعينة: np.std(data, ddof=1).
الاعتماد على المولد العام القديم np.random.seed حدوث تسرب في الحالة العشوائية (State Leakage) بين المهام البرمجية وضعف الكفاءة الحسابية. الاعتماد الحصري على المولد الحديث المستقل: rng = np.random.default_rng(seed).
مصفوفة تغاير غير موجبة التحديد في التوزيع متعدد المتغيرات إطلاق خطأ رياضي (LinAlgError) بسبب وجود ارتباطات خطية مستحيلة رياضياً أو قيم ذاتية سالبة. التحقق من تماثل المصفوفة وتطبيق تفكيك القيمة المفردة أو استخدام scipy.linalg.cholesky للتحقق المسبق.
الحكم على عدم الطبيعية من اختبار شابيرو-ويلك في عينات مليونية رفض افتراض الطبيعية بسبب حساسية الاختبار المفرطة للفروق الهامشية غير المؤثرة عملياً. الاعتماد على اختبار داجوستينو ومخططات Q-Q ومؤشرات الالتواء والتفرطح العملية عند التعامل مع $N > 5000$.

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

خاتمة

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

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

References

  • Box, G. E., & Muller, M. E. (1958). A note on the generation of random normal deviates. The Annals of Mathematical Statistics, 29(2), 610-611. https://doi.org/10.1214/aoms/1177706645
  • 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
  • D’Agostino, R. B., & Pearson, E. S. (1973). Tests for departure from normality. Empirical results for the distributions of $b_2$ and $\sqrt{b_1}$. Biometrika, 60(3), 613-622. https://doi.org/10.1093/biomet/60.3.613
  • Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357-362. https://doi.org/10.1038/s41586-020-2649-2
  • Marsaglia, G., & Tsang, W. W. (2000). The ziggurat method for generating random variables. Journal of Statistical Software, 5(8), 1-7. https://doi.org/10.18637/jss.v005.i08
  • O’Neill, M. E. (2014). PCG: A family of simple fast space-efficient statistically good algorithms for random number generation (Harvey Mudd College Computer Science Department Technical Report HMC-CS-2014-0905). Harvey Mudd College. https://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf
  • Shapiro, S. S., & Wilk, M. B. (1965). An analysis of variance test for normality (complete samples). Biometrika, 52(3/4), 591-611. https://doi.org/10.2307/2333709
  • Virtanen, P., Gommers, R., Oliphant, T. E., Haberland, M., Reddy, T., Cournapeau, D., … & SciPy 1.0 Contributors. (2020). SciPy 1.0: Fundamental algorithms for scientific computing in Python. Nature Methods, 17(3), 261-272. https://doi.org/10.1038/s41592-019-0686-2
  • Waskom, M. L. (2021). Seaborn: statistical data visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021
  • Yeo, I. K., & Johnson, R. A. (2000). A new family of power transformations to improve normality or symmetry. Biometrika, 87(4), 954-959. https://doi.org/10.1093/biomet/87.4.954

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

looti, M. (2026, أغسطس 27). كيفية إنشاء توزيع طبيعي في بايثون (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-generate-normal-distribution-python-examples/
looti, Mohammed. “كيفية إنشاء توزيع طبيعي في بايثون (مع أمثلة).” عرب سايكلوجي, 27 أغسطس 2026, https://arabpsychology.com/statistics/how-to-generate-normal-distribution-python-examples/.
looti, Mohammed. “كيفية إنشاء توزيع طبيعي في بايثون (مع أمثلة).” عرب سايكلوجي. أغسطس 27, 2026. https://arabpsychology.com/statistics/how-to-generate-normal-distribution-python-examples/.