انتقل إلى المحتوى الرئيسي

الوحدة 8 — التصوير البياني بـMatplotlib وSeaborn

الرسم ليس زينة تُضاف في النهاية، بل أداة تفكير. جدول من ألف صفّ يُخفي التوزيع والاتجاه والشذوذ؛ ورسمٌ واحد جيّد يظهرها في لحظة. تقدّم هذه الوحدة مبدأً واحداً حاكماً — لكلّ سؤال رسمُه — والأداتين اللتين تنفّذانه.

اختر الرسم بحسب السؤال، لا بحسب الذوق

الخطأ الشائع اختيار رسم لأنّه «جميل». الاختيار الصحيح ينبع من السؤال:

السؤالالرسمما يُظهره
كيف يتوزّع متغيّر واحد؟مدرّج تكراري (histogram)الشكل، القمم، التناظر
هل توجد قيم شاذّة؟صندوقي (boxplot)الوسيط، الأرباع، القيم القصوى
كيف يرتبط متغيّران؟مبعثر (scatter)الاتجاه، القوّة، التجمّعات
كيف يتطوّر شيء عبر الزمن؟خطّي (line)الاتجاه العام، الموسمية
كيف تُقارَن فئات؟أعمدة (bar)الترتيب، الفروق النسبية

هذه المطابقة الخمسة تغطّي جلّ حاجات التحليل الاستكشافي. والقاعدة العملية: ابدأ من السؤال المكتوب بجملة، ثم اختر السطر المقابل.

Matplotlib: المحرّك الأساس

كلّ مكتبات بايثون البيانية مبنية فوق Matplotlib. يكفي إتقان نمطها الصريح المبني على الشكل (figure) والمحاور (axes):

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 5))
ax.hist(df["amount"], bins=30, edgecolor="white")
ax.set_xlabel("المبلغ (بالدرهم)")
ax.set_ylabel("عدد الطلبات")
ax.set_title("توزيع مبالغ الطلبات")
fig.tight_layout()
fig.savefig("distribution.png", dpi=150)

نمط fig, ax أوضح من الأوامر العامّة (plt.hist, plt.title) لأنّه صريح في الكائن المُعدَّل — أساسيٌّ ما إن تضع عدّة رسوم متجاورة:

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].hist(df["amount"], bins=30)
axes[1].boxplot(df["amount"])

tight_layout() تمنع تداخل التسميات، وsavefig بـdpi=150 على الأقلّ تنتج صورة نظيفة لتقرير.

Seaborn: الطريق المختصر عالي المستوى

Seaborn طبقة فوق Matplotlib، تنتج رسوماً إحصائية بسطر واحد وتحمل مقابض بيانات pandas مباشرة:

import seaborn as sns

sns.histplot(data=df, x="amount", hue="segment") # توزيع مقسّم بلون
sns.boxplot(data=df, x="segment", y="amount") # صناديق لكلّ فئة
sns.scatterplot(data=df, x="age", y="amount", hue="segment")
sns.heatmap(df.corr(numeric_only=True), annot=True, cmap="coolwarm") # مصفوفة الارتباط

الوسيط hue — تلوين بحسب فئة — هو ما يمنح Seaborn قوّته: بُعد ثالث بلا جهد. وخريطة الارتباط الحرارية أداة استكشاف نموذجية قبل النمذجة: تكشف بلمحة أزواج المتغيّرات المترابطة بقوّة.

القاعدة العملية: Seaborn للاستكشاف السريع والرسوم الإحصائية، وMatplotlib الخام حين تحتاج تحكّماً دقيقاً في كلّ تفصيلة للنشر النهائي. وهما يتعايشان: تُنشئ رسماً بـSeaborn ثم تضبطه بأوامر ax من Matplotlib.

الرسوم المضلّلة: أخلاقيات العرض

الرسم يقنع أسرع ممّا يبرهن — وهذا ما يجعل نزاهته مسؤولية:

  • محور Y مبتور: بدء المحور من قيمة غير الصفر يضخّم فرقاً ضئيلاً. مشروع أحياناً، لكن يجب أن يكون واعياً ومُشاراً إليه.
  • إفراط في التلوين: أكثر من ستّ فئات ملوّنة يصير ضجيجاً؛ فكّر في التجميع أو الترتيب.
  • رسم دائري بشرائح كثيرة: العين تقارن الأطوال أفضل من الزوايا؛ رسم الأعمدة يتفوّق دائماً تقريباً.
  • ارتباط ≠ سببية: مبعثرٌ صاعدٌ لا يثبت أنّ متغيّراً يسبّب الآخر — كما بيّنت دورة المقدّمة.

معيار بسيط: هل يقود الرسمُ القارئَ إلى الاستنتاج الذي تدعمه البيانات فعلاً، أم إلى ما تريد أن يعتقده؟ الأول تصوير، والثاني دعاية.

الخلاصة

  • اختر الرسم من السؤال: مدرّج للتوزيع، صندوقي للشذوذ، مبعثر للعلاقة، خطّي للزمن، أعمدة للفئات.
  • Matplotlib بنمط fig, ax الصريح للتحكّم؛ وtight_layout وsavefig(dpi=150) لمخرجات نظيفة.
  • Seaborn لرسوم إحصائية بسطر واحد؛ والوسيط hue يضيف بُعداً فئوياً بلا جهد؛ وخريطة الارتباط الحرارية للاستكشاف قبل النمذجة.
  • احذر المحاور المبتورة والإفراط اللوني والرسوم الدائرية؛ والرسم النزيه يخدم البيانات لا الرسالة المسبقة.

الوحدة التالية: البيئات والتبعيّات — كيف تجعل عملك قابلاً للتشغيل على جهاز آخر بلا مفاجآت.