في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
تعلم الآلة، الأسبوع 2
تصوير البيانات باستخدام Matplotlib وSeaborn
انظر إلى البيانات قبل أن تبني نموذجها: المخططات التي يستخدمها كل دفتر في المقرر، ومتى يناسب كل منها.
الأهداف
- ▸رسم مخططات الانتشار (scatter) والأعمدة (bar) والمدرج التكراري (histogram) والخطي (line) والصندوقي (box) باستخدام Matplotlib، مع العناوين وتسميات المحاور (labels) وعلامات التدريج (ticks) ومفاتيح الرسم (legends)
- ▸حساب فئات (bins) المدرج التكراري وأجزاء المخطط الصندوقي (boxplot) يدويا
- ▸الرسم مباشرة من DataFrame باستخدام
df.plot.scatterوdf.plot.hist - ▸مقارنة المجموعات باستخدام Seaborn:
boxplotوviolinplotوregplotوlmplot - ▸حساب معامل الارتباط (correlation) r وقراءة الخريطة الحرارية (heatmap) للارتباط
- ▸اختيار المخطط الذي يناسب السؤال، واستخدامه في مقترحك
الأسبوع 2 من الخطة
موقع الدرس من المقرر
- ▸الدفتر (notebook): Matplotlib_Seaborn_basics، على ثلاث مجموعات بيانات صغيرة
- ▸سيناريو من الواقع: تتركه الخطة مفتوحا هذا الأسبوع، لذا نستخدم مواقف الدفتر نفسه: مرضى العيادة، وشهرا من الاستطلاعات، و178 عينة نبيذ
- ▸مرحلة المشروع (project milestone) هذا الأسبوع: مقترح المشروع أو الورقة البحثية (Project/Paper Proposal)
خطة الساعتين
| الجزء | ما نفعله | الزمن |
|---|---|---|
| 1 | Matplotlib على بيانات العيادة، ومدرج تكراري يدويا | 30 دقيقة |
| 2 | بيانات الاستطلاع: مخطط خطي، ومخطط صندوقي يدويا | 20 دقيقة |
| 3 | pandas وSeaborn على بيانات النبيذ | 20 دقيقة |
| 4 | الارتباط، والخريطة الحرارية، واختيار المخطط | 15 دقيقة |
| 5 | تمارين مع الإجابات، ثم الخلاصة | 35 دقيقة |
افتح الدفتر في Colab
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/master/
Pandas%20and%20Numpy/Matplotlib_Seaborn_basics.ipynbالجزء 1
Matplotlib على بيانات العيادة
شكل واحد، يبنى استدعاء بعد استدعاء
بيانات العيادة
اثنا عشر مريضا: العمر بالسنوات، والوزن بالكجم، والطول بالسم
people = ['P1', 'P2', 'P3', 'P4', 'P5', 'P6',
'P7', 'P8', 'P9', 'P10', 'P11', 'P12']
age = [21, 12, 32, 45, 37, 18,
28, 52, 5, 40, 48, 15]
weight = [55, 35, 77, 68, 70, 60,
72, 69, 18, 65, 82, 48]
height = [160, 135, 170, 165, 173, 168,
175, 159, 105, 171, 155, 158]- ▸قوائم Python عادية، قيمة واحدة لكل مريض، بالترتيب نفسه
- ▸تقبل Matplotlib القوائم ومصفوفات NumPy وأعمدة DataFrame على حد سواء
- ▸السؤال: هل توجد علاقة بين هذه الخصائص؟
أول مخطط انتشار
- ▸نقطة واحدة لكل مريض: العمر على x، والطول على y
import matplotlib.pyplot as plt
plt.scatter(age, height)
plt.show()
اللمسات الإضافية
كل استدعاء إضافي يضيف عنصرا واحدا إلى الشكل نفسه
| الاستدعاء | ما يضيفه |
|---|---|
plt.figure(figsize=(8, 6)) | حجم الشكل بالبوصات |
plt.title وplt.xlabel وplt.ylabel | النصوص المحيطة بالمخطط |
plt.ylim(100, 200) | المدى الظاهر من y |
plt.xticks(list) | مواضع علامات التدريج على x |
| الاستدعاء | ما يضيفه |
|---|---|
plt.scatter(c=, s=, edgecolors=) | لون النقطة وحجمها ولون إطارها |
plt.text(x, y, s) | نص عند نقطة بيانات |
plt.vlines وplt.hlines | خطوط رأسية وأفقية |
plt.legend(list, loc=2) | مفتاح رسم، أعلى اليسار |
مثال محلول: أي علامات تدريج؟
plt.xticks([i * 5 for i in range(12)],
fontsize=15)[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]range(12) القيم i = 0 إلى 11، مضروبة في 5: اثنتا عشرة علامة تدريج حتى 55.
مخطط الأعمدة
مقارنة رقم واحد بين عناصر مسماة؛ ويبدأ كل عمود من الصفر
plt.figure(figsize=(12, 4))
plt.bar(x=people, height=weight,
width=0.6, color='orange',
edgecolor='k', alpha=0.6)
plt.xticks(fontsize=14, rotation=30)
plt.show()- ▸
width=0.6: يملأ كل عمود 60% من المساحة المخصصة له - ▸
alpha=0.6: شفافية جزئية - ▸
rotation=30: تسميات مائلة

