数据分析学习总结之实例练习(双十一淘宝美妆)

本次通过对双十一淘宝美妆数据的分析实践,我系统掌握了数据处理与分析的完整流程,从数据初步认知到深度挖掘,再到可视化呈现与结论提炼,收获颇丰。以下是具体的学习总结:

一、数据初步了解:奠定分析基础

在分析初期,我们首先对数据进行了全面 “扫描”。通过df.head()查看前五行数据,直观了解了每条数据包含的 7 个特征:update_time(更新时间)、id(商品 ID)、title(商品标题)、price(价格)、sale_count(销量)、comment_count(评论数)、店名(店铺名称)。

借助df.info()df.shape,明确了数据规模为 27598 条记录,且发现sale_countcomment_count存在缺失值,其他特征无缺失,这为后续的数据清洗指明了方向。而df.describe()则提供了数值型特征的统计量,如价格均值为 362.83 元,销量均值为 12301.77 件等,让我们对数据的分布有了初步判断。

二、数据清洗:保障数据质量

数据清洗是分析的关键环节,直接影响后续结果的准确性,主要完成了以下工作:

  • 重复值处理:使用drop_duplicates删除了 86 条重复数据,得到 27512 条有效数据,并通过reset_index重置行索引,确保数据结构规范。
  • 缺失值处理:观察发现sale_countcomment_count的缺失值可能代表销量或评论数为 0,因此采用fillna(0)用 0 填补缺失值,经检查后确认无空值残留。
  • 新特征挖掘:这是本次分析的亮点之一。首先用jieba对商品标题进行分词,生成subtitle列,为后续分类做准备;然后基于自定义的分类字典,将商品划分为 “护肤品”“化妆品” 等主类别和 “乳液类”“口红类” 等子类别,新增main_typesub_type列;此外,根据标题是否含 “男士”“男生” 等关键词,新增是否男士专用列;最后,通过price * sale_count计算出销售额列,丰富了分析维度。

三、数据分析及可视化:洞察数据规律

借助matplotlibseaborn工具,我们对数据进行了多维度分析与可视化呈现,得出了诸多有价值的结论:

1. 品牌维度分析

  • 商品数量:悦诗风吟的商品数量遥遥领先,但销量和销售额并非顶尖,说明商品数量多并不一定等同于市场表现好。
  • 销量与销售额:相宜本草在销量和销售额上均位居第一,且销量约为第二名的两倍,但销售额远不到两倍,反映出其商品均价较低的特点。
  • 平均单价:将品牌按平均单价分为 A(0-100 元)、B(100-200 元)、C(200-300 元)、D(300 元以上)四类,发现 A 类品牌销售额占比最高,D 类最低,且定价越低的品牌平均销售额越高,印证了 “价格亲民的品牌更易获得高销售额” 的推测。

2. 类别维度分析

  • 大类表现:护肤品的销量和销售额占比远高于化妆品及其他类别,是美妆市场的主力。
  • 小类表现:清洁类和补水类护肤品销量领先,且各类别的销量与销售额占比基本正相关,符合市场常识。
  • 品牌与类别结合:相宜本草在面霜、乳液、补水等多个小类中销量最高,美宝莲在口红、眼部彩妆类表现突出,妮维雅则在清洁类中占据绝对优势。

3. 性别维度分析

  • 男士专用商品占比:男士专用商品的销量和销售额占比均较低,说明美妆市场仍以女性消费者为主。
  • 男士商品类别偏好:男士专用商品中,清洁类和补水类销量占比较高,反映出男性在美妆消费上更注重基础清洁和保湿需求。

四 、代码及图片

import numpy as np
import pandas as pd
import jieba
import matplotlib.pyplot as plt
import seaborn as sns


# 设置中文显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 1. 数据读取与初步了解
df = pd.read_csv('双十一淘宝美妆数据.csv')
print("数据前五行:")
print(df.head())
print("\n数据特征信息:")
print(df.info())
print("\n数据形状:", df.shape)
print("\n数值型特征统计量:")
print(df.describe())

# 2. 数据清洗
# 2.1 重复值处理
data = df.drop_duplicates(inplace=False)
data.reset_index(inplace=True, drop=True)
print("\n去重后数据形状:", data.shape)

# 2.2 缺失值处理
print("\n缺失值填补前情况:")
print(data.loc[data['sale_count'].isnull()].head())
print(data.loc[data['comment_count'].isnull()].tail())
data = data.fillna(0)
print("\n缺失值填补后是否还有空值:")
print(data.isnull().any())

