ברוכים הבאים ליחידה "ניתוח נתונים עם Pandas II" בקורס "תכנות וניתוח נתונים בשפת פייתון" (HOWARDUN-EQ-20) באוניברסיטת הווארד. יחידה זו מתמקדת בטכניקות חיוניות לניקוי, טרנספורמציה ואיחוד נתונים, שהן אבני יסוד בכל פרויקט ניתוח נתונים. נלמד כיצד להשתמש בספריית Pandas כדי להפוך נתונים גולמיים לתובנות משמעותיות, תוך התמקדות בשיטות הנפוצות ביותר הנבחנות לעיתים קרובות במבחנים מעשיים ותיאורטיים באוניברסיטת הווארד, הדורשים הבנה עמוקה ויכולת יישום קוד.
יסודות ניקוי וטרנספורמציה: סינון ומיון
לפני שנוכל לנתח נתונים, עלינו לוודא שהם במבנה הנכון ונקיים מטעויות. סינון ומיון הם הצעדים הראשונים והבסיסיים בתהליך זה, המאפשרים לנו להתמקד בנתונים הרלוונטיים ולסדר אותם באופן שיקל על הניתוח.
שיטות סינון נפוצות:
- סינון בוליאני: השיטה הנפוצה ביותר, באמצעות ביטויים לוגיים בתוך סוגריים מרובעים (לדוגמה:
df[df['Age'] > 30]). ניתן לשלב תנאים באמצעות&(וגם) ו-|(או). - סינון לפי רשימת ערכים: שימוש ב-
isin()לבדיקה האם ערכים בעמודה נמצאים ברשימה נתונה (לדוגמה:df[df['City'].isin(['NY', 'LA'])]). - סינון טקסטואלי: שימוש בשיטות מחרוזת של Pandas על עמודות מסוג אובייקט (לדוגמה:
df[df['Name'].str.contains('John', na=False)]).
שיטות מיון:
df.sort_values(by='column_name', ascending=True/False): מאפשר מיון לפי עמודה אחת או רשימת עמודות (לדוגמה:df.sort_values(by=['Region', 'SalesAmount'], ascending=[True, False])).
קיבוץ נתונים עם GroupBy
פעולת ה-groupby היא כלי עוצמתי ב-Pandas המאפשר לבצע ניתוח אגרגטיבי על תת-קבוצות של הנתונים. היא פועלת לפי מודל "חלק-החל-שלב" (split-apply-combine), שהוא מושג מפתח בהבנת Pandas.
שלבי ה-GroupBy:
- Split (חלק): חלוקת ה-DataFrame לקבוצות על בסיס עמודה/ות מסוימת/ות שהוגדרו.
- Apply (החל): הפעלת פונקציה (לדוגמה:
sum(),mean(),count(),min(),max()) על כל קבוצה בנפרד. - Combine (שלב): שילוב התוצאות מהפונקציות שהופעלו חזרה ל-DataFrame או Series יחיד.
ניתן לבצע אגרגציות מרובות באמצעות שיטת .agg(), המאפשרת להפעיל פונקציות שונות על עמודות שונות או מספר פונקציות על אותה עמודה בו-זמנית, מה שמספק גמישות רבה בניתוח.
איחוד נתונים: Merge ו-Concat
במקרים רבים, הנתונים שאנו מנתחים מגיעים ממספר מקורות שונים. Pandas מספקת כלים חזקים לאיחוד וצירוף DataFrames, המאפשרים לשלב מידע מפוזר לישות אחת קוהרנטית.
השוואת Merge ו-Concat:
pd.merge()
משמש לאיחוד DataFrames על בסיס עמודות מפתח משותפות (לדוגמה, מזהה משתמש, קוד מוצר). מאפשר סוגי איחוד שונים (inner, outer, left, right) השולטים באופן טיפול בשורות ללא התאמה. חיוני לשילוב נתונים קשורים לוגית.
pd.concat()
משמש לצירוף DataFrames לאורך ציר מסוים (axis=0 לשורות, axis=1 לעמודות). שימושי כאשר ל-DataFrames יש את אותן עמודות (לצירוף שורות) או את אותם אינדקסים (לצירוף עמודות), או כאשר רוצים פשוט "להדביק" אותם יחד.
pd.merge(): זוהי נקודה קריטית למבחן ולעבודה מעשית. הבנה מעמיקה של ההבדלים בין how='inner' (שומר רק התאמות משני הצדדים), how='left' (שומר את כל השורות מה-DataFrame השמאלי ומוסיף התאמות מהימני, עם NaN היכן שאין התאמה), how='right' ו-how='outer' (שומר את כל השורות משני הצדדים, עם NaN היכן שאין התאמה) היא חיונית. טעות בבחירת סוג האיחוד יכולה להוביל לאובדן נתונים, כפילויות, או לתוצאות שגויות לחלוטין.
שינוי צורה של נתונים: Pivot ו-Melt
שינוי צורה של נתונים הוא תהליך חשוב להתאמת הנתונים לניתוח, להצגה או להכנה למודלים סטטיסטיים. Pandas מציעה כלים גמישים לכך, כאשר pivot ו-melt הם שניים מהחשובים ביותר.
השוואת Pivot ו-Melt:
df.pivot_table()
משמש ליצירת טבלת ציר (pivot table) מנתונים. מאפשר להגדיר אינדקסים (index), עמודות (columns) וערכים (values), וכן לבצע פונקציות אגרגציה (aggfunc) כאשר יש כפילויות בנתונים. שימושי מאוד לסיכום נתונים וליצירת דוחות.
pd.melt()
ממיר DataFrame מפורמט "רחב" (שבו יש עמודות רבות המייצגות משתנים) לפורמט "ארוך" (שבו משתנים אלה מיוצגים בשתי עמודות: אחת לשם המשתנה ואחת לערכו). שימושי במיוחד להכנת נתונים לגרפים (לדוגמה, בספריות כמו Seaborn) או למודלים סטטיסטיים מסוימים.
שאלות לדיון
- נתון לך DataFrame המכיל נתוני מכירות (
ProductID,Region,SalesAmount,Date). כיצד תמצא את סך המכירות הממוצע למוצר בכל אזור, רק עבור מכירות שבוצעו לאחר תאריך מסוים? כתוב את שלבי הקוד ב-Pandas. - הסבר את ההבדל העיקרי בין
pd.merge(how='left')לביןpd.merge(how='inner'). תאר מצב ספציפי שבו תבחר להשתמש בכל אחד מהם, והסבר מדוע. - יש לך DataFrame המכיל נתונים חודשיים של טמפרטורות עבור מספר ערים (עמודות:
City,Jan,Feb, ...,Dec). כיצד תהפוך אותו לפורמט שבו לכל שורה ישCity,Monthו-Temperature? מדוע פורמט זה עשוי להיות שימושי לניתוח או ויזואליזציה? - מדוע ניקוי וטרנספורמציה של נתונים הם שלבים כה קריטיים בתהליך ניתוח הנתונים, ולפני אילו בעיות פוטנציאליות הם מגינים עלינו? תן דוגמה לבעיה אחת מכל סוג.
נקודות לתשובת מודל
- לשאלה 1:
- סינון: ראשית, סנן את ה-DataFrame לפי תאריך (לדוגמה:
df_filtered = df[df['Date'] > '2023-01-01']). - קיבוץ: לאחר מכן, בצע קיבוץ לפי
Regionו-ProductID(df_grouped = df_filtered.groupby(['Region', 'ProductID'])). - אגרגציה: לבסוף, הפעל את פונקציית הממוצע על עמודת
SalesAmount(df_grouped['SalesAmount'].mean()).
- סינון: ראשית, סנן את ה-DataFrame לפי תאריך (לדוגמה:
- לשאלה 2:
inner merge: מחזיר רק שורות שיש להן התאמה בשני ה-DataFrames על פי עמודות המפתח. מצב שימוש: כאשר רוצים לנתח רק נתונים שיש להם מידע מלא משני המקורות, לדוגמה, איחוד רשימת לקוחות עם רשימת הזמנות, ורוצים לראות רק לקוחות שביצעו הזמנות.left merge: מחזיר את כל השורות מה-DataFrame השמאלי, ומוסיף התאמות מהימני. אם אין התאמה בימני, הערכים יהיוNaN. מצב שימוש: כאשר רוצים לשמור את כל הנתונים מהטבלה הראשית (השמאלית) ולהוסיף מידע משני במידת האפשר, לדוגמה, איחוד רשימת כל העובדים עם נתוני השתלמויותמצאתם טעות או שחסר משהו?