0Pricing
Pandas & NumPy Academy · درس

خرائط حرارية لمصفوفات الارتباط

احسب مصفوفة ارتباط باستخدام DataFrame.corr()، واعرضها كخريطة حرارية ملوّنة باستخدام sns.heatmap.

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

ما مصفوفة الارتباط؟

مصفوفة الارتباط هي جدول مربّع تحتوي الخانة (i, j) فيه على معامل ارتباط Pearson بين العمودين i وj. تتراوح القيم بين ‎-1‎ (ارتباط خطي سلبي تام) و‎+1‎ (ارتباط إيجابي تام)، بينما يعني 0 عدم وجود علاقة خطية. تكون قيم القطر دائمًا 1 (فالمتغير مرتبط تمامًا بنفسه). وتمثل مصفوفات الارتباط الخطوة الأولى لفهم المتغيرات التي تتحرك معًا قبل بناء النموذج.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Compute correlation matrix for numeric columns
tips = sns.load_dataset('tips')
corr = tips[['total_bill', 'tip', 'size']].corr()
print(corr.round(2))

حساب مصفوفة الارتباط

استدعِ DataFrame.corr() لحساب ارتباطات Pearson الزوجية لجميع الأعمدة الرقمية. وتحدد المعلمة method نوع الارتباط المراد حسابه: 'pearson' (الافتراضي، خطي)، أو 'spearman' (يعتمد على الرتب، ومتين أمام القيم الشاذة والعلاقات الرتيبة غير الخطية)، أو 'kendall'. بالنسبة إلى البيانات المالية أو بيانات العدّ ذات الالتواء، يكون Spearman غالبًا أكثر إفادة من Pearson.

import pandas as pd
import seaborn as sns

tips = sns.load_dataset('tips')
numeric = tips.select_dtypes(include='number')

# Pearson vs Spearman
pearson = numeric.corr(method='pearson')
spearman = numeric.corr(method='spearman')

print('Pearson:')
print(pearson.round(2))
print('\nSpearman:')
print(spearman.round(2))

خريطة تمثيل حراري أساسية باستخدام sns.heatmap

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

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()

sns.heatmap(corr, annot=True, fmt='.2f')
plt.title('Correlation Heatmap — Tips Dataset')
plt.tight_layout()
plt.show()

اختيار خريطة الألوان المناسبة

بالنسبة إلى مصفوفات الارتباط، استخدم دائمًا خريطة ألوان متباينة تتمركز عند الصفر: cmap='coolwarm' أو 'RdBu_r' أو 'vlag'. تستخدم هذه الخرائط لونًا للقيم الموجبة، ولونًا آخر للقيم السالبة، ونقطة وسطى محايدة عند الصفر. تجنّب خرائط الألوان المتسلسلة (مثل 'Blues') مع بيانات الارتباط، لأنها تجعل التمييز البصري بين الارتباطات الموجبة والسالبة مستحيلًا. عيّن vmin=-1, vmax=1 لتثبيت مقياس الألوان على نطاق الارتباط الكامل.

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()

sns.heatmap(
    corr,
    annot=True,
    fmt='.2f',
    cmap='coolwarm',
    vmin=-1,
    vmax=1,
    center=0
)
plt.title('Correlation Heatmap with Diverging Palette')
plt.tight_layout()
plt.show()

إخفاء المثلث العلوي

بما أن مصفوفة الارتباط متناظرة (corr[i,j] == corr[j,i])، فإن عرض نصفيها تكرار غير ضروري. استخدم np.triu لإنشاء قناع للمثلث العلوي، ثم مرّره إلى mask= في sns.heatmap. يؤدي ذلك إلى تقليل عدد الخلايا إلى النصف، مما يجعل المخطط أقل ازدحامًا وأسهل قراءة. ويمكن أيضًا إخفاء قيم القطر (وكلها 1.0) لأنها لا تضيف أي معلومات.

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()

# Mask the upper triangle (including diagonal)
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(
    corr,
    mask=mask,
    annot=True,
    fmt='.2f',
    cmap='coolwarm',
    vmin=-1,
    vmax=1
)
plt.title('Lower-Triangle Correlation Heatmap')
plt.tight_layout()
plt.show()

تخصيص التعليقات التوضيحية وحجم الخلايا

تحكّم في تنسيق التعليقات التوضيحية باستخدام fmt= (مثل '.2f' لمنزلتين عشريتين)، وفي حجم الخط باستخدام annot_kws={'size': 10}. وتضيف المعلمة linewidths خطوطًا رفيعة بين الخلايا، مما يسهل قراءة الشبكة في المصفوفات الكبيرة. استخدم square=True لفرض خلايا مربعة بغض النظر عن أبعاد الشكل، وهو ما يمنح الخرائط الحرارية مظهرًا متوازنًا ومنظمًا.

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Load a wider dataset for a more interesting heatmap
penguins = sns.load_dataset('penguins').select_dtypes('number')
corr = penguins.corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

sns.heatmap(
    corr,
    mask=mask,
    annot=True,
    fmt='.2f',
    cmap='vlag',
    vmin=-1,
    vmax=1,
    linewidths=0.5,
    square=True,
    annot_kws={'size': 10}
)
plt.title('Penguins Correlation Matrix')
plt.tight_layout()
plt.show()

التجميع باستخدام clustermap

تعيد sns.clustermap() ترتيب الصفوف والأعمدة باستخدام التجميع الهرمي لتجميع المتغيرات ذات أنماط الارتباط المتشابهة معًا. ويسهّل ذلك كثيرًا تحديد كتل السمات المرتبطة في المصفوفات الكبيرة. وتعرض الشجرة العنقودية على المحورين العلوي والأيسر شجرة التجميع. استخدم method='ward' وmetric='euclidean' كقيم افتراضية مناسبة للتجميع القائم على الارتباط.

