EduFlow
Python لتحليل البيانات
⁦0%⁩

الوحدة 5 · الإجابة عن أسئلة حقيقية

الرسوم البيانية باستخدام pandas و matplotlib

16 دقراءة 4 داختر بحكمة

الدرس في لمحة

اختر الرسم البياني المناسب للسؤال، وارسمه من DataFrame باستخدام ‎.plot في pandas وكائني figure و axes في matplotlib، وضع عليه عناوين تجعله يقول اكتشافه وحده.

  1. 1اختر الرسم من السؤال
  2. 2جهّز البيانات ثم ارسم
  3. 3ارسمه باستخدام pandas و matplotlib
  4. 4افحص الرسم قبل أن تشاركه

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

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

كود الرسوم في هذا الدرس مخصّص لـ Jupyter notebook الخاص بك: كتل Run في هذه الدورة تعرض نصًا مطبوعًا لا صورًا. أما تجهيز البيانات فيعمل هنا كالمعتاد.

اختر الرسم من السؤال

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

معظم الرسوم البيانية في العمل واحد من هذه الأربعة. الرسوم الدائرية تقارن بشكل سيئ بعد شريحتين أو ثلاث؛ ورسم الأعمدة المرتّبة يقول الشيء نفسه بوضوح أكبر. والرسوم ذات المحورين الرأسيين المختلفين تدعو القارئ إلى مقارنة خطوط على مقاييس لا علاقة بينها، ففضّل رسمين مكدّسين أحدهما فوق الآخر.

جهّز البيانات ثم ارسم

الرسم البياني يريد جدولًا صغيرًا: صف لكل نقطة أو عمود، مرتّبًا ومسمّى مسبقًا. بناؤه عمل pandas عادي، ويعمل هنا:

Python
import pandas as pd

items = pd.read_csv("order_items.csv")
orders = pd.read_csv("orders.csv", parse_dates=["order_date"])
items["revenue"] = items["quantity"] * items["unit_price"] * (1 - items["discount"])
orders = orders.merge(items.groupby("order_id", as_index=False)["revenue"].sum(), on="order_id", validate="one_to_one")
orders = orders[orders["status"] != "cancelled"]

monthly = orders.set_index("order_date").resample("ME")["revenue"].sum()
by_year = monthly.groupby([monthly.index.year, monthly.index.month]).sum().unstack(level=0)
by_year.index.name = "month"
print(by_year.round(0))

تنقل unstack(level=0) السنة إلى الأعمدة، فيصبح هناك عمود لكل سنة وصف لكل شهر: الشكل المطلوب بالضبط لرسم فيه خط لكل سنة. ومقارنة السنوات على محور واحد من يناير إلى ديسمبر هي طريقة رؤية الموسمية: إذا ارتفع الخطان كلاهما في نوفمبر، فقفزة نوفمبر نمط لا مصادفة.

ارسمه باستخدام pandas و matplotlib

تستدعي methods .plot في pandas مكتبة matplotlib نيابةً عنك. أنشئ الـ figure والـ axes بنفسك، كي تستطيع إنهاء الرسم كما يجب:

Python
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(8, 4))
by_year.plot(ax=ax, marker="o")
ax.set_title("November is the peak in both years; 2025 runs about 2.7x 2024")
ax.set_xlabel("Month")
ax.set_ylabel("Revenue (USD)")
ax.yaxis.set_major_formatter("${x:,.0f}")
ax.set_xticks(range(1, 13))
ax.legend(title="Year")
fig.tight_layout()
fig.savefig("monthly_revenue.png", dpi=150, bbox_inches="tight")

تعيد plt.subplots() كائن figure (الصورة كلها) وكائن axes (منطقة رسم واحدة بمحوريها الأفقي والرأسي). ترسم by_year.plot(ax=ax) خطًا لكل عمود على تلك الـ axes، وكل استدعاء ax.set_... يحسّنها. ونص التنسيق الممرَّر إلى set_major_formatter يحوّل قيم العلامات على المحور إلى دولارات بفواصل الآلاف. وتكتب savefig الملف الذي تلصقه في شريحة العرض؛ وbbox_inches="tight" تقصّ الهوامش الفارغة.

ولمقارنة الفئات، رتّب أولًا واستخدم أعمدة أفقية كي تبقى التسميات الطويلة مقروءة:

Python
# sales: the line-level table you built in Lesson 4.2
revenue_by_country = sales.groupby("country")["revenue"].sum().sort_values()

fig, ax = plt.subplots(figsize=(7, 4))
bars = ax.barh(revenue_by_country.index, revenue_by_country.values)
ax.bar_label(bars, fmt="${:,.0f}", padding=3)
ax.set_title("UAE and UK lead revenue; Jordan trails")
ax.set_xlabel("Revenue 2024-2025 (USD)")
fig.tight_layout()

وللتوزيع، مدرّج تكراري لقيم الطلبات مع تحديد الوسيط:

Python
fig, ax = plt.subplots(figsize=(7, 4))
orders["revenue"].plot.hist(bins=40, ax=ax)
ax.axvline(orders["revenue"].median(), linestyle="--", label="median $147")
ax.set_xlabel("Order value (USD)")
ax.legend()

وللعلاقات، يضع مخطط الانتشار (scatter plot) عمودًا رقميًا على كل محور. مع آلاف النقاط تتكدّس في كتلة واحدة، فاجعلها صغيرة وشبه شفافة، وكثيرًا ما يكون أوضح أن ترسم ملخّصًا بدلًا من ذلك، مثل معدّل الشراء لكل عدد من الصفحات المعروضة:

Python
# assumes fig, ax = plt.subplots() and churn.csv / web_sessions.csv loaded as churn / sessions
churn.plot.scatter(x="tenure_days", y="total_spent", s=8, alpha=0.3, ax=ax)

rate = sessions.groupby("pages_viewed")["purchased"].mean()
rate.loc[:15].plot(ax=ax, marker="o")   # one point per page count, up to 15

السطر الأول هو النمط لأي عمودين رقميين، وهنا مدة بقاء كل عميل مقابل إجمالي إنفاقه من churn.csv؛ والسطران الآخران يحوّلان 6,000 جلسة إلى خمس عشرة نقطة مقروءة، كل منها معدّل تحويل.

افحص الرسم قبل أن تشاركه

الرسوم البيانية تخفي الأخطاء ببراعة. قبل أن يغادر رسم الـ notebook الخاص بك، قارنه بالجدول الذي جاء منه: عدد الأعمدة أو النقاط، والفترة الأولى والأخيرة (الشهر الجزئي في النهاية يبدو انهيارًا، كما حذّر الدرس 4.4)، وقيمة أو اثنتين تستطيع قراءتهما من الرسم ومقارنتهما برقم مطبوع. ثم انظر إليه مرة كما ينظر غريب: هل يستطيع من لم يرَ البيانات قط أن يقول ما يُظهره في جملة واحدة؟ إن لم يستطع، فغيّر العنوان أو ترتيب الفرز أو نوع الرسم، لا القارئ.

ستقابل أيضًا seaborn، وهي مكتبة مبنية على matplotlib بإعدادات افتراضية إحصائية جيدة. كل ما هنا ينطبق عليها: ترسم على الـ ax نفسها، وتنطبق القواعد نفسها عن خطوط الأساس والعناوين.

في تمرين هذا الدرس تختار الرسوم المناسبة لمجموعة من الأسئلة. وفي الدرس التالي تجمع كل شيء معًا وتجيب عن سؤال الربع الرابع من البداية إلى النهاية.

أهم النقاط

  • اختر الرسم من السؤال - الخطي للتغيّر عبر الزمن، والأعمدة المرتّبة لمقارنة الفئات، والمدرّج التكراري للتوزيع، ومخطط الانتشار للعلاقة.
  • fig, ax = plt.subplots() ثم df.plot(ax=ax) تعطيك سهولة pandas مع تحكّم matplotlib الكامل في العناوين والمحاور والحفظ.
  • جهّز جدولًا صغيرًا مرتّبًا أولًا (صف لكل عمود أو نقطة)، ثم ارسمه؛ فمعظم مشكلات الرسم البياني مشكلات في تشكيل البيانات.
  • الأعمدة تبدأ من الصفر، والمحاور تحمل وحداتها، والعنوان يقول الاكتشاف بدلًا من تسمية المتغيّرات.
  • fig.savefig("chart.png", dpi=150, bbox_inches="tight") تحفظ الرسم لتقرير؛ والرسوم البيانية لا تظهر في كتل Run في هذه الدورة.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

تريد أن تُظهر أن الإيراد لكل قناة نما من 2024 إلى 2025. أيّ رسم بياني يُقرأ أفضل؟

السؤال 2 من 3

ما ميزة fig, ax = plt.subplots() ثم monthly.plot(ax=ax)، مقارنةً باستدعاء monthly.plot() وحدها؟

السؤال 3 من 3

رسم أعمدة للإيراد بحسب الدولة محوره الرأسي يبدأ من 60,000. ما المشكلة؟

تدريب

اختر بحكمة

اختر الرسوم لعرض الربع الرابع

يسأل رئيس النمو: “هل الربع الرابع من 2025 غير معتاد، أم أنه الذروة الموسمية الطبيعية لعمل ينمو؟” لديك الإيراد الشهري والفصلي لعامي 2024 و2025. اختر كل رسم بياني يساعد على الإجابة عن هذا السؤال بصدق.

اختر الرسوم لعرض الربع الرابع