بهترین نکات برای پاک‌سازی داده‌ با کمک پایتون و پانداز

فهرست مطالب

می خواهید پاکسازی داده را با پانداس یاد بگیرید؟ این آموزش به شما هر آنچه را که نیاز دارید، یاد می‌دهد.

پانداس یک کتابخانه از پایتون است که به طور گسترده برای تجزیه و تحلیل و دستکاری داده استفاده می‌شود. اما داده‌هایی که شما از منبع میخوانید اغلب قبل از اینکه بتوانید آنها را برای به دست آوردن بینش (نگرش)، پاسخ به سوالات تجاری یا ساخت مدل‌های یادگیری ماشین تجزیه و تحلیل کنید، نیاز به یک سری مراحل پاکسازی داده دارد. این راهنما فرآیند پاکسازی داده با پانداس را به 7 مرحله عملی تقسیم می‌کند. ما یک نمونه دیتاست را ایجاد می‌کنیم و مراحل پاکسازی داده را طی خواهیم نمود.

ایجاد یک دیتافریم نمونه

قبل از شروع مراحل پاکسازی داده، یک دیتافریم (DataFrame) پانداس با رکوردهای کارمند ایجاد می‌کنیم. از کتابخانه Faker برای تولید داده‌های ساختگی استفاده خواهیم کرد. پس ابتدا آن را نصب کنید. برای نصب به خط فرمان رفته و دستور زیر را وارد نمائید

pip install Faker

توجه کنید که فیکر با حرف بزرگ باید نوشته شود (Faker). در صورت تمایل، می‌توانید همین مثال را دنبال کنید. همچنین می‌توانید از مجموعه داده‌ی دلخواه خود استفاده کنید. در اینجا و در ادامه کدی برای تولید 1000 رکورد آمده است:

import pandas as pd
from faker import Faker
import random

# Initialize Faker to generate synthetic data
fake = Faker()

# Set seed for reproducibility
Faker.seed(42)

# Generate synthetic data
data = []
for _ in range(1000):
    data.append({
        'Name': fake.name(),
        'Age': random.randint(18, 70),
        'Email': fake.email(),
        'Phone': fake.phone_number(),
        'Address': fake.address(),
        'Salary': random.randint(20000, 150000),
        'Join_Date': fake.date_this_decade(),
        'Employment_Status': random.choice(['Full-Time', 'Part-Time', 'Contract']),
        'Department': random.choice(['IT', 'Engineering','Finance', 'HR', 'Marketing'])
    })

حالا بیایید کمی روی این دیتافریم کار کنیم تا مقادیر گم‌شده، رکوردهای تکراری، داده‌های پرت و موارد دیگر را به آن اضافه کنیم:

# Let's tweak the records a bit!
# Introduce missing values
for i in random.sample(range(len(data)), 50):
    data[i]['Email'] = None

# Introduce duplicate records
data.extend(random.sample(data, 100))

# Introduce outliers
for i in random.sample(range(len(data)), 20):
    data[i]['Salary'] = random.randint(200000, 500000)

حال وقت این است که یک دیتافریم با این رکوردها بسازیم:

# Create dataframe
df = pd.DataFrame(data)

توجه کنید که Seed روی Faker تنظیم شده، نه روی random. یعنی اطلاعاتی که درست میکنی کمی تصادفی خواهد شد.

مرحله 1: فهمیدن داده‌ها

قبل از اینکه کار خاصی روی داده‌ها انجام بدیم، باید یک دید کلی از اطلاعات داشته باشیم، ببینید هر ستون چی داره، چندتا رکورد هست و … اینجا از روش ()info برای نمایش اطلاعات کلی استفاده می‌کنیم.

df.info()


Output >>>

