طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 25 · الوحدة 12: تقديم توقعات دقيقة بتعلم الآلة

أمان البيانات والخصوصية في التحليل

بيانات الناس أمانة؛ كيف نحلّلها دون أن ننتهك خصوصيتهم؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تدرك أن تحليل بيانات الناس مسؤولية قانونية وأخلاقية.
  • تطبّق مبدأ التقليل وإخفاء الهوية.
  • تحذر إعادة التعرّف من الحقول شبه المعرّفة.
  • تنشر نتائج مجمّعة لا صفوفًا فردية.

١البيانات مسؤولية لا مِلك

تحليل بيانات الناس يحمل واجبًا أخلاقيًّا وقانونيًّا. في المملكة يحكمه نظام حماية البيانات الشخصية PDPL: اجمع ما تحتاجه فقط، لغرضٍ معلوم، واحمِه، ولا تحتفظ به أطول من اللازم. التحليل الجيّد يحترم الخصوصية بالتصميم لا بعد الحادثة.

المبدأالمعنى في التحليل
التقليللا تجمع حقلًا لن تحلّله
الغرضاستخدم البيانات لما جُمِعت له
الحمايةقيّد الوصول وشفّر الحسّاس
إخفاء الهويةحلّل بلا معرفة هوية الأفراد حيثما أمكن

٢إخفاء الهوية: أزل المعرّفات

أكثر التحليلات لا تحتاج هويّة الأفراد، بل أنماطهم. فنزيل المعرّفات المباشرة (اسم، بريد، هاتف) قبل التحليل:

main.py
import pandas as pdusers = pd.DataFrame({    "name":  ["سارة", "خالد", "نورة", "سعد"],    "email": ["sara@mail.sa", "k@mail.sa", "n@mail.sa", "s@mail.sa"],    "city":  ["الرياض", "جدة", "الرياض", "جدة"],    "age":   [25, 31, 28, 40],    "spend": [300, 150, 420, 90],})# أزل المعرّفات المباشرةanon = users.drop(columns=["name", "email"])print(anon)# التحليل يعمل دون أي هويّةprint("متوسط الإنفاق حسب المدينة:")print(anon.groupby("city")["spend"].mean())
Shell×
>>> %Run main.py
city age spend
0 الرياض 25 300
1 جدة 31 150
2 الرياض 28 420
3 جدة 40 90
متوسط الإنفاق حسب المدينة:
city
الرياض 360.0
جدة 120.0
Name: spend, dtype: float64
>>>

حذفنا الاسم والبريد، وبقي التحليل كاملًا: متوسط الإنفاق حسب المدينة لا يحتاج معرفة من. هذا جوهر التقليل.

٣حذر: إعادة التعرّف

حذف الاسم لا يكفي دائمًا. تركيبةٌ من حقولٍ شبه معرّفة (مدينة + عمر + مهنة) قد تعيد التعرّف على فرد. مقياس بسيط: k-إخفاء — ألّا تقلّ كل تركيبة عن k أفراد:

main.py
import pandas as pdusers = pd.DataFrame({    "name":  ["سارة", "خالد", "نورة", "سعد"],    "email": ["sara@mail.sa", "k@mail.sa", "n@mail.sa", "s@mail.sa"],    "city":  ["الرياض", "جدة", "الرياض", "جدة"],    "age":   [25, 31, 28, 40],    "spend": [300, 150, 420, 90],})# كم فردًا في كل تركيبة (مدينة)؟groups = users.groupby("city").size()print(groups)k = groups.min()print("أصغر مجموعة k =", k)print("آمن عند k>=2؟", bool(k >= 2))
Shell×
>>> %Run main.py
city
الرياض 2
جدة 2
dtype: int64
أصغر مجموعة k = 2
آمن عند k>=2؟ True
>>>

توقّع وتحقّق

النظام المحلي لحماية البيانات الشخصية:

«لا تجمع حقلًا لن تحلّله» مبدأ:

إزالة الاسم والبريد قبل التحليل:

تركيبة مدينة+عمر قد تؤدّي إلى:

الخلاصة

تحدٍّ برمجي: أخفِ الهوية

متقدم

أزل المعرّفات المباشرة (الاسم والبريد)، ثم اطبع عدد الأعمدة الباقية، وحجم أصغر مجموعة مدينة (قيمة k).

المطلوب:
  • احذف name وemail.
  • اطبع عدد الأعمدة الباقية، ثم حجم أصغر تجمّع حسب city.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
import pandas as pdusers = pd.DataFrame({    "name":  ["سارة", "خالد", "نورة", "سعد"],    "email": ["sara@mail.sa", "k@mail.sa", "n@mail.sa", "s@mail.sa"],    "city":  ["الرياض", "جدة", "الرياض", "جدة"],    "age":   [25, 31, 28, 40],    "spend": [300, 150, 420, 90],})# أزل name و email، ثم اطبع عدد الأعمدة الباقية وأصغر مجموعة مدينة (k)
المطلوب×
3
2
💡 تلميح 1
احذف: users.drop(columns=["name", "email"]).
💡 تلميح 2
k: groupby("city").size().min().

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
import pandas as pdusers = pd.DataFrame({    "name":  ["سارة", "خالد", "نورة", "سعد"],    "email": ["sara@mail.sa", "k@mail.sa", "n@mail.sa", "s@mail.sa"],    "city":  ["الرياض", "جدة", "الرياض", "جدة"],    "age":   [25, 31, 28, 40],    "spend": [300, 150, 420, 90],})anon = users.drop(columns=["name", "email"])print(anon.shape[1])print(int(anon.groupby("city").size().min()))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس