5-analyze_ecommerce

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.

Source File 5-analyze_ecommerce.py
Folder Chapter-4-Datasets-Medium
"""
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)