التدّقيق العلمي: د.م. حسن قزّاز، م. محمّد سرميني
التدّقيق اللّغوي: هبة الله فلّاحةِ
المَحتويَات
ما هي القيمة المفقودة Missing Value:
يتمّ تعريف البيانات المفقودة على أنّها القيم أو البيانات غير المُخزّنة (أو غير الموجودة) لبعض المتغيّرات في مجموعة البيانات، وفيما يلي عيّنة من البيانات المفقودة من مجموعة بيانات تيتانيك Titanic المشهورة. يمكنك أن ترى في الشكل (1)، أنَّ العمودين ‘العمر’ Age و ‘المقصورة’ Cabin لديهما بعض القيم المفقودة[1]
كيف يتمّ تمثيل القيمة المفقودة في مجموعة البيانات؟
تَدلُّ الفراغات في مجموعة البيانات على وجود قيم مفقودة. في مكتبة تحليل البيانات في بايثون (بانداس) pandas، عادةً ما يتمّ تمثيل القيم المفقودة بواسطة القيمة “NaN” التي تعني ليس رقمًا Not a Number. يوضّح الشّكل(2) تمثيل القيمة المفقودة في العمودين ‘العمر’ Age و ‘المقصورة’ Cabin من خلال القيمة NAN [1]
لماذا تُفقد البيانات من مجموعة البيانات؟
يمكن أن تكون هناك أسباب متعدّدة لعدم وجود قيم معيّنة من البيانات، تؤثّر أسباب فقدان البيانات من مجموعة البيانات على نهج معالجة البيانات المفقودة، لذلك من الضّروري فهم سبب فقد البيانات.
أهمّ أسباب فقدان البيانات :
- قد تُتلف البيانات السّابقة بسبب الصّيانة غير الصّحيحة.
- لم يتمّ تسجيل الملاحظات لبعض الحقول بسبب بعض الأسباب، فقد يكون هناك فشل في تسجيل القيم بسبب خطأ بشريّ.
- لم يقدّم المستخدم القيم عن قصد.
- عدم استجابة العنصر: هذا يعني أنّ المشارك رفض الردّ[1].
أنواع القيم المفقودة؟
يتمّ تصنيف القيم المفقودة كما هو موضّح بالشّكل (3) إلى:
- القيم المفقودة بشكل عشوائيّ تام Missing Completely At Random MCAR.
- القيم المفقودة بشكل عشوائيّ Missing At Random MAR.
- القيم المفقودة بشكل غير عشوائيّ Missing Not At Random MNAR.
- القيم المفقودة بشكل عشوائيّ تام Missing Completely At Random MCAR:
في هذه الحالة لا توجد علاقة بين البيانات المفقودة وأيّ قيم أخرى يتمّ ملاحظتها أو عدم ملاحظتها (البيانات التي لم يتمّ تسجيلها) ضمن مجموعة البيانات المحدّدة؛ أي أنّ القيم المفقودة مستقلّة تمامًا عن البيانات الأخرى (لا يوجد نمط بين الأعمدة).
في هذه الحالة من القيم المفقودة أي من النّوع MCAR قد تكون القيمة مفقودة بسبب خطأ بشريّ أو فقدان العيّنة تماماً
- القيم المفقودة بشكل عشوائيّ Missing At Random MAR:
يمكن تفسير هذا النّوع من القيم المفقودة من خلال أعمدة أخرى، أي في هذا النّوع نستطيع إيجاد علاقة (نمط) بين القيم المفقودة في عمود ما والبيانات الموجودة في أعمدة أخرى.
3 . القيم المفقودة بشكل غير عشوائيّ Missing Not At Random MNAR:
إذا كانت البيانات المفقودة لا تندرج ضمن النّوعين السّابقين، فيمكن تصنيفها على أنّها MNAR. يمكن أن تحدث هذه الحالة بسبب امتناع الأشخاص عن تقديم المعلومات المطلوبة، أو عدم استجابة مجموعة معيّنة من الأشخاص على بعض الأسئلة من الاستطلاع ما [1][2]
لماذا نحتاج إلى الاهتمام بمعالجة البيانات المفقودة؟
من المهمّ التّعامل مع القيم المفقودة بشكل مناسب. تفشل العديد من خوارزميّات التّعلّم الآليّ إذا كانت مجموعة البيانات تحتوي على قيم مفقودة، ومع ذلك فإنّ خوارزميّات مثل الجوارالأقرب K-nearest ونموذج بايز البسيط Naive Bayes تدعم البيانات ذات القيم المفقودة.
قد ينتهي بك الأمر إلى بناء نموذج تعلّم آليّ متحيّز، ممّا يؤدّي إلى نتائج غير صحيحة إذا لم يتمّ التّعامل مع القيم المفقودة بشكل صحيح، يمكن أن تؤدّي البيانات المفقودة إلى نقص الدّقّة في التّحليل الإحصائيّ [1]
تطبيق عمليّ باستخدام لغة البايثون python
لنأخذ مثالًا على مشكلة التنبّؤ بالحصول على القرض، يمكنك تحميل مجموعة البيانات المستخدمة من الرّابط التّالي.
التّحقّق من القيم المفقودة في بايثون
تتألّف مجموعة البيانات المستخدمة من عدد من الأعمدة كما هو موضّح في الشّكل (4) نذكر أهمّها:
- loan -id : الرّقم الخاص بالقرض
- gender : الجنس
- Married : هل مقدّم الطّلب متزوّج أم لا
- Dependents : هل مقدّم الطّلب لديه أولاد أو لا
- Education : التّعليم، هل مقدّم الطّلب متخرّج أم لا
- Self_Employed : هل مقدّم الطّلب موظّف أم لا
- Applicant Income : دخل مقدّم القرض
- LOAN AMOUNT : قيمة القرض
- Loan_Amount_Term : الفترة الزّمنيّة التي يتطلّبها الطّلب للقبول
- Property_Area : منطقة مقدّم الطّلب ريفيّ أم مدنيّ
- Loan_Status حالة الطّلب بالقبول أو الرّفض
كما هو موضّح بالشّكل (4)
إنَّ الخطوة الأولى في معالجة القيم المفقودة هي إلقاء نظرة دقيقة على البيانات الكاملة والعثور على جميع القيم المفقودة، تُوضّح الشّيفرة البرمجيّة التّالية العدد الإجماليّ للقيم المفقودة في كلّ عمود، كما تعرض أيضًا العدد الإجماليّ للقيم المفقودة في مجموعة البيانات بأكملها كما هو موضّح بالشّكل (5) [1].
معالجة القيم المفقودة:
الآن بعد أن وجدت البيانات المفقودة لابدّ من معرفة الطّريقة الخاصّة في التّعامل معها؛
قم بتحليل كلّ عمود يحتوي على قيم مفقودة بعناية لفهم الأسباب الكامنة وراء فقدان هذه القيم، حيث أنّ هذه المعلومات ضروريّة لاختيار استراتيجيّة التّعامل مع القيم المفقودة.
هناك طريقتان أساسيّتان للتّعامل مع القيم المفقودة:
- حذف القيم المفقودة
- احتساب القيم المفقودة
حذف القيم المفقودة:
بشكل عام لا يُنصح بهذه الطّريقة، حيث تُعتبر من الطّرق السّريعة التي يمكن للمرء استخدامها للتّعامل مع القيم المفقودة، إذا كانت القيمة المفقودة من نوع القيم المفقودة بشكل غير عشوائيّ (MNAR) فلا ينبغي حذفها.
أحد أهمّ عيوب هذه الطّريقة هو أنّه قد ينتهي الأمر بحذف بعض البيانات المُفيدة من مجموعة البيانات.
هناك طريقتان لحذف البيانات المفقودة:
1- حذف الصّفّ بأكمله (حذف بطريقة قائمة listwise deletion)
إذا كان الصّفّ الواحد أي السّطر الواحد يحتوي على العديد من القيم المفقودة (الأعمدة)، فيمكنك حذف الصّفّ أي السّطر بأكمله. وإذا كان أكثر من صفّ من مجموعة البيانات يحتوي على بعض القيم (العمود) المفقودة، فقد ينتهي بك الأمر بحذف مجموعة كبيرة من البيانات. الشّيفرة البرمجيّة لحذف الصّفّ بأكمله كما يلي كما هو موضّح بالشّكل (6):
df = train_df.dropna(axis=0)
df.isnull().sum(
2- حذف العمود بأكمله
إذا كان عمود معين يحتوي على العديد من القيم المفقودة، فيمكنك اختيار حذف العمود بأكمله. الشّيفرة البرمجيّة لحذف العمود بأكمله كما يلي والشّكل رقم (7) يوضّح حذف العمود Dependents بأكمله
df = train_df.drop(['Dependents'],axis=1)
df.isnull().sum()
احتساب القيم المفقودة:
هناك العديد من طرق الاحتساب لاستبدال القيم المفقودة، يمكنك استخدام العديد من المكتبات في بايثون python مثل بانداس Pandas ومكتبة اس-كي للتعلّم Sci-kit Learn للقيام بذلك، فلنستعرض بعض طرق استبدال القيم المفقودة:
استبدال القيم المفقودة بقيمة معينة:
إذا كان بإمكانك عمل تخمين مدروس حول القيمة المفقودة، فيمكنك استبدالها بقيمة معيّنة باستخدام الشّيفرة البرمجيّة التّالية. على سبيل المثال في الكود التّالي نستبدل القيم المفقودة لعمود “Dependents” بـ “0” كما هو مُوح في الشّكل (8).
استبدال القيمة المفقودة من خلال المتوسّط:
هذه هي الطّريقة الأكثر شيوعًا لحساب القيم المفقودة للأعمدة الرّقميّة، إذا كانت هناك قيم متطرّفة فلن يكون المتوسّط مناسبًا، في مثل هذه الحالات يجب معالجة القيم المتطرّفة أوّلًا. يمكنك استخدام تابع “fillna” من مكتبة بانداس لحساب العمودين “LoanAmount” و “Credit_History” مع متوسّط قيم الأعمدة المعنيّة كما هو مُوضّح في الشّكل (9).
استبدال القيم المفقودة من خلال القيمة الأكثر تكرارًا Mode:
يتمّ استخدام القيمة الأكثر تكرارًا mode في حالة السّمات الفئويّة، يمكنك استخدام تابع “fillna” لحساب الأعمدة الفئويّة “الجنس” و “متزوّج” و “موظّف ذاتيّ” كما هو موضّح في الشّكل (10) يتمّ استبدال القيم المفقودة في عمود الجنس و متزوّج و موظّف ذاتيّ، بالقيمة الأكثر تكرارًا
استبدال القيمة المفقودة من خلال الوسيط:
الوسيط هو القيمة الوسيطة والمُتوضّعة في وسط مجموعة من الأرقام المرتبة تصاعديًا أو تنازليًا، من الأفضل استخدام قيمة الوسيط في حالة وجود القيم المتطرّفة. يمكنك استخدام تابع “fillna” لإسناد قيمة الوسيط للعمود “Loan_Amount_Term” كما هو موضّح في الشّكل (11).
الاستبدال بالقيمة السّابقة – تعبئة أماميّة:
في بعض الحالات يكون احتساب القيم بالقيمة السّابقة بدلًا من المتوسّط أو القيمة الأكثر تكراراً أو الوسيط الأكثر ملاءمة وهذا ما يسمّى التّعبئة الأماميّة؛ يتمّ استخدامه في الغالب في بيانات السّلاسل الزّمنيّة. يمكنك استخدام تابع “fillna” مع “method = ffill” وهو المقصود ب: forwardfill أي تعبئة أماميّة كما هو موضّح في الشّكلين (12),(13).
import pandas as pd
import numpy as np
test = pd.Series(range(6))
test.loc[2:4] = np.nan
test
تمّ ملء البيانات المفقودة بناءً على القيمة التي في السّطر السّابق و هي القيمة (1.0) و من هنا جاءت تسميتها بال forward-fill
الاستبدال بالقيمة التّالية – التّعبئة العكسيّة:
في التّعبئة العكسيّة يتمّ احتساب القيمة المفقودة باستخدام القيمة التّالية كما هو موضّح في الشّكل (14):
المقصود بال bfill وهو backward fill؛ أي التّعبئة الخلفيّة حيث تمّ استبدال البيانات المفقودة بناءً على القيمة التي جاءت في السّطر التّالي وهي القيمة (5.0 )[1].
كيف تُحتسب القيم المفقودة باستخدام مكتبة اس-كي للتعلّم Sci-kit Learn؟
الطّريقة وحيدة المتغيّر أو ذات المتغيّر الواحد Univariate Approach:
في النّهج أحاديّ المتغيّر يتمّ أخذ ميزة واحدة فقط في الاعتبار، يمكنك استخدام فئة SimpleImputer واستبدال القيم المفقودة بالمتوسّط أو القيمة الأكثر تكرارًا أو الوسيط أو بعض القيم الثّابتة، كما هو موضّح في الشّكل (15).
نهج متعدّد المتغيّرات Multivariate Approach:
في طريقة متعدّد المتغيّرات يتمّ أخذ أكثر من ميزة واحدة في الاعتبار، لاحتساب القيم المفقودة مع الأخذ في الاعتبار النّهج متعدّد المتغيّرات، نستخدم طريقة الجوار الأقرب k-nearest neighbors لاحتساب القيم المفقودة KNNImputer.
لنأخذ مثالًا على مجموعة بيانات تايتانك titanic.
مجموعة بيانات تايتانك titanic هي مجموعة بيانات هدفها التنبّؤ فيما إذا كان الشّخص نجا من سفينة التّايتانك أو لا، بناءً على مجموعات خصائص عن الشّخص المُسافر.
لنفترض أنّ ميزة “العمر” مرتبطة ارتباطًا وثيقًا بميزة “أجور السّفر”، بحيث يكون الأشخاص ذوي الأجورالمنخفضة أصغر سنًّا أيضًا، والأشخاص ذوو الأجور الأعلى هم أيضًا أكبر سنًّا، في هذه الحالة سيكون من المنطقيّ أن نحتسب العمر المنخفض لقيم الأجرة المنخفضة والعمر المرتفع لقيم الأجرة المرتفعة، لذلك نحن هنا نأخذ ميزات متعدّدة في الاعتبار باتّباع نهج متعدّد المتغيّرات.
لنتناول مثالًا على KNNImputer
سنصبّ تركيزنا هنا عن خصائص العمر age و أجور السفر Fare و ما إذا كان أحد أفراد عائلة المسافر على متن السّفينة sibsip. يبيّن الشّكل (16) مجموعة البيانات والخصائص
import pandas as pd
df = pd.read_csv('http://bit.ly/kaggletrain', nrows=6)
cols = ['SibSp', 'Fare', 'Age']
X = df[cols]
X
يتمّ احتساب القيم المفقودة باستخدام طريقة الجيران الأقرب k-Nearest Neighbours، حيث يتمّ استخدام المسافة الإقليديّة للعثور على أقرب الجيران، لنأخذ المثال أعلاه لمجموعة البيانات تايتانك لمعرفة كيفيّة عملها كما هو موضّح في الشّكل (17).
في المثال أعلاه، عدد الجوار يساوي 2 (n_neighbours = 2). لذا تجد مكتبة اس-كي للتعلّم sci-kit Learn أكثر صفّين تشابهًا يتمّ قياسهما من خلال مدى قرب قيم “Sib sp” و “Fare” من الصّفّ الذي يحتوي على قيم مفقودة، في هذه الحالة يحتوي الصّفّ الأخير على قيمة مفقودة، والصّفّ الثّالث و الخامس هما أقرب قيمتين للميزتين الأخريين، لذلك يتمّ أخذ متوسّط ميزة “العمر” من هذين الصّفّين على أنّها القيمة المحتسبة.
الخاتمة :
البيانات المفقودة هي مشكلة يواجهها الجميع أثناء التّعامل مع البيانات الواقعيّة، وذلك يمكن أن يؤثّر على جودة ودقّة نتائجنا. يعدّ فهم الأنواع المختلفة لقيم البيانات المفقودة وتأثيرها المحتمل على التّحليل أمرًا بالغ الأهمّيّة للباحثين لاختيار طريقة مناسبة للتّعامل مع البيانات المفقودة، فكلّ طريقة لها مزاياها وعيوبها وتناسب أنواعًا مختلفة من قيم البيانات المفقودة.
اكتشفنا في هذه المقالة فئات مختلفة من البيانات المفقودة والطّرق المختلفة للتّعامل معها
المراجع :