من الأرقام إلى قرار: قراءة النتائج
انتهى التحليل؛ كيف نحوّله إلى قرارٍ صائب، ونتجنّب ما يضلّلنا؟ ⏱ نحو 40 دقيقة.
- تحوّل الأرقام إلى توصيةٍ قابلة للتنفيذ.
- تتجنّب فخّ البيانات الضئيلة.
- تميّز الارتباط من السببية.
- تصوغ توصيةً محدّدة وقابلة للقياس.
١البيانات لا تقرّر؛ أنت تقرّر
انتهى التحليل: جداولٌ ورسوم. لكن قيمتها صفر ما لم تتحوّل إلى قرار. هذا الدرس عن أصعب خطوة: تحويل الأرقام إلى توصيةٍ قابلة للتنفيذ، وتجنّب الفخاخ التي تضلّل القرار.
import pandas as pdpages = pd.DataFrame({ "page": ["home", "products", "cart", "checkout", "blog"], "visits": [5000, 3200, 1800, 900, 2600], "exits": [900, 700, 1100, 600, 500], # غادروا الموقع من هذه الصفحة})# معدّل الخروج = من غادر ÷ من زارpages["exit_rate"] = (pages["exits"] / pages["visits"]).round(3)print(pages.sort_values("exit_rate", ascending=False)[["page", "exit_rate"]])
الأرقام تقول: صفحة cart أعلى معدّل خروج. القرار الذي تشتقّه: افحص صفحة السلّة — ربما زرٌّ غامض أو شحنٌ مفاجئ يطرد المشترين.
٢ثلاثة فخاخ تضلّل القرار
| الفخّ | المثال | العلاج |
|---|---|---|
| الحجم الصغير | صفحة بـ 5 زيارات معدّل خروجها 100% | تجاهل الفئات قليلة البيانات |
| الارتباط ≠ السببية | الزوّار الذين شاهدوا الفيديو اشتروا أكثر | هل الفيديو سبب، أم أن المهتمّ أصلًا يشاهده؟ |
| الرقم بلا أساس | الارتداد 40% — جيد أم سيّئ؟ | قارن بفترةٍ سابقة أو بمعيار |
import pandas as pdpages = pd.DataFrame({ "page": ["home", "products", "cart", "checkout", "blog"], "visits": [5000, 3200, 1800, 900, 2600], "exits": [900, 700, 1100, 600, 500], # غادروا الموقع من هذه الصفحة})# لا تحكم على صفحة ببيانات ضئيلةreliable = pages[pages["visits"] >= 1000]worst = reliable.loc[(reliable["exits"] / reliable["visits"]).idxmax(), "page"]print("أسوأ صفحة (ببيانات كافية):", worst)
٣من التحليل إلى توصية
التوصية الجيّدة: محدّدة (ماذا بالضبط)، ومبنيّة على الرقم (لماذا)، وقابلة للقياس (كيف نعرف أنها نجحت):
هكذا يكتمل مسار علم البيانات الذي بدأناه في الدرس 1: من أثر النقرات، إلى جدول، إلى رقم، إلى قرارٍ يُنفَّذ ويُقاس.
توقّع وتحقّق
قيمة التحليل تكتمل حين يتحوّل إلى:
معدّل خروج 100% من صفحةٍ بـ 5 زيارات:
«المشاهدون اشتروا أكثر» قد يكون:
الرقم يصبح ذا معنى حين:
الخلاصة
- البيانات لا تقرّر؛ قيمتها في القرار الذي تشتقّه منها.
- احذر الفخاخ: الحجم الصغير، والارتباط المُفسَّر سببيةً، والرقم بلا مرجع.
- تجاهل الفئات قليلة البيانات قبل الحكم عليها.
- التوصية الجيّدة محدّدة، ومبنيّة على رقم، وقابلة للقياس بمدة.
تحدٍّ برمجي: اشتقّ قرارًا
متقدماحسب معدّل الخروج، لكن تجاهل الصفحات بأقل من 1000 زيارة، ثم اطبع اسم أسوأ صفحة موثوقة ومعدّل خروجها (3 منازل).
- رشّح الصفحات
visits >= 1000. - اطبع اسم أعلاها خروجًا، ثم معدّل خروجها مقرّبًا لثلاث منازل.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
import pandas as pdpages = pd.DataFrame({ "page": ["home", "products", "cart", "checkout", "blog"], "visits": [5000, 3200, 1800, 900, 2600], "exits": [900, 700, 1100, 600, 500], # غادروا الموقع من هذه الصفحة})# تجاهل ما دون 1000 زيارة، ثم اطبع أسوأ صفحة موثوقة ومعدّل خروجها (3 منازل)
💡 تلميح 1
pages[pages["visits"] >= 1000].💡 تلميح 2
idxmax().حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
import pandas as pdpages = pd.DataFrame({ "page": ["home", "products", "cart", "checkout", "blog"], "visits": [5000, 3200, 1800, 900, 2600], "exits": [900, 700, 1100, 600, 500], # غادروا الموقع من هذه الصفحة})reliable = pages[pages["visits"] >= 1000].copy()reliable["exit_rate"] = reliable["exits"] / reliable["visits"]worst = reliable.loc[reliable["exit_rate"].idxmax()]print(worst["page"])print(round(worst["exit_rate"], 3))