الاستراتيجيّات الفعّالة للتّعامل مع القيم المفقودة في تحليل البيانات Effective Strategies for Handling Missing Values in Data Analysis

Missing Vaue

التدّقيق العلمي: د.م. حسن قزّاز، م. محمّد سرميني
التدّقيق اللّغوي: هبة الله فلّاحةِ

ما هي القيمة المفقودة Missing Value:

يتمّ تعريف البيانات المفقودة على أنّها القيم أو البيانات غير المُخزّنة (أو غير الموجودة) لبعض المتغيّرات في مجموعة البيانات، وفيما يلي عيّنة من البيانات المفقودة من مجموعة بيانات تيتانيك Titanic المشهورة. يمكنك أن ترى في الشكل (1)، أنَّ العمودين ‘العمر’ Age و ‘المقصورة’ Cabin لديهما بعض القيم المفقودة[1]

الشّكل (1): بعض القيم المفقودة في العمودين ‘العمر’ Age و ‘المقصورة’ Cabin.

كيف يتمّ تمثيل القيمة المفقودة في مجموعة البيانات؟

تَدلُّ الفراغات في مجموعة البيانات على وجود قيم مفقودة. في مكتبة تحليل البيانات في بايثون (بانداس) pandas، عادةً ما يتمّ تمثيل القيم المفقودة بواسطة القيمة “NaN” التي تعني ليس رقمًا Not a Number. يوضّح الشّكل(2) تمثيل القيمة المفقودة في العمودين ‘العمر’ Age و ‘المقصورة’ Cabin من خلال القيمة NAN [1]

الشّكل(2): تمثيل القيمة المفقودة في العمودين ‘العمر’ Age و ‘المقصورة’  Cabin  من خلال القيمة NAN.

لماذا تُفقد البيانات من مجموعة البيانات؟

يمكن أن تكون هناك أسباب متعدّدة لعدم وجود قيم معيّنة من البيانات، تؤثّر أسباب فقدان البيانات من مجموعة البيانات على نهج معالجة البيانات المفقودة، لذلك من الضّروري فهم سبب فقد البيانات.

أهمّ أسباب فقدان البيانات : 

  • قد تُتلف البيانات السّابقة بسبب الصّيانة غير الصّحيحة.
  • لم يتمّ تسجيل الملاحظات لبعض الحقول بسبب بعض الأسباب، فقد يكون هناك فشل في تسجيل القيم بسبب خطأ بشريّ.
  • لم يقدّم المستخدم القيم عن قصد.
  • عدم استجابة العنصر: هذا يعني أنّ المشارك رفض الردّ[1].

أنواع القيم المفقودة؟

يتمّ تصنيف القيم المفقودة كما هو موضّح بالشّكل (3) إلى:

  1. القيم المفقودة بشكل عشوائيّ تام Missing Completely At  Random MCAR.
  2. القيم المفقودة بشكل عشوائيّ  Missing At Random MAR. 
  3. القيم المفقودة بشكل غير عشوائيّ Missing Not At  Random MNAR. 
الشّكل(3): أنواع القيم المفقودة في مجموعة البيانات. 
  1. القيم المفقودة بشكل عشوائيّ تام  Missing Completely At  Random MCAR:

 في هذه الحالة لا توجد علاقة بين البيانات المفقودة وأيّ قيم أخرى يتمّ ملاحظتها أو عدم ملاحظتها (البيانات التي لم يتمّ تسجيلها) ضمن مجموعة البيانات المحدّدة؛ أي أنّ القيم المفقودة مستقلّة تمامًا عن البيانات الأخرى (لا يوجد نمط  بين الأعمدة).

في هذه الحالة من القيم المفقودة أي من النّوع MCAR قد تكون القيمة مفقودة بسبب خطأ بشريّ أو فقدان العيّنة تماماً

  1. القيم المفقودة بشكل عشوائيّ  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)

الشّكل (4): أوّل 5 أسطر من مجموعة البيانات.

إنَّ الخطوة الأولى في معالجة القيم المفقودة هي إلقاء نظرة دقيقة على البيانات الكاملة والعثور على جميع القيم المفقودة، تُوضّح الشّيفرة البرمجيّة التّالية العدد الإجماليّ للقيم المفقودة في كلّ عمود، كما تعرض أيضًا العدد الإجماليّ للقيم المفقودة في مجموعة البيانات بأكملها كما هو موضّح بالشّكل (5) [1].

الشّكل (5): يوضّح العدد الكلّيّ للقيم المفقودة. 

