Machine Learning: التصور باستخدام Matplotlib و Seaborn

آخر تحديث: 2026-08-26

الرسم البياني الجيد يساوي ألف صف من البيانات — التصور هو الخطوة الأولى لاكتشاف الأنماط.

1. ما ستتعلمه


2. قصة حقيقية من مدير منتج

(1) نقطة الألم: الاتجاهات والشذوذ غير مرئية في البيانات الجدولية

أرسل Bob تقرير مبيعات SalesPredict الشهري إلى فريقه — 50 صفًا من بيانات Excel، ولم يستطع أحد أن يحدد بسرعة أي فئة تتراجع أو أي أشهر بها تقلبات غير طبيعية. اتجاهات بيانات Alice الأمريكية كانت مختلفة تمامًا عن بيانات الصين، لكن التحديق في الأرقام الخام جعل اكتشاف الفرق شبه مستحيل. كانت البيانات مدفونة في جداول البيانات، وكانت الرؤى الرئيسية غارقة.

(2) حل التصور

كشف رسم خطي واحد عن اتجاه تنازلي واضح في فئة Electronics خلال الربع الثالث؛ وأظهرت خريطة حرارية أن الارتباط بين الإنفاق الإعلاني والإيرادات تجاوز التوقعات بكثير.

PYTHON
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 واحد أو أكثر (مناطق الرسم).

100%
graph TB
    FIG[Figure - اللوحة] --> AX1[Axes 1<br/>مخطط فرعي 1]
    FIG --> AX2[Axes 2<br/>مخطط فرعي 2]
    AX1 --> LINE[رسم خطي]
    AX2 --> BAR[رسم أعمدة]

▶ مثال: إنشاء رسم خطي أساسي

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully

(2) أنواع الرسوم البيانية الشائعة

▶ مثال: رسم الأعمدة ورسم التشتت

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully
نوع الرسم أفضل حالة استخدام دالة Matplotlib
رسم خطي اتجاهات زمنية ax.plot()
رسم أعمدة مقارنة الفئات ax.bar() / ax.barh()
رسم التشتت علاقة بين متغيرين ax.scatter()
رسم دائري التوزيع النسبي ax.pie()
رسم بياني شريطي توزيع متغير واحد ax.hist()

4. الرسوم البيانية المتقدمة في Seaborn

Seaborn مبني فوق Matplotlib، ويوفر رسومًا إحصائية عالية المستوى وأنماطًا افتراضية أكثر أناقة.

(1) رسوم التوزيع

▶ مثال: تحليل توزيع مبالغ الطلبات

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully

(2) الخرائط الحرارية

▶ مثال: خريطة حرارية لارتباط الميزات

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully

(3) تخطيطات متعددة المخططات الفرعية

▶ مثال: لوحة تحليل SalesPredict بأربعة أبعاد

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully

5. تخصيص الأنماط واختيار الرسم البياني

(1) سمات Seaborn ولوحات الألوان

PYTHON
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) دليل قرار اختيار الرسم البياني

100%
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

PYTHON
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:

TEXT 📖 للعرض فقط
# Executed successfully

❓ أسئلة شائعة

س هل أستخدم Matplotlib أم Seaborn؟
ج استخدم Seaborn للتحليل اليومي (أنظف وأكثر أناقة)، و Matplotlib عندما تحتاج إلى تحكم دقيق. Seaborn مبني فوق Matplotlib، لذا يمكنك المزج بحرية.
س كيف أُصلح تشوه أحرف CJK في الرسوم البيانية؟
ج اضبط plt.rcParams["font.sans-serif"] على خط CJK. ومع ذلك، يوصى باستخدام التسميات الإنجليزية لتجنب مشكلات الخطوط عبر المنصات.
س الأشكال التي أحفظها تبدو ضبابية. كيف أُصلح ذلك؟
ج اضبط معامل dpi: 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) للتحكم اليدوي في المسافات.

📖 ملخص

📝 تمارين

  1. أساسي (الصعوبة ⭐): ارسم رسمًا خطيًا باستخدام Matplotlib يوضح اتجاهات المبيعات لـ 12 شهرًا. أضف عنوانًا وتسميات للمحاور. تلميح: راجع مثال الرسم الخطي في القسم 3.
  2. متوسط (الصعوبة ⭐⭐): أنشئ لوحة 2x2 باستخدام Seaborn: رسم خطي (اتجاه)، رسم أعمدة (مقارنة فئات)، مخطط صندوق (توزيع)، وخريطة حرارية (ارتباط)، باستخدام بيانات SalesPredict المحاكاة. تلميح: plt.subplots(2,2) + sns.xxx(ax=axes[i,j]).
  3. تحدي (الصعوبة ⭐⭐⭐): أنشئ مفهوم لوحة معلومات تفاعلية — ارسم رسمًا خطيًا للاتجاه الإيرادات الشهرية، وميّز "أشهر العروض الترويجية" و "الأشهر العادية" بألوان مختلفة، وأضف شروحًا تشرح تأثيرات العروض الترويجية. تلميح: استخدم ax.axvspan() لتظليل المناطق و ax.annotate() لإضافة الشروحات.

← الدرس السابق: معالجة البيانات باستخدام Pandas | الدرس التالي: البدء مع Scikit-learn →

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%