التمثيل البصري للبياناتتحليل البيانات النفسيةعلم النفس الكمي

كيفية إنشاء مخطط الكثافة في Matplotlib (مع أمثلة)

دليل شامل ومفصل لإنشاء وتخصيص مخططات تقدير كثافة النواة (KDE) في Python باستخدام مكتبتي Matplotlib وSeaborn مع أمثلة تطبيقية للمتغيرات الإحصائية والنفسية.

تاريخ النشر

يعد التمثيل البصري للبيانات أحد أهم الركائز الأساسية في مجالات الإحصاء التطبيقي، واستكشاف البيانات (Exploratory Data Analysis)، وتحليل القياسات النفسية والاجتماعية. فعند التعامل مع المتغيرات العشوائية المستمرة، لا تكفي المقاييس الإحصائية الوصفية الكلاسيكية مثل المتوسط الحسابي والانحراف المعياري لتقديم فهم شامل وكامل لطبيعة الظاهرة المدروسة؛ إذ يمكن لتوزيعات احتمالية متباينة جوهرياً أن تشترك في نفس المتوسط والتباين، بينما تخفي وراءها خصائص فريدة كالتعددية النمطية (Multimodality)، أو الالتواء الحاد (Skewness)، أو وجود فجوات وتجمعات فرعية غير ملحوظة. من هنا تبرز الأهمية البالغة لمخططات الكثافة الاحتمالية بوصفها أداة متطورة تمكن الباحث ومحلل البيانات من رؤية البنية الحقيقية المتصلة للبيانات بطريقة بصرية سلسة ودقيقة.

تستند مخططات الكثافة إلى تقنية إحصائية لا معلمية (Non-parametric) تُعرف بـ تقدير كثافة النواة (Kernel Density Estimation – KDE). وتتفوق هذه التقنية بشكل ملحوظ على المدرجات التكرارية التقليدية (Histograms) التي تعاني بطبيعتها من التشتت والتقطيع الناتج عن اختيار عدد الفئات أو عرضها ومواقع حدودها. من خلال لغة البرمجة بايثون (Python)، تبرز مكتبة Matplotlib الرائدة ومكتبة Seaborn المبنية فوقها كأقوى الأدوات البرمجية لبناء هذه المخططات وتخصيصها بأعلى معايير الجودة الجمالية والعلمية المؤهلة للنشر في المجلات الأكاديمية المحكمة.

يهدف هذا الدليل الشامل والمفصل إلى تقديم مرجع علمي وعملي متكامل لكل من الباحثين، ومحللي البيانات، وعلماء النفس، والمطورين؛ حيث يستعرض بالتفصيل المعالجات الرياضية لتقدير الكثافة، وكيفية إعداد البيئة البرمجية، وتطبيق مختلف المعاملات مثل عرض النطاق (Bandwidth)، والتظليل، والمقارنات متعددة المجموعات، والمخططات ثنائية الأبعاد، وصولاً إلى المعايير المتقدمة المتبعة في إعداد الأشكال البيانية وفق دليل جمعية علم النفس الأمريكية (APA Style). سنتناول كل جانب بشرح معمق وأمثلة واقعية مأخوذة من العلوم السلوكية والاختبارات المعرفية لضمان استيعاب المفاهيم النظرية وتطبيقها عملياً باحترافية تامة.

1. مقدمة إلى مخططات الكثافة (KDE) في تحليل البيانات الإحصائية والنفسية

1.1 ما هو مخطط تقدير كثافة النواة (Kernel Density Estimation)؟

تقدير كثافة النواة، والذي يُرمز له اختصاراً بـ KDE، هو أسلوب إحصائي لا معلمي يُستخدم لتقدير دالة الكثافة الاحتمالية (Probability Density Function – PDF) لمتغير عشوائي مستمر، دون الحاجة إلى افتراض أن البيانات تتبع توزيعاً بارامترياً محدداً سلفاً مثل التوزيع الطبيعي أو التوزيع الأسي. تكمن الفلسفة الرياضية لهذه الطريقة في وضع “دالة نواة” (Kernel Function) ناعمة ومتناظرة فوق كل نقطة بيانات مفردة مرصودة في العينة، ثم تجميع كل هذه النوى الرياضية الفردية معاً وقسمتها على حجم العينة الكلي لإنتاج منحنى متصل وناعم يعكس الشكل الكلي والتدفق الاحتمالي لتوزيع الظاهرة المدروسة عبر خط الأعداد الحقيقية.

تاريخياً ونظرياً، تحل هذه المقاربة معضلة تحويل البيانات الرقمية المنفصلة (Discrete Samples) المأخوذة من الواقع إلى تمثيل احتمالي مستمر، مما يسهل تقدير احتمالية وقوع المشاهدات المستقبلية ضمن نطاقات محددة. يتيح المنحنى الناعم الناتج للباحثين فحص الخصائص التوزيعية الجوهرية للبيانات بدقة استثنائية؛ حيث يمكن من النظرة الأولى تحديد مدى تماثل البيانات حول مركزها أو وجود التواء (Skewness) موجب (نحو اليمين) أو سالب (نحو اليسار)، بالإضافة إلى قياس درجة التفرطح (Kurtosis) التي تعبر عن ثقل الذيول وتمركز البيانات في القمم، فضلاً عن اكتشاف التعدد النمطي (Bimodal أو Multimodal) الذي يشير بوضوح إلى وجود مجتمعات فرعية متمايزة داخل نفس العينة الإحصائية.

في مجالات العلوم السلوكية والقياس النفسي (Psychometrics)، يكتسب مخطط تقدير كثافة النواة وزناً كبيراً واستخداماً متزايداً؛ إذ لا تتصرف السمات النفسية كالذكاء والانطواء ودرجات القلق والاكتئاب دائماً وفق النماذج النظرية المثالية. فعند تطبيق مقياس نفسي معين على عينة من المفحوصين، قد يُظهر مخطط الكثافة وجود قمتين منفصلتين في درجات القلق، مما يلفت انتباه الباحث السلوكي فوراً إلى أن العينة قد تحتوي على فئتين غير متجانستين (مثل فئة الطلاب المعرضين لضغوط امتحانية حادة وفئة أخرى مستقرة نفسياً)، وهو ما يستحيل استنتاجه بمجرد الاكتفاء بالمقاييس التقليدية أو الفئات الخشنة للمدرجات التكرارية البسيطة.

1.2 المقارنة التفصيلية بين المدرج التكراري (Histogram) ومخطط الكثافة

على الرغم من أن المدرج التكراري (Histogram) يمثل الأداة الكلاسيكية الأكثر شيوعاً لعرض التوزيعات الإحصائية، إلا أنه يعاني من قيود منهجية وبصرية خطيرة تؤثر على تفسير النتائج. تتلخص المشكلة البنيوية في المدرج التكراري في اعتماده الحرج على قرارات تعسفية يتخذها الباحث، أهمها: تحديد عدد الفئات، وعرض الفئة (Bin Width)، ونقطة بداية التقسيم (Bin Edges). إن تغييراً طفيفاً في نقطة انطلاق الفئات أو اتساعها قد يؤدي إلى رسم بياني مختلف كلياً لنفس مجموعة البيانات، مما قد يخفي قمم التوزيع الحقيقية أو يولد قممًا زائفة تعطي انطباعاً خادعاً عن سلوك الظاهرة المدروسة.

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

تتجلى الميزة النسبية الكبرى لمخططات الكثافة عند الرغبة في إجراء مقارنات بصرية بين عينات أو مجموعات متعددة في رسم بياني واحد. عند محاولة رسم ثلاثة أو أربعة مدرجات تكرارية متداخلة لنفس المتغير عبر مجموعات مختلفة، تتعرض الرؤية البصرية إلى فوضى وتشويش كبيرين (Visual Clutter) بسبب تصادم الأعمدة وتراكبها وحجب بعضها لبعض. أما مخططات الكثافة، بفضل خطوطها الرقيقة وإمكانية استخدام الشفافية المتدرجة تحت منحنياتها، فإنها تتيح عرض توزيعات متعددة متراكبة بوضوح تام، مما يمكن الباحث من تمييز الفروق الدقيقة في المواقع، والتشتت، والشكل العام بين الفئات التجريبية والضابطة بمنتهى السهولة والأناقة.

1.3 دور التمثيل البصري للتوزيعات في تفسير القياسات النفسية

في سياق التحليل الإحصائي للقياسات النفسية والسلوكية، يمثل التحقق البصري من التوزيعات خطوة تمهيدية حاسمة تسبق تطبيق أي اختبارات استدلالية. تعتمد معظم الاختبارات الإحصائية البارامترية الشائعة، مثل اختبارات “ت” (t-tests) وتحليل التباين (ANOVA) ونماذج الانحدار الخطي، على فرضية التوزيع الطبيعي للبيانات أو للأخطاء العشوائية. يساعد مخطط تقدير كثافة النواة الباحث في تقييم مدى مطابقة التوزيع الفعلي للعينة للمنحنى الجرسي النظري (Gaussian Bell Curve)، وتحديد الانحرافات الهيكلية التي قد تبطل صلاحية تلك الاختبارات وتقود إلى نتائج مضللة.

علاوة على ذلك، يسهل التمثيل البصري بالكثافة اكتشاف التجمعات والأنماط الكامنة (Latent Subgroups) التي تعكس تنوعاً غير مرصود داخل المقاييس السيكومترية. فعلى سبيل المثال، في دراسات المرونة النفسية أو مهارات اتخاذ القرار، قد يكشف مخطط الكثافة عن انقسام العينة إلى مجموعتين فرعيتين متباينتين في نمط الاستجابة، وهو ما يوجه الباحث نحو استخدام تقنيات النمذجة المتقدمة كنماذج الخليط النمطي (Latent Class / Mixture Models). كما يبرز دور المخطط في التحديد البصري للقيم المتطرفة (Outliers)؛ حيث تظهر هذه القيم على شكل ذيول ممتدة ذات كثافة منخفضة جداً وبعيدة عن الكتلة الأساسية للبيانات، مما يسمح بتقييم حجم تأثير هذه القيم الشاذة على التمركز العام للمتغير واتخاذ القرار المناسب بشأن معالجتها أو استبعادها.

2. إعداد بيئة العمل وتثبيت المكتبات البرمجية اللازمة

2.1 تثبيت وضبط مكتبات Matplotlib وSeaborn وSciPy

لبناء مخططات الكثافة المتقدمة وإدارتها باحترافية، تتطلب بيئة العمل في بايثون وجود ثلاث مكتبات أساسية تعمل بتناغم وتكامل، وهي: مكتبة Matplotlib التي تمثل المحرك الرسومي الأساسي والرسم منخفض المستوى، ومكتبة Seaborn التي تقدم واجهة برمجية رفيعة المستوى متخصصة في التصور الإحصائي الجذاب والمباشر، ومكتبة SciPy التي توفر الدوال الرياضية والخوارزميات الإحصائية لحساب تقدير كثافة النواة بدقة متناهية. بالإضافة إلى ذلك، لا غنى عن مكتبتي NumPy وPandas لهندسة وتنظيم المصفوفات وهياكل البيانات الجدولية.

يمكن تثبيت هذه الحزم البرمجية بسهولة في بيئة بايثون القياسية باستخدام مدير الحزم pip عبر تنفيذ الأمر التالي في سطر الأوامر:

pip install matplotlib seaborn scipy numpy pandas

أما بالنسبة للباحثين ومحللي البيانات الذين يفضلون استخدام بيئة أنظمة Anaconda لإدارة الحزم العلمية، فيمكنهم تنفيذ التثبيت عبر مدير الحزم conda من خلال قناة Forge الرسمية لضمان توافق الاعتماديات الرياضية:

conda install -c conda-forge matplotlib seaborn scipy numpy pandas

من الضروري دائماً التأكد من تحديث هذه المكتبات إلى أحدث إصداراتها المستقرة؛ حيث شهدت مكتبة Seaborn (بدءاً من الإصدار 0.11 وما بعده) تحسينات جذرية وتحديثات هامة في دوال التوزيع، وعلى رأسها دالة sns.kdeplot() ودالة sns.displot()، وتغيير بعض أسماء المعاملات البرمجية لتعزيز الأداء وتوحيد البنية العامة.

2.2 استيراد الحزم وضبط المعايير الجمالية الافتراضية

تبدأ أي جلسة تحليل بيانات واستكشاف بصري باستيراد الحزم الضرورية بالأسماء الاصطلاحية المتعارف عليها دولياً في مجتمع بايثون العلمي. يضمن هذا التوحيد سهولة قراءة الأكواد ومشاركتها بين الفرق البحثية، وتتم كتابة سطر الاستيراد بالشكل التالي:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from scipy import stats

إذا كنت تعمل داخل بيئة دفتر الملاحظات التفاعلية (Jupyter Notebook) أو Google Colab، فمن المستحسن استخدام أمر السحر %matplotlib inline لضمان عرض المخططات والرسومات مباشرة أسفل خلايا الكود، بالإضافة إلى ضبط دقة وضوح العرض النقطي للشاشات فائقة الدقة (Retina Display) عبر الأمر التالي لضمان وضوح الخطوط ودقتها:

%config InlineBackend.figure_format = 'retina'

لإعداد النمط الجمالي العام وجعله ملائماً للمنشورات العلمية والتقارير الأكاديمية الرسمية، تتيح مكتبة Seaborn ضبط السمات الافتراضية دفعة واحدة. يُفضل في الأبحاث استخدام نمط الخلفية البيضاء مع شبكة ناعمة (whitegrid) أو بدون شبكة (white)، واختيار سياق عرض يلائم حجم الورقة الأكاديمية:

sns.set_theme(style='whitegrid', context='paper', font_scale=1.2)
plt.rcParams['figure.dpi'] = 300

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

3. إنشاء مخطط الكثافة الأساسي باستخدام دالة kdeplot في Seaborn

3.1 البنية البرمجية الأساسية لدالة sns.kdeplot()

تمثل دالة sns.kdeplot() في مكتبة Seaborn الواجهة المباشرة والأكثر مرونة لإنشاء مخططات تقدير كثافة النواة لمتغير أحادي البعد أو متغيرين ثنائيي الأبعاد. تقبل الدالة مدخلات متنوعة ومرنة للغاية تشمل: القوائم البسيطة (Lists)، مصفوفات NumPy أحادية البعد، سلاسل Pandas (Series)، أو حتى أسماء الأعمدة المحددة داخل إطار بيانات Pandas (DataFrame) مع تمرير كائن الإطار لمعامل data.

في أبسط صورها البرمجية، لا يتطلب رسم توزيع كثافة لمتغير رقمي سوى سطر واحد من التعليمات البرمجية. على سبيل المثال، عند تمرير مصفوفة رقمية تمثل درجات اختبار معين، تقوم الدالة آلياً بحساب النواة وتجميعها وتقدير عرض النطاق الافتراضي، ثم تطلق عمليات الرسم المباشر على لوحة ومحاور Matplotlib الحالية:

sns.kdeplot(x=data_array)
plt.show()

تتميز دالة kdeplot() بتفاعلها التام مع واجهة Matplotlib التحتية؛ حيث تعيد الدالة كائن المحاور (matplotlib.axes.Axes)، مما يتيح للمبرمج السيطرة الكاملة على تخصيص كافة العناصر الثانوية للمخطط كالعناوين، وحدود المحاور، وخطوط الشبكة، والأسهم التوضيحية باستخدام أوامر Matplotlib القياسية مثل plt.title() وax.set_xlabel().