معالجة القيم المفقودة:

الآن بعد أن وجدت البيانات المفقودة لابدّ من معرفة الطّريقة الخاصّة في التّعامل معها؛

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

هناك طريقتان أساسيّتان للتّعامل مع القيم المفقودة:

  1. حذف القيم المفقودة
  2. احتساب القيم المفقودة

حذف القيم المفقودة:

بشكل عام لا يُنصح بهذه الطّريقة، حيث تُعتبر من الطّرق السّريعة التي يمكن للمرء استخدامها للتّعامل مع القيم المفقودة، إذا كانت القيمة المفقودة من نوع القيم المفقودة بشكل غير عشوائيّ (MNAR) فلا ينبغي حذفها.

أحد أهمّ عيوب هذه الطّريقة هو أنّه قد ينتهي الأمر بحذف بعض البيانات المُفيدة من مجموعة البيانات.

هناك طريقتان لحذف البيانات المفقودة:

1- حذف الصّفّ بأكمله (حذف بطريقة قائمة listwise deletion)

إذا كان الصّفّ الواحد أي السّطر الواحد يحتوي على العديد من القيم المفقودة (الأعمدة)، فيمكنك حذف الصّفّ أي السّطر بأكمله. وإذا كان أكثر من  صفّ من مجموعة البيانات يحتوي على  بعض القيم (العمود) المفقودة، فقد ينتهي بك الأمر بحذف مجموعة كبيرة من البيانات. الشّيفرة البرمجيّة  لحذف الصّفّ بأكمله كما يلي كما هو موضّح بالشّكل (6):

