项目简述
马云说:“未来最值钱的不是房子,也不是石油,而是数据”。阿里旗下的某宝,作为一个最大的电商平台,其数据蕴含了巨大的价值,而不断发展的美妆行业,使得口红占当代年轻人的消费比重愈来愈高,因此,对某宝的口红数据进行采集和分析具有一定的实用价值。此项目包含数据分析的全步骤,供更多人参考、学习和交流。
一、获取数据
【步骤】使用python爬虫对某宝“唇彩”、“口红”、“唇釉”三种分类产品前100页的数据进行采集,由于某宝的反爬非常强,因此需要使用selenium自动化测试工具进行爬取【某宝的滑块反爬不能破解,如果被某宝反爬只能换淘宝账号或者稍等一段时间后重新爬取】
【备注:此次一共爬取了13187条数据,但是都是在2020-4-20这一天的数据,因此以下的分析并不包含时间序列】
二、合并数据
【步骤】由于数据分析需要分行执行代码,因此数据分析部分使用jupyter notebook而不使用pycharm。首先在jupyter notebook导入pandas库和numpy库,使用pd.read_csv方法读取爬取的数据,然后使用pd.concat方法对数据进行合并,代码如下:
import numpy as np
import pandas as pd
'''导入口红数据'''
df_lipstick = pd.read_csv(r"D:\spider_project\淘宝爬虫\口红_data.csv",sep="|",names=["pro_name","price","pay_num","store","location","date"]
'''导入唇釉部分数据'''
df_lipglaze = pd.read_csv(r"D:\spider_project\淘宝爬虫\唇釉_data.csv",sep="|",names=["pro_name","price","pay_num","store","location","date"])
df_lipglaze.head()
'''导入唇彩部分数据'''
df_lipgloss = pd.read_csv(r"D:\spider_project\淘宝爬虫\唇彩_data.csv",sep="|",names=["pro_name","price","pay_num","store","location","date"])
df_lipgloss.head()
'''合并三份数据,并赋值给df'''
df = pd.concat([df_lipstick,df_lipgloss,df_lipglaze])
df = df.reset_index(drop=True)
三、清洗数据
1.删除重复值
【步骤】由于某宝关键字搜索出的商品信息会有重叠部分,因此需要先删除商品中出现的重复值。使用drop_duplicates()方法来删除重复值,删除后只剩下10964条有效数据。
'''删除重复值'''
df = df.drop_duplicates()
2.填充缺失值
【步骤】在爬虫爬取的csv文件下,可以看到,某些商品的价格、付款人数存在缺失值,由于缺失值和任何值计算的值都为缺失值,因此我们需要对这部分缺失值进行处理,以免影响后续计算结果。使用fillna()方法将缺失值填充为0。
df["pay_num"].fillna(0,inplace = True) #填充付款人数缺失值
df["price"].fillna(0,inplace = True) #填充价格缺失值
3.处理肮脏数据
【步骤】从某宝爬取的付款人数数据并不是int或者float类型的数据,存在“万+人付款”这个无效字段,这个无效字段会影响我们后续的分析计算,因此需要去除这个无效字段;同时,地点列的省份和城市数据都合在了一个字段里,不利于后续的地域可视化分析,因此我们需要将地点列进行分列处理。
'''处理pay_num的数据,方便计算'''
pay_num_list = []
for each in data:
each = each.replace("人付款","").replace("+","")
if "万" in each:
each = each.replace("万","")
each = float(each)*10000
else:
each = float(each)
pay_num_list.append(each)
df["pay_num1"] = pay_num_list
df = df[["pro_name","price","pay_num1","store","city","province","date"]]
df = df.reset_index(drop=True)
'''定义用于分割location的函数 将location分为省和城市'''
def split_location(data):
province = []
city =[]
for each in data:
split_info = each.split(" ")
if len(split_info) ==1:
province.append(split_info[0])
city.append(" ")
else:
province.append(split_info[0])
city.append(split_info[1])
return province,city
province ,city = split_location(df["location"])
df["province"] = province
df["city"] = city
df.drop(["location",],axis="columns",inplace=True)
df = df[["pro_name","price","pay_num","store","city","province","date"]]
四、数据分析 -- 看整体
简述
【看整体】的分析思路是指,先不对口红各档次进行具体分类分析,先从整体的角度对整个口红的市场进行分析并可视化,包括
- 不同价格区间内商品的数量分布分析
- 付款人数和价格的相关性分析
- 筛选出付款人数较多的品牌
- 热词分析
- 地区分析 -- 销量地图
【预处理】 增加销售额列
【步骤】某宝的付款人数计算存在一定的规则,可能会引起误差,但是由于全部数据都是采用相同的付款人数计算方法,因此,可忽略付款人数计算方法带来的误差影响。使用 付款人数*价格来计算销售额,并增加sales列。
df["sales"] = df["price"]*df["pay_num1"]
1. 价格分布分析 -- 不同价格区间内商品的数量分布
【步骤】计算各价格区间的商品数量,并使用pyecharts生成柱形图进行可视化分析
from pyecharts.charts import Bar
from pyecharts import options as opts
'''计算各价格区间商品数量'''
df["group_price1"] = pd.cut(df["price"],bins=[0,200,300,400,500,1000000])
df_count = df.groupby(by="group_price1")[["pro_name"]].count()
'''绘制柱形图'''
list_labels = ["(0, 200]","(200, 300]","(300, 400]","(400, 500]",">500"]
c = (
Bar()
.add_xaxis(list_labels)
.add_yaxis("",df_count["pro_name"].values.tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="各价格区间商品分布图",subtitle=""),
)
.render_notebook()
)
c
【结论】根据上述价格区间分类,我们将(0,200]价格区间划分为大众口红产品;(200-300]价格区间的口红划分为二线口红产品;(300-400]价格区间划分为一线口红产品;(400-500]划分为超一线口红产品;>500价格区间划分为顶级口红产品。
可以看出,大部分产品价格都低于200,随着价格上升,商品数量快速下降【需要注意,>500的产品里包含了口红套装产品,即口红产品档次并不属于顶级产品,只是其他档次产品打包销售,所以价格>500】
2. 付款人数和价格的相关性分析
【步骤】此分析主要考察付款人数的变化是否跟价格的变化相关,这里通过绘制散点图和计算相关系数来查看是否相关【pandas可以使用corr()方法快速计算相关系数】。代码如下:
'''绘制散点图,观察付款人数和价格的相关性'''
c=(
Scatter(init_opts=opts.InitOpts(width="1000px", height="500px"))
.add_xaxis(xaxis_data=df[(df["price"]<1000)&(df["pay_num1"]<10000)]["pay_num1"])
.add_yaxis(
series_name="",
y_axis=df[df["price"]<2000]["price"],
symbol_size=1,
label_opts=opts.LabelOpts(is_show=True),
)
.set_series_opts()
.set_global_opts(
xaxis_opts=opts.AxisOpts(
type_="value", splitline_opts=opts.SplitLineOpts(is_show=True)
),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
),
tooltip_opts=opts.TooltipOpts(is_show=False),
)
.render_notebook()
)
c
'''根据散点图,设置对应参数并计算对应相关系数计算函数'''
data = pd.DataFrame({"X":df[(df["price"]<2000)&(df["pay_num1"]<10000)]["pay_num1"],
"Y":df[(df["price"]<2000)&(df["pay_num1"]<10000)]["price"]})
data.corr() #计算出的结果为-0.028434
【结论】根据散点图和相关系数的计算结果(-0.028434)可以看出,付款人数和价格并不相关,这说明消费者更注重产品本身,而不是产品价格。
3.筛选付款人数较多的品牌
【步骤】假定需要筛选出付款人数>10,000的品牌,通过布尔索引可以快速筛选符合数据,并通过绘制散点图观察该档次分布、商品数量和品牌具体名称。
'''查看付款人数大于某给定值的品牌'''
df1 = df[df["pay_num1"]>10000] #假定为10000
df1.sort_values(["pay_num1","price"],inplace=True,ascending=False)
# print(len(df1)) # 42
df1.reset_index(drop = True)
'''绘制散点图'''
c = (
Scatter()
.add_xaxis(df1["pay_num1"])
.add_yaxis(
"",
[list(z) for z in zip(df1["price"],df1["store"] )],
label_opts=opts.LabelOpts(
formatter=JsCode(
"function(params){return params.value[1]}"
)
),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="Price-pay_num"),
tooltip_opts=opts.TooltipOpts(
formatter=JsCode(
"function (params) {return params.name + ' : ' + params.value[2];}"
)
),
visualmap_opts=opts.VisualMapOpts(
type_="color", max_=150, min_=70, dimension=1
),
)
.render_notebook()
)
c
【结论】通过散点图可以看出,销量较高的口红档次为大众品牌口红 > 部分一线品牌口红 > 二线品牌口红;大众品牌口红品牌有perfectdiary;colorkey;mac;花西子等品牌;二线品牌口红主要有兰蔻、tomford等品牌;一线品牌口红主要有ysl;阿玛尼等品牌。
4. 热词分析
热词分析主要是对商品名进行分析,通过词云图提取高销量的产品的热词信息,并对该热词贡献的销售额进行排序,考察目前哪些热词是消费者最关注且贡献最高销量。
【步骤】首先需要使用jieba库对商品名进行分词,然后通过wordcloud库生成词云图
【结论】从词云图可以看出,词频较高的热词为[中国,定制,毒液,平价,滋润,显白,不易掉色,预售,大牌,丝绒,雾面,哑光,补水,空气,唇蜜,品牌,保湿,持久,血色,血浆,南瓜,红棕色,豆沙,变色,小辣椒,新色,奶茶,番茄,红色],下一步,便是对关键词所贡献的销售额进行分析;方法是先计算热词所贡献的销售额,然后使用横向条形图进行可视化分析。
from pyecharts.charts import Bar
from pyecharts import options as opts
df_text = ["中国","定制","毒液","平价","滋润","显白","不易掉色","预售","大牌","丝绒","雾面","哑光","补水","空气","唇蜜","品牌","保湿","持久","血色","血浆","南瓜","红棕色","豆沙","变色","小辣椒","新色","奶茶",
"番茄","红色","金色","橙红","小辣椒","胡萝卜","枣泥","柿红"]
'''绘制 关键词-销售额横向条形图'''
bar = Bar({"width": "620px", "height": "500px"}) #调整bar的长款,显示全部数据
bar.add_xaxis(df_wordSales_num["words"][-15:].values.tolist())
bar.add_yaxis("",df_wordSales_num["words_saleNum"][-15:].values.tolist())
bar.reversal_axis()
#设置数据标签位置
bar.set_series_opts(label_opts = opts.LabelOpts(position="right"))
# 设置全局配置项
bar.set_global_opts(
title_opts=opts.TitleOpts(title="关键词-销量图"),
)
bar.render_notebook()
【结论】通过热词-销量图分析可得:
贡献最多销售额的商品特质为:1.哑光 2.丝绒 3.滋润 4. 持久 5.保湿 6.唇蜜 7.雾面 8.大牌
贡献最多销售额的颜色为: 1.番茄 2.豆沙 3. 奶茶 4.新色 5.变色
即如果要打造一款短时间内创造销售额的爆品,可以在考虑在此部分热词上进行构思。
5. 地区分析
【步骤】对各省份的商家店铺数量进行统计,并根据不同的省进行分类和可视化,观察商家在国内的地区分布情况
from pyecharts import options as opts
from pyecharts.charts import Map
df_countStore = df.groupby(by="province")[["sales"]].count()
df_countStore = df_countStore.reset_index()
list_foreignCountry = ["加拿大","德国","意大利","新西兰","日本","法国","波兰","泰国","澳大利亚","美国","英国","荷兰","韩国"]
countries = []
for i in df_countStore["province"]:
if i not in list_foreignCountry:
countries.append("中国")
else:
countries.append(i)
df_countStore["countries"] = countries
df_countStore.head()
'''可视化'''
c = (
Map()
.add("", [list(z) for z in zip(df_countStore["province"], df_countStore["store"])], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="店铺数量中国地区分布"),
visualmap_opts=opts.VisualMapOpts(max_=200),
)
)
c.render_notebook()
【使用相同的思路和方法,可以绘制出国内外、各个省份的店铺数量地区分布情况;此处仅以广东省各市分布为额外案例】
【结论】可以看出,国内的店铺主要分布于沿海地区,内陆地区分布于四川较多;而广东省内主要分布于广州市、深圳市这两个一线城市,即广东省内,口红电商较发达的市为广州和深圳。
看整体的分析思路主要用于对所有数据情况有个大概的了解,而对产品的分析则需要从看重点入手,看重点的思路参考【2020python数据分析项目:爬取某宝口红数据&数据分析可视化(二)】
作者:爱学习,也爱女票的于饼喵