طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 10 · الوحدة 5: التحليل الإحصائي لبيانات الويب

التجميع groupby والجداول المحورية

لكل دولة، لكل جهاز، لكل يوم: كيف نحسب مقياسًا لكل شريحة دفعةً واحدة؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تجمّع البيانات حسب فئة بـ groupby.
  • تجمّع بعدّة أعمدة ودوال بـ agg.
  • تبني جداول متقاطعة بـ pivot_table.
  • تختار بين العرض الطولي والمتقاطع.

١السؤال الأهمّ: لكل فئة، كم؟

أقوى سؤالٍ تحليليّ: «لكل دولة، ما إجمالي الإيراد؟»، «لكل جهاز، متوسط الطلبات؟». الجواب groupby: قسّم الصفوف إلى مجموعات حسب عمود، ثم احسب لكل مجموعة.

main.py
import pandas as pddf = pd.DataFrame({    "country": ["SA","EG","SA","SA","EG","AE"],    "device":  ["mobile","mobile","desktop","mobile","desktop","mobile"],    "orders":  [5, 2, 8, 3, 6, 4],    "revenue": [300, 120, 800, 180, 420, 260],})# إجمالي الإيراد لكل دولةby_country = df.groupby("country")["revenue"].sum()print(by_country)print("---")# متوسط الطلبات لكل جهازprint(df.groupby("device")["orders"].mean())
Shell×
>>> %Run main.py
country
AE 260
EG 540
SA 1280
Name: revenue, dtype: int64
---
device
desktop 7.0
mobile 3.5
Name: orders, dtype: float64
>>>

النمط ثابت: groupby(عمود الفئة)[عمود القيمة].دالة(). الدالة قد تكون sum أو mean أو count أو max…

٢تجميع متعدّد ودوال متعدّدة

main.py
import pandas as pddf = pd.DataFrame({    "country": ["SA","EG","SA","SA","EG","AE"],    "device":  ["mobile","mobile","desktop","mobile","desktop","mobile"],    "orders":  [5, 2, 8, 3, 6, 4],    "revenue": [300, 120, 800, 180, 420, 260],})# حسب دولة وجهاز معًاg = df.groupby(["country", "device"])["revenue"].sum()print(g)print("---")# عدّة دوال دفعة بـ aggprint(df.groupby("country")["revenue"].agg(["sum", "mean", "count"]))
Shell×
>>> %Run main.py
country device
AE mobile 260
EG desktop 420
mobile 120
SA desktop 800
mobile 480
Name: revenue, dtype: int64
---
sum mean count
country
AE 260 260.000000 1
EG 540 270.000000 2
SA 1280 426.666667 3
>>>

التجميع بعمودين يعطي نتيجةً هرمية (دولة ← جهاز). وagg يحسب عدّة ملخّصات دفعةً واحدة.

٣الجدول المحوري pivot_table

حين نريد فئةً في الصفوف وأخرى في الأعمدة (كجدول متقاطع)، نستخدم pivot_table — الأشهر في تقارير لوحات التحكم:

main.py
import pandas as pddf = pd.DataFrame({    "country": ["SA","EG","SA","SA","EG","AE"],    "device":  ["mobile","mobile","desktop","mobile","desktop","mobile"],    "orders":  [5, 2, 8, 3, 6, 4],    "revenue": [300, 120, 800, 180, 420, 260],})pt = df.pivot_table(index="country", columns="device",                    values="revenue", aggfunc="sum", fill_value=0)print(pt)
Shell×
>>> %Run main.py
device desktop mobile
country
AE 0 260
EG 420 120
SA 800 480
>>>

توقّع وتحقّق

لحساب مقياس لكل فئة:

النمط الصحيح:

لعدّة دوال دفعة بعد groupby:

لجدول متقاطع (فئة صفوف × فئة أعمدة):

الخلاصة

تحدٍّ برمجي: جمّع وحلّل

متوسط

اطبع إجمالي الإيراد لكل دولة، ثم اسم الدولة الأعلى إيرادًا.

المطلوب:
  • جمّع الإيراد حسب country.
  • اطبع إجمالي كل دولة، ثم اسم الأعلى.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pddf = pd.DataFrame({    "country": ["SA","EG","SA","SA","EG","AE"],    "device":  ["mobile","mobile","desktop","mobile","desktop","mobile"],    "orders":  [5, 2, 8, 3, 6, 4],    "revenue": [300, 120, 800, 180, 420, 260],})# إجمالي الإيراد لكل دولة، ثم اسم الدولة الأعلى
المطلوب×
country
AE 260
EG 540
SA 1280
Name: revenue, dtype: int64
SA
💡 تلميح 1
df.groupby("country")["revenue"].sum().
💡 تلميح 2
اسم الأعلى: .idxmax() على النتيجة.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import pandas as pddf = pd.DataFrame({    "country": ["SA","EG","SA","SA","EG","AE"],    "device":  ["mobile","mobile","desktop","mobile","desktop","mobile"],    "orders":  [5, 2, 8, 3, 6, 4],    "revenue": [300, 120, 800, 180, 420, 260],})by_country = df.groupby("country")["revenue"].sum()print(by_country)print(by_country.idxmax())
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس