داده‌های گمشده

برخورد با مقادیر گمشده (NaN): تشخیص، تصمیم حذف یا پرکردن، روش‌های fillna و dropna و قواعد انتخاب روش درست

مشکل داده گمشده

در داده واقعی، همیشه بعضی مقادیر خالی هستند: کاربری سن را وارد نکرده، سنسور لحظه‌ای از کار افتاده یا فرمی اجباری نبوده است. در pandas این مقادیر با NaN (Not a Number) نمایش داده می‌شوند. مشکل بزرگ: NaN مسری است؛ هر محاسبه‌ای که به آن برسد، خودش هم NaN می‌شود!

گام ۱: تشخیص

df.isnull().sum()   # تعداد گمشده در هر ستون
df.isnull().mean()  # درصد گمشده در هر ستون

در پایتون خالص، مقادیر None یا رشته خالی را با is None یا == "" می‌بینیم.

گام ۲: تحلیل الگو

قبل از هر اقدامی بپرسید: چرا این داده غایب است؟

گام ۳: انتخاب روش

روش ۱: حذف (dropna)

df = df.dropna()              # حذف سطرهای دارای گمشده
df = df.dropna(subset=["age"]) # فقط اگر age گمشده بود

کی مناسب است؟ وقتی تعداد گمشده‌ها کم (زیر ۵٪) و تصادفی است.

خطر: اگر ستونی ۴۰٪ گمشده داشته باشد، حذف یعنی از دست‌دادن نیمی از داده!

روش ۲: پرکردن (fillna)

# پرکردن با میانگین (برای داده عددی متقارن)
df["age"] = df["age"].fillna(df["age"].mean())

# پرکردن با میانه (وقتی داده پرت دارد)
df["income"] = df["income"].fillna(df["income"].median())

# پرکردن با مد (برای داده دسته‌ای)
df["city"] = df["city"].fillna(df["city"].mode()[0])

# پرکردن با مقدار ثابت
df["score"] = df["score"].fillna(0)

روش ۳: روش‌های پیشرفته (اشاره)

پرکردن هوشمند با مدل (مثل KNN یا رگرسیون) یا روش forward/backward fill برای داده‌های سری زمانی:

df["price"] = df["price"].ffill()  # مقدار قبلی معتبر را تکرار کن

جدول راهنمای انتخاب روش

وضعیتروش پیشنهادی
گمشده کمتر از ۵٪ و تصادفیحذف سطر (dropna)
ستون عددی متقارنپرکردن با میانگین
ستون عددی دارای پرت/کجپرکردن با میانه
ستون دسته‌ایپرکردن با مد یا دسته «نامشخص»
سری زمانیffill / bfill
گمشده بیش از ۴۰-۵۰٪ ستونحذف کل ستون!
هشدار: هرگز قبل از تقسیم Train/Test با میانگین «کل داده» پر نکنید؛ میانگین را فقط از داده آموزش بگیرید وگرنه نشت داده (Data Leakage) رخ می‌دهد.

جمع‌بندی

این مبحث بخشی از دوره آموزش کامل علم داده است.

ابزارهای مرتبط