项目背景:小米近期发售世界首款透明OLED电视机机,定价近5万元,引起广泛关注,这也引起我对电视机机这种存在典型高中低档商品在线上销售情况分析的兴趣。
项目目的:了解电视机机这种常见的家庭电器在淘宝上的销售概况。主要有:
- 电视机机销量店铺排名top10
- 电视机机产地数量排名top10
- 电视机机产地国内销量分布
- 电视机机价格分布
- 电视机机价格对销量的影响分析
- 不同价格区间的销售额整体表现
- 商品标题词云分析
项目步骤:
- 数据采集:利用python的selenium库爬取淘宝网商品数据
- 对数据清洗和处理:利用python的pandas、numpy等库进行处理
- 数据可视化及分析:利用python的pyecharts等库进行可视化,jieba分词进行文本分析
- 结论
工具:Anaconda
模块:pandas、numpy、pyecharts、jieba、stylecloud
<hr/>一、数据爬取
淘宝网反爬虫限制严格,通过导入selenium库中webdriver模拟浏览器登陆,逐页爬取数据。
导入相关库:
from selenium import webdriver
import time
import re
import csv定义商品搜索函数,输入搜索关键字kw,并搜索;对搜索结果的首页面获取总页码,并对获取的文本提取数值。
def search_product():
driver.find_element_by_xpath(&#39;//*[@id=&#34;q&#34;]&#39;).send_keys(kw)
driver.find_element_by_xpath(&#39;//*[@id=&#34;J_TSearchForm&#34;]/div[1]/button&#39;).click()
time.sleep(10)
token = driver.find_element_by_xpath(&#39;//*[@id=&#34;mainsrp-pager&#34;]/div/div/div/div[1]&#39;).text
token=int(re.compile(&#39;(\d+)&#39;).search(token).group(1))
return token模拟登陆下滑框操作:
def drop_down():
for x in range(1,11,2):
time.sleep(0.5)
j=x/10
js = &#39;document.documentElement.scrollTop=document.documentElement.scrollHeight*%f&#39;% j
driver.execute_script(js)获取商品信息,包括标题、价格、图片链接、购买人数、商家位置、店铺名,结果保存字典:
def get_product():
divs=driver.find_elements_by_xpath(&#39;//div[@class=&#34;items&#34;]/div[@class=&#34;item J_MouserOnverReq &#34;]&#39;)
data = []
for div in divs:
info = div.find_element_by_xpath(&#39;.//div[@class=&#34;row row-2 title&#34;]&#39;).text
price = div.find_element_by_xpath(&#39;.//div[@class=&#34;row row-1 g-clearfix&#34;]/div[@class=&#34;price g_price g_price-highlight&#34;]&#39;).text
img=div.find_element_by_xpath(&#39;.//div[@class=&#34;pic&#34;]/a/img&#39;).get_attribute(&#39;src&#39;)
deal = div.find_element_by_xpath(&#39;.//div[@class=&#34;deal-cnt&#34;]&#39;).text
position = div.find_element_by_xpath(&#39;.//div[@class=&#34;row row-3 g-clearfix&#34;]/div[@class=&#34;location&#34;]&#39;).text
name = div.find_element_by_xpath(&#39;.//div[@class=&#34;shop&#34;]/a&#39;).text
data.append({
&#39;标题&#39;:info,
&#39;价格&#39;:price,
&#39;购买人数&#39;:deal,
&#39;位置&#39;:position,
&#39;商家&#39;:name,
&#39;图片&#39;:img})
return data 翻页循环,结果保存csv:
def next_page():
with open(&#39;./淘宝爬虫.csv&#39;,&#39;a&#39;,newline=&#39;&#39;,encoding=&#39;utf-8-sig&#39;) as f:
col=[&#39;标题&#39;,&#39;价格&#39;,&#39;商家&#39;,&#39;购买人数&#39;,&#39;位置&#39;,&#39;图片&#39;]
f_csv=csv.DictWriter(f,col)
f_csv.writeheader()
token =search_product()
drop_down()
get_product()
num=1
while num!=token:
driver.get(&#39;https://s.taobao.com/search?q={}&s={}&#39;.format(kw,44*num))
driver.implicitly_wait(10)
num+=1
drop_down()
data=get_product()
f_csv.writerows(data)
print(&#39;爬取第%d页&#39;%num)运行主函数
if __name__ == &#39;__main__&#39;:
kw=input(&#39;请输入要查询的商品:&#39;)
driver = webdriver.Chrome()
driver.get(&#39;https://www.taobao.com/&#39;)
next_page()
二、数据清洗、处理
导入爬取的数据:
data=pd.read_csv(r&#39;C:\Users\12714\爬虫练习\淘宝电视机机爬虫.csv&#39;,encoding=&#39;utf-8-sig&#39;)
data.head()
标题 价格 商家 购买人数 位置 图片
0 康佳kktv AK45 45英寸智能超清网络wifi智能电视机机平板彩电43 50 ¥1,199.00 kktv官方旗舰店 288人付款 广东 深圳 https://g-search1.alicdn.com/img/bao/uploaded/...
1 官方正品/小米电视机32英寸 4c32吋液晶超清家用网络智能e32s pro43 ¥619.00 小米新宝婷专卖店 854人付款 河南 郑州 https://g-search3.alicdn.com/img/bao/uploaded/...
2 Hisense/海信 HZ43E3D 43英寸4K超清智能网络平板液晶机 ¥1,599.00 海信电视机官方旗舰店 698人付款 山东 青岛 https://g-search3.alicdn.com/img/bao/uploaded/...
3 Sharp/夏普 60A3UM 60英寸4K超清智能网络平板液晶机55 65 ¥4,399.00 夏普官方旗舰店 319人付款 广东 深圳 https://g-search3.alicdn.com/img/bao/uploaded/...
4 智能电视机机21寸24WiFi智能网络老人家用17 19 26 28 32小型两用22 ¥196.00 宝悦企业店 4095人付款 广东 广州 https://g-search1.alicdn.com/img/bao/uploaded/...删除空值的行,查看数据概况,共爬取4355条数据:
data =data[data[&#39;购买人数&#39;].notna()]
data.info()
-----------------------------------------
<class &#39;pandas.core.frame.DataFrame&#39;>
Int64Index: 4355 entries, 0 to 4355
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 标题 4355 non-null object
1 价格 4355 non-null object
2 商家 4355 non-null object
3 购买人数 4355 non-null object
4 位置 4355 non-null object
5 图片 4355 non-null object
dtypes: object(6)
memory usage: 238.2+ KB对数据进行去重,并重置索引。有2千多条重复数据
data.drop_duplicates(inplace=True)
data=data.reset_index(drop=True)
data.info()
-----------------------------------
<class &#39;pandas.core.frame.DataFrame&#39;>
RangeIndex: 2145 entries, 0 to 2144
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 标题 2145 non-null object
1 价格 2145 non-null object
2 商家 2145 non-null object
3 购买人数 2145 non-null object
4 位置 2145 non-null object
5 图片 2145 non-null object
dtypes: object(6)
memory usage: 100.7+ KB接下来需要对价格进行处理,需要删除¥符合及千位分隔符,最后转换为浮点型数据
data[&#39;价格&#39;]=data[&#39;价格&#39;].apply(lambda x : x.replace(&#39;¥&#39;,&#39;&#39;))
data[&#39;价格&#39;]=data[&#39;价格&#39;].apply(lambda x: float(x.replace(&#39;,&#39;,&#39;&#39;)))购买人数也需要提取,获取字符串中数值型即可,并转换为整型数据
data[&#39;购买人数&#39;]=data[&#39;购买人数&#39;].str.extract(&#39;(\d+)&#39;).astype(&#39;int&#39;)计算销售额
data[&#39;销售额&#39;]=data[&#39;价格&#39;]*data[&#39;购买人数&#39;]提取省份数据;图片链接列可删去
data[&#39;省份&#39;]=data[&#39;位置&#39;].str.split(&#39; &#39;).str[0]
data = data.drop(&#39;图片&#39;,1)三、数据可视化
查看销量(本文以淘宝页面购买人数代表销量,假设人均购买量为1台)最好的店铺:
shop_top10=data.groupby(&#39;商家&#39;)[&#39;购买人数&#39;].sum().sort_values(ascending=False).head(10)
shop_top10引入pyecharts的条形图
bar1=Bar()
bar1.add_xaxis(shop_top10.index.tolist())
bar1.add_yaxis(&#39;&#39;,shop_top10.values.tolist())
bar1.set_global_opts(title_opts=opts.TitleOpts(title=&#39;电视机机销量Top10淘宝店铺&#39;),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
visualmap_opts=opts.VisualMapOpts(max_=20000))
bar1.render_notebook()
直观数据看,销量最好的店铺是小米官方旗舰店,高达5万多人,接近第四名到第九名店铺销量的总和,遥遥领先其他牌子电视机机,占据电视机机市场的半壁江山。
需要注意的是,销量第二的店铺是苏宁易购官方旗舰店,相对于其他电视机机牌子商性质有些特殊,苏宁易购是平台型商铺,并无自营牌子电视机机,其商铺的产品均为电视机机行业垂直领域的其他商家产品,故在对具体牌子销量分析时,大致可将其销量按比例分配到各牌子商。
从行业角度分析,小米在电视机机领域属于小米生态链上的一环,依靠智能概念迅速拔得市场头筹,也引领者行业转型;除小米外,传统老牌电视机厂商瓜分剩余市场,与小米巨大的销量差异相比,老牌厂商之间的销量差异不明显。所以在第一名和第三名的店铺销量呈现断崖式下跌,后八名店铺销量曲线下降较为平滑。
电视机机产地数量排名可视化及分析:
province_top10=data[&#39;省份&#39;].value_counts()[:10]
province_top10
bar2 = Bar()
bar2.add_xaxis(province_top10.index.tolist())
bar2.add_yaxis(&#39;&#39;,province_top10.values.tolist())
bar2.set_global_opts(
title_opts = opts.TitleOpts(title = &#39;电视机机产地数量排名top10&#39;),
visualmap_opts = opts.VisualMapOpts(max_=500)
)
bar2.render_notebook()
电视机机产地上看,广东省名列第一,是电视机机最主要的产地,这与珠三角轻工业基础较为发达密切相关,TCL、创维、康佳、华为、志高等等家电企业均位于广东;
山东位居第二,传统的行业老兵例如海信、海尔等总部均位于山东;
北京第三,除小米总部外,其他厂商在北京也有店铺,以拓展其牌子渠道和影响力。
其余产地主要分布在江浙沪发达长三角经济圈,四川以长虹为代表的也占有一席之地。
电视机机产地国内销量分布可视化:
对省份分组后,对购买人数求和,得各省份销量情况:
province_num = data.groupby(&#39;省份&#39;)[&#39;购买人数&#39;].sum().sort_values(ascending=False)
province_num[:10]
------------------------------------
省份
广东 149972
北京 76694
江苏 47334
山东 47136
上海 27504
浙江 13020
四川 8994
河南 4645
福建 634
安徽 571
Name: 购买人数, dtype: int32
--------------------------------------
map1= Map()
map1.add(&#39;&#39;,[list(z) for z in zip(province_num.index.tolist(),province_num.values.tolist())],
maptype=&#39;china&#39;)
map1.set_global_opts(
title_opts=opts.TitleOpts(title=&#39;国内个产地电视机机销量分布图&#39;),
visualmap_opts = opts.VisualMapOpts(max_=70000)
)
map1.render_notebook()
与产地排名数量一致,广东省销量数据也是遥遥领先,总销量近15万人;北京、江苏销量分别是二三名;电视机机产地数量第二的山东的销量却处第四,山东地区电视机机竞争力亟待加强。
总的来看,省份销量呈现中间低四边高的格局:即南北高(北京和广东)中间低,东西(东部沿岸及西部四川)高中间部低。
电视机机价格分布可视化:
对电视机机价格进行分组,为详细观测各价格区间电视机机数量,将价格划分为9组:
cut_bins = [0,500,1000,2000,3000,5000,10000,20000,40000,100000]
cut_labels=[&#39;0~500元&#39;, &#39;500~1000元&#39;,&#39;1000~2000元&#39;, &#39;2000~3000元&#39;, &#39;3000~5000元&#39;, &#39;5000~10000元&#39;, &#39;10000~20000元&#39;, &#39;20000~40000元&#39;,&#39;40000元以上&#39;]
price_cut = pd.cut(data[&#39;价格&#39;],bins=cut_bins,labels=cut_labels)
price_num=price_cut.value_counts()
price_num
---------------------
1000~2000元 650
3000~5000元 421
2000~3000元 369
500~1000元 245
5000~10000元 215
0~500元 158
10000~20000元 57
20000~40000元 23
40000元以上 6
Name: 价格, dtype: int64
------------------------------
bar3 = Bar()
bar3.add_xaxis(price_num.index.tolist())
bar3.add_yaxis(&#39;&#39;, price_num.values.tolist())
bar3.set_global_opts(title_opts=opts.TitleOpts(title=&#39;不同价格区间的商品数量&#39;),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
visualmap_opts=opts.VisualMapOpts(max_=500))
bar3.render_notebook()
不难看出,1000-2000价格电视机机数量最多,1000-5000价格段的电视机机数量占全部的80%以上;且大致呈现以1000-2000价格区间位中心的右偏的正太分布。
不同价格区间的销售额整体表现可视化:
data[&#39;价格区间&#39;]=price_cut
cut_purchase=data.groupby(&#39;价格区间&#39;)[&#39;销售额&#39;].sum()
cut_purchase
-------------------------------
价格区间
0~500元 3.003127e+07
500~1000元 4.489859e+07
1000~2000元 1.737157e+08
2000~3000元 1.367226e+08
3000~5000元 1.638598e+08
5000~10000元 6.254534e+07
10000~20000元 2.018622e+07
20000~40000元 7.368274e+06
40000元以上 7.189840e+05
Name: 销售额, dtype: float64
-------------------------------
data_pair= [list(z) for z in zip(cut_purchase.index.tolist(),cut_purchase.values.tolist())]
#绘制饼图
pie=Pie()
pie.add(&#39;&#39;,data_pair,radius=[&#39;35%&#39;,&#39;60%&#39;])
pie.set_global_opts(title_opts=opts.TitleOpts(title=&#39;不同价格区间的销售额整体表现&#39;),
legend_opts=opts.LegendOpts(orient=&#39;vertical&#39;, pos_top=&#39;15%&#39;, pos_left=&#39;2%&#39;))
pie.set_series_opts(label_opts=opts.LabelOpts(formatter=&#34;{b}:{d}%&#34;))
pie.set_colors([&#39;#EF9050&#39;, &#39;#3B7BA9&#39;, &#39;#6FB27C&#39;, &#39;#FFAF34&#39;, &#39;#D8BFD8&#39;, &#39;#00BFFF&#39;, &#39;#7FFFAA&#39;])
pie.render_notebook()
饼图中看出,与上述的电视机机价格区间的数量分布一致,1000-2000元段的销售额最高,销售额达约1.7亿元,占总销售额的27.14%,紧接着分别是3000-5000和2000-3000元段,分布占25.6%和21.36%;
500-1000元段销售额占7%,500元以下也仅占4.7%,低端电视机机市场空间有限;
需要注意的是,在10000元以上的价格区间中,销售额占比均非常低,厂商在电视机机定价范围在此区间中需谨慎(连雷总都说透明电视机太贵了看看就好。。)。
商品标题词云图
读入停用词表,进行分词,加入相关关键词:
def get_cut_words(content_series):
stop_words = []
with open(r&#39;D:\文档\数据分析\停用词表.txt&#39;,&#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
lines = f.readlines()
for line in lines:
stop_words.append(line.strip())
#添加关键词
my_words = [&#39;Xiaomi&#39;,&#39;小米&#39;,&#39;海信&#39;,&#39;创维&#39;,&#39;海尔&#39;,&#39;TCL&#39;,&#39;康佳&#39;,&#39;4K&#39;,&#39;三星&#39;]
for i in my_words:
jieba.add_word(i)
#分词
word_num = jieba.lcut(content_series.str.cat(sep=&#39;。&#39;),cut_all=False)
#条件筛选
word_num_selected = [i for i in word_num if i not in stop_words and len(i)>=2]
return word_num_selected
text = get_cut_words(content_series=data[&#39;标题&#39;])
text[:10]画词云图:
stylecloud.gen_stylecloud(
text=&#39; &#39;.join(text),
collocations=False,
font_path=r&#39;C:\Windows\Fonts\msyh.ttc&#39;,
icon_name=&#39;fas fa-cloud&#39;,
size = 700,
output_name=&#39;淘宝电视机机标题词云图.png&#39;
)
Image(filename=&#39;淘宝电视机机标题词云图.png&#39;)
透过词云分析看出,国内电视机行业全体进入智能电视机时代;
此外,电视机机产品朝着大屏化、超清化方向发展。
四、结论
对此分析的结果,本项目主要从厂商角度进行进一步解读:
一、在各大店铺的销售排行榜中看出,可以典型区分出三类厂商,小米、苏宁和其他厂商。
小米电视机机占据行业的半壁江山,之所以能够在众多的传统厂商激烈竞争中脱颖而出,个人认为主要原因有二:产品的高性价比和智能家居生态链的搭建,类似小米手机竞争战略,高性价比一直是其产品标签最突出的点,此外,作为小米智能家居的重要一环,电视机机必不可少,在小米电视机机淘宝评论中,很多买家表示家里电器很多都是小米产品(其他产品也存在),这也是小米的产品生态链协同的必然结果;小米今后应当继续保持其产品优势和完善生态链的协同,稳固行业地位;
苏宁作为平台性质商铺,之所以能够在电视机机行业能够位列前茅,个人认为主要原因源于其两大优势:平台流量的优势和渠道优势,除了自身的平台也在淘宝中接入平台接口,扩大流量来源,此外在对电视机机厂商的有着更低成本的渠道优势,因此同一型号的电视机机在电视机机厂商的官方旗舰店和苏宁易购的旗舰店二者中,往往苏宁易购的价格会更低,库存也更充足(尤其是热门产品),这也解释了为啥有消费者更愿意从苏宁易购去购买;但需要注意的是,苏宁也正因为是平台方,相对于原厂商,在产品的售后上一直是一大诟病;苏宁应当利用其平台流量优势,对接更多电视机机厂商;同时也需要对售后业务进行改善。
其他厂商的销量比较接近,竞争剧烈,主要原因是产品同质化较为严重及在智能化发展未能取得先行者优势;为扩张市场影响力,可以考虑与苏宁合作的同时,也要加强自身产品的研发,个人觉得主要有两个方面,一是将自身的产品实现能够融入主流厂商的生态环境,二是自身产品的差异化。
二、结合在不同价格区间的商品数量分布和相应的销售额分布来看,主要有两点值得注意:
1.价格区间在1000-5000元的电视机机数量占据多数,且销售额约占全部的近80%,市场份额最大,相关厂商在产品定位和定价时,应将此价格区间作为参考,在此区间深耕产品;
2.进一步对1000-5000元区间划分看出,其中1000-2000元销售额与3000-5000的销售额仅仅差2%(其商品量差35%),而2000-3000元的销售额和前两区间差距在4%以上(其商品量差12%),因此,3000-5000元的价格区间潜力巨大,相关厂商应将此区间的产品作为重中之重。 |