שליטה באמנות ניקוי הנתונים ב-Python - KDnuggets

שליטה באמנות ניקוי הנתונים ב-Python - KDnuggets

צומת המקור: 2939047

שליטה באמנות ניקוי הנתונים ב-Python
תמונה מאת המחבר
 

Data cleaning is a critical part of any data analysis process. It’s the step where you remove errors, handle missing data, and make sure that your data is in a format that you can work with. Without a well-cleaned dataset, any subsequent analyses can be skewed or incorrect.

מאמר זה מציג בפניכם מספר טכניקות מפתח לניקוי נתונים ב-Python, תוך שימוש בספריות עוצמתיות כמו פנדות, numpy, seaborn ו-matplotlib.

Before diving into the mechanics of data cleaning, let’s understand its importance. Real-world data is often messy. It can contain duplicate entries, incorrect or inconsistent data types, missing values, irrelevant features, and outliers. All these factors can lead to misleading conclusions when analyzing data. This makes data cleaning an indispensable part of the data science lifecycle.

נסקור את משימות ניקוי הנתונים הבאות.
 

שליטה באמנות ניקוי הנתונים ב-Python
תמונה מאת המחבר

Before getting started, let’s import the necessary libraries. We’ll be using pandas for data manipulation, and seaborn and matplotlib for visualizations.

אנו גם נייבא את מודול ה-datetime Python לצורך מניפולציה של התאריכים.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

First, we’ll need to load our data. In this example, we’re going to load a CSV file using pandas. We also add the delimiter argument.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

Next, it’s important to inspect the data to understand its structure, what kind of variables we’re working with, and whether there are any missing values. Since the data we imported is not huge, let’s have a look at the whole dataset.

# Look at all the rows of the dataframe
display(df)

כך נראה מערך הנתונים.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

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

כעת, בואו נסתכל על סיכום DataFrame באמצעות שיטת info() .

# Get a concise summary of the dataframe
print(df.info())

הנה פלט הקוד.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

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

מיקום העמודה ריק לחלוטין. האם אנחנו צריכים את זה?

אנו נראה לך כיצד לטפל בבעיות אלו. נתחיל בלמד כיצד למחוק עמודות מיותרות.

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

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

אנו משתמשים בשיטת drop() עם שם העמודה שצוין. הגדרנו את הציר ל-1 כדי לציין שאנו רוצים למחוק עמודה. כמו כן, הארגומנט inplace מוגדר כ-True כך שנשנה את ה-DataFrame הקיים, ולא ניצור DataFrame חדש ללא העמודה שהוסרה.

df.drop('buyer', axis = 1, inplace = True)

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

אנו נוקטים באותה גישה כמו בעמודה הראשונה.

df.drop('location', axis = 1, inplace = True)

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

df = df.drop(['buyer', 'location'], axis=1)

שתי הגישות מחזירות את מסגרת הנתונים הבאה.

 

שליטה באמנות ניקוי הנתונים ב-Python

נתונים כפולים יכולים להתרחש במערך הנתונים שלך מסיבות שונות ויכולים להטות את הניתוח שלך.

בואו לזהות את הכפילויות במערך הנתונים שלנו. הנה איך לעשות את זה.

הקוד שלהלן משתמש בשיטה מוּעֲתָק() לשקול כפילויות בכל מערך הנתונים. הגדרת ברירת המחדל שלו היא לשקול את ההופעה הראשונה של ערך כייחודית ואת ההתרחשויות הבאות ככפולות. אתה יכול לשנות התנהגות זו באמצעות לשמור פָּרָמֶטֶר. לדוגמה, df.duplicated(keep=False) יסמן את כל הכפילויות כ-True, כולל המופע הראשון.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

הנה הפלט.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

השורה עם אינדקס 3 סומנה ככפולה מכיוון ששורה 2 עם אותם ערכים היא המופע הראשון שלה.

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

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

השמיים drop_duplicates() function considers all columns while identifying duplicates. If you want to consider only certain columns, you can pass them as a list to this function like this: df.drop_duplicates(subset=[‘column1’, ‘column2’]).

 

שליטה באמנות ניקוי הנתונים ב-Python
 

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

df = df.reset_index(drop=True)

משימה זו מבוצעת באמצעות ה reset_index() פוּנקצִיָה. הארגומנט drop=True משמש לביטול האינדקס המקורי. אם לא תכלול ארגומנט זה, האינדקס הישן יתווסף כעמודה חדשה ב-DataFrame שלך. על ידי הגדרת drop=True, אתה אומר לפנדות לשכוח את האינדקס הישן ולאפס אותו לאינדקס השלם של ברירת המחדל.

לתרגול, נסה הסר כפילויות ממערך הנתונים הזה של Microsoft.

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

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

הדרך הקלה ביותר היא להשתמש ב- to_datetime() שיטה. שוב, אתה יכול לעשות את זה עמודה אחר עמודה, כפי שמוצג להלן.

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

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

אתה יכול גם להמיר את שתי העמודות בו-זמנית על ידי שימוש ב- להגיש מועמדות() שיטה עם to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

שתי הגישות נותנות לך את אותה תוצאה.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

כעת התאריכים הם במתכונת עקבית. אנו רואים שלא כל הנתונים הומרו. יש ערך NaT אחד בתאריך_מודעה ושניים בתאריך_מכירה. זה אומר שהתאריך חסר.

בואו נבדוק אם העמודות מומרות לתאריכים באמצעות ה- מידע () שִׁיטָה.

# Get a concise summary of the dataframe
print(df.info())

 

שליטה באמנות ניקוי הנתונים ב-Python
 

כפי שאתה יכול לראות, שתי העמודות אינן בפורמט datetime64[ns].

כעת, נסה להמיר את הנתונים מ-TEXT ל-NUMERIC בזה מערך הנתונים של Airbnb.

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

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

מחיקת שורות עם ערכים חסרים

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

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

הנה הקוד שבו אנו מציינים את האינדקס של השורה.

df = df.drop(8)

ה-DataFrame כעת נראה כך.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

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

זקיפת ערכים חסרים

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

ב-DataFrame שכבר השתנה, יש לנו ערכי NaT (לא זמן) בעמודות תאריך_מודעה ותאריך_מכירה. אנו נייחס את הערכים החסרים הללו באמצעות ה- מתכוון() שִׁיטָה.

הקוד משתמש ב- fillna() שיטה למצוא ולמלא את ערכי האפס בערך הממוצע.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

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

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

הפלט בשני המקרים נראה כך.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

בעמודה sale_date שלנו יש כעת זמנים שאיננו צריכים. בוא נסיר אותם.

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

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

שליטה באמנות ניקוי הנתונים ב-Python
 

התאריכים נראים כעת מסודרים.

אם אתה צריך להשתמש זמן עבודה () בעמודות מרובות, תוכל שוב להשתמש למבדה בדרך הבאה.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

כעת, בואו נראה כיצד נוכל לזקוף ערכים חסרים.

Categorical data is a type of data that is used to group information with similar characteristics. Each of these groups is a category. Categorical data can take on numerical values (such as “1” indicating “male” and “2” indicating “female”), but those numbers do not have mathematical meaning. You can’t add them together, for instance.

נתונים קטגוריים מחולקים בדרך כלל לשתי קטגוריות:

  1. נתונים נומינליים: זה כאשר הקטגוריות מסומנות רק ולא ניתן לסדר אותן בסדר מסוים. דוגמאות כוללות מין (זכר, נקבה), סוג דם (A, B, AB, O) או צבע (אדום, ירוק, כחול).
  1. נתונים סידוריים: זה כאשר ניתן לסדר או לדרג את הקטגוריות. בעוד שהמרווחים בין הקטגוריות אינם מרווחים באופן שווה, לסדר הקטגוריות יש משמעות. דוגמאות כוללות סולמות דירוג (1 עד 5 דירוג של סרט), רמת השכלה (תיכון, תואר ראשון, בוגר), או שלבים של סרטן (שלב I, שלב II, שלב III).

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

בואו נחליף את הערכים החסרים במצב.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

קוד זה משתמש fillna() פונקציה כדי להחליף את כל ערכי ה-NaN בעמודה property_category. זה מחליף אותו במצב.

Additionally, the [0] part is used to extract the first value from this Series. If there are multiple modes, this will select the first one. If there’s only one mode, it still works fine.

הנה הפלט.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

הנתונים כעת נראים די טובים. הדבר היחיד שנותר הוא לראות אם יש חריגים.

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

Outliers are data points in a dataset that are distinctly different from the other observations. They may lie exceptionally far from the other values in the data set, residing outside an overall pattern. They’re considered unusual due to their values either being significantly higher or lower compared to the rest of the data.

חריגים יכולים להיווצר מסיבות שונות כגון:

  • שגיאות מדידה או קלט
  • שחיתות נתונים
  • חריגות סטטיסטיות אמיתיות

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

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

Visualizing data can help identify outliers. Seaborn’s boxplot is handy for this.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

אנו משתמשים ב- plt.figure() כדי להגדיר את הרוחב והגובה של הדמות באינצ'ים.

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

 

שליטה באמנות ניקוי הנתונים ב-Python
 

ניתן לשפר את העלילה לשימוש קל יותר על ידי הוספת זה לקוד לעיל.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

אנו משתמשים בקוד לעיל כדי להגדיר את התוויות עבור שני הצירים. אנו גם שמים לב שהערכים על ציר ה-y נמצאים בסימון המדעי, ואיננו יכולים להשתמש בזה עבור ערכי המחיר. אז אנחנו משנים את זה לסגנון רגיל באמצעות הפונקציה plt.ticklabel_format()‎.

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

הפלט כעת נראה כך.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

כעת, כיצד אנו מזהים ומסירים את החריג?

אחת הדרכים היא להשתמש בשיטת IQR.

IQR, או Interquartile Range, היא שיטה סטטיסטית המשמשת למדידת שונות על ידי חלוקת מערך נתונים לרבעונים. רבעונים מחלקים מערך נתונים לפי סדר דירוג לארבעה חלקים שווים, וערכים בטווח של הרבעון הראשון (האחוזון ה-25) והרבעון השלישי (האחוזון ה-75) מהווים את הטווח הבין-רבעוני.

The interquartile range is used to identify outliers in the data. Here’s how it works:

  1. First, calculate the first quartile (Q1), the third quartile (Q3), and then determine the IQR. The IQR is computed as Q3 – Q1.
  2. Any value below Q1 – 1.5IQR or above Q3 + 1.5IQR is considered an outlier.

On our boxplot, the box actually represents the IQR. The line inside the box is the median (or second quartile). The ‘whiskers’ of the boxplot represent the range within 1.5*IQR from Q1 and Q3.

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

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

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

תחילה אנו מחשבים את הרבעון הראשון (או האחוזון ה-25) באמצעות ה- quantile() פוּנקצִיָה. אנו עושים את אותו הדבר עבור הרבעון השלישי או האחוזון ה-75.

הם מציגים את הערכים שמתחתם נופלים 25% ו-75% מהנתונים, בהתאמה.

לאחר מכן אנו מחשבים את ההפרש בין הרביעונים. הכל עד כה הוא רק תרגום שלבי IQR לקוד Python.

As a final step, we remove the outliers. In other words, all data less than Q1 – 1.5 * IQR or more than Q3 + 1.5 * IQR.

The ‘~’ operator negates the condition, so we are left with only the data that are not outliers.

אז נוכל לעשות את אותו הדבר עם מחיר המכירה.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

כמובן, אתה יכול לעשות את זה בצורה יותר תמציתית באמצעות לולאה.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

הלולאה חוזרת על שתי העמודות. עבור כל עמודה, הוא מחשב את ה-IQR ולאחר מכן מסיר את השורות ב-DataFrame.

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

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

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

הנה הפלט.

 

שליטה באמנות ניקוי הנתונים ב-Python
 

אתה יכול לתרגל חישוב אחוזונים ב- Python על ידי פתרון ה שאלת ראיון באסיפה הכללית.

Data cleaning is a crucial step in the data analysis process. Though it can be time-consuming, it’s essential to ensure the accuracy of your findings.

Fortunately, Python’s rich ecosystem of libraries makes this process more manageable. We learned how to remove unnecessary rows and columns, reformat data, and deal with missing values and outliers. These are the usual steps that have to be performed on most any data. However, you’ll also sometimes need to לשלב שתי עמודות לאחת, לאמת את הנתונים הקיימים, להקצות לו תוויות, או להיפטר מהרווחים הלבנים.

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

אם אתה לא רואה את הסיפוק בתוצאה הזו והנתונים הנקיים לא גורמים לך להתרגש בצורה מוזרה, מה לעזאזל אתה עושה במדעי הנתונים!?
 

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

בול זמן:

עוד מ KDnuggets