الخطوة 1 من 3
مثال محلول: فئات المدرج التكراري
plt.hist(weight, color='red', edgecolor='k', alpha=0.75, bins=5)الخطوة 2 من 3
الخطوة 2: عد القيم في كل فئة
تضم الفئة حافتها اليسرى دون اليمنى؛ والفئة الأخيرة تضم 82 أيضا
| الفئة | الأوزان داخلها | العدد |
|---|---|---|
| 18 إلى 30.8 | 18 | 1 |
| 30.8 إلى 43.6 | 35 | 1 |
| 43.6 إلى 56.4 | 55, 48 | 2 |
| 56.4 إلى 69.2 | 68, 60, 69, 65 | 4 |
| 69.2 إلى 82 | 77, 70, 72, 82 | 4 |
الخطوة 3 من 3
الخطوة 3: المقارنة مع المخطط
- ▸مجموع التكرارات
1, 1, 2, 4, 4هو 12، واحد لكل مريض - ▸يعيد
plt.histالتكرارات والحواف نفسها - ▸العمودان القصيران على اليسار هما الطفلان

الجزء 2
بيانات الاستطلاع
خط عبر الزمن، وصندوق حول التشتت
شهر من الاستطلاعات في صورة خطوط
np.random.seed(0) # added
days = np.arange(1, 31)
candidate_A = 50 + days * 0.07 \
+ 2 * np.random.randn(30)
candidate_B = 50 - days * 0.1 \
+ 3 * np.random.randn(30)
plt.style.use('fivethirtyeight')
plt.plot(days, candidate_A, 'o-', c='blue')
plt.plot(days, candidate_B, '^-', c='green')- ▸A: +0.07 يوميا، وB: -0.1 يوميا، مع تشويش (noise) عشوائي
- ▸يبقى
plt.style.useمفعلا في كل المخططات التالية

أجزاء المخطط الصندوقي
- ▸الوسيط (median): منتصف القيم المرتبة، وهو الخط داخل الصندوق
- ▸Q1 وQ3: الربيعان (quartiles)؛ ويضم الصندوق النصف الأوسط
- ▸IQR = Q3 - Q1، المدى الربيعي (interquartile range)، أي طول الصندوق
- ▸الحدان (fences) على بعد 1.5 IQR خارج الصندوق يحددان ما هو غير معتاد
- ▸الشاربان (whiskers) يصلان إلى أبعد القيم داخل الحدين؛ وتظهر القيم الشاذة (outliers) خارجهما دوائر
الخطوة 1 من 5
مثال محلول: صندوق الأطوال الـ12
رتب، ثم أوجد الوسيط
sorted: 105 135 155 158 159 160 165 168 170 171 173 175
position: 0 1 2 3 4 5 6 7 8 9 10 11الخطوة 2 من 5
الخطوة 2: الربيعان Q1 وQ3
الخطوة 3 من 5
الخطوة 3: المدى الربيعي والحدان
الخطوة 4 من 5
الخطوة 4: الشاربان والقيم الشاذة
الحدان: 137.75 و189.75
| الجزء | القيمة | السبب |
|---|---|---|
| الشارب الأدنى | 155 | أصغر طول عند 137.75 أو أعلى |
| الشارب الأعلى | 175 | أكبر طول عند 189.75 أو أدنى |
| القيم الشاذة | 105, 135 | أدنى من الحد الأدنى: P9 وP2، الطفلان |
الخطوة 5 من 5
الخطوة 5: المتوسط، ثم التحقق
plt.boxplot(x=[height], showmeans=True)
جرب بنفسك: ابن المخطط الصندوقي خطوة بخطوة
المخطط الصندوقي للاستطلاعات في الدفتر
plt.style.use('ggplot')
plt.boxplot(x=[candidate_A, candidate_B],
showmeans=True)
plt.xticks([1, 2], ['Candidate A', 'Candidate B'])| A | B | |
|---|---|---|
| الوسيط | 51.947 | 47.389 |
| Q1 إلى Q3 | 50.87 إلى 53.53 | 45.35 إلى 48.89 |
| القيمة الشاذة | 46.364 | 54.452 |
| المتوسط | 51.971 | 47.581 |

الجزء 3
pandas وSeaborn على بيانات النبيذ
سم الأعمدة، ودع المكتبة تتولى الباقي
تحميل بيانات النبيذ
df = pd.read_csv("https://raw.githubusercontent.com/tirthajyoti/"
"Stats_data_science_ValleyML/master/Notebooks/Data/wine.data.csv")
df.head()- ▸قيمة
df.shapeهي(178, 14): 178 عينة نبيذ، و14 عمودا - ▸يأخذ
Classالقيم 1 و2 و3 (59 و71 و48 عينة) - ▸13 قياسا، مثل
AlcoholوFlavanoidsوColor intensityوProline
مخططات pandas مباشرة من DataFrame
df.plot.scatter('Alcohol', 'Color intensity')
plt.show()- ▸سم الأعمدة؛ لا حاجة إلى تمرير قوائم
- ▸تستدعي pandas مكتبة Matplotlib نيابة عنك، لذا تظل
plt.xlabelوأمثالها تعمل - ▸كل نقطة عينة نبيذ واحدة

مثال محلول: 20 فئة للكحول
df['Alcohol'].plot.hist(bins=20, figsize=(5, 5),
edgecolor='k')
Seaborn: صندوق لكل صنف
import seaborn as sns
sns.boxplot(x='Class', y='Alcohol', data=df)
مخطط الكمان
sns.violinplot(x='Class', y='Alcohol', data=df)- مخطط الكمان (violin plot)
- مخطط صندوقي مضافا إليه شكل التوزيع: يدل العرض عند كل ارتفاع على عدد العينات التي لها تلك القيمة.

regplot: مخطط انتشار مع خط ملائم
sns.regplot(x='Alcohol', y='Color intensity',
data=df)- ▸الخط الذي يلائم النقاط على أفضل وجه: انحدار خطي (linear regression)، موضوع الأسبوع القادم
- ▸النطاق المظلل هو فترة الثقة (confidence interval): مقدار عدم اليقين في الخط
- ▸الخط الملائم هنا: الميل (slope) 1.560، والمقطع (intercept) -15.226

مثال محلول: قراءة الخط عند نسبة كحول 13
lmplot: خط لكل مجموعة
sns.lmplot(x='Alcohol', y='Color intensity',
hue='Class', data=df)- ▸يلون
hue='Class'النقاط حسب الصنف ويلائم خطا لكل صنف
| الصنف | الميل |
|---|---|
| 1 | 1.094 |
| 2 | 0.464 |
| 3 | 1.527 |

الجزء 4
الارتباط والخريطة الحرارية
كل زوج من الأعمدة في صورة واحدة
معامل الارتباط r
- ▸r قريب من 1: القيم المرتفعة من x تقترن بقيم مرتفعة من y
- ▸r قريب من -1: القيم المرتفعة من x تقترن بقيم منخفضة من y
- ▸r قريب من 0: لا علاقة خطية مستقيمة
الخطوة 1 من 2
مثال محلول: قيمة r لأربعة مرضى
P1 وP4 وP6 وP10: الأطوال 160 و165 و168 و171 والأوزان 55 و68 و60 و65
| المريض | الانحرافات | حاصل الضرب | المربعات |
|---|---|---|---|
| P1 | -6, -7 | 42 | 36, 49 |
| P4 | -1, 6 | -6 | 1, 36 |
| P6 | 2, -2 | -4 | 4, 4 |
| P10 | 5, 3 | 15 | 25, 9 |
| المجموع | 47 | 66, 98 |
الخطوة 2 من 2
الخطوة 2: التعويض في صيغة r
مصفوفة الارتباط وخريطتها الحرارية
corr_mat = np.corrcoef(df, rowvar=False)
corr_mat.shape # (14, 14)
corr_df = pd.DataFrame(corr_mat,
columns=df.columns, index=df.columns)
sns.heatmap(corr_df, linewidth=1,
cmap='plasma')- ▸
rowvar=False: المتغيرات هي الأعمدة - ▸14 x 14 = 196 قيمة لـr
- ▸القطر كله 1؛ والمصفوفة متماثلة
- ▸الأصفر: r قريب من 1؛ والأزرق الداكن: الأكثر سلبية

