刚过去的520,大家都在送什么礼物,Python用可视化图告诉你

本秂侑毒 提交于 2020-08-17 12:53:22

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

一年一度的520刚刚过去。

由于受疫情影响错过了今年的2月14日情人节,2020年5月20日,这个谐音为“爱你爱你我爱你”的 “世纪520”,对情侣们来说显得格外有吸引力。

网上都是婚礼、告白、结婚等甜蜜新闻,微博排行榜上的蜜都要溢出屏幕了,520简直就是大型“撒狗粮”节日。
在这里插入图片描述

其中,最大的狗粮来自民政局!全国各地的民政局都爆满了!

在这里插入图片描述

想在这天领证的新人们把民政局围得水泄不通,有人甚至凌晨4点就前往排队。

在这里插入图片描述

在这里插入图片描述

一、“世纪520”送礼物 ,大家都在买什么?

除了领证的,对于情侣们来说,关于520要怎么度过,改送什么礼物给心爱的ta也是关注度非常高的话题。

首先,看到知乎上关于“520送什么的话题”,我们经过分析整理发现:

知乎数据

给女朋友送什么

关于给女朋友的礼物,广大网友都提到了口红、香水、项链、手表、还有玫瑰巧克力等礼物;

给男朋友送什么

送男朋友方面,剃须刀、键盘、鼠标、游戏机等也频频被提到。

淘宝数据

那么事实究竟是怎样的呢?接下来让我们看到淘宝天猫的数据,真正做到用数据来说话。

我们搜集整理了淘宝网关于520礼物的100页商品数据,使用Python进行整理分析,经过预处理之后,一共得到3854条数据。

520大家都在买什么礼物?

在这里插入图片描述

我们在淘宝搜索520礼物,对得到的数据进行分析整理,从中发现:

永生花、玫瑰花占了很大的比重,可以看到节日送花还是广大男性的统一选择;
除此之外可以发现,施华洛世奇、潘多拉等首饰也是不错的选择;
同时还有音乐盒、巧克力等礼物。

520礼物哪些店铺销量最好?
在这里插入图片描述
那么作为520的礼物,哪些店铺销量最好呢?

分析发现,彩妆品牌果然是妥妥的王者。

Mac名列第一,果然是小姐姐们人手一支的口红,没毛病。其次阿玛尼、ysl、Tomford、纪梵希全都榜上有名。有意思的是第二名的店铺是一家主营创意礼物的店kufire,当中从创意灯、按摩枕等礼物还不少。这也可能跟这家店搜索时页面比较靠前有关吧。

520哪些省份的人最喜欢买买买

在这里插入图片描述

那么520期间哪些省份的人最喜欢买买买呢?数据整理发现,广东人民拔得头筹,其次浙江、上海位列二三。

520商品价格都是多少钱

在这里插入图片描述

那么520期间商品的价格都是怎么分布的呢?从图中可以看到50元以下的并不多,50-200元内的商品最多。

什么价位的商品销量最好

在这里插入图片描述

看完了520商品的价格区间,再看看什么价位的商品销量最好。分析可以发现,200元以内的商品最受人青睐。其中0-50元销量占比达到19.21%,50-100占比20.13%。100-150和150-200的占比也不错,分别为15.88%到17.12%。

最后再看到520大家最喜欢买什么。我们分析整理了520商品的标题,得出词云发现,主要可以分为这几类;

送女生

  • 永生花、玫瑰花是广大男同胞的首要选择;
  • 彩妆、化妆品占了很大的比重,比如阿玛尼粉底液、纪梵希等等
  • 首饰、项链也是很多人的选择;

送男生

打火机、手表、电动牙刷是许多人会选择购买的商品。

看来送什么礼物这方面跟知乎得出的结论类似,从中我们也发现到在520情人节,主要男生给女生买礼物占比较大,当然也不排除许多小姐姐们趁着520淘宝活动给自己买买买的。

二、Python教你分析,淘宝520商品数据

我们搜集整理了淘宝网关于520礼物的100页商品数据,使用Python进行整理分析。整个数据分析的过程分为以下三步:

  • 数据获取
  • 数据预处理
  • 数据可视化

部分关键代码如下:

1. 数据获取

此部分代码之前文章已经放过,此处暂不做赘述,爬取出来的数据以数据框的形式存储,结果如下图所示。

df.head()

 

在这里插入图片描述
查看一下数据框的大小,可以看到一共有4404个样本。

df.info() 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4404 entries, 0 to 4403
Data columns (total 5 columns):
goods_name      4404 non-null object
shop_name       4404 non-null object
price           4404 non-null float64
purchase_num    4404 non-null object
location        4404 non-null object
dtypes: float64(1), object(4)
memory usage: 172.1+ KB

 

2. 数据预处理
此处我们对数据进行以下的处理以方便后续的数据分析和可视化工作:

  • 删除重复值
  • purchase_num字段:删除购买人数为空的记录
  • purchase_num字段:提取数值型数据
  • 计算销售额 = price*purchase_num
  • location字段:提取省份数据
  • goods_name字段:分词,提取关键词
# 导入所需包
import numpy as np 
import pandas as pd 
import time 
import re 
import jieba
import jieba.analyse
from collections import Counter
from pyecharts.charts import Bar, Map, Pie, TreeMap, WordCloud, Page
from pyecharts import options as opts 
from pyecharts.globals import SymbolType

# 读入数据
df = pd.read_excel('../data/520礼物天猫数据.xlsx') 

# 去除重复值
df.drop_duplicates(inplace=True)

# 删除购买人数为空的记录
df = df[df['purchase_num'].str.contains('人付款')]

