طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 2 · الوحدة 1: مقدمة في علم البيانات وتحليل البيانات

أدوات التحليل: Pandas و NumPy

Series و DataFrame و NumPy: البِنى التي يقوم عليها كل تحليل لاحق. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تميّز بين Series و DataFrame.
  • تفحص جدولًا جديدًا بـ shape و columns.
  • تجري حسابًا متجهيًّا بـ NumPy دون حلقات.
  • ترسم أعمدة بسيطة بـ Matplotlib.

١Series و DataFrame: لبِنتا Pandas

في Pandas بنيتان: Series عمودٌ واحد مُفهرَس، وDataFrame جدولٌ من عدة أعمدة. معظم عملك على DataFrame، وكل عمود فيه هو Series.

main.py
import pandas as pd # Series: عمود واحدclicks = pd.Series([120, 95, 210, 55], name="clicks")print(clicks)print("المجموع:", clicks.sum(), "| الأعلى:", clicks.max()) # DataFrame: جدول من أعمدةdf = pd.DataFrame({    "page": ["home", "products", "cart", "checkout"],    "clicks": [120, 95, 210, 55],    "bounce": [0.52, 0.31, 0.40, 0.20],})print(df)print("الأعمدة:", list(df.columns), "| الشكل:", df.shape)
Shell×
>>> %Run main.py
0 120
1 95
2 210
3 55
Name: clicks, dtype: int64
المجموع: 480 | الأعلى: 210
page clicks bounce
0 home 120 0.52
1 products 95 0.31
2 cart 210 0.40
3 checkout 55 0.20
الأعمدة: ['page', 'clicks', 'bounce'] | الشكل: (4, 3)
>>>

لاحظ df.shape: صفّان من الأرقام (الصفوف، الأعمدة). وdf.columns أسماء الأعمدة. هاتان أول ما تنظر إليه في أي جدول جديد.

٢NumPy: الحساب المتجهي السريع

تحت Pandas يعمل NumPy: مصفوفات أرقام تُحسب دفعةً واحدة، أسرع بكثير من حلقة for. الفكرة: عمليةٌ واحدة على كل العناصر معًا (تُسمّى vectorization).

main.py
import numpy as np sec = np.array([12, 45, 30, 90, 52])print("المتوسط:", sec.mean())print("الانحراف المعياري:", round(sec.std(), 2)) # عملية على كل العناصر دفعة واحدة — بلا حلقةminutes = sec / 60print("بالدقائق:", np.round(minutes, 2)) # شرط متجهي: كم زيارة تجاوزت 40 ثانية؟print("زيارات طويلة:", int((sec > 40).sum()))
Shell×
>>> %Run main.py
المتوسط: 45.8
الانحراف المعياري: 26.02
بالدقائق: [0.2 0.75 0.5 1.5 0.87]
زيارات طويلة: 3
>>>

الكتابة المتجهية ليست أسرع فحسب، بل أوضح: sec / 60 تقرؤها «حوّل كل القيم إلى دقائق»، دون حلقة ولا متغيّر عدّاد.

٣من الأرقام إلى رسم

Matplotlib يرسم البيانات. أنشئ الشكل ثم اضغط ▶ شغّل هنا لترى الرسمة تظهر داخل المخرجات:

main.py
import matplotlib.pyplot as plt pages = ["home", "products", "cart", "checkout"]clicks = [120, 95, 210, 55] plt.figure(figsize=(5, 3))plt.bar(pages, clicks, color="#0F766E")plt.title("Clicks per page")plt.ylabel("clicks")plt.tight_layout()# لا نحتاج plt.show() هنا: المختبر يعرض الرسمة تلقائيًّا
Shell×
>>> %Run main.py
>>>

توقّع وتحقّق

كل عمود في DataFrame هو:

df.shape يعطي:

sec / 60 على مصفوفة NumPy:

(sec > 40).sum() تعطي:

الخلاصة

تحدٍّ برمجي: إحصاء سريع

تمهيدي

لديك مصفوفة أزمنة بقاء (بالثواني). اطبع المتوسط مقرّبًا لمنزلة واحدة، وعدد القيم التي تجاوزت المتوسط.

المطلوب:
  • اطبع متوسط sec مقرّبًا إلى منزلة عشرية واحدة.
  • اطبع عدد القيم الأكبر من المتوسط.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import numpy as npsec = np.array([12, 45, 30, 90, 52, 8, 64, 25])# اطبع المتوسط (منزلة واحدة) ثم عدد القيم فوق المتوسط
المطلوب×
40.8
4
💡 تلميح 1
احسب المتوسط في متغيّر: m = sec.mean().
💡 تلميح 2
عدد القيم فوقه: (sec > m).sum().

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import numpy as npsec = np.array([12, 45, 30, 90, 52, 8, 64, 25])m = sec.mean()print(round(m, 1))print(int((sec > m).sum()))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس