بسم الله والحمد لله والصلاة والسلام على رسول الله
اليوم إن شاء الله شباب، نبدأ فعليًا تقريبًا بأول شغل
عملي في الـ data mining وهنجوز إيه في الـ data
preparation. ممكن المحاضرة نشوف فيها بعض الأكواد
اليوم، لكن المحاضرة الجاية حتما، يعني لازم نطبق
بعض الأشياء العملية مع بعض، سواء كنا هنشتغل بالـ
Python أو نشتغل بالـ RapidMiner، وهنجرب الاتنين
معاك، وفي بعض الـ slides اليوم هتكون جاهزة عليها
بعض الأكواد الـ Python اللي ممكن تفيدنا، بس من باب
التحفيز للتعامل مع الـ Python، على سبيل
المثال، يا رامي زي ما كنت بتقول، هنبدأ اليوم
محاضرتنا، كل المحاضرات الماضية اللي بنتكلم على الـ
data understanding، وقلنا مفهوم الـ data
understanding، إنه لازم أنا أكون فاهم الـ data اللي
عندي، أو familiar مع الـ data اللي عندي بشكل كويس
بحيث إنه كل ما أنا فهمت الـ data، بقدر أفهم إيش الـ
task اللي بدي إياها، بقدر أفهم أُحوِّر الـ data بحيث
أنا أُصبح متوافق مع الـ task اللي أنا بدي أروح لها، وكنا
بنطرح على حالنا مجموعة من الأسئلة، كان أهمها: هل الـ
data هذه relevant للـ topic ولا لأ؟ هل الـ data هذه
كافية، من أجل enough أو كافية من أجل إن أبني عليها
model ولا لأ؟ هل في مصادر أخرى للبيانات ممكن
تدعمني في هذا الاتجاه؟ هل الـ data هذه حقيقية ولا
صناعية؟ هل الـ data هذه مناسبة... بس كمان بتحل
المشكلة ولا بتحل الـ hash؟ قديمة ولا جديدة؟ فكل
الشغلات هذه كانت تتجه باتجاه واحد فقط، أني أكون
familiar مع البيانات اللي موجودة عندي، بعد ما احنا
وكنا طلبنا نهاية المحاضرة الماضية أن كل واحد فيكم
أو كل مجموعة، كل مجموعة تحدد two datasets، واحدة for
regression، واحدة for الـ classification، وكنا
زودناكم بـ examples، بعض الـ URLs اللي ممكن توجد منها
خلالها Data Sets، دلوقتي في Data Sets في الـ Open
Data Sets، في Google Open Data Sets، في شغلات كتيرة
في أي مكان، ممكن تختار الـ Data Set اللي موجودة، و
بقى ذكرنا، لازم تشكل مجموعة أو تنضم لمجموعة، بعد هي
كانت حصيلة الشغل جماعيًا، الـ data wrangling، عفواً، أو الـ
preprocessing، أو الـ data preparation زي ما بسميها
البعض، أن هو فعليًا أول خطوة على الـ real data، أنا
جبت الـ data set، سواء كانت text file أو data file
أو csv file أو excel file، بغض النظر إيش كانت
أصبحت الـ data هذه موجودة، وبالتالي بالنسبة لي الـ
data هذه غالباً هي عبارة عن الـ raw format، شو يعني
Raw Format؟ خام، بالنسبة لي في اللحظة اللي أنا بقول
إنه الجدول هذا أو الـ csv file هذا ما يحتاج... الآن
لا يحتاج أي شغل، بتصير الـ data هذه جاهزة أن أبني
عليها data mining task، تمام؟ وهذا الكلام ما يتم
إلا بعد بعض فحص، أو إجراء بعض التعديلات على
البيانات اللي موجودة عندي، من بعض الشغلات الخام،
يا عم، اللي أنا بتكلم عليها، لو كانت الـ data set
هي عبارة عن مجموعة من الصور، على سبيل المثال، طبيب
عظام قرر إنه بده يحاول يستخدم الـ data science
أو الـ data mining، وقال لك والله أنا بدي أعمل
برنامج، أديله صورة الأشعة، تمام؟ يبدأ هو يدور عن الـ
possible fractures الموجودة، سواء كان بلغتنا
البسيطة كسر واضح، أو شعر مش مبين، يعني بدي أبني
smart system عشان يحدد لي الـ fractures اللي ممكن
يصير في العظم، ممتاز، إيش الـ data تبعته؟ بيقول لي
والله أنا محتفظ بـ 100 ألف صورة أشعة، تمام؟ X-rays
موجودة لهذا المجال، وكلها... كلها شخصيًا بدي أحط
عليها label، هذه فيها كسر وبحدد لك مكانه، وهذه
فيها شعر وبحدد لك مكانه، عشان الـ system تبعته الآن
الـ raw data تبعته هي صور الأشعة، هاي طيب ماشي حاله،
بدنا special scanner، عملنا لها scanning ودخلناها
على الـ system، raw data، ما زالت في اللحظة اللي
بتقدر تحول الصورة هذه لجدول، لجداول تقدر تشتغل
تشتغل عليها mining، بتكون أنت فعليًا رحت باتجاه الـ
task الصحيحة، وخلصت من الـ raw data ووصلت لوين؟
للقيمة أو للـ value اللي أنت بدك إياها، مثل تمامًا
المنقبين عن البترول، لأن هو أخذ، وصل لبئر النفط أو
حصل على البترول، لكن هذا البترول، أو هذا البترول
الخام غير مناسب للناس، فماذا يفعل؟
بتدخلوا على مصانع التكرير عشان يصدر منه البنزين
والسولار إلى آخره، وبالتالي أنا بدي أروح الـ road
بحيث أنها تصبح suitable، أعالجها بحيث أنها تصبح
suitable للـ task أو للـ analysis اللي أنا بدي أشتغل
عليه، طبعًا الآن لما بتكلم على الـ data preparation،
عادة هي عبارة عن software by-blind، أو coding by
-blind، شو يعني by-blind يا شباب؟ خط... خط إنتاج
method، بتروح بتدور على الـ missing data وبتعالجها،
method ثانية، أو data ثانية بتعالج الـ inconsistent
data، ثالثة بتعالج مثلًا الـ noise data، وكل مخرج يعني
الآن بدخل الـ raw data للـ missing، الـ output تبع الـ
missing بروح بعده وبدخله عليه as input للـ noise
data، والـ noise data بتروح للـ inconsistent بعد
معالجتها، طبعًا، وبهيك كل مرحلة لحد ما بوصل لوين في
الآخر، أن الـ data هذه مناسبة، أصبحت صالحة للـ task
اللي أنا بدي أشتغل فيها، وبالتالي هذا بيقول إن الناس
اللي بدأت تشتغل في الـ data science أو في الـ data
preparation أو الـ data preprocessing أو الـ data
wrangling، لازم يتمتع بمجموعة من الصفات اللي لها
علاقة بالإحصاء، على سبيل المثال، ليش؟ لأن أنت بدك
تتعرف على البيانات، بدك
skills زي ما قلنا سابقًا، multidisciplinary
الـ course تبع الـ data mining، بدك statistic، بدك
database، بدك programming، وكل الـ skills هذه بتخدمك
في موضوع الـ preparation بالدرجة الأولى، طيب
بما أنه إحنا حاليًا، هنحتاج شغل، ونقول programming،
ونتكلم على pipeline بالـ Python، قلت لك أنا حاطط لك
روابط تنزل الـ Anaconda، مين نزلها شباب على جهازه؟ واحد
اثنين، ثلاثة، أربعة، خمسة، ستة، سبعة، ثمانية، تسعة، أنتم
ملاحظين يا شباب أن المادة ما فيهاش معمل، نزل الـ
Python Anaconda distribution أو الـ Spyder Anaconda
distribution على جهازك عشان تبدأ تشتغل، ليش أنا
قلت لك نزله؟ هيريحك من كل المكتبات، وينزلها لك حزمة
واحدة، بينما لو بدك تشتغل بالـ PyCharm، هتضطر تنزل الـ
libraries واحدة ورا الثانية، فأنت رايح ترهق نفسك وتشتغل
على الـ distribution جاهزة، بتريحك على الأقل في
موضوع الـ installation
هي IDE شاملة المكتبات كلها تبع الـ data science،
وبالتالي بدل ما أنا أروح أحول الـ IDE تبع الـ by
charm، تمام، عشان يسموها data science distribution،
أحيانًا بسموها، الآن بدل ما أروح أنا أنزل المكتبات
واحدة ورا الثانية، هو كل المكتبات جاهزة ضمن الـ
setup file اللي بنزله، وبالتالي مش هعمل download من
الـ internet لأي شيء، الآن، طبعًا المهم، إذا ما أقول إن
إحنا ممكن نستخدم الـ Python، وهذه لغة برمجة مهمة
جداً، ليش مع الـ Java؟ ما بدي الـ Java، الـ support إلها
أكثر، وهنشوف الآن بعض الشغلات، فعليًا أسهل مليون مرة
ما كنت أنا بدي أشتغلها وين؟ بالـ Java، وهعطيك مثال،
الآن، مثال بسيط جداً، المكتبات اللي بتلزمني في الـ
Python، إذا أنا بدي أشتغل على الـ PyCharm، معناته
ملزمني الـ NumPy، الـ numerical arrays في الـ Python،
وبالـ Pandas، اللي هي عبارة عن data framework،
من أجل أن أعمل store و retrieve للـ data، وأطبق
عليها بعض الـ methods الجاهزة اللي لها علاقة في الـ
preparation، من الشغلات البسيطة اللي ممكن تكون
motivation كويسة بالنسبة لنا جميعًا، كيف التعامل مع
الـ Python، لو أنا أجيت قلت لك في عندي two
dimensional array
ثلاثة في ثلاثة، وبده منها تاخد لي الصف أو العمود
الأخير لحاله كـ one dimensional array، إيش الـ code
اللي ممكن تكتبه به جافر؟ بتروح تعرف الـ array one
dimensional، هتقول له integer، الـ array تبعته A مثلًا، و
تقول له يا أخي إن هذا اسمها X، بدها تساوي new integer
ثلاثة، صح؟ بعدين هتروح تقول له for integer I equal
zero، الـ I أقل من أو تساوي اثنين، I plus plus، A of I
equal X of اثنين، إيه؟ قد إيش هي؟ I، اثنين، مصبوط؟
بالـ Python بكل بساطة باجي بقول له a تساوي x
أو
حتى ممكن هذا مكتوب هيك، بس يبقى لا for
ولا حاجة، الفكرة وين يا شباب؟ إنه فعليًا من ناحية
simplicity، أسهل، وهي فرصة... فرصة لك تتعلم لغة
جديدة، الـ for هي الـ for، والـ F هي الـ F، نفس الـ
concept بس الـ syntax هو شوية اللي هيخلف... يخلف
معك، الآن، هذا الآن في الشغلات زي هاي، الـ
Python بتريحك جدًا في الكتابة، هاي، هذا الثلاث أسطر هي
عبارة عن سطر واحد فعليًا، لا أنا محدد نوع بيانات،
ولا أنا محدد نوع الـ for، بس اللي بيلزمني أحدد
أبعاد العمود اللي أنا بدي إياه، و لحاله بيشتغل الشغلة
الثانية، ممكن أنا الآن، هل في مجال يكون في عندي
تسميات للـ
attributes اللي موجودة عندي؟ لأ، ما في مجال مع الـ
Pandas، بصير في مجال أضيف تسمية للـ array أو للـ
data set، وبصير بروح بقول له أن الـ A equal X of T
ثلاثة، وخلصت، وبالتالي فيها شغل أسهل بكثير من الـ
Java وغيرها، إيه؟ هنشوف بعض الأكواد اللي برضه بسهولة
اللي هنفهمها برضه خلال المحاضرة هذه إن شاء الله،
تعال طيب، ننتقل لطريق الـ libraries اللي في
عينينا، بتلزمني في الـ data preparation بالدرجة
الأولى، تعال، أخد مثال بسيط في الـ code اللي موجود
قدامنا، الـ code اللي موجود قدامنا، عمل import للـ
Pandas، وروح
اعرف الـ Pandas، هي عبارة عن data framework للتعامل
واحدة من الاقتراحات تبعها، أني ممكن أنشئ جدول
جديد، أنشئ جدول جديد، فروح قلت له الـ Pandas dot data
framework، وزودت الـ data framework الـ constructor بـ
...بإيش يا شباب؟
(Long pause)
الـ values تبعته، تمام، الـ index هي optional،
بالنسبة لنا، بنضيفها بعد الـ json عشان أقول له والله
فعلاً هي الـ items أو هي الـ index اللي أنا بدي أشتغل
معها، بغض النظر، هتفرق كتير، الآن لو أنا أقول
dictionary، كم واحد هيقول okay معك، موافق معك، بس 174
maximum و كم عدد الفرغات؟ بصير عارف أني بدي
أشتغل، طبعًا بإمكانك تعمل loop تمر على الـ titles
اللي هنا و تعمل description بشكل آلي، ما تكتب كل
واحد بشكل تلقائي. طيب، هذا الكلام أو هذه الـ slides ما
جبتها إلا من باب الـ motivation لك، أن الـ
python سهل و ممكن تعملها أو تكتبها، تعملها concord
ده أو تحتويها بشكل كويس خلال الفصل هذا، الـ rapid
minor خيار هنشوفه، هنشتغل عليه، لكن أنا بالنسبة لي
قد أعطي plus للي هيشتغل الـ python، وللي مش هيشتغل
الـ python هياخد minus
ممكن تحتوي على بعض الـ missing، الـ inconsistent، والـ
noise data الآن يا جماعة، noise data شو يعني؟ أخذناها
سابقا. اكتب اسمك هنا، و سجل جوابك، تمام؟ نقاش يعني
noise data يعني data فيها أشياء ممكن ما تفيدنيش، أو
فيها أشياء خاطئة. فيها أشياء خاطئة، صح؟ بس فيها data
ما تفيدنيش، مش صح. اكتب اسمك، عفوا، تمام؟ الآن noise
data يعني لو أنا فيه عندي قيم أو فيه عندي أخطاء في
القيم المدخلة، مثل الراتب بالسالب، تمام؟ طيب، عبدالله
صحي. محمد الكحلوت من جنبك، وقول لي شو يعني
inconsistent data؟ مش عارف، لأنك ما بتراجعش. لأ، ما بديش
إياك. أنت يا تامر، آه، يوسف، شو يعني inconsistent
data؟
محمود أبو حية. محمود، صح؟ محمد أبو حية، محمود
أبو حية. محمود أبو حية. محمود أبو حية. محمود أبو حية
محمود أبو حية. محمود أبو حية. محمود أبو حية. محمود
أبو حية. محمود أبو حية. محمود أبو حية. محمود أبو حية
محمود أبو حية. محمود أبو حية. محمود أبو حية. مثلًا،
تاريخ ميلاده مبارح، هو في الـ Age مكتوب لـ 40 سنة،
تمام؟ Missing Data. هذه كلكم هتجاوبوها طبعًا، فضل.
Data مفقودة، إنه فعليًا الـAttribute هذا في
الـRecord هذا، الـValue تبعته فاضية، مش موجودة عندي.
وبالتالي، أنا لازم أقول، قلنا سابقًا كان عندنا
مصطلح Garbage In، Garbage Out. وبالتالي الـData
Quality شيء أساسي في الـData Mining. جودة البيانات
شيء أساسي في الـ Data Mining. وبالتالي، إذا أنت
فعليًا بدأت تشتغل، وجدت في الموضوع الـ Data
Preparation عبارة عن خطوة مهمة للـ Serious والـ
Effective والـ Real Data Mining Process. إيش علامات
جودة؟ .. علامات جودة الـ Data Set اللي موجودة عندي؟
تقريبًا هي نفس الأسئلة اللي كنا بنطرحها سابقًا، عشان
تصحيح الـ data، الـ accuracy. قد ايش الـ data تبعتي هذه
دقيقة؟ قد ايش الـ data تبعتي صحيحة؟ هي، كل ما
كانت نسبة دقتها أعلى، كل ما كانت هذه أفضل، طبعًا.
مصدرها؟ مصدرها يعني، بنسأل الآن، الـ data اللي
فيها الـ values، أنت بتقدر تتحقق من كل record Raw by
Raw؟ أكيد لأ، لكن لما أنا بأعرف أن الـ data set هاي
طالعة مثلًا من الـ MIT، على رأي رامي، تمام؟ ولا طالعة
من جامعة إياد الشامي؟ لأ، أكيد اللي طالعة من الـ MIT،
من الـ MIT، مصدق؟ شكرًا، شكرًا على الثقة يا هاشم،
الآن، الفكرة وين يا جماعة الخير؟ الفكرة أنه مش كمان
تشوف الـ source، اللي هي الـ believability، قد ايش أنا
بوثق فيها، في مصدرها، لكن الآن، بتكلم على جودة
البيانات. جودة البيانات، عادةً، مش أنا صاحبها، الـ data
لما انجمعت، كانت صحيحة. لما انجمعت، آه، صح، بأثق في
المصدر، لكن قد ايش ممكن المصدر هذا يخطئ في الإدخال؟
قد ايش الـ instrument اللي كنت أنا بأعتمد عليها في
القراءات دقيقة؟ بلاش نتكلم على مصدرها، أنا والله
واثق أن اللي جاييني من الـ MIT تمام، لكن كانوا
مسترخصين، و اخذين بعض الـ sensors من Taiwan، بينما في
sensors أوضح منها، وبالتالي، الـ data set اللي بيصير
فيها علامة استفهام، لأن بعض الـ equipments تبعتها في
الـ range تبعت الـ error تبعتها عالية. هذه المقصودة
بالـ Accuracy، على خلاف الـ Believability. قد ايش أنا
واثق من مصدر البيانات، وفي البيانات اللي موجودة
عندي. هلاحظ كمان مرة، أنا ما زلت بأتكلم على عوامل
إنّه كيف بدي، أو بدي أحاول أشكّ، كيف بدي أقيس جودة
أو إيش هي علامات جودة الـ data set؟ يعني لو قلنا لك
في تفاحة، وقلنا شو رأيك فيها؟ جودة التفاحة هاي، قد ايش
عبدالله؟ هي عبدالله، أيوة عبدالله، بناء على إيش؟
بتطلع فيها، الله، التفاحة مبينة، جديدة، وطازة، وبتلمّع،
تمام؟ هاي واحد، ريحتها فواحة، ما فيش فيها لا ضرب
يمين ولا شمال، ولا محمد عضّها، مصدق؟ وبالأخير، في
الأخير، هاي العلامات، أنت بعينك بتقدر تحددها، طيب،
الآن completeness، قد ايش الـ data هاي كاملة، وبحيث
أنها توافق الـ task اللي أنا بدي إياها؟ سألنا سابقًا
على الـ different sources، والـ relevant، ومن الـ
expert. ليش؟ عشان أنا أكون متأكد أن الـ data الـ 6
تبعتي هاي فعليًا بتنجز. الـ consistency، الـ consistency
قد ايش الـ data هاي consistent؟ ما هو، لما اتكلمنا
في الـ consistency، أنه ما هو المفهوم، أن أعدّل في
مكان، ومقنوط من التعديل في مكان ثاني، بس ما عدّلتش فيه،
فبتصير inconsistent. values الموجودة اللي عندي،
timeline is .. هاي شغلة مهمة يا جماعة الخير، عشان
يقول لي أن الـ data .. الـ data set اللي موجودة عندي
هل بتحل المشكلة اللي أنا بأشتغل عليها ولا لأ؟ يعني
أنا بدي أحاول أعمل prediction. ما هو، إذا حطيت الـ
mail، معناته هتصير أنك عندك .. في عندك مشكلة في الـ
consistency. مصدق؟ لأ، خلينا .. احنا عمّال بدنا
نصلّح، مش اللي بنخبص، تمام؟ وبالتالي، الـ data must be
inferred. إيش الحلول المتاحة قدامي في التعامل مع الـ
missing data؟ الآن، الـ missing، سواء كانت في one
value أو في two values في الـ record، تمام؟ في الآخر،
الـ record هذا فيه missing. لكن سؤال مهم جدًا، هل ممكن
كل الـ record يكون missing؟ بكونش موجود أساسًا،
فعلى الأقل الـ record بيكون فيه one value، والباقي
ممكن يكون null، مصدق؟ حسب المصدر. ففي الآخر، بغضّ
النظر، كان فيه عنده one value، one missing value or
more. فهذا الـ record بيحتوي على missing، أو هذا الـ
attribute الآن صار بيحتوي على missing. أسلم حل، أن
أحذف الـ rows اللي بتحتوي على الـ missing، وأريح حل،
تمام.
عشان أنا بدي أحط حلول صحيحة، وبدي أجيب value صحيحة،
عشان أحصل الحل صح، أو عفواً، أصلّح حل صح. الآن، لو كانت
الـ data اللي عندي 100 ألف row، وبعد عملية الحذف،
بعد عملية الحذف، صارت اللي هي 95 ألف row. أنا
بالنسبة لي، مش فارق كبير، مش big deal، مش زعلان كثير،
أقول لك، لو صارت 50 ألف، برضه بالنسبة لي مش كتير، لأن
الـ data لسة still enough، يعني فيها كم .. لأ، بقى
ممكن أستخرج منه، لكن لو ضليت حافظ على الـ 100 ألف،
أحسن وأحسن.
لأن احنا اتكلمنا سابقًا، how much big is your data؟
كده، حجم البيانات اللي عندك؟ لأن كل row بمثابة
تعزيز للـ pattern، أو تعزيز للـ knowledge اللي أنا
بدأ أستخرجها، لكن في المقابل، اللي كانوا عندي ألف
record، صاروا تسعمية وخمسين، acceptable، لكن صاروا
خمسمية، لا يعني، وقف. على الرغم أن هذا نص وهذا نص، 50
ألف، نص، 50%، بس العدد بيفرق معي، 500 row is not
enough to train or to build a model، في معظم
الأحيان. طيب، مش الحل، بدك تجيب data set ثاني، لو
متوفرة؟ طيب، مش متوفرة، غير الألف هدول، بدي أبدأ
أعبي الـ missing data، بدي أبدأ أعبي الـ missing data
اللي موجودة عندهم. كيف بدي أعبيها؟ manually، بشكل
manual، يعني بدي أمر على كل row، أو كل عمود، row by
row، وأعبي الـ value اللي فيه. ممكن
شباب، الـ manual filling لا يعني بالضرورة أن أنا 100
% صح، تمام؟ أنا خارجة، لما بدي أتكلم على الـ manual
filling، بدي أروح أقول له، أين الـ document الأصلية
تبعتك اللي اعتمدتها، أو وين ممكن أجيء القيمة هذه،
ففي جهود، لكن مش .. ولو أنا رجعت للـ guessing، في
موضوع الـ guessing، الأصل يكون .. يعني لما بدي أخمن،
بدي، هتكون الـ value تبقى .. بدي تكون فيه confident،
يعني لما قلنا قبل شوية، متزوج، أو الـ status، الـ
marital status، متزوج، married، وفي pregnant، و
مفقود عند الـ gender، ما فهمش .. ما فيش، عاجلين، إثنين
بيختلفوا على إنه دي female، مصدق؟ وبالتالي، هذا
الكلام في هذه الشغلات، بيصير الـ guessing. محمود، الآن،
باجي أقول أن والله، الطلاب اللي موجودين عندي في
المدرسة، أعمارهم تتراوح من عشرة إلى ثلاث عشر سنة، وأجيء
الطالب عمره مش موجود، وتاريخ ميلاده مش موجود. لو
حذفته، تمام؟ احنا الآن خلصنا من موضوع الحذف، بدي أملأ
الـ data، بدي أملأ الـ data، إيش، أعبيها؟ لو حطيتها 12
بالمتوسط، بيمشي الحال، أثبت؟ هاي الـ guessing، ممكن
لو أنا شوفت عمر الولد، أو أروح أسأله، فلان، أنت في
أي صف؟ طلع فيك هيك، جاك في صف سادس،
ماشي، مصدق ولا لأ؟ إذا أنت حاسس أنه والله ممكن
الطالب هذا يكون مثلًا، أعاد سنة أو سنتين، فممكن تحطه
في بناء .. خلاص، بتصير happy guessing، محمود، وهذا
الكلام يصير تمام، لكن
عملية التعبئة الـ manual، أو التعبئة اليدوية للقيم
المفقودة، مملة وغير مشوقة، خلينا نشوف إيش غير مشوقة؟
لأنه مكلفة، مقارنة بالجهد اللي هيصير. مش مشوقة،
كثير. automatic، برمجيًا، برمجيًا، الخيارات اللي قدامي،
أن أروح على كل الـ missing، وأحط فيها global
constant. شو يعني global constant؟ أي رمز، بحيث أن
الرمز هذا يصير unknown.
بأعرف إنها missing، وفي نفس الوقت، لو بدّي أنبنى
عليها decision لاحقًا، في حالة الـ unknown بيكون كذا،
على سبيل المثال، if كذا، else if كذا، else if كذا، طيب،
الـ else الأخيرة، لو ما كانت ولا واحدة من هدول، في
حالة الـ switch case، case، case كذا، في الآخر بحط له
default، لو ما كانتش ولا واحدة من هدول، بصير بقول له أنا
في حالة الـ unknown. ممكن أخد decision، تمام؟ هذه ميزة،
أو أهمية للـ global constant، لكنه مش مفضل برضه، ليش؟
لأن كل ما كانت الـ rule تبعتي مبنية على fixed value،
يكون أحسن. كنت بقى تقول حاجة، جوابت عليك؟ ماشي الحال.
ممكن أعبيها automatic بالـ mean أو الـ median، 389 00:29:14,01
الشخص مريض أو غير مريض ربح ولا خسر، مظبوط؟ مش عارف
وبالتالي في حالة زي هذه أروح بحذف الـ record اللي
مافيش Target لأن نسبة الخطأ بهذه الحالة ستكون أكبر
واحد. الآن بما أن الحذف هو الحل الأمثل بالنسبة لي
الحل الأمثل، فأنا ممكن أروح أُحدد الـ rows الـ raw
اللي أنا بدي أحذفه، مثلاً بدي أحذف الـ raw رقم
واحد، اثنين، ثلاثة، أربعة، خمسة، ستة، سبعة. هاروح أقول له
بكل بساطة الـ dataset تبعتي .drop، بدي أعطيه الـ
index تبع الـ row اللي هي، هنقول مثلاً أربعة أربعة
in place = True، لأنه إذا أنا قلت له False
هذا يعني أني أنا بحاجة لـ dataset جديد، بيصير كذا
لأنه سيقوم بإنشاء dataset جديد بعد الحذف، إذا
أنا قلت له in place، سيحدث التغيير على نفس الـ dataset
اللي إحنا شغالين عليها، تمام؟ هذا الفرق بين
الـ True والـ False. الـ axis عشان يقول لي أنت بدك
تحذف من الصفوف أم من الأعمدة. طيب تعالَ نأخذ
مثال. هذه الـ dataset تبعتنا، وليكن اسم هذه الـ dataset
اسمها data، وأنا قررت أحذف row أو أحذف
عمود. هذا الـ code سيقوم بتغيير الـ argument، ويقوم بحذف الصف
أو العمود. لو أنا بدي أعمله بـ Java، أو بدك تقوم
ببرنامج لحذف في العمود أو الصف، بدك تعمل for loop و
بدك تعرف الـ array بـ dimension أقل، مظبوط؟ سواء كان
dimension أو بتعرف الصف أو العمود أقل، وبالتالي بدك
تُسير وتأخذ وتنقل من array لـ array، ولما تصل لـ
certain row أو الـ certain attribute، تعمله ignore
وتأخذ اللي بعده، مظبوط؟ بينما هذا سطر واحد
فقد حَلّ المشكلة. الفكرة أنك تروح تعمل
implementation للشغل من الصفر، بس فعلياً أنت الآن
أنتَ، كـ user أو كـ developer، لما أعرف أن الآن في
حدّ فيكم بيروح بيعمل implementation لـ power
method بـ Java، بيروح بيقول ولا بيستخدم الموجود
power. طيب ما إحنا بنعرف كيف نعملها implementation، بس
ما نستخدمهاش، ليش؟ لأنها جاهزة، نفس الـ complexity، صحيح، بس
من ناحية أني أنا كـ developer، صارت أسهل في الاستخدام
طيب، فأنا ممكن أُحدث صفّاً أو عموداً حسب حاجتي، مع تغيير
الـ axis. إذا أنا بدي أحدث الـ attribute، لو لاقيت فيه
Null، certain attribute، وليه يكون الـ label على سبيل
المثال، أو الـ A أو الـ B، بدي أحدث، يعني إذا مجرد
ما ألاقي فراغ في العمود هذا، بدي أحذفه. قلنا هذا
أكثر شيء مهم مع الـ label، بما أن الـ label هذا
موجود، مش... عفواً... الـ label هذا مفقود، فالـ row
هذا بدي أحذفه، يعني ببساطة بدي أحذف الـ rows اللي
فيها الـ label مفقود. بدي أحذف الـ rows اللي فيها الـ
label مفقود. يعني ببساطة، الحذف سيكون تبع للـ Null
في certain attribute. كل اللي بيلزم أعرفه، إيش الـ
title أو إيش الـ index تبعته. فبقول له الـ data
dataset.notnull. هنا إيش... إيش اللي صار فعلياً هنا؟
هو أخذ نسخة من الـ data اللي إلها قيم
وتجاهل الـ Null. يعني ببساطة، هو راح يقوم بـ
generation لـ new dataset، فيها واحد، اثنين،
ثلاثة، أربعة، خمسة، ستة، six rows فقط. بس الآن، لما
يكون أني أنا استخدمت نفس الـ dataframe name
فأحطه، أعمل override، تمام؟ بس الأصل أنه سيقوم بـ
generation لـ new dataset. وهيك أنا خلصت من الـ rows
اللي مافيهاش label. إذا أنا وين ما ألاقي في الصف
Null، بغض النظر، في كل الـ data الستة تبعتي، وين ما
ألاقي Null، بدي أحذف الـ row. بيلجأ للـ command
الأخير، data.dropna. مش بروح بساوي
بيصير يعمل scanning على الـ rows، الـ rows، الـ row
اللي فيه Null، بيحذفه، بدون ما أُحدد هنا. كان بناءً على
certain attribute، أخذ اللي فيهم الـ data و ساب
الـ Null. لكن هنا، سيمرّ على الـ row، كلها، هي الـ
row الأول فيه Null، بغض النظر في أي مكان، سيحذفه
وبالتالي هذا سيحذف، وهذا سيحذف، وهذا سيحذف.
شو صار في الـ dataset كلها؟ الحدث قد فرّغ الـ data
set اللي أنا عملت لها sample. عشان هيك هذا كويس ومريح
بس متى مباشرة أروح أقول له print، print data.
shape، هيقول لي مثلاً 100 ألف record و 15 attribute
بعد ما أكون نفّذت العملية هذه، أروح أقول له print كمان
مرة، الـ data.shape، هيديني
رقم، جالي خمسة آلاف وخمسة عشر. لا يا عمي، خلاص، ما هي
already أنا حلّيتها في الـ data set الجديدة، فالفكرة بتصير
أقدر أفهم أنا قد ايش حجم الجزء اللي انحذف، وهذا
بالنسبة لي أريح. عملية الحذف، لو أنا فعلياً حافظت على
البيانات... خلّيني أقول نسبة وجود البيانات بشكل كويس
يعني زي ما قلنا سابقاً، كانت مئة ألف، وقال لي
صار في عندك خمسين ألف record، okay، ممكن أمشي فيها
لكن إذا قال لي والله ظلّ... ظلّ عندك خمسة وتسعون
ألف، يكون أحسن وأحسن. لكن قال لي خمسة آلاف، لا، يعني هذه
العملية ما بتنفعش، لازم أعمل refill أو Alternative
وبالتالي، أسهل حاجة إيش أسوي؟ أسهل حاجة، الحدث، بس
ما يكونش بأثر على حجم الـ dataset اللي عندك، تخزين
البيانات، بشكل manual أو
بدي أعبي الـ missing هذه بشكل manual، بشكل manual، okay.
معناته أنا بدي أعرف الـ attribute هذا، أو عفواً، الـ
value هذه، في أي صف وأي عمود، بدي أعرف الـ index
تبعتها. ممكن أنا أكتب code عشان يعبيها، وممكن أكون
أفتح الـ dataset من خلال الـ Excel sheet تبعتي، و
أروح أعدلها بشكل مباشر، وأعمل reload للـ data، لكن
إذا بتعتمد على الـ index، في عندي index location 9,2.
الصف التاسع، العمود الثاني، حط الـ value بالشكل هذا.
إذا أنا بدي أحطها بالـ mean، أو بدي أخزن الـ value
automatically بالـ mean أو الـ median، الأمر بسيط جداً،
الآن الـ dataset تبعتي مع
الـ attribute، أو الـ data مع الـ attribute، مع A1 شو
بدها تساوي؟ نفس الـ attribute A1
.fillna. شو يعني fillna؟ في الـ attribute
الفلاني اللي هو أي واحد، عبي الـ not available بـ
certain value. لو أنا قلت له 15 أو 10، سيأخذ الـ
15 والـ 10، سيعبيها في كل الـ attribute، عفواً، في
كل الـ rows الفاضية في الـ attribute هذا. في الـ not
available. لكن أنا بدي إياه يروح يحسب للمتوسط تبع
العمود هذا. فبروح بأخذ الـ data كمان مرة، الـ A1 ضد الـ
mean as a function، أو
ممكن آخذ الـ mean هذه as a value سابقاً وأعطيه إياها
فمش فارق كتير معي. وبهيك أصبحت أنا بأخذ الـ mean
تبع الـ values اللي موجودة. طبعاً ممكن بكل بساطة
أستبدلها بالـ median، بالـ maximum، بالـ most frequent
أحياناً حسب حاجتي، وطبعاً كلّه لما بتكلم على الـ
minimum، والـ maximum، والـ median، والـ frequent
كلها عبارة عن method، function جاهزة، ما عليك إلا
أن تستبدل، وتشوف الـ function المناسبة لك. الـ noisy
data بالنسبة
للـ noisy data. إحنا متفقين أن الـ noisy data يعني الـ
data موجودة، مش مفقودة، لكن الـ data خاطئة، الـ data
خاطئة. والأسباب تقريباً نفس الأسباب السابقة، ممكن الـ
system، أو أثناء الـ data collection، أصبح في عندي
error معين، في الآلة، في الـ thermometer، أو في الـ
data entry، أصبح في عندي مشكلة، يعني في لحظة من
اللحظات، كان في عندي الميزان، طلعت على الميزان اللي
هو بالعادة بيقول 200 كيلو. طبعاً، نطيت، جربت، شرحت
الجاكيت، وطلعت ثانيةً على الميزان، قال لي 91 مثلاً.
آه، هي inconsistent. طب، القراءات اللي كانت في الأول إيش
سببها؟ الجاكيت، ومش عارف قد ايش كيلو الجاكيت
نشارك الله ما شاء الله عليك، أو ممكن كان فيها 100
ألف دولار الجاكيت، تمام؟
ممكن يكون صار في عندي، أثناء الـ data transmission، نقل
البيانات عبر الشبكة، صار في عندي تغيير بسيط، ممكن
يؤثر. برضه الـ technology limitation، أحياناً بتكون
الـ value اللي بده تنقرأ هذه، أكبر من... يعني تخيّل
أنه أنا فعلياً قيمة، عاملها variable integer بـ
Java، والقيمة اللي اجت أكبر، تمام؟ فوق الأربع
مليار، أو long integer، فشو بيصير فيها؟ بيجيب
لأخر قيمة من السالب... من السالب. طب المفروض
ما تكونش القيمة سالبة. inconsistent naming
convention. المعاني أو في التسميات، صار في عندي عدم
أو في تضارب، خلّنا نقول، في التفسير اللي موجود عندها
طبعاً، الـ duplicate record يا شباب، أحياناً برضه بدها
معالجة، كنوع من الأخطاء اللي موجودة عندها. كيف بدنا
نعالج الـ noisy data؟ معالجة الـ noisy data، إما بطريقة
بيسموها الـ binning، أو الـ regression، clustering، أو
فعلياً، بتعمل... وهدول طبعاً كلها أدوات أو ممكن
algorithms، وممكن أن أدخل الـ computer أو الآلة مع
الإنسان. بالنسبة للـ binning، بالنسبة
للـ binning. الـ binning مفهومها أنه سأذهب لـ
الـ attribute هذا، آخذ الـ values تبع الـ attribute اللي
عندي هنا، أرتبها، رقم واحد، أرتبها، وبعدين أروح
أُجسمها لفئات. تعالَ نشوف، عفواً، في موضوع البناء، فالآن
هذه الـ data اللي قدامي، هي عبارة عن sorted data، بدي
أكتبها بشكل مختلف. هي مثلاً: خمسة عشر، أربعة، تسعة، واحد
وعشرين، أربعة وعشرين، ثمانية وعشرين، ثمانية، خمسة عشر
موجودة. إحنا قلنا خمسة وعشرين، وكمان مرة: 21، 26، و34.
هذه الـ values الموجودة عندي، هي الـ data، هيك جاية
الـ sequence، بالـ sequence هذا، في الـ attribute. أول
خطوة في موضوع الـ binning، بتعمل sort، رتبتهم تصاعدياً
فرتبنا الـ data. الآن، بالنسبة للـ binning يا شباب
بإمكانك تشتغل على الـ equal frequency، يعني تكون كل
مجموعة نفس العدد، أو تشتغل على الـ equal depth زي ما
صار في الـ histogram، تمام؟ بتصير تحدد range، وتُعِب كل
الـ values اللي بتجي وين؟ في الـ range هذا. بينما
بالـ equal frequency، معناته كل range له نفس العدد
من الـ elements. كل value... range له نفس العدد من
الـ elements، فبُجسمهم بالتساوي. الآن، هنا في كلام بسيط
لازم تفهمه. أنا بدي أحاول أتخلص من الـ noisy data أو
قيمة خاطئة، تمام؟ أنا فعلياً، القيمة الخاطئة هذا، مش قادر
أمسكها لحدّ اللحظة، أنا مش عارف هي الأربعة ولا
الأولى كان 9 المتوسط الحسابي للمجموعة الثانية 23
المتوسط الحسابي للمجموعة الثالثة 29 إيش حصل أنا
بعد ذلك يا شباب الـ data هذه هترجع لأصلها، الـ 15 كان
في المجموعة الأولى، صح؟ صار مكانه 9، الأربعة في
المجموعة الأولى 9، 9، 21 كانت في المجموعة الثانية
صارت 23، 28 كانت في المجموعة الثالثة صارت 29
ثمانية في المجموعة الأولى، تسعة، خمسة وعشرون في
المجموعة الثانية، ثلاثة وعشرون، الواحد والعشرون
ثلاثة وعشرون، ستة وعشرون في المجموعة الثانية صارت
تسعة وعشرون، وهذه صارت تسعة وعشرون، هذه لأن أنا
اشتغلت على أربعة bins، واستخدمت الـ mean، الحل الآخر
أن ممكن أنا اشتغل على الـ boundaries، شو هي الـ
boundaries؟ أنا هاجي أقول هي، بعد الـ sort، القيم الـ
boundary هاي، أو القيم الحدودية هذه، بدي أحافظ عليها
وبدي أغير كل اللي في الداخل حسب هي أقرب لمين، تسعة
أقرب لتسعة .. للأربعة ولا الخمسة؟ .. ثمانية، أربعة
ولا خمسة عشر؟ أربعة، أربعة، معناته دي أربعة، تسعة
أربعة ولا خمسة عشر؟ أربعة، الفرق هنا خمسة، والفرق
هنا ستة، معناته هنا أربعة، ونفس الكلام، واحد وعشرون
هذي هتظل واحد وعشرون، وهذي هتصير خمسة وعشرون، هذي
ثمانية، ستة وعشرون، وهذي ستة وعشرون، وأربعة و
ثلاثين، وهيك صار في عندي الآن أكثر من طريقة عشان
أتعامل مع الـ bins، وبهيك يصير في عندي data set
smooth، لكن كمان مرة برجع بقول لك، كل مكان عدد الـ bins
أكبر بـ frequent أو بـ items، أكبر بيكون أفضل بالنسبة
لك، لأنه بتحاول تحط الـ data في الـ real case تبعتها
وبهيك احنا بننهي محاضرتنا إن شاء الله، وبنحاول
نكمل المحاضرة الجاية في موضوع الـ regression والـ
clustering