density plot in seaborn
density plot in seaborn

3.2 تفسير المحاور وقراءة الدلالة الإحصائية للمنحنى

يقع الكثير من المبتدئين في خطأ شائع يتعلق بتفسير المحور الرأسي لمخطط الكثافة؛ لذا يجب التأكيد على أن المحور الأفقي (X-axis) يمثل دائماً مقياس قيم المتغير العشوائي المقاس (مثل الدرجات، الزمن، أو القياسات الفسيولوجية)، بينما يمثل المحور الرأسي (Y-axis) الكثافة الاحتمالية (Probability Density) وليس التكرار المطلق أو النسبة المئوية المباشرة لحدوث القيمة.

من الناحية الرياضية، فإن المساحة الإجمالية الواقعة تحت منحنى الكثافة بأكمله من سالب مالانهاية إلى موجب مالانهاية تساوي دائماً رياضياً الواحد الصحيح (1.0)، وهو ما يجسد المبدأ الكلي لنظرية الاحتمالات بأن مجموع احتمالات فضاء العينة يساوي 100%. وبالتالي، فإن القيمة المنفردة على المحور الرأسي لا تمثل احتمال وقوع نقطة محددة بحد ذاتها (إذ أن احتمال وقوع نقطة محددة بدقة لامتناهية في متغير مستمر يساوي صفراً نظرياً)، وإنما يمثل الاحتمال رياضياً المساحة الناتجة عن تكامل المنحنى بين نقطتين على المحور الأفقي.

بصرياً، تقدم قمم وقيعان المنحنى قراءة مباشرة لمعالم التوزيع؛ فالقمة الأعلى للمنحنى تمثل المنوال (Mode) البصري، وهو النطاق الأكثر تركيزاً وازدحاماً بالبيانات في العينة. أما وسيط التوزيع (Median)، فهو النقطة على المحور الأفقي التي تقسم المساحة الكلية تحت المنحنى إلى نصفين متساويين تماماً (50% على اليمين و50% على اليسار). كما يدل اتساع قاعدة المنحنى وتمدد ذيوله على درجة تشتت البيانات وانحرافها المعياري، مما يجعل المخطط وسيلة متكاملة لاستنتاج كافة المقاييس الإحصائية دون إجراء حسابات رقمية مطولة.

3.3 مثال تطبيقي 1: بناء أول مخطط كثافة لتوزيع درجات اختبار معرفي

لتطبيق هذه المفاهيم، سنفترض دراسة نفسية معرفية تم فيها تطبيق مقياس سرعة معالجة المعلومات والتركيز على عينة مكونة من 100 مفحوص. سنقوم بتوليد بيانات رقمية واقعية تتبع توزيعاً شبه طبيعي بمتوسط 75 درجة وانحراف معياري قدره 12، ثم ننشئ مخطط الكثافة الكامل مع تخصيص المسميات التوضيحية.

تتم عملية كتابة الشيفرة البرمجية عبر الخطوات التالية:

# 1. توليد بيانات تجريبية تحاكي درجات الاختبار المعرفي
np.random.seed(42) # لضمان قابلية إعادة الإنتاج وتطابق النتائج
cognitive_scores = np.random.normal(loc=75, scale=12, size=100)

# 2. إنشاء الشكل والمحاور وتطبيق رسم الكثافة
plt.figure(figsize=(8, 5))
sns.kdeplot(x=cognitive_scores, color='#1f77b4', linewidth=2.5)

# 3. تخصيص العناوين والمحاور وفق النمط الأكاديمي
plt.title('تقدير كثافة النواة لدرجات اختبار معالجة المعلومات المعرفية (N=100)', fontsize=14, pad=15)
plt.xlabel('درجة الاختبار المعرفي', fontsize=12)
plt.ylabel('الكثافة الاحتمالية', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.6)
plt.show()

عند تحليل المخرجات البيانية الناتجة، نلاحظ أن المنحنى يبدي تموجاً انسيابياً متماثلاً تقريباً يرتفع تدريجياً ليصل إلى ذروة كثافته الاحتمالية حول النقطة 75 على المحور الأفقي، متطابقاً مع متوسط العينة المفترضة. ينحدر المنحنى بشكل سلس ومتوازن نحو طرفي التوزيع (الذيول)، ليتلاشى تدريجياً بالقرب من الدرجة 40 في الطرف الأدنى والدرجة 110 في الطرف الأعلى، مؤكداً سلامة فرضية الاعتدالية وخلو العينة من الالتواءات الحادة أو التجمعات الشاذة.

4. التحكم في درجة نعومة المنحنى عبر معامل عرض النطاق (Bandwidth Adjustment)

4.1 المفهوم الرياضي لعرض النطاق الترددي (Bandwidth) وتأثيره الإحصائي

يعد عرض النطاق الترددي (Bandwidth)، والذي يُرمز له في المعادلات الرياضية بالرمز $h$، هو المعامل البارامتري الأكثر أهمية وتأثيراً في خوارزمية تقدير كثافة النواة. يتحكم هذا المعامل في مقدار تباين أو اتساع نافذة دالة النواة الموضوعة فوق كل نقطة بيانات؛ فكلما كانت قيمة $h$ صغيرة، كانت النواة ضيقة ومدببة، بينما يؤدي كبر قيمة $h$ إلى جعل النواة عريضة ومنبسطة جداً.

تخضع مسألة اختيار عرض النطاق للمعضلة الإحصائية الشهيرة المعروفة بـ المفاضلة بين التحيز والتباين (Bias-Variance Tradeoff). إذا تم اختيار نطاق شديد الصغر، فإن المنحنى الناتج سيعاني من “نقص التنعيم” (Under-smoothing)، مما يجعله فائق الحساسية لكل تقلب عشوائي طفيف في العينة، ويظهر تموجات وتعرجات وهمية لا تعكس الحقيقة الإحصائية للمجتمع الأصلي. وعلى العكس من ذلك، إذا تم اختيار نطاق واسع ومفرط، سيعاني المنحنى من “الإفراط في التنعيم” (Over-smoothing)، مما يؤدي إلى طمس المعالم الحقيقية للتوزيع، كإخفاء القمم المزدوجة وتوسيع التباين الظاهري بشكل اصطناعي مضلل.

لتجنب الاختيار اليدوي العشوائي، تعتمد الحزم البرمجية على قواعد رياضية استدلالية متقدمة لتقدير النطاق الأمثل آلياً. من أبرز هذه القواعد قاعدة سيلفرمان الكلاسيكية (Silverman’s Rule of Thumb) وقاعدة سكوت (Scott’s Rule). تأخذ هذه الخوارزميات في الاعتبار حجم العينة $n$ والانحراف المعياري أو المدى الربيعي لحساب قيمة النطاق $h$ التي تقلل من الخطأ التربيعي المتكامل التقريبي (AMISE).

4.2 استخدام المعاملات البرمجية bw_method و bw_adjust

في مكتبة Seaborn، يتم التعامل مع عرض النطاق بمرونة بالغة عبر معاملين رئيسيين يجب التمييز الدقيق بينهما:

  • معامل bw_method: يحدد الخوارزمية الرياضية المرجعية لحساب النطاق الأساسي. القيم الافتراضية والشائعة له هي 'scott' أو 'silverman'، ويمكن أيضاً تمرير قيمة عددية ثابتة تمثل النطاق المطلق مباشرة.
  • معامل bw_adjust: هو معامل نسبي ومضاعف (Multiplier) يتم تطبيقه فوق النطاق الافتراضي المحسوب آلياً، وقيمته الافتراضية هي 1.0. يتيح هذا المعامل ضبط النعومة النسبية بسهولة وسرعة دون الحاجة لإعادة حساب المقاييس الإحصائية يدوياً.