# 购买人数
df['purchase_num'] = df['purchase_num'].str.extract('(\d+)').astype('float')
# 销售额
df['sales_volume'] = df['price'] * df['purchase_num']

# 省份处理
df['province_name'] = df.location.str[:2]

 

经过预处理之后,数据一共有3854条,如下所示:

df.head()

 

在这里插入图片描述

3. 数据可视化
数据可视化部分我们主要对以下几个方面信息进行分析:

520大家都买什么礼物Top10
在这里插入图片描述

data = [
    {"value": 593, "name": "永生花"},
    {"value": 340, "name": "玫瑰花"},
    {"value": 221, "name": "施华洛"},
    {"value": 114, "name": "巧克力"},
    {"value": 66, "name": "银项链"},
    {"value": 65, "name": "四叶草"},
    {"value": 65, "name": "音乐盒"},
    {"value": 65, "name": "潘多拉"},
    {"value": 59, "name": "满天星"},
    {"value": 49, "name": "康乃馨"}
] 

# 树形图
tree = TreeMap(init_opts=opts.InitOpts(width="1280px", height="720px"))
tree.add(series_name='', data=data, label_opts=opts.LabelOpts(position='inside'))
tree.set_global_opts(title_opts=opts.TitleOpts(title='520大家都买什么礼物top10'), 
                     legend_opts=opts.LegendOpts(is_show=False))
tree.render() 

 

520礼物商品销量Top10店铺
在这里插入图片描述

代码实现:

# 计算top10店铺
shop_top10 = df.groupby('shop_name')['purchase_num'].sum().sort_values(ascending=False).head(10) # 绘制柱形图 bar1 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) bar1.add_xaxis(shop_top10.index.tolist()) bar1.add_yaxis('', shop_top10.values.tolist()) bar1.set_global_opts(title_opts=opts.TitleOpts(title='520礼物商品销量Top10店铺'), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)), visualmap_opts=opts.VisualMapOpts(max_=shop_top10.values.max())) bar1.render() 

520礼物商品销量省份排名Top10

在这里插入图片描述

代码实现:

# 计算销量top10
province_top10 = df.groupby('province_name')['purchase_num'].sum().sort_values(ascending=False).head(10)

# 条形图
bar2 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) 
bar2.add_xaxis(province_top10.index.tolist())
bar2.add_yaxis('', province_top10.values.tolist()) 
bar2.set_global_opts(title_opts=opts.TitleOpts(title='520礼物商品销量省份排名Top10'),
                     visualmap_opts=opts.VisualMapOpts(max_=province_top10.values.max())) 
bar2.render() 

 

520礼物国内各省份销量分布
在这里插入图片描述

代码实现:

# 计算销量
province_num = df.groupby('province_name')['purchase_num'].sum().sort_values(ascending=False) 

# 绘制地图
map1 = Map(init_opts=opts.InitOpts(width='1350px', height='750px'))
map1.add("", [list(z) for z in zip(province_num.index.tolist(), province_num.values.tolist())],
         maptype='china'
        ) 
map1.set_global_opts(title_opts=opts.TitleOpts(title='520礼物国内各省份销量分布'),
                     visualmap_opts=opts.VisualMapOpts(max_=province_num.quantile(0.9)),
                    )
map1.render() 

 

520不同价格区间的商品数量

在这里插入图片描述
代码实现:

def tranform_price(x):
    if x <= 50:
        return '0~50'
    elif x <= 100:
        return '50~100'
    elif x <= 150:
        return '100~150'
    elif x <= 200:
        return '150~200'
    elif x <= 250:
        return '200~250'
    elif x <= 300:
        return '250~300'
    elif x <= 500:
        return '300~500'
    elif x <= 1000:
        return '500~1000'
    elif x <= 2000:
        return '1000~2000'
    elif x <= 5000:
        return '2000~5000'
    else:
        return '5000~10000'

# 数据转换
df['price_cut'] = df.price.apply(lambda x: tranform_price(x)) 
price_num = df.price_cut.value_counts()

# 数据
x_data = ['0~50', '50~100', '100~150', '150~200', '200~250', '250~300', 
          '300~500', '500~1000', '1000~2000', '2000~5000', '5000~10000']
y_data = [395, 594, 565, 620, 212, 302, 399, 394, 273, 91, 9]

bar3 = Bar(init_opts=opts.InitOpts(width='1350px', height='750px')) 
bar3.add_xaxis(x_data)
bar3.add_yaxis('', y_data) 
bar3.set_global_opts(title_opts=opts.TitleOpts(title='520不同价格区间的商品数量'),
                     visualmap_opts=opts.VisualMapOpts(max_=800)) 
bar3.render()

 

520礼物不同价格区间销量占比

在这里插入图片描述
代码实现:

price_cut_num = df.groupby('price_cut')['purchase_num'].sum() 
data_pair = [list(z) for z in zip(price_cut_num.index, price_cut_num.values)]

# 饼图
pie1 = Pie(init_opts=opts.InitOpts(width='1350px', height='750px'))
# 内置富文本
pie1.add(series_name="", 
        radius=["35%", "55%"],
        data_pair=data_pair,
        label_opts=opts.LabelOpts(formatter="{b}: {c} ({d}%)")
        )
pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", pos_top='30%', orient="vertical"), 
                     title_opts=opts.TitleOpts(title='520礼物不同价格区间销量占比')) 
pie1.render() 

 

以上就是Python分析520礼物数据的全部内容啦,如果你感兴趣的话,也可以自己下载了数据和代码试试哦~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!