לחברות המעוניינות בשירותי פרילנס או סדנאות של אנליסט, ניתן לפנות אליי [email protected]
הקדמה – ניתוח נתונים בשפת פייתון
זהו חלק ב' של המדריך לניתוח נתונים בעזרת שפת פייתון. למעוניינים בחלק הראשון לחצו על: המדריך לניתוח נתונים בשפת פייתון – חלק א.
אם עדיין לא התקנתם את סביבת העבודה של פייתון היכנסו למדריך שהכנתי על התקנת סביבת העבודה.
אחזור בקצרה על ההקדמה שהופיעה בחלק א' של המדריך:
שפת פייתון היא שפת תוכנה ולא שפה שנוצרה לניתוח נתונים, ולכן, לדעתי, ניתוח נתונים בעזרת שפת פייתון הוא דרך מאד מסורבלת ולא מומלצת גם אם נעזרים בחבילת Pandas. אם בכל זאת אתם מעוניינים לנתח נתונים בשפת פייתון או שהשוק דורש את זה מכם, הכנתי מדריך שמסביר כיצד אפשר לנתח נתונים בשפת פייתון.
שימו לב, המדריך מניח שיש לכם ידע בסיסי בתכנות והבנה של ניתוח נתונים בשפת SQL.
אם אתם מעוניינים במדריך לשפת SQL לחצו כאן.
בנוסף, חשוב לדעת ששפת פייתון משתנה באופן תדיר. פונקציות חדשות נכנסות כל הזמן ולפעמים גם חלק מהסינטקס משתנה. במדריך התמקדתי רק בפעולות הבסיסיות בשפת פייתון שיעזרו לכם להיכנס לעניינים ולהתקדם אחר כך לבד. אם מצאתם טעות אתם מוזמנים ליצור קשר במייל: [email protected]
**** לפודקאסט של הבלוג לחצו כאן ****
עבודה עם אינדקסים של DataFrame ב- Pandas
השימוש באינדקסים ב- Pandas מדגים מדוע לדעתי ניתוח נתונים בשפת פייתון הוא מאד מסורבל ולא נוח ומדוע עדיף להשתמש בשפת SQL במקום פייתון. מרבית מהבעיות שתתקלו בהן תהיינה קשורות בצורה זו או אחרת לאינדקסים וחיבור של משתנים מסוג Series שלהם אינדקס שונה מה-DataFrame שלכם, לכן על מנת לשלוט בניתוח נתונים בפייתון, אין מנוס אלא להבין את הקונספט של אינדקסים.
לכל DataFrame ב- Pandas יש אינדקס. אינדקס הוא מספור של השורה. ברוב המקרים האינדקס יהיה נומרי, יתחיל מאפס ויתקדם באחד כל שורה אבל זה לא תמיד כך. אם למשל ניצור subset של טבלה באמצעות פונקציית loc, האינדקס של השורות בטבלה החדשה שנקבל יהיה האינדקס של השורות האלה בטבלה המקורית.
השימוש באינדקס יבוא לידי ביטוי כאשר נרצה להוסיף עמודות לטבלה או כשנרצה לחבר בין טבלאות.
הערה: יכולים להיות DataFrames עם יותר מאינדקס אחד.
דוגמה:
כדי לראות את האינדקס של DataFrame נריץ את הפקודה:
data.index.tolist()
[0, 1, 2, 3, 4, 5, 6, 7,…….
נבנה תת טבלה בשם b מתוך הטבלה data ונריץ את אותה פקודה על טבלה b
b=data.loc[data["Country"]=='Israel',["Country","CustomerID"]]
b.index.tolist()
[31982, 31983, 50791, 50792, 50793, 50794,
…
הסבר: האינדקס של טבלה b שיצרתי מתוך הטבלה data הוא אותו אינדקס של השורות המקוריות שהופיעו בטבלה של data.
פקודת rest_index
כדי לאפס את האינדקס נריץ את הפקודה הבאה:
b.reset_index(drop=True,inplace=True)
תזכורת: הפרמטר inplace=True אומר ל- Pandas לשנות את הטבלה b ולא לשנות את הפלט של הפקודה.
שימוש בפונקציית Copy בפקודות של Pandas
כשמייצרים תת טבלה ב- pandas לא נוצרת טבלה חדשה בזכרון, אלא נוצרת טבלה לוגית אשר מצביעה על הטבלה המקורית בזכרון עם השינויים שבוצעו. השיטה הזאת מאפשרת לחסוך בזמן ריצה וזיכרון מערכת, אבל יוצרת בעיות כאשר רוצים לבצע שינויים על אחת מהטבלאות. אם למשל נשנה את הטבלה המקורית, גם תת הטבלה תשתנה.
כדי להימנע מבעיות אלו, ישנה אפשרות ב-Pandas לייצר תת טבלה חדשה בזיכרון בעזרת פונקציית Copy. טבלה חדשה זאת לא תשפיע או תהיה מושפעת מהטבלה שממנה היא נגזרה.
לדוגמה:
b=data.loc[data["Country"]=='Israel',["Country","CustomerID"]].copy()
טיפול בערכים חסרים ב- DataFrame
איתור ערכים חסרים
ל- Pandas יש פונקציה בשם isnull כדי לאתר ערכים חסרים:
data.loc[data["CustomerID"].isnull()]
בדוגמה הנ"ל נקבל את כל הערכים החסרים בשדה CustomerID.
מילוי ערכים חסרים
על מנת למלא ערכים חסרים, ב- Pandas יש פונקציה בשם fillna.
יש אפשרות להפעיל את הפונקציה ולמלא באופן אוטומטי את כל הערכים החסרים בערך שנקבע מראש.
דוגמה למילוי כל הערכים החסרים בערך שנבחר מראש:
data['Country'].fillna('No Country',inplace=True)
דוגמה למילוי כל הערכים החסרים לפי פונקציה סטטיסטית – במקרה שלנו 'שכיח':
data['Country'].fillna((data['Country']).mode()[0], inplace=True)
הסבר על הפקודה – (data['Country']).mode()[0]
הפקודה mode מחזירה משתנה מסוג סדרה- Series ולכן אם נרצה לקבל את הערך עצמו של השכיח נצטרך לבחור את האיבר הראשון בסדרה בעזרת התייחסות למיקום שלו [0].
הסרה של שורות עם ערכים חסרים
ישנה פונקציה בחבילת Pandas בשם dropna המאפשרת הסרה של שורות עם ערכים חסרים מהטבלה.
אם נריץ אותה על כל הטבלה כמו בדוגמה הבאה יוסרו כל השורות שבאחד השדות שלהם יש ערכים חסרים.
data.dropna(inplace=True)
אפשר גם להסיר את השורות שבשדה מסוים שלהם יש ערכים חסרים כמו בדוגמה הבאה:
data.dropna(subset=['Country'],inplace=True)
שינוי ערכים של שדות (recode)
בעיבוד נתונים לפעמים יש צורך לשנות ערכים בטבלה. למשל, אם נוצרה טעות ובמקום שם המדינה Israel הוקלד IRL או אם היינו רוצים לקבץ ערכים כמותיים.
אם היינו עובדים בשפת SQL היינו יכולים לבצע פעולת אלו בעזרת פקודת case when. בשפת פייתון ישנם מספר דרכים לבצע שינוי של ערכים. בדוגמה הבאה אראה כיצד אפשר לבצע פעולות מסוג זה בעזרת פונקציה:
def age_groups_func(series):
if series < 20:
return "15-19 yrs"
elif 20 <= series < 25:
return "20-24 yrs"
elif 25 <= series:
return "25-30 yrs"
data['age_group'] = data ['age'].apply(age_groups_func)
הסבר:
בשורות קוד הנ"ל בניתי פונקציה אשר מחלקת את הגיל לקבוצות. לאחר מכן, הפעלתי את הפונקציה בעזרת apply ואת התוצאה הכנסתי למשתנה חדש בשם age_group.
אגרגציה של נתונים ב- Pandas בעזרת פונקציית groupby
אגרגציה של נתונים היא קיבוץ של הנתונים לפי שדה מסוים, זאת פעולה מאד חיונית בניתוח של נתונים. בחבילת Pandas קיבוץ נתונים מבוצע בעזרת פונקציית groupby.
התייחסות לערכים חסרים בפונקציית groupby
חשוב להדגיש – בניגוד לשפת SQL, אגרגציה של נתונים בעזרת פונקציית groupby מתעלמת מערכים חסרים בשדה שעליו מתבצעת האגרגציה בברירת המחדל. המשמעות היא שבעת בדיקה של האגרגציה עלולים להיות לכם חוסרים בסיכומים כי שורת ה- NULL תעלם.
כדי להתמודד עם הבעיה הזאת חשוב תמיד לבצע אגרגציה כאשר הפרמטר dropna=False.
יצירת טבלה אגרגטיבית בעזרת פונקציית groupby
ביצירת טבלה אגרגטיבית יש שני שלבים:
שלב ראשון של האגרגציה – הכרזה:
בשלב זה יש להכריז על אילו שדות רוצים לבצע את האגרגציה:
data.groupby(['Country'],dropna=False)
את הפלט של ההכרזה אפשר לשים בתוך משתנה כדי שנוכל לבצע עליו פעולות בשלב הבא:
agg_var=data.groupby(['Country'],dropna=False)
אפשר גם לבצע אגרגציה על יותר משדה אחד:
agg_var=data.groupby(['Country','age'],dropna=False)
שלב שני של האגרגציה – יצירת מטריקות:
בשלב זה נבחר את המטריקות של האגרגציה ונבצע את החישוב עצמו.
בכדי לבצע את החישוב של המטריקות נעזר בפונקציית agg, ובמבנה נתונים של שפת פייתון שנקרא dictionary.
ב- dictionary נגדיר ל- Pandas איזה מטריקות אנו רוצים להפעיל ועל אילו שדות הם יפעלו ונשלח אותו כפרמטר לפונקציית agg כמו בדוגמה הבאה:
agg_var.agg({'Quantity': ['sum','mean'], 'CustomerID': ['count']})
בדוגמה הנ"ל ביקשנו את המטריקות של סיכום ושל ממוצע על שדה Quantity לפי מדינה (המשתנה האגרגטיבי שיצרנו קודם) ומטריקה של ספירת כמות הלקוחות בכל מדינה.
אפשר לכתוב את שני השלבים בפקודה אחת ללא משתנה ביניים:
data.groupby(['Country'],dropna=False).agg({'Quantity': ['sum','mean'], 'CustomerID': ['count'] })
ישנה אפשרות לעבוד ללא פונקציית agg. אם יש רק פונקציה אגרגטיבית אחת שמעניינת אותנו אפשר להפעיל רק אותה במשתנה בו הגדרנו את האגרגציה. במצב זה הפונקציה תפעל על כל השדות של הטבלה.
agg_var.mean()
או בצורה מקוצרת
data.groupby(['Country'],dropna=False).mean()
חיבור טבלאות בפייתון בעזרת פונקציית merge
חיבור מספר טבלאות (DataFrame) ב- Pandas באופן הדומה לפקודת Join בשפת SQL אפשר לבצע בעזרת פקודת merge.
pd.merge(data, country_descrption, on='Country', how='left')
השדה הראשון יהיה הטבלה הראשית (כמו טבלת הבסיס – From אם היינו כותבים בשפת SQL) והטבלה השניה תהיה הטבלה אותה אנחנו רוצים לחבר.
הפרמטר on הוא המפתח. הפרטמר how הוא סוג ה- join. ברירת המחדל אם לא צוין הסוג היא inner (כלומר, חבר את הטבלאות והשאר רק את השורות שבהם יש התאמה בין המפתחות בשתי הטבלאות).
בדוגמה הנ"ל שם המפתח הוא זהה (Country) בין שתי הטבלאות אך במידה ושם זה אינו זהה אפשר להשתמש בפרמטרים הבאים:
left_on – שדות המפתח של טבלת left
right_on – שדות המפתח של טבלת right
אם תרצו לחבר טבלאות שלהן מפתח עם יותר משדה אחד, יש לציין בפרמטר ה- on את המשתנים בתוך סוגריים מרובעים באופן הבא:
pd.merge(data, city_descrption, on=['Country','City'], how='left')
צירוף של טבלאות (Union) ב Pabdas בעזרת פונקצית concat
צירוף טבלאות (בדומה ל- Union בשפת SQL) מתבצע בעזרת פונקציית "concat" באופן הבא:
pd.concat([data, more_data]) #union
pd.concat([data, more_data]).drop_duplicates() #union all
בדוגמאות הנ"ל אני מצרף את הטבלאות data ו- more_data כאשר השורה הראשונה דומה לפעולה של union all בשפת SQL ואילו השורה השניה דומה ל union בגלל מחיקת השורות הכפולות.
הצגת נתונים בשפת פייתון בעזרת חבילת Seaborn
שפת פייתון מאפשרת לבצע הצגה של נתונים וגרפים. לדעתי הדרך הקלה והנוחה להציג נתונים היא בעזרת Power BI אבל אם כבר ביצעתם את האנליזות בשפת פייתון, ייתכן שתרצו גם להציג אותם בשפת פייתון.
ישנה ספריה קלה ונוחה (נוחה יחסית לעבודה עם נתונים ב- Python) בשם seaborn המאפשרת הצגה של גרפים. החבילה מאפשרת ליצור מגוון רחב גרפים. בדוגמאות הבאות אראה מספר אפשרויות פשוטות שיאפשרו לכם להבין כיצד ניתן לעבוד עם החבילה.
התקנה של חבילת Seaborn
כדי להפעיל את החבילה יש להריץ את הפקודה
import seaborn as sns
במידה והחבילה אינה קיימת בסביבת העבודה אפשר להתקין אותה ע"י הרצת הפקודה במערכת הפעלה שלכם.
Pip install seaborn
ייתכן ותצטרכו להיעזר באיש טכני בשביל התקנת החבילה.
גרף Boxplot ב Python- בעזת חבילת Seaborn
בשביל גרף Boxplot יש להריץ את הפקודה הבאה:
sns.boxplot(
x="Country",
y="age",
data=data, # the data frame
order=data["Country"].value_counts().iloc[:5].index #top 5
)
הסבר
בפרמטרים X ו- Y אנחנו בוחרים את המשתנים שה- Boxplot יעבוד איתם. בפרמטר data אנחנו בוחרים את ה- DataFrame ובפרמטר Order את סדר הצגת העמודות. בגרף הנוכחי גם הגבלתי את מספר העמודות ל- 5. אפשר לשנות את המספר הזה לכל מספר שתחפצו.
היסטוגרמה ב- Python בעזרת חבילת Seaborn
בשביל גרף היסטוגרמה יש להריץ את הפקודה הבאה:
sns.distplot(
data["age"],
bins=20,
kde=False
)
הסבר
בפקודה הנ"ל הרצנו את ההיסטוגרמה על משתנה age עם 20 bins. הפרמטר kde מאפשר לנו לראות מגמה של ההיסטוגרמה. אני בחרתי לא להשתמש בו ע"י False.
כמה מילים על חבילת Statsmodels
חבילת statsmodels הינה חבילה המאפשרת לבצע ניתוחים סטטיסטים מתקדמים על DataFrame. בעזרת החבילה הזאת ניתן לקבל סטטיסטיקות מתקדמות, ניתוחי רגרסיות, מבחני מובהקות ועוד. כדאטה אנליסטים לרוב לא יהיה לכם צורך להיעזר בחבילה הזאת, אך לפעמים עולה הצורך לבצע ניתוחים סטטיסטים מתקדמים ואז החבילה יכולה להיות שימושית מאד וכדאי להכיר אותה ולדעת שהיא קיימת.
בבלוג יש גם מדריך ליצירת מודלים סטטיסטיים בשפת פייתון העושה שימוש בחבילה זו.
כמה מילים על scikit-learn (או sklearn)
חבילת scikit-learn המכונה גם sklearn הינה חבילה ליצירת מודלים של Machine learning על DataFrame. בעזרת החבילה הזאת אפשר לבנות מודלי ניבוי, להריץ רגרסיות מסוגים שונים, לבצע Cluster analysis, לאמן רשתות נוירונים ועוד…
**** לפודקאסט של הבלוג לחצו כאן ****
לחברות המעוניינות בשירותי פרילנס או סדנאות של אנליסט, ניתן לפנות אליי [email protected]
לקריאה נוספת
היתרונות בהעסקת דאטה אנליסט חיצוני (פרילנסר).
מידע לדאטה אנליסט המתחיל.
מידע למנהלים של דאטה אנליסט.
English version of the article – Data analysis with Python part 2