برمجة بايثون, علم البيانات

بانداس: كيفية استخدام describe() حسب المجموعة


يمثل التحليل الاستكشافي للبيانات (Exploratory Data Analysis – EDA) حجر الزاوية في أي دراسة إحصائية متقدمة أو مشروع معالجة بيانات في عصر تدفق المعلومات الضخمة. في خضم تعقيدات مجموعات البيانات المعاصرة، لا يكفي الاكتفاء بفحص السجلات الفردية أو الاعتماد على المؤشرات الإجمالية العامة التي قد تخفي تحت طياتها تباينات جوهرية بين الفئات والشرائح المختلفة. إن فهم الخصائص الهيكلية والتوزيعية للبيانات يتطلب أدوات برمجية وإحصائية تجمع بين الدقة الرياضية والمرونة الحسابية، وهو ما تقدمه بامتياز مكتبة Pandas في لغة البرمجة بايثون (Python)، والتي باتت المعيار الصناعي والأكاديمي الفعلي للتعامل مع البيانات الجدولية والمصفوفات الإحصائية.

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

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

1. مقدمة شاملة للتحليل الإحصائي الاستكشافي باستخدام مكتبة Pandas

1.1 مفهوم التحليل الاستكشافي للبيانات (EDA) وأهميته الإحصائية

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

يشكل الإحصاء الوصفي (Descriptive Statistics) الركيزة التشغيلية للتحليل الاستكشافي، حيث يعمل على تلخيص الأبعاد الكبرى للبيانات عبر معايير كمية محددة تقيس النزعة المركزية (Central Tendency) كالمتوسط الحسابي والوسيط، والتشتت والتباين (Dispersion and Spread) كالانحراف المعياري والمدى الربيعي. قبل الشروع في بناء خوارزميات التعلم الآلي أو إجراء اختبارات الدلالة الإحصائية المعلمية مثل تحليل التباين (ANOVA) أو الانحدار الخطي، يجب أن يمتلك الباحث رؤية واضحة حول توزيع البيانات وشكل تماثلها أو التوائها، لضمان استيفاء شروط النمذجة وتفادي التقديرات المضللة.

تحتل مكتبة Pandas موقع الصدارة في المنظومة البرمجية للغة بايثون لمعالجة البيانات، حيث تقدم هياكل بيانات عالية الكفاءة مثل إطار البيانات (DataFrame) والسلسلة (Series). توفر هذه الهياكل واجهات برمجية غنية تتيح إجراء العمليات المتجهية السريعة (Vectorized Operations) على المصفوفات المعقدة والجداول المليونية. بفضل تكاملها الوثيق مع مكتبات الحساب العلمي مثل NumPy ومكتبات التصور البياني مثل Matplotlib وSeaborn، أصبحت Pandas المنصة المفضلة لبناء خطوط أنابيب استكشاف البيانات وتنظيفها وتجهيزها للتحليل المعمق.

1.2 وظيفة التابع describe() في تلخيص المؤشرات الإحصائية

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

يقوم التابع افتراضياً بحساب ثمانية مؤشرات إحصائية أساسية للمتغيرات الكمية العددية: عدد القيم غير المفقودة (count)، المتوسط الحسابي (mean)، الانحراف المعياري للعينة (std)، القيمة الصغرى المطلقة (min)، المئين الخامس والعشرون (25% أو الربع الأول Q1)، المئين الخمسون (50% أو الوسيط Median)، المئين الخامس والسبعون (75% أو الربع الثالث Q3)، والقيمة العظمى المطلقة (max). تشكل هذه المقاييس الخمسة الأخيرة ما يُعرف إحصائياً باسم “ملخص القيم الخمس” (Five-Number Summary)، والذي يقدم تقييماً غير معلمي قوي لبنية التوزيع التكراري.

تختلف الاستجابة التشغيلية للتابع describe() بحسب طبيعة المتغير المدخل ونوعه التخزيني داخل الذاكرة. فعند تطبيقه على المتغيرات الرقمية (الصحية والعائمة)، يولد المؤشرات الإحصائية المستمرة المذكورة سابقاً. أما عند تطبيقه على المتغيرات الفئوية (Categorical) أو النصية (Object)، فإنه يتحول تلقائياً لحساب مقاييس نوعية تشمل: إجمالي عدد المشاهدات الصالحة (count)، عدد الفئات الفريدة غير المتكررة (unique)، الفئة الأكثر تكراراً أو المنوال (top)، والتردد المطلق لتلك الفئة المهيمنة (freq)، مما يجعله أداة شاملة لمختلف أنواع البيانات.

1.3 ضرورة التحليل الموزع حسب المجموعات (Grouping Paradigm)

في معظم التطبيقات العلمية والعملية، نادراً ما تكون مجموعات البيانات متجانسة بالكامل، بل تتألف عادةً من مجتمعات فرعية (Sub-populations) ذات خصائص سلوكية وهيكلية متباينة. إن الاقتصار على تحليل المؤشرات الإحصائية الشاملة لإطار البيانات ككل قد يؤدي إلى الوقوع فيما يعرف بـ “مفارقة سيمبسون” (Simpson’s Paradox)، حيث تختفي العلاقات الحقيقية أو تنعكس تماماً عند دمج الفئات معاً. من هنا تنشأ الضرورة المنهجية لتقسيم البيانات إلى مجموعات فرعية متجانسة لمقارنة الفروق المعنوية والأنماط الداخلية لكل فئة على حدة.

تعتمد مكتبة Pandas في تنفيذ هذا التحليل الموزع على نموذج برمجي وتحليلي شهير يُعرف باسم نموذج “التقسيم والتطبيق والدمج” (Split-Apply-Combine)، والذي صاغه عالم البيانات هادلي ويكهام (Hadley Wickham). يقتضي هذا النموذج تجزئة مجموعة البيانات الأصلية إلى مجموعات مستقلة بناءً على متغير تصنيفي، ثم تطبيق دالة إحصائية معينة (مثل describe()) على كل مجموعة فرعية بمعزل عن الأخرى، وأخيراً إعادة دمج النتائج المنفصلة في هيكل بياني منظم ومتناسق يسهل قراءته ومقارنته.

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

2. البنية البرمجية الأساسية لدمج groupby() مع describe()

2.1 الصياغة التركيبية (Syntax) لدمج التابعين

تعتمد الصياغة البرمجية لتنفيذ التلخيص الإحصائي الموزع على استدعاء التابع groupby() متبوعاً باختيار المتغيرات المستهدفة وتمرير التابع describe(). تأخذ البنية التركيبية القياسية الشكل البرمجي التالي: df.groupby('group_var')['values_var'].describe()، حيث يمثل df كائن إطار البيانات، ويمثل group_var اسم العمود أو قائمة الأعمدة التي تتضمن المتغيرات الفئوية المحددة لمجموعات التقسيم، بينما يمثل values_var العمود الكمي الخاضع للقياس الإحصائي.

يتطلب التحديد الدقيق لعمود التجميع وعمود القياس فهماً لطبيعة الكائنات المرجعة في كل مرحلة من مراحل التنفيذ. فعند استدعاء df.groupby('group_var')، لا تُنفذ العمليات الحسابية فوراً، بل يتم إنشاء كائن تجميع مؤجل من فئة DataFrameGroupBy. وعند تحديد العمود الكمي عبر معامل الفهرسة ['values_var']، يتحول الكائن إلى SeriesGroupBy. وعند إلحاق التابع describe() في نهاية السلسلة، يتم إطلاق شرارة الحساب التجميعي وتوليد المخرجات النهائية.

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

2.2 آلية عمل محرك التجميع (Split-Apply-Combine) داخلياً

لتنفيذ هذه العملية بكفاءة عالية، يقوم محرك التجميع الداخلي في مكتبة Pandas بإدارة دورة حياة البيانات عبر المراحل الثلاث لنموذج (Split-Apply-Combine) بتنسيق برمجي دقيق. في مرحلة التقسيم الأولى (Split)، يقوم المحرك بفحص عمود التجميع واستخراج كافة القيم الفريدة (Unique Keys)، ثم يقوم بإنشاء خريطة فهرسة تفرز الصفوف الأصلية وتعين كل صف إلى المجموعة الفرعية الخاصة به في الذاكرة دون الحاجة إلى استنساخ البيانات أو إنشاء نسخ مكررة غير ضرورية، وهو ما يحافظ على كفاءة الذاكرة المؤقتة.

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

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

2.3 الأنواع الإرجاعية (Return Types) وخصائص الـ DataFrame المخرَج

يتميز الكائن الناتج عن تنفيذ df.groupby('group_var')['values_var'].describe() بكونه إطار بيانات (DataFrame) ثنائي الأبعاد، إلا أنه يمتلك بنية فهرسة متقدمة تتطلب فهماً دقيقاً لخصائصها التخزينية والتشغيلية. يتم بناء الفهرس الرأسي (Index) كفهرس متعدد المستويات (MultiIndex)، حيث يحمل المستوى الصفري (Level 0) أسماء وتصنيفات المجموعات الفرعية، بينما يحمل المستوى الأول (Level 1) أسماء المقاييس الإحصائية الثمانية المكررة لكل مجموعة.

عند التحقق من سلامة البيانات الناتجة وأنواع الأعمدة البرمجية (Data Types)، نجد أن الأعمدة الإحصائية التي تمثل المقاييس المستمرة (مثل mean وstd والربيعيات) يتم تحويلها تلقائياً إلى النوع العائم (float64)، حتى وإن كانت البيانات الأصلية في العمود المجمع صحيحة (int64)، وذلك لضمان الدقة الحسابية العالية لنتائج القسمة والجذور التربيعية. أما مقياس العدد (count) فيُعامل حسابياً كقيمة عائمة أو صحيحة تضمن رصد حجم المشاهدات بدقة متناهية.

يتيح هذا التكوين الهيكلي للباحث الاستفادة من كافة توابع الفهرسة والتقطيع المتقدمة المتاحة في Pandas، مثل .loc و.iloc و.xs (Cross-section). يمكن للمحلل استخراج قيم إحصائية بعينها لمجموعة محددة، أو استخلاص مقياس موحد (كالمتوسط أو الانحراف المعياري) عبر كافة المجموعات دفعة واحدة، مما يمنح مرونة فائقة في إعادة هيكلة التقارير وتصديرها إلى صيغ متعددة الاستخدامات.

3. التشريح الدقيق للمقاييس الإحصائية المضمنة في مخرجات describe()

3.1 مقاييس التكرار والنزعة المركزية (count, mean)

يعد مقياس العدد (count) المؤشر الإحصائي الأول الذي يستهل به التابع describe() مخرجاته، وهو يمثل التردد المطلق للمشاهدات الصالحة المكتملة داخل كل مجموعة فرعية. تكمن القيمة المنهجية لهذا المقياس في استبعاده التلقائي للقيم المفقودة (NaN / Null Values)، مما يوفر للمحلل تقييماً دقيقاً لحجم العينة الفعلي المستخدم في حساب بقية المؤشرات، ويسمح باكتشاف التفاوت في اكتمال البيانات وجودتها بين المجموعات المصنفة المختلفة.

يمثل المتوسط الحسابي (mean) مركز الثقل الرياضي لتوزيع القيم داخل المجموعة، ويُحسب بقسمة المجموع التراكمي لكافة المشاهدات على حجم العينة الفعلي للمجموعة وفق المعادلة الرياضية الكلاسيكية:

$$\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i$$

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

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

3.2 مقاييس التشتت والتباين (std)

يقيس الانحراف المعياري للعينة (Sample Standard Deviation – std) درجة تباعد وتشتت المشاهدات الفردية حول متوسطها الحسابي داخل كل مجموعة فرعية. تعتمد مكتبة Pandas في حسابه على الصيغة الرياضية غير المتحيزة التي تتضمن تصحيح بيسل (Bessel’s Correction)، حيث يتم تقسيم مجموع مربعات الفروق عن المتوسط على درجات الحرية للعينة ($N – 1$) بدلاً من ($N$):

$$s = \sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i – \bar{x})^2}$$

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

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

يرتبط الانحراف المعياري ارتباطاً وثيقاً باتساع التوزيع الاحتمالي للمتغير قيد الدراسة؛ فوفقاً للقاعدة التجريبية للتوزيع الطبيعي المعياري (Empirical Rule)، تقع حوالي 68% من المشاهدات ضمن نطاق انحراف معياري واحد من المتوسط ($\bar{x} \pm 1s$)، بينما تقع 95% من المشاهدات ضمن نطاق انحرافين معياريين ($\bar{x} \pm 2s$). تتيح مقارنة هذه النسب المستخلصة من describe() تقييماً بصرياً ورياضياً سريعاً لمدى التزام كل مجموعة فرعية بخصائص التوزيع الطبيعي المتماثل.

3.3 ملخص القيم الخمس ومقاييس الموضع (min, 25%, 50%, 75%, max)

تكتمل المخرجات الإحصائية للتابع describe() بما يُعرف بملخص القيم الخمس، والذي يستهل بمقياسي النهايتين: القيمة الصغرى المطلقة (min) والقيمة العظمى المطلقة (max). يحدد هذان المقياسان الحدود القصوى للمشاهدات داخل كل مجموعة، ويسمح حسابهما باستخراج المدى الإجمالي للتغير ($Range = Max – Min$). يوفر المدى نظرة أولية سريعة على الاتساع الشامل للمجموعة ويساعد في اكتشاف الأخطاء المدخلة الواضحة مثل القيم السالبة في المتغيرات غير المقبولة منطقياً.

يمثل المئين الخمسون (50%) الوسيط الإحصائي (Median)، وهو القيمة العددية التي تقسم التوزيع المرتب تصاعدياً إلى نصفين متساويين؛ بحيث تقع 50% من المشاهدات دونه و50% فوقه. يتميز الوسيط بكونه مقياساً حصيناً ومتيناً (Robust Statistic) للنزعة المركزية، إذ لا يتأثر إطلاقاً بوجود القيم المتطرفة أو الذيول التوزيعية الطويلة. عند مقارنة المتوسط بالوسيط لكل مجموعة، يمكن للمحلل فوراً استنتاج شكل الالتواء؛ فإذا كان المتوسط أكبر بكثير من الوسيط دل ذلك على التواء موجب لليمين (Right Skewness)، وإذا كان العكس دل على التواء سالب لليسار (Left Skewness).

يمثل المئينان الخامس والعشرون (25% – الربع الأول Q1) والخامس والسبعون (75% – الربع الثالث Q3) نقاط القطع الربعية للتوزيع. يمثل الفرق الحسابي بين هذين المقياسين المدى الربيعي (Interquartile Range – IQR):

$$IQR = Q_3 – Q_1$$

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

4. تطبيق عملي: تحليل إحصائيات أداء الفرق الرياضية خطوة بخطوة

4.1 بناء وتجهيز إطار البيانات (DataFrame Setup)

لتطبيق هذه المفاهيم الرياضية والبرمجية بصورة عملية متكاملة، سنقوم بإنشاء سيناريو تطبيقي يعتمد على بيانات الأداء الرياضي لفرق كرة السلة المحترفة. يتضمن هذا السيناريو متغيراً تصنيفياً هو الفريق (team)، ومتغيرين كميين مستمرين هما: النقاط المسجلة في المباريات (points)، والتمريرات الحاسمة التي تم تقديمها (assists). سنقوم بتهيئة البيانات وتغذيتها بملاحظات تعكس تبايناً واقعياً بين مستويات الأداء الهجومي والتنظيمي.

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

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

4.2 تنفيذ كود التجميع الإحصائي لمتغير النقاط (Points)

ننتقل الآن إلى تنفيذ الاستعلام البرمجي الأساسي لتلخيص الأداء التهديفي للفرق. يتم تطبيق الصياغة: df.groupby('team')['points'].describe(). يقوم محرك Pandas بتقسيم إطار البيانات إلى مجموعتين منفصلتين بناءً على الفئات المحددة في عمود team (وليكن الفريق A والفريق B)، ثم يُخضع عمود النقاط لكل فريق لعمليات الحساب الإحصائي الثمانية، ليعيد دمج النتائج في جدول مقارنة أنيق وثنائي الفهرسة.

عند فحص المخرجات المباشرة الناتجة عن هذا الكود، تتجلى الفروق الرياضية الواضحة بين المجموعتين. يظهر الجدول المخرج أن الفريق A يمتلك حجماً إحصائياً (count) يبلغ 8 مباريات بمتوسط تهديفي (mean) قدره 12.0 نقطة، وانحراف معياري (std) يبلغ 3.2 نقطة تقريباً، بمدى يتراوح بين قيمة صغرى (min) تساوي 8 نقاط وقيمة عظمى (max) تبلغ 18 نقطة، مع وسيط (50%) يقف عند 11.5 نقطة.

في المقابل، تظهر مخرجات الفريق B أداءً مختلفاً تماماً؛ حيث يبلغ متوسط النقاط 22.0 نقطة لنفس عدد المباريات، مع انحراف معياري يقارب 5.8 نقطة، ومدى يتراوح بين 15 و31 نقطة، ووسيط يبلغ 21.0 نقطة. يوضح هذا التقرير الإحصائي الفوري تفوقاً هجومياً كاسحاً للفريق B على الفريق A في الحصيلة الإجمالية ومعدلات التسجيل، مما يوفر إجابة كمية فورية لتساؤلات التقييم التنافسي.

4.3 قراءة وتفسير النتائج الإحصائية بأسلوب بحثي رصين

