You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Data-Science-For-Beginners/translations/ar/2-Working-With-Data/08-data-preparation/README.md

24 KiB

العمل مع البيانات: إعداد البيانات

 رسم توضيحي بواسطة (@sketchthedocs)
إعداد البيانات - رسم توضيحي بواسطة @nitya

اختبار ما قبل المحاضرة

اعتمادًا على مصدرها، قد تحتوي البيانات الخام على بعض التناقضات التي تسبب تحديات في التحليل والنمذجة. بمعنى آخر، يمكن تصنيف هذه البيانات على أنها "غير نظيفة" وستحتاج إلى تنظيفها. تركز هذه الدرس على تقنيات تنظيف وتحويل البيانات للتعامل مع تحديات البيانات المفقودة أو غير الدقيقة أو غير المكتملة. المواضيع التي يتم تناولها في هذا الدرس ستستخدم مكتبة Python وPandas وسيتم عرضها في الدفتر داخل هذا الدليل.

أهمية تنظيف البيانات

  • سهولة الاستخدام وإعادة الاستخدام: عندما تكون البيانات منظمة ومُطَبَّعة بشكل صحيح، يصبح من السهل البحث عنها واستخدامها ومشاركتها مع الآخرين.

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

  • دقة النموذج: تحسين دقة النماذج التي تعتمد على البيانات النظيفة.

أهداف واستراتيجيات التنظيف الشائعة

  • استكشاف مجموعة البيانات: يمكن أن يساعد استكشاف البيانات، الذي يتم تغطيته في درس لاحق، في اكتشاف البيانات التي تحتاج إلى تنظيف. يمكن أن يوفر الملاحظة البصرية للقيم داخل مجموعة البيانات توقعات لما سيبدو عليه باقي البيانات أو فكرة عن المشاكل التي يمكن حلها. يشمل الاستكشاف الاستعلامات الأساسية، التصورات، وأخذ العينات.

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

  • التكرارات: يمكن أن تؤدي البيانات التي تحتوي على أكثر من تكرار إلى نتائج غير دقيقة وعادةً ما يجب إزالتها. يمكن أن يكون هذا شائعًا عند دمج مجموعتين أو أكثر من البيانات معًا. ومع ذلك، هناك حالات حيث تحتوي التكرارات في مجموعات البيانات المدمجة على أجزاء يمكن أن توفر معلومات إضافية وقد تحتاج إلى الاحتفاظ بها.

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

استكشاف معلومات DataFrame

هدف التعلم: بنهاية هذا القسم الفرعي، يجب أن تكون مرتاحًا في العثور على معلومات عامة حول البيانات المخزنة في DataFrames الخاصة بـ pandas.

بمجرد تحميل البيانات في pandas، من المرجح أن تكون في DataFrame (راجع الدرس السابق للحصول على نظرة عامة مفصلة). ومع ذلك، إذا كانت مجموعة البيانات في DataFrame تحتوي على 60,000 صف و400 عمود، كيف يمكنك البدء في فهم ما تعمل معه؟ لحسن الحظ، توفر pandas أدوات ملائمة للنظر بسرعة في المعلومات العامة حول DataFrame بالإضافة إلى الصفوف الأولى والأخيرة.

لاستكشاف هذه الوظيفة، سنقوم باستيراد مكتبة Python scikit-learn واستخدام مجموعة بيانات شهيرة: مجموعة بيانات Iris.

import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
iris_df = pd.DataFrame(data=iris['data'], columns=iris['feature_names'])
طول السبل (سم) عرض السبل (سم) طول البتلة (سم) عرض البتلة (سم)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
  • DataFrame.info: للبدء، يتم استخدام طريقة info() لطباعة ملخص للمحتوى الموجود في DataFrame. لنلقِ نظرة على هذه المجموعة من البيانات لمعرفة ما لدينا:
iris_df.info()
RangeIndex: 150 entries, 0 to 149
Data columns (total 4 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   sepal length (cm)  150 non-null    float64
 1   sepal width (cm)   150 non-null    float64
 2   petal length (cm)  150 non-null    float64
 3   petal width (cm)   150 non-null    float64
dtypes: float64(4)
memory usage: 4.8 KB

من هذا، نعلم أن مجموعة بيانات Iris تحتوي على 150 إدخالًا في أربعة أعمدة بدون إدخالات فارغة. يتم تخزين جميع البيانات كأرقام عائمة 64 بت.

  • DataFrame.head(): بعد ذلك، للتحقق من المحتوى الفعلي لـ DataFrame، نستخدم طريقة head(). لنرى كيف تبدو الصفوف الأولى من iris_df:
iris_df.head()
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
2                4.7               3.2                1.3               0.2
3                4.6               3.1                1.5               0.2
4                5.0               3.6                1.4               0.2
  • DataFrame.tail(): على العكس، للتحقق من الصفوف الأخيرة من DataFrame، نستخدم طريقة tail():
iris_df.tail()
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
145                6.7               3.0                5.2               2.3
146                6.3               2.5                5.0               1.9
147                6.5               3.0                5.2               2.0
148                6.2               3.4                5.4               2.3
149                5.9               3.0                5.1               1.8

الخلاصة: حتى بمجرد النظر إلى البيانات الوصفية حول المعلومات في DataFrame أو القيم الأولى والأخيرة فيها، يمكنك الحصول على فكرة فورية عن الحجم والشكل والمحتوى للبيانات التي تتعامل معها.

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

هدف التعلم: بنهاية هذا القسم الفرعي، يجب أن تعرف كيفية استبدال أو إزالة القيم الفارغة من DataFrames.

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

يتعامل pandas مع القيم المفقودة بطريقتين. الأولى التي رأيتها من قبل في الأقسام السابقة: NaN، أو ليس رقمًا. هذه في الواقع قيمة خاصة وهي جزء من مواصفات IEEE للأرقام العائمة وتستخدم فقط للإشارة إلى القيم العائمة المفقودة.

بالنسبة للقيم المفقودة بخلاف الأرقام العائمة، يستخدم pandas كائن Python None. على الرغم من أنه قد يبدو مربكًا أنك ستواجه نوعين مختلفين من القيم التي تقول نفس الشيء بشكل أساسي، إلا أن هناك أسبابًا برمجية سليمة لهذا الاختيار التصميمي، وفي الممارسة العملية، يتيح هذا النهج لـ pandas تقديم حل وسط جيد لمعظم الحالات. ومع ذلك، فإن كل من None وNaN يحملان قيودًا يجب أن تكون على دراية بها فيما يتعلق بكيفية استخدامهما.

اطلع على المزيد حول NaN وNone من الدفتر!

  • اكتشاف القيم الفارغة: في pandas، تعتبر طريقتا isnull() وnotnull() الطرق الأساسية لاكتشاف البيانات الفارغة. كلاهما يعيد أقنعة منطقية فوق بياناتك. سنستخدم numpy للقيم NaN:
import numpy as np

example1 = pd.Series([0, np.nan, '', None])
example1.isnull()
0    False
1     True
2    False
3     True
dtype: bool

انظر عن كثب إلى الإخراج. هل أي من ذلك يفاجئك؟ بينما يعتبر 0 فارغًا حسابيًا، إلا أنه لا يزال عددًا صحيحًا صالحًا ويعامله pandas على هذا النحو. '' أكثر دقة قليلاً. بينما استخدمناه في القسم 1 لتمثيل قيمة سلسلة فارغة، إلا أنه لا يزال كائن سلسلة وليس تمثيلًا للفارغ كما يعتبره pandas.

الآن، دعنا نعكس هذا ونستخدم هذه الطرق بطريقة أكثر تشابهًا مع الطريقة التي ستستخدمها في الممارسة. يمكنك استخدام الأقنعة المنطقية مباشرة كمؤشر Series أو DataFrame، مما يمكن أن يكون مفيدًا عند محاولة العمل مع القيم الفارغة (أو الموجودة) المعزولة.

الخلاصة: تنتج طريقتا isnull() وnotnull() نتائج مشابهة عند استخدامهما في DataFrames: تظهر النتائج ومؤشر تلك النتائج، مما سيساعدك بشكل كبير أثناء التعامل مع بياناتك.

  • إزالة القيم الفارغة: بالإضافة إلى تحديد القيم المفقودة، يوفر pandas وسيلة ملائمة لإزالة القيم الفارغة من Series وDataFrames. (خصوصًا في مجموعات البيانات الكبيرة، غالبًا ما يكون من الأفضل ببساطة إزالة القيم المفقودة [NA] من تحليلك بدلاً من التعامل معها بطرق أخرى.) لرؤية هذا عمليًا، دعنا نعود إلى example1:
example1 = example1.dropna()
example1
0    0
2     
dtype: object

لاحظ أن هذا يجب أن يبدو مثل الإخراج الخاص بك من example3[example3.notnull()]. الفرق هنا هو أنه، بدلاً من مجرد الفهرسة على القيم المقنعة، قامت dropna بإزالة تلك القيم المفقودة من Series example1.

نظرًا لأن DataFrames لها بعدان، فإنها توفر المزيد من الخيارات لإسقاط البيانات.

example2 = pd.DataFrame([[1,      np.nan, 7], 
                         [2,      5,      8], 
                         [np.nan, 6,      9]])
example2
0 1 2
0 1.0 NaN 7
1 2.0 5.0 8
2 NaN 6.0 9

(هل لاحظت أن pandas قام بتحويل اثنين من الأعمدة إلى أرقام عائمة لاستيعاب NaNs؟)

لا يمكنك إسقاط قيمة واحدة من DataFrame، لذا عليك إسقاط صفوف أو أعمدة كاملة. اعتمادًا على ما تقوم به، قد ترغب في القيام بأحدهما أو الآخر، لذا يوفر pandas خيارات لكليهما. نظرًا لأن الأعمدة تمثل عادةً المتغيرات والصفوف تمثل الملاحظات في علم البيانات، فمن المرجح أن تقوم بإسقاط صفوف البيانات؛ الإعداد الافتراضي لـ dropna() هو إسقاط جميع الصفوف التي تحتوي على أي قيم فارغة:

example2.dropna()
	0	1	2
1	2.0	5.0	8

إذا لزم الأمر، يمكنك إسقاط قيم NA من الأعمدة. استخدم axis=1 للقيام بذلك:

example2.dropna(axis='columns')
	2
0	7
1	8
2	9

لاحظ أن هذا يمكن أن يسقط الكثير من البيانات التي قد ترغب في الاحتفاظ بها، خصوصًا في مجموعات البيانات الصغيرة. ماذا لو كنت تريد فقط إسقاط الصفوف أو الأعمدة التي تحتوي على عدة أو حتى جميع القيم الفارغة؟ يمكنك تحديد تلك الإعدادات في dropna باستخدام معلمات how وthresh.

بشكل افتراضي، how='any' (إذا كنت ترغب في التحقق بنفسك أو رؤية ما تحتويه الطريقة من معلمات أخرى، قم بتشغيل example4.dropna? في خلية كود). يمكنك بدلاً من ذلك تحديد how='all' لإسقاط الصفوف أو الأعمدة التي تحتوي على جميع القيم الفارغة فقط. دعنا نوسع مثالنا DataFrame لرؤية هذا عمليًا.

example2[3] = np.nan
example2
0 1 2 3
0 1.0 NaN 7 NaN
1 2.0 5.0 8 NaN
2 NaN 6.0 9 NaN

تمنحك معلمة thresh تحكمًا أكثر دقة: تحدد عدد القيم غير الفارغة التي يحتاجها الصف أو العمود ليتم الاحتفاظ به:

example2.dropna(axis='rows', thresh=3)
	0	1	2	3
1	2.0	5.0	8	NaN

هنا، تم إسقاط الصف الأول والأخير، لأنهما يحتويان فقط على قيمتين غير فارغتين.

  • ملء القيم الفارغة: اعتمادًا على مجموعة البيانات الخاصة بك، قد يكون من المنطقي أحيانًا ملء القيم الفارغة بقيم صالحة بدلاً من إسقاطها. يمكنك استخدام isnull للقيام بذلك في المكان، ولكن يمكن أن يكون ذلك مرهقًا، خصوصًا إذا كان لديك الكثير من القيم لملئها. نظرًا لأن هذه مهمة شائعة جدًا في علم البيانات، يوفر pandas fillna، الذي يعيد نسخة من Series أو DataFrame مع استبدال القيم المفقودة بواحدة من اختيارك. دعنا ننشئ مثالًا آخر لـ Series لرؤية كيفية عمل هذا عمليًا.
example3 = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
example3
a    1.0
b    NaN
c    2.0
d    NaN
e    3.0
dtype: float64

يمكنك ملء جميع الإدخالات الفارغة بقيمة واحدة، مثل 0:

example3.fillna(0)
a    1.0
b    0.0
c    2.0
d    0.0
e    3.0
dtype: float64

يمكنك ملء القيم الفارغة للأمام، وهو استخدام القيمة الصالحة الأخيرة لملء الفارغ:

example3.fillna(method='ffill')
a    1.0
b    1.0
c    2.0
d    2.0
e    3.0
dtype: float64

يمكنك أيضًا ملء القيم الفارغة للخلف لنشر القيمة الصالحة التالية للخلف لملء الفارغ:

example3.fillna(method='bfill')
a    1.0
b    2.0
c    2.0
d    3.0
e    3.0
dtype: float64

كما قد تتوقع، يعمل هذا بنفس الطريقة مع DataFrames، ولكن يمكنك أيضًا تحديد axis على طول ملء القيم الفارغة. باستخدام example2 الذي تم استخدامه سابقًا مرة أخرى:

example2.fillna(method='ffill', axis=1)
	0	1	2	3
0	1.0	1.0	7.0	7.0
1	2.0	5.0	8.0	8.0
2	NaN	6.0	9.0	9.0

لاحظ أنه عندما لا تكون هناك قيمة سابقة متاحة للملء الأمامي، تبقى القيمة الفارغة.

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

إزالة البيانات المكررة

هدف التعلم: بنهاية هذا القسم الفرعي، يجب أن تكون قادرًا على تحديد وإزالة القيم المكررة من DataFrames بسهولة.

بالإضافة إلى البيانات المفقودة، ستواجه غالبًا بيانات مكررة في مجموعات البيانات الواقعية. لحسن الحظ، توفر مكتبة pandas وسيلة سهلة لاكتشاف وإزالة الإدخالات المكررة.

  • تحديد التكرارات: duplicated: يمكنك بسهولة تحديد القيم المكررة باستخدام طريقة duplicated في pandas، والتي تُرجع قناعًا منطقيًا يشير إلى ما إذا كان الإدخال في DataFrame مكررًا لإدخال سابق. لنقم بإنشاء مثال آخر لـ DataFrame لرؤية ذلك عمليًا.
example4 = pd.DataFrame({'letters': ['A','B'] * 2 + ['B'],
                         'numbers': [1, 2, 1, 3, 3]})
example4
letters numbers
0 A 1
1 B 2
2 A 1
3 B 3
4 B 3
example4.duplicated()
0    False
1    False
2     True
3    False
4     True
dtype: bool
  • إزالة التكرارات: drop_duplicates: ببساطة تُرجع نسخة من البيانات التي تكون فيها جميع القيم المكررة False:
example4.drop_duplicates()
	letters	numbers
0	A	1
1	B	2
3	B	3

كل من duplicated و drop_duplicates تفترض افتراضيًا النظر في جميع الأعمدة، ولكن يمكنك تحديد أن يتم فحص مجموعة فرعية فقط من الأعمدة في DataFrame الخاص بك:

example4.drop_duplicates(['letters'])
letters	numbers
0	A	1
1	B	2

المعلومة الأساسية: إزالة البيانات المكررة جزء أساسي من كل مشروع علم بيانات تقريبًا. البيانات المكررة يمكن أن تغير نتائج تحليلاتك وتعطيك نتائج غير دقيقة!

🚀 التحدي

جميع المواد التي تمت مناقشتها متوفرة كـ Jupyter Notebook. بالإضافة إلى ذلك، هناك تمارين موجودة بعد كل قسم، جربها!

اختبار ما بعد المحاضرة

المراجعة والدراسة الذاتية

هناك العديد من الطرق لاكتشاف وتحضير بياناتك للتحليل والنمذجة، وتنظيف البيانات خطوة مهمة تتطلب تجربة عملية. جرب هذه التحديات من Kaggle لاستكشاف تقنيات لم يتم تغطيتها في هذا الدرس.

الواجب

تقييم البيانات من نموذج


إخلاء المسؤولية:
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية Co-op Translator. على الرغم من أننا نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.