End-to-end Telco Customer Churn analysis and modeling using Logistic Regression and Decision Tree
1. نبذة عن المشروع:
مشروع Machine Learning من النوع Supervised Classification. الهدف منه التنبؤ بالعملاء اللي هيسيبوا شركة الاتصالات (Churn) قبل ما يمشوا فعلاً، عشان الشركة تقدر تعمل لهم عروض احتفاظ (Retention) في الوقت المناسب. الشغل بيغطي كل مراحل مشروع تحليل البيانات: من تنظيف الداتا والتحليل الاستكشافي، لحد بناء الموديلات وتقييمها وكتابة الاستنتاجات.
2. وصف البيانات
المصدر: Telco Customer Churn Dataset.
الحجم: 7,043 عميل و21 عمود.
المتغير المستهدف (Target): Churn (هل العميل انسحب Yes/No).
أنواع الأعمدة:
بيانات ديموغرافية: gender وSeniorCitizen وPartner وDependents.
خدمات الاشتراك: PhoneService وInternetService وOnlineSecurity وTechSupport وStreamingTV وغيرها.
بيانات الحساب والفواتير: Contract وPaymentMethod وPaperlessBilling.
متغيرات رقمية: tenure وMonthlyCharges وTotalCharges.
customerID: معرّف فريد، اتشال قبل التدريب.
عدم التوازن: 73.5% باقيين (5,174) مقابل 26.5% منسحبين (1,869)، يعني Imbalanced بنسبة تقريباً 2.8 : 1.
3. الأدوات والبرامج المستخدمة
الأداة الاستخدام
Python لغة البرمجة الأساسية
Jupyter Notebook بيئة التنفيذ والتوثيق (كود + شرح + رسومات)
Pandas / NumPy قراءة البيانات وتنظيفها وتحويلها وحساب الإحصائيات
Matplotlib / Seaborn رسومات التحليل الاستكشافي والتقييم
Scikit-learn التقسيم والـ Scaling والموديلات ومقاييس التقييم
4. طريقة التنفيذ (خطوة بخطوة)
1) تحميل وفهم البيانات
قراءة الملف، ومراجعة الأبعاد وأنواع الأعمدة، وتحديد الأعمدة الرقمية والفئوية والـ Target والـ ID.
2) تنظيف البيانات
اكتشفت إن TotalCharges متخزنة كنص، لأن فيها 11 خانة فاضية مستخبية.
حولتها لأرقام بـ pd.to_numeric، وتبين إن كل الصفوف الفاضية لعملاء tenure = 0 (عملاء جداد لسه متفوترش لهم). عشان كده عوضتها بـ 0 وده منطقي أكتر من المتوسط.
فحصت التكرار، ومسحت عمود customerID.
3) التحليل الاستكشافي (EDA)
توزيعات المتغيرات الرقمية (Histograms مع KDE).
علاقة الأعمدة الرقمية بالـ Churn (Boxplots).
توزيعات المتغيرات الفئوية (Countplots).
نسبة الـ Churn لكل فئة (مثلاً نسبة الانسحاب حسب نوع العقد).
4) تحليل توزيع الـ Churn
حساب العدد والنسبة المئوية، ورسم Bar وPie، وتحديد إن الداتا Imbalanced.
5) كشف الـ Outliers بطريقة IQR
حساب Q1 وQ3 وحدود الكشف للأعمدة الرقمية الـ 3. النتيجة: صفر Outliers، فمفيش صفوف اتحذفت. وده موثق مع مقارنة قبل وبعد.
6) الترميز (Encoding)
الأعمدة الثنائية (Yes/No وGender) اتحولت لـ 0/1.
الأعمدة متعددة الفئات اتحولت بـ One-Hot Encoding مع drop_first=True لتجنب مشكلة الـ Dummy Variable Trap.
7) تحليل الارتباط واختيار الـ Features
حسبت ارتباط كل Feature بالـ Churn ورسمته.
اخترت الـ Features اللي ارتباطها المطلق ≥ 0.02، فبقى 27 Feature.
استبعدت الأعمدة اللي ارتباطها شبه صفر (gender وPhoneService وMultipleLines_No phone service).
8) تجهيز البيانات للتدريب
فصل الـ Features (X) عن الـ Target (y).
تقسيم 80/20 مع stratify=y للحفاظ على نسبة الـ Churn في الـ Train والـ Test، وrandom_state=42 لإمكانية إعادة النتائج.
Standard Scaling للأعمدة الرقمية الـ 3 بس (الباقي 0/1). الـ Scaler اتعمله fit على الـ Train فقط، وبعدين transform على الـ Test لتجنب Data Leakage.
9) بناء الموديلات
Logistic Regression (max_iter=1000).
Decision Tree (max_depth=5) لتقليل الـ Overfitting.
10) التقييم
Accuracy وPrecision وRecall وF1-Score وClassification Report، وConfusion Matrix لكل موديل مع تحديد TP وTN وFP وFN، وجدول ورسم مقارنة بين الموديلين.
5. النتائج
الموديل Accuracy Precision Recall F1
Logistic Regression 0.806 0.658 0.556 0.603
Decision Tree 0.794 0.631 0.540 0.582
الأفضل: Logistic Regression في كل المقاييس. هو كمان بيكتشف عدد أكبر من العملاء المنسحبين فعلاً (208 مقابل 202) وبيعمل إنذارات كاذبة أقل (108 مقابل 118).
6. أهم الاستنتاجات (Insights)
حوالي 26.5% من العملاء بينسحبوا.
العقد الشهري نسبة الانسحاب فيه 42.7%، مقابل 11.3% لعقد السنة و2.8% لعقد السنتين.
العملاء الجداد (tenure قليل) أكتر عرضة للانسحاب، ومتوسط مدة المنسحبين 18 شهر مقابل 37.6 للباقين.
عملاء Fiber Optic نسبة انسحابهم 41.9% مقابل 19.0% لـ DSL.
الدفع بـ Electronic Check نسبة الانسحاب فيه 45.3%.
العملاء من غير Online Security أو Tech Support بينسحبوا حوالي 42% مقابل حوالي 15% لمن عندهم الخدمتين.
gender وPhoneService تأثيرهم على الانسحاب شبه معدوم.
7. المقياس الأهم للمشكلة
الـ Recall (مع الـ F1) هو الأهم هنا، لأن خسارة عميل كان ممكن نحتفظ بيه (False Negative) أغلى من إننا نبعت عرض لعميل مكنش هيمشي (False Positive). والـ Accuracy لوحدها مضللة لأن الداتا Imbalanced: موديل بيقول "مفيش حد هينسحب" كان هيجيب حوالي 73.5% Accuracy من غير ما يكتشف عميل واحد.
8. المهارات اللي بيبرزها المشروع
تنظيف بيانات واقعية واكتشاف مشاكل مخفية (عمود رقمي متخزن كنص).
اتخاذ قرارات مبنية على منطق الداتا (مثل تعويض القيم الفاضية بـ 0).
تحليل استكشافي وتصور بيانات (Matplotlib وSeaborn).
التعامل مع المتغيرات الفئوية والـ Encoding الصحيح.
تجنب Data Leakage والـ Overfitting.
فهم مشكلة الـ Imbalanced Data وتفسير المقاييس بدل الاعتماد على الـ Accuracy.
بناء وتقييم ومقارنة موديلات Classification.
ربط النتائج بقرار عملي في الشركة.
9. التطويرات المستقبلية المقترحة
معالجة عدم التوازن بـ class_weight='balanced' أو SMOTE.
تقليل الـ Decision Threshold لرفع الـ Recall.
استخدام Cross-Validation وGridSearch لضبط الـ Hyperparameters.
تجربة موديلات أقوى مثل Random Forest وGradient Boosting.
بناء Pipeline متكامل وتحويله لتطبيق أو Dashboard.