إن القراءة النقدية المتعمقة لهذه المخرجات تكشف أبعاداً أعمق تتجاوز مجرد المقارنة السطحية للمتوسطات التهديفية. فرغم أن الفريق B يمتلك قوة هجومية واضحة ومعدل تسجيل أعلى بنسبة تقارب 83% مقارنة بالفريق A (22.0 مقابل 12.0)، إلا أن مؤشرات التشتت تكشف عن جانب آخر من الأداء؛ حيث يرتفع الانحراف المعياري للفريق B إلى 5.8 مقارنة بـ 3.2 للفريق A، مما يشير إلى أن الفريق A أكثر استقراراً وتجانساً في أدائه وثباتاً في معدلات تسجيله عبر المباريات، بينما يعاني الفريق B من تقلبات حادة في حصيلته الهجومية بين مباراة وأخرى.

عند دراسة تماثل التوزيع استناداً إلى مقارنة الوسيط بالمتوسط الحسابي، نجد أن متوسط الفريق A (12.0) قريب جداً من وسيطه (11.5)، كما أن الفرق بين الربيع الأول (9.75) والوسيط يقارب الفرق بين الوسيط والربيع الثالث (14.25)، مما يعكس توزيعاً شبه متماثل ومستقراً للنقاط. في المقابل، نجد أن وسيط الفريق B (21.0) يقل عن متوسطه (22.0)، مدفوعاً بالقيمة العظمى العالية (31 نقطة)، مما يشير إلى وجود التواء إيجابي طفيف وتأثير لمباريات استثنائية رفعت من قيمة المتوسط الإجمالي.

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

5. تطبيق describe() على متغيرات رقمية متعددة بالتوازي

5.1 تضمين قائمة من الأعمدة المستهدفة داخل التجميع

في الدراسات والبحوث المتقدمة، نادراً ما يتم تقييم الظواهر بناءً على متغير كمي واحد معزول؛ إذ يتطلب الفهم الشامل رصد عدة مؤشرات قياس متزامنة. تتيح مكتبة Pandas توسيع استعلام التجميع وتلخيص عدة متغيرات عددية بالتوازي من خلال تمرير قائمة من أسماء الأعمدة داخل معامِل الفهرسة. تأخذ الصياغة البرمجية لهذا التطبيق الشكل: df.groupby('team')[['points', 'assists']].describe()، مع ملاحظة استخدام الأقواس المزدوجة لتحديد مصفوفة المتغيرات.

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

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

5.2 تنظيم وهيكلة مصفوفة المخرجات الناتجة

إن التعامل مع إطار بيانات يحتوي على فهارس أعمدة هرمية متعددة المستويات يتطلب أدوات برمجية متخصصة للتنظيم والفرز والاستخلاص. يتألف الفهرس الهرمي للأعمدة الناتجة من مستويين أساسيين: المستوى الصفري (Level 0) ويحمل أسماء المتغيرات المقاسة (مثل points وassists)، والمستوى الأول (Level 1) ويحمل أسماء المقاييس الإحصائية التفصيلية (mean, std, min, إلخ).

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

كما تتيح توابع الفرز مثل sort_index(axis=1) إعادة ترتيب الأعمدة هجائياً أو منطقياً لتجميع المقاييس المتشابهة جنباً إلى جنب (مثلاً: وضع متوسط النقاط بجوار متوسط التمريرات)، مما يعزز من قابلية القراءة البصرية المباشرة ويسهل المقارنة التحليلية للباحث دون الحاجة إلى التنقل المستمر بين أطراف الجدول المترامي.

5.3 مقارنة السلوك الإحصائي عبر متغيرات القياس المختلفة

يتيح التحليل المتوازي لعدة متغيرات كمية استخراج مؤشرات إحصائية نسبية هامة، ومن أبرزها “معامل الاختلاف” (Coefficient of Variation – CV)، والذي يُحسب بقسمة الانحراف المعياري على المتوسط الحسابي ($CV = \frac{s}{\bar{x}}$). تكمن الأهمية الرياضية لمعامل الاختلاف في كونه مقياساً لا بعدياً للتشتت النسبي، يتيح مقارنة درجة تباين متغيرات تختلف جذرياً في وحدات قياسها أو في مقاييسها المطلقة، مثل مقارنة تشتت النقاط بتشتت التمريرات الحاسمة.

عند فحص نتائج التمريرات الحاسمة بالتوازي مع النقاط، قد نجد أن الفريق A يسجل متوسط تمريرات يبلغ 5.0 بانحراف معياري 1.0 ($CV = 0.20$)، بينما يسجل الفريق B متوسط تمريرات يبلغ 6.0 بانحراف معياري 2.4 ($CV = 0.40$). يوضح هذا الفحص النسبي أن تباين صناعة اللعب في الفريق B ضعف تباينها في الفريق A، مما يؤكد النتيجة السابقة حول عدم استقرار الأداء التكتيكي للفريق B رغم كفاءته الهجومية العامة.

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

6. التجميع الهرمي المتقدم عبر متغيرات فئوية متعددة

6.1 التجميع عبر أكثر من متغير تصنيفي (Multi-column Grouping)

تتجاوز الاحتياجات التحليلية في كثير من الأحيان مجرد التصنيف الأحادي البسيط، لتتطلب تحليلاً طبقياً متقاطعاً عبر مستويات تصنيفية متعددة. تدعم مكتبة Pandas التجميع متعدد الأعمدة عبر تمرير مصفوفة من المتغيرات الفئوية إلى دالة التجميع، مثل: df.groupby(['team', 'position'])['points'].describe(). تتيح هذه الصياغة تقسيم البيانات الأصلية وفقاً للتقاطعات التوليفية بين الفرق ومراكز اللاعبين (مثل: حارس هجومي، لاعب ارتكاز، إلخ).

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

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

6.2 إدارة مستويات الفهارس (Index Levels) وإعادة ترتيبها

تفرض الفهارس متعددة المستويات الناتجة عن التجميع الهرمي تحديات برمجية في التعامل مع البيانات واسترجاعها، لكن Pandas توفر ترسانة قوية من التوابع لإدارتها بسلاسة. يتيح التابع .xs (Cross-Section) النفاذ المباشر إلى مستوى محدد من الفهرس دون التأثير على بقية المستويات؛ حيث يمكن للمحلل مثلاً استخراج كافة الإحصاءات الخاصة بمركز “الارتكاز” (Center) عبر جميع الفرق بضربة برمجية واحدة عبر تحديد level='position'.

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

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

