| import streamlit as st
|
| import pandas as pd
|
| import joblib
|
|
|
|
|
|
|
|
|
|
|
| model = joblib.load("churn_model.pkl")
|
| model_columns = joblib.load("model_columns.pkl")
|
|
|
|
|
|
|
|
|
|
|
| st.set_page_config(
|
| page_title="Customer Churn Prediction",
|
| page_icon="📉",
|
| layout="centered"
|
| )
|
|
|
|
|
|
|
|
|
|
|
| st.title("📉 Customer Churn Prediction")
|
|
|
| st.write(
|
| """
|
| Predict whether a telecom customer is likely to churn
|
| based on customer profile and subscription details.
|
| """
|
| )
|
|
|
|
|
|
|
|
|
|
|
| st.header("Enter Customer Details")
|
|
|
|
|
|
|
| gender = st.selectbox(
|
| "Gender",
|
| ["Male", "Female"]
|
| )
|
|
|
| senior_citizen = st.selectbox(
|
| "Senior Citizen",
|
| ["Yes", "No"]
|
| )
|
|
|
| partner = st.selectbox(
|
| "Partner",
|
| ["Yes", "No"]
|
| )
|
|
|
| dependents = st.selectbox(
|
| "Dependents",
|
| ["Yes", "No"]
|
| )
|
|
|
|
|
|
|
| tenure_months = st.slider(
|
| "Tenure Months",
|
| min_value=1,
|
| max_value=72,
|
| value=12
|
| )
|
|
|
|
|
|
|
| phone_service = st.selectbox(
|
| "Phone Service",
|
| ["Yes", "No"]
|
| )
|
|
|
| multiple_lines = st.selectbox(
|
| "Multiple Lines",
|
| ["Yes", "No", "No phone service"]
|
| )
|
|
|
| internet_service = st.selectbox(
|
| "Internet Service",
|
| ["DSL", "Fiber optic", "No"]
|
| )
|
|
|
| online_security = st.selectbox(
|
| "Online Security",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
| online_backup = st.selectbox(
|
| "Online Backup",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
| device_protection = st.selectbox(
|
| "Device Protection",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
| tech_support = st.selectbox(
|
| "Tech Support",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
| streaming_tv = st.selectbox(
|
| "Streaming TV",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
| streaming_movies = st.selectbox(
|
| "Streaming Movies",
|
| ["Yes", "No", "No internet service"]
|
| )
|
|
|
|
|
|
|
| contract = st.selectbox(
|
| "Contract Type",
|
| ["Month-to-month", "One year", "Two year"]
|
| )
|
|
|
| paperless_billing = st.selectbox(
|
| "Paperless Billing",
|
| ["Yes", "No"]
|
| )
|
|
|
| payment_method = st.selectbox(
|
| "Payment Method",
|
| [
|
| "Electronic check",
|
| "Mailed check",
|
| "Bank transfer (automatic)",
|
| "Credit card (automatic)"
|
| ]
|
| )
|
|
|
|
|
|
|
| monthly_charges = st.number_input(
|
| "Monthly Charges",
|
| min_value=0.0,
|
| max_value=200.0,
|
| value=70.0
|
| )
|
|
|
| total_charges = st.number_input(
|
| "Total Charges",
|
| min_value=0.0,
|
| max_value=10000.0,
|
| value=1000.0
|
| )
|
|
|
| cltv = st.number_input(
|
| "Customer Lifetime Value (CLTV)",
|
| min_value=0,
|
| max_value=10000,
|
| value=3000
|
| )
|
|
|
|
|
|
|
|
|
|
|
| input_dict = {
|
| 'Senior Citizen': senior_citizen,
|
| 'Tenure Months': tenure_months,
|
| 'Monthly Charges': monthly_charges,
|
| 'Total Charges': total_charges,
|
| 'CLTV': cltv
|
| }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| input_dict['Gender_Male'] = 1 if gender == "Male" else 0
|
|
|
|
|
|
|
| input_dict['Partner_Yes'] = 1 if partner == "Yes" else 0
|
|
|
|
|
|
|
| input_dict['Dependents_Yes'] = 1 if dependents == "Yes" else 0
|
|
|
|
|
|
|
| input_dict['Phone Service_Yes'] = 1 if phone_service == "Yes" else 0
|
|
|
|
|
|
|
| input_dict['Multiple Lines_Yes'] = 1 if multiple_lines == "Yes" else 0
|
|
|
| input_dict['Multiple Lines_No phone service'] = (
|
| 1 if multiple_lines == "No phone service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Internet Service_Fiber optic'] = (
|
| 1 if internet_service == "Fiber optic" else 0
|
| )
|
|
|
| input_dict['Internet Service_No'] = (
|
| 1 if internet_service == "No" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Online Security_Yes'] = (
|
| 1 if online_security == "Yes" else 0
|
| )
|
|
|
| input_dict['Online Security_No internet service'] = (
|
| 1 if online_security == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Online Backup_Yes'] = (
|
| 1 if online_backup == "Yes" else 0
|
| )
|
|
|
| input_dict['Online Backup_No internet service'] = (
|
| 1 if online_backup == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Device Protection_Yes'] = (
|
| 1 if device_protection == "Yes" else 0
|
| )
|
|
|
| input_dict['Device Protection_No internet service'] = (
|
| 1 if device_protection == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Tech Support_Yes'] = (
|
| 1 if tech_support == "Yes" else 0
|
| )
|
|
|
| input_dict['Tech Support_No internet service'] = (
|
| 1 if tech_support == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Streaming TV_Yes'] = (
|
| 1 if streaming_tv == "Yes" else 0
|
| )
|
|
|
| input_dict['Streaming TV_No internet service'] = (
|
| 1 if streaming_tv == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Streaming Movies_Yes'] = (
|
| 1 if streaming_movies == "Yes" else 0
|
| )
|
|
|
| input_dict['Streaming Movies_No internet service'] = (
|
| 1 if streaming_movies == "No internet service" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Contract_One year'] = (
|
| 1 if contract == "One year" else 0
|
| )
|
|
|
| input_dict['Contract_Two year'] = (
|
| 1 if contract == "Two year" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Paperless Billing_Yes'] = (
|
| 1 if paperless_billing == "Yes" else 0
|
| )
|
|
|
|
|
|
|
| input_dict['Payment Method_Credit card (automatic)'] = (
|
| 1 if payment_method == "Credit card (automatic)" else 0
|
| )
|
|
|
| input_dict['Payment Method_Electronic check'] = (
|
| 1 if payment_method == "Electronic check" else 0
|
| )
|
|
|
| input_dict['Payment Method_Mailed check'] = (
|
| 1 if payment_method == "Mailed check" else 0
|
| )
|
|
|
|
|
|
|
|
|
|
|
| input_dict['Tenure Group_New'] = (
|
| 1 if tenure_months <= 12 else 0
|
| )
|
|
|
| input_dict['Tenure Group_Regular'] = (
|
| 1 if 12 < tenure_months <= 36 else 0
|
| )
|
|
|
| input_dict['Tenure Group_Loyal'] = (
|
| 1 if 36 < tenure_months <= 60 else 0
|
| )
|
|
|
| input_dict['Tenure Group_Very Loyal'] = (
|
| 1 if tenure_months > 60 else 0
|
| )
|
|
|
|
|
|
|
|
|
|
|
| input_df = pd.DataFrame([input_dict])
|
|
|
|
|
|
|
| input_df = input_df.reindex(
|
| columns=model_columns,
|
| fill_value=0
|
| )
|
|
|
|
|
|
|
|
|
|
|
| if st.button("Predict Churn"):
|
|
|
| probability = model.predict_proba(input_df)[0][1]
|
|
|
| prediction = model.predict(input_df)[0]
|
|
|
| st.subheader("Prediction Result")
|
|
|
| st.write(
|
| f"### Churn Probability: {probability:.2%}"
|
| )
|
|
|
| if prediction == 1:
|
|
|
| st.error(
|
| "⚠️ High Risk of Churn"
|
| )
|
|
|
| else:
|
|
|
| st.success(
|
| "✅ Low Risk of Churn"
|
| )
|
|
|
|
|
|
|
| st.progress(float(probability))
|
|
|
|
|
|
|
|
|
|
|
| st.markdown("---")
|
|
|
| st.caption(
|
| "Built using Machine Learning, Streamlit, and Logistic Regression"
|
| ) |