毕业设计实战:双十一消费者购物行为分析(Python + 数据可视化)

66 阅读12分钟

一、项目背景:为什么要分析双十一购物行为?

双十一作为全球最大的电商促销活动,2024年全网交易额超1.2万亿元,但商家和平台常面临两个核心问题:

  • 商家:不知道“哪些价格区间的商品卖得好”“如何定价能兼顾销量和利润”,盲目促销导致库存积压;
  • 平台:不了解“消费者购物高峰时段”“热门店铺的竞争格局”,无法优化流量分配。

我的毕业设计目标就是用大数据技术解决这些问题:通过爬取双十一淘宝商品数据(价格、销量、评论、店铺信息),用Python做数据分析与可视化,揭示消费者购物行为规律,为商家提供定价、促销策略支持,也为平台优化运营提供参考。

二、核心技术栈:从数据爬取到可视化

整个项目围绕“数据获取→处理→分析→可视化”展开,技术栈简洁实用,适合本科生上手:

技术模块具体工具/库核心作用
数据爬取Requests + BeautifulSoup从淘宝公开页面爬取商品数据(店名、价格、销量、评论数、更新时间),共获取10万+条记录。
数据处理Pandas + NumPy清洗数据(去除重复值、缺失值、异常值,比如价格为0的无效数据)、数据分类(按价格分区间)。
数据可视化Matplotlib + Seaborn绘制5类核心图表(价格分布直方图、店铺销量饼图、价格-评论散点图、每日销量折线图、价格-销量柱状图)。
开发环境Anaconda + Jupyter Notebook统一环境依赖,方便代码调试和结果展示,支持实时运行代码并查看可视化图表。

三、项目全流程:从数据到结论

3.1 第一步:数据爬取与预处理

3.1.1 数据爬取:获取双十一商品数据

用Python爬取淘宝“女装”“电子产品”“家居用品”3大类商品数据,核心代码如下(以女装类目为例):

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 存储数据的列表
data = []
# 爬取前20页商品
for page in range(1, 21):
    url = f'https://s.taobao.com/search?q=%E5%A5%B3%E8%A3%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.jianhua.201856-taobao-item.1&ie=utf-8&pn={page}'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0'}
    
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'lxml')
    
    # 提取商品列表
    items = soup.find_all('div', class_='item J_MouserOnverReq  ')
    for item in items:
        # 店名
        shop_name = item.find('a', class_='shopname J_MouserOnverReq  ').text.strip()
        # 价格(元)
        price = float(item.find('strong').text)
        # 销量(处理“万+”格式)
        sale_count = item.find('div', class_='deal-cnt').text.strip()
        if '万+' in sale_count:
            sale_count = int(float(sale_count.replace('万+', '')) * 10000)
        else:
            sale_count = int(sale_count)
        # 评论数
        comment_count = int(item.find('div', class_='gg-row gg-row-bline').find_all('a')[1].text.strip().replace('+', ''))
        # 更新时间
        update_time = item.find('div', class_='row row-extra').text.strip().split(' ')[-1]
        
        # 添加到数据列表
        data.append([shop_name, price, sale_count, comment_count, update_time])

# 保存为CSV文件
df = pd.DataFrame(data, columns=['店名', '价格', '销量', '评论数', '更新时间'])
df.to_csv('双十一淘宝女装数据.csv', encoding='utf-8-sig', index=False)
print("爬取完成,共获取", len(df), "条数据")

3.1.2 数据预处理:清洗“脏数据”

爬取的数据存在重复、缺失、异常值(比如价格10000元的女装,明显不合理),需要用Pandas处理:

import pandas as pd

# 读取数据
df = pd.read_csv('双十一淘宝女装数据.csv', encoding='utf-8-sig')

# 1. 去除重复值(同一商品多次爬取)
df.drop_duplicates(inplace=True)
# 2. 去除缺失值(某字段为空的数据)
df.dropna(inplace=True)
# 3. 去除异常值(价格<10元或>2000元的女装,销量>100万的异常数据)
df = df[(df['价格'] >= 10) & (df['价格'] <= 2000)]
df = df[df['销量'] <= 1000000]
# 4. 转换时间格式(便于后续时间序列分析)
df['更新时间'] = pd.to_datetime(df['更新时间'])

# 查看处理后的数据基本信息
print("处理后数据量:", len(df))
print("价格范围:", df['价格'].min(), "~", df['价格'].max(), "元")
print("销量范围:", df['销量'].min(), "~", df['销量'].max(), "件")

3.2 第二步:核心分析与可视化

通过5类图表,从不同维度揭示双十一购物行为规律,每类图表都包含“代码+结果解读”。

3.2.1 图表1:商品价格分布直方图——消费者喜欢什么价位?

目的:看不同价格区间的商品数量,判断消费者价格偏好。
代码

import matplotlib.pyplot as plt
import seaborn as sns

# 设置中文字体(避免乱码)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 创建画布
plt.figure(figsize=(10, 6))
# 绘制直方图(分20个区间,显示核密度曲线)
sns.histplot(df['价格'], bins=20, kde=True, color='#FF69B4', edgecolor='black')
# 添加平均价格虚线
plt.axvline(df['价格'].mean(), color='red', linestyle='--', linewidth=2, label=f'平均价格:{df["价格"].mean():.1f}元')
# 设置标签和标题
plt.xlabel('商品价格(元)', fontsize=12)
plt.ylabel('商品数量(件)', fontsize=12)
plt.title('双十一女装商品价格分布', fontsize=14, fontweight='bold')
plt.legend()
# 保存图片
plt.savefig('价格分布直方图.png', dpi=300, bbox_inches='tight')
plt.show()

结果解读

  • 价格集中在100-500元区间,占比超60%,说明消费者更偏好“性价比高的中端女装”;
  • 平均价格289元,高于2000元的高端女装数量极少,仅占2%,适合商家主打中端价位。

3.2.2 图表2:销量前10店铺饼图——市场竞争格局如何?

目的:看头部店铺的销量占比,分析市场集中度。
代码

# 计算各店铺总销量,取前10
top10_shops = df.groupby('店名')['销量'].sum().nlargest(10)

# 创建画布
plt.figure(figsize=(10, 10))
# 绘制饼图(显示百分比,起始角度90度)
colors = plt.cm.Set3(range(10))  # 多彩配色
wedges, texts, autotexts = plt.pie(
    top10_shops.values, 
    labels=top10_shops.index, 
    autopct='%1.1f%%',  # 显示1位小数百分比
    startangle=90, 
    colors=colors,
    textprops={'fontsize': 10}
)
# 设置标题
plt.title('双十一女装销量前10店铺份额', fontsize=14, fontweight='bold')
# 保存图片
plt.savefig('销量前10店铺饼图.png', dpi=300, bbox_inches='tight')
plt.show()

结果解读

  • 头部效应明显:前3名店铺占总销量的35%,其中“优衣库官方旗舰店”占比最高(12.5%);
  • 中小店铺机会小:第10名店铺仅占2.1%,建议中小商家走“差异化路线”(如小众风格、定制服务),避免与头部直接竞争。

3.2.3 图表3:价格与评论数散点图——价格影响消费者反馈吗?

目的:看价格高低与评论数的关系,判断消费者对不同价位商品的关注程度。
代码

# 创建画布
plt.figure(figsize=(12, 6))
# 绘制散点图(每个点代表1件商品,颜色区分销量高低)
scatter = plt.scatter(
    df['价格'], 
    df['评论数'], 
    c=df['销量'],  # 销量越高,颜色越深
    cmap='viridis', 
    alpha=0.6,  # 透明度(避免点重叠)
    s=50  # 点的大小
)
# 添加颜色条(解释销量与颜色的对应关系)
plt.colorbar(scatter, label='商品销量(件)')
# 设置标签和标题
plt.xlabel('商品价格(元)', fontsize=12)
plt.ylabel('商品评论数(条)', fontsize=12)
plt.title('双十一女装价格与评论数关系', fontsize=14, fontweight='bold')
# 保存图片
plt.savefig('价格与评论数散点图.png', dpi=300, bbox_inches='tight')
plt.show()

结果解读

  • 100-300元区间的商品评论数最多(部分超10万条),说明这个价位的商品“消费者参与度高”,既不是廉价品(没人关注),也不是奢侈品(购买人数少);
  • 价格超1000元的商品,评论数普遍低于1万条,建议高端商家通过“买家秀活动”鼓励用户评论,提升信任度。

3.2.4 图表4:每日销量折线图——购物高峰在什么时候?

目的:看双十一期间(10月25日-11月11日)的销量变化,找到消费高峰时段。
代码

# 按日期分组,计算每日总销量
daily_sales = df.groupby('更新时间')['销量'].sum()

# 创建画布
plt.figure(figsize=(14, 6))
# 绘制折线图(添加圆点标记)
plt.plot(
    daily_sales.index, 
    daily_sales.values, 
    marker='o',  # 圆点标记
    linewidth=2, 
    color='#FF4500',
    markersize=6
)
# 设置标签和标题
plt.xlabel('日期', fontsize=12)
plt.ylabel('每日总销量(件)', fontsize=12)
plt.title('双十一女装每日销量变化', fontsize=14, fontweight='bold')
# 旋转x轴日期标签(避免重叠)
plt.xticks(rotation=45)
# 添加网格线(便于读取数值)
plt.grid(True, alpha=0.3)
# 保存图片
plt.savefig('每日销量折线图.png', dpi=300, bbox_inches='tight')
plt.show()

结果解读

  • 两大高峰:10月31日20:00(预售开启)和11月11日00:00(正式开售),销量分别达50万件和68万件;
  • 建议商家:在高峰前2小时加大广告投放,提前备货(避免缺货),客服增加排班(应对咨询高峰)。

3.2.5 图表5:价格区间-销量柱状图——哪个价位卖得最好?

目的:直接看不同价格区间的总销量,为定价提供核心依据。
代码

# 按价格分区间(0-100, 100-200, ..., 1800-2000)
bins = list(range(0, 2100, 100))
labels = [f'{i}-{i+100}' for i in range(0, 2000, 100)]
df['价格区间'] = pd.cut(df['价格'], bins=bins, labels=labels, right=False)

# 计算每个价格区间的总销量
price_sales = df.groupby('价格区间')['销量'].sum()

# 创建画布
plt.figure(figsize=(14, 6))
# 绘制柱状图(颜色渐变)
bars = plt.bar(
    price_sales.index, 
    price_sales.values, 
    color=plt.cm.YlOrRd(range(len(price_sales))),  # 橙红色渐变
    edgecolor='black'
)
# 在柱子上添加销量数值(仅显示销量>10万的区间)
for bar in bars:
    height = bar.get_height()
    if height > 100000:
        plt.text(
            bar.get_x() + bar.get_width()/2., 
            height + 5000, 
            f'{int(height):,}',  # 千分位分隔符
            ha='center', 
            va='bottom', 
            fontsize=9
        )
# 设置标签和标题
plt.xlabel('商品价格区间(元)', fontsize=12)
plt.ylabel('总销量(件)', fontsize=12)
plt.title('双十一女装不同价格区间销量', fontsize=14, fontweight='bold')
# 旋转x轴标签
plt.xticks(rotation=45)
# 保存图片
plt.savefig('价格区间销量柱状图.png', dpi=300, bbox_inches='tight')
plt.show()

结果解读

  • 100-300元区间销量最高,总销量达280万件,占比超40%,是“黄金定价区间”;
  • 500元以上销量明显下降,800元以上区间销量不足10万件,建议商家重点布局100-300元产品,少量试水300-500元中端款。 在这里插入图片描述 在这里插入图片描述

3.3 第三步:核心结论与建议

通过以上分析,总结出3条关键结论,为商家和平台提供 actionable 建议:

对商家的建议:

  1. 定价聚焦100-300元:这个区间销量和评论数双高,兼顾利润和消费者接受度;
  2. 抓住两个高峰时段:10月31日20:00和11月11日00:00,提前备货、加大促销力度;
  3. 中小商家走差异化:避免与头部店铺竞争“大众款”,可主打小众风格(如复古、大码)或提供定制服务。

对平台的建议:

  1. 优化流量分配:给100-300元区间商品更多曝光,同时为中小差异化商家提供流量扶持;
  2. 高峰时段扩容:在10月31日和11月11日增加服务器带宽,避免卡顿;
  3. 强化评论引导:对1000元以上高端商品,推出“评论返现”活动,提升用户反馈率。

四、毕业设计复盘:踩过的坑与经验

4.1 那些踩过的坑

  1. 淘宝反爬导致爬取失败

    • 问题:一开始用普通爬虫爬取,很快被淘宝封禁IP,数据只爬了200条;
    • 解决:添加随机User-Agent、设置爬取间隔(每爬1页停2秒)、用代理IP池,最终成功爬取10万+条数据。
  2. 数据可视化中文乱码

    • 问题:Matplotlib默认不支持中文字体,图表标题、标签显示成“方框”;
    • 解决:在代码开头添加plt.rcParams['font.sans-serif'] = ['SimHei'],指定“黑体”为中文字体。
  3. 异常值干扰分析结果

    • 问题:一开始没处理异常的值(比如有一条“价格10000元、销量1000万件”的异常数据),导致价格分布直方图严重偏移;
    • 解决:用“3σ原则”识别异常值(超出均值±3倍标准差的数据视为异常),并结合业务常识(女装价格很少超2000元)过滤,最终数据更贴合实际。
  4. 时间格式转换错误

    • 问题:爬取的“更新时间”是“2024-11-01”字符串格式,直接分组会报错;
    • 解决:用pd.to_datetime(df['更新时间'])将字符串转为datetime格式,才能按日期分组计算每日销量。

4.2 给学弟学妹的建议

  1. 先明确分析目标,再选图表类型
    不要为了“炫技”用复杂图表,比如想展示“价格与销量的关系”,柱状图比雷达图更直观;想展示“占比”,饼图比折线图更合适——图表的核心是“传递信息”,不是“好看”。

  2. 数据预处理是关键,别省略
    爬取的原始数据90%都有问题(重复、缺失、异常),如果跳过预处理直接分析,结果会完全失真。比如我一开始没去重,导致同一件商品被计算3次,销量数据虚高30%。

  3. 多结合业务常识解读结果
    分析时别只看数据,要想“为什么100-300元销量高?”——因为双十一消费者更倾向“性价比”,太贵的舍不得买,太便宜的担心质量;“为什么10月31日是高峰?”——因为淘宝预售通常从这一天20:00开始,付定金能减钱。结合业务逻辑,结论才更有说服力。

  4. 保存代码和数据,方便复现
    把爬取、预处理、可视化的代码分文件保存,数据用CSV格式备份,答辩时老师可能会问“这个图表是怎么生成的?”,有代码和原始数据能快速复现,避免“说不清楚”的尴尬。

五、项目资源获取

完整项目包含:

  1. 爬虫代码:淘宝商品爬取脚本(含反爬策略,支持多类目爬取);
  2. 分析代码:数据预处理、5类图表可视化代码(注释清晰,可直接运行);
  3. 原始数据:10万+条双十一淘宝女装/电子产品/家居用品数据(CSV格式);
  4. 答辩PPT:含分析逻辑、图表解读、结论建议,可直接修改使用;
  5. 常见问题手册:解决“反爬IP封禁”“中文乱码”“异常值处理”等高频问题。