מתודות עבודה

4 שיטות להתמודד עם מידע חסר

By אוקטובר 27, 2017 3 Comments

הרבה פעמים, כשאנחנו מתעסקים עם מסדי נתונים, אנחנו יכולים להיתקל במידע חסר – בין אם זה כי לא התחלנו לאסוף מידע בזמן (או שאנחנו אוספים אותו בצורה הדרגתית, כחלק מתהליך של בקרה עצמית) בין אם זה כי קיבלנו את המסד ככה ובין אם בנינו שאלון/סקר ולא ענו לנו על שאלות שלמות או על חלקי שאלות.

במקרה כזה, אנחנו צריכים להתייחס לחוברי המידע, יש כמה שיטות, ואני מקווה שהפוסט הזה יעשה קצת סדר וייתן לכם זווית מעניינת על הנושא.

בשביל שיהיה קצת בשר לדיון הזה, אנחנו נשתמש בקובץ מאגר נתוני המבחן של הטיטאניק (לכו ל-kaggle.com) – מאגר הנתונים הזה משמש במסגרת האתר עבור מי שמתחיל את דרכו בלמידת מכונה – והוא מאגר די טוב להתחיל לעבוד עליו, גם בגלל הנדסת התכונות שצריך לעשות בהתחלה וגם כי הוא מספק 'סיפור' מעניין לעבוד עליו.

במקרה הזה, כל עבודת הנתונים שעושים על המאגר הזה תכליתה לספק למחשב עמודות מסודרות ככל האפשר ובאמצעות קלאסיפיקציה לנבא אם אדם עם נתונים מסויימים שרד או לא שרד את אסון הטיטאניק.

מה יש במסד הנתונים של הטיטאניק?

  1. PassengerId – מספר סידורי בתוך מאגר המידע
  2. Survived – עמודה שמתארת אם הנוסע שרד או לא
  3. Pclass – מספר המחלקה שאליה נרשם הנוסע
  4. Name – שם מלא כולל תואר (חשוב להנדסת נתונים)
  5. Sex – מין הנוסע (בינארי)
  6. Age – גיל הנוסע
  7. SibSp – מספר אחים או בני זוג על הסיפון
  8. Parch – מספר הורים \ ילדים על הסיפון
  9. Ticket – מספר כרטיס
  10. Fare – עלות הכרטיס לנוסע
  11. Cabin – התא אליו היה רשום הנוסע
  12. Embarked – איפה הנוסע עלה על הטיטאניק.

בואו נסתכל על הנתונים שחסרים:

מאגר הטיטאניק - ערכים חסרים במפת חום

נתונים בהירים הם למעשה נתונים חסרים במאגר

 

כל הנתונים הבהירים חסרים לנו במסד נתונים – למה?

מסדי נתונים נועדו לשקף את המציאות כפי שנמדדה, ולכן הגיוני שבעת אסון יהיו נתונים חסרים.

 

אז איך מתמודדים עם מידע חסר במסדי הנתונים?

  1. התעלמות

אולי לא ממש שיטה להתמודדות, אבל זה נכלל באותו האיזור.

מידע חסר שמייצג חוסר אמיתי במידע, אבל נראה כמידע חסר – כמו, לדוגמה, בסדרת הפוסטים של באיזה סדרה הכי שווה לצפות? – אנחנו רואים שמספר הפרקים כל עונה שונה, ולכן יש פרקים מדורגים ויש כאלו שאינם – זה סוג יחסית נדיר של מידע חסר, אבל אם לא נשים לב אליו – אנחנו יכולים לקפוץ למסקנות שגויות.

  1. הסרה

אולי השיטה הכי 'אלימה' בארגז הכלים שלנו, וכזאת שאין לי ספק שמשתמשים בה יותר מדי.

הסרת מידע חסר יכולה להגיע לידי ביטוי באחת משתי דרכים –

  • הסרה של הדגימה/דגימות הספציפית/ספציפיות – במקרה שלנו, יש לנו את עמודת ה-Embarked שמתארת איפה האדם עלה על הטיטאניק, היו שלושה רציפים ואנחנו רואים ששתי דגימות הן ללא מידע – במקרה הזה, ניתן יהיה למחוק את שתי הדגימות (ולקבל החלטה על בסיס שאר ה-889 דגימות שנותרו).
  • הסרה של התכונה הספציפית עבור ניתוחים שלא דורשים אותה – עמודת ה-Cabin מציגה מידע, אם ידוע, של מספר התא אליו היה רשום הנוסע –
    • האם העמודה הזאת חשובה?
    • מה ניתן יהיה להסיק מהתא אליו היה רשום הנוסע?

אנחנו נטען שהעמודה לא חשובה, כיוון שהתא אליו היה רשום הנוסע לא אומר שזה היה התא שבו היה הנוסע כאשר הטיטאניק התנגשה בקרחון.

בקשר לשיקולים אחרים – אנחנו יכולים לנסות לבצע ניחושים מושכלים מתוך המחלקה אליו היה רשום הנוסע (כמו שנראה בקרוב).

  1. החלפה לפי ייחוס (Imputing)

אוקיי, עכשיו אנחנו נשאל את עצמנו האם בכלל חשובה לנו עמודת הגיל – האם יש הבדל שנראה משמעותי בין השורדים\לא שורדים לפי גיל?

טיטאניק - ספירה לפי קבוצות גיל וחלוקה לפי שרידות האסון

אם כל קבוצות הגיל היו מראות יחס זהה – מה הייתם עושים?

אנחנו יכולים לראות שמתקיים הבדל בין ילדים שגילם קטן מעשר ובין אנשים בין הגילאים 30-40.

בנוסף, אנחנו יכולים לראות שיש הבדל בין הגילאים 30-40 לבין 20-30.

לכן, אנחנו יכולים להסיק שיש משמעות לגיל ולכן אנחנו לא יכולים פשוט להשמיט אותו – לא כתכונה ובמקרה הזה, בטח לא כהסרת דגימות (הפעם יש 177 נוסעים נטולי גיל).

 

  • ממוצע כללי –

עבור כל הנוסעים, ממוצע הגיל הוא 29.7 – אם נעשה ממוצע עבור כל האוכלוסייה, ועבור כל דגימת גיל חסרה נשלים 29.7 – לא נפגע בממוצע הכולל, אבל האם זה מספיק?

במקרה הזה נראה לי שלא – אנחנו מסתכלים על טווח של בערך 79 שנים – וזה לא יהיה 'הוגן' כלפי המסד פשוט לייצר הכללה בוטה כל כך.

Titanic - Non NA Age distribution

  • ממוצע מתאים לפי מאפיינים –

ברור לנו שממוצע כללי הוא לא מתאים פה (זוכרים? סטטיסטיקה יכולה לשקר לפעמים), טווח הגילאים שיש לנו נע מתינוקות ועד גברים בני 80 – לכן אנחנו נצטרך להישען על מידע נוסף על מנת להחליט איך לבצע את ההחלפות הללו (שלא תגמור לי כמו אברה בפוסט הניתוח הסטטיסטי לפוקימון).

עלות הכרטיס עבור המחלקה הראשונה יקרה יותר מאלו של מחלקה שלישית ואנשים צעירים פחות נטו להחזיק סכומים כאלו של כסף (ממוצע כרטיס עבור מחלקה ראשונה הוא 84$, שהם, באינפלציה שנתית של 3.09%* שווי ערך ל-2054$ של שנת 2017)

לכן, נראה לי סביר, הוגן והגיוני להניח, שעקרונית, במחלקה הראשונה, זאת הפנסי שמנסי – איפה שרוז נמצאת, ממוצע הגילאים יהיה גבוה יותר – בואו נבדוק!

מאגר מידע טיטאניק - גרף קופסאות - גיל לפי מספר מחלקה

ההבדלים בממוצע גילאים נראה די ברור במקרה הזה

 

טוב, קל לראות שיש הבדלים בין המחלקות בממוצע הגילאים, אבל מה אם אפשר לבדוק יותר לעומק?

 

Inception Titanic מאש-אפ

אפשר לחפור יותר במידע – האם זה יניב הצלחות?

 

אוקיי, אז אנחנו מדברים על שנת 1912, אנחנו מדברים על חברה פטריאכלית AF – שמונה שנים לפני שניתנו לנשים זכות הבחירה – נראה לי שכל אישה שהייתה במחלקה ראשונה, לא בהכרח הייתה בגיל של הגבר – אז היה הרבה יותר מקובל לגבר להתחתן עם צעירה ממנו בכמה שנים, אולי זה משפיע – אני לא יודע, בואו נבדוק!

מאגר מידע טיטאניק - גרף קופסאות - גיל לפי מספר מחלקה בחלוקה למגדר

כשחופרים במידע מגיעים למקומות נפלאים

 

טוב, אז אנחנו רואים שיש הבדל – האם אפשר לרדת יותר עמוק?

כנראה שכן, אבל מתחילה להשאל השאלה – עד כמה צריך לחפור פנימה – מאוד תלוי במאגר שלכם ובסוג המשימה.

 

  • רגרסיה ליניארית/לוגיסטית או כל מודל קלאסיפיקציה אחר –

גיל הוא משתנה רציף, ואפשר לקחת את כל הנתונים, לבצע רגרסיה לינארית מרובת משתנים ולנסות 'לנבא' את הגיל עבור כל נוסע ללא גיל במסד, זה יכול לעבוד, פייתון הופך את זה למאוד קל, אבל דווקא במקרה הזה, נראה לי שיהיה יותר קל ונכון לא לבצע את זה – במקרים אחרים – יכול להיות מאוד שרגרסיה או כל שיטת קלאסיפיקציה אחרת יהיו ה-Goto הראשונים שלי.

 

4. אחזור נתונים –

בדיקה חוזרת אם ניתן להשיג את הנתונים החסרים

טוב, אם מישהו מצליח לאחזר כאן נתונים במקרה הזה, זה יהיה הרבה קסם שחור, ואנחנו לא בקטע של קסם.

אבל זה כן נכון אם עשיתם סקר לא אנונימי – זה לגמרי לגיטימי להתקשר ולשאול את עונה הסקר אם זאת שאלה שנראה לכם שאין סיבה שלא ירצה לענות עליה.

 

אבל רגע, למה יש מידע חסר?

דיברנו בעיקר על איך לטפל במידע חסר, פחות על למה הוא חסר מלכתחילה – הכי קל לפטור את עצמנו מלחשוב על זה, אבל זה לא יהיה נכון – למה המידע הזה חסר?

האם הוא חסר באופן רנדומלי? סתם לא נענו תשובות כאן או כאן?

חסר באופן שיטתי? כמה אחוזים משמעותיים מהעונים לא ענה על שאלה 6?

למה חסר? יכול להיות שניסחנו שאלה בצורה פוגענית?

לא מדוייקת או מבלבלת?

יכול להיות שהשאלה הייתה פשוט לא רלוונטית?

 

כל אלו דברים שצריכים לחשוב עליהם לפני שאנחנו מוציאים סקר החוצה, אבל אם הוצאנו כבר סקר – וקיבלנו תוצאות ריקות – אנחנו צריכים לשאול את עצמנו מה אנחנו עושים עכשיו ויותר חשוב – איך נמנע מהזה בעתיד

 

לסיכום,

ראינו שיש לנו כמה דרכים להתמודד עם מידע חסר – וכמו תמיד, צריך לזכור שאלו רק כלים – אין פתרון אחד שמתאים להכל – לכל בעיה יש כמה דרכים לפתרון, ואנחנו כאנליסטים או דאטה סיינטיסטס צריכים להיות גמישים מחשבתית ולדעת לעבוד עם הנתונים שיש לנו בצורה שתפיק הכי הרבה תוצאות נכונות ומדוייקות.

איך אתם מתמודדים עם מידע חסר?

בכמה מידע חסר יוצא לכם להתקל?


3 Comments

  • […] וגם לאנליסטים יש צורך להתמודד עם בעיות דומות – בעיית המידע החסר מקשה על ייצור של מודלים כמו גם על הפקה של תובנות או […]

  • איילת הגיב:

    מאיזו סיבה ריגרסייה לוגיסטית פחות מתאימה במקרה הזה?

    • analysis-paralysis הגיב:

      ידעתי שיש לי תגובה שהייתי צריך לענות עליה – הכוונה שלי הייתה בשימוש ברגרסיה לוגיסטית בשביל לנבא את המידע החסר, כלומר הגיל, אז במקרה הזה אפשר לעשות כמה דברים –
      1. לחלק את הגילאים למשתנים קטגוריאליים – או בפשטות, קבוצות גיל – ואז אפשר יהיה לבחור את המשתנים שחשובים לנו בשביל להשתמש בהם ולנבא את קבוצות הגיל.
      2. להשתמש במודל שמייצר ניבוי עבור משתנים רציפים – רגרסיה לינארית, רגרסור של עצי החלטה או אפילו רשת ניורונים פשוטה.
      3. השלמת המידע החסר בצורה שבחרתי לעשות אותה.

      לא בדקתי לחלוטין מה מהמם מניב תוצאות יותר בסוף התהליך, אבל יש סיכוי טוב שזה פשוט מודל-ספסיפיק.

      מקווה שזה ענה על השאלה, הגם אם באיחור נוראי.

Leave a Reply