في فضاء علم البيانات والتحليل الإحصائي الحديث، تُمثّل مرحلة استكشاف البيانات (Exploratory Data Analysis – EDA) حجر الزاوية الذي يُبنى عليه نجاح أي مشروع برمجي أو بحثي. ومن بين الأدوات البرمجية المتعددة المتاحة في لغة بايثون، تبرز مكتبة Pandas كمنصة معيارية لا غنى عنها لإدارة البيانات وتطويعها. داخل هذا الإطار البرمجي الغني، تُعدّ الدالة value_counts() إحدى أكثر الدوال المحورية والأوسع استخداماً؛ إذ توفر وسيلة سريعة وفعالة لحساب التوزيعات التكرارية للبيانات المنفصلة والمستمرة، كاشفةً عن الأنماط الدفينة، وتوزع الفئات، والتشوهات المحتملة في المدخلات الخام.
إن الفهم الدقيق لآلية عمل دالة value_counts() يتجاوز مجرد معرفة استدعائها الافتراضي؛ فهو يتطلب دراسة معمقة لمعاملاتها المتعددة، وكيفية إدارتها للذاكرة الحاسوبية عبر خوارزميات التجزئة (Hashing)، وطرق تعاملها مع القيم المفقودة (Missing Values)، فضلاً عن قدرتها على تقطيع البيانات العددية إلى فترات إحصائية (Binning) وتحليل التكرارات المشتركة عبر أطر البيانات متعددة الأبعاد. يُسهم التمكن من هذه الدالة في تحويل السلاسل المعقدة من البيانات غير المهيكلة إلى جداول توزيع احتمالي ومؤشرات إحصائية تدعم اتخاذ القرارات القائمة على الأدلة في سياقات بحثية وتطبيقية متنوعة.
يهدف هذا المقال الأكاديمي الشامل إلى تقديم تفكيك نظري وتطبيقي شامل لدالة value_counts() في مكتبة Pandas. سنستعرض بنيتها النحوية، وسلوكياتها البرمجية تحت مختلف أنواع البيانات، والتفاعل المعقد لمعاملاتها المتقدمة، مع تقديم تطبيقات عملية تغطي مجالات الإحصاء الوصفي، وتصميم الميزات (Feature Engineering)، وتصوير البيانات، وتحسين الأداء الحسابي للتعامل مع البيانات الضخمة (Big Data).
- 1. مقدمة شاملة لدالة value_counts() في مكتبة Pandas وأهميتها في تحليل البيانات
- 2. البنية النحوية الأساسية (Syntax) والمعاملات التفصيلية للدالة
- 3. حساب التكرارات للقيم الفريدة في سلاسل البيانات (Pandas Series) مع أمثلة عملية
- 4. التعامل مع القيم المفقودة (Missing Values) باستخدام المعامل dropna
- 5. حساب النسب المئوية والتكرار النسبي باستخدام المعامل normalize
- 6. تقسيم البيانات المستمرة إلى فئات رقمية (Binning) باستخدام المعامل bins
- 7. التحكم في فرز وترتيب المخرجات باستخدام المعاملين ascending و sort
- 8. تطبيق دالة value_counts() على أطر البيانات (DataFrames) متعددة الأعمدة
- 9. تقنيات التجميع المتقدمة ودمج value_counts() مع groupby()
- 10. تمثيل نتائج value_counts() بيانياً باستخدام مكتبات التصور في بايثون
- 11. تحسين الأداء الحسابي وإدارة الذاكرة مع مجموعات البيانات الضخمة
- 12. أفضل الممارسات الأكاديمية والأخطاء الشائعة والبدائل البرمجية
- خاتمة
- References
1. مقدمة شاملة لدالة value_counts() في مكتبة Pandas وأهميتها في تحليل البيانات
1.1 مفهوم الدالة ودورها في الإحصاء الوصفي الاستكشافي
تُعرّف دالة value_counts() برمجياً ورياضياً بأنها عملية إسقاط أحادية أو متعددة الأبعاد تقوم بحساب دالة الكتلة التكرارية (Frequency Mass Function) للمتغيرات داخل مجموعة بيانات معينة. من الناحية الرياضية، إذا كانت لدينا مجموعة مشاهدات $X = {x_1, x_2, …, x_n}$، فإن الدالة تعمل على تقسيم $X$ إلى مجموعات متمايزة من القيم الفريدة $U = {u_1, u_2, …, u_k}$ حيث $k le n$، ثم حساب عدد مرات تكرار كل عنصر فريد $u_j$ عبر المعادلة:
$$f(u_j) = \sum_{i=1}^{n} \mathbb{I}(x_i = u_j)$$
حيث تُمثل $\mathbb{I}$ دالة المؤشر (Indicator Function) التي تأخذ القيمة 1 عندما يتحقق التساوي، والقيمة 0 في غير ذلك. يتيح هذا التحويل الإحصائي للباحثين ومحللي البيانات فحص البنية التوزيعية للمتغيرات، وتحديد النزعة المركزية للفئات المنفصلة (المنوال)، ورصد حالات عدم الاتزان في العينات التصنيفية (Class Imbalance) التي تُعد بالغة الأهمية في بناء نماذج تعلم الآلة الخاضعة للإشراف.
عند مقارنة دالة value_counts() بنظيراتها في بيئات الحوسبة الإحصائية الأخرى، نجد تماثلاً وظيفياً مع دالة table() في لغة R، وعبارة SELECT column, COUNT(*) FROM table GROUP BY column في لغة SQL، ودالة countmap() في لغة Julia. غير أن ما يميز value_counts() في Pandas هو تكاملها العضوي مع كائنات السلاسل (Series) وأطر البيانات (DataFrames)، مما يُرجع مخرجات ذات فهرس تلقائي يُسهل ربطها بالعمليات الحسابية التالية والتصوير البياني الفوري.
تلعب الدالة دوراً محورياً في المراحل الأولية لتنظيف البيانات؛ إذ تمكّن المحلل من اكتشاف التناقضات الإملائية، والرموز المخفية، والقيم الشاذة (Outliers) التي قد تندس داخل المتغيرات الفئوية. على سبيل المثال، قد تكشف الدالة عن وجود فئات متطابقة دلالياً ولكنها متباينة برمجياً مثل (“Male” و “male” و “Male “)، مما يُتيح تصحيحها قبل المضي قدماً في التحليلات الإحصائية المتقدمة.
1.2 أنواع هياكل البيانات المتوافقة مع الدالة داخل Pandas
صُممت دالة value_counts() في الأصل كأحد التوابع الملحقة بكائنات السلاسل أحادية البعد (Pandas Series). وفي هذا السياق، تقوم الدالة بالمرور على عناصر السلسلة وحساب تكرار كل عنصر، منتجةً سلسلة جديدة يكون فهرسها (Index) مؤلفاً من القيم الفريدة المدخلة، وقيمها عبارة عن التكرارات الصحيحة المقابلة. يُعد هذا الهيكل أحادي البعد النموذج القياسي والأساس لمعظم العمليات الإحصائية البسيطة في بيئة بايثون.
مع تطور إصدارات مكتبة Pandas، وتحديداً بدءاً من الإصدار 1.1.0، تم توسيع نطاق الدالة لتشمل كائنات أطر البيانات ثنائية الأبعاد (Pandas DataFrames). يتيح هذا التطبيق الحديث تمرير عدة أعمدة دفعة واحدة لحساب التكرار المشترك (Joint Frequency) لتوليفات القيم الفريدة عبر الأعمدة المحددة، مما يُلغي الحاجة السابقة لاستخدام تجميعات معقدة مثل groupby().size() في العديد من حالات الاستخدام الروتينية.
تتفاعل الدالة بكفاءة مع طيف واسع من أنواع البيانات، بما في ذلك الأنواع النصية (Strings/Objects)، والمتغيرات الفئوية (Categoricals)، والأرقام الصحيحة (Integers)، والأرقام العشرية (Floats)، والمتغيرات المنطقية (Booleans)، بالإضافة إلى الطوابع الزمنية (Timestamps) والفترات الزمنية (Timedeltas). ومع ذلك، تخضع الدالة لقيود برمجية صارمة فيما يخص أنواع البيانات غير القابلة للتجزئة (Unhashable Types)؛ حيث تفشل الدالة وتُطلق استثناءً من نوع TypeError عند محاولة تطبيقها على أعمدة تحتوي على كائنات مركبة قابلة للتعديل مثل القوائم (Lists) أو القواميس (Dictionaries)، ما لم تُحوّل تلك الكائنات إلى أشكال ثابتة غير قابلة للتغيير كالمجموعات الثابتة (Tuples).
2. البنية النحوية الأساسية (Syntax) والمعاملات التفصيلية للدالة
2.1 الصيغة البرمجية العامة للدالة وتفكيك وسائطها
تأتي دالة value_counts() في مكتبة Pandas بتوقيع برمجي مرن وشامل يُتيح للمستخدم ضبط السلوك الحسابي والترتيبي بدقة متناهية. الصيغة العامة للدالة على مستوى كائنات Series هي كالتالي:
Series.value_counts(normalize=False, sort=True, ascending=False, bins=None, dropna=True)
وعلى مستوى كائنات DataFrames، تأتي الصيغة متضمنة وسيطاً لتحديد الأعمدة الفرعية المستهدفة:
DataFrame.value_counts(subset=None, normalize=False, sort=True, ascending=False, dropna=True)
يوضح الجدول التالي تفكيكاً دقيقاً لجميع المعاملات والوسائط وسلوكها الافتراضي والأنواع البيانية التي تقبلها:
- normalize (قيمة منطقية، الافتراضي False): عند ضبطه على
True، تقوم الدالة بقسمة جميع التكرارات المطلقة على إجمالي عدد المشاهدات، مما ينتج عنه توزيع تكراري نسبي (Relative Frequencies) أو احتمالي تتراوح قيمه بين 0 و 1. - sort (قيمة منطقية، الافتراضي True): يُحدد ما إذا كان يجب فرز الناتج الإجمالي بناءً على قيم التكرارات الناتجة. عند تعطيله (
False)، قد تظهر المخرجات بترتيب الظهور الأصلي للقيم الفريدة أو بترتيب التجزئة الداخلي. - ascending (قيمة منطقية، الافتراضي False): يتحكم في اتجاه الفرز؛ فالقيمة الافتراضية
Falseتُفرز النتائج تنازلياً (من الأكثر تكراراً إلى الأقل)، بينما يؤدي ضبطه علىTrueإلى الترتيب التصاعدي. - bins (عدد صحيح أو تسلسل فترات، الافتراضي None): ينطبق حصرياً على البيانات الرقمية؛ حيث يعمل على تحويل المتغير الرقمي المستمر إلى فئات منفصلة متساوية الحجم عبر تقطيع المجال الرياضي إلى فترات نصف مفتوحة ونصف مغلقة مستندة إلى خوارزمية
pandas.cut. - dropna (قيمة منطقية، الافتراضي True): يتحكم في تضمين أو استبعاد القيم المفقودة (مثل
np.nanأوNone). في حالته الافتراضية، يتم تجاهل المفقودات كلياً من الإحصاء، بينما يُجبر ضبطه علىFalseالدالة على إدراج تكرار القيم الفارغة كعنصر مستقل في الفهرس.
يتميز الناتج البرمجي للدالة بكونه كائن Series دائماً، حيث يشغل الفهرس (Index) القيم الفريدة للمتغير الأصلي، بينما تمثل قيم السلسلة التكرارات المقابلة بنوع بياني int64 (في حالة التكرار المطلق) أو float64 (في حالة استخدام normalize=True).
2.2 التفاعل الرياضي للمعاملات داخل بيئة التنفيذ
تعتمد آلية عمل value_counts() في كواليس مكتبة Pandas على تنفيذ منخفض المستوى مكتوب بلغة Cython و C، مستنداً إلى هياكل جداول التجزئة السريعة (Hash Tables) مثل khash. عند استدعاء الدالة على سلسلة بيانات، يتم تمرير مؤشرات الذاكرة إلى خوارزمية التجزئة التي تقوم بحساب قيمة التجزئة (Hash Value) لكل عنصر في السلسلة، وإدراجه في جدول التجزئة المناسب مع زيادة عداد التكرار الخاص بتلك القيمة بمقدار 1.
تتم هذه العملية بتعقيد زمني وسطي قدره $O(N)$ حيث $N$ يمثل إجمالي عدد العناصر في السلسلة. بعد الانتهاء من التجميع التكراري وتكوين مصفوفة القيم الفريدة، تتدخل خوارزميات الفرز؛ فإذا كان المعامل sort=True، يتم تطبيق خوارزمية فرز سريعة مثل QuickSort أو Timsort بتعقيد زمني قدره $O(K log K)$، حيث $K$ هو عدد القيم الفريدة ($K le N$).
تختلف إدارة الذاكرة وتخصيص الموارد بحسب طبيعة نوع البيانات (dtype)؛ فالأعمدة ذات النوع الفئوي (Categorical) تستفيد من تمثيل داخلي يعتمد على الأرقام الصحيحة المشفرة (Integer Codes)، مما يجعل استدعاء value_counts() فائق السرعة وأقل استهلاكاً للذاكرة مقارنة بالأعمدة النصية التي تتطلب حساب التجزئة للسلاسل المحرفية الطويلة.
3. حساب التكرارات للقيم الفريدة في سلاسل البيانات (Pandas Series) مع أمثلة عملية
3.1 التطبيق الأساسي لحساب تكرارات القيم الرقمية
يُعد حساب تكرارات الأرقام الصحيحة النموذج الأبسط والأكثر شيوعاً عند التعامل مع المتغيرات المنفصلة (Discrete Variables) مثل عدد أفراد الأسرة، أو عدد الزيارات، أو رموز الفئات المشفرة رقمياً. يوضح المثال التالي آلية إنشاء سلسلة أرقام صحيحة وحساب التوزيع التكراري لها:
import pandas as pd
import numpy as np
# إنشاء سلسلة بيانات رقمية تمثل تقييمات العملاء (من 1 إلى 5)
ratings = pd.Series([5, 4, 3, 5, 2, 4, 5, 1, 4, 5, 3, 2, 5, 4, 5])
# حساب التكرارات
ratings_count = ratings.value_counts()
print(ratings_count)
يُنتج الكود السابق المخرجات الإحصائية التالية:
5 6
4 4
3 2
2 2
1 1
dtype: int64
عند فحص هذه المخرجات، نلاحظ أن العمود الأيسر يُمثل فهرس السلسلة الناتجة (Index)، وهو يحتوي على درجات التقييم الفريدة مرتبة تنازلياً حسب درجة تكرارها، بينما يُمثل العمود الأيمن عدد المشاهدات المرصودة لكل تقييم. تُظهر النتائج بوضوح أن التقييم (5) هو المنوال الإحصائي بستة تكرارات.
أما عند التعامل مع الأرقام العشرية ذات الفاصلة العائمة (Floating-Point Numbers)، فيجب توخي الحذر الشديد بسبب قضايا الدقة الحسابية الثنائية (IEEE 754 Floating Point Representation). قد تؤدي الفروق الدقيقة في المراتب العشرية المتأخرة إلى اعتبار قيمتين متطابقتين رياضياً كقيمتين فريدتين برمجياً، مثل 0.1 + 0.2 و 0.3. لحل هذه المعضلة، يُنصح دائماً بتقريب الأرقام العشرية باستخدام دالة round() قبل تمريرها إلى value_counts() لضمان دمج القيم المتكافئة واقعياً.
3.2 تحليل التكرارات للبيانات النصية والفئوية
تحتوي مجموعات البيانات الواقعية، لا سيما في مجالات العلوم الاجتماعية، واستطلاعات الرأي، والبحوث النفسية، على متغيرات نصية اسمية وترتيبية. تتميز دالة value_counts() بحساسيتها لحالة الأحرف (Case Sensitivity) في اللغات التي تدعم ذلك كالإنجليزية، كما تتأثر بالفروق الإملائية الدقيقة في اللغة العربية كالهمزات والمسافات الخفية.
# بيانات استبيان تقيس الحالة النفسية الذاتية
responses = pd.Series(['قلق', 'مستقر', 'مكتئب', 'مستقر', 'قلق', 'مستقر', 'قلق '])
# تطبيق مباشر يوضح مشكلة المسافات البيضاء
print(responses.value_counts())
في الكود أعلاه، سيتم التعامل مع ‘قلق ‘ (مع مسافة لاحقة) كفئة مستقلة تماماً عن ‘قلق’. لتجنب هذا التشتت التكراري، يتعين تنظيف النصوص مسبقاً عبر توحيد الأحرف وإزالة الفراغات الزائدة باستخدام توابع السلاسل النصية المدمجة في Pandas:
cleaned_responses = responses.str.strip()
print(cleaned_responses.value_counts())
يُسفر التنظيف عن دمج التكرارات بشكل صحيح ليصبح التوزيع النهائي: ‘مستقر’ (3 تكرارات)، ‘قلق’ (3 تكرارات)، ‘مكتئب’ (تكرار واحد). يُعد هذا الإجراء خطوة حيوية لضمان سلامة الاستدلال الإحصائي في الأبحاث الاستبيانية والتصنيف السلوكي للأفراد.
3.3 تحليل البيانات المنطقية والزمنية
يُعد تطبيق دالة value_counts() على السلاسل المنطقية (Boolean Series: True / False) أداة سريعة لحساب معدلات النجاح، والاستجابة، والتوافق الإجرائي. تُرجع الدالة عدد الحالات الإيجابية والسلبية مباشرة، مما يُمكّن الباحث من حساب معدلات القبول أو رفض الفرضيات الفوري.
# سلسلة تمثل اجتياز اختبار معياري
passed_exam = pd.Series([True, False, True, True, False, True, True])
print(passed_exam.value_counts())
أما في سياق السلاسل الزمنية (Datetime Series)، فإن تطبيق الدالة على الطوابع الزمنية الكاملة (التي تحوي السنة، الشهر، اليوم، الساعة، والدقيقة) نادراً ما يكون مفيداً بسبب تشتت القيم الفريدة وتدني التكرارات. تبرز القوة التحليلية هنا عند استخراج أجزاء التاريخ الزمنية أولاً عبر الموجه .dt ثم حساب التكرارات لرصد فترات الذروة الإحصائية:
dates = pd.to_datetime(['2023-10-01 08:30', '2023-10-01 09:15', '2023-10-02 08:45', '2023-10-03 08:10'])
# استخراج أسماء الأيام وتحديد الأيام الأكثر نشاطاً
days_count = dates.dt.day_name().value_counts()
print(days_count)
يُمكّن هذا النهج المحلل من تحديد الأنماط الدورية في السلاسل الزمنية غير المنتظمة، وتتبع تواتر الأحداث السلوكية أو المعاملات المالية عبر فترات زمنية متجانسة.
4. التعامل مع القيم المفقودة (Missing Values) باستخدام المعامل dropna
4.1 سلوك الدالة الافتراضي تجاه القيم الفارغة (NaN)
في التحليل الإحصائي، يُمثل التعامل مع البيانات الناقصة تحدياً منهجياً بالغ الحساسية؛ حيث يمكن أن يؤدي سوء إدارة القيم المفقودة إلى تحيز منهجي (Systematic Bias) يُفسد الاستنتاجات العلمية. تأتي دالة value_counts() افتراضياً مضبوطة على المعامل dropna=True. يرجع السبب وراء هذا الخيار التصميمي إلى الرغبة في التركيز على التوزيع الفعلي للبيانات المرصودة وتفادي تضخيم الفهرس بقيم غير قابلة للمقارنة المباشرة.
ومع ذلك، فإن هذا السلوك الافتراضي يخفي حقيقة إحصائية قد تكون جوهرية؛ فإذا كانت نسبة البيانات المفقودة تبلغ 40% من العينة الإجمالية، فإن استدعاء الدالة بشكلها المجرد سيُعطي توزيعاً تكرارياً يعكس الـ 60% المتبقية فقط، دون تنبيه المحلل إلى أن غالبية العينة تفتقر إلى القياس، وهو ما قد يؤدي إلى اتخاذ قرارات خاطئة بناءً على عينة غير مكتملة.
يجب التمييز برمجياً بين كائنات القيم المفقودة؛ إذ تتعامل مكتبة Pandas مع np.nan و pd.NA و None كقيم مفقودة موحدة تخضع لمعامل dropna. غير أن النصوص الفارغة، مثل السلاسل ذات الطول الصفر "" أو السلاسل التي تحوي مسافات فقط " "، تُعامل كبيانات نصية حقيقية وليست مفقودات نظامية، مما يتطلب تحويلها صراحة إلى np.nan قبل استدعاء الدالة إذا كان الهدف استبعادها أو إدراجها ضمن إحصاء المفقودات.
4.2 تضمين القيم المفقودة في التوزيع التكراري عبر dropna=False
لضمان الشفافية الإحصائية وتحديد نسبة الاكتمال في العينات البحثية، يُنصح بشدة بتفعيل الخيار dropna=False أثناء مراحل الفحص الأولي للبيانات. يُجبر هذا الوسيط الدالة على تخصيص سطر مستقل في جدول المخرجات لرصد العدد الإجمالي للقيم الفارغة.
# سلسلة تحتوي على قيم متكررة وقيم مفقودة
clinical_data = pd.Series(['علاج أ', 'علاج ب', np.nan, 'علاج أ', np.nan, 'علاج ج', 'علاج أ'])
# حساب التكرارات مع تضمين القيم المفقودة
full_distribution = clinical_data.value_counts(dropna=False)
print(full_distribution)
تكون مخرجات هذا الكود واضحة ودقيقة منهجياً:
علاج أ 3
NaN 2
علاج ب 1
علاج ج 1
dtype: int64
يُعد هذا الأسلوب أداة تقييم رئيسية لقياس موثوقية الاستبيانات؛ حيث إن تراكم القيم المفقودة في متغير معين (مثل أسئلة الدخل الشهري أو السلوكيات الحساسة) يُشير إلى امتناع المبحوثين عن الإجابة، مما يوجه الباحث لتطبيق تقنيات التعويض الإحصائي (Imputation Techniques) المناسبة بدلاً من تجاهل تلك البيانات وتشويه النتائج.
5. حساب النسب المئوية والتكرار النسبي باستخدام المعامل normalize
5.1 تحويل التكرارات المطلقة إلى احتمالات وتوزيعات نسبية
في العديد من الدراسات الإحصائية والمقارنات بين العينات غير المتساوية في الحجم، يفقد التكرار المطلق (Absolute Frequency) دلالته المباشرة، ويصبح التكرار النسبي (Relative Frequency) هو المعيار الأساسي للتحليل. يتيح المعامل normalize=True تحويل التكرارات مباشرة إلى نسب احتمالية عبر قسمة تكرار كل فئة على المجموع الإجمالي لكافة المشاهدات:
$$p(u_j) = \frac{f(u_j)}{\sum_{i=1}^{k} f(u_i)}$$
حيث $\sum_{j=1}^{k} p(u_j) = 1.0$. يتوافق هذا الناتج تماماً مع مفهوم دالة الكثافة الاحتمالية للمتغيرات العشوائية المنفصلة (Probability Mass Function).
# سلسلة تمثل التخصصات الأكاديمية لمجموعة طلاب
majors = pd.Series(['علوم حاسب', 'هندسة', 'علوم حاسب', 'طب', 'علوم حاسب', 'هندسة'])
# حساب التكرار النسبي
relative_freq = majors.value_counts(normalize=True)
print(relative_freq)
يُعطي هذا الاستدعاء الناتج الإحصائي التالي:
علوم حاسب 0.500000
هندسة 0.333333
طب 0.166667
dtype: float64
ولأغراض النشر العلمي وإعداد التقارير الإدارية، يمكن تنسيق هذه القيم النسبية كنسب مئوية مقروءة بدقة محددة باستخدام توابع التنسيق النصي في بايثون:
percentage_freq = majors.value_counts(normalize=True).mul(100).round(2).astype(str) + '%'
print(percentage_freq)
5.2 التطبيقات الإحصائية للتكرار النسبي في الأبحاث والتحليل المقارن
تتجلى الأهمية المنهجية للتكرار النسبي عند الرغبة في مقارنة عينتين مختلفتين في الحجم؛ فعلى سبيل المثال، لا يمكن مقارنة تكرار مرض معين بين مدينة يبلغ سكانها مليون نسمة وأخرى يبلغ سكانها عشرة آلاف نسمة بالاعتماد على الأرقام المطلقة. يوفر التوزيع النسبي مقياساً معيارياً موحداً يُلغي تأثير حجم العينة.
علاوة على ذلك، يُمكن دمج التكرار المطلق والتكرار النسبي داخل إطار بيانات موحد لتقديم تقرير وصفي شامل بأسلوب أكاديمي محكم:
# بناء جدول تكراري مركب يجمع التكرار المطلق والنسبي
abs_counts = majors.value_counts()
rel_counts = majors.value_counts(normalize=True).mul(100).round(2)
freq_table = pd.DataFrame({'التكرار المطلق': abs_counts, 'النسبة المئوية (%)': rel_counts})
print(freq_table)
يُسهل هذا الجدول التحليلي قراءة البنية التوزيعية للمتغيرات، مما يُمكّن الباحث من تحديد الفئات المهيمنة والفئات النادرة بدقة وموثوقية عالية تدعم التحليلات الاستدلالية اللاحقة.
6. تقسيم البيانات المستمرة إلى فئات رقمية (Binning) باستخدام المعامل bins
6.1 تحويل المتغيرات الرقمية المستمرة إلى متغيرات فئوية منفصلة
تمثل المتغيرات الرقمية المستمرة (مثل الدخل، والأعمار، ودرجات الاختبارات، والمؤشرات الحيوية) تحدياً لدوال التكرار التقليدية؛ نظراً لأن كل قيمة تقريباً قد تظهر مرة واحدة فقط، مما يجعل التوزيع التكراري الافتراضي غير مفيد. لحل هذه المشكلة، توفر دالة value_counts() المعامل bins الذي يقوم تلقائياً بتقطيع المجال الرقمي المستمر إلى فترات منفصلة وحساب تكرار كل فترة.
# درجات 10 طلاب في اختبار مقياسه من 0 إلى 100
exam_scores = pd.Series([55, 62, 78, 85, 90, 92, 73, 68, 88, 95])
# تقسيم الدرجات إلى 4 فئات متساوية العرض
binned_scores = exam_scores.value_counts(bins=4)
print(binned_scores)
يُنتج هذا الكود فهما إحصائياً دقيقاً لتوزع الدرجات عبر الفترات:
(85.0, 95.0] 4
(75.0, 85.0] 2
(65.0, 75.0] 2
(54.959, 65.0] 2
dtype: int64
يُلاحظ أن الفهرس الناتج هو كائن من نوع IntervalIndex، حيث تُعبر الأقواس الدائرية ( عن حدود مفتوحة (غير متضمنة)، بينما تُعبر الأقواس المربعة ] عن حدود مغلقة (متضمنة). تُقسّم الدالة المجال بين أصغر قيمة وأكبر قيمة إلى فترات متساوية العرض بناءً على خوارزمية pd.cut()، مع تعديل طفيف على الحد الأدنى لضمان شمول أصغر قيمة في العينة.
تختلف هذه الطريقة التلقائية عن دالة pd.qcut() التي تُقسّم البيانات بناءً على الرتب المئوية المتساوية التكرار (Quantiles)، مما يجعل معامل bins في value_counts() مخصصاً للتقطيع متساوي الفترات الحسابية.
6.2 تطبيقات متقدمة لتخصيص الفترات الإحصائية وتحليلها
يمكن للمحلل تمرير قائمة محددة من الأرقام إلى المعامل bins بدلاً من الاكتفاء بعدد صحيح، مما يمنحه السيطرة الكاملة على حدود الفترات بما يتوافق مع المعايير العلمية أو المهنية للمجال المدروس (مثل تصنيفات منظمة الصحة العالمية لكتلة الجسم أو الشرائح الضريبية):
# تقسيم الأعمار وفق فئات عمرية محددة مسبقاً
ages = pd.Series([12, 17, 22, 25, 30, 45, 62, 70, 85])
custom_bins = [0, 18, 35, 60, 100]
# التقطيع المخصص وحساب التكرار
age_groups = ages.value_counts(bins=custom_bins, sort=False)
print(age_groups)
يساعد تعطيل الفرز (sort=False) هنا على الحفاظ على الترتيب التصاعدي الطبيعي للفترات العمرية من الأصغر إلى الأكبر:
(-0.001, 18.0] 2
(18.0, 35.0] 3
(35.0, 60.0] 1
(60.0, 100.0] 3
dtype: int64
في حال كانت هناك فترات لا تحتوي على أي مشاهدات، ستُسجل الدالة تلك الفترات بتكرار صفري إذا تم تطبيق التحويل الفئوي الصريح، مما يمنع فقدان الفئات الفارغة ويُعطي تمثيلاً دقيقاً للمدرج التكراري (Histogram) الخاص بالظاهرة المدروسة.
7. التحكم في فرز وترتيب المخرجات باستخدام المعاملين ascending و sort
7.1 إدارة ترتيب التكرارات تصاعدياً وتنازلياً عبر ascending
يتحكم المعامل ascending في الاتجاه الرياضي لفرز التكرارات. في السيناريو الافتراضي (ascending=False)، تُعرض الفئة الأكثر تكراراً في القمة، وهو ما يلبي متطلبات التحليل لمعرفة الأنماط الغالبة. غير أن عكس هذا الترتيب بضبط ascending=True يكتسب أهمية تحليلية خاصة عند البحث عن الحالات الشاذة، أو الفئات النادرة، أو الأخطاء الإدخالية غير الشائعة.
# سلسلة تمثل المعاملات البنكية وحالات الاحتيال المشبوهة
transactions = pd.Series(['طبيعية', 'طبيعية', 'طبيعية', 'طبيعية', 'مشبوهة', 'احتيال مؤكد'])
# الفرز التصاعدي لتسليط الضوء على الحالات النادرة
rare_cases = transactions.value_counts(ascending=True)
print(rare_cases)
يُسفر هذا الإجراء عن وضع ‘احتيال مؤكد’ و ‘مشبوهة’ في أعلى القائمة بتكرار واحد لكل منهما، مما يتيح لفرق المراقبة والتحقق الأمني التركيز الفوري على الأنماط الطرفية (Tail Events) التي تتطلب تدخلاً نوعياً.
7.2 تعطيل الفرز التلقائي والحفاظ على ترتيب الفهرس عبر sort
يقوم المعامل sort=True تلقائياً بفرز المخرجات وفق قيم التكرارات. ومع ذلك، هناك سيناريوهان رئيسيان يتطلبان تعطيل هذا الفرز عبر ضبط sort=False:
- الكفاءة الحسابية: عند معالجة سلاسل عملاقة تحتوي على عشرات الملايين من السجلات والعديد من القيم الفريدة، فإن مرحلة فرز النتائج تستهلك زمناً حسابياً إضافياً ($O(K log K)$). يؤدي تعطيل الفرز إلى تقليل زمن المعالجة والتركيز فقط على تعبئة جدول التجزئة.
- الترتيب حسب الفهرس الطبيعي: في كثير من الأحيان، يرغب المحلل في عرض النتائج مرتبة وفق قيم المتغير نفسه (مثل الشهور: يناير، فبراير، مارس؛ أو الدرجات: 1، 2، 3، 4، 5) وليس وفق تكراراتها. يُمكن تحقيق ذلك بدمج الدالة مع
sort_index():
# تقييمات مرتبة حسب قيمة الدرجة نفسها
ratings_ordered = ratings.value_counts().sort_index()
print(ratings_ordered)
يضمن هذا الدمج البرمجي قراءة التدفق التكراري تصاعدياً من التقييم 1 إلى 5، مما يسهل رصد التوزيعات الإحصائية كالتوزيع الطبيعي أو الالتواء (Skewness) بصرياً مباشرة من المخرجات النصية.
8. تطبيق دالة value_counts() على أطر البيانات (DataFrames) متعددة الأعمدة
8.1 حساب التكرارات المشتركة لعدة أعمدة (Joint Frequencies)
يُعد تطبيق value_counts() على كائنات DataFrame ثنائية الأبعاد من أقوى الميزات التي تم إضافتها إلى مكتبة Pandas. تتيح هذه الوظيفة حساب التوزيع التكراري المشترك لتوليفات متعددة من المتغيرات دون الحاجة إلى دمج الأعمدة يدوياً أو كتابة استعلامات معقدة.
# إنشاء إطار بيانات ديموغرافي
df = pd.DataFrame({
'الجنس': ['ذكر', 'أنثى', 'أنثى', 'ذكر', 'أنثى', 'ذكر', 'أنثى'],
'المدينة': ['الرياض', 'جدة', 'الرياض', 'الدمام', 'الرياض', 'جدة', 'الرياض'],
'الحالة': ['نشط', 'نشط', 'غير نشط', 'نشط', 'نشط', 'نشط', 'نشط']
})
# حساب التكرار المشترك لمتغيري الجنس والمدينة
joint_counts = df[['الجنس', 'المدينة']].value_counts()
print(joint_counts)
تنتج عن هذه العملية سلسلة ذات فهرس متعدد المستويات (MultiIndex)، حيث يُمثل كل مستوى أحد الأعمدة المختارة:
الجنس المدينة
أنثى الرياض 3
ذكر الرياض 1
جدة 1
الدمام 1
أنثى جدة 1
dtype: int64
يُكشف هذا الناتج بوضوح عن التركيبة الديموغرافية المشتركة؛ حيث تبرز فئة (أنثى، الرياض) كأعلى توليفة تكرارية بثلاث مشاهدات. تُعد هذه الطريقة أداة استكشافية سريعة لتحليل التفاعلات غير الخطية بين المتغيرات الاسمية في الدراسات الميدانية.
8.2 تحويل نتائج DataFrame.value_counts() إلى جداول محورية مهيكلة
على الرغم من قوة الفهرس متعدد المستويات، إلا أن إعادة هيكلة الناتج إلى إطار بيانات تقليدي أو جدول توافق متقاطع (Cross-tabulation) يجعله أكثر قابلية للدمج في خطوط معالجة البيانات ولوحات التحكم. يمكن استخدام التابع reset_index() لتحويل النتيجة إلى DataFrame معياري يحتوي على عمود صريح للعدد (Count):
# تحويل السلسلة متعددة المستويات إلى DataFrame مهيكل
df_counts = df[['الجنس', 'المدينة']].value_counts().reset_index(name='التكرار')
print(df_counts)
ولتحويل التوزيع المشترك إلى جدول تقاطع ثنائي الأبعاد (Contingency Table) يُماثل مخرجات pd.crosstab()، يمكن فك تكديس الفهرس باستخدام التابع unstack():
# تحويل MultiIndex إلى جدول متقاطع محوري
contingency_table = df[['الجنس', 'المدينة']].value_counts().unstack(fill_value=0)
print(contingency_table)
يُعطي هذا التحويل شكلاً مصفوفياً واضحاً يوزع المدن على الأعمدة والجنس على الصفوف، مع استبدال القيم غير الموجودة بالرقم 0 بفضل المعامل fill_value=0. يتميز استخدام value_counts().unstack() بكفاءة أدائية فائقة تضاهي بل وتتفوق أحياناً على دالة pd.crosstab() التقليدية في أطر البيانات الكبيرة.
9. تقنيات التجميع المتقدمة ودمج value_counts() مع groupby()
9.1 حساب التكرارات داخل المجموعات الفرعية المحددة
عند الحاجة إلى استكشاف كيفية توزيع متغير مستهدف داخل طبقات أو مجموعات فرعية يحددها متغير تصنيفي آخر، يصبح دمج groupby() مع value_counts() المنهجية المعيارية الأكثر كفاءة في بايثون. يتيح هذا الدمج حساب التكرارات المشروطة (Conditional Frequencies) لكل فئة على حدة.
# بيانات تشخيص نفسي مصنفة حسب الفئات العمرية
clinical_df = pd.DataFrame({
'الفئة_العمرية': ['بالغ', 'بالغ', 'مراهق', 'بالغ', 'مراهق', 'مراهق', 'بالغ'],
'التشخيص': ['اكتئاب', 'قلق', 'قلق', 'اكتئاب', 'فرط حركة', 'قلق', 'وسواس']
})
# حساب تكرار التشخيصات داخل كل فئة عمرية
grouped_counts = clinical_df.groupby('الفئة_العمرية')['التشخيص'].value_counts()
print(grouped_counts)
لحساب النسب الاحتمالية المشروطة لكل فئة عمرية مستقلة (بحيث يكون مجموع النسب داخل فئة ‘بالغ’ مساوياً 1.0، ومجموعها داخل فئة ‘مراهق’ مساوياً 1.0)، نمرر المعامل normalize=True مباشرة إلى التابع الملحق:
# حساب النسب المئوية المشروطة داخل كل مجموعة
conditional_props = clinical_df.groupby('الفئة_العمرية')['التشخيص'].value_counts(normalize=True)
print(conditional_props)
يُعد هذا التحليل أساسياً في علم الأوبئة النفسية والإحصاء الحيوي؛ حيث يسمح باختبار فرضيات انتشار الاضطرابات بناءً على التوزيع النسبي الداخلي لكل فئة سكانية بصرف النظر عن حجم العينة الكلي لكل فئة.
9.2 تطبيق دوال التجميع والتحويل المخصص (Aggregation & Transformation)
في مشاريع هندسة الميزات (Feature Engineering) لتعلم الآلة، يحتاج المطور غالباً إلى إضافة عمود جديد إلى مجموعة البيانات الأصلية يحتوي على تكرار الفئة التي ينتمي إليها كل سجل، وذلك لتمكين النموذج من استشعار مدى شيوع أو ندرة النمط السلوكي. يتم ذلك بسلاسة عبر دمج التابع transform() مع value_counts():
# إضافة عمود يعكس تكرار التشخيص في كامل العينة
clinical_df['تكرار_التشخيص'] = clinical_df['التشخيص'].map(clinical_df['التشخيص'].value_counts())
print(clinical_df)
علاوة على ذلك، يمكن تصفية البيانات المجمعة بناءً على عتبات تكرارية محددة باستخدام التابع filter()، لاستبعاد الفئات الهامشية التي يقل تكرارها عن حد معين لتقليل الضجيج الإحصائي (Noise):
# استبقاء التشخيصات التي ظهرت مرتين أو أكثر فقط
filtered_df = clinical_df.groupby('التشخيص').filter(lambda x: len(x) >= 2)
print(filtered_df['التشخيص'].value_counts())
تضمن هذه الإجراءات الحسابية تنقية مجموعات البيانات وإثرائها بمؤشرات كمية مستمدة مباشرة من الخصائص التكرارية للمتغيرات، مما يرفع من جودة المدخلات في النماذج الإحصائية المتقدمة.
10. تمثيل نتائج value_counts() بيانياً باستخدام مكتبات التصور في بايثون
10.1 التصور البياني السريع باستخدام مكتبة Pandas المدمجة و Matplotlib
يُعد تحويل جداول التوزيع التكراري إلى أشكال بصرية خطوة جوهرية لتسهيل التواصل العلمي ونقل النتائج. توفر مكتبة Pandas واجهة رسم مدمجة تعتمد على محرك Matplotlib، مما يتيح توليد المخططات الشريطية مباشرة عبر استدعاء .plot() على مخرجات value_counts().
import matplotlib.pyplot as plt
# تجهيز بيانات المنتجات الأكثر مبيعاً
products = pd.Series(['هاتف', 'حاسوب', 'هاتف', 'لوحي', 'ساعة', 'هاتف', 'حاسوب', 'سماعات'])
# إنشاء مخطط شريطي عمودي بدقة عالية
plt.figure(figsize=(8, 5), dpi=300)
products.value_counts().plot(kind='bar', color='steelblue', edgecolor='black')
plt.title('توزيع مبيعات المنتجات الإلكترونية', fontsize=14, fontweight='bold')
plt.xlabel('نوع المنتج', fontsize=12)
plt.ylabel('عدد المبيعات المطلقة', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('sales_distribution.png', dpi=300)
plt.show()
عند التعامل مع أسماء فئات طويلة أو عدد كبير من الفئات الفريدة، يُفضل دائماً استخدام المخططات الشريطية الأفقية (Horizontal Bar Plots) عبر تمرير kind='barh'، مع استخدام ascending=True في دالة التكرار لضمان ظهور الفئة الأكثر تكراراً في أعلى المخطط، مما يوفر تجربة قراءة بصرية مريحة ومتوافقة مع المعايير الأكاديمية للنشر.
أما بالنسبة للتكرارات النسبية (النسب المئوية)، فيمكن استخدام المخططات الدائرية (Pie Charts) عبر kind='pie' بشرط ألا يتجاوز عدد الفئات 5 إلى 6 فئات، مع تفعيل خاصية autopct='%1.1f%%' لعرض النسب بدقة على القطاعات.
10.2 التمثيل المتقدم والجمالي باستخدام مكتبة Seaborn
تقدم مكتبة Seaborn قدرات جمالية وإحصائية فائقة لتصوير التوزيعات التكرارية. تُعد دالة sns.countplot() النظير الرسومي المباشر لدالة value_counts()؛ حيث تقوم بحساب التكرارات ورسمها في خطوة برمجية واحدة دون الحاجة لحساب السلسلة التكرارية مسبقاً.
import seaborn as sns
# تعيين النمط الأكاديمي للرسم
sns.set_theme(style="whitegrid")
plt.figure(figsize=(9, 6), dpi=300)
# رسم التكرار مع التوزيع الطبقي (Hue) حسب متغير إضافي
sns.countplot(
data=df,
x='المدينة',
hue='الجنس',
order=df['المدينة'].value_counts().index,
palette='viridis'
)
plt.title('التوزيع التكراري لسكان المدن مصنفاً حسب الجنس', fontsize=14)
plt.xlabel('المدينة', fontsize=12)
plt.ylabel('التكرار الإجمالي', fontsize=12)
plt.legend(title='الجنس')
plt.tight_layout()
plt.show()
يضمن استخدام order=df['المدينة'].value_counts().index ترتيب الأعمدة على المحور الأفقي تنازلياً وفق إجمالي تكرار كل مدينة، في حين يتيح المعامل hue تقسيم كل شريط حسب الفئات الفرعية لمتغير الجنس، مما ينتج رسماً عمرانياً مركباً يوضح التكرار والتفاعل بين المتغيرات في آن واحد وبأعلى جودة إخراجية.
11. تحسين الأداء الحسابي وإدارة الذاكرة مع مجموعات البيانات الضخمة
11.1 تحسين أنواع البيانات لتقليل استهلاك الذاكرة وتسريع التنفيذ
عند التوسع في معالجة مجموعات البيانات الكبيرة (التي تتجاوز ملايين السجلات)، تُشكل أنواع البيانات النصية العامة (Object Dtype) عبئاً ثقيلاً على الذاكرة العشوائية (RAM) وسرعة المعالجة المركزية؛ نظراً لأن كل سلسلة نصية تُخزن ككائن بايثون مستقل مع مؤشر ذاكرة خاص به. يؤدي تحويل الأعمدة ذات القيم المتكررة إلى النوع الفئوي (category) إلى تحسين الأداء بشكل هائل.
# إنشاء سلسلة بيانات نصية ضخمة تحوي 5 ملايين سجل
large_series = pd.Series(['فئة أ', 'فئة ب', 'فئة ج', 'فئة أ'] * 1250000)
# قياس استهلاك الذاكرة للنوع النصي
mem_object = large_series.memory_usage(deep=True) / (1024 ** 2)
# التحويل إلى النوع الفئوي
categorical_series = large_series.astype('category')
mem_category = categorical_series.memory_usage(deep=True) / (1024 ** 2)
print(f"استهلاك الذاكرة (Object): {mem_object:.2f} MB")
print(f"استهلاك الذاكرة (Category): {mem_category:.2f} MB")
يؤدي هذا التحويل البسيط إلى تقليص استهلاك الذاكرة بنسبة قد تصل إلى أكثر من 90%؛ حيث يتم تخزين النصوص الفريدة مرة واحدة فقط في جدول قاموسي، ويُستعاض عن السجلات بأرقام صحيحة مدمجة (Integers). ينعكس هذا التوفير مباشرة على سرعة تنفيذ value_counts()؛ إذ تصبح عمليات التجزئة والمقارنة الحسابية قائمة على أرقام صحيحة سريعة بدلاً من مقارنة السلاسل المحرفية الطويلة.
11.2 التعامل مع البيانات الضخمة وتجاوز قيود الذاكرة العشوائية
في الحالات التي يتجاوز فيها حجم ملف البيانات سعة الذاكرة العشوائية المتاحة، لا يمكن قراءة الملف دفعة واحدة باستخدام pd.read_csv(). يكمن الحل المعماري هنا في تطبيق المعالجة بالدفعات (Chunking) مع تجميع التكرارات تراكمياً عبر السلاسل الجزئية:
# معالجة ملف عملاق عبر دفعات وتجميع التكرارات التراكمية
total_counts = pd.Series(dtype='int64')
chunk_size = 500000
for chunk in pd.read_csv('massive_data.csv', usecols=['target_column'], chunksize=chunk_size):
chunk_counts = chunk['target_column'].value_counts(dropna=False)
total_counts = total_counts.add(chunk_counts, fill_value=0)
# تحويل التكرارات إلى أرقام صحيحة وفرزها تنازلياً
total_counts = total_counts.astype('int64').sort_values(ascending=False)
print(total_counts)
وللمشاريع المؤسسية فائقة الضخامة، يُنصح بالانتقال إلى محركات الحوسبة الموزعة أو المتوازية مثل مكتبة Dask أو محرك Polars فائق السرعة والمكتوب بلغة Rust، حيث يتيح كلاهما تنفيذ عمليات موازية لدالة value_counts() عبر أنوية المعالجة المتعددة بكفاءة زمنية خارقة تتجاوز قيود الخيط الفردي في مكتبة Pandas التقليدية.
12. أفضل الممارسات الأكاديمية والأخطاء الشائعة والبدائل البرمجية
12.1 الأخطاء البرمجية والإحصائية الشائعة وكيفية تجنبها
يقع العديد من الباحثين ومحللي البيانات في أخطاء منهجية شائعة عند استخدام دالة value_counts()، من أبرزها:
- الخلط المفاهيمي بين التكرار المطلق والنسبي: بناء استنتاجات مقارنة بين مجموعات غير متكافئة الحجم بالاعتماد على الأعداد المطلقة بدلاً من تفعيل
normalize=True. - إهمال فحص القيم المفقودة: الاعتماد على التوزيع الافتراضي دون التحقق عبر
dropna=False، مما يُخفي الانخفاض الشديد في معدلات استجابة العينة. - الافتراض المسبق لترتيب الفهرس: افتراض أن الفهرس الناتج مرتب وفق القيم التصنيفية تصاعدياً في حين أنه مرتب تنازلياً حسب التكرار؛ مما يستدعي استدعاء
sort_index()صراحة عند دراسة التوزيعات الترتيبية. - فقدان الفئات الصفرية (Zero-Count Categories): عند تطبيق الدالة على سلسلة فئوية (Categorical) ذات مستويات محددة لا تظهر في العينة الفعلية، تقوم الدالة افتراضياً بإسقاط الفئات غير المرصودة في الإصدارات القديمة ما لم يتم ضبط
observed=Falseفي استدعاءات التجميع ذات الصلة لضمان بقاء الفئات الصفرية واضحة في التحليل الإحصائي.
12.2 مقارنة الدالة بالبدائل المتاحة في منظومة Python للبيانات
يوفر نظام بايثون القياسي والمكتبات المرافقة عدة طرق لحساب التكرارات. يقدم الجدول التالي مقارنة تفصيلية بين دالة value_counts() وأبرز البدائل البرمجية المتاحة:
| الأداة البرمجية | طريقة الاستدعاء | نوع هيكل المخرجات | التعامل التلقائي مع NaN | دعم التوزيع النسبي (Normalize) | حالة الاستخدام المثلى |
|---|---|---|---|---|---|
| Pandas value_counts() | series.value_counts() |
Pandas Series ذات فهرس | يستبعدها افتراضياً (قابل للتعديل) | مدعوم ومدمج مباشرة | تحليل البيانات الاستكشافي وأطر البيانات |
| Collections Counter | Counter(iterable) |
كائن قاموسي (dict-like) | يُعامل NaN كعنصر مستقل دائماً | غير مدعوم (يتطلب حساب يدوي) | هياكل البيانات البسيطة والقوائم الخام |
| Numpy unique() | np.unique(arr, return_counts=True) |
مصفوفتان منفصلتان (Arrays) | يتعامل مع كل NaN كعنصر منفصل | غير مدعوم مباشرة | العمليات المصفوفية الرياضية شديدة الانخفاض |
| SQL Group By | GROUP BY col COUNT(*) |
جدول قواعد بيانات علاقي | يُجمع المفقودات في صف واحد | يتطلب دوال نوافذ (Window Functions) | استعلامات قواعد البيانات الضخمة في الخوادم |
توضح هذه المقارنة الشاملة أن دالة value_counts() تُقدم التوازن الأكثر مثالية بين سهولة الاستخدام، والغنى الوظيفي، والتكامل الإحصائي، مما يجعلها الخيار الأول لمشاريع علم البيانات التطبيقية والأبحاث الأكاديمية الرصينة.
ولضمان صحة وسلامة التحليل الإحصائي التكراري، يُنصح الباحثون باتباع قائمة التدقيق المنهجية التالية قبل اعتماد النتائج النهائية:
- هل تم فحص نسبة القيم المفقودة صراحة باستخدام
dropna=False؟ - هل تم توحيد النصوص وإزالة المسافات البيضاء والرموز الخفية من السلاسل النصية؟
- هل الترتيب المعتمد يعكس التكرارات (
sort=True) أم القيم الطبيعية للمتغير (sort_index())؟ - في المتغيرات المستمرة، هل تم اختيار عدد الفترات (
bins) أو حدودها بناءً على مسوغات علمية دقيقة؟ - هل تم توثيق النتائج بنسب مئوية واضحة لتسهيل المقارنة بين العينات المختلفة؟
خاتمة
تُمثّل دالة value_counts() في مكتبة Pandas ركيزة لا غنى عنها في ترسانة أدوات عالم البيانات ومحلل الإحصاء؛ إذ تجمع بين البساطة النحوية والقوة الحسابية الفائقة المستندة إلى خوارزميات التجزئة المتقدمة. من خلال الإحاطة الشاملة بمعاملاتها المتعددة مثل normalize و dropna و bins و ascending، يستطيع الباحث سبر أغوار البيانات المنفصلة والمستمرة، واستخراج المؤشرات الإحصائية الحرجة، وتجهيز المتغيرات لنماذج تعلم الآلة المتقدمة.
إن الاستخدام المسؤول والمنهجي لهذه الدالة يقتضي الوعي بالفروق الدقيقة بين التكرارات المطلقة والنسبية، واليقظة المنهجية تجاه القيم المفقودة والتشوهات النصية، بالإضافة إلى تبني استراتيجيات إدارة الذاكرة عند التوسع في معالجة البيانات الضخمة. يُشكل التمكن من هذه الأدوات خطوة أساسية نحو بناء تحليلات رصينة وتوليد استدلالات علمية دقيقة تسهم في تطوير المعرفة ودعم اتخاذ القرارات في مختلف الميادين التطبيقية والبحثية.
References
- McKinney, W. (2022). Python for data analysis: Data wrangling with Pandas, NumPy, and Jupyter (3rd ed.). O’Reilly Media. https://wesmckinney.com/book/
- Pandas Development Team. (2023). pandas.Series.value_counts — pandas 2.1.4 documentation. PyData. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.value_counts.html
- Pandas Development Team. (2023). pandas.DataFrame.value_counts — pandas 2.1.4 documentation. PyData. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.value_counts.html
- VanderPlas, J. (2016). Python data science handbook: Essential tools for working with data. O’Reilly Media. https://jakevdp.github.io/PythonDataScienceHandbook/
- Waskom, M. L. (2021). Seaborn: statistical data visualization. Journal of Open Source Software, 6(60), 3021. https://doi.org/10.21105/joss.03021
- Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90–95. https://doi.org/10.1109/MCSE.2007.55
- Harris, C. R., Millman, K. J., van der Walt, S. J., Gommers, R., Virtanen, P., Cournapeau, D., … & Oliphant, T. E. (2020). Array programming with NumPy. Nature, 585(7825), 357–362. https://doi.org/10.1038/s41586-020-2649-2