Machine Learning: التصور باستخدام Matplotlib و Seaborn
آخر تحديث: 2026-08-26
الرسم البياني الجيد يساوي ألف صف من البيانات — التصور هو الخطوة الأولى لاكتشاف الأنماط.
1. ما ستتعلمه
- أساسيات Matplotlib: نظام figure/axes/subplots، الرسوم البيانية الخطية، والأعمدة، والتشتت
- الرسوم البيانية المتقدمة في Seaborn: رسوم التوزيع (histplot)، ومخططات الصندوق، والخرائط الحرارية
- تخطيطات متعددة المخططات الفرعية وتخصيص الأنماط: sns.set_theme، ولوحات الألوان، وتكوين خطوط CJK
- تصور بيانات التجارة الإلكترونية عمليًا: اتجاهات الإيرادات الشهرية، وحصة الفئات، وتوزيع RFM للمستخدمين
- قرارات اختيار الرسم البياني: اختيار أفضل نوع رسم بياني لبياناتك
2. قصة حقيقية من مدير منتج
(1) نقطة الألم: الاتجاهات والشذوذ غير مرئية في البيانات الجدولية
أرسل Bob تقرير مبيعات SalesPredict الشهري إلى فريقه — 50 صفًا من بيانات Excel، ولم يستطع أحد أن يحدد بسرعة أي فئة تتراجع أو أي أشهر بها تقلبات غير طبيعية. اتجاهات بيانات Alice الأمريكية كانت مختلفة تمامًا عن بيانات الصين، لكن التحديق في الأرقام الخام جعل اكتشاف الفرق شبه مستحيل. كانت البيانات مدفونة في جداول البيانات، وكانت الرؤى الرئيسية غارقة.
(2) حل التصور
كشف رسم خطي واحد عن اتجاه تنازلي واضح في فئة Electronics خلال الربع الثالث؛ وأظهرت خريطة حرارية أن الارتباط بين الإنفاق الإعلاني والإيرادات تجاوز التوقعات بكثير.
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# تصور سريع يكشف الأنماط المخفية
df = pd.read_csv("monthly_sales.csv")
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
df.plot(x="month", y="revenue", ax=axes[0], title="Revenue Trend")
sns.heatmap(df.corr(numeric_only=True), annot=True, ax=axes[1])
plt.tight_layout()
plt.savefig("sales_overview.png", dpi=150)
(3) النتيجة: رؤى تجارية رئيسية في 5 دقائق
بعد استبدال الجداول الخام بالتصورات، اكتشف Bob التراجع بنسبة 15% في فئة Electronics خلال الربع الثالث في غضون 5 دقائق. عدّل استراتيجية الإعلان في الوقت المناسب، واسترد ما يقرب من 200 ألف دولار من الخسائر المحتملة.
3. أساسيات Matplotlib
(1) نظام Figure/Axes
يستخدم Matplotlib بنية من طبقتين: Figure (اللوحة) يحتوي على Axes واحد أو أكثر (مناطق الرسم).
graph TB
FIG[Figure - اللوحة] --> AX1[Axes 1<br/>مخطط فرعي 1]
FIG --> AX2[Axes 2<br/>مخطط فرعي 2]
AX1 --> LINE[رسم خطي]
AX2 --> BAR[رسم أعمدة]
▶ مثال: إنشاء رسم خطي أساسي
import matplotlib.pyplot as plt
# بيانات الإيرادات الشهرية (بالألف دولار)
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
revenue = [120, 135, 150, 142, 160, 175, 180, 190, 195, 200, 220, 250]
fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(months, revenue, marker="o", linewidth=2, color="#2196F3")
ax.set_title("Monthly Revenue Trend", fontsize=14)
ax.set_xlabel("Month")
ax.set_ylabel("Revenue (thousand USD)")
ax.grid(True, alpha=0.3)
ax.fill_between(months, revenue, alpha=0.1, color="#2196F3")
# تمييز الذروة
peak_idx = revenue.index(max(revenue))
ax.annotate(f"Peak: {max(revenue)}k", xy=(peak_idx, max(revenue)),
xytext=(peak_idx-2, max(revenue)+15),
arrowprops=dict(arrowstyle="->", color="red"))
plt.tight_layout()
plt.savefig("revenue_trend.png", dpi=150)
Output:
# Executed successfully
(2) أنواع الرسوم البيانية الشائعة
▶ مثال: رسم الأعمدة ورسم التشتت
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Bar chart: إيرادات الفئات
categories = ["Electronics", "Clothing", "Food", "Books", "Home"]
revenue = [2500, 1450, 900, 700, 4000]
colors = ["#FF6384", "#36A2EB", "#FFCE56", "#4BC0C0", "#9966FF"]
axes[0].barh(categories, revenue, color=colors)
axes[0].set_title("Revenue by Category")
axes[0].set_xlabel("Revenue (thousand USD)")
# Scatter plot: الإنفاق الإعلاني مقابل الإيرادات
np.random.seed(42)
ad_spend = np.random.uniform(10, 100, 50)
sales = 50 + 0.8 * ad_spend + np.random.normal(0, 10, 50)
axes[1].scatter(ad_spend, sales, alpha=0.6, color="#2196F3", edgecolors="white")
axes[1].set_title("Ad Spend vs Revenue")
axes[1].set_xlabel("Ad Spend (thousand USD)")
axes[1].set_ylabel("Revenue (thousand USD)")
# إضافة خط الاتجاه
z = np.polyfit(ad_spend, sales, 1)
p = np.poly1d(z)
axes[1].plot(ad_spend, p(ad_spend), "r--", alpha=0.8, linewidth=2)
plt.tight_layout()
plt.savefig("bar_scatter.png", dpi=150)
Output:
# Executed successfully
| نوع الرسم | أفضل حالة استخدام | دالة Matplotlib |
|---|---|---|
| رسم خطي | اتجاهات زمنية | ax.plot() |
| رسم أعمدة | مقارنة الفئات | ax.bar() / ax.barh() |
| رسم التشتت | علاقة بين متغيرين | ax.scatter() |
| رسم دائري | التوزيع النسبي | ax.pie() |
| رسم بياني شريطي | توزيع متغير واحد | ax.hist() |
4. الرسوم البيانية المتقدمة في Seaborn
Seaborn مبني فوق Matplotlib، ويوفر رسومًا إحصائية عالية المستوى وأنماطًا افتراضية أكثر أناقة.
(1) رسوم التوزيع
▶ مثال: تحليل توزيع مبالغ الطلبات
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# توليد بيانات مبالغ الطلبات
rng = np.random.default_rng(42)
orders_normal = rng.normal(150, 50, 1000)
orders_normal = orders_normal[orders_normal > 0] # إزالة القيم السالبة
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# Histogram مع KDE
sns.histplot(orders_normal, bins=30, kde=True, ax=axes[0], color="#2196F3")
axes[0].set_title("Order Amount Distribution")
axes[0].set_xlabel("Amount (USD)")
# Box plot حسب الفئة
categories = rng.choice(["Electronics", "Clothing", "Food"], 500)
amounts = np.where(categories == "Electronics",
rng.normal(300, 80, 500),
np.where(categories == "Clothing",
rng.normal(120, 40, 500),
rng.normal(50, 20, 500)))
amounts = np.clip(amounts, 1, None)
data = {"category": categories, "amount": amounts}
sns.boxplot(data=data, x="category", y="amount", ax=axes[1], palette="Set2")
axes[1].set_title("Order Amount by Category")
plt.tight_layout()
plt.savefig("distribution.png", dpi=150)
Output:
# Executed successfully
(2) الخرائط الحرارية
▶ مثال: خريطة حرارية لارتباط الميزات
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# محاكاة ارتباطات ميزات SalesPredict
np.random.seed(42)
n = 200
ad_spend = np.random.uniform(10, 100, n)
traffic = ad_spend * 1.2 + np.random.normal(0, 15, n)
conversion = traffic * 0.03 + np.random.normal(0, 0.5, n)
revenue = conversion * 150 + np.random.normal(0, 500, n)
customer_age = np.random.uniform(18, 65, n)
df = pd.DataFrame({
"ad_spend": ad_spend,
"traffic": traffic,
"conversion_rate": conversion,
"revenue": revenue,
"customer_age": customer_age,
})
corr = df.corr()
fig, ax = plt.subplots(figsize=(8, 6))
sns.heatmap(corr, annot=True, fmt=".2f", cmap="RdBu_r",
center=0, vmin=-1, vmax=1, ax=ax,
square=True, linewidths=0.5)
ax.set_title("Feature Correlation Heatmap")
plt.tight_layout()
plt.savefig("correlation_heatmap.png", dpi=150)
Output:
# Executed successfully
(3) تخطيطات متعددة المخططات الفرعية
▶ مثال: لوحة تحليل SalesPredict بأربعة أبعاد
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
rng = np.random.default_rng(42)
df = pd.DataFrame({
"date": pd.date_range("2024-01-01", periods=90),
"revenue": rng.normal(5000, 1000, 90).cumsum(),
"category": rng.choice(["Elec", "Cloth", "Food"], 90),
"orders": rng.integers(50, 200, 90),
})
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# (1) اتجاه الإيرادات
axes[0, 0].plot(df["date"], df["revenue"], color="#2196F3")
axes[0, 0].set_title("Daily Revenue Trend")
# (2) توزيع الفئات
cat_rev = df.groupby("category")["revenue"].sum()
axes[0, 1].pie(cat_rev, labels=cat_rev.index, autopct="%1.1f%%")
# (3) توزيع الطلبات
sns.histplot(df["orders"], bins=20, kde=True, ax=axes[1, 0], color="#4CAF50")
axes[1, 0].set_title("Orders Distribution")
# (4) الإيرادات مقابل الطلبات
axes[1, 1].scatter(df["orders"], df["revenue"], alpha=0.5, c="#FF5722")
axes[1, 1].set_title("Revenue vs Orders")
plt.tight_layout()
plt.savefig("dashboard.png", dpi=150)
Output:
# Executed successfully
5. تخصيص الأنماط واختيار الرسم البياني
(1) سمات Seaborn ولوحات الألوان
import seaborn as sns
# تعيين السمة العامة
sns.set_theme(style="whitegrid", palette="muted", font_scale=1.2)
# السمات المتاحة: darkgrid, whitegrid, dark, white, ticks
# لوحات الألوان المتاحة: deep, muted, pastel, bright, dark, colorblind
| السمة | الخلفية | الشبكة | الأفضل لـ |
|---|---|---|---|
| darkgrid | داكنة | نعم | عروض البيانات الكثيفة |
| whitegrid | بيضاء | نعم | التقارير الأكاديمية |
| dark | داكنة | لا | العروض التقديمية |
| white | بيضاء | لا | الأوراق البحثية |
| ticks | بيضاء | لا | أسلوب مبسط |
(2) دليل قرار اختيار الرسم البياني
graph TB
DATA[نوع البيانات] --> CAT[فئوية]
DATA --> NUM[رقمية]
DATA --> TIME[سلسلة زمنية]
CAT --> COMP[مقارنة<br/>رسم أعمدة]
CAT --> PART[جزء من كل<br/>دائري / أعمدة متراكمة]
NUM --> DIST[التوزيع<br/>رسم بياني شريطي / KDE / صندوق]
NUM --> REL[علاقة<br/>تشتت / خريطة حرارية]
TIME --> TREND[اتجاه<br/>رسم خطي]
TIME --> SEA[موسمية<br/>رسم موسمي]
▶ مثال: تكوين خطوط CJK
import matplotlib.pyplot as plt
# الطريقة 1: استخدام خط SimHei (Windows)
plt.rcParams["font.sans-serif"] = ["SimHei", "Microsoft YaHei"]
plt.rcParams["axes.unicode_minus"] = False
# الطريقة 2: استخدام تسميات إنجليزية (موصى بها للتدويل)
# احتفظ بجميع التسميات بالإنجليزية لتجنب مشكلات الخطوط عبر المنصات
fig, ax = plt.subplots()
ax.set_title("Monthly Sales Report") # الإنجليزية للتوافق
ax.set_xlabel("Month")
ax.set_ylabel("Revenue (thousand USD)")
Output:
# Executed successfully
❓ أسئلة شائعة
plt.rcParams["font.sans-serif"] على خط CJK. ومع ذلك، يوصى باستخدام التسميات الإنجليزية لتجنب مشكلات الخطوط عبر المنصات.plt.savefig("fig.png", dpi=150). استخدم 300+ للأوراق، و 100-150 للويب. للرسومات المتجهة، استخدم تنسيق .svg أو .pdf.hue في Seaborn؟hue بتجميع البيانات وتلوينها حسب عمود محدد. على سبيل المثال، sns.scatterplot(data=df, x="ad_spend", y="revenue", hue="category") يخصص لونًا مختلفًا لكل فئة.plt.tight_layout() للضبط التلقائي، أو plt.subplots_adjust(hspace=0.3, wspace=0.3) للتحكم اليدوي في المسافات.📖 ملخص
- نظام Figure/Axes في Matplotlib هو أساس جميع الرسوم البيانية: Figure هو اللوحة، و Axes هو منطقة الرسم
- يوفر Seaborn رسومًا إحصائية عالية المستوى: histplot (توزيع KDE)، و boxplot (مخطط الصندوق)، و heatmap (خريطة الارتباط الحرارية)
- تُنشأ تخطيطات متعددة المخططات الفرعية باستخدام
plt.subplots(nrows, ncols)للإدارة الموحدة لعدة رسوم بيانية - يتبع اختيار الرسم البياني نوع البيانات: زمني → خطي، فئة → أعمدة، توزيع → رسم بياني شريطي، علاقة → تشتت/خريطة حرارية
- تتطلب عرض CJK تكوين الخط، لكن التسميات الإنجليزية موصى بها للتوافق عبر المنصات
- تُعيّن
seaborn.set_theme()النمط بسطر واحد؛ اختر لوحات ألوان ملائمة لعمى الألوان كلما أمكن
📝 تمارين
- أساسي (الصعوبة ⭐): ارسم رسمًا خطيًا باستخدام Matplotlib يوضح اتجاهات المبيعات لـ 12 شهرًا. أضف عنوانًا وتسميات للمحاور. تلميح: راجع مثال الرسم الخطي في القسم 3.
- متوسط (الصعوبة ⭐⭐): أنشئ لوحة 2x2 باستخدام Seaborn: رسم خطي (اتجاه)، رسم أعمدة (مقارنة فئات)، مخطط صندوق (توزيع)، وخريطة حرارية (ارتباط)، باستخدام بيانات SalesPredict المحاكاة. تلميح:
plt.subplots(2,2)+sns.xxx(ax=axes[i,j]). - تحدي (الصعوبة ⭐⭐⭐): أنشئ مفهوم لوحة معلومات تفاعلية — ارسم رسمًا خطيًا للاتجاه الإيرادات الشهرية، وميّز "أشهر العروض الترويجية" و "الأشهر العادية" بألوان مختلفة، وأضف شروحًا تشرح تأثيرات العروض الترويجية. تلميح: استخدم
ax.axvspan()لتظليل المناطق وax.annotate()لإضافة الشروحات.
← الدرس السابق: معالجة البيانات باستخدام Pandas | الدرس التالي: البدء مع Scikit-learn →