مشروع: تحليل سجلّ موقع والتنبؤ بالسلوك
المقرر كلّه في مشروعٍ واحد: من أثر النقرات إلى قرارٍ مبنيّ على نموذج. ⏱ نحو 70 دقيقة.
- تنفّذ مسار علم البيانات كاملًا من السجلّ إلى التنبؤ.
- تنظّف وتحلّل وتجمّع بيانات ويب حقيقية.
- تدرّب نموذجًا وتقيّمه على بياناتٍ لم يرها.
- تنتهي بتوصيةٍ قابلة للتنفيذ تحترم الخصوصية.
١المشروع: من السجلّ إلى التنبؤ
هذا المقرر في مشروعٍ واحد. لديك سجلّ جلسات: لكل زائر معرّفٌ، وثوانٍ، وعدد صفحات، وهل اشترى. ستمرّ بالمسار كاملًا: اقرأ ← نظّف ← حلّل ← تنبّأ — كما بدأناه في الدرس الأول.
٢1) القراءة والتحليل
log = """u1 45 3 1u2 8 1 0u3 120 5 1u4 5 1 0u5 200 7 1u6 12 2 0u7 90 4 1u8 6 1 0u9 150 6 1u10 30 2 0"""import pandas as pdrows = [line.split() for line in log.strip().split("\n")]df = pd.DataFrame(rows, columns=["user", "seconds", "pages", "bought"])# كل ما يُقرأ نصّ — حوّل الأرقامfor col in ["seconds", "pages", "bought"]: df[col] = df[col].astype(int) print("عدد الجلسات:", len(df))print("معدّل التحويل:", round(df["bought"].mean() * 100, 1), "%")print("متوسط ثواني المشترين:", round(df[df["bought"]==1]["seconds"].mean(), 1))print("متوسط ثواني غير المشترين:", round(df[df["bought"]==0]["seconds"].mean(), 1))
التحليل وحده يكشف نمطًا: المشترون يقضون وقتًا أطول بكثير. هذه فرضيّةٌ سيختبرها النموذج.
٣2) التدريب والتقييم
log = """u1 45 3 1u2 8 1 0u3 120 5 1u4 5 1 0u5 200 7 1u6 12 2 0u7 90 4 1u8 6 1 0u9 150 6 1u10 30 2 0"""import pandas as pdfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score rows = [line.split() for line in log.strip().split("\n")]df = pd.DataFrame(rows, columns=["user", "seconds", "pages", "bought"])for col in ["seconds", "pages", "bought"]: df[col] = df[col].astype(int) X = df[["seconds", "pages"]].valuesy = df["bought"]Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=42) model = LogisticRegression().fit(Xtr, ytr)pred = model.predict(Xte)print("الدقّة على الاختبار:", round(accuracy_score(yte, pred), 2)) # تنبّؤ لزائرٍ جديد: جلسة 180 ثانية و6 صفحاتnew = model.predict([[180, 6]])[0]print("هل سيشتري زائر (180ث، 6 صفحات)؟", "نعم" if new == 1 else "لا")
٤3) من النتيجة إلى قرار
اكتمل المشروع. النموذج يصنّف الزوّار بدقّة، فماذا نفعل بذلك؟
هكذا يكتمل علم البيانات للويب: من أثرٍ خامٍ في سجلّ، إلى نموذجٍ يتنبّأ، إلى قرارٍ يُنفَّذ ويُقاس. كل أداةٍ تعلّمتها — Pandas، والتنظيف، والتجميع، والتصور، وتعلّم الآلة — خطوةٌ في هذا المسار.
توقّع وتحقّق
أول خطوة في المشروع:
نقيّم النموذج على:
المشروع يكتمل بـ:
القيم المقروءة من السجلّ نوعها:
الخلاصة
- المشروع يجمع المقرر: اقرأ ← نظّف ← حلّل ← تنبّأ ← قرّر.
- التحليل يكشف النمط، والنموذج يختبره، والتقييم على الاختبار يصدّقه.
- العمل يكتمل بتوصيةٍ محدّدة قابلة للقياس لا بمجرّد أرقام.
- كل أداةٍ تعلّمتها كانت خطوةً في هذا المسار الواحد.
تحدٍّ برمجي: المشروع الختامي
متقدمابنِ الجدول من السجلّ، درّب مصنّفًا (seconds, pages → bought)، واطبع دقّته على الاختبار (random_state=42, test_size=0.3)، وتنبّؤه لزائرٍ (160 ثانية، 5 صفحات).
- ابنِ الجدول وحوّل الأعمدة، وافصل X و y.
- درّب وقسّم
(random_state=42)، واطبع الدقّة (منزلتين) ثم تنبّؤ[160,5].
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
log = """u1 45 3 1u2 8 1 0u3 120 5 1u4 5 1 0u5 200 7 1u6 12 2 0u7 90 4 1u8 6 1 0u9 150 6 1u10 30 2 0"""import pandas as pdfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# ابنِ الجدول، درّب، واطبع الدقّة ثم تنبّؤ [160,5]
💡 تلميح 1
astype(int) ثم افصل X و y.💡 تلميح 2
random_state=42، درّب، وقيّم بـ accuracy_score.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
log = """u1 45 3 1u2 8 1 0u3 120 5 1u4 5 1 0u5 200 7 1u6 12 2 0u7 90 4 1u8 6 1 0u9 150 6 1u10 30 2 0"""import pandas as pdfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_scorerows = [line.split() for line in log.strip().split("\n")]df = pd.DataFrame(rows, columns=["user", "seconds", "pages", "bought"])for col in ["seconds", "pages", "bought"]: df[col] = df[col].astype(int)X = df[["seconds", "pages"]].values; y = df["bought"]Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=42)model = LogisticRegression().fit(Xtr, ytr)print(round(accuracy_score(yte, model.predict(Xte)), 2))print(model.predict([[160, 5]])[0])