مثال محلول: قراءة الخريطة الحرارية
| السؤال | الإجابة | r |
|---|---|---|
الأكثر ارتباطا بـClass | Flavanoids | -0.847 |
| التاليان | OD280/OD315 وTotal phenols | -0.788, -0.719 |
| الزوج الأكثر ارتباطا | Total phenols وFlavanoids | 0.865 |
| الزوج الأقل ارتباطا | Ash وOD280/OD315 | 0.004 |
اختيار المخطط
| السؤال | المخطط |
|---|---|
| هل يتغير رقمان معا؟ | الانتشار، regplot |
| كيف يتغير رقم عبر الزمن؟ | الخطي |
| كيف تتقارن عناصر مسماة؟ | الأعمدة |
| السؤال | المخطط |
|---|---|
| ما شكل عمود واحد؟ | المدرج التكراري |
| كيف تختلف المجموعات في التشتت؟ | الصندوقي، الكمان |
| أي الأعمدة الكثيرة مرتبط بعضها ببعض؟ | الخريطة الحرارية |
جرب بنفسك: أداة اختيار المخطط
الأخطاء الشائعة
- ▸مخطط خطي عبر صفوف ليس لها ترتيب، مثل المرضى الـ12
- ▸الحكم على مدرج تكراري بعدد فئات واحد فقط
- ▸نسيان أن
plt.style.useيبقى مفعلا في المخططات التالية - ▸حذف القيم الشاذة في المخطط الصندوقي دون فحصها: فهي مجرد قيم تتجاوز 1.5 IQR
- ▸فهم r = 0 على أنه غياب للعلاقة: فمعامل r لا يرى إلا العلاقات الخطية المستقيمة
- ▸معاملة الارتباط على أنه سبب
مرحلة المشروع: مقترح المشروع أو الورقة البحثية
- 1اعرض الفكرة، أو الورقة البحثية التي ستعيد إنتاج نتائجها، في جملتين أو ثلاث
- 2حدد مجموعة البيانات (dataset): المصدر، والصفوف، والأعمدة، وعمود الهدف (target)
- 3ارسم مدرجا تكراريا للهدف، أو مخطط أعمدة لأصنافه
- 4ارسم مخططا صندوقيا أو مخطط انتشار للهدف مقابل العمود الذي تتوقع أنه الأهم
- 5ارسم الخريطة الحرارية للارتباط ودون أقوى العلاقات
- 6ضع المخططات في المقترح، مع جملة واحدة تحت كل منها
التمارين
التمارين: دورك
نحو 30 دقيقة
نحو 7 دقائق
التمرين 1: مدرج تكراري يدويا
| الفئة | القيم | العدد |
|---|---|---|
| 12 إلى 20 | 12, 15 | 2 |
| 20 إلى 28 | 21, 22, 26 | 3 |
| 28 إلى 36 | 30, 31, 33 | 3 |
| 36 إلى 44 | 38, 44 | 2 |
نحو 8 دقائق
التمرين 2: مخطط صندوقي يدويا
| الجزء | الموضع | القيمة |
|---|---|---|
| Q1 | 0.25 x 9 = 2.25 | 55 + 0.25 x 2 = 55.5 |
| الوسيط | 0.5 x 9 = 4.5 | 58 + 0.5 x 2 = 59 |
| Q3 | 0.75 x 9 = 6.75 | 61 + 0.75 x 2 = 62.5 |
نحو 5 دقائق
التمرين 3: قيمة r يدويا
نحو 10 دقائق
التمرين 4: في Colab، على بيانات النبيذ
- 1
sns.boxplot(x='Class', y='Flavanoids', data=df): أي صنف له أعلى وسيط؟ وأي الصناديق تظهر فيها قيم شاذة؟ - 2
df['Proline'].plot.hist(bins=10): كم عينة في أطول فئة، وبين أي حافتين؟ (يعطيnp.histogramالأرقام الدقيقة) - 3
sns.regplot(x='Total phenols', y='Flavanoids', data=df): ما إشارة الميل؟ وما قيمة r باستخدامnp.corrcoef؟ - 4الخريطة الحرارية للأعمدة
['Class', 'Alcohol', 'Flavanoids', 'Proline']فقط: أي زوج له أكبر |r|؟
التمرين 4: الإجابة
| المهمة | الإجابة |
|---|---|
| 1 | الوسيطات 2.98 و2.03 و0.685: الصنف 1. القيم الشاذة: الصنف 2 (5.08)، والصنف 3 (1.57) |
| 2 | 41 عينة بين 558.4 و698.6 |
| 3 | موجب: الميل 1.380، وr = 0.865 |
| 4 | Class وFlavanoids، r = -0.847، كما في الخريطة الحرارية الكاملة |
الخلاصة
- 1تبني Matplotlib الشكل استدعاء بعد استدعاء: البيانات، ثم العنوان والتسميات وعلامات التدريج والنص والخطوط ومفتاح الرسم
- 2يقسم المدرج التكراري المدى إلى فئات متساوية؛ وعدد الفئات يغير الصورة
- 3يعرض المخطط الصندوقي الوسيط والربيعين، والشاربين حتى 1.5 IQR، والقيم الشاذة خارجهما
- 4ترسم pandas وSeaborn أعمدة DataFrame بأسمائها؛ ويقسم
x=أوhue=البيانات حسب المجموعة - 5يقيس r العلاقة الخطية المستقيمة؛ وتعرض الخريطة الحرارية كل الأزواج دفعة واحدة
- 6اختر المخطط انطلاقا من السؤال: الزمن، أو المقارنة، أو الشكل، أو التشتت، أو العلاقة
افتح هذا الدرس
Mahmoud Abas|تصوير البيانات باستخدام Matplotlib وSeaborn