التجميع والتلخيص (Groupby & Aggregation): إنشاء تقارير إحصائية برمجية
في هذا الدرس، سنتعلم كيفية استخدام تقنيات التجميع والتلخيص (Groupby & Aggregation) في Python باستخدام مكتبة Pandas لإنشاء تقارير إحصائية برمجية قوية وفعالة.
سنتعمق في كيفية استخلاص رؤى قيمة من مجموعات البيانات الكبيرة عبر خطوات عملية ومبسطة.
الخطوة 1: إعداد البيانات وتحميلها
لبدء العمل، سنقوم بإنشاء مجموعة بيانات عينة (DataFrame) في Pandas تمثل سجلات مبيعات لمنتجات مختلفة في مناطق متنوعة. هذا سيوفر لنا الأساس لتطبيق عمليات التجميع والتلخيص.
import pandas as pd
# إنشاء بيانات عينة لتمثيل المبيعات
data = {
'المنطقة': ['الشمال', 'الجنوب', 'الشرق', 'الغرب', 'الشمال', 'الجنوب', 'الشرق', 'الغرب', 'الشمال', 'الجنوب'],
'المنتج': ['لابتوب', 'هاتف', 'تابلت', 'لابتوب', 'هاتف', 'تابلت', 'لابتوب', 'هاتف', 'تابلت', 'لابتوب'],
'المبيعات': [1200, 800, 450, 1500, 900, 500, 1300, 850, 480, 1100],
'الكمية': [2, 1, 1, 3, 1, 1, 2, 1, 1, 2],
'التاريخ': pd.to_datetime(['2023-01-15', '2023-01-20', '2023-02-01', '2023-02-10', '2023-02-15',
'2023-03-01', '2023-03-05', '2023-03-10', '2023-03-15', '2023-03-20'])
}
df = pd.DataFrame(data)
print("البيانات الأصلية:")
print(df.head())
ملاحظة تقنية: البيانات النظيفة والمهيكلة بشكل جيد هي حجر الزاوية لأي تحليل إحصائي فعال. التأكد من أنواع البيانات الصحيحة (مثل استخدام pd.to_datetime للتاريخ) أمر بالغ الأهمية.
الخطوة 2: التجميع الأساسي (Basic Groupby) - المبيعات حسب المنطقة
الآن، لنقم بتجميع البيانات بناءً على عمود واحد، وهو 'المنطقة'، ونحسب مقاييس إحصائية بسيطة مثل إجمالي المبيعات ومتوسط الكمية لكل منطقة.
# التجميع حسب "المنطقة" وحساب إجمالي المبيعات ومتوسط الكمية
تقرير_المبيعات_حسب_المنطقة = df.groupby('المنطقة').agg(
إجمالي_المبيعات=('المبيعات', 'sum'), # حساب مجموع المبيعات لكل منطقة
متوسط_الكمية=('الكمية', 'mean') # حساب متوسط الكمية المباعة لكل منطقة
)
print("\nتقرير المبيعات حسب المنطقة:")
print(تقرير_المبيعات_حسب_المنطقة)
ملاحظة تقنية: الدالة .agg() تسمح بتطبيق دوال تجميع متعددة على أعمدة مختلفة في عملية واحدة، مما يوفر مرونة كبيرة في إنشاء التقارير.
الخطوة 3: التجميع المتعدد (Multi-level Groupby) - المبيعات حسب المنطقة والمنتج
في كثير من الأحيان، نحتاج إلى تحليل البيانات بناءً على عدة فئات. هنا، سنقوم بالتجميع حسب 'المنطقة' و 'المنتج' معًا لحساب إجمالي المبيعات، وأقصى كمية مباعة في معاملة واحدة، وعدد المعاملات لكل تركيبة من المنطقة والمنتج.
# التجميع حسب "المنطقة" و "المنتج" وحساب إجمالي المبيعات، أقصى كمية، وعدد المعاملات
تقرير_المبيعات_حسب_المنطقة_والمنتج = df.groupby(['المنطقة', 'المنتج']).agg(
إجمالي_المبيعات=('المبيعات', 'sum'), # مجموع المبيعات لكل تركيبة منطقة ومنتج
أقصى_كمية_في_معاملة=('الكمية', 'max'), # أكبر كمية بيعت في معاملة واحدة ضمن هذه المجموعة
عدد_المعاملات=('المنتج', 'count') # عدد السجلات (المعاملات) لكل مجموعة
).reset_index() # لإعادة تحويل "المنطقة" و "المنتج" من فهرس إلى أعمدة عادية
print("\nتقرير المبيعات حسب المنطقة والمنتج:")
print(تقرير_المبيعات_حسب_المنطقة_والمنتج)
ملاحظة تقنية: استخدام.reset_index()بعدgroupby().agg()مفيد لتحويل الأعمدة التي تم تجميعها (والتي تصبح عادةً فهرسًا متعدد المستويات) إلى أعمدة عادية في DataFrame الناتج، مما يسهل التعامل معها.
الخطوة 4: التجميع المتقدم (Advanced Aggregation) - استخدام دوال مخصصة وتصفية النتائج
يمكننا أيضًا تطبيق دوال تجميع مخصصة باستخدام دوال lambda وتصفية النتائج بعد التجميع للحصول على رؤى أكثر تحديدًا. هنا، سنقوم بتجميع المبيعات شهريًا حسب المنطقة وحساب نطاق المبيعات (الفرق بين الحد الأقصى والأدنى للمبيعات) باستخدام دالة مخصصة، ثم نقوم بتصفية التقارير ذات الأداء العالي.
# إضافة عمود جديد يمثل الشهر لاستخدامه في التجميع
df['الشهر'] = df['التاريخ'].dt.month
# التجميع حسب "المنطقة" و "الشهر" مع دوال تجميع مخصصة
تقرير_شهري = df.groupby(['المنطقة', 'الشهر']).agg(
متوسط_المبيعات_الشهرية=('المبيعات', 'mean'), # متوسط المبيعات الشهرية
إجمالي_الكمية_الشهرية=('الكمية', 'sum'), # إجمالي الكمية الشهرية
نطاق_المبيعات=('المبيعات', lambda x: x.max() - x.min()) # دالة مخصصة لحساب نطاق المبيعات (الحد الأقصى - الحد الأدنى)
).reset_index()
print("\nتقرير المبيعات الشهري حسب المنطقة (مع نطاق المبيعات):")
print(تقرير_شهري)
# تصفية النتائج: عرض المناطق التي تجاوز متوسط مبيعاتها الشهرية 1000
تقارير_عالية_الأداء = تقرير_شهري[تقرير_شهري['متوسط_المبيعات_الشهرية'] > 1000]
print("\nالمناطق ذات متوسط المبيعات الشهرية > 1000:")
print(تقارير_عالية_الأداء)
ملاحظة تقنية: استخدام دوالlambdaداخل.agg()يمنحك قوة لا تصدق لتطبيق أي منطق تجميع مخصص لا توفره الدوال المدمجة مباشرة. كما أن تصفية النتائج بعد التجميع يسمح بالتركيز على المجموعات الأكثر أهمية أو التي تستوفي شروطًا معينة.
الكود النهائي الكامل
إليك الكود كاملاً لجميع الخطوات التي قمنا بتغطيتها، والذي يمكنك تشغيله للحصول على التقارير الإحصائية الموضحة:
import pandas as pd
# الخطوة 1: إعداد البيانات وتحميلها
data = {
'المنطقة': ['الشمال', 'الجنوب', 'الشرق', 'الغرب', 'الشمال', 'الجنوب', 'الشرق', 'الغرب', 'الشمال', 'الجنوب'],
'المنتج': ['لابتوب', 'هاتف', 'تابلت', 'لابتوب', 'هاتف', 'تابلت', 'لابتوب', 'هاتف', 'تابلت', 'لابتوب'],
'المبيعات': [1200, 800, 450, 1500, 900, 500, 1300, 850, 480, 1100],
'الكمية': [2, 1, 1, 3, 1, 1, 2, 1, 1, 2],
'التاريخ': pd.to_datetime(['2023-01-15', '2023-01-20', '2023-02-01', '2023-02-10', '2023-02-15',
'2023-03-01', '2023-03-05', '2023-03-10', '2023-03-15', '2023-03-20'])
}
df = pd.DataFrame(data)
print("البيانات الأصلية:")
print(df.head())
# الخطوة 2: التجميع الأساسي (Basic Groupby) - المبيعات حسب المنطقة
تقرير_المبيعات_حسب_المنطقة = df.groupby('المنطقة').agg(
إجمالي_المبيعات=('المبيعات', 'sum'),
متوسط_الكمية=('الكمية', 'mean')
)
print("\nتقرير المبيعات حسب المنطقة:")
print(تقرير_المبيعات_حسب_المنطقة)
# الخطوة 3: التجميع المتعدد (Multi-level Groupby) - المبيعات حسب المنطقة والمنتج
تقرير_المبيعات_حسب_المنطقة_والمنتج = df.groupby(['المنطقة', 'المنتج']).agg(
إجمالي_المبيعات=('المبيعات', 'sum'),
أقصى_كمية_في_معاملة=('الكمية', 'max'),
عدد_المعاملات=('المنتج', 'count')
).reset_index()
print("\nتقرير المبيعات حسب المنطقة والمنتج:")
print(تقرير_المبيعات_حسب_المنطقة_والمنتج)
# الخطوة 4: التجميع المتقدم (Advanced Aggregation) - استخدام دوال مخصصة وتصفية النتائج
df['الشهر'] = df['التاريخ'].dt.month
تقرير_شهري = df.groupby(['المنطقة', 'الشهر']).agg(
متوسط_المبيعات_الشهرية=('المبيعات', 'mean'),
إجمالي_الكمية_الشهرية=('الكمية', 'sum'),
نطاق_المبيعات=('المبيعات', lambda x: x.max() - x.min())
).reset_index()
print("\nتقرير المبيعات الشهري حسب المنطقة (مع نطاق المبيعات):")
print(تقرير_شهري)
تقارير_عالية_الأداء = تقرير_شهري[تقرير_شهري['متوسط_المبيعات_الشهرية'] > 1000]
print("\nالمناطق ذات متوسط المبيعات الشهرية > 1000:")
print(تقارير_عالية_الأداء)
النتيجة المتوقعة
عند تشغيل السكربت أعلاه، ستحصل على المخرجات التالية على الشاشة، والتي تمثل سلسلة من التقارير الإحصائية المستخلصة من بيانات المبيعات:
- البيانات الأصلية: عرض لأول 5 صفوف من DataFrame الأصلي لتأكيد تحميل البيانات بشكل صحيح.
- تقرير المبيعات حسب المنطقة: جدول يلخص إجمالي المبيعات ومتوسط الكمية لكل منطقة (الشمال، الجنوب، الشرق، الغرب).
- تقرير المبيعات حسب المنطقة والمنتج: جدول مفصل يوضح إجمالي المبيعات، أقصى كمية في معاملة، وعدد المعاملات لكل منتج داخل كل منطقة.
- تقرير المبيعات الشهري حسب المنطقة (مع نطاق المبيعات): جدول يعرض متوسط المبيعات الشهرية، إجمالي الكمية الشهرية، ونطاق المبيعات (الفرق بين الحد الأقصى والأدنى) لكل منطقة في كل شهر.
- المناطق ذات متوسط المبيعات الشهرية > 1000: تقرير مصفى يعرض فقط تلك الصفوف من التقرير الشهري حيث تجاوز متوسط المبيعات الشهرية 1000 وحدة، مما يسلط الضوء على المناطق والشهور ذات الأداء المرتفع.
هذه التقارير توضح كيف يمكن استخدام groupby() و agg() بفعالية لاستخلاص رؤى متعددة الأبعاد من بياناتك.