NumPy: مشروع — تنظيف البيانات

آخر تحديث: 2026-08-26

1. مشروع: تنظيف البيانات باستخدام NumPy

(1) السيناريو

أنت محلل بيانات. تستلم ملف CSV يحتوي على 10,000 صف من بيانات أجهزة الاستشعار — لكنها غير مرتبة: قيم مفقودة، قيم شاذة، مقاييس غير متسقة، وصفوف مكررة.

(2) المهام

1. التحميل والفحص

PYTHON
import numpy as np

# تحميل البيانات (محاكاة)
rng = np.random.default_rng(42)
n = 10000

---
## 2. توليد بيانات نظيفة
temperature = rng.normal(25, 5, n)  # متوسط 25°C، انحراف معياري 5°C
humidity = rng.uniform(30, 80, n)    # 30-80%
pressure = rng.normal(1013, 10, n)   # متوسط 1013 hPa

---
## 3. إضافة بعض قيم NaN
temperature[0:50] = np.nan
humidity[200:250] = np.nan

---
## 4. إضافة قيم شاذة
temperature[1000:1010] = 100  # درجة حرارة مستحيلة
pressure[2000:2005] = 0       # ضغط مستحيل

---
## 5. تكديس في مصفوفة مهيكلة
data = np.column_stack([temperature, humidity, pressure])
print(f"Shape: {data.shape}")
print(f"NaN count: {np.sum(np.isnan(data), axis=0)}")

2. معالجة القيم المفقودة

PYTHON
---
## 6. استبدال NaN بمتوسط العمود
col_mean = np.nanmean(data, axis=0)
data_clean = np.where(np.isnan(data), col_mean, data)

3. إزالة القيم الشاذة (طريقة IQR)

PYTHON
---
## 7. إزالة القيم الشاذة باستخدام IQR
Q1 = np.percentile(data_clean, 25, axis=0)
Q3 = np.percentile(data_clean, 75, axis=0)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

---
## 8. تصفية الصفوف التي تقع ضمن الحدود لجميع الأعمدة
mask = np.all((data_clean >= lower) & (data_clean <= upper), axis=1)
data_filtered = data_clean[mask]
print(f"Rows before: {len(data_clean)}, after: {len(data_filtered)}")

4. تسوية الأعمدة (Z-score)

PYTHON
mean = data_filtered.mean(axis=0)
std = data_filtered.std(axis=0)
data_normalized = (data_filtered - mean) / std
print(f"Normalized mean: {data_normalized.mean(axis=0).round(6)}")
print(f"Normalized std:  {data_normalized.std(axis=0).round(6)}")

5. تصدير البيانات النظيفة

PYTHON
---
## 9. حفظ البيانات المنظفة
np.save('sensor_data_clean.npy', data_filtered)
np.savetxt('sensor_data_clean.csv', data_filtered, delimiter=',',
           header='temperature,humidity,pressure', comments='')
print("Clean data exported.")

▶ مثال: تحميل وفحص البيانات (الصعوبة ⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
data = rng.normal(25, 5, size=(1000, 3))
print("Shape:", data.shape)
print("First 5 rows:\n", data[:5])
print("NaN count:", np.sum(np.isnan(data)))
print("Mean:", data.mean(axis=0))
print("Std:", data.std(axis=0))

المخرجات:

TEXT 📖 للعرض فقط
Shape:
First 5 rows:\n
NaN count:
Mean:
Std:

المخرجات:

TEXT 📖 للعرض فقط
Shape: (1000, 3)
First 5 rows:
 [[28.698 20.884 28.847]
 [24.899 25.891 29.574]
 [27.198 28.793 25.009]
 [24.694 25.771 25.929]
 [26.676 25.174 23.938]]
NaN count: 0
Mean: [25.045 24.908 25.039]
Std: [5.019 5.045 5.030]

▶ مثال: معالجة القيم المفقودة باستخدام np.where (الصعوبة ⭐⭐)

PYTHON
import numpy as np

data = np.array([1.0, 2.0, np.nan, 4.0, np.nan, 6.0, 7.0])

---
## 10. استبدال NaN بمتوسط العمود
col_mean = np.nanmean(data)
clean = np.where(np.isnan(data), col_mean, data)
print("Original:", data)
print("Cleaned:", clean)
print("Mean after:", clean.mean())

المخرجات:

TEXT 📖 للعرض فقط
Original:
Cleaned:
Mean after:

المخرجات:

TEXT 📖 للعرض فقط
Original: [ 1.  2. nan  4. nan  6.  7.]
Cleaned: [1.  2.  4.  4.  4.  6.  7.]
Mean after: 4.0

▶ مثال: إزالة القيم الشاذة باستخدام IQR (الصعوبة ⭐⭐)

PYTHON
import numpy as np

rng = np.random.default_rng(42)
data = np.concatenate([rng.normal(50, 10, 95), [200, -50, 300, -80, 150]])

Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

filtered = data[(data >= lower) & (data <= upper)]
print(f"Total: {len(data)}, Outliers: {len(data) - len(filtered)}")
print(f"Before: mean={data.mean():.1f}, After: mean={filtered.mean():.1f}")

المخرجات:

TEXT 📖 للعرض فقط
# تم التنفيذ بنجاح

المخرجات:

TEXT 📖 للعرض فقط
Total: 100, Outliers: 5
Before: mean=56.8, After: mean=49.1



❓ أسئلة شائعة

س ماذا لو كانت بياناتي تحتوي على أعمدة نصية؟
ج loadtxt في NumPy لا يمكنها التعامل مع الأنواع المختلطة. استخدم np.genfromtxt مع dtype=None للبيانات المختلطة، أو استخدم Pandas لملفات CSV المعقدة.
س كيف أعرف مضاعف IQR الذي يجب استخدامه؟
ج 1.5 هو المعيار للقيم الشاذة "المعتدلة"، 3.0 للقيم الشاذة "المتطرفة". هذه تأتي من التوزيع الطبيعي المعياري حيث 1.5×IQR ≈ ±2.7σ.
س هل يجب التسوية قبل أو بعد إزالة القيم الشاذة؟
ج بعد. القيم الشاذة تحرف المتوسط والانحراف المعياري، مما يجعل التسوية أقل فعالية. نظف البيانات دائمًا أولاً، ثم سويها.

📖 ملخص

في هذا المشروع طبقت:


📝 تمارين

  1. مبتدئ (الصعوبة ⭐): عدّل مضاعف IQR إلى 3.0. كم عددًا أقل من القيم الشاذة يتم اكتشافها؟

  2. متوسط (الصعوبة ⭐⭐): أضف عمودًا لـ 'timestamp' وصفي البيانات خارج ساعات العمل (9 صباحًا - 5 مساءً).

  3. متقدم (الصعوبة ⭐⭐⭐): نفذ نافذة متحركة لاكتشاف القيم الشاذة — حدد النقطة كقيمة شاذة فقط إذا كانت خارج نطاق IQR لجوارها المحلي (100 نقطة محيطة).

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%