0Pricing
Pandas & NumPy Academy · درس

‏crosstab لجداول التكرارات

احسب جدولًا تقاطعيًا للتكرارات أو النسب لعمودين فئويين باستخدام pd.crosstab.

‏crosstab لجداول التكرارات درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ما هو الجدول التقاطعي؟

يحسب الجدول التقاطعي (crosstab) عدد مرات ظهور كل تركيبة من القيم المأخوذة من متغيرين فئويين أو أكثر في مجموعة البيانات. وهو حالة خاصة من الجدول المحوري، صُمّمت خصيصًا لإجراء عمليات العد. يوفر Pandas الدالة pd.crosstab() باعتبارها طريقة موجزة لحساب جداول التكرارات هذه من دون الحاجة إلى استدعاء groupby() أو pivot_table() صراحةً.

استدعاء crosstab() الأساسي

يستقبل الاستدعاء الأدنى pd.crosstab(index, columns) مدخلين يشبهان المصفوفات (وهما عادةً عمودان من DataFrame)، ويعيد جدول تكرارات. وتمثل الصفوف القيم الفريدة في الوسيط الأول، وتمثل الأعمدة القيم الفريدة في الوسيط الثاني. وتحتوي كل خلية على عدد الصفوف التي تظهر فيها القيمتان معًا في البيانات الأصلية.

import pandas as pd

df = pd.DataFrame({
    'gender':  ['M', 'F', 'M', 'F', 'M', 'F', 'M'],
    'product': ['A', 'A', 'B', 'B', 'A', 'B', 'B']
})

ct = pd.crosstab(df['gender'], df['product'])
print(ct)
# product  A  B
# gender
# F        1  2
# M        2  2

تخصيص أسماء الصفوف والأعمدة

استخدموا المعاملين rownames وcolnames لمنح محوري الصفوف والأعمدة أسماء ذات معنى في الناتج، مع تجاوز أسماء Series الافتراضية. ويفيد ذلك عندما لا تكون أسماء الأعمدة الأصلية في DataFrame واضحة بذاتها ضمن سياق الجدول الناتج.

ct = pd.crosstab(
    df['gender'], df['product'],
    rownames=['Customer Gender'],
    colnames=['Purchased Product']
)
print(ct)
# Purchased Product  A  B
# Customer Gender
# F                  1  2
# M                  2  2

إضافة الهوامش (إجماليات الصفوف والأعمدة)

مرّروا margins=True لتضمين صف وعمود يجمعان جميع القيم. ويكون اسم الهامش الافتراضي 'All'، لكن يمكن تخصيصه باستخدام margins_name. ويعرض صف الهوامش العدد الإجمالي لكل عمود، ويعرض عمود الهوامش العدد الإجمالي لكل صف، بينما تعرض الخلية السفلية اليمنى الإجمالي الكلي.

ct = pd.crosstab(df['gender'], df['product'],
                 margins=True, margins_name='Total')
print(ct)
# product  A  B  Total
# gender
# F        1  2      3
# M        2  2      4
# Total    3  4      7

التطبيع إلى نسب

مرّروا المعامل normalize لتحويل الأعداد إلى نسب. يقسم normalize=True أو normalize='all' على الإجمالي الكلي. ويحسب normalize='index' نسب الصفوف (بحيث يكون مجموع كل صف 1.0). ويحسب normalize='columns' نسب الأعمدة (بحيث يكون مجموع كل عمود 1.0). وتكون النسب أكثر إفادة من الأعداد الأولية عندما تختلف أحجام المجموعات.

# Row proportions: what fraction of each gender bought each product?
print(pd.crosstab(df['gender'], df['product'], normalize='index').round(2))
# product     A     B
# gender
# F        0.33  0.67
# M        0.50  0.50

# All proportions: each cell as fraction of grand total
print(pd.crosstab(df['gender'], df['product'], normalize=True).round(2))

تجميع القيم بدلًا من عدّها

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

df['revenue'] = [100, 80, 150, 120, 200, 90, 130]

# Sum revenue by gender and product instead of counting
ct_rev = pd.crosstab(
    df['gender'], df['product'],
    values=df['revenue'],
    aggfunc='sum'
)
print(ct_rev)
# product    A    B
# gender
# F         80  210
# M        300  280

جدول تقاطعي متعدد المستويات

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

df['region'] = ['East', 'West', 'East', 'West', 'East', 'East', 'West']

ct_multi = pd.crosstab(
    [df['gender'], df['region']],
    df['product'],
    margins=True
)
print(ct_multi)
# product         A  B  All
# gender region
# F      East     0  1    1
#        West     1  1    2
# M      East     2  1    3
#        West     0  1    1
# All            3  4    7

crosstab() مقابل pivot_table()

يتداخل استخدام pd.crosstab() وpd.pivot_table() بدرجة كبيرة. إذ إن crosstab محسّنة لعدّ التكرارات، وتستقبل مدخلات تشبه المصفوفات مباشرةً (وليس DataFrame)، مما يجعلها أكثر إيجازًا قليلًا لإنشاء الجداول السريعة. أما pivot_table فتعمل على DataFrame وتدعم أي دالة تجميع بشكل أصلي. لذا، في مهام العدّ البحتة، يكون crosstab هو الخيار الاصطلاحي؛ أما لتجميع القيم الرقمية، ففضّلوا pivot_table.

# crosstab (more concise for counting)
print(pd.crosstab(df['gender'], df['product']))

# Equivalent pivot_table
print(pd.pivot_table(df, index='gender', columns='product',
                     aggfunc='size', fill_value=0))
# Both produce the same result

التهيئة لاختبار كاي تربيع

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

from scipy import stats

ct = pd.crosstab(df['gender'], df['product'])
# Convert to numpy array for scipy
chi2, p, dof, expected = stats.chi2_contingency(ct.values)
print(f'Chi2: {chi2:.2f}')
print(f'P-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
# p > 0.05 means no significant association

تصوير الجدول التقاطعي على شكل خريطة حرارية

يصعب تفسير الجداول التقاطعية التي تحتوي على فئات كثيرة عند عرضها كأرقام أولية. ويجعل تصويرها على شكل خريطة حرارية باستخدام sns.heatmap() الأنماط واضحة فورًا؛ إذ تظهر الخلايا ذات التكرار المرتفع بألوان زاهية. مرّروا النسخة المطَبّعة لعرض النسب بدلًا من الأعداد الأولية، واستخدموا annot=True لعرض القيم داخل كل خلية.

import seaborn as sns
import matplotlib.pyplot as plt

ct_norm = pd.crosstab(df['gender'], df['product'], normalize='index')

# sns.heatmap(ct_norm, annot=True, fmt='.0%', cmap='Blues')
# plt.title('Purchase Rate by Gender and Product')
# plt.tight_layout()
# plt.show()
print('Normalised crosstab ready for heatmap:')
print(ct_norm.round(2))

مثال عملي: تحليل الاستبيان

سير عمل متكامل لإنشاء جدول تقاطعي: تحميل بيانات الاستبيان، وحساب جداول التكرارات بين المتغيرات الديموغرافية ومتغيرات الاستجابة، وتطبيعها حسب الصفوف للحصول على معدلات الاستجابة، وتحديد أي أنماط قوية. يُعد هذا المسار التحليلي خطًا أساسيًا في أبحاث السوق واختبارات A/B وتقسيم المستخدمين، ويمكن إكماله في أقل من 10 أسطر من تعليمات Pandas البرمجية.

# Simulate a survey dataset
survey = pd.DataFrame({
    'age_group': ['18-25', '26-35', '18-25', '36-45', '26-35', '36-45'],
    'satisfaction': ['High', 'Low', 'High', 'Medium', 'High', 'Low']
})

ct = pd.crosstab(survey['age_group'], survey['satisfaction'],
                 margins=True, margins_name='Total')
print(ct)

rates = pd.crosstab(survey['age_group'], survey['satisfaction'],
                    normalize='index').round(2)
print(rates)

تحقق سريع

اختبر مدى فهمك لـ pd.crosstab لإنشاء جداول التكرارات مما تعلمته في هذا الدرس.

مراجعة الدرس

تعلمت في هذا الدرس أن pd.crosstab() يحسب تكرارات الظهور لتركيبات متغيرين فئويين؛ وأن normalize يحوّل التكرارات إلى نِسَب حسب الصف أو العمود أو الإجمالي؛ وأن margins=True يضيف إجماليات الصفوف والأعمدة؛ وأن مخرجات الجدول التقاطعي متوافقة مباشرةً مع اختبارات كاي تربيع وتصويرات الخرائط الحرارية. بعد ذلك سنتعامل مع بيانات السلاسل الزمنية باستخدام DatetimeIndex ونطاقات الفترات.

الأسئلة الشائعة

هل درس «‏crosstab لجداول التكرارات» مجاني؟

نعم — نص درس «‏crosstab لجداول التكرارات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏crosstab لجداول التكرارات»؟

احسب جدولًا تقاطعيًا للتكرارات أو النسب لعمودين فئويين باستخدام pd.crosstab. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟

لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «‏crosstab لجداول التكرارات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟

نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ‏pivot_table: الجدولة التقاطعية
  2. ‏melt: من التنسيق العريض إلى الطولي
  3. ‏stack وunstack مع MultiIndex
  4. ‏crosstab لجداول التكرارات
← العودة إلى Pandas & NumPy Academy