מדריך ניתוח נתונים בשפת פייתון – חלק א

You are currently viewing מדריך ניתוח נתונים בשפת פייתון – חלק א
  • קטגוריה:שפת פייתון
  • זמן קריאה:זמן קריאה 5 דקות
נכתב על ידי יובל מרנין.
לחברות המעוניינות בשירותי פרילנס או סדנאות של אנליסט, ניתן לפנות אליי [email protected]

הקדמה – ניתוח נתונים בשפת פייתון

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

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

בשנת 1991 נולדה שפת פייתון על ידי מתכנת הולנדי בשם חידו ואן רוסום. שפת פייתון פותחה בצורה המאפשרת לה להרחיב את היכולות הבסיסיות ע"י יצירת חבילות תוכנה נוספות.

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

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

היתרונות העיקריים של ביצוע אנליזה בשפת פייתון הם היכולות לכתוב בקלות פונקציות חדשות המאפשרות כתיבה של לוגיקה על מספר רב של טבלאות (גם בשפת SQL אפשר לכתוב פונקציות אך הפעולה הזאת פחות נפוצה), והחיבור שלה למודלים סטטיסטים שאין בשפת SQL ול- Data scientists שלרוב עובדים עם השפה בשביל לכתוב מודלי ניבוי.

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

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

בנוסף, חשוב לדעת ששפת פייתון משתנה באופן תדיר. פונקציות חדשות נכנסות כל הזמן ולפעמים גם חלק מהסינטקס משתנה. במדריך התמקדתי רק בפעולות הבסיסיות בשפת פייתון שיעזרו לכם להיכנס לעניינים ולהתקדם אחר כך לבד. אם מצאתם טעות אתם מוזמנים ליצור קשר במייל: [email protected]

*** לפודקאסט של הבלוג לחצו כאן **** 

איך אפשר לתרגל עבודה עם שפת פייתון

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

מחברות עבודה (Notebooks) הן אופן העבודה המומלץ לעבודה בניתוח נתונים בשפת פייתון.

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

הערות כלליות על שפת פייתון שחשוב לדעת

  • שפת פייתון היא case-sensitive כלומר יש משמעות לאותיות גדולות וקטנות.
  • בעזרת הסימון # אפשר לרשום הערות (כמו הסימן בשפת SQL)
  • בניגוד לשפתSQL שפת פייתון מאד רגישה לעימוד של השורות. אם תרשמו בצורה שהשפה לא אוהבת תקבלו שגיאת ריצה.
  • פקודת print יכולה להדפיס פלט של כמעט כל משתנה.
  • כל פלט אפשר להכניס לתוך משתנה אחר ולבצע בו מניפולציות.

יבוא של חבילות תוכנה לסביבת פייתון

על מנת להשתמש בחבילות לניתוח נתונים עלינו לייבא אותם. פעולת היבוא מתבצעת באמצעות פקודת import ולכן יש לכתוב לפני כתיבת התוכנית את השורות הבאות:

import numpy as np
import pandas as pd

לחבילה של pandas העוסקת בניתוח נתונים קראנו pd והיא תשמש אותנו בהמשך כאשר נעבוד עם הפונקציות של החבילה.

משתנה מסוג DataFrame

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

יבוא דאטה לתוך פייתון

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

קליטת קובץ CSV

path=r"C:\data.csv"

data = pd.read_csv(path)

הסבר

במשתנה Path ציינו את הנתיב אשר בו מופיע קובץ ה- CSV שנרצה לייבא. ובפקודה אחרי ביקשנו מהחבילה של Pandas לקלוט הטבלה בקובץ CSV ולהכניס אותה למשתנה data.
אפשר כמובן לבחור גם שם אחר. למשל, אם מדובר בטבלה של הלוואות היינו יכולים לרשום

loans = pd.read_csv(path)

קליטה של קובץ אקסל

path=r"C:\data.xlsx"
data = pd.read_excel(path)

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

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

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

engine = create_engine("mysql://root:root@localhost/ecommerce?host=localhost?port=3306")

#root – user
#root – password
#ecommerce- the name of default db

sql="'
select * from customers;
"' 

sql_table=pd.read_sql_query(sql,engine)

עבודה בסיסית עם DataFrame ב- Pandas

שליפה של טבלה

כדי לצפות בטבלה שקלטנו בסעיף הקודם מספיק לרשום את שם הטבלה ולהריץ

Data

אם נרצה לראות רק את 10 השורות הראשונות נרשום:

data.head(10)

אם נרצה לראות רק את 10 השורות האחרונות נרשום:

data.tail(10)

שליפה של שדות מ- DataFrame

יש כמה דרכים לבחור שדות ב- DataFrame של Pandas:
אפשר לרשום את שם השדה בעזרת נקודה כמו בשפת SQL

data.CustomerID

או בעזרת סוגריים מרובעים ומרכאות:

data["CustomerID"]

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

data[["CustomerID","Country"]]

 ניתן גם לבחור משתנים פי המיקום שלהם בעזרת פונקציית iloc:

