This page shows the source code for 5-analyze_ecommerce.py in browser-friendly HTML format. It was generated automatically from the original Python file.
"""
E-Commerce Customer Analysis & Segmentation
Demonstrates: customer segmentation, RFM analysis, business intelligence metrics
"""
# import: Imports a module or library
import sys
# if: Conditional statement - executes code if condition is True
# hasattr(): Checks if object has an attribute
# Documentation: https://docs.python.org/3/library/functions.html#hasattr
if hasattr(sys.stdout, 'reconfigure'): # Check condition
# Variable assignment
sys.stdout.reconfigure(encoding='utf-8')
# if: Conditional statement - executes code if condition is True
# hasattr(): Checks if object has an attribute
# Documentation: https://docs.python.org/3/library/functions.html#hasattr
if hasattr(sys.stderr, 'reconfigure'): # Check condition
# Variable assignment
sys.stderr.reconfigure(encoding='utf-8')
# import: Imports a module or library
# as: Creates an alias for an import
import pandas as pd
# import: Imports a module or library
# as: Creates an alias for an import
import matplotlib.pyplot as plt
# import: Imports a module or library
# as: Creates an alias for an import
import seaborn as sns
# import: Imports a module or library
# as: Creates an alias for an import
import numpy as np
# import: Imports a module or library
# from: Imports specific items from a module
from sklearn.preprocessing import StandardScaler
# import: Imports a module or library
# from: Imports specific items from a module
from sklearn.cluster import KMeans
# Load data
# Variable assignment
df = pd.read_csv('dataset5_ecommerce.csv')
# Calculate additional metrics
# Variable assignment
df['Customer_Lifetime_Value'] = df['Total_Spent']
# Variable assignment
df['Engagement_Score'] = (df['Total_Purchases'] * df['Customer_Satisfaction'] *
(1 - df['Return_Rate_Percent']/100))
# Variable assignment
df['Recency_Category'] = pd.cut(df['Last_Purchase_Days_Ago'],
# Variable assignment
bins=[0, 7, 14, 30, 100],
# Variable assignment
labels=['Very Recent', 'Recent', 'Moderate', 'At Risk'])
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("=" * 60)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("E-COMMERCE CUSTOMER ANALYSIS")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("=" * 60)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("\nDataset Overview:")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(df.info())
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("\nCustomer Statistics:")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(df.describe())
# Create comprehensive visualization
# Variable assignment
fig = plt.figure(figsize=(18, 14))
# 1. Customer Lifetime Value Distribution
plt.subplot(4, 3, 1)
# Variable assignment
plt.hist(df['Customer_Lifetime_Value'], bins=30, color='#2ECC71',
# Variable assignment
edgecolor='black', alpha=0.7)
# Variable assignment
plt.axvline(df['Customer_Lifetime_Value'].mean(), color='red', linestyle='--',
# Variable assignment
linewidth=2, label=f'Mean: ${df["Customer_Lifetime_Value"].mean():.0f}')
plt.xlabel('Customer Lifetime Value ($)')
plt.ylabel('Number of Customers')
# Variable assignment
plt.title('Customer Lifetime Value Distribution', fontsize=12, fontweight='bold')
plt.legend()
# Variable assignment
plt.grid(axis='y', alpha=0.3)
# 2. Product Category Preferences
plt.subplot(4, 3, 2)
# Variable assignment
category_counts = df['Product_Category_Preference'].value_counts()
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# Variable assignment
colors_cat = plt.cm.Set3(np.linspace(0, 1, len(category_counts)))
# Variable assignment
plt.pie(category_counts.values, labels=category_counts.index, autopct='%1.1f%%',
# Variable assignment
colors=colors_cat, startangle=45)
# Variable assignment
plt.title('Product Category Distribution', fontsize=12, fontweight='bold')
# 3. Member Tenure vs Spending
plt.subplot(4, 3, 3)
plt.scatter(df['Member_Since_Years'], df['Total_Spent'],
# Variable assignment
c=df['Total_Purchases'], cmap='viridis', alpha=0.6, s=100)
# Variable assignment
plt.colorbar(label='Total Purchases')
# Trend line
# Variable assignment
z = np.polyfit(df['Member_Since_Years'], df['Total_Spent'], 1)
# Variable assignment
p = np.poly1d(z)
plt.plot(df['Member_Since_Years'].sort_values(),
p(df['Member_Since_Years'].sort_values()),
# Variable assignment
"r--", linewidth=2, label='Trend')
plt.xlabel('Member Since (Years)')
plt.ylabel('Total Spent ($)')
# Variable assignment
plt.title('Tenure vs Customer Value', fontsize=12, fontweight='bold')
plt.legend()
# Variable assignment
plt.grid(True, alpha=0.3)
# 4. Payment Method Analysis
plt.subplot(4, 3, 4)
# Variable assignment
payment_value = df.groupby('Payment_Method')['Total_Spent'].agg(['mean', 'sum'])
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# Variable assignment
x = np.arange(len(payment_value))
# Variable assignment
width = 0.35
# Variable assignment
ax = plt.gca()
# Variable assignment
ax2 = ax.twinx()
# Variable assignment
bars1 = ax.bar(x - width/2, payment_value['mean'], width,
# Variable assignment
label='Avg Spend', color='#3498DB')
# Variable assignment
bars2 = ax2.bar(x + width/2, payment_value['sum'], width,
# Variable assignment
label='Total Revenue', color='#E74C3C')
ax.set_xlabel('Payment Method')
# Variable assignment
ax.set_ylabel('Average Spend ($)', color='#3498DB')
# Variable assignment
ax2.set_ylabel('Total Revenue ($)', color='#E74C3C')
ax.set_xticks(x)
# Variable assignment
ax.set_xticklabels(payment_value.index, rotation=45, ha='right')
# Variable assignment
plt.title('Payment Method Performance', fontsize=12, fontweight='bold')
# Variable assignment
ax.legend(loc='upper left')
# Variable assignment
ax2.legend(loc='upper right')
# 5. Device Type Usage
plt.subplot(4, 3, 5)
# Variable assignment
device_metrics = df.groupby('Device_Type')[['Total_Purchases', 'Customer_Satisfaction']].mean()
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# Variable assignment
x = np.arange(len(device_metrics))
# Variable assignment
width = 0.35
plt.bar(x - width/2, device_metrics['Total_Purchases'], width,
# Variable assignment
label='Avg Purchases', color='#9B59B6')
# Variable assignment
ax2 = plt.gca().twinx()
ax2.bar(x + width/2, device_metrics['Customer_Satisfaction'], width,
# Variable assignment
label='Avg Satisfaction', color='#F39C12')
plt.gca().set_xlabel('Device Type')
# Variable assignment
plt.gca().set_ylabel('Average Purchases', color='#9B59B6')
# Variable assignment
ax2.set_ylabel('Satisfaction Score', color='#F39C12')
plt.gca().set_xticks(x)
plt.gca().set_xticklabels(device_metrics.index)
# Variable assignment
plt.title('Device Type Performance', fontsize=12, fontweight='bold')
# Variable assignment
plt.gca().legend(loc='upper left')
# Variable assignment
ax2.legend(loc='upper right')
# 6. Customer Satisfaction vs Loyalty
plt.subplot(4, 3, 6)
# Variable assignment
satisfaction_groups = df.groupby(pd.cut(df['Customer_Satisfaction'],
# Variable assignment
bins=[0, 3.5, 4, 4.5, 5],
# Variable assignment
labels=['Low', 'Medium', 'High', 'Very High']))
# Variable assignment
loyalty_by_satisfaction = satisfaction_groups['Loyalty_Points'].mean()
# Variable assignment
colors_sat = ['#E74C3C', '#F39C12', '#2ECC71', '#27AE60']
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# range(): Generates a sequence of numbers
# Documentation: https://docs.python.org/3/library/functions.html#range
plt.bar(range(len(loyalty_by_satisfaction)), loyalty_by_satisfaction.values,
# Variable assignment
color=colors_sat)
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# range(): Generates a sequence of numbers
# Documentation: https://docs.python.org/3/library/functions.html#range
plt.xticks(range(len(loyalty_by_satisfaction)), loyalty_by_satisfaction.index)
plt.ylabel('Average Loyalty Points')
# Variable assignment
plt.title('Satisfaction Impact on Loyalty', fontsize=12, fontweight='bold')
# Variable assignment
plt.grid(axis='y', alpha=0.3)
# 7. Age Demographics
plt.subplot(4, 3, 7)
# Variable assignment
age_groups = pd.cut(df['Age'], bins=[20, 30, 40, 50, 60],
# Variable assignment
labels=['20-30', '31-40', '41-50', '51-60'])
# Variable assignment
age_spending = df.groupby(age_groups)['Total_Spent'].mean()
plt.barh(age_spending.index, age_spending.values,
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# Variable assignment
color=plt.cm.Spectral(np.linspace(0, 1, len(age_spending))))
plt.xlabel('Average Total Spent ($)')
# Variable assignment
plt.title('Spending by Age Group', fontsize=12, fontweight='bold')
# Variable assignment
plt.grid(axis='x', alpha=0.3)
# 8. Newsletter Impact
plt.subplot(4, 3, 8)
# Variable assignment
newsletter_comparison = df.groupby('Newsletter_Subscriber')[['Total_Purchases',
'Total_Spent']].mean()
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# Variable assignment
x = np.arange(len(newsletter_comparison))
# Variable assignment
width = 0.35
plt.bar(x - width/2, newsletter_comparison['Total_Purchases'], width,
# Variable assignment
label='Avg Purchases', color='#1ABC9C')
# Variable assignment
ax2 = plt.gca().twinx()
ax2.bar(x + width/2, newsletter_comparison['Total_Spent'], width,
# Variable assignment
label='Avg Spent', color='#E67E22')
plt.gca().set_xticks(x)
plt.gca().set_xticklabels(['No Newsletter', 'Subscribed'])
# Variable assignment
plt.gca().set_ylabel('Average Purchases', color='#1ABC9C')
# Variable assignment
ax2.set_ylabel('Average Spent ($)', color='#E67E22')
# Variable assignment
plt.title('Newsletter Subscriber Impact', fontsize=12, fontweight='bold')
# Variable assignment
plt.gca().legend(loc='upper left')
# Variable assignment
ax2.legend(loc='upper right')
# 9. Return Rate Analysis
plt.subplot(4, 3, 9)
# Variable assignment
category_returns = df.groupby('Product_Category_Preference')['Return_Rate_Percent'].mean().sort_values()
# if: Conditional statement - executes code if condition is True
# else: Executes code when all previous conditions are False
# Variable assignment
colors_return = ['#2ECC71' if x < 5 else '#F39C12' if x < 8 else '#E74C3C'
# for: Loop that iterates over a sequence
# in: Checks if value is in a sequence
for x in category_returns.values]
# Variable assignment
plt.barh(category_returns.index, category_returns.values, color=colors_return)
plt.xlabel('Return Rate (%)')
# Variable assignment
plt.title('Return Rate by Product Category', fontsize=12, fontweight='bold')
# Variable assignment
plt.axvline(x=5, color='green', linestyle='--', alpha=0.5, label='Target (<5%)')
plt.legend()
# Variable assignment
plt.grid(axis='x', alpha=0.3)
# 10. Purchase Frequency Distribution
plt.subplot(4, 3, 10)
plt.scatter(df['Purchase_Frequency_Days'], df['Total_Purchases'],
# Variable assignment
c=df['Member_Since_Years'], cmap='plasma', alpha=0.6, s=80)
# Variable assignment
plt.colorbar(label='Member Years')
plt.xlabel('Purchase Frequency (Days Between)')
plt.ylabel('Total Purchases')
# Variable assignment
plt.title('Purchase Frequency vs Volume', fontsize=12, fontweight='bold')
# Variable assignment
plt.grid(True, alpha=0.3)
# 11. RFM Analysis Heatmap
plt.subplot(4, 3, 11)
# Create RFM scores
# Variable assignment
df['R_Score'] = pd.qcut(df['Last_Purchase_Days_Ago'], 4, labels=[4, 3, 2, 1])
# Variable assignment
df['F_Score'] = pd.qcut(df['Total_Purchases'], 4, labels=[1, 2, 3, 4])
# Variable assignment
df['M_Score'] = pd.qcut(df['Total_Spent'], 4, labels=[1, 2, 3, 4])
# Variable assignment
rfm_pivot = df.groupby(['R_Score', 'F_Score']).size().unstack(fill_value=0)
# Variable assignment
sns.heatmap(rfm_pivot, annot=True, fmt='d', cmap='YlOrRd',
# Variable assignment
cbar_kws={'label': 'Customer Count'})
plt.xlabel('Frequency Score')
plt.ylabel('Recency Score')
# Variable assignment
plt.title('RFM Analysis: Recency vs Frequency', fontsize=12, fontweight='bold')
# 12. Top Customers by Engagement
plt.subplot(4, 3, 12)
# Variable assignment
top_customers = df.nlargest(10, 'Engagement_Score')
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# range(): Generates a sequence of numbers
# Documentation: https://docs.python.org/3/library/functions.html#range
plt.barh(range(len(top_customers)), top_customers['Engagement_Score'].values,
# Variable assignment
color='#16A085')
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# range(): Generates a sequence of numbers
# Documentation: https://docs.python.org/3/library/functions.html#range
plt.yticks(range(len(top_customers)), top_customers['Customer_ID'].values)
plt.xlabel('Engagement Score')
# Variable assignment
plt.title('Top 10 Most Engaged Customers', fontsize=12, fontweight='bold')
# Variable assignment
plt.grid(axis='x', alpha=0.3)
plt.tight_layout()
# Variable assignment
plt.savefig('ecommerce_analysis_dashboard.png', dpi=300, bbox_inches='tight')
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("\n[OK] Dashboard saved as 'ecommerce_analysis_dashboard.png'")
plt.show()
# K-Means Customer Segmentation
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("\n" + "=" * 60)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("CUSTOMER SEGMENTATION (K-MEANS CLUSTERING)")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("=" * 60)
# Prepare features for clustering
# Variable assignment
features = ['Total_Purchases', 'Total_Spent', 'Avg_Order_Value',
'Customer_Satisfaction', 'Member_Since_Years']
# Variable assignment
X = df[features].copy()
# Variable assignment
scaler = StandardScaler()
# Variable assignment
X_scaled = scaler.fit_transform(X)
# Perform K-means clustering
# Variable assignment
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
# Variable assignment
df['Segment'] = kmeans.fit_predict(X_scaled)
# Define segment names based on characteristics
# Variable assignment
segment_profiles = df.groupby('Segment')[features].mean()
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("\nSegment Profiles:")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# round(): Rounds a number
# Documentation: https://docs.python.org/3/library/functions.html#round
print(segment_profiles.round(2))
# Name segments based on characteristics
# Variable assignment
segment_names = {
segment_profiles['Total_Spent'].idxmax(): 'Premium',
segment_profiles['Total_Purchases'].idxmax(): 'Frequent Buyers',
segment_profiles['Member_Since_Years'].idxmax(): 'Loyal Veterans',
}
# Assign remaining segment as 'Growing'
# for: Loop that iterates over a sequence
# in: Checks if value is in a sequence
# range(): Generates a sequence of numbers
# Documentation: https://docs.python.org/3/library/functions.html#range
for i in range(4):
# if: Conditional statement - executes code if condition is True
# not: Logical NOT operator
# in: Checks if value is in a sequence
if i not in segment_names:
# Variable assignment
segment_names[i] = 'Growing'
# map(): Applies a function to all items
# Documentation: https://docs.python.org/3/library/functions.html#map
# Variable assignment
df['Segment_Name'] = df['Segment'].map(segment_names)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("\n" + "=" * 60)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print("BUSINESS INSIGHTS")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("=" * 60)
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n1. TOTAL METRICS:")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
print(f" Total Customers: {len(df)}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# sum(): Sums items in an iterable
# Documentation: https://docs.python.org/3/library/functions.html#sum
print(f" Total Revenue: ${df['Total_Spent'].sum():,.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Average Customer Value: ${df['Total_Spent'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Average Satisfaction: {df['Customer_Satisfaction'].mean():.2f}/5.0")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n2. TOP PRODUCT CATEGORIES BY REVENUE:")
# sum(): Sums items in an iterable
# Documentation: https://docs.python.org/3/library/functions.html#sum
# Variable assignment
category_revenue = df.groupby('Product_Category_Preference')['Total_Spent'].sum().sort_values(ascending=False)
# for: Loop that iterates over a sequence
# in: Checks if value is in a sequence
# items(): Returns dictionary key-value pairs
# Documentation: https://docs.python.org/3/library/stdtypes.html#dict.items
for cat, rev in category_revenue.head(5).items():
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" {cat}: ${rev:,.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n3. CUSTOMER SEGMENTS:")
# for: Loop that iterates over a sequence
# in: Checks if value is in a sequence
for segment in df['Segment_Name'].unique():
segment_data = df[df['Segment_Name'] == segment]
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n {segment} Segment:")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
print(f" Count: {len(segment_data)} customers ({len(segment_data)/len(df)*100:.1f}%)")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Avg Spent: ${segment_data['Total_Spent'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Avg Purchases: {segment_data['Total_Purchases'].mean():.1f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Avg Satisfaction: {segment_data['Customer_Satisfaction'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n4. NEWSLETTER EFFECTIVENESS:")
newsletter_yes = df[df['Newsletter_Subscriber'] == 'Yes']
newsletter_no = df[df['Newsletter_Subscriber'] == 'No']
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Subscribers avg spend: ${newsletter_yes['Total_Spent'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Non-subscribers avg spend: ${newsletter_no['Total_Spent'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Lift: {(newsletter_yes['Total_Spent'].mean() / newsletter_no['Total_Spent'].mean() - 1) * 100:.1f}%")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n5. AT-RISK CUSTOMERS:")
# Variable assignment
at_risk = df[df['Last_Purchase_Days_Ago'] > 20]
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
print(f" Count: {len(at_risk)} ({len(at_risk)/len(df)*100:.1f}%)")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# sum(): Sums items in an iterable
# Documentation: https://docs.python.org/3/library/functions.html#sum
print(f" Potential Revenue at Risk: ${at_risk['Total_Spent'].sum():,.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Avg Customer Value: ${at_risk['Total_Spent'].mean():.2f}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f"\n6. HIGH-VALUE CUSTOMER CHARACTERISTICS:")
# Variable assignment
high_value = df[df['Total_Spent'] > df['Total_Spent'].quantile(0.75)]
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Average age: {high_value['Age'].mean():.1f} years")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# len(): Returns the length of an object
# Documentation: https://docs.python.org/3/library/functions.html#len
# sum(): Sums items in an iterable
# Documentation: https://docs.python.org/3/library/functions.html#sum
print(f" Newsletter subscribers: {(high_value['Newsletter_Subscriber'] == 'Yes').sum() / len(high_value) * 100:.1f}%")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Top device: {high_value['Device_Type'].mode()[0]}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Top payment method: {high_value['Payment_Method'].mode()[0]}")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
print(f" Average return rate: {high_value['Return_Rate_Percent'].mean():.1f}%")
# print(): Outputs text to the console
# Documentation: https://docs.python.org/3/library/functions.html#print
# Variable assignment
print("\n" + "=" * 60)