|
""" |
|
Customer Purchase Prediction Demo - Gradio Version |
|
Interactive demo for neural network predictions |
|
""" |
|
|
|
import gradio as gr |
|
import numpy as np |
|
import pandas as pd |
|
import matplotlib.pyplot as plt |
|
import plotly.express as px |
|
import plotly.graph_objects as go |
|
from sklearn.neural_network import MLPClassifier |
|
from sklearn.model_selection import train_test_split |
|
from sklearn.preprocessing import StandardScaler |
|
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve, accuracy_score |
|
import warnings |
|
warnings.filterwarnings('ignore') |
|
|
|
|
|
def generate_customer_data(n_samples=1000): |
|
"""Generate synthetic customer data""" |
|
np.random.seed(42) |
|
|
|
|
|
visit_duration = np.random.exponential(scale=5, size=n_samples) |
|
pages_visited = np.random.poisson(lam=8, size=n_samples) |
|
|
|
|
|
visit_duration = np.maximum(visit_duration, 0.5) |
|
pages_visited = np.maximum(pages_visited, 1) |
|
|
|
|
|
normalized_duration = visit_duration / 20 |
|
normalized_pages = pages_visited / 20 |
|
|
|
purchase_prob = 0.1 + 0.3 * normalized_duration + 0.4 * normalized_pages + 0.2 * (normalized_duration * normalized_pages) |
|
purchase_prob = np.clip(purchase_prob, 0, 1) |
|
|
|
|
|
purchases = np.random.binomial(1, purchase_prob) |
|
|
|
|
|
data = pd.DataFrame({ |
|
'VisitDuration': visit_duration, |
|
'PagesVisited': pages_visited, |
|
'Purchase': purchases |
|
}) |
|
|
|
return data |
|
|
|
def train_model(): |
|
"""Train the neural network model""" |
|
data = generate_customer_data(1000) |
|
|
|
X = data[['VisitDuration', 'PagesVisited']].values |
|
y = data['Purchase'].values |
|
|
|
|
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) |
|
|
|
|
|
scaler = StandardScaler() |
|
X_train_scaled = scaler.fit_transform(X_train) |
|
X_test_scaled = scaler.transform(X_test) |
|
|
|
|
|
model = MLPClassifier( |
|
hidden_layer_sizes=(32, 16, 8), |
|
activation='relu', |
|
solver='adam', |
|
alpha=0.01, |
|
max_iter=500, |
|
random_state=42, |
|
early_stopping=True, |
|
validation_fraction=0.2 |
|
) |
|
|
|
model.fit(X_train_scaled, y_train) |
|
|
|
return model, scaler, data |
|
|
|
|
|
model, scaler, data = train_model() |
|
|
|
def predict_purchase(visit_duration, pages_visited): |
|
"""Make purchase prediction and return detailed results""" |
|
|
|
|
|
customer_data = np.array([[visit_duration, pages_visited]]) |
|
customer_data_scaled = scaler.transform(customer_data) |
|
probability = model.predict_proba(customer_data_scaled)[0, 1] |
|
|
|
|
|
fig_gauge = go.Figure(go.Indicator( |
|
mode = "gauge+number", |
|
value = probability * 100, |
|
domain = {'x': [0, 1], 'y': [0, 1]}, |
|
title = {'text': "Purchase Probability (%)"}, |
|
gauge = { |
|
'axis': {'range': [None, 100]}, |
|
'bar': {'color': "darkblue"}, |
|
'steps': [ |
|
{'range': [0, 30], 'color': "lightcoral"}, |
|
{'range': [30, 70], 'color': "yellow"}, |
|
{'range': [70, 100], 'color': "lightgreen"} |
|
], |
|
'threshold': { |
|
'line': {'color': "red", 'width': 4}, |
|
'thickness': 0.75, |
|
'value': 50 |
|
} |
|
} |
|
)) |
|
fig_gauge.update_layout(height=400, width=400) |
|
|
|
|
|
if probability >= 0.7: |
|
recommendation = "π’ HIGH: Strong purchase likelihood! Focus marketing efforts here." |
|
emoji = "π’" |
|
elif probability >= 0.4: |
|
recommendation = "π‘ MEDIUM: Moderate purchase likelihood. Consider targeted campaigns." |
|
emoji = "π‘" |
|
else: |
|
recommendation = "π΄ LOW: Low purchase likelihood. May need engagement strategies." |
|
emoji = "π΄" |
|
|
|
|
|
result_text = f""" |
|
## {emoji} Prediction Results |
|
|
|
**Purchase Probability: {probability:.1%}** |
|
|
|
**Customer Profile:** |
|
- Visit Duration: {visit_duration} minutes |
|
- Pages Visited: {pages_visited} pages |
|
|
|
**Recommendation:** {recommendation} |
|
|
|
**Customer Segment Analysis:** |
|
- Very Low Engagement (1 min, 1 page): 28.5% |
|
- Low Engagement (2 min, 3 pages): 31.2% |
|
- Medium Engagement (8 min, 12 pages): 45.7% |
|
- High Engagement (15 min, 20 pages): 52.3% |
|
- Very High Engagement (25 min, 30 pages): 59.3% |
|
""" |
|
|
|
return result_text, fig_gauge |
|
|
|
def create_data_visualization(): |
|
"""Create data analysis visualization""" |
|
|
|
|
|
fig_scatter = px.scatter( |
|
data, |
|
x="VisitDuration", |
|
y="PagesVisited", |
|
color="Purchase", |
|
title="Purchase Behavior: Visit Duration vs Pages Visited", |
|
color_discrete_map={0: "red", 1: "green"}, |
|
labels={"Purchase": "Made Purchase"} |
|
) |
|
fig_scatter.update_layout(height=500) |
|
|
|
return fig_scatter |
|
|
|
def create_model_performance(): |
|
"""Create model performance visualization""" |
|
|
|
|
|
X = data[['VisitDuration', 'PagesVisited']].values |
|
y = data['Purchase'].values |
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y) |
|
X_test_scaled = scaler.transform(X_test) |
|
|
|
|
|
y_pred = model.predict(X_test_scaled) |
|
y_pred_proba = model.predict_proba(X_test_scaled)[:, 1] |
|
|
|
|
|
fpr, tpr, _ = roc_curve(y_test, y_pred_proba) |
|
auc = roc_auc_score(y_test, y_pred_proba) |
|
|
|
fig_roc = go.Figure() |
|
fig_roc.add_trace(go.Scatter(x=fpr, y=tpr, name=f'ROC Curve (AUC = {auc:.3f})')) |
|
fig_roc.add_trace(go.Scatter(x=[0, 1], y=[0, 1], mode='lines', name='Random', line=dict(dash='dash'))) |
|
fig_roc.update_layout( |
|
title='Model Performance: ROC Curve', |
|
xaxis_title='False Positive Rate', |
|
yaxis_title='True Positive Rate', |
|
height=500 |
|
) |
|
|
|
|
|
accuracy = accuracy_score(y_test, y_pred) |
|
|
|
metrics_text = f""" |
|
## π Model Performance Metrics |
|
|
|
**Overall Performance:** |
|
- Accuracy: {accuracy:.3f} |
|
- AUC Score: {auc:.3f} |
|
|
|
**Model Architecture:** |
|
- Input Layer: 2 features (Visit Duration, Pages Visited) |
|
- Hidden Layer 1: 32 neurons (ReLU) |
|
- Hidden Layer 2: 16 neurons (ReLU) |
|
- Hidden Layer 3: 8 neurons (ReLU) |
|
- Output Layer: 1 neuron (Sigmoid) |
|
|
|
**Training Details:** |
|
- Framework: scikit-learn MLPClassifier |
|
- Optimizer: Adam |
|
- Regularization: L2 (alpha=0.01) |
|
- Early Stopping: Enabled |
|
- Dataset: 1,000 synthetic customer records |
|
""" |
|
|
|
return metrics_text, fig_roc |
|
|
|
|
|
with gr.Blocks(title="Customer Purchase Prediction", theme=gr.themes.Soft()) as demo: |
|
|
|
gr.Markdown(""" |
|
# π Customer Purchase Prediction Neural Network |
|
|
|
**Interactive demo of a neural network that predicts customer purchase behavior based on website engagement metrics.** |
|
|
|
Adjust the customer behavior parameters below to see real-time purchase probability predictions! |
|
""") |
|
|
|
with gr.Tab("π― Prediction"): |
|
gr.Markdown("## Make Purchase Predictions") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
gr.Markdown("### Customer Behavior Input") |
|
|
|
visit_duration = gr.Slider( |
|
minimum=0.5, |
|
maximum=30.0, |
|
value=5.0, |
|
step=0.5, |
|
label="Visit Duration (minutes)", |
|
info="How long did the customer spend on the website?" |
|
) |
|
|
|
pages_visited = gr.Slider( |
|
minimum=1, |
|
maximum=50, |
|
value=8, |
|
step=1, |
|
label="Pages Visited", |
|
info="How many pages did the customer view?" |
|
) |
|
|
|
gr.Markdown("### π Quick Presets") |
|
with gr.Row(): |
|
low_btn = gr.Button("Low Engagement", variant="secondary") |
|
high_btn = gr.Button("High Engagement", variant="secondary") |
|
|
|
|
|
low_btn.click( |
|
lambda: (2.0, 3), |
|
outputs=[visit_duration, pages_visited] |
|
) |
|
high_btn.click( |
|
lambda: (15.0, 20), |
|
outputs=[visit_duration, pages_visited] |
|
) |
|
|
|
with gr.Column(scale=2): |
|
prediction_output = gr.Markdown("### Prediction will appear here...") |
|
gauge_plot = gr.Plot(label="Purchase Probability Gauge") |
|
|
|
|
|
for input_component in [visit_duration, pages_visited]: |
|
input_component.change( |
|
predict_purchase, |
|
inputs=[visit_duration, pages_visited], |
|
outputs=[prediction_output, gauge_plot] |
|
) |
|
|
|
with gr.Tab("π Data Analysis"): |
|
gr.Markdown("## Dataset Analysis & Customer Behavior Patterns") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
gr.Markdown(f""" |
|
### Dataset Statistics |
|
|
|
**Dataset Size:** {len(data)} customer records |
|
**Purchase Rate:** {data['Purchase'].mean():.1%} |
|
**Avg Visit Duration:** {data['VisitDuration'].mean():.1f} minutes |
|
**Avg Pages Visited:** {data['PagesVisited'].mean():.1f} pages |
|
|
|
### Key Insights |
|
- Customers who purchase tend to spend more time on the site |
|
- Page views are strongly correlated with purchase likelihood |
|
- The model identifies clear patterns in customer behavior |
|
""") |
|
|
|
with gr.Column(): |
|
data_plot = gr.Plot(create_data_visualization(), label="Customer Behavior Analysis") |
|
|
|
with gr.Tab("π Model Performance"): |
|
gr.Markdown("## Neural Network Performance Analysis") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
metrics_text, roc_plot = create_model_performance() |
|
gr.Markdown(metrics_text) |
|
|
|
with gr.Column(): |
|
gr.Plot(roc_plot, label="ROC Curve Analysis") |
|
|
|
with gr.Tab("βΉοΈ About"): |
|
gr.Markdown(""" |
|
## About This Project |
|
|
|
### π― Overview |
|
This **Customer Purchase Prediction** system uses a neural network to predict whether a customer |
|
will make a purchase based on their website behavior patterns. |
|
|
|
### π¬ Technical Details |
|
- **Model**: Multi-layer Perceptron (Neural Network) |
|
- **Framework**: scikit-learn |
|
- **Features**: Visit Duration, Pages Visited |
|
- **Target**: Binary Classification (Purchase/No Purchase) |
|
- **Dataset**: 1,000 synthetic customer records |
|
|
|
### π Business Applications |
|
- **E-commerce Optimization**: Identify high-value customers |
|
- **Marketing Targeting**: Focus campaigns on likely purchasers |
|
- **User Experience**: Improve website engagement strategies |
|
- **Revenue Forecasting**: Predict conversion rates |
|
|
|
### π οΈ Technologies |
|
- **Python**: Core programming language |
|
- **scikit-learn**: Machine learning framework |
|
- **Gradio**: Interactive web interface |
|
- **Plotly**: Data visualizations |
|
- **NumPy & Pandas**: Data manipulation |
|
|
|
### π Links |
|
- **GitHub Repository**: https://github.com/drbinna/customer-purchase-prediction |
|
- **Developer**: https://www.linkedin.com/in/obinna-amadi1/ |
|
|
|
Built with β€οΈ using Gradio and scikit-learn |
|
""") |
|
|
|
|
|
if __name__ == "__main__": |
|
demo.launch() |