اختبار كاي-تربيع للاستقلالية
اختبر ما إذا كان متغيران فئويان مستقلين باستخدام chi2_contingency على جدول تكرارات متقابلة
اختبار كاي-تربيع للاستقلالية درس مجاني في Pandas & NumPy Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Pandas & NumPy Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
اختبار العلاقات بين المتغيرات الفئوية
يختبر اختبار كاي-تربيع للاستقلالية ما إذا كان متغيران فئويان مستقلين إحصائيًا أو توجد بينهما علاقة. على سبيل المثال: «هل معدل مغادرة العملاء مستقل عن فئة الاشتراك؟» أو «هل تفضيل المنتج مستقل عن الفئة العمرية؟» وبخلاف اختبارات t التي تقارن المتوسطات العددية، تقارن اختبارات كاي-تربيع التكرارات المرصودة في جدول توافق بالتكرارات التي نتوقعها إذا كان المتغيران مستقلين.
إنشاء جدول توافق باستخدام Pandas
يعرض جدول التوافق (ويُسمى أيضًا الجدول التقاطعي) عدد الملاحظات لكل توليفة من متغيرين فئويين. تنشئ pd.crosstab(df['var1'], df['var2']) هذا الجدول مباشرةً من DataFrame. وتحتوي كل خلية على عدد الملاحظات التي تتزامن فيها فئة الصف وفئة العمود. ويُعد هذا الجدول مدخلًا إلى scipy.stats.chi2_contingency().
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'subscription': np.random.choice(['free', 'basic', 'pro'], 300),
'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})
# Build contingency table
ct = pd.crosstab(df['subscription'], df['churned'])
print(ct)
print()
print('Row totals:', ct.sum(axis=1).to_dict())تشغيل chi2_contingency()
تأخذ scipy.stats.chi2_contingency(observed) جدول التوافق المرصود (كمصفوفة NumPy أو Pandas DataFrame) وتعيد أربع قيم: إحصاء كاي-تربيع، وقيمة p، ودرجات الحرية، وجدول التكرارات المتوقعة. تنص الفرضية الصفرية على أن H₀: the two variables are independent. إذا كانت p ≤ 0.05، نرفض الاستقلالية ونستنتج وجود علاقة دالة إحصائيًا.
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'tier': np.random.choice(['free', 'basic', 'pro'], 300),
'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})
ct = pd.crosstab(df['tier'], df['churned'])
chi2, p, dof, expected = stats.chi2_contingency(ct)
print(f'Chi-squared: {chi2:.3f}')
print(f'p-value: {p:.4f}')
print(f'Degrees of freedom: {dof}')
print('Association significant?', 'Yes' if p < 0.05 else 'No')فهم التكرارات المتوقعة
تمثل التكرارات المتوقعة الشكل الذي ستبدو عليه أعداد الخلايا إذا كان المتغيران مستقلين تمامًا. لكل خلية، تكون expected = (row_total × column_total) / grand_total. يقيس إحصاء كاي-تربيع مجموع الفروق المربعة بين الأعداد المرصودة والمتوقعة، بعد تطبيعها بالتكرارات المتوقعة. وتشير قيمة كاي-تربيع الكبيرة إلى انحراف قوي في الأعداد المرصودة عن الاستقلالية، بينما تشير القيمة الصغيرة إلى توافق البيانات مع الاستقلالية.
import pandas as pd
import numpy as np
from scipy import stats
observed = pd.DataFrame({
'converted': [50, 30],
'not_converted': [150, 170]
}, index=['variant', 'control'])
chi2, p, dof, expected = stats.chi2_contingency(observed)
print('Observed:')
print(observed)
print()
print('Expected (under independence):')
print(pd.DataFrame(expected,
index=observed.index,
columns=observed.columns).round(1))درجات الحرية في اختبار كاي-تربيع
بالنسبة إلى جدول توافق ذي r من الصفوف وc من الأعمدة، تكون درجات الحرية هي df = (r-1) × (c-1). يحتوي جدول 2×2 على df=1، بينما يحتوي جدول 3×4 على df=6. تزداد القيمة الحرجة لكاي-تربيع مع زيادة درجات الحرية: فعند df=1 وα=0.05، تبلغ القيمة الحرجة نحو 3.84؛ وعند df=6 وα=0.05، تبلغ نحو 12.6. تتولى دالة chi2_contingency معالجة ذلك تلقائيًا، لكن معرفة الصيغة تساعدك على فهم سبب حاجة جداول كاي-تربيع الأكبر إلى إحصاءات أكبر حتى تكون النتيجة دالة.
from scipy import stats
# Critical values of chi-squared for alpha=0.05
for df in [1, 2, 3, 4, 6, 9]:
critical = stats.chi2.ppf(0.95, df=df)
print(f'df={df}: critical value = {critical:.3f}')افتراض الحد الأدنى للتكرار المتوقع
لا يكون اختبار كاي-تربيع موثوقًا إلا عندما تكون جميع التكرارات المتوقعة 5 على الأقل (تذكر بعض المصادر أن الحد الأدنى هو 1، على ألا تقل قيمة أكثر من 20% من الخلايا عن 5). تجعل الأعداد المتوقعة الصغيرة تقريب كاي-تربيع غير دقيق. عند انتهاك هذا الافتراض، استخدم اختبار Fisher الدقيق (scipy.stats.fisher_exact()) لجداول 2×2، أو ادمج الفئات النادرة لزيادة الأعداد المتوقعة. افحص دائمًا مصفوفة التكرارات المتوقعة التي تعيدها chi2_contingency.
import numpy as np
from scipy import stats
# Table with small expected counts
observed = np.array([[2, 3], [100, 95]])
chi2, p, dof, expected = stats.chi2_contingency(observed)
print('Expected frequencies:')
print(expected)
print('Min expected:', expected.min())
if expected.min() < 5:
print('Warning: Expected frequency < 5. Use Fisher\'s exact test.')
odds_ratio, p_fisher = stats.fisher_exact(observed)
print(f'Fisher\'s exact p: {p_fisher:.4f}')اختبار Fisher الدقيق للعينات الصغيرة
تحسب scipy.stats.fisher_exact(table) الاحتمال الدقيق لملاحظة جدول 2×2 المحدد (أو جدول أكثر تطرفًا) في ظل الفرضية الصفرية للاستقلالية، دون استخدام أي تقريب. ويكون الاختبار صالحًا دائمًا بصرف النظر عن حجم العينة أو أعداد الخلايا؛ فقيمة p دقيقة وليست تقريبية. وتتمثل كلفته في الأداء الحسابي: إذ يحصي جميع الجداول الممكنة، مما يجعله بطيئًا عندما تكون المجاميع كبيرة. بالنسبة إلى جداول 2×2 التي يقل فيها أي عدد خلايا عن 5، فضّل دائمًا اختبار Fisher الدقيق على اختبار كاي-تربيع.
import numpy as np
from scipy import stats
# Small clinical trial: treatment vs. outcome
observed = np.array([
[3, 12], # treated: 3 improved, 12 did not
[1, 18] # control: 1 improved, 18 did not
])
odds_ratio, p = stats.fisher_exact(observed, alternative='two-sided')
print(f'Odds ratio: {odds_ratio:.3f}')
print(f'p-value: {p:.4f}')
print('Association significant?', 'Yes' if p < 0.05 else 'No')قياس قوة العلاقة: Cramér's V
كما هو الحال مع Cohen's d في اختبارات t، لا يقيس إحصاء كاي-تربيع وحده قوة العلاقة، إذ يتضخم بتضخم حجم العينة. يطبّع Cramér's V قيمة كاي-تربيع إلى مقياس من 0 إلى 1: إذ تعني 0 عدم وجود علاقة، بينما تعني 1 وجود علاقة تامة. V = sqrt(chi2 / (n × min(r-1, c-1))). الإرشادات: القيمة < 0.1 ضعيفة، ومن 0.1 إلى 0.3 متوسطة، وأكبر من 0.3 قوية. أبلغ دائمًا عن Cramér's V إلى جانب قيمة p للحصول على صورة متكاملة.
import pandas as pd
import numpy as np
from scipy import stats
np.random.seed(0)
df = pd.DataFrame({
'tier': np.random.choice(['free', 'basic', 'pro'], 500),
'churn': np.random.choice(['yes', 'no'], 500, p=[0.3, 0.7])
})
ct = pd.crosstab(df['tier'], df['churn'])
chi2, p, dof, _ = stats.chi2_contingency(ct)
n = ct.sum().sum()
min_dim = min(ct.shape[0]-1, ct.shape[1]-1)
cramers_v = np.sqrt(chi2 / (n * min_dim))
print(f'chi2={chi2:.3f}, p={p:.4f}')
print(f'Cramer\'s V: {cramers_v:.4f}')
print('Association strength:', 'strong' if cramers_v > 0.3 else 'moderate' if cramers_v > 0.1 else 'weak')اختبار جودة المطابقة لكاي-تربيع
يتمثل أحد التطبيقات المختلفة لكاي-تربيع في اختبار جودة المطابقة: فهو يختبر ما إذا كانت التكرارات المرصودة تطابق توزيعًا مفترضًا. على سبيل المثال: «هل نتائج رمي النرد موزعة بالتساوي؟» أو «هل تتبع زيارات موقعنا النمط المتوقع لأيام الأسبوع؟» استخدم scipy.stats.chisquare(f_obs, f_exp)، حيث تمثل f_exp التكرارات المتوقعة. وتنص الفرضية الصفرية على أن البيانات تتبع التوزيع المحدد.
import numpy as np
from scipy import stats
# Observed: counts for each weekday over 70 weeks
observed = np.array([980, 1050, 1020, 1080, 1120, 850, 900])
# Expected: uniform distribution
expected = np.full(7, observed.sum() / 7)
chi2, p = stats.chisquare(f_obs=observed, f_exp=expected)
print('Observed:', observed)
print('Expected (uniform):', expected.round(0))
print(f'chi2={chi2:.3f}, p={p:.4f}')
print('Uniform?', 'Yes' if p > 0.05 else 'No - some days significantly busier')استخدام pd.crosstab مع التطبيع
عند عرض نتائج كاي-تربيع، من المفيد إظهار النسب بدلًا من الأعداد الخام حتى يتمكن القراء من رؤية العلاقة النسبية. تعرض pd.crosstab(var1, var2, normalize='index') نسبة الصف (أي نسبة كل فئة صف التي تقع ضمن كل عمود). ويعرض normalize='columns' نسب الأعمدة. تساعد مقارنة هذه النسب بصريًا قبل تشغيل الاختبار على توقع اتجاه العلاقة وتفسير النتيجة في سياقها.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({
'tier': np.random.choice(['free', 'basic', 'pro'], 300),
'churned': np.random.choice(['yes', 'no'], 300, p=[0.3, 0.7])
})
# Row-proportions: churn rate within each tier
prop_table = pd.crosstab(df['tier'], df['churned'], normalize='index')
print('Churn rate by tier:')
print((prop_table * 100).round(1))اختبار كاي-تربيع في اختبار A/B
يُعد اختبار كاي-تربيع الاختبار القياسي لـمعدلات التحويل في اختبارات A/B. أنشئ جدول توافق 2×2 بحيث تمثل الصفوف (مجموعة التحكم، والبديل)، وتمثل الأعمدة (تم التحويل، لم يتم التحويل). يخبرك اختبار كاي-تربيع بما إذا كان معدل التحويل يختلف اختلافًا دالًا بين المجموعتين. ويعادل ذلك اختبار z لنسبتين عند استخدام عينات كبيرة. أما في العينات الصغيرة (عندما يكون أي تكرار متوقع < 5)، فاستخدم اختبار Fisher الدقيق بدلًا منه.
import numpy as np
from scipy import stats
# A/B test: control vs. variant, conversions vs. non-conversions
control_conv = 45
control_total = 500
variant_conv = 63
variant_total = 500
contingency = np.array([
[control_conv, control_total - control_conv],
[variant_conv, variant_total - variant_conv]
])
chi2, p, dof, expected = stats.chi2_contingency(contingency)
print(f'Control rate: {control_conv/control_total:.1%}')
print(f'Variant rate: {variant_conv/variant_total:.1%}')
print(f'p-value: {p:.4f}')
print('Variant significantly better?', 'Yes' if p < 0.05 else 'No')تحقق سريع
اختبر مدى فهمك لمفاهيم تحليل البيانات الواردة في هذا الدرس.
مراجعة الدرس
تعلمت في هذا الدرس أن pd.crosstab() + chi2_contingency() يختبران ما إذا كان متغيران فئويان مستقلين بالاعتماد على التكرارات المرصودة مقابل المتوقعة، وأن اختبار Fisher الدقيق هو البديل الآمن عندما تكون التكرارات المتوقعة أقل من 5، بينما يقيس Cramér's V قوة العلاقة بصورة مستقلة عن حجم العينة. بعد ذلك سنقارن المتوسطات بين ثلاث مجموعات أو أكثر باستخدام ANOVA واختبارات ما بعد المتابعة.
تعلم Python مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 30
- الدروس
- 120
الأسئلة الشائعة
هل درس «اختبار كاي-تربيع للاستقلالية» مجاني؟
نعم — نص درس «اختبار كاي-تربيع للاستقلالية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Pandas & NumPy Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Pandas & NumPy Academy 4 دروس في المجموع.
ماذا ستتعلم في «اختبار كاي-تربيع للاستقلالية»؟
اختبر ما إذا كان متغيران فئويان مستقلين باستخدام chi2_contingency على جدول تكرارات متقابلة تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Pandas & NumPy Academy؟
لا تُشترط خبرة سابقة. Pandas & NumPy Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «اختبار كاي-تربيع للاستقلالية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Pandas & NumPy Academy هذا؟
نعم. كل درس في Pandas & NumPy Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الإحصاءات الوصفية واختبار التوزيع الطبيعي
- اختبارات t لمقارنة المتوسطات
- اختبار كاي-تربيع للاستقلالية
- تحليل التباين واختبارات ما بعد التحليل