# 导入需要的库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.sparse.linalg import svds
from sklearn.preprocessing import MinMaxScaler
# 读取数据
data = pd.read_csv("shopping_trends.csv")
print(data.head())
# 查看数据维度
print(data.shape)
# 查看数据信息
print(data.info())
print(data.isna().sum())
# 查看重复值
print(data.duplicated().sum())
# 判断使用折扣和使用优惠码的情况是否同时出现
(data['Discount Applied'] == data['Promo Code Used']).all()
# 修改Customer ID格式
data['Customer ID'] = data['Customer ID'].astype(str)
# 删除使用优惠码的那一列
data.drop(['Promo Code Used'],axis=1,inplace=True)
sns.set_style("whitegrid")
plt.figure(figsize=(15, 7))
plt.subplot(1, 2, 1)
sns.distplot(data['Age'], kde=False, bins=10)
plt.title(f'Age Distribution', fontsize=15)
plt.xlabel('Age', fontsize=12)
plt.ylabel('Count', fontsize=12)
plt.subplot(1, 2, 2)
sns.countplot(data=data, x='Gender',order=data['Gender'].value_counts().index)
plt.title(f'Gender Distribution', fontsize=15)
plt.xlabel('Gender', fontsize=12)
plt.ylabel('Count', fontsize=12)
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
# 1.商品类别的销售情况
category_sales = data.groupby('Category')['Purchase Amount (USD)'].sum().sort_values(ascending=False)
# 2.商品类别的订单量
category_popularity = data['Category'].value_counts()
# 3.不同类别商品的平均消费金额
category_avg_purchase = data.groupby('Category')['Purchase Amount (USD)'].mean().sort_values(ascending=False)
# 4.客户最常用的支付方式
payment_method_counts = data['Payment Method'].value_counts()
# 创建画布
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(14, 10))
fig.tight_layout(pad=5.0)
# 绘制商品类别销售总额的条形图
sns.barplot(x=category_sales.index, y=category_sales.values, ax=axes[0, 0])
axes[0, 0].set_title('Total Sales by Category')
axes[0, 0].set_xlabel('Category')
axes[0, 0].set_ylabel('Total Sales (USD)')
# 绘制商品订单情况的条形图
sns.barplot(x=category_popularity.index, y=category_popularity.values, ax=axes[0, 1])
axes[0, 1].set_title('Popularity by Category')
axes[0, 1].set_xlabel('Category')
axes[0, 1].set_ylabel('Number of Orders')
# 绘制商品类别的平均消费金额的条形图
sns.barplot(x=category_avg_purchase.index, y=category_avg_purchase.values, ax=axes[1, 0])
axes[1, 0].set_title('Average Purchase Amount by Category')
axes[1, 0].set_xlabel('Category')
axes[1, 0].set_ylabel('Average Purchase Amount (USD)')
# 绘制客户最常用的支付方式的条形图
sns.barplot(x=payment_method_counts.index, y=payment_method_counts.values, ax=axes[1, 1])
axes[1, 1].set_title('Usage of Payment Methods')
axes[1, 1].set_xlabel('Payment Method')
axes[1, 1].set_ylabel('Number of Orders')
plt.show()
# 1.不同地点的销售总额
location_sales = data.groupby('Location')['Purchase Amount (USD)'].sum().sort_values(ascending=False)
# 2.不同地点的订单数量
location_order_count = data['Location'].value_counts()
# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 16))
fig.tight_layout(pad=5.0)
# 绘制不同地点的销售总额条形图
sns.barplot(y=location_sales.index, x=location_sales.values, ax=axes[0])
axes[0].set_title('Total Sales by Location')
axes[0].set_xlabel('Total Sales (USD)')
axes[0].set_ylabel('Location')
# 绘制不同地点的订单数量条形图
sns.barplot(y=location_order_count.index, x=location_order_count.values, ax=axes[1])
axes[1].set_title('Number of Orders by Location')
axes[1].set_xlabel('Number of Orders')
axes[1].set_ylabel('Location')
plt.show()
# 1.不同季节的销售总额
season_sales = data.groupby('Season')['Purchase Amount (USD)'].sum().sort_values(ascending=False)
# 2.不同季节的订单数量
season_order_count = data['Season'].value_counts()
# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 8))
fig.tight_layout(pad=5.0)
# 绘制不同季节的销售总额条形图
sns.barplot(x=season_sales.index, y=season_sales.values, ax=axes[0])
axes[0].set_title('Total Sales by Season')
axes[0].set_xlabel('Season')
axes[0].set_ylabel('Total Sales (USD)')
# 绘制不同季节的订单数量条形图
sns.barplot(x=season_order_count.index, y=season_order_count.values, ax=axes[1])
axes[1].set_title('Number of Orders by Season')
axes[1].set_xlabel('Season')
axes[1].set_ylabel('Number of Orders')
plt.show()
# 1.有折扣和没有折扣的订单的平均消费金额
avg_purchase_discount = data.groupby('Discount Applied')['Purchase Amount (USD)'].mean()
# 2.有折扣和没有折扣的订单数量
purchase_counts = data.groupby('Discount Applied').size()
# 创建画布
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 8))
fig.tight_layout(pad=5.0)
# 绘制有折扣和没有折扣的订单的平均消费金额条形图
sns.barplot(x=avg_purchase_discount.index, y=avg_purchase_discount.values, ax=axes[0])
axes[0].set_title('Average Purchase Amount with/without Discount')
axes[0].set_xlabel('Discount Applied')
axes[0].set_ylabel('Average Purchase Amount (USD)')
# 绘制有折扣和没有折扣的订单数量条形图
sns.barplot(x=purchase_counts.index, y=purchase_counts.values, ax=axes[1])
axes[1].set_title('Number of Orders with/without Discount')
axes[1].set_xlabel('Discount Applied')
axes[1].set_ylabel('Number of Orders')
# 总结:
# 1.衣服的销售总额和订单数量都是最高的,外套的销售总额和订单数量是最低的。
# 2.鞋类、衣服、配饰三类商品平均消费金额比较接近,在60美元左右,外套的平均消费金额最低。
# 3.PayPal是最常用的支付方式,其次是信用卡和现金,最少的支付方式是银行转账。
# 4.蒙大拿州(Montana)的销售总额和订单数量是最高的,堪萨斯州(Kansas)的销售总额和订单数量是最低的。
# 5.秋季(Fall)有着最高的销售金额,春季(Spring)有着最高的订单数量,夏季(Summer)的销售金额和订单数量都是最低的。
# 6.使用折扣的订单平均消费金额略小于未使用折扣的订单平均销售金额,未使用折扣的订单数量大于使用折扣的订单数量。
# 筛选出四个类别下的商品数据
categories_of_interest = ['Clothing', 'Accessories', 'Footwear', 'Outerwear']
filtered_data = data[data['Category'].isin(categories_of_interest)]
# 商品种类分析
item_counts = filtered_data.groupby('Category')['Item Purchased'].value_counts().unstack(fill_value=0)
# 创建堆叠条形图
ax = item_counts.plot(kind='bar', stacked=True, figsize=(16, 12), colormap='viridis', legend=False)
# 设置图表标题和坐标轴标签
ax.set_title('Sales Quantity of Different Items in Each Category', fontsize=16)
ax.set_xlabel('Category', fontsize=12)
ax.set_ylabel('Quantity Sold', fontsize=12)
# 优化坐标轴刻度显示
ax.yaxis.get_major_formatter().set_scientific(False)
# 在每个颜色段上标注商品名称和数量
for i, category in enumerate(item_counts.index):
y_offset = 0
for item, count in item_counts.loc[category].items():
if count > 0:
ax.text(i, y_offset + count / 2, f'{item}:{count}', ha='center', va='center', fontsize=12, color='white',fontweight='bold')
y_offset += count
# 显示图表
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
# 计算每个商品在每个类别下的销售总额
sales_amount = filtered_data.groupby('Category').apply(lambda x: x.groupby('Item Purchased')['Purchase Amount (USD)'].sum())
# 将sales_amount转换为DataFrame并进行适当的调整
sales_amount_df = sales_amount.unstack(fill_value=0)
# 创建堆叠条形图
ax = sales_amount_df.plot(kind='bar', stack