6.3 التطبيقات العملية للتجميع متعدد المستويات في البحوث التجريبية

يمثل التجميع متعدد المستويات حجر الزاوية في تصميم وتحليل التجارب العلمية المعقدة (Factorial Experimental Designs). في الأبحاث السريرية والدوائية على سبيل المثال، يتم استخدام هذا النموذج لتقسيم المرضى بناءً على متغير نوع العلاج (Treatment vs Control) ومتغير الفئة العمرية أو الجنس (Demographics) بالتوازي، مما يسمح بحساب المؤشرات الوصفية لكل شريحة علاجية وسكانية بدقة فائقة.

يساعد هذا التفكيك الطبقي في الكشف المبكر عن “التفاعلات الإحصائية” (Statistical Interactions) بين العوامل المستقلة قبل الشروع في بناء نماذج الانحدار الخطي المتعدد؛ حيث يمكن ملاحظة ما إذا كان تأثير دواء معين يختلف جذرياً بين الذكور والإناث، أو ما إذا كانت فعالية برنامج تدريبي تتفاوت بحسب الخبرة السابقة للموظفين، من خلال المقارنة البصرية لمتوسطات وانحرافات الخلايا المتقاطعة.

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

7. التعامل مع المتغيرات النوعية والفئوية باستخدام describe() وgroupby()

7.1 تطبيق التابع على الأعمدة النصية والتصنيفية (include=’all’)

على الرغم من أن الاستخدام النمطي للتابع describe() يركز على المتغيرات العددية، إلا أن مكتبة Pandas تتيح مرونة استثنائية للتعامل مع البيانات النوعية والنصية والفئوية. يمكن تفعيل هذه القدرة عبر تمرير المعامل include وتحديد الأنواع المطلوبة، مثل: include=['O', 'category'] أو include='all' لتشمل كافة المتغيرات بغض النظر عن طبيعتها التخزينية داخل الذاكرة.

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

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

7.2 الجمع بين المتغيرات الرقمية والفئوية في تقرير موحد

عند استخدام الخيار include='all' لتوليد تقرير إحصائي موحد وشامل يدمج المتغيرات الرقمية والنوعية معاً تحت مظلة التجميع، يواجه إطار البيانات الناتج تحدياً بنيوياً يتمثل في ظهور قيم مفقودة متبادلة (NaNs) في المقاييس غير المتوافقة رياضياً؛ حيث ستحصل المتغيرات النصية على NaN في خانات المتوسط والانحراف المعياري والربيعيات، بينما ستحصل المتغيرات الرقمية على NaN في خانات top وfreq.

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

من الناحية البرمجية وتحسين الأداء، يُنصح دائماً بتحويل الأعمدة النصية ذات التكرارات المحدودة من النوع العام object إلى النوع الفئوي المخصص category باستخدام التابع astype('category'). لا يقتصر أثر هذا التحويل على تقليل استهلاك الذاكرة بشكل هائل فحسب، بل يسرع أيضاً من عمليات التجميع الحسابية داخل محرك groupby()، ويضمن ترتيباً منطقياً مخصصاً للفئات أثناء استعراض المخرجات الإحصائية.

7.3 حالات الاستخدام لتحليل التكرارات المصنفة

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

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

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

8. إعادة التشكيل والتنسيق المتقدم لمخرجات describe()

8.1 استخدام unstack() لإعادة هيكلة الجداول المتقاطعة

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

عند تطبيق df.groupby('team')['points'].describe().unstack()، يتم نقل المقاييس الإحصائية لتصبح في مستويات الأعمدة العليا، مما ينشئ مصفوفة مقارنة أفقية مباشرة. تتيح هذه الهيكلة للباحث استعراض كافة المقاييس الإحصائية للفريق A والفريق B جنباً إلى جنب في صفوف متقابلة، وهو ما يعزز قابلية المقارنة المباشرة ويسهل تضمين الجدول في المساحات المحدودة للتقارير التنفيذية والعروض التقديمية.

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

8.2 تدوير المخرجات باستخدام التابع transpose() أو .T

يعد تدوير المصفوفات الإحصائية باستخدام خاصية التدوير .T أو التابع transpose() من الممارسات الشائعة في تحسين العرض التحليلي للبيانات. يقوم التدوير بقلب الصفوف لتصبح أعمدة والأعمدة لتصبح صفوفاً، وهو ما يتوافق تماماً مع المعايير التقليدية المتبعة في نشر الجداول الإحصائية في المجلات والدوريات العلمية؛ حيث يفضل الأكاديميون وضع المؤشرات الإحصائية كصفوف رأسية والمجموعات المقارنة كأعمدة متجاورة.

تتجلى الميزة التحليلية للتدوير عبر استخدام التعبير: df.groupby('team')['points'].describe().T، حيث تصبح أسماء الفرق (Team A, Team B) هي رؤوس الأعمدة، بينما تترتب المقاييس (count, mean, std, إلخ) في الصفوف الرأسية. يتيح هذا التنسيق للقارئ مسح أي مقياس إحصائي محدد (كالوسيط أو الانحراف المعياري) وقراءته عبر كافة المجموعات بحركة عين أفقية سريعة ومريحة دون تشتت.

يمكن دمج التدوير مع عمليات التقطيع الفهرسي لعرض مؤشرات منتقاة فقط؛ كأن يتم تدوير الجدول ثم استخراج صفوف mean وstd فقط عبر التابع .loc[['mean', 'std']]. ينتج عن هذا الدمج جدول ملخص فائق التركيز والأناقة، يقدم زبدة التحليل الإحصائي في أقل مساحة ممكنة، مما يجعله جاهزاً للاستخدام المباشر في المنشورات البحثية والتقارير الموجهة لمتخذي القرار.