# 2.3 数据挖掘与新特征生成
# 对标题进行分词
subtitle = []
for each in data['title']:
k = jieba.lcut_for_search(each) # 搜索引擎模式分词
subtitle.append(k)
data['subtitle'] = subtitle
print("\n标题分词结果示例:")
print(data[['title', 'subtitle']].head())

# 商品分类(主类别与子类别)
basic_data = """护肤品 乳液类 乳液 美白乳 润肤乳 凝乳 柔肤液 亮肤乳 菁华乳 修护乳
护肤品 眼部护理类 眼霜 眼部 眼膜
护肤品 面膜类 面膜
护肤品 清洁类 洗面 洁面 清洁 卸妆 洁颜 洗颜 去角质 磨砂
护肤品 化妆水 化妆水 爽肤水 柔肤水 补水露 凝露 柔肤液 精粹水 亮肤水 润肤水 保湿水 菁华水 保湿喷雾 舒缓喷雾
护肤品 面霜类 面霜 日霜 晚霜 柔肤霜 滋润霜 保湿霜 凝霜 日间霜 晚间霜 乳霜 修护霜 亮肤霜 底霜 菁华霜
护肤品 精华类 精华液 精华水 精华露 精华素 精华
护肤品 防晒类 防晒
护肤品 补水类 补水
化妆品 口红类 唇釉 口红 唇彩 唇膏
化妆品 底妆类 散粉 蜜粉 粉底液 定妆粉 气垫 粉饼 BB CC 遮瑕 粉霜 粉底膏 粉底霜
化妆品 眼部彩妆 眉粉 染眉膏 眼线 眼影 睫毛膏 眉笔
化妆品 修容类 鼻影 修容粉 高光 腮红"""

# 构建分类字典
dcatg = {}
catg = basic_data.split('\n')
for i in catg:
parts = i.strip().split('\t')
if len(parts) >= 3:
main_cat = parts[0]
sub_cat = parts[1]
keywords = parts[2:]
for j in keywords:
if j: # 跳过空字符串
dcatg[j] = (main_cat, sub_cat)

# 生成主类别和子类别特征
sub_type = []
main_type = []
for i in range(len(data)):
exist = False
for j in data['subtitle'][i]:
if j in dcatg:
sub_type.append(dcatg[j][1])
main_type.append(dcatg[j][0])
exist = True
break
if not exist:
sub_type.append('其他')
main_type.append('其他')
data['sub_type'] = sub_type
data['main_type'] = main_type
print("\n分类为'其他'的商品数量:", data.loc[data['sub_type'] == '其他'].shape[0])

# 生成"是否男士专用"特征
sex = []
for i in range(len(data)):
subtitle = data['subtitle'][i]
if '男士' in subtitle or '男生' in subtitle:
sex.append('是')
elif '男' in subtitle and '女' not in subtitle and '斩男' not in subtitle:
sex.append('是')
else:
sex.append('否')
data['是否男士专用'] = sex
print("\n男士专用商品数量统计:")
print(data['是否男士专用'].value_counts())

# 生成"销售额"特征
data['销售额'] = data['price'] * data['sale_count']
print("\n添加销售额后的数据示例:")
print(data.head())

# 3. 数据分析及可视化
# 3.1 各店铺基本情况分析
plt.figure(figsize=(12, 10))

# 各店铺商品数量
plt.subplot(2, 2, 1)
plt.tick_params(labelsize=15)
data['店名'].value_counts().sort_values().plot.bar()
plt.title('各品牌商品数', fontsize=20)
plt.ylabel('商品数量', fontsize=15)
plt.xlabel('店名')

# 各店铺总销量
plt.subplot(2, 2, 2)
plt.tick_params(labelsize=15)
data.groupby('店名')['sale_count'].sum().sort_values().plot.bar()
plt.title('各品牌所有商品的销量', fontsize=20)
plt.ylabel('商品总销量', fontsize=15)

# 各店铺总销售额
plt.subplot(2, 2, 3)
plt.tick_params(labelsize=15)
data.groupby('店名')['销售额'].sum().sort_values().plot.bar()
plt.title('各品牌总销售额', fontsize=20)
plt.ylabel('商品总销售额', fontsize=15)

