Spaces:
Sleeping
Sleeping
| 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.") |