8.3 تنسيق الأرقام العشرية وتخصيص أنماط العرض (Styling and Formatting)

تولد مكتبة Pandas الحسابات الإحصائية بدقة عائمة افتراضية تصل إلى 6 خانات عشرية، وهو ما قد يؤدي إلى تشويش بصري وازدحام رقمي يثقل كاهل القارئ دون داعٍ. للتحكم في هذا العرض على مستوى جلسة العمل بالكامل، يمكن استخدام أمر الضبط العام: pd.set_option('display.float_format', lambda x: '%.2f' % x)، والذي يفرض تقريب كافة القيم العشرية المخرجة إلى خانتين عشريتين فقط مع الحفاظ على الدقة الرياضية الكاملة في الذاكرة التخزينية.

لإضفاء طابع جمالي وتفاعلي متقدم على الجداول الإحصائية، توفر Pandas واجهة التنسيق المتقدمة DataFrame.style. تتيح هذه الخاصية تطبيق دوال التنسيق الشرطي والتلوين الحراري (Heatmaps) على مخرجات describe()؛ مثل استخدام .style.background_gradient(cmap='Blues') لتظليل المتوسطات أو الانحرافات المعيارية بتدرجات لونية تعكس كثافتها وقيمها النسبية، مما يبرز الفروق الجوهرية بين المجموعات بصرياً قبل قراءة الأرقام ذاتها.

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

9. معالجة القيم المفقودة (Missing Values) والبيانات الشاذة (Outliers)

9.1 سلوك describe() وgroupby() في وجود القيم المفقودة (NaNs)

تمثل البيانات المفقودة تحدياً جوهرياً في التحليل الإحصائي، ويتطلب فهم سلوك Pandas تجاهها حذراً منهجياً. افتراضياً، يتعامل محرك groupby() مع مفاتيح التجميع التي تحتوي على قيم مفقودة (NaN) باستبعادها تماماً من نتائج التلخيص والتجميع؛ حيث يتم إسقاط أي صف يحمل قيمة مفقودة في عمود التجميع التصنيفي ما لم يتم ضبط المعامل dropna=False في دالة التجميع، والذي يجبر المحرك على تخصيص مجموعة فرعية خاصة بالبيانات المجهولة كفئة قائمة بذاتها.

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

لتجنب الانحيازات الإحصائية الناشئة عن الفقد غير العشوائي للبيانات (Missing Not at Random – MNAR)، يجب على المحلل اتخاذ قرارات مسبقة إما بتعويض القيم المفقودة (Imputation) باستخدام متوسط أو وسيط المجموعة نفسها عبر التابع transform()، أو بإجراء استبعاد منهجي موثق للعينات الناقصة، لضمان أن المؤشرات الإحصائية الناتجة عن describe() تمثل المجتمع المدروس بنزاهة وحيادية تامة دون أي تزييف إحصائي غير مقصود.

9.2 كشف القيم الشاذة داخل المجموعات بناءً على مخرجات describe()

توفر المخرجات الإحصائية المجمعة للتابع describe() قاعدة صلبة لبناء خوارزميات كشف القيم الشاذة والمتطرفة (Outlier Detection) داخل كل مجموعة فرعية على حدة استناداً إلى معايير إحصائية دقيقة. تعتمد الطريقة الكلاسيكية الأكثر متانة على قاعدة جون توكي للمدى الربيعي، حيث يتم حساب الحدود والأسوار الإحصائية للمجموعة باستخدام معادلتي الحد الأدنى والأقصى:

$$Lower;Fence = Q_1 – 1.5 \times IQR$$

$$Upper;Fence = Q_3 + 1.5 \times IQR$$

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

يمكن للمحلل برمجة دوال مساعدة في بايثون تقوم باستخلاص قيم $Q_1$ و$Q_3$ من جدول describe() المجمع، وحساب الأسوار تلقائياً لكل مجموعة، ثم مطابقة إطار البيانات الأصلي لفلترة المشاهدات التي تتجاوز هذه الأسوار. يسهم هذا الفحص الآلي في عزل الأخطاء الرصدية أو الحالات الاستثنائية التي تستدعي دراسة إكلينيكية أو نوعية منفصلة، مما يرفع من جودة ونقاء البيانات المعدة للنمذجة.

9.3 تخصيص نسب المئينات (Custom Percentiles) لتشخيص أعمق للبيانات

على الرغم من أن التابع describe() يحسب افتراضياً الأرباع التقليدية (25%، 50%، 75%)، إلا أنه يوفر إمكانية متقدمة لتخصيص نقاط المئينات المئوية عبر المعامل percentiles. يمكن للمحلل تمرير مصفوفة مخصصة من القيم الكسرية مثل: percentiles=[0.01, 0.05, 0.10, 0.90, 0.95, 0.99]، لإخضاع المجموعات الفرعية لتشخيص توزيعي دقيق يستهدف فحص سلوك الذيول والظواهر النادرة.

يكتسب هذا التخصيص أهمية بالغة في المجالات المالية واقتصاديات المخاطر والتأمين (Risk Management)، حيث لا تكفي الأرباع التقليدية لرصد المخاطر الشديدة المحتملة. إن حساب المئينين الأول والخامس (1% و5%) يتيح استخراج مقياس “القيمة المعرضة للخطر” (Value at Risk – VaR) لكل مجموعة استثمارية، مما يكشف عن أقصى خسارة متوقعة في ظل الظروف السوقية المعاكسة بدقة إحصائية رصينة.

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

10. تحسين الأداء الحسابي وإدارة الذاكرة مع مجموعات البيانات الضخمة

10.1 تحليل التعقيد الزمني والحسابي للتابع describe() مع groupby()

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

يتأثر التعقيد الزمني للعملية بشدة بعدد المجموعات الفرعية الفريدة أو ما يعرف بـ “درجة التعددية الفئوية” (Cardinality). إذا كان عمود التجميع يحتوي على آلاف الفئات الفريدة (High-cardinality grouping)، فإن تكلفة إدارة الفهارس وتقسيم البيانات واستدعاء دوال الحساب بشكل متكرر تتزايد باطراد، مما قد يؤدي إلى بطء ملحوظ في زمن التنفيذ مقارنة بحساب مؤشرات إحصائية مفردة وبسيطة مثل المتوسط فقط.

في الحالات التي لا يحتاج فيها المحلل سوى لمقياسين محددين (مثل المتوسط وحجم العينة)، يصبح استدعاء describe() هدراً واضحاً للموارد الحسابية، حيث يُجبر المعالج على حساب الربيعيات والانحرافات المعيارية غير المرغوبة. في مثل هذه السيناريوهات، يتفوق استخدام التابع المخصص agg() بمراحل في السرعة وخفة المعالجة، مما يفرض على المحلل الموازنة بين شمولية المخرجات واحتياجات التحليل الفعلية.

10.2 استراتيجيات تقليل استهلاك الذاكرة وتسريع المعالجة

لتحقيق أقصى كفاءة حسابية وتسريع زمن تنفيذ groupby().describe() على مجموعات البيانات الكبيرة، يجب اتباع استراتيجيات تحسين الذاكرة من البداية. تتمثل الاستراتيجية الأولى والأكثر فاعلية في تحويل كافة أعمدة التجميع النصية إلى النوع الفئوي (Category Dtype). يتيح هذا التحويل لمحرك Pandas التعامل مع الفئات كمصفوفات رقمية مشفرة داخلياً، مما يسرع عمليات الفرز والتقسيم بنسب قد تتجاوز 300% ويقلل من استهلاك الذاكرة بشكل جذري.

تتمثل الاستراتيجية الثانية في تجنب تطبيق التجميع والتلخيص على كامل إطار البيانات دون تحديد مسبق؛ إذ يؤدي استدعاء df.groupby('group_var').describe() على جدول يضم عشرات الأعمدة إلى إجبار بايثون على حساب مئات المؤشرات الإحصائية لكافة المتغيرات بما فيها المتغيرات غير المهمة. يجب دائماً حصر الاستدعاء على الأعمدة المستهدفة فقط عبر التحديد المسبق: df.groupby('group_var')[['target1', 'target2']].describe().

علاوة على ذلك، يمكن تحسين أنواع البيانات العددية بتخفيض دقة التخزين غير الضرورية (Downcasting)؛ كتحويل الأعمدة من النوع العائم float64 إلى float32 والأعمدة الصحيحة من int64 إلى int32 أو int16، طالما كانت القيم تقع ضمن النطاقات الآمنة لتلك الأنواع، مما يقلل الحجم الإجمالي للإطار في الذاكرة بنسبة تصل إلى النصف ويسرع عمليات التجميع الحسابي الموجه.

10.3 المعالجة المتوازية والتجميع المجزأ (Chunking & Parallel Processing)

عندما يتجاوز حجم مجموعة البيانات سعة الذاكرة العشوائية المتاحة للجهاز (Out-of-Core Data)، يصبح من المستحيل تحميل الإطار دفعة واحدة لتطبيق describe() المجمع. في هذه الحالة، تلجأ الاستراتيجيات الهندسية المتقدمة إلى تقنية “المعالجة المجزأة” (Chunking)، حيث يتم قراءة البيانات وتجميعها على دفعات متتالية باستخدام المعامل chunksize في دوال القراءة مثل pd.read_csv().

تتطلب هذه التقنية دمج الإحصاءات الجزئية لكل دفعة بدقة رياضية صارمة؛ حيث يمكن تجميع الأعداد (counts) بالجمع البسيط، وتجميع المتوسطات عبر حساب المتوسط الموزون (Weighted Average) بحسب حجم عينة كل دفعة. ومع ذلك، تصبح حسابات الانحراف المعياري والربيعيات المجمعة أكثر تعقيداً وتتطلب خوارزميات إحصائية متقدمة لتحديث التباين عبر الإنترنت مثل خوارزمية ويلفورد (Welford’s Algorithm).

كبديل عملي عالي الكفاءة في بيئات البيانات فائقة الضخامة، يمكن الاستعانة بالمكتبات المتوافقة مع واجهة Pandas والمبنية على الحوسبة الموزعة والمتوازية، مثل مكتبة Dask أو مكتبة Polars أو Modin. تتيح هذه الأدوات تطبيق نفس الصيغ البرمجية لـ groupby().describe() عبر توزيع العبء الحسابي تلقائياً على كافة أنوية المعالج (Multi-threading) أو على عنقود من الخوادم الموزعة (Cluster)، مما يكسر حواجز الذاكرة ويحقق سرعات معالجة استثنائية.

11. المقارنة المنهجية بين describe() ودوال التجميع البديلة (agg, apply, transform)

11.1 الفروق الجوهرية بين describe() والتابع المخصص agg()

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

يتيح استخدام agg() دمج دوال إحصائية متقدمة لا يوفرها التابع describe() بشكل افتراضي؛ مثل حساب معامل الالتواء (Skewness)، ومعامل التفرطح (Kurtosis)، والخطأ المعياري للمتوسط (Standard Error of Mean – SEM)، أو حتى تمرير دوال مخصصة مبنية باستخدام lambda. كما تسمح agg() بتطبيق دوال إحصائية متباينة على أعمدة مختلفة في استدعاء واحد (مثل حساب المتوسط للنقاط والوسيط للتمريرات)، وهو ما يعجز عنه describe().

من حيث كفاءة الأداء وتنسيق المخرجات، تتفوق agg() عندما يكون الهدف هو استخراج تقرير إحصائي موجه وموجز؛ إذ توفر إمكانية إعادة تسمية الأعمدة الناتجة مباشرة باستخدام تقنية التجميع المسمى (Named Aggregation) مثل: df.groupby('team').agg(mean_pts=('points', 'mean'), max_pts=('points', 'max')). ينتج عن ذلك جدول نظيف ذو مستوى فهرسة أحادي جاهز للتحليل الفوري دون الحاجة إلى فك الفهارس الهرمية المعقدة الناتجة عن describe().

