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.")