# 各品牌平均每单单价
plt.subplot(2, 2, 4)
plt.tick_params(labelsize=15)
avg_price = data.groupby('店名')['销售额'].sum() / data.groupby('店名')['sale_count'].sum().replace(0, np.nan)
avg_price.sort_values().plot.bar()
plt.title('各品牌平均每单单价', fontsize=20)
plt.ylabel('售出商品的平均单价', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 3.2 不同价格区间品牌的销售情况
A = avg_price[(avg_price <= 100) & (avg_price > 0)].index
B = avg_price[(avg_price <= 200) & (avg_price > 100)].index
C = avg_price[(avg_price <= 300) & (avg_price > 200)].index
D = avg_price[avg_price > 300].index

sum_sale = data.groupby('店名')['销售额'].sum()

plt.figure(figsize=(16, 8))

# 各类别品牌销售额占比
plt.subplot(1, 2, 1)
sum_sale_byprice = pd.concat([sum_sale[A].sort_values(),
sum_sale[B].sort_values(),
sum_sale[C].sort_values(),
sum_sale[D].sort_values()])
colors = ['grey'] * len(A) + ['g'] * len(B) + ['y'] * len(C) + ['m'] * len(D)
plt.pie(x=sum_sale_byprice, labels=sum_sale_byprice.index, colors=colors,
autopct='%0f%%', pctdistance=0.9)
plt.title('不同均价区间品牌的销售额占比')

# 各类别平均每个店销售额
plt.subplot(1, 2, 2)
plt.tick_params(labelsize=15)
plt.bar('均价0-100元', np.mean(sum_sale[A]) if not A.empty else 0, color='grey')
plt.bar('均价100-200元', np.mean(sum_sale[B]) if not B.empty else 0, color='g')
plt.bar('均价200-300元', np.mean(sum_sale[C]) if not C.empty else 0, color='y')
plt.bar('均价300元以上', np.mean(sum_sale[D]) if not D.empty else 0, color='m')
plt.title('不同类别的平均每个店销售额', fontsize=20)
plt.ylabel('平均销售额', fontsize=20)

plt.tight_layout()
plt.show(block=True)

# 3.3 各类别销售情况分析
plt.figure(figsize=(12, 12))

# 大类销售量占比
plt.subplot(2, 2, 1)
data.groupby('main_type')['sale_count'].sum().plot.pie(autopct='%0f%%', title='各大类销售量占比')

# 大类销售额占比
plt.subplot(2, 2, 2)
data.groupby('main_type')['销售额'].sum().plot.pie(autopct='%0f%%', title='各大类销售额占比')

# 小类销售量占比
plt.subplot(2, 2, 3)
data.groupby('sub_type')['sale_count'].sum().plot.pie(autopct='%0f%%', title='各小类销售量占比')

# 小类销售额占比
plt.subplot(2, 2, 4)
data.groupby('sub_type')['销售额'].sum().plot.pie(autopct='%0f%%', title='各小类销售额占比')

plt.tight_layout()
plt.show(block=True)

# 3.4 各店铺不同类别销售情况(去除销量为0的店铺)
data1 = data.drop(index=data[data['店名'].isin(
data.groupby('店名')['sale_count'].sum()[data.groupby('店名')['sale_count'].sum() == 0].index
)].index)

# 各店铺中各大类的销量与销售额
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='sale_count', hue='main_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店铺中各大类的销售量', fontsize=20)
plt.ylabel('销量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='销售额', hue='main_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店铺中各大类的销售额', fontsize=20)


plt.tight_layout()
plt.show(block=True)

# 各店铺中各小类的销量与销售额
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='sale_count', hue='sub_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店铺中各小类的销售量', fontsize=20)
plt.ylabel('销量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='店名', y='销售额', hue='sub_type', estimator=np.sum, data=data1, ci=0)
plt.title('各店铺中各小类的销售额', fontsize=20)
plt.ylabel('销售额', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 各小类中各店铺的销量与销售额
plt.figure(figsize=(16, 12))

plt.subplot(2, 1, 1)
plt.tick_params(labelsize=10)
sns.barplot(x='sub_type', y='sale_count', hue='店名', estimator=np.sum, data=data1, ci=0)
plt.title('各小类中各店铺的销售量', fontsize=20)
plt.ylabel('销量', fontsize=15)

plt.subplot(2, 1, 2)
plt.tick_params(labelsize=10)
sns.barplot(x='sub_type', y='销售额', hue='店名', estimator=np.sum, data=data1, ci=0)
plt.title('各小类中各店铺的销售额', fontsize=20)
plt.ylabel('销售额', fontsize=15)

plt.tight_layout()
plt.show(block=True)

# 3.5 性别因素对销售的影响
plt.figure(figsize=(16, 16))

# 男士专用各小类销售量占比
plt.subplot(2, 2, 1)
data.loc[data['是否男士专用'] == '是'].groupby('sub_type')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='男士各小类销售量占比', pctdistance=0.8)

# 非男士专用各小类销售量占比
plt.subplot(2, 2, 2)
data.loc[data['是否男士专用'] == '否'].groupby('sub_type')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='非男士专用各小类销售量占比', pctdistance=0.8)