import seaborn as sns
import matplotlib.pyplot as plt

penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()

sns.clustermap(
    corr,
    cmap='coolwarm',
    vmin=-1,
    vmax=1,
    annot=True,
    fmt='.2f',
    figsize=(6, 6)
)
plt.suptitle('Clustered Correlation Matrix', y=1.02)
plt.show()

الخريطة الحرارية لبيانات الجدول المحوري

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

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

tips = sns.load_dataset('tips')

# Pivot: average bill by day and time
pivot = tips.pivot_table(
    values='total_bill',
    index='day',
    columns='time',
    aggfunc='mean'
)

sns.heatmap(pivot, annot=True, fmt='.1f', cmap='YlOrRd')
plt.title('Average Bill by Day and Time')
plt.tight_layout()
plt.show()

تفسير قيم الارتباط

عند تفسير الارتباطات، استخدم المؤشرات التقريبية التالية: ‎|r| < 0.2‎ = مهمل، و‎0.2-0.4‎ = ضعيف، و‎0.4-0.6‎ = متوسط، و‎0.6-0.8‎ = قوي، و‎> 0.8‎ = قوي جدًا. ومع ذلك، لا يخبرك الارتباط بأي شيء عن السببية، وقد يكون زائفًا (ارتباطًا عرضيًا ناتجًا عن متغير مربك ثالث). احرص دائمًا على إقران تحليل الارتباط العددي بمخططات التشتت للتحقق من أن العلاقة خطية فعلًا وليست ناتجة عن القيم الشاذة.

import pandas as pd
import seaborn as sns

# Find the most correlated pairs
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()

# Unstack to get pairs, remove self-correlations, sort
pairs = (corr
    .unstack()
    .reset_index()
    .rename(columns={'level_0': 'var1', 'level_1': 'var2', 0: 'r'})
    .query('var1 != var2')
    .assign(abs_r=lambda df: df['r'].abs())
    .sort_values('abs_r', ascending=False)
    .drop_duplicates(subset='abs_r')
)
print(pairs.head(6).to_string(index=False))

خرائط حرارية لمجموعات البيانات الكبيرة: اختيار مجموعة فرعية

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

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Show only features with |r| > 0.4 with any other feature
penguins = sns.load_dataset('penguins').select_dtypes('number').dropna()
corr = penguins.corr()

# Filter columns that have at least one high correlation (excluding diagonal)
high_corr = (corr.abs() > 0.4).any(axis=1)
filtered = corr.loc[high_corr, high_corr]
mask = np.triu(np.ones_like(filtered, dtype=bool))

sns.heatmap(filtered, mask=mask, annot=True,
            fmt='.2f', cmap='coolwarm', vmin=-1, vmax=1)
plt.title('High-Correlation Subset')
plt.tight_layout()
plt.show()

حفظ الخرائط الحرارية في ملفات

غالبًا ما تُدرج الخرائط الحرارية في التقارير والعروض التقديمية. استدعِ plt.savefig('filename.png', dpi=150, bbox_inches='tight') بعد إنشاء الخريطة الحرارية لحفظها. وتمنع الوسيطة bbox_inches='tight' اقتصاص تسميات المحاور. وبالنسبة إلى تقارير PDF، استخدم format='pdf'. وعند استخدام sns.clustermap، يُخزَّن الشكل في الكائن المُعاد: g = sns.clustermap(...); g.savefig('plot.png').

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

tips = sns.load_dataset('tips')
corr = tips.select_dtypes('number').corr()
mask = np.triu(np.ones_like(corr, dtype=bool))

fig, ax = plt.subplots(figsize=(6, 5))
sns.heatmap(corr, mask=mask, annot=True, fmt='.2f',
            cmap='coolwarm', vmin=-1, vmax=1,
            linewidths=0.5, ax=ax)
ax.set_title('Correlation Heatmap')

# Save to file
plt.savefig('/tmp/correlation_heatmap.png', dpi=150, bbox_inches='tight')
plt.close()
print('Saved to /tmp/correlation_heatmap.png')

اختبار سريع

اختبر مدى فهمك للخرائط الحرارية للارتباط من هذا الدرس.

مراجعة الدرس

تعلّمت في هذا الدرس أن DataFrame.corr() يحسب الارتباطات الزوجية، وأن sns.heatmap يعرضها كشبكة ألوان باستخدام خرائط ألوان متباينة وتعليقات توضيحية، وأن إخفاء المثلث العلوي يزيل التكرار. بعد ذلك، سنستكشف مسار تحليل البيانات الاستكشافي الكامل — وهو قائمة فحص منهجية لتوصيف أي مجموعة بيانات جديدة.

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

هل درس «خرائط حرارية لمصفوفات الارتباط» مجاني؟

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

ماذا ستتعلم في «خرائط حرارية لمصفوفات الارتباط»؟

احسب مصفوفة ارتباط باستخدام DataFrame.corr()، واعرضها كخريطة حرارية ملوّنة باستخدام sns.heatmap. تتمرن على Pandas & NumPy Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «خرائط حرارية لمصفوفات الارتباط»؟

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

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

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

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

  1. مخططات التوزيع: histplot وkdeplot
  2. المخططات الفئوية: boxplot وbarplot وviolinplot
  3. المخططات البعثرية ومخططات الأزواج
  4. خرائط حرارية لمصفوفات الارتباط
← العودة إلى Pandas & NumPy Academy