2020python数据分析项目:爬取某宝口红数据&数据分析可视化(一)

项目简述

马云说:“未来最值钱的不是房子,也不是石油,而是数据”。阿里旗下的某宝,作为一个最大的电商平台,其数据蕴含了巨大的价值,而不断发展的美妆行业,使得口红占当代年轻人的消费比重愈来愈高,因此,对某宝的口红数据进行采集和分析具有一定的实用价值。此项目包含数据分析的全步骤,供更多人参考、学习和交流。

一、获取数据

【步骤】使用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"]]
肮脏数据处理完成效果图

四、数据分析 -- 看整体

简述

【看整体】的分析思路是指,先不对口红各档次进行具体分类分析,先从整体的角度对整个口红的市场进行分析并可视化,包括

  1. 不同价格区间内商品的数量分布分析
  2. 付款人数和价格的相关性分析
  3. 筛选出付款人数较多的品牌
  4. 热词分析
  5. 地区分析 -- 销量地图

【预处理】 增加销售额列

【步骤】某宝的付款人数计算存在一定的规则,可能会引起误差,但是由于全部数据都是采用相同的付款人数计算方法,因此,可忽略付款人数计算方法带来的误差影响。使用 付款人数*价格来计算销售额,并增加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()

店铺数量国内分布

【使用相同的思路和方法,可以绘制出国内外、各个省份的店铺数量地区分布情况;此处仅以广东省各市分布为额外案例】
店铺广东省内分布.png

【结论】可以看出,国内的店铺主要分布于沿海地区,内陆地区分布于四川较多;而广东省内主要分布于广州市、深圳市这两个一线城市,即广东省内,口红电商较发达的市为广州和深圳。

看整体的分析思路主要用于对所有数据情况有个大概的了解,而对产品的分析则需要从看重点入手,看重点的思路参考【2020python数据分析项目:爬取某宝口红数据&数据分析可视化(二)】


作者:爱学习,也爱女票的于饼喵

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342