# 男士专用销售量占总销售量比例
plt.subplot(2, 2, 3)
data.groupby('是否男士专用')['sale_count'].sum().plot.pie(
autopct='%0f%%', title='男士专用销售量占比', pctdistance=0.8)

# 男士专用销售额占总销售额比例
plt.subplot(2, 2, 4)
data.groupby('是否男士专用')['销售额'].sum().plot.pie(
autopct='%0f%%', title='男士专用销售额占比', pctdistance=0.8)

plt.tight_layout()
plt.show(block=True)

五、学习收获与反思

通过本次实践,我不仅熟练掌握了pandas的数据处理方法(如去重、填补缺失值、新增特征等)和matplotlibseaborn的可视化技巧,更重要的是学会了从数据中挖掘有价值的信息,形成分析思路。

同时也认识到,数据分析需要结合业务场景进行合理推测,例如对缺失值的处理逻辑、商品类别的划分标准等,都需要基于对美妆行业的基本认知。此外,可视化图表的选择应服务于分析目的,清晰、直观地呈现结论是关键。

未来,在数据分析中可进一步引入更多维度(如时间对销量的影响、评论情感分析等),使分析更加全面深入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918479.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何评估一个需求的业务价值

要科学、全面地评估一个需求的业务价值&#xff0c;核心在于建立一个多维度的、从战略到财务、从客户到风险的“价值罗盘”&#xff0c;并运用这套罗盘&#xff0c;对需求进行系统性的、数据驱动的量化与定性分析。一套成熟的价值评估体系&#xff0c;其构建必须涵盖五大关键视…

day38_2025-08-12

一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分&#xff0c;也是默认你有之前复试班计算机视觉相关的知识&#xff0c;但是一些基础的概念我仍然会提。 昨天我们介绍了minist这个经典的手写数据集&#xff0c;作为图像数据&#xff0c;相较于结构…

Kubernetes1.28-单Master集群部署

一、 服务器环境及初始化 1、架构分析 集群角色主机名操作系统IP地址masterk8s-masterOpenEuler24.03192.168.166.128nodek8s-node1OpenEuler24.03192.168.166.129nodek8s-node2OpenEuler24.03192.168.166.130 2、初始化 所有节点都需要初始化&#xff01; 2.1、清空Iptal…

使用pyqt5实现可勾选的测试用例界面

