Python电商销售数据分析实战:从数据预处理到可视化报告生成

更新时间:2026-10-10 09:59:36 来源:本站整理 浏览:0

前言

在巩固 Python 数据分析技能的过程中,我完成了一个电商平台销售数据分析的实战项目。数据分析在后端开发及其他技术领域都扮演着重要角色,本文将从数据加载、预处理、探索性分析、深度分析到可视化报告生成,完整呈现这一过程,希望能为同样在学习数据分析的朋友提供参考。

项目背景

本项目旨在分析一个电商平台的销售数据,通过了解销售趋势、用户行为及产品表现,为业务决策提供数据支持。

数据准备

我们使用一个模拟的电商销售数据集,包含以下字段:

  • order_id:订单ID
  • customer_id:客户ID
  • order_date:订单日期
  • product_id:产品ID
  • product_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.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. 数据深度分析

进一步挖掘数据中的模式和规律,包括客户价值分析、产品关联分析和销售预测:

# 客户价值分析
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 进行投诉反馈,一经查实,立即处理!