11.2 المقارنة مع التابعين apply() وtransform()

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

تتجلى القوة التشغيلية لـ transform() في عمليات المعايرة والتطبيع الإحصائي الموزع (Within-group Standardization / Z-score Normalization)؛ كأن يتم حساب درجات Z القياسية لنقاط كل لاعب بناءً على متوسط وانحراف فريقه الخاص عبر المعادلة: df.groupby('team')['points'].transform(lambda x: (x - x.mean()) / x.std()). يتيح ذلك دمج القيم المعايرة كأعمدة جديدة في نفس الجدول الأصلي بجوار بيانات اللاعبين دون أي تقليص للأبعاد.

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

11.3 جدول معايير الاختيار الأمثل وفق سياق التحليل البرمجي

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

عند الانتقال إلى مراحل بناء خطوط أنابيب معالجة البيانات (Data Pipelines) وتجهيز الميزات للنماذج التنبؤية (Feature Engineering)، تصبح الأفضلية المطلقة للتابعين agg() وtransform(). يتميز agg() بالسرعة الفائقة وإمكانية التحكم الصارم في هيكل الأعمدة لتغذية النماذج بملخصات محددة، بينما يبرز transform() كأداة لا غنى عنها في هندسة المتغيرات المستقلة المنسوبة إلى مجموعاتها.

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

12. أفضل الممارسات البرمجية، الأخطاء الشائعة وحلولها العملية

12.1 الأخطاء البرمجية الشائعة عند تطبيق describe() مع التجميع

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

من الأخطاء البرمجية المتكررة أيضاً الارتباك في استخراج قيم محددة من الـ MultiIndex الناتج عن العملية؛ حيث يحاول البعض استخدام معاملات الفهرسة البسيطة مثل df['mean'] مما يولد أخطاء استثناء برمجية من نوع KeyError. لتفادي هذا الالتباس، يجب استخدام الفهرسة الموضعية المتقدمة عبر .loc[(group_key, stat_key)] أو استخدام .xs() للوصول المباشر إلى القيم المستهدفة بسلاسة وأمان.

علاوة على ذلك، يبرز خطأ شائع عند التعامل مع المتغيرات الفئوية (Categorical) يتمثل في تجاهل المعامل observed في دالة التجميع. افتراضياً في الإصدارات السابقة من Pandas، كان المحرك يقوم بتوليد مخرجات لكافة الفئات المحتملة رياضياً حتى لو لم تكن موجودة فعلياً في العينة المرصودة (Unobserved Categories)، مما يملأ الجدول بصفوف فارغة وغير ضرورية. يُنصح دائماً بضبط observed=True لضمان حصر التلخيص على المجموعات الموجودة فعلياً في البيانات.

12.2 أفضل الممارسات لكتابة كود نظيف وقابل للصيانة (Clean Code)

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

يجب على المحلل توثيق الافتراضات الإحصائية وحجم العينات داخل التوثيق البرمجي المضمن (Docstrings والتعليقات). من الضروري جداً التأكد من فحص قيم count وتدوين أي ملاحظات تتعلق بعدم توازن العينات أو وجود مجموعات فرعية صغيرة قد لا تتمتع بالكفاية الإحصائية لإجراء تعميمات موثوقة، مما يضفي شفافية ومصداقية أكاديمية على الكود المكتوب.

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

12.3 الربط مع التصور البصري للبيانات (Data Visualization)

يكتمل التحليل الاستكشافي الناجح بالدمج السلس بين الجداول الإحصائية الرقمية والتمثيل البصري المعبر. تمثل مخرجات describe() المجمعة الأساس الرياضي المتين لإنشاء الرسوم البيانية الصندوقية (Boxplots) باستخدام مكتبة Seaborn المتقدمة؛ حيث تعكس الصناديق مباشرة قيم الوسيط والمدى الربيعي ($Q_1, Q_3$) والأسوار الإحصائية لكل مجموعة، مما يتيح مقارنة التوزيعات بصرياً في لمحة سريعة.

يمكن استخدام المخططات الشريطية المقترنة بفترات الثقة (Bar Charts with Error Bars) لتمثيل المتوسطات المستخرجة مع انحرافاتها المعيارية؛ حيث يساعد إظهار أشرطة الخطأ (Error Bars) المستندة إلى الانحراف المعياري أو الخطأ المعياري في إبراز درجة عدم اليقين والتشتت الداخلي لكل مجموعة، مما يمنع القارئ من الانخداع بالفروق الظاهرية بين المتوسطات فقط دون مراعاة التباين المشترك.

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

الخاتمة

تناول هذا المقال الأكاديمي الشامل التشريح المتكامل لاستخدام التابع describe() مقترناً بمحرك groupby() في مكتبة Pandas، مبرزاً دوره المحوري كأداة استكشافية وتحليلية لا غنى عنها في بيئة لغة بايثون للتحليل الإحصائي وعلم البيانات. لقد أوضحنا كيف يمكن للباحث والمحلل، من خلال هذا الدمج المنهجي القائم على نموذج (Split-Apply-Combine)، تفكيك مجموعات البيانات المعقدة وتوليد ملخصات وصفية عميقة تكشف التباينات الهيكلية، وخصائص النزعة المركزية، والتشتت النسبي للمجتمعات الفرعية بدقة رياضية متناهية وسرعة برمجية فائقة.

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

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

المراجع (References)

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

looti, M. (2026, سبتمبر 2). بانداس: كيفية استخدام describe() حسب المجموعة. عرب سايكلوجي. https://arabpsychology.com/pandas-how-to-use-describe-by-group/
looti, Mohammed. “بانداس: كيفية استخدام describe() حسب المجموعة.” عرب سايكلوجي, 2 سبتمبر 2026, https://arabpsychology.com/pandas-how-to-use-describe-by-group/.
looti, Mohammed. “بانداس: كيفية استخدام describe() حسب المجموعة.” عرب سايكلوجي. سبتمبر 2, 2026. https://arabpsychology.com/pandas-how-to-use-describe-by-group/.