目录 界面 代码 python有哪些自动化测试的库和html的报告的库可以和这个软件结合使用的 **一、自动化测试核心库** **二、HTML报告生成库** **三、其他实用工具** **与您的工具结合建议** 参考 界面 代码 import sys import time import random from PyQt5.QtWidgets import (…

C语言变量的声明和定义有什么区别?

定义&#xff1a;定义&#xff1a;为变量分配地址和存储空间声明&#xff1a;不分配地址和存储空间一个变量可以在多个地方声明&#xff0c;但是只在一个地方定义。加入extern修饰的是变量的声明&#xff0c;说明此变量将在文件或在文件后面部分定义。1.变量声明作用&#xff1…

imx6ull-驱动开发篇20——linux互斥体实验

目录 实验程序编写 修改设备树文件 LED 驱动修改 mutex.c 测试mutexApp.c Makefile 文件 运行测试 在之前的文章里&#xff0c;我们学习了&#xff1a;驱动开发篇16——信号量与互斥体。 本讲实验里&#xff0c;我们来使用互斥体mutex实现 LED 灯互斥访问的功能&#x…

[4.2-2] NCCL新版本的register如何实现的?

文章目录1->2->31. ncclRegisterP2pIpcBuffer2. ncclIpcLocalRegisterBuffer(..., 1, 0,...)3. ipcRegisterBuffer(..., regRecord,..., isLegacyIpc)4. p2pProxyRegister()1->2->3 1. ncclRegisterP2pIpcBuffer 在enqueue.cc内的调用是&#xff1a; NCCLCHECK(…

在idea中git切换分支,但是我的文件没add,没commit

这是一个很悲伤的故事&#xff0c;我朋友一个下午写了4个小时的代码&#xff0c;差不多10多个类&#xff0c;都在切换分支的时候。IDEA发现有冲突&#xff0c;然后就要resolve conflict&#xff0c;发现自己不知道怎么操作&#xff0c;就点了abort & rollback。然后所有代码…

GPFS api

一、核心命令行 API&#xff08;mm 命令集&#xff09; GPFS 最基础且常用的接口是命令行工具集&#xff08;以mm为前缀&#xff09;&#xff0c;用于文件系统的创建、配置、管理和监控。这些命令可直接在终端执行&#xff0c;也可通过脚本&#xff08;如 Shell、Python&#…

虚拟机一站式部署Claude Code 可视化UI界面

前言 最近&#xff0c;强大的 AI 编码助手 Claude Code 在开发者社区中迅速走红&#xff0c;凭借其出色的代码生成和理解能力赢得了广泛赞誉。然而&#xff0c;其纯粹基于命令行的交互方式&#xff0c;对于许多习惯了图形化界面的开发者&#xff0c;尤其是新手而言&#xff0c…

网站IP被劫持?三步自建防护盾

一、劫持检测实战&#xff08;Python脚本&#xff09; import requests import socket import ssldef check_hijacking(domain):try:# 获取真实DNS解析real_ip socket.gethostbyname(domain)# 本地发起请求验证response requests.get(f"https://{domain}", timeout…

SQL Server从入门到项目实践(超值版)读书笔记 23

第三篇 核心应用篇在本章中&#xff0c;将通过案例示范学习SQL Server数据库的一些核心应用。例如&#xff0c;SQL Server视图的使用、游标的应用、存储过程的应用、索引的应用、触发器的应用、SQL Server事务与锁的应用等。学完本篇&#xff0c;读者将对SQL Server数据库的管理…

功能测试中常见的面试题-一

一、基础概念与理论题什么是软件测试&#xff1f;它的目的是什么&#xff1f;回答&#xff1a; 软件测试是通过人工或自动化手段&#xff0c;运行或评估软件系统&#xff0c;以验证它是否满足规定的需求、识别实际结果与预期结果之间的差异&#xff0c;并评估软件产品质量的过程…

LINUX88 变量:命令定义;普通数组定义(复);declare -i /-x

问题 [codesamba ~]$ array3(ls axel-2.4) [codesamba ~]$ echo $array3 API [codesamba ~]$ ls axel-2.4 API CHANGES conn.o gui README tcp.o axel conf.c COPYING http.c ru.mo text.c axel.1 …

数字IC后端PPA优化| Timing一致性调整方法和Module Region规划方法

Q1:直播课经常讲到一致性&#xff0c;这个一致性的话一般是指place&#xff0c;CTS和PT的derating time&#xff0c;uncertainty和transition吗&#xff0c;我大概知道innovus的uncertainty设置要比PT里面高一点&#xff0c;但具体设计时这几部分的大小应该是一个什么样的关系或…

电子电气架构 --- 软件定义汽车的驱动和挑战

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

机器学习——10 支持向量机SVM

1 支持向量机 1.1 故事引入看下图左边&#xff0c;蓝色和红色的点混在一起&#xff0c;这就像一堆数据&#xff0c;没办法用一条简单的直线把它们分开。再看下图右边&#xff0c;有一条直线把蓝色和红色的点分开&#xff0c;这就是SVM在找的“决策边界”&#xff0c;它能把不同…

若以微服务部署踩坑点

windows docker desktop 部署nacos mysql1、docker部署nacosdocker pull nacos/nacos-server:v2.4.3docker启动命令 docker run --name nacos -d -p 8848:8848 -p 9848:9848 -p 9849:9849 --privilegedtrue --network bridge -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMm…

Lua基础+Lua数据类型

Lua基础 Lua介绍 特点&#xff1a;轻量、小巧。C语言开发。开源。 设计的目的&#xff1a;嵌入到应用程序当中&#xff0c;提供灵活的扩展和定制化的功能。 luanginx&#xff0c;luaredis。 环境安装 windows上安装lua&#xff1a; 检查机器上是否有lua C:\Users\cpf>lua lu…

基于VuePress2开发文档自部署及嵌入VUE项目

最近在搞前端开发帮助文档&#xff0c;转了一圈发现Vue提供了一个高性能的、Vue驱动的静态网站生成框架-VuePress。VuePress 是一个以 Markdown 为中心的静态网站生成器。你可以使用 Markdown 来书写内容&#xff08;如文档、博客等&#xff09;&#xff0c;然后 VuePress 会生…