عند تعيين bw_adjust=0.5، فإننا نقوم بخفض عرض النطاق إلى النصف مقارنة بالقيمة التلقائية، مما يمنحنا منحنى أكثر حدة وتفصيلاً يركز على الفروق الموضعية الدقيقة. بينما يؤدي تعيين bw_adjust=2.0 إلى مضاعفة عرض النطاق مرتين، مما ينتج منحنى فائق النعومة والانسيابية يركز فقط على الاتجاه العام للظاهرة ويحذف أي ضجيج عشوائي ناتج عن صغر العينة.

4.3 مثال تطبيقي 2: مقارنة بصرية لأنماط النعومة المختلفة لنفس البيانات

لفهم التأثير المباشر لمعامل النعومة، سنقوم بإنشاء مقارنة بصرية شاملة تطبق أربع قيم مختلفة لـ bw_adjust (وهي: 0.2، 0.5، 1.0، و 2.5) على نفس مجموعة البيانات المولدة لتوزيع ثنائي القمة (Bimodal Distribution) يحاكي ظاهرة سلوكية تجمع بين فئتين متباينتين.

يوضح الكود التالي كيفية إنشاء هذه المقارنة وعرضها في لوحة بيانية واحدة:

# 1. توليد بيانات ثنائية القمة (مزيج من مجموعتين)
np.random.seed(101)
group_a = np.random.normal(loc=45, scale=5, size=80)
group_b = np.random.normal(loc=70, scale=8, size=120)
combined_data = np.concatenate([group_a, group_b])

# 2. إعداد لوحة الرسم
plt.figure(figsize=(10, 6))

# 3. رسم منحنيات الكثافة بقيم نعومة متباينة
sns.kdeplot(x=combined_data, bw_adjust=0.2, label='bw_adjust = 0.2 (تنعيم ضعيف جداً)', color='#d62728', linestyle=':')
sns.kdeplot(x=combined_data, bw_adjust=0.5, label='bw_adjust = 0.5 (تفاصيل حادة)', color='#ff7f0e', linestyle='--')
sns.kdeplot(x=combined_data, bw_adjust=1.0, label='bw_adjust = 1.0 (الافتراضي المتوازن)', color='#2ca02c', linewidth=2)
sns.kdeplot(x=combined_data, bw_adjust=2.5, label='bw_adjust = 2.5 (إفراط في التنعيم)', color='#1f77b4', linewidth=2)

# 4. تنسيق الشكل النهائي
plt.title('مقارنة تأثير معامل عرض النطاق (bw_adjust) على اكتشاف البنية ثنائية القمة', fontsize=13, pad=15)
plt.xlabel('القيمة المقاسة', fontsize=11)
plt.ylabel('الكثافة الاحتمالية', fontsize=11)
plt.legend(loc='upper right', frameon=True)
plt.show()

توضح المخرجات بشكل جلي كيف أن القيمة 0.2 تخلق قيعاناً وقمماً زائفة ومفرطة التعرج بسبب النقص الشديد في التنعيم، بينما تؤدي القيمة 2.5 إلى دمج القمتين الحقيقيتين في قمة واحدة منبسطة، طامسة بذلك الطبيعة الثنائية للمجتمع. في المقابل، نجد أن القيمة 1.0 (والقيمة 0.5 بدرجة أدق) تنجح تماماً في كشف القمتين الواقعيتين بوضوح وتوازن دون تشويش إحصائي.

5. تخصيص المظهر الجمالي وتظليل المساحة تحت المنحنى

5.1 تظليل المساحة تحت المنحنى واستخدام الشفافية

يعد تظليل المساحة المحصورة تحت منحنى الكثافة أحد أكثر الأساليب البصرية فاعلية في تسهيل الإدراك الحسي لحجم التوزيع؛ إذ تدرك العين البشرية المساحات والكتل الملونة بشكل أسرع وأوضح بكثير من مجرد تتبع خط مفرد. في الإصدارات الحديثة من Seaborn، يتم تفعيل هذه الميزة ببساطة عبر تمرير المعامل المنطقي fill=True (وهو المعامل البديل للمعامل القديم shade=True).

يكتسب التحكم في درجة شفافية التظليل أهمية كبرى، ويتم إدارته عبر المعامل alpha الذي يقبل قيماً تتراوح بين 0.0 (شفاف بالكامل وغير مرئي) و 1.0 (معتم بالكامل وبلا شفافية). القيمة المثالية الشائعة في التقارير الأكاديمية تتراوح بين alpha=0.2 و alpha=0.4؛ حيث تمنح هذه الدرجة تظليلاً متزناً يبرز شكل التوزيع دون أن يطغى على خطوط الشبكة الخلفية أو يحجب البيانات والمنحنيات الأخرى المتداخلة معه في نفس الرسم.

5.2 تخصيص ألوان المنحنيات وأنماط الخطوط وسمكها

يوفر التكامل العميق بين Seaborn وMatplotlib حرية مطلقة في تخصيص أدق التفاصيل الشكلية لمنحنى الكثافة. يمكن تحديد لون المنحنى والتظليل باستخدام أسماء الألوان القياسية (مثل 'navy', 'darkred', 'forestgreen') أو عبر استخدام الأكواد اللونية السداسية الدقيقة (Hex Codes مثل '#2E4053')، مما يتيح التوافق مع الهويات البصرية المؤسسية أو معايير الطباعة في المجلات.

بالإضافة إلى الألوان، يمكن ضبط سمك الخط الخارجي عبر المعامل linewidth (أو اختصاراً lw)، وتغيير نمط الخط عبر linestyle (مثل الخط المتصل '-'، المتقطع '--'، المنقط ':'، أو المتقطع-المنقط '-.'). يعتبر تنويع أنماط الخطوط ممارسة بحثية راقية وضرورية؛ لأنها تضمن بقاء الرسم قابلاً للقراءة والفهم بوضوح حتى عند طباعته بالأبيض والأسود، أو بالنسبة للأشخاص الذين يعانون من مشاكل في تمييز الألوان (Color Vision Deficiency).

5.3 تطبيق لوحات الألوان (Palettes) وخلفيات Matplotlib

عند بناء تصورات بيانية متعددة المنحنيات، تبرز قوة لوحات الألوان المنسقة علمياً (Color Palettes). تقدم مكتبة Seaborn مجموعة متميزة من اللوحات المتدرجة والمتباينة الصديقة للعين والمصممة لتكون متساوية الإدراك البصري (Perceptually Uniform)، ومن أشهرها: 'viridis'، 'mako'، 'rocket'، ولوحة 'coolwarm' للمتغيرات ذات القطبين.

لتعديل النمط الخلفي، يمكن استخدام دالة sns.set_style() واختيار أحد الأنماط القياسية الخمسة:

  • 'whitegrid': خلفية بيضاء مع شبكة رمادية ناعمة، وهي الأنسب للمقارنات الدقيقة للأرقام.
  • 'darkgrid': النمط الافتراضي الكلاسيكي لخلفية رمادية بخطوط بيضاء.
  • 'white': خلفية بيضاء صافية بدون شبكة، وهي النمط المفضل في نشر المجلات الأكاديمية الصارمة.
  • 'ticks': خلفية بيضاء مع إظهار علامات التجزئة الصغيرة على المحاور.

لإضفاء مظهر احترافي فائق، يُنصح دائماً باستخدام الدالة sns.despine() بعد استدعاء الرسم؛ حيث تعمل هذه الدالة آلياً على إزالة الحواف العلوية واليمنى غير الضرورية من الإطار المحيط (Top and Right Spines)، مما يقلل من الحبر غير المفيد ويركز انتباه القارئ مباشرة على البيانات المعروضة.

