Python电商销售数据分析实战:从数据预处理到可视化报告生成
前言
在巩固 Python 数据分析技能的过程中,我完成了一个电商平台销售数据分析的实战项目。数据分析在后端开发及其他技术领域都扮演着重要角色,本文将从数据加载、预处理、探索性分析、深度分析到可视化报告生成,完整呈现这一过程,希望能为同样在学习数据分析的朋友提供参考。
项目背景
本项目旨在分析一个电商平台的销售数据,通过了解销售趋势、用户行为及产品表现,为业务决策提供数据支持。
数据准备
我们使用一个模拟的电商销售数据集,包含以下字段:
order_id:订单IDcustomer_id:客户IDorder_date:订单日期product_id:产品IDproduct_name:产品名称category:产品类别price:产品价格quantity:购买数量total_amount:订单总金额payment_method:支付方式shipping_address:收货地址
环境搭建
需要安装以下 Python 库:
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.day2. 数据探索性分析
通过统计描述和可视化图表,了解数据的基本特征:
# 统计描述
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. 数据深度分析
进一步挖掘数据中的模式和规律,包括客户价值分析、产品关联分析和销售预测:
# 客户价值分析
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
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)
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. 数据可视化和报告
将分析结果整合为 HTML 报告,包含图表和关键结论:
import io
import base64
from PIL import Image
# 生成图表并转换为 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
# 生成最终报告(HTML 模板省略,实际代码中会包含完整 HTML 结构)
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 凭借其丰富的库和工具,非常适合数据分析工作。通过这个实战项目,我不仅巩固了 Python 数据分析技能,也加深了对数据驱动决策的理解。这些技能将在未来的工作中帮助我更高效地解决问题、做出更明智的决策。
原文链接:本站整理
本文来自互联网用户投稿,该文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 service@2cto.cc 进行投诉反馈,一经查实,立即处理!
您可能感兴趣的文章:
下一篇:Python执行多行cmd命令:单&与双&&的区别详解