df = train_df.dropna(axis=0)
df.isnull().sum(
الشّكل (6): نتيجة الشّيفرة االبرمجيّة لحذف الأسطر التي فيها القيم المفقودة. 

2- حذف العمود بأكمله

إذا كان عمود معين يحتوي على العديد من القيم المفقودة، فيمكنك اختيار حذف العمود بأكمله. الشّيفرة البرمجيّة لحذف العمود بأكمله كما يلي والشّكل رقم (7) يوضّح حذف العمود Dependents  بأكمله

df = train_df.drop(['Dependents'],axis=1)
df.isnull().sum()
الشّكل (7): خرج الشّيفرة البرمجيّة لحذف عمود ‘Dependents’ من مجموعة البيانات. 

احتساب القيم المفقودة: 

هناك العديد من طرق الاحتساب لاستبدال القيم المفقودة، يمكنك استخدام العديد من المكتبات في بايثون python مثل بانداس Pandas ومكتبة اس-كي للتعلّم  Sci-kit Learn للقيام بذلك، فلنستعرض بعض طرق استبدال القيم المفقودة:

استبدال القيم المفقودة بقيمة معينة:

إذا كان بإمكانك عمل تخمين مدروس حول القيمة المفقودة، فيمكنك استبدالها بقيمة معيّنة باستخدام الشّيفرة البرمجيّة التّالية. على سبيل المثال في الكود التّالي نستبدل القيم المفقودة لعمود “Dependents” بـ “0” كما هو مُوح في  الشّكل (8).

الشّكل (8): استبدال القيم المفقودة بعمود ‘Dependents’ بالقيمة 0.

استبدال القيمة المفقودة من خلال المتوسّط:

هذه هي الطّريقة الأكثر شيوعًا لحساب القيم المفقودة للأعمدة الرّقميّة، إذا كانت هناك قيم متطرّفة فلن يكون المتوسّط مناسبًا، في مثل هذه الحالات يجب معالجة القيم المتطرّفة أوّلًا. يمكنك استخدام تابع “fillna” من مكتبة بانداس لحساب العمودين “LoanAmount” و “Credit_History” مع متوسّط قيم الأعمدة المعنيّة كما هو مُوضّح في الشّكل (9).

الشّكل (9): استبدال القيم المفقودة في عمود Credit_History وعمود  LoanAmount بمتوسّطاتهم.

استبدال القيم المفقودة من خلال القيمة الأكثر تكرارًا Mode:

يتمّ استخدام القيمة الأكثر تكرارًا mode في حالة السّمات الفئويّة، يمكنك استخدام تابع “fillna” لحساب الأعمدة الفئويّة “الجنس” و “متزوّج” و “موظّف ذاتيّ” كما هو موضّح في الشّكل (10) يتمّ استبدال القيم المفقودة في عمود الجنس و متزوّج و موظّف ذاتيّ، بالقيمة الأكثر تكرارًا

الشّكل (10): استبدال القيم المفقودة في أعمدة الجنس و متزوّج و موظّف ذاتيّ، بالقيمة الأكثر تكرارًا.

استبدال القيمة المفقودة من خلال الوسيط: 

الوسيط هو القيمة الوسيطة والمُتوضّعة في وسط مجموعة من الأرقام المرتبة تصاعديًا أو تنازليًا، من الأفضل استخدام قيمة الوسيط في حالة وجود القيم المتطرّفة. يمكنك استخدام تابع “fillna” لإسناد قيمة الوسيط للعمود “Loan_Amount_Term” كما هو موضّح في الشّكل (11).

الشّكل (11): استبدال القيم المفقودة في عمود Loan_Amount_Term بقيمة الوسيط.

الاستبدال بالقيمة السّابقة – تعبئة أماميّة:

في بعض الحالات يكون احتساب القيم بالقيمة السّابقة بدلًا من المتوسّط أو القيمة الأكثر تكراراً أو الوسيط الأكثر ملاءمة وهذا ما يسمّى التّعبئة الأماميّة؛ يتمّ استخدامه في الغالب في بيانات السّلاسل الزّمنيّة. يمكنك استخدام تابع “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

الشّكل (12): مجموعة بيانات تحوي قيمًا مفقودة لنطبّق عليها التّعبئة الأماميّة والعكسيّة .
الشّكل (13): خرج الشّيفرة البرمجيّة للتّعبئة الأماميّة. 

تمّ ملء البيانات المفقودة بناءً على القيمة التي في السّطر السّابق و هي القيمة (1.0) و من هنا جاءت تسميتها بال forward-fill 

الاستبدال بالقيمة التّالية – التّعبئة العكسيّة:

في التّعبئة العكسيّة يتمّ احتساب القيمة المفقودة باستخدام القيمة التّالية كما هو موضّح في الشّكل (14):

الشّكل (14): خرج الشّيفرة البرمجيّة للتّعبئة العكسيّة. 

المقصود بال bfill وهو backward fill؛  أي التّعبئة الخلفيّة حيث تمّ استبدال البيانات المفقودة بناءً على القيمة التي جاءت في السّطر التّالي وهي القيمة (5.0 )[1].

كيف تُحتسب القيم المفقودة باستخدام مكتبة اس-كي للتعلّم Sci-kit Learn؟

الطّريقة وحيدة المتغيّر أو ذات المتغيّر الواحد Univariate Approach:

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

الشّكل (15): استبدال القيم المفقودة باستخدام SimpleImputer  أحاديّ النّهج.

نهج متعدّد المتغيّرات 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

الشّكل (16): مجموعة البيانات “تايتانك ” بما فيها من قيم مفقودة  لتطبيق KNNImputer .

يتمّ احتساب القيم المفقودة باستخدام طريقة الجيران الأقرب k-Nearest Neighbours، حيث يتمّ استخدام المسافة الإقليديّة للعثور على أقرب الجيران، لنأخذ المثال أعلاه لمجموعة البيانات تايتانك لمعرفة كيفيّة عملها كما هو موضّح في الشّكل (17).

الشّكل (17): تطبيق KNNImputer على مجموعة البيانات لاحتساب القيم المفقودة.

في المثال أعلاه، عدد الجوار يساوي 2 (n_neighbours = 2). لذا تجد مكتبة اس-كي للتعلّم sci-kit Learn أكثر صفّين تشابهًا يتمّ قياسهما من خلال مدى قرب قيم “Sib sp” و “Fare” من الصّفّ الذي يحتوي على قيم مفقودة، في هذه الحالة يحتوي الصّفّ الأخير على قيمة مفقودة، والصّفّ الثّالث و الخامس هما أقرب قيمتين للميزتين الأخريين، لذلك يتمّ أخذ متوسّط ميزة “العمر” من هذين الصّفّين على أنّها القيمة المحتسبة.

الخاتمة : 

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

اكتشفنا في هذه المقالة  فئات مختلفة من البيانات المفقودة والطّرق المختلفة للتّعامل معها

المراجع :

الكاتب

  • نور شوشرة

    مهندسة حواسيب من جامعة دمشق مهتمة بعلوم الذكاء الصنعي وخاصة التعلم الآلي و معالجة اللغات الطبيعية، عملت مدربة في ورشات و مخيمات تدريبية في هذا التخصص ولدي خبرة سنتين في مجال علوم البيانات في العمل الحر

0 Shares:
اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

You May Also Like