6. إنشاء مخططات الكثافة لعدة مجموعات وتوزيعات مقارنة

6.1 مقارنة المجموعات باستخدام وسيط التجميع (hue)

في معظم الأبحاث السلوكية والطبية، نادراً ما يتم تحليل متغير رقمي بمعزل عن التصنيفات الفئوية للمفحوصين (مثل: الفروق بين الجنسين، المقارنة بين المجموعة الضابطة والمجموعة التجريبية، أو التباين عبر المراحل العمرية). تتيح مكتبة Seaborn تنفيذ هذه المقارنات متعددة الفئات بمنتهى القوة عبر وسيط التجميع hue.

عند تمرير إطار بيانات Pandas يحتوي على عمود مستمر وعمود تصنيفي، وتمرير اسم العمود التصنيفي إلى المعامل hue، تقوم الدالة آلياً بما يلي:

  1. فرز البيانات وتوليد تقدير كثافة نواة مستقل لكل مجموعة فرعية على حدة.
  2. تطبيق ألوان متباينة تلقائياً لكل فئة بناءً على لوحة الألوان المحددة.
  3. بناء وسيلة إيضاحية (Legend) تلقائية وأنيقة على جانب المخطط توضح دلالة كل لون دون تدخل يدوي معقد.

يتيح هذا التجميع المقارن الكشف الفوري عن إزاحة التوزيع (Shift in Central Tendency) بين المجموعات، أو تباين مدى انتشار وتشتت السمات السلوكية بين العينات المختلفة بوضوح لا يمكن تحقيقه عبر الجداول الرقمية الجامدة.

6.2 أنماط التكديس والتطبيع للمجموعات المتعددة

عند رسم مجموعات متعددة متداخلة، يوفر المعامل multiple في دالة kdeplot() خيارات متقدمة لإدارة كيفية تمثيل هذه التوزيعات فوق بعضها البعض:

  • multiple='layer' (الوضع الافتراضي): يرسم كل توزيع كطبقة مستقلة تطفو فوق الأخرى. يُنصح هنا دائماً بتفعيل الشفافية (مثل alpha=0.3) لضمان عدم حجب الطبقات العلوية للطبقات السفلية.
  • multiple='stack': يقوم بتكديس منحنيات الكثافة رأسياً فوق بعضها البعض. هذا الوضع مفيد جداً إذا كان الهدف هو إظهار التوزيع الإجمالي التراكمي للمجتمع الكلي مع توضيح مساهمة كل فئة فرعية في هذا الإجمالي.
  • multiple='fill': يقوم بتطبيع الكثافات رأسياً لتملأ المساحة بنسبة 100% عند كل نقطة على المحور الأفقي، مما يعرض النسبة المئوية الشرطية لتوزيع الفئات عبر نطاق المتغير المستمر.

بالإضافة إلى ذلك، يلعب المعامل المنطقي common_norm دوراً حاسماً؛ فعند ضبطه على common_norm=True (الافتراضي)، يتم تطبيع الكثافة بحيث تساوي المساحة الكلية لجميع المجموعات معاً 1.0 (مع مراعاة الحجم النسبي لكل عينة). أما عند ضبطه على common_norm=False، يتم تطبيع كل مجموعة بشكل مستقل تماماً لتكون مساحة منحنى كل فئة تساوي 1.0 بمفردها، وهو الخيار الأفضل عند الرغبة في مقارنة الأشكال التوزيعية لمجموعات متباينة بشدة في أحجام العينات (Unbalanced Sample Sizes).

6.3 مثال تطبيقي 3: مقارنة درجات الرضا الوظيفي عبر مستويات وظيفية متباينة

سنطبق هذه القدرات في دراسة تنظيمية تبحث في تباين درجات “الرضا الوظيفي والضغوط المهنية” بين ثلاث فئات إدارية داخل مؤسسة كبرى: الموظفون التنفيذيون (Entry-level)، الإدارة الوسطى (Mid-level)، والإدارة العليا (Executives).

يوضح الكود التالي إعداد البيانات وهيكلتها داخل Pandas DataFrame، ثم رسم التوزيعات المقارنة باحترافية:

# 1. إعداد بيانات الرضا الوظيفي لثلاث مجموعات
np.random.seed(33)
n_samples = 150

scores_entry = np.random.normal(loc=60, scale=10, size=n_samples)
scores_mid = np.random.normal(loc=72, scale=8, size=n_samples)
scores_exec = np.random.normal(loc=85, scale=6, size=n_samples)

df_satisfaction = pd.DataFrame({
'الرضا_الوظيفي': np.concatenate([scores_entry, scores_mid, scores_exec]),
'المستوى_الوظيفي': ['تنفيذي'] * n_samples + ['إدارة وسطى'] * n_samples + ['إدارة عليا'] * n_samples
})

# 2. بناء مخطط الكثافة متعدد المجموعات
plt.figure(figsize=(9, 5.5))
sns.kdeplot(
data=df_satisfaction,
x='الرضا_الوظيفي',
hue='المستوى_الوظيفي',
palette='tab10',
fill=True,
alpha=0.35,
linewidth=2,
common_norm=False
)

# 3. الضبط الجمالي والحواشي
plt.title('مقارنة توزيع درجات الرضا الوظيفي عبر المستويات الإدارية المختلفة', fontsize=13, pad=15)
plt.xlabel('درجة مقياس الرضا الوظيفي (0 - 100)', fontsize=11)
plt.ylabel('الكثافة الاحتمالية المقدرة', fontsize=11)
sns.despine(top=True, right=True)
plt.tight_layout()
plt.show()

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

7. مخططات الكثافة ثنائية الأبعاد (2D Bivariate Density Plots)

7.1 المفهوم الرياضي لتقدير الكثافة المشتركة ثنائية المتغيرات

عند دراسة العلاقة بين متغيرين كميين مستمرين (مثل العلاقة بين مستوى القلق والتحصيل الأكاديمي، أو بين ساعات النوم وجودة التركيز)، يتجاوز التحليل الإحصائي التوزيعات الأحادية نحو تقدير دالة الكثافة الاحتمالية المشتركة (Joint Probability Density Function). يُعرف هذا الإجراء بتقدير كثافة النواة ثنائي المتغيرات (2D Bivariate KDE).

رياضياً، يتم وضع دالة نواة ثنائية الأبعاد (مثل النواة الغاوسية ثنائية المتغيرات) فوق كل زوج من المشاهدات $(x_i, y_i)$ في الفضاء الإحداثي الديكارتي. تعتمد هذه النواة على مصفوفة التغاير المشترك (Covariance Matrix) لتحديد مدى واتجاه انتشار الكثافة. يتم دمج هذه النوى السطحية معاً لتكوين سطح احتمالي ثلاثي الأبعاد يعبر عن “تضاريس” البيانات؛ حيث تمثل المرتفعات والقمم المناطق التي تتزامن فيها قيم المتغيرين معاً بأعلى وتيرة احتمالية، بينما تمثل المنخفضات المناطق نادرة الحدوث.

تعتبر هذه المخططات بديلاً متطوراً لمخططات الانتشار التقليدية (Scatter Plots)؛ وخاصة عند التعامل مع مجموعات بيانات ضخمة (Big Data) تعاني من ظاهرة الإفراط في التراكب النقطي (Overplotting) التي تجعل من الصعب تحديد المركز الحقيقي لكثافة النقاط المتراكمة فوق بعضها.

7.2 بناء الخطوط الكنتورية ومخططات الكثافة المعبأة ثنائية الأبعاد

