E-Commerce / app.py
rhazeljay's picture
modified app.py
7b2fece verified
import streamlit as st
import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import pickle
# Load dataset (For demonstration purposes, we'll generate dummy data)
def load_data():
np.random.seed(42)
customers = pd.DataFrame({
'CustomerID': range(1, 101),
'Spending_Score': np.random.randint(1, 101, 100),
'Annual_Income': np.random.randint(15000, 120000, 100),
'Purchases': np.random.randint(1, 50, 100)
})
return customers
def train_knn_model(customers):
X = customers[['Spending_Score', 'Annual_Income', 'Purchases']]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# Train KNN model for segmentation
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
customers['Segment'] = kmeans.fit_predict(X_scaled)
# Train KNN classifier for recommendations
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_scaled, customers['Segment'])
# Save models
with open("scaler.pkl", "wb") as f:
pickle.dump(scaler, f)
with open("knn_model.pkl", "wb") as f:
pickle.dump(knn, f)
with open("kmeans_model.pkl", "wb") as f:
pickle.dump(kmeans, f)
return customers
# Load trained models
def load_models():
with open("scaler.pkl", "rb") as f:
scaler = pickle.load(f)
with open("knn_model.pkl", "rb") as f:
knn = pickle.load(f)
with open("kmeans_model.pkl", "rb") as f:
kmeans = pickle.load(f)
return scaler, knn, kmeans
st.title("Customer Behavior Analysis and Product Recommendations using KNN")
# Instructions at the top of the app
st.markdown("""
**How to Use This App:**
This app helps you understand customer segments and provides product recommendations. It has two tabs: "Customer Segmentation" and "Product Recommendation."
**Important:** It is recommended to use the **Customer Segmentation tab first** to understand how customers are grouped. This will give context to the product recommendations.
**Customer Segmentation Tab:**
1. **Enter Customer ID:** Type the ID of the customer you want to analyze (1-100).
2. **View Segment:** The app shows the customer's segment (0, 1, or 2).
3. **View Customer Data:** See the customer's spending score, income, and purchases.
**Product Recommendation Tab:**
1. **Spending Score:** Enter the customer's spending habits (1-100).
2. **Annual Income:** Enter the customer's income (15000-120000).
3. **Number of Purchases:** Enter how often the customer make purchases (1-50).
4. **View Segment:** The app shows the customer's segment.
5. **View Recommended Products:** See products recommended for the customer's segment.
**Important Notes:**
* Data is for demonstration. Real data is more complex.
* Recommendations are based on simplified segments.
* Models are pre-trained. You don't need to train them.
""")
customers = load_data()
customers = train_knn_model(customers)
scaler, knn, kmeans = load_models()
tab1, tab2 = st.tabs(["Customer Segmentation", "Product Recommendation"])
with tab1:
st.subheader("Customer Segmentation")
customer_id = st.number_input("Enter Customer ID (1-100)", min_value=1, max_value=100, step=1)
if customer_id:
customer = customers[customers['CustomerID'] == customer_id]
if not customer.empty:
st.write(f"Segment: {customer['Segment'].values[0]}")
st.write("Customer Data:", customer)
else:
st.write("Invalid Customer ID. Please enter a number between 1 and 100.")
with tab2:
st.subheader("Product Recommendation")
spending = st.number_input("Spending Score (1-100)", min_value=1, max_value=100, value=50, step=1)
income = st.number_input("Annual Income (15000-120000)", min_value=15000, max_value=120000, value=60000, step=1000)
purchases = st.number_input("Number of Purchases (1-50)", min_value=1, max_value=50, value=10, step=1)
if spending and income and purchases:
user_input = np.array([[spending, income, purchases]])
user_scaled = scaler.transform(user_input)
segment = knn.predict(user_scaled)[0]
st.write(f"Based on the profile of the customer, the customer belongs to Segment {segment}.")
recommendations = {
0: ["Laptop", "Smartphone", "Headphones"],
1: ["Shoes", "Clothing", "Watches"],
2: ["Furniture", "Kitchenware", "Home Decor"]
}
st.write("For this customer, the recommended products are:")
for product in recommendations[segment]:
st.write(f"- {product}")
else:
st.write("Please provide all input values (Spending Score, Annual Income, and Number of Purchases) to get recommendations.")