data.iloc[:,2:4]

הערה על הפלט של השליפה:

כאשר משתמשים בסוגריים מרובעים יחידים data["CustomerID"] או משתמשים בנקודה data.CustomerID הפלט שמתקבל הוא מסוג Series. כאשר משתמשים בשני סוגריים מרובעים data[["CustomerID"]] או בפונקציית iloc מקבלים פלט מסוג DataFrame.

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

שימוש בפרמטר inplace

פרמטר inplace בפונקציות של Pandas מורה ל- Pandas לבצע שינוי על ה- DataFrame שלנו. אם לא נוסיף את הפרמטר הזה, לא יתבצע השינוי והוא יהיה קיים רק בפלט של הפונקציה (ראו דוגמה בסעיף הבא).

הסרת שדה מ- DataFrame

בדוגמה הבאה יצרתי DataFrame חדש בשם a שיהיה זהה לטבלה data אך יהיה ללא השדה CustomerID. ב- data השדה CustomerID עדיין יופיע.

a=data.drop('CustomerID', axis=1)

באופן דומה, בדוגמה הנ"ל שינתי את טבלת data בעזרת שימוש בפרמטר inplace=True

data.drop('CustomerID', axis=1, inplace=True)

שינו שם שדה

בשביל לבצע שינוי שם שדה ב- DataFrame, חבילת Pandas נעזרת במבנה נתונים של פייתון שנקרא dictionary, ולכן שינוי שם שדה יראה כך:

renamed_table=data.rename(
index=str,
columns=
 {"CustomerID": "CustomerID_new",
  "Country": "Country_new",
 }
)

מניפולציה על שדות והוספת שדות חדשים ב- DataFrame

data["UnitPrice_with_vat"]=data["UnitPrice"]*1.17

שדה UnitPrice_with_vat הוא שדה חדש. על השדה החדש עשיתי מניפוציה והוספתי 17% (מע"מ). באופן דומה אפשר לבצע מניפולציות עם פונקציות מתמטיות ופונקציות על מחרוזות.

מיון DataFrame

מיון ב- Pandas יבוצע בעזרת פונקציית sort_value

data.sort_values('age')

אפשר גם למיין מהגדול לקטן

data.sort_values('age',ascending=False)

הפקת מדדים סטטיסטים על DataFrame בחבילות Pandas

כמות שורות ומשתנים

על מנת לקבל את כמות השורות והמשתנים אפשר לרשום את שם ה-DataFrame ומאפיין shape: 

data.shape

התשובה שתתקבל תיהיה בצורה של

(541909, 8)

שזה אומר שב- DataFrame יש 541,909 שורות ו- 8 עמודות. 

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

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

data.info()

תאור השדות – סטטיסטיקה בסיסית בעזרת פונקציית describe

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

data.describe(include='all')

כדאי להוסיף את הפרמטר (include='all') כדי לקבל את כל המדדים הסטטיסטיים שהפונקציה מאפשרת.

שימוש בפונקציות סטטיסטיות

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

 data.Quantity.mean()

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

mean=data.Quantity.mean()
median=data.Quantity.median()
if mean>median:
    print('mean is greater than median')
else:
    print('median is greater or equal to mean')

לחבילת Pandas יש את מרבית הפונקציות הסטטיסטיות הסטנדרטיות (שהם למעשה פונקציות אגרגטיביות). בנוסף יש לה גם פונקציות לספירת ערכים בשם count ופונקציה נוספת לספירת ערכים ייחודיים nunique אשר פועלת כמו count distinct בשפת SQL.

ההתפלגות של ערכים קטגוריאלים

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

data['Country'].value_counts()

יצירת תת טבלה

על מנת ליצור תת טבלה בשפת SQL נסנן את השורות שאנחנו רוצים להשאיר בעזרת הוראת where. באופן דומה ב- Pandas אפשר להשתמש בפונקציית loc.
פונקציית loc מאפשרת לנו לסנן שורות לפי תנאי ולבחור את השדות בהם נרצה להשתמש:

data.loc[data["Country"]==' Israel']
data.loc[data["Country"]==' Israel',["Country","CustomerID"]]

הסבר:

בדוגמה הראשונה בחרתי רק את השורות שבהם המדינה היא Israel, בדוגמה השניה חזרתי על התנאי הראשון ובנוסף לסינון של השורות בחרתי רק את השדות Country  ו CustomerID.

הערה – ישנן דרכים ליצור תת טבלה ב- Pandas המשתמשות בפונקציות נוספות. אחת מהדרכים היא באמצעות ההוראה query כמו בדוגמה הבאה:

price_with_garage = houses.query('garage == 1')['price']
price_without_garage = houses.query('garage == 0')['price']


 

נכתב על ידי יובל מרנין.
לחברות המעוניינות בשירותי פרילנס או סדנאות של אנליסט, ניתן לפנות אליי [email protected]

Yuval Marnin

לחברות המעוניינות בשירותי פרילנס או מנטורינג של אנליסט, ניתן לפנות אליי ל[email protected]