توفر دالة sns.kdeplot() القدرة على إنشاء مخططات الكثافة ثنائية الأبعاد ببساطة من خلال تمرير كلا المتغيرين لوسيطي x و y. يتم تمثيل السطح الاحتمالي ثلاثي الأبعاد على لوحة ثنائية الأبعاد باستخدام الخطوط الكنتورية (Contour Lines)، وهي خطوط تربط بين النقاط المتساوية في الكثافة الاحتمالية المشتركة تماماً كخطوط الارتفاعات في الخرائط الجغرافية.

يمكن تخصيص هذا التمثيل عبر معاملات متقدمة:

  • معامل levels: يحدد عدد الخطوط الكنتورية أو الفواصل الطبقية؛ فزيادة عدد المستويات (مثل levels=15) يعطي تفصيلاً متدرجاً ودقيقاً لطبقات الكثافة.
  • معامل fill=True: يقوم بتعبئة الفراغات بين الخطوط الكنتورية بتدرجات لونية مصمتة، محولاً الرسم إلى خريطة حرارية كنتورية ناعمة.
  • معامل cmap: يسمح باختيار خريطة التدرج اللوني المرغوبة (مثل 'Blues', 'crest', 'magma').

7.3 ضبط عتبة الكثافة واستبعاد الخلفيات المشتتة

أحد أهم المعاملات الدقيقة في المخططات ثنائية الأبعاد هو معامل العتبة thresh. يحدد هذا المعامل النسبة المئوية لأدنى مستوى كثافة يجب استبعاده وعدم تلوينه في خلفية الرسم. القيمة الافتراضية هي thresh=0.05، وهي تضمن بقاء مساحات الفضاء الخالية من البيانات بيضاء ونظيفة.

إذا تم ضبط thresh=0، فسيتم تلوين اللوحة بالكامل وصولاً إلى أدنى كثافة احتمالية ممكنة رياضياً عند الأطراف، مما قد يشوه جمالية الرسم ويجعل الخلفية ملونة بشكل غير مريح. كما يتيح دمج مخطط الانتشار النقطي الخفيف كطبقة فوق المنحنى الكنتوري (Scatter Overlay) رؤية النقاط الأصلية المتناثرة مع خريطة الكثافة المجتمعة في آن واحد.

يوضح المثال التالي دراسة الكثافة المشتركة بين “ساعات النوم” و”مستوى القلق”:

# 1. توليد بيانات مترابطة ثنائية الأبعاد
np.random.seed(55)
sleep_hours = np.random.normal(7, 1.2, 250)
# علاقة عكسية: نقص النوم يزيد من القلق مع وجود تشتت عشوائي
anxiety_levels = 80 - (sleep_hours * 6.5) + np.random.normal(0, 5, 250)

# 2. بناء مخطط الكثافة الكنتوري ثنائي الأبعاد
plt.figure(figsize=(8, 6))
sns.kdeplot(
x=sleep_hours,
y=anxiety_levels,
cmap='mako',
fill=True,
levels=12,
thresh=0.02,
alpha=0.85
)

# 3. تراكب نقاط البيانات الأصلية للتوضيح
sns.scatterplot(x=sleep_hours, y=anxiety_levels, color='black', s=15, alpha=0.3)

# 4. التسميات والتنسيق الأكاديمي
plt.title('تقدير الكثافة المشتركة بين ساعات النوم ومستوى القلق النفسي', fontsize=13, pad=15)
plt.xlabel('ساعات النوم اليومية (ساعة)', fontsize=11)
plt.ylabel('مستوى القلق المقاس (درجة)', fontsize=11)
plt.show()

تكشف النتيجة عن “عين إعصار” بيضاوية مائلة تمثل المركز المشترك الأثقل؛ حيث يتركز معظم الطلاب حول 7 ساعات نوم ومستوى قلق يتراوح بين 30 إلى 35 درجة، مع ملاحظة تمدد الذيول الكنتورية نحو الزاوية العلوية اليسرى المعبرة عن فئة “قليلي النوم – مرتفعي القلق”.

8. إنشاء مخطط الكثافة باستخدام Matplotlib الخالص ومكتبة SciPy

8.1 استخدام دالة scipy.stats.gaussian_kde لحساب الكثافة يدوياً

في حين تقدم مكتبة Seaborn حلولاً سريعة وجاهزة، يحتاج الباحث ومطور النظم الإحصائية أحياناً إلى السيطرة البرمجية والرياضية الكاملة على خوارزمية التقدير. توفر وحدة scipy.stats كائناً برمجياً قوياً يُدعى gaussian_kde يتيح حساب التقدير الرياضي بدقة واستخراج القيم المحسوبة لاستخدامها في نماذج رياضية أخرى قبل الرسم.

تتم العملية الرياضية والبرمجية عبر ثلاث خطوات رئيسية:

  1. تمرير البيانات الخام إلى دالة التقدير: kde_estimator = stats.gaussian_kde(dataset).
  2. توليد متسلسلة خطية من النقاط المنتظمة عبر النطاق المطلوب باستخدام دالة np.linspace(): x_eval = np.linspace(min_val, max_val, 500).
  3. تقييم كائن النواة عند كل نقطة من هذه النقاط للحصول على مصفوفة الكثافة المقابلة: density_values = kde_estimator.evaluate(x_eval).

تمنح هذه المعالجة اليدوية الباحث استقلالاً كاملاً عن القوالب الجاهزة، وتمكنه من معالجة البيانات المعقدة أو تطبيق خوارزميات ترجيح مخصصة.

8.2 الرسم اليدوي والتخصيص المباشر عبر واجهة Matplotlib

بمجرد الحصول على إحداثيات النقاط المحسوبة $(x_eval, density_values)$، يمكن استخدام أدوات الرسم القياسية في Matplotlib لبناء المخطط بدقة متناهية. يتم استخدام دالة plt.plot() لرسم الخط الخارجي المنحني، بينما تُستخدم الدالة الفائقة plt.fill_between() لتظليل المساحات تحت المنحنى بشكل كامل أو تظليل مقاطع مكانية محددة بدقة هندسية مطلقة.

يتيح الرسم المباشر عبر Matplotlib الخالص كفاءة أعلى وسرعة معالجة أكبر في التطبيقات الرسومية الكبيرة، بالإضافة إلى تجنب الاعتماد على حزم إضافية عند كتابة شيفرات إنتاجية تعتمد على أقل عدد ممكن من التبعيات الخارجية.

8.3 مثال تطبيقي 4: حساب وعرض المناطق الحرجة وفترات الثقة يدوياً

في اختبار الفرضيات الإحصائية، يحتاج الباحث لتحديد “مناطق الرفض الحرجة” (Critical Rejection Regions) على التوزيع الاحتمالي؛ مثل تظليل مساحة الـ 5% العليا أو الطرفين الحرجين ($\alpha = 0.05$).

يوضح الكود التالي كيفية حساب النواة يدوياً باستخدام SciPy، وتظليل منطقة الرفض في الطرف الأيمن (أعلى 5%) باستخدام plt.fill_between في Matplotlib:

# 1. توليد بيانات عينة عشوائية
np.random.seed(77)
sample_data = np.random.normal(loc=100, scale=15, size=300)

# 2. تقدير كثافة النواة يدوياً عبر SciPy
kde = stats.gaussian_kde(sample_data)
x_range = np.linspace(50, 150, 1000)
density = kde(x_range)

# 3. حساب النقطة الحرجة للنسبة المئوية 95%
crit_val = np.percentile(sample_data, 95)

# 4. الرسم المخصص عبر Matplotlib
fig, ax = plt.subplots(figsize=(9, 5))
ax.plot(x_range, density, color='#1b4f72', lw=2.5, label='منحنى الكثافة المقدر')

# تظليل المساحة الكلية بلون خفيف
ax.fill_between(x_range, density, color='#85c1e9', alpha=0.3)

# تظليل المنطقة الحرجة (أعلى 5%) بلون مميز
critical_mask = x_range >= crit_val
ax.fill_between(x_range[critical_mask], density[critical_mask], color='#e74c3c', alpha=0.7, label='منطقة الرفض الحرجة (α = 0.05)')