RangeIndex: 1100 entries, 0 to 1099
Data columns (total 9 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   Name               1100 non-null   object
 1   Age                1100 non-null   int64 
 2   Email              1047 non-null   object
 3   Phone              1100 non-null   object
 4   Address            1100 non-null   object
 5   Salary             1100 non-null   int64 
 6   Join_Date          1100 non-null   object
 7   Employment_Status  1100 non-null   object
 8   Department         1100 non-null   object
dtypes: int64(2), object(7)
memory usage: 77.5+ KB

حالا با دستور زیر می‌توانیم 5 ردیف اول دیتافریم را بدست آوریم:

df.head()

خروجی همانند تصویر زیر خواهد بود

مرحله 2: بررسی ردیف‌های تکراری:

اکنون میخواهیم به حذف ردیف‌های تکراری در دیتافریم بپردازیم این ردیف‌های تکراری باعث ایجاد مشکل در تحلیل داده‌ها می‌شوند، چون نتایج را انحراف میدهند. به همین خاطر، لازمه که این ردیف‌ها رو شناسایی و حذف کنیم تا فقط با داده‌های منحصربه‌فرد و بدون تکرار کار کنیم. به این ترتیب، تحلیل دقیق‌تری خواهیم داشت.

# Check for duplicate rows
duplicates = df.duplicated().sum()
print("Number of duplicate rows:", duplicates)

# Removing duplicate rows
df.drop_duplicates(inplace=True)
 
Output >>>
Number of duplicate rows: 100

مرحله 3: مدیریت داده‌های گمشده

داده‌های گمشده (missing values) یکی از مشکلات رایج در کیفیت داده در بسیاری از پروژه‌های علم داده است .اگر نگاهی به خروجیِ متد   info() از مرحله‌ی قبل بیندازید، احتمالا متوجه خواهید شد که تعداد رکوردهای غیرخالی برای همه‌ی فیلدها یکسان نیست و در ستون ایمیل مقادیر گمشده وجود دارد. با این حال، ما تعداد دقیق آن‌ها را به دست خواهیم آورد .برای به دست آوردن تعداد داده‌های گمشده در هر ستون، می‌توانید کد زیر را اجرا کنید:

# Check for missing values
missing_values = df.isna().sum()
print("Missing Values:")
print(missing_values)
 
Output >>>
Missing Values:
Name                  0
Age                   0
Email                50
Phone                 0
Address               0
Salary                0
Join_Date             0
Employment_Status     0
Department            0
dtype: int64

اگر در یک یا چند ستون عددی، داده‌های گمشده وجود داشته باشد، می‌توانیم از تکنیک‌های جایگذاری مناسب (مانند میانگین یا میانه) برای پر کردن آن‌ها استفاده کنیم. اما از آنجایی که فیلد «ایمیل» حاوی داده‌های متنی است و امکان جایگذاری با تکنیک‌های عددی وجود ندارد، بیایید به سادگی ایمیل‌های گمشده را با یک ایمیل پیش‌فرض جایگزین کنیم.

# Handling missing values by filling with a placeholder
df['Email'].fillna('unknown@example.com', inplace=True)

مرحله 4: تبدیل داده‌ها

وقتی با یک دیتاست کار می‌کنیم، ممکنه یک یا چند تا از فیلدها، نوع داده‌ی مورد انتظار رو در دیتافریم ما نداشته باشند. مثلن در اینجا، فیلد «تاریخ عضویت» (Join_Date) باید به یک تاریخ و زمان معتبر تبدیل بشه.

# Convert 'Join_Date' to datetime
df['Join_Date'] = pd.to_datetime(df['Join_Date'])
print("Join_Date after conversion:")
print(df['Join_Date'].head())

Output >>>
Join_Date after conversion:
0   2023-07-12
1   2020-12-31
2   2024-05-09
3   2021-01-19
4   2023-10-04
Name: Join_Date, dtype: datetime64[ns]

از اونجایی که تاریخ عضویت رو داریم، در واقع داشتن یک ستون به نام «سال‌های کاری» (Years_Employed) به شکل زیر، مفیدتره:

# Creating a new feature 'Years_Employed' based on 'Join_Date'
df['Years_Employed'] = pd.Timestamp.now().year - df['Join_Date'].dt.year
print("New feature 'Years_Employed':")
print(df[['Join_Date', 'Years_Employed']].head())
 
Output >>>
New feature 'Years_Employed':
   Join_Date  Years_Employed
0 2023-07-12               1
1 2020-12-31               4
2 2024-05-09               0
3 2021-01-19               3
4 2023-10-04               1

مرحله 5: پاکسازی داده‌های متنی

در برخورد با فیلدهای رشته‌ای (متنی)، اغلب با قالب‌بندی‌های متناقض یا مشکلات مشابه مواجه می‌شویم. پاکسازی متن می‌تواند به سادگی تغییر حروف (بزرگ به کوچک یا برعکس) یا به سختی نوشتن یک عبارت باقاعده‌ی پیچیده برای رسیدن به فرمت مورد نیاز باشد.

در دیتافریمی که داریم، می‌بینیم که ستون «آدرس» حاوی کاراکترهای زیادی از نوع n\ (خط جدید) است که خوانایی را مختل می‌کند. بنابراین، بیایید آن‌ها را با فاصله (Space) جایگزین کنیم، به این ترتیب:

# Clean address strings
df['Address'] = df['Address'].str.replace('\n', ' ', regex=False)
print("Address after text cleaning:")
print(df['Address'].head())

Output >>>
Address after text cleaning:
0    79402 Peterson Drives Apt. 511 Davisstad, PA 35172
1     55341 Amanda Gardens Apt. 764 Lake Mark, WI 07832
2                 710 Eric Estate Carlsonfurt, MS 78605
3                 809 Burns Creek Natashaport, IA 08093
4    8713 Caleb Brooks Apt. 930 Lake Crystalbury, CA...
Name: Address, dtype: object

مرحله 6: تمیز کردن داده‌های پرت

بعضی وقت‌ها توی داده‌هامون اعداد خیلی غیرمعمولی وجود داره، مثل حقوق‌های خیلی بالا که اشتباه وارد شدن. اینا رو باید پیدا کنیم و کاری کنیم که بقیه اطلاعات رو خراب نکنند. می‌تونیم ببینیم کدوم داده‌ها خیلی با بقیه فرق دارن و بعد یا پاکشون کنیم یا جداگونه بررسی‌شون کنیم.

حالا می‌خواهیم از یه روش به اسم «z-score» استفاده کنیم تا حقوق‌های عجیب و غریب رو پیدا کنیم.

# Detecting outliers using z-score
z_scores = (df['Salary'] - df['Salary'].mean()) / df['Salary'].std()
outliers = df[abs(z_scores) > 3]
print("Outliers based on Salary:")
print(outliers[['Name', 'Salary']].head())

 Output >>>
Outliers based on Salary:
                Name  Salary
16    Michael Powell  414854
131    Holly Jimenez  258727
240  Daniel Williams  371500
328    Walter Bishop  332554
352     Ashley Munoz  278539

مرحله 7: ادغام کردن داده‌ها

تو اکثر پروژه‌ها، اطلاعاتی که دارین ممکنه همون اطلاعاتی نباشه که برای تحلیل لازمه. باید فیلدهای مرتبط رو پیدا کنین و همچنین داده‌ها رو از سایر جداول (دیتافریم‌ها) ادغام کنین تا اطلاعات مفیدتری واسه تحلیل به دست بیاد.

یه تمرین کوچیک:  یه دیتافریم مرتبط بسازین و اون رو با جدول فعلی بر اساس یه ستون مشترک ادغام کنین. ادغام کردن در پانداس خیلی شبیه به دستورهای الحاق (Join) در SQL هستش، پس این تمرین رو حتما امتحان کنین!

جمع‌بندی

خب اینم از این آموزش! ما یه نمونه جدول (دیتافریم) با رکوردهای مختلف درست کردیم و مراحل مختلف پاکسازی داده رو یاد گرفتیم. این مراحل شامل آشنایی با داده، مدیریت مقادیر تکراری، مدیریت داده‌های گم‌شده، تبدیل داده‌ها، پاکسازی داده‌های متنی، کار با داده‌های عجیب و غریب و ادغام داده‌ها میشه.

منبع

اگر علاقمند ورود به دنیای مهندسی داده هستید، می‌توانید با این دوره آغاز کنید

سایر مقالات مجموعه:

پست‌های مرتبط با این مقاله:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *