Python项目实战:电商平台销售数据分析
作者:第一程序员
前言
最近在学习 Rust 的同时,我也在巩固 Python 的数据分析技能。作为一个从后端转 Rust 的萌新,我认为数据分析是一项非常重要的技能,无论是在后端开发还是其他领域,都能发挥重要作用。
今天,我就来分享一个 Python 数据分析的实战项目,希望能帮到和我一样的萌新们。
项目背景
我们将分析一个电商平台的销售数据,了解销售趋势、用户行为和产品表现,为业务决策提供数据支持。
数据准备
首先,我们需要准备数据。这里我们使用一个模拟的电商销售数据集,包含以下字段:
order_id:订单IDcustomer_id:客户IDorder_date:订单日期product_id:产品IDproduct_name:产品名称category:产品类别price:产品价格quantity:购买数量total_amount:订单总金额payment_method:支付方式shipping_address:收货地址
环境搭建
我们需要安装以下库:
pandas:用于数据处理和分析numpy:用于数值计算matplotlib:用于数据可视化seaborn:用于高级数据可视化jupyter:用于交互式数据分析
可以使用以下命令安装:
pip install pandas numpy matplotlib seaborn jupyter
数据分析流程
1. 数据加载和预处理
首先,我们需要加载数据并进行预处理:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 加载数据
df = pd.read_csv('sales_data.csv')
# 查看数据基本信息
print(df.info())
# 查看数据前几行
print(df.head())
# 检查缺失值
print(df.isnull().sum())
# 处理缺失值
df = df.dropna()
# 转换数据类型
df['order_date'] = pd.to_datetime(df['order_date'])
# 添加新列
df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month
df['day'] = df['order_date'].dt.day
2. 数据探索性分析
接下来,我们进行数据探索性分析,了解数据的基本特征:
# 统计描述
print(df.describe())
# 销售趋势分析
sales_by_date = df.groupby('order_date')['total_amount'].sum()
plt.figure(figsize=(12, 6))
sales_by_date.plot()
plt.title('每日销售趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.show()
# 月度销售趋势
sales_by_month = df.groupby(['year', 'month'])['total_amount'].sum().reset_index()
sales_by_month['date'] = pd.to_datetime(sales_by_month[['year', 'month']].assign(day=1))
plt.figure(figsize=(12, 6))
sns.lineplot(x='date', y='total_amount', data=sales_by_month)
plt.title('月度销售趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.show()
# 产品类别销售分析
sales_by_category = df.groupby('category')['total_amount'].sum().sort_values(ascending=False)
plt.figure(figsize=(12, 6))
sales_by_category.plot(kind='bar')
plt.title('各产品类别销售额')
plt.xlabel('产品类别')
plt.ylabel('销售额')
plt.xticks(rotation=45)
plt.show()
# 产品销售分析
top_10_products = df.groupby('product_name')['total_amount'].sum().sort_values(ascending=False).head(10)
plt.figure(figsize=(12, 6))
top_10_products.plot(kind='bar')
plt.title('销售额前10的产品')
plt.xlabel('产品名称')
plt.ylabel('销售额')
plt.xticks(rotation=45)
plt.show()
# 支付方式分析
payment_method_count = df.groupby('payment_method')['order_id'].count()
plt.figure(figsize=(10, 6))
plt.pie(payment_method_count, labels=payment_method_count.index, autopct='%1.1f%%')
plt.title('支付方式分布')
plt.show()
# 客户购买行为分析
customer_purchase = df.groupby('customer_id')['total_amount'].agg(['count', 'sum', 'mean']).rename(columns={'count': '购买次数', 'sum': '总消费', 'mean': '平均消费'})
plt.figure(figsize=(12, 6))
sns.histplot(customer_purchase['购买次数'], bins=20)
plt.title('客户购买次数分布')
plt.xlabel('购买次数')
plt.ylabel('客户数')
plt.show()
plt.figure(figsize=(12, 6))
sns.histplot(customer_purchase['总消费'], bins=20)
plt.title('客户总消费分布')
plt.xlabel('总消费')
plt.ylabel('客户数')
plt.show()
3. 数据深度分析
现在,我们进行更深入的分析,发现数据中的模式和规律:
# 客户价值分析
# 计算客户生命周期价值 (CLV)
# 这里简化计算,使用总消费作为CLV
customer_clv = df.groupby('customer_id')['total_amount'].sum().sort_values(ascending=False)
# 客户分层
top_20_percent = int(len(customer_clv) * 0.2)
top_customers = customer_clv.head(top_20_percent)
print(f"前20%客户数量: {top_20_percent}")
print(f"前20%客户消费占比: {top_customers.sum() / customer_clv.sum():.2f}")
# 产品关联分析
# 计算产品之间的关联度
from itertools import combinations
from collections import defaultdict
# 构建购物篮
baskets = df.groupby('order_id')['product_name'].apply(list).tolist()
# 计算产品对的出现次数
product_pairs = defaultdict(int)
for basket in baskets:
if len(basket) >= 2:
for pair in combinations(set(basket), 2):
product_pairs[tuple(sorted(pair))] += 1
# 转换为DataFrame
product_pairs_df = pd.DataFrame.from_dict(product_pairs, orient='index', columns=['count']).reset_index()
product_pairs_df[['product1', 'product2']] = pd.DataFrame(product_pairs_df['index'].tolist(), index=product_pairs_df.index)
product_pairs_df = product_pairs_df.drop('index', axis=1)
product_pairs_df = product_pairs_df.sort_values('count', ascending=False)
print("产品关联度前10:")
print(product_pairs_df.head(10))
# 销售预测
# 使用移动平均法进行销售预测
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
# 准备数据
sales_series = sales_by_date
# 拟合模型
model = SimpleExpSmoothing(sales_series).fit(smoothing_level=0.6, optimized=False)
# 预测未来7天
forecast = model.forecast(7)
# 可视化预测结果
plt.figure(figsize=(12, 6))
plt.plot(sales_series.index, sales_series.values, label='实际销售额')
plt.plot(forecast.index, forecast.values, label='预测销售额', linestyle='--')
plt.title('销售额预测')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.legend()
plt.show()
4. 数据可视化和报告
最后,我们将分析结果进行可视化,并生成一份分析报告:
# 生成综合分析报告
import io
from PIL import Image
# 创建一个HTML报告
report_html = """
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>电商销售数据分析报告</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
h1 { color: #333; }
h2 { color: #555; }
.section { margin-bottom: 30px; }
.chart { margin: 20px 0; }
table { border-collapse: collapse; width: 100%; margin: 20px 0; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<h1>电商销售数据分析报告</h1>
<div class="section">
<h2>1. 数据概览</h2>
<p>本次分析基于电商平台的销售数据,包含订单信息、客户信息、产品信息等。</p>
<p>数据量:{total_orders} 条订单记录</p>
<p>时间范围:{start_date} 至 {end_date}</p>
<p>总销售额:¥{total_sales:.2f}</p>
<p>客户数量:{total_customers} 位</p>
<p>产品种类:{total_products} 种</p>
</div>
<div class="section">
<h2>2. 销售趋势分析</h2>
<p>从销售趋势图可以看出,销售额呈现[上升/下降/稳定]趋势。</p>
<div class="chart">
<img src="data:image/png;base64,{sales_trend_chart}" alt="销售趋势图">
</div>
</div>
<div class="section">
<h2>3. 产品分析</h2>
<p>销售额最高的产品类别是 {top_category},占总销售额的 {top_category_percent:.2f}%。</p>
<p>销售额最高的产品是 {top_product},销售额为 ¥{top_product_sales:.2f}。</p>
<div class="chart">
<img src="data:image/png;base64,{category_chart}" alt="产品类别销售图">
</div>
<div class="chart">
<img src="data:image/png;base64,{product_chart}" alt="产品销售图">
</div>
</div>
<div class="section">
<h2>4. 客户分析</h2>
<p>前20%的客户贡献了 {top_customer_percent:.2f}% 的销售额,体现了帕累托法则(80/20法则)。</p>
<div class="chart">
<img src="data:image/png;base64,{customer_chart}" alt="客户消费分布图">
</div>
</div>
<div class="section">
<h2>5. 支付方式分析</h2>
<p>最常用的支付方式是 {top_payment_method},占比 {top_payment_percent:.2f}%。</p>
<div class="chart">
<img src="data:image/png;base64,{payment_chart}" alt="支付方式分布图">
</div>
</div>
<div class="section">
<h2>6. 产品关联分析</h2>
<p>最常一起购买的产品组合是:</p>
<table>
<tr>
<th>产品1</th>
<th>产品2</th>
<th>共同购买次数</th>
</tr>
{product_pairs_table}
</table>
</div>
<div class="section">
<h2>7. 销售预测</h2>
<p>基于历史数据,预测未来7天的销售额:</p>
<div class="chart">
<img src="data:image/png;base64,{forecast_chart}" alt="销售预测图">
</div>
</div>
<div class="section">
<h2>8. 结论与建议</h2>
<p>1. <strong>销售策略</strong>:重点关注销售额高的产品类别和产品,加大促销力度。</p>
<p>2. <strong>客户策略</strong>:针对高价值客户,提供个性化服务和专属优惠,提高客户忠诚度。</p>
<p>3. <strong>产品策略</strong>:基于产品关联分析,优化产品布局和推荐系统,提高交叉销售。</p>
<p>4. <strong>库存管理</strong>:根据销售趋势和预测,合理安排库存,避免积压和缺货。</p>
<p>5. <strong>支付方式</strong>:优化支付流程,支持更多便捷的支付方式,提高转化率。</p>
</div>
</body>
</html>
"""
# 生成图表并转换为base64
import base64
# 销售趋势图
plt.figure(figsize=(12, 6))
sales_by_date.plot()
plt.title('每日销售趋势')
plt.xlabel('日期')
plt.ylabel('销售额')
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
sales_trend_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 产品类别销售图
plt.figure(figsize=(12, 6))
sales_by_category.plot(kind='bar')
plt.title('各产品类别销售额')
plt.xlabel('产品类别')
plt.ylabel('销售额')
plt.xticks(rotation=45)
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
category_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 产品销售图
plt.figure(figsize=(12, 6))
top_10_products.plot(kind='bar')
plt.title('销售额前10的产品')
plt.xlabel('产品名称')
plt.ylabel('销售额')
plt.xticks(rotation=45)
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
product_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 客户消费分布图
plt.figure(figsize=(12, 6))
sns.histplot(customer_purchase['总消费'], bins=20)
plt.title('客户总消费分布')
plt.xlabel('总消费')
plt.ylabel('客户数')
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
customer_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 支付方式分布图
plt.figure(figsize=(10, 6))
plt.pie(payment_method_count, labels=payment_method_count.index, autopct='%1.1f%%')
plt.title('支付方式分布')
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
payment_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 销售预测图
plt.figure(figsize=(12, 6))
plt.plot(sales_series.index, sales_series.values, label='实际销售额')
plt.plot(forecast.index, forecast.values, label='预测销售额', linestyle='--')
plt.title('销售额预测')
plt.xlabel('日期')
plt.ylabel('销售额')
plt.legend()
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
forecast_chart = base64.b64encode(buf.read()).decode('utf-8')
plt.close()
# 产品关联表
product_pairs_table = ''
for _, row in product_pairs_df.head(10).iterrows():
product_pairs_table += f"<tr><td>{row['product1']}</td><td>{row['product2']}</td><td>{row['count']}</td></tr>"
# 填充报告数据
total_orders = len(df)
start_date = df['order_date'].min().strftime('%Y-%m-%d')
end_date = df['order_date'].max().strftime('%Y-%m-%d')
total_sales = df['total_amount'].sum()
total_customers = df['customer_id'].nunique()
total_products = df['product_name'].nunique()
top_category = sales_by_category.index[0]
top_category_percent = (sales_by_category.iloc[0] / total_sales) * 100
top_product = top_10_products.index[0]
top_product_sales = top_10_products.iloc[0]
top_customer_percent = (top_customers.sum() / customer_clv.sum()) * 100
top_payment_method = payment_method_count.idxmax()
top_payment_percent = (payment_method_count.max() / payment_method_count.sum()) * 100
# 生成最终报告
final_report = report_html.format(
total_orders=total_orders,
start_date=start_date,
end_date=end_date,
total_sales=total_sales,
total_customers=total_customers,
total_products=total_products,
top_category=top_category,
top_category_percent=top_category_percent,
top_product=top_product,
top_product_sales=top_product_sales,
top_customer_percent=top_customer_percent,
top_payment_method=top_payment_method,
top_payment_percent=top_payment_percent,
sales_trend_chart=sales_trend_chart,
category_chart=category_chart,
product_chart=product_chart,
customer_chart=customer_chart,
payment_chart=payment_chart,
product_pairs_table=product_pairs_table,
forecast_chart=forecast_chart
)
# 保存报告
with open('sales_analysis_report.html', 'w', encoding='utf-8') as f:
f.write(final_report)
print("分析报告已生成:sales_analysis_report.html")
项目总结
通过这个实战项目,我们学习了如何使用 Python 进行数据分析,包括:
数据加载和预处理:使用 pandas 加载数据,处理缺失值,转换数据类型。
数据探索性分析:使用 pandas 进行数据统计,使用 matplotlib 和 seaborn 进行数据可视化。
数据深度分析:进行客户价值分析、产品关联分析和销售预测。
生成分析报告:将分析结果整理成 HTML 报告,方便查看和分享。
技术栈总结
- 数据处理:pandas, numpy
- 数据可视化:matplotlib, seaborn
- 时间序列分析:statsmodels
- 报告生成:HTML, base64
后续优化方向
数据质量:进一步提高数据质量,处理异常值和重复值。
分析深度:使用更高级的分析方法,如聚类分析、分类分析等。
模型优化:使用更复杂的预测模型,如 ARIMA、LSTM 等。
交互性:使用 dash 或 streamlit 构建交互式分析应用。
实时分析:搭建实时数据分析系统,实时监控销售情况。
结论
Python 是一门非常适合数据分析的语言,它拥有丰富的库和工具,可以帮助我们快速、高效地进行数据分析。作为一个从后端转 Rust 的萌新,我认为数据分析是一项非常重要的技能,无论是在后端开发还是其他领域,都能发挥重要作用。
通过这个实战项目,我不仅巩固了 Python 数据分析的技能,也对数据驱动决策有了更深刻的理解。我相信,在未来的工作中,这些技能将帮助我更好地解决问题,做出更明智的决策。
到此这篇关于Python项目实战:电商平台销售数据分析的文章就介绍到这了,更多相关Python电商平台数据分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