# إضافة خط عمودي وعلامة إرشادية
ax.axvline(crit_val, color='#c0392b', linestyle='--', lw=1.5)
ax.annotate(f'القيمة الحرجة: {crit_val:.2f}', xy=(crit_val, kde(crit_val)[0]), xytext=(crit_val + 5, kde(crit_val)[0] + 0.005),
arrowprops=dict(facecolor='black', arrowstyle='->', lw=1.2), fontsize=10)

ax.set_title('تحديد مناطق الرفض الإحصائي على منحنى الكثافة المقدر يدوياً', fontsize=13, pad=15)
ax.set_xlabel('درجة القياس', fontsize=11)
ax.set_ylabel('الكثافة الاحتمالية', fontsize=11)
ax.legend(loc='upper left')
plt.show()

يقدم هذا التطبيق تمثيلاً بيانياً إحصائياً دقيقاً ومقنعاً للغاية؛ حيث يتم فصل المساحات وتلوينها بدقة رياضية متناهية بناءً على مصفوفات الشروط المنطقية (Boolean Masks).

9. دمج مخطط الكثافة مع المدرجات التكرارية ومخططات السجادة (Rug Plots)

9.1 الجمع بين المدرج التكراري ومنحنى الكثافة باستخدام sns.histplot

على الرغم من عيوب المدرج التكراري المنفصل، إلا أن دمجه مع منحنى الكثافة في إطار بصري واحد يقدم تكاملاً مثالياً يجمع بين دقة عرض التكرارات العينية المرصودة وتجريد المنحنى الاحتمالي الناعم. في الإصدارات الحديثة لمكتبة Seaborn، يمكن تحقيق هذا الاندماج الفائق مباشرة من خلال دالة sns.histplot() عبر تفعيل المعامل المنطقي kde=True.

عند تفعيل هذا الخيار، تتولى الخوارزمية آلياً مواءمة مقاييس المحور الرأسي؛ حيث يتم تطبيع أعمدة المدرج التكراري لتصبح بمقياس الكثافة (Density Metric) بدلاً من العد المطلق (Count)، مما يجعل ارتفاع الأعمدة ومساحاتها متطابقة رياضياً مع المساحة الكلية لمنحنى الكثافة المتراكب فوقها. ولتحقيق مظهر احترافي متناسق، يُفضل تنسيق ألوان حواف الأعمدة لتكون متباينة قليلاً مع تلوين المنحنى الخارجي بلون داكن وواضح يبرز فوق الكتل المستطيلة.

9.2 إضافة مخطط السجادة (Rug Plot) لتمثيل المشاهدات الفردية

مخطط السجادة (Rug Plot) هو تقنية بصرية مكملة بالغة الأهمية تُستخدم لعرض مواقع جميع نقاط البيانات الفردية على شكل خطوط عمودية دقيقة وصغيرة تصطف بمحاذاة المحور الأفقي في قاع الرسم البياني، تماماً مثل خيوط وشراشيب السجادة التقليدية. يتم استدعاء هذا المخطط عبر الدالة sns.rugplot().

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

9.3 بناء الرسوم البيانية المشتركة (JointGrid و JointPlot)

عند الرغبة في تقديم تقرير إحصائي استكشافي شامل لعلاقة ثنائية المتغيرات، توفر دالة sns.jointplot() الحل الأمثل عبر دمج ثلاثة رسوم بيانية في لوحة واحدة متناسقة:

  1. مخطط ثنائي الأبعاد في المركز يمثل العلاقة المشتركة (سواء كان مخطط انتشار أو مخطط كثافة كنتوري ثنائي الأبعاد).
  2. مخطط كثافة أحادي البعد على الهامش العلوي يمثل التوزيع المستقل للمتغير الأفقي $X$.
  3. مخطط كثافة أحادي البعد على الهامش الأيمن يمثل التوزيع المستقل للمتغير الرأسي $Y$.

يوضح السطر البرمجي التالي كيفية بناء مخطط مشترك متكامل:

g = sns.jointplot(x='ساعات_المذاكرة', y='التحصيل', data=df_study, kind='kde', fill=True, cmap='viridis')

يمنح هذا التكوين البصري المتكامل للقارئ فهماً فورياً للتوزيعات الأحادية والهامشية دون الحاجة للتنقل بين عدة صفحات أو أشكال بيانية منفصلة.

10. تخصيص المحاور، العناوين، وإعداد المخطط وفق معايير النشر الأكاديمي (APA)

10.1 إضافة وتنسيق العناوين والمحاور والخطوط المرجعية

تشترط المعايير الأكاديمية الصارمة، مثل دليل جمعية علم النفس الأمريكية (APA Style Guide)، وضوحاً مطلقاً في صياغة العناوين وتسمية المحاور وتحديد وحدات القياس بدقة. يجب أن تتضمن تسمية المحور الأفقي اسم المتغير بوضوح متبوعاً بوحدة القياس بين قوسين (مثل: زمن الرجع (بالثانية))، بينما يجب أن يحمل المحور الرأسي بوضوح مسمى الكثافة الاحتمالية المقدرة.

لتعزيز القيمة التفسيرية للمخطط، يُنصح دائماً بإضافة خطوط مرجعية عمودية (Reference Lines) باستخدام دالة plt.axvline() لتمثيل المقاييس الإحصائية المركزية كالمتوسط الحسابي ($\bar{X}$) أو الوسيط ($Mdn$). يساعد هذا الإجراء البصري في إبراز درجة الالتواء فوراً؛ فإذا وقع خط المتوسط على يمين خط الوسيط دل ذلك بصرياً على التواء موجب، والعكس صحيح.

10.2 إدارة وضبط وسيلة الإيضاح (Legend) والتعليقات التوضيحية (Annotations)

عند بناء مخططات متعددة المجموعات، تلعب وسيلة الإيضاح دوراً حاسماً في إزالة أي غموض. يتيح كائن plt.legend() في Matplotlib التحكم الكامل في موقع الصندوق التوضيحي باستخدام وسيط loc (مثل 'upper right' أو 'upper left')، وضبط شفافية خلفية الصندوق عبر framealpha، وتعديل حجم خط العناوين الفرعية.

علاوة على ذلك، تمثل التعليقات التوضيحية المدعمة بأسهم إرشادية (Annotations) وسيلة ممتازة لتوجيه انتباه القارئ للقمم الفرعية الهامة أو النقاط الانتقالية الاستثنائية. يتم تنفيذ ذلك عبر دالة plt.annotate() مع تمرير نص التفسير، وإحداثيات النقطة المستهدفة xy، وإحداثيات موقع النص xytext، بالإضافة إلى خصائص السهم مثل arrowprops=dict(facecolor='black', shrink=0.05).

10.3 بناء شبكات الرسوم المتعددة (Subplots) لمقارنة المتغيرات

عند الرغبة في مقارنة عدة متغيرات سلوكية أو تكرار التحليل عبر تجارب متعددة، يفضل بناء شبكة من اللوحات البيانية المتجاورة (Subplots) باستخدام plt.subplots(nrows, ncols) بدلاً من تكديس المنحنيات في رسم واحد مزدحم.

الميزة الحاسمة هنا هي تفعيل خاصية مشاركة مقاييس المحاور المشتركة عبر تمرير sharex=True و sharey=True. يضمن هذا التوحيد للمقاييس أن تكون مقارنة اتساع المنحنيات وارتفاعات الكثافة بين اللوحات الفرعية مقارنة عادلة وصحيحة بصرياً؛ إذ أن اختلاف مقاييس المحاور بين الرسومات المتجاورة يعد أحد أبرز مصادر التضليل البصري في الأوراق البحثية.

