| import streamlit as st |
| import joblib |
| import pandas as pd |
| import os |
|
|
| def load_model(): |
| model_path = os.path.join(os.path.dirname(__file__), 'model', 'model.joblib') |
| model_dict = joblib.load(model_path) |
| return model_dict['model'] |
|
|
| def main(): |
| st.set_page_config(page_title="Customer Churn Prediction App",layout="wide") |
|
|
| st.title(" Customer Churn Prediction") |
| st.write("Predict whether a customer is likely to **churn or stay**, " |
| "based on behavioral and transaction-level features." |
| ) |
| st.header("Input Customer Features") |
|
|
| Frequency = st.number_input("Frequency", min_value=0.0, value=10.0) |
| Monetary = st.number_input("Monetary", min_value=0.0, value=10000.0) |
| Total_Products_Purchased = st.number_input("Total Products Purchased", min_value=0, value=20) |
| Unique_Products_Purchased = st.number_input("Unique Products Purchased", min_value=0, value=10) |
| Avg_Transaction_Value = st.number_input("Average Transaction Value", min_value=0.0, value=50.0) |
| Customer_Tenure_Days = st.number_input("Customer Tenure (Days)", min_value=0, value=365) |
| Revenue_Per_Product = st.number_input("Revenue Per Product", min_value=0.0, value=25.0) |
| Avg_Days_Between_Purchases = st.number_input("Avg Days Between Purchases", min_value=0.0, value=15.0) |
| Purchase_Regularity = st.number_input("Purchase Regularity", min_value=0.0, value=0.5) |
| Top_Product_Concentration = st.number_input("Top Product Concentration", min_value=0.0, max_value=1.0, value=0.4) |
| Category_Diversity = st.number_input("Category Diversity", min_value=0.0, value=3.0) |
| Quarterly_Spending_Trend = st.number_input("Quarterly Spending Trend", value=0.1) |
| Price_Sensitivity = st.number_input("Price Sensitivity", min_value=0.0, value=0.3) |
| Spending_Trend = st.number_input("Spending Trend", value=0.05) |
| Cancellation_Rate = st.number_input("Cancellation Rate", min_value=0.0, max_value=1.0, value=0.1) |
| Is_UK = st.selectbox("Is UK Customer?", [0, 1]) |
|
|
| input_data = pd.DataFrame( |
| [{ |
| "Frequency": Frequency, |
| "Monetary": Monetary, |
| "Total_Products_Purchased": Total_Products_Purchased, |
| "Unique_Products_Purchased": Unique_Products_Purchased, |
| "Avg_Transaction_Value": Avg_Transaction_Value, |
| "Customer_Tenure_Days": Customer_Tenure_Days, |
| "Revenue_Per_Product": Revenue_Per_Product, |
| "Avg_Days_Between_Purchases": Avg_Days_Between_Purchases, |
| "Purchase_Regularity": Purchase_Regularity, |
| "Top_Product_Concentration": Top_Product_Concentration, |
| "Category_Diversity": Category_Diversity, |
| "Quarterly_Spending_Trend": Quarterly_Spending_Trend, |
| "Price_Sensitivity": Price_Sensitivity, |
| "Spending_Trend": Spending_Trend, |
| "Cancellation_Rate": Cancellation_Rate, |
| "Is_UK": Is_UK |
| }] |
| ) |
|
|
|
|
| if st.button("Predict Churn"): |
| model = load_model() |
|
|
| prediction = model.predict(input_data)[0] |
|
|
| churn_label = "Churn" if prediction == 1 else "Not Churn" |
|
|
| st.subheader("Prediction Result") |
| st.success(f"**Customer Status:** {churn_label}") |
|
|
| if hasattr(model, "predict_proba"): |
| prob = model.predict_proba(input_data)[0][1] |
| st.info(f"Churn Probability: **{prob:.2%}**") |
|
|
| else: |
| st.info("Enter feature values and click **Predict Churn**") |
|
|
| if __name__ == "__main__": |
| main() |
|
|