أي تحليل، مهما كان متقدماً، لا يكون أدق من البيانات التي بُني عليها. لوحة مؤشرات تعرض مبيعات مضاعفة بسبب صفوف مكررة، أو استبانة تُحسب فيها مدينة واحدة كثلاث مدن لأنها كُتبت بثلاث طرق، كلها أخطاء تقود إلى قرارات خاطئة. وتنظيف البيانات يستهلك عادة جزءاً كبيراً من وقت أي مشروع تحليل، لذلك يستحق منهجية واضحة.
1. احتفظ بنسخة أصلية لا تُلمس
قبل أي تعديل، احفظ الملف الأصلي كما وصلك، واعمل دائماً على نسخة. إذا اكتشفت لاحقاً أن خطوة تنظيف كانت خاطئة، ستحتاج للعودة إلى الأصل.
2. افهم البيانات قبل أن تلمسها
ما معنى كل عمود؟ ما نوعه المتوقع (رقم، نص، تاريخ)؟ ما القيم المنطقية له؟ في Python تعطيك أمرين صورة سريعة:
import pandas as pd
df = pd.read_excel("sales.xlsx")
df.info() # أنواع الأعمدة وعدد القيم غير الفارغة
df.describe() # المتوسط والحد الأدنى والأعلى للأعمدة الرقمية
3. احذف التكرار
حدد أولاً ما معنى "مكرر" في بياناتك: صف متطابق بالكامل؟ أم نفس رقم الطلب؟ أم نفس المستجيب أرسل الاستبانة مرتين؟
- في Excel: Data ← Remove Duplicates، واختر الأعمدة التي تحدد التكرار.
- في Python:
print(df.duplicated(subset=["order_id"]).sum()) # عدد الصفوف المكررة df = df.drop_duplicates(subset=["order_id"], keep="first")
4. تعامل مع القيم المفقودة بقرار مدروس
ابدأ بمعرفة حجم المشكلة في كل عمود:
df.isna().sum()
ثم اختر المعالجة المناسبة لكل حالة:
- الحذف: مناسب إذا كانت الصفوف المفقودة قليلة ومتفرقة عشوائياً.
- التعويض: بالوسيط للأعمدة الرقمية (أقل تأثراً بالقيم المتطرفة من المتوسط)، أو بالقيمة الأكثر تكراراً للأعمدة الفئوية.
- إبقاؤها كفئة مستقلة: مثل "غير محدد"، عندما يكون غياب القيمة نفسه معلومة مفيدة.
df["age"] = df["age"].fillna(df["age"].median())
تجنب تعبئة الفراغات بصفر إذا كان للصفر معنى حقيقي، مثل "صفر مبيعات"، لأنك بذلك تخترع بيانات غير صحيحة.
5. وحّد النصوص، وانتبه لخصوصية العربية
"الرياض" و"الرياض " (بمسافة زائدة) و"رياض" و"Riyadh" قيمة واحدة، لكن البرنامج يراها أربع قيم مختلفة. وفي النصوص العربية مشكلة إضافية: اختلاف كتابة الهمزات والتاء المربوطة والألف المقصورة. دالة بسيطة توحدها:
import re
def normalize_ar(text):
text = str(text).strip().lower()
text = re.sub("[إأآ]", "ا", text)
text = text.replace("ة", "ه").replace("ى", "ي")
return text
city_map = {"الرياض": "الرياض", "رياض": "الرياض", "riyadh": "الرياض"}
df["city"] = df["city"].map(normalize_ar).map(city_map).fillna(df["city"])
في Excel تساعدك الدالة TRIM لحذف المسافات الزائدة، وأداة Find & Replace لتوحيد الكتابات المختلفة.
6. صحّح أنواع البيانات والتنسيقات
- أرقام مخزنة كنص: "1,200" أو "1200 ر.س" لا يمكن جمعها قبل تحويلها إلى رقم.
- تواريخ مخزنة كنص أو بتنسيقات مختلفة في العمود نفسه.
- خلط الهجري والميلادي: مشكلة شائعة في البيانات المحلية، وتحتاج تحويلاً موحداً قبل أي تحليل زمني.
df["amount"] = pd.to_numeric(df["amount"].astype(str).str.replace(r"[^\d.]", "", regex=True), errors="coerce") df["order_date"] = pd.to_datetime(df["order_date"], errors="coerce")
الخيار errors="coerce" يحول القيم غير القابلة للتحويل إلى قيمة فارغة بدلاً من إيقاف البرنامج، ثم تراجعها يدوياً.
7. اكشف القيم المتطرفة وقرر بشأنها
الطريقة الأشهر هي قاعدة المدى الربيعي (IQR): أي قيمة أقل من Q1 − 1.5×IQR أو أكبر من Q3 + 1.5×IQR تُعد متطرفة. وهي نفس القاعدة التي يرسم بها مخطط الصندوق (Boxplot).
q1, q3 = df["amount"].quantile([0.25, 0.75]) iqr = q3 - q1 outliers = df[(df["amount"] < q1 - 1.5 * iqr) | (df["amount"] > q3 + 1.5 * iqr)]
لكن الكشف ليس قراراً بالحذف:
- عمر 250 سنة خطأ إدخال، فيُصحح أو يُحذف.
- طلب شراء كبير من عميل مؤسسي قيمة حقيقية، وحذفها يشوه الصورة. قد يكفي تحليلها بشكل منفصل.
8. تحقق من المنطق
بعض الأخطاء لا تكشفها الخطوات السابقة، وتحتاج قواعد خاصة ببياناتك:
- تاريخ التسليم يجب أن يكون بعد تاريخ الطلب.
- مجموع النسب يجب أن يساوي 100%.
- الكمية والسعر لا يكونان سالبين إلا في المرتجعات.
- في الاستبانات: المستجيب الذي اختار نفس الإجابة لكل العبارات، أو أنهى استبانة طويلة في دقيقة واحدة، غالباً لم يقرأ الأسئلة. وتساعد عبارات الانتباه (مثل "اختر موافق بشدة لهذه العبارة") على كشف هذه الحالات.
bad_dates = df[df["delivery_date"] < df["order_date"]]
وثّق كل خطوة، ثم أتمتها
اكتب سجلاً بما فعلته: كم صفاً حذفت ولماذا، وكيف عوضت القيم المفقودة. هذا السجل ضروري في الرسائل العلمية لكتابة فصل المنهجية، وفي الأعمال لتبرير الأرقام أمام الإدارة.
وإذا كانت البيانات تصلك بشكل دوري، مثل تقرير مبيعات شهري، فلا تكرر التنظيف يدوياً كل مرة. أداة Power Query في Excel و Power BI تسجل خطوات التنظيف وتعيد تطبيقها على الملف الجديد بضغطة زر، وكذلك سكربت Python يمكن تشغيله على كل ملف جديد.