11. التعامل مع التحديات الإحصائية المتقدمة في مخططات الكثافة

11.1 معالجة تأثير الحدود المقيدة (Boundary Bias)

أحد القيود الرياضية الجوهرية لخوارزمية تقدير كثافة النواة القياسية هو ما يُعرف إحصائياً بـ تحيز الحدود (Boundary Bias) أو تسرب الكثافة (Spillover). تنشأ هذه المشكلة عندما يكون المتغير المدروس مقيداً بحدود طبيعية أو منطقية صارمة؛ مثل المتغيرات التي لا يمكن أن تقبل قيماً سالبة كالأزمنة، أو المقاييس المقيدة بمدى محدد (مثل درجات ليكرت من 1 إلى 5، أو نسب مئوية من 0 إلى 100%).

نظراً لأن النواة الغاوسية بطبيعتها متناظرة وتمتد إلى مالانهاية في كلا الاتجاهين، فإن وضع نوى غاوسية فوق النقاط القريبة جداً من الصفر سيؤدي حتماً إلى تسرب جزء من المنحنى إلى النطاق السالب، مما يعطي انطباعاً خاطئاً بأن هناك احتمالية لوجود قيم سالبة غير موجودة واقعياً في الظاهرة المدروسة.

لمعالجة هذه المشكلة البرمجية والإحصائية، تتيح دالة sns.kdeplot() استخدام المعامل clip لتحديد الحدود الصارمة للتقدير، مثل:

sns.kdeplot(x=reaction_times, clip=(0, None)) # قطع الكثافة ومنع تسربها تحت الصفر

أما من الناحية الرياضية المتقدمة، فيُنصح بإجراء تحويل لوغاريتمي (Log Transformation) للبيانات المقيدة من أسفل قبل تقدير الكثافة، ثم إعادة تحويل النتائج إلى المقياس الأصلي، أو استخدام نوى مخصصة غير متناظرة مثل نوى غاما (Gamma Kernels).

11.2 التعامل مع العينات المرجحة والتوزيعات شديدة التشتت

في المسوح الإحصائية والدراسات الديموغرافية المعتمدة على العينات الطبقية (Stratified Sampling)، لا تمتلك جميع المشاهدات نفس الوزن الاحتمالي لتمثيل المجتمع. تتيح دالة kdeplot() و دالة gaussian_kde تمرير متجه الأوزان الاحتمالية عبر معامل weights، مما يضمن أن تساهم كل نقطة في بناء منحنى الكثافة بما يتناسب مع وزنها التمثيلي الحقيقي في المجتمع.

وفي حالات التوزيعات شديدة التشتت التي تحتوي على ذيول ثقيلة جداً وقيم متطرفة بعيدة (Heavy-tailed Distributions)، قد يؤدي تقدير النطاق الموحد إلى تنعيم مفرط في منطقة المركز الكثيفة من أجل استيعاب الذيول الطويلة. في مثل هذه السيناريوهات المتقدمة، يُلجأ إلى تقنيات “تقدير النواة التكيفي” (Adaptive Kernel Density Estimation)، حيث يتغير عرض النطاق $h$ ديناميكياً ليكون ضيقاً جداً في المناطق عالية الازدحام ليلتقط التفاصيل، ويتسع تدريجياً في الذيول المتناثرة لتقليل التشتت.

12. تصدير المخططات بجودة عالية وأفضل الممارسات البرمجية

12.1 حفظ وتصدير الأشكال البيانية للنشر العلمي بدقة عالية

لضمان ظهور المخططات البيانية بأعلى جودة ممكنة في الأوراق البحثية والمجلات العلمية والتقارير المطبوعة، يجب تصديرها باستخدام دالة plt.savefig() مع مراعاة المعايير التقنية الدقيقة التالية:

  • معامل الكثافة النقطية dpi: يجب ألا تقل الدقة عن dpi=300 للطباعة القياسية، ويفضل dpi=600 للأشكال الدقيقة لضمان عدم حدوث أي تشويش عند تكبير الشكل.
  • معامل احتواء الحواف bbox_inches='tight': يمثل هذا المعامل أمراً بالغ الأهمية؛ حيث يمنع قص العناوين الطويلة أو تسميات المحاور الخارجية وهوامش وسيلة الإيضاح عند الحفظ.
  • اختيار صيغة الملف المناسبة: يُفضل استخدام الصيغ المتجهية (Vector Formats) مثل .pdf أو .svg للأبحاث؛ لأنها تحتفظ بنعومة الخطوط ودقتها عند أي تكبير، بينما تُستخدم الصيغ النقطية مثل .png للعروض التقديمية وتطبيقات الويب و .tiff للمجلات الطبية والمخبرية.

يتم تنفيذ التصدير القياسي بالشكل التالي:

plt.savefig('density_plot_final.pdf', dpi=300, bbox_inches='tight', transparent=False)

12.2 أبرز الأخطاء الشائعة عند رسم وتفسير مخططات الكثافة وكيفية تجنبها

لضمان النزاهة العلمية والدقة التحليلية، يجب على الباحث ومحلل البيانات الحذر من مجموعة من الأخطاء المتكررة:

  1. الخلط بين الكثافة والاحتمال المباشر: تذكر دائماً أن قيمة $Y$ على المنحنى ليست احتمالية النقطة المفردة، وإنما تعبر عن الكثافة؛ وبالتالي يمكن أن تتجاوز قيمة $Y$ الرقم 1.0 إذا كان مدى المتغير صغيراً جداً ومركّزاً (حيث تظل المساحة الكلية دائماً مساوية لـ 1.0).
  2. الوقوع في فخ الإفراط في التنعيم: لا تعتمد دائماً على الإعداد التلقائي لعرض النطاق؛ بل قم بفحص قيم مختلفة لـ bw_adjust للتأكد من عدم طمس أي تعددية نمطية حقيقية في البيانات.
  3. تجاهل حدود الظاهرة الطبيعية: احرص دائماً على تطبيق clip للمتغيرات ذات الحدود الصارمة لتفادي إظهار احتمالات لقيم مستحيلة في الواقع.
  4. غياب الوثوقية وقابلية إعادة الإنتاج (Reproducibility): احرص دائماً على تثبيت البذور العشوائية (np.random.seed) وتوثيق أرقام إصدارات الحزم لضمان تطابق الأشكال البيانية عند إعادة تشغيل الأكواد من قبل باحثين آخرين.

خاتمة

يمثل مخطط تقدير كثافة النواة (KDE) قفزة نوعية في منهجيات استكشاف البيانات والتحليل البصري المتقدم، متجاوزاً القيود الهيكلية للمدرجات التكرارية البسيطة ليوفر تقديراً احتماليا ناعماً وغير متحيز. من خلال الجمع بين القوة الهندسية لمكتبة Matplotlib والواجهة الإحصائية الأنيقة لمكتبة Seaborn، يمتلك الباحثون والمحللون أداة برمجية لا مثيل لها تتيح تحويل الأرقام الخام المعقدة إلى لوحات بيانية غنية بالدلالات الإحصائية والنفسية والسلوكية.

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

References

اقتباس هذا المقال

looti, M. (2026, أغسطس 29). كيفية إنشاء مخطط الكثافة في Matplotlib (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-create-density-plot-matplotlib-examples/
looti, Mohammed. “كيفية إنشاء مخطط الكثافة في Matplotlib (مع أمثلة).” عرب سايكلوجي, 29 أغسطس 2026, https://arabpsychology.com/statistics/how-to-create-density-plot-matplotlib-examples/.
looti, Mohammed. “كيفية إنشاء مخطط الكثافة في Matplotlib (مع أمثلة).” عرب سايكلوجي. أغسطس 29, 2026. https://arabpsychology.com/statistics/how-to-create-density-plot-matplotlib-examples/.