CDA数据分析师 出品 作者:Mika 数据:真达 后期:泽龙 【导语】:今天我们聊聊火遍全网的螺蛳粉,Python技术部分可以直接看第二部分。 Show me data,用数据说话 今天我们聊聊 螺蛳粉 点击下方视频,先睹为快: 居家隔离的日子里,各类方便速食食品成了许多人的心头爱。特别是螺蛳粉,异军突起,火遍全网,几乎卖到脱销。有的螺蛳粉热销店铺的购买页面还显示,现在下单,预售40天后发货,这是种什么操作? 万万没想到,这些日子发不出货的,除了口罩,还有螺蛳粉。 今天我们就来聊一聊火遍全网的螺蛳粉。 01:
让吃货们买到断货的 螺蛳粉 螺蛳粉气味腥臭,味道酸辣,被戏称为"生化武器"。然而吃起来却让人欲罢不能,再加上称为灵魂的酸笋,不禁让人大呼,爱了爱了!就是这个味儿! 那么谁家卖的螺蛳粉最火,最好吃?吃货们都怎么看? 我们搜集整理了淘宝上关于螺蛳粉店铺的数据: 店铺销量排行 可以看到:销量前三的店铺分别是李子柒旗舰店、好欢螺旗舰店、嘻螺会鼎容鲜专卖店。其中李子柒旗舰店的以月销量66万+一骑绝尘。紧随其后的是好欢螺月销量57万+。第三是嘻螺会21万+。 各省螺蛳粉店铺和销量排行 最为螺蛳粉发源地,无论是在店铺数量和商品销量上,广西地区都占据了全国的大部分比重,绝对的王者。 螺蛳粉都卖多少钱? 我们分析了市面上销售螺蛳粉的价格区间,发现一份螺蛳粉一般3-5包。其中定价在30-50元一份的卖得最好,占到全网总销量的59.04%。这个价格区间,普遍让人接受,3-5包的量也很合适。 其次是0-30元一份的,销量占比27.93%,这个价格不仅物美价廉,对于想尝试螺蛳粉的新手都十分友好。 然后是一份售价50-80的螺蛳粉,销量占比10.22%。这个价位一般都有5包以上,对于螺蛳粉的重度爱好者来说是不错的选择。 买螺蛳粉,大家都看重什么? 从广大螺蛳粉的评价中我们可以看到: 大家的焦点尤其在,螺蛳粉产地要"正宗"。来自"广西",特别是螺蛳粉的发源地"柳州"。 当然有意思的是,销量最高的李子柒卖的螺蛳粉产地不在广西,而是嘉兴。可能这就是网红强大的带货力吧。 其次"包邮"也是最关键的。毕竟,为了几块钱运费跟电商卖家磨半天嘴皮子,或者毫不留情地直接pass掉不包邮的店铺,这都是我们的真实写照。 02:
Python分析 李子柒的螺蛳粉到底有多火? 接着,我们再看到全网螺蛳粉销量之王的李子柒店铺。这次我们用Python来进行分析,先看到结论: 评论时间热度图: 从数据可以看到,螺蛳粉的数据从去年12月2日开始,一直不温不火,然而从3月中下旬开始,购买和评论数量持续走高,如今这个数据还在急剧上升。 消费者关注维度占比: 看来,螺蛳粉的口感(好不好吃)是客户最最最关注的点,占比高达41.45%,领先其他类别N个身位。 其他的维度:包装、原料、品牌,而物流和日期则提及较少,看来消费者不是太关注这些角度,或者目前基本满足要求。 关注点细节占比分布: 整体来看,主流评论以好评为主,其中口感、品牌(这个地方其实没有细分)、包装以正面评价占绝对主导。 原料、日期和性价比,负面评价占比分别是10%和32%和15%。 评论分布词云图: 从词云可以看到,螺蛳粉好不好吃是大家关注的焦点。"味道""口感""好吃""新鲜度"等词都频频出现。 其次"李子柒"的巨大带货能力也不容小觑,毕竟很多人都是冲着李子柒小姐姐来买的。 具体步骤和代码如下: 一、导入数据和基本处理 #导入包 importnumpyasnp importpandasaspd importmatplotlib.pyplotasplt importseabornassns importre #读入数据 df=pd.read_excel("李子柒螺蛳粉评论.xlsx") df.head() #去除重复值 df.drop_duplicates(inplace=True) df.info() <class></class> Int64Index:1980entries,0to1979 Datacolumns(total5columns): UserNick1980non-nullobject comment_time1980non-nulldatetime64[ns] content1980non-nullobject auctionSku1980non-nullobject comment_date1980non-nullobject dtypes:datetime64[ns](1),object(4) memoryusage:92.8+KB 二、数据分析 时间-热度分析 代码: #时间走势图 df["comment_time"]=pd.to_datetime(df["comment_time"]) df["comment_date"]=df["comment_time"].dt.date comment_num=df["comment_date"].value_counts().sort_index() frompyecharts.chartsimportLine frompyechartsimportoptionsasopts #折线图 line1=Line(init_opts=opts.InitOpts(width="1350px",height="750px")) line1.add_xaxis(comment_num.index.tolist()) line1.add_yaxis("热度",comment_num.values.tolist(), areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False)) line1.set_global_opts(title_opts=opts.TitleOpts(title="商品评价数量走势图"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate="30")), toolbox_opts=opts.ToolboxOpts(), visualmap_opts=opts.VisualMapOpts(max_=400)) line1.set_series_opts(linestyle_opts=opts.LineStyleOpts(width=3)) line1.render() 推测2019年12.02上线商品,购买和评论数量持续走高。 三、评论分析 我们从以下几个角度对评论进行分析: 包装 品牌 物流 产品 性价比 defjudge_comment(df,result): #创建一个空数据框 judges=pd.DataFrame(np.zeros(13*len(df)).reshape(len(df),13), columns=["品牌","物流正面","物流负面","包装正面","包装负面","原料正面", "原料负面","口感正面","口感负面","日期正面","日期负面", "性价比正面","性价比负面"]) foriinrange(len(result)): word=result[i] #李子柒的产品具有强IP属性,基本都是正面评价,这里不统计情绪,只统计提及次数 if"李子柒"inwordor"子柒"inwordor"小柒"inwordor"李子七"inwordor"小七"inword: judges.iloc[i]["品牌"]=1 #先判断是不是物流相关的 if"物流"inwordor"快递"inwordor"配送"inwordor"取货"inword: #再判断是正面还是负面情感 if"好"inwordor"不错"inwordor"棒"inwordor"满意"inwordor"迅速"inword: judges.iloc[i]["物流正面"]=1 elif"慢"inwordor"龟速"inwordor"暴力"inwordor"差"inword: judges.iloc[i]["物流负面"]=1 #判断是否包装相关 if"包装"inwordor"盒子"inwordor"袋子"inwordor"外观"inword: if"高端"inwordor"大气"inwordor"还行"inwordor"完整"inwordor"好"inwordor "严实"inwordor"紧"inwordor"精致"inword: judges.iloc[i]["包装正面"]=1 elif"破"inwordor"破损"inwordor"瘪"inwordor"简陋"inword: judges.iloc[i]["包装负面"]=1 #产品 #产品原料是牛肉为主,且评价大多会提到牛肉,因此我们把这个单独拎出来分析 if"米粉"inwordor"汤"inwordor"配料"inwordor"腐竹"inwordor"花生"inword: if"劲道"inwordor"多"inwordor"足"inwordor"香"inwordor"才"inwordor "脆"inwordor"nice"inword: judges.iloc[i]["原料正面"]=1 elif"小"inwordor"少"inwordor"没"inword: judges.iloc[i]["原料负面"]=1 #口感的情绪 if"口味"inwordor"味道"inwordor"口感"inwordor"吃起来"inword: if"不错"inwordor"浓鲜"inwordor"十足"inwordor"鲜"inwordor "可以"inwordor"喜欢"inwordor"符合"inword: judges.iloc[i]["口感正面"]=1 elif"不好"inwordor"不行"inwordor"不鲜"inwordor "太烂"inword: judges.iloc[i]["口感负面"]=1 #口感方面,有些是不需要出现前置词,消费者直接评价好吃难吃的,例如: if"难吃"inwordor"不好吃"inword: judges.iloc[i]["口感负面"]=1 elif"好吃"inwordor"香"inword: judges.iloc[i]["口感正面"]=1 #日期是不是新鲜 if"日期"inwordor"时间"inwordor"保质期"inword: if"新鲜"inword: judges.iloc[i]["日期正面"]=1 elif"久"inwordor"长"inword: judges.iloc[i]["日期负面"]=1 elif"过期"inword: judges.iloc[i]["日期负面"]=1 #性价比 if"划算"inwordor"便宜"inwordor"赚了"inwordor"囤货"inwordor"超值"inwordor "太值"inwordor"物美价廉"inwordor"实惠"inwordor"性价比高"inwordor"不贵"inword: judges.iloc[i]["性价比正面"]=1 elif"贵"inwordor"不值"inwordor"亏了"inwordor"不划算"inwordor"不便宜"inword: judges.iloc[i]["性价比负面"]=1 final_result=pd.concat([df,judges],axis=1) returnfinal_result #得到数据框 judge=judge_comment(df,result=df.content) judge.head() #结果汇总 rank=judge.iloc[:,5:].sum().reset_index().sort_values(0,ascending=False) rank.columns=["分类","提及次数"] rank["占比"]=rank["提及次数"]/rank["提及次数"].sum() rank["高级分类"]=rank["分类"].str[:-2] rank rank.loc[0,"高级分类"]="品牌" rank df.shape (1980,5) 此次评论数据去重之后一共有1980条评论数据,粗略一看,口感和包装、原料占比较高,画个图更细致的看看。 rank_num=rank.groupby("高级分类")["提及次数"].sum().sort_values(ascending=False) rank_num 高级分类 口感1511.0 包装695.0 原料602.0 品牌422.0 日期208.0 性价比146.0 物流61.0 Name:提及次数,dtype:float64 data_pair=[list(z)forzinzip(rank_num.index,rank_num.values)] data_pair [["口感",1511.0], ["包装",695.0], ["原料",602.0], ["品牌",422.0], ["日期",208.0], ["性价比",146.0], ["物流",61.0]] frompyecharts.chartsimportPie pie1=Pie(init_opts=opts.InitOpts(width="1350px",height="750px")) pie1.add( series_name="num", radius=["35%","55%"], data_pair=data_pair, label_opts=opts.LabelOpts( position="outside", formatter="{a|{a}}{abg|}{hr|}{b|{b}:}{c}{per|{d}%}", background_color="#eee", border_color="#aaa", border_width=1, border_radius=4, rich={ "a":{"color":"#999","lineHeight":22,"align":"center"}, "abg":{ "backgroundColor":"#e3e3e3", "width":"100%", "align":"right", "height":22, "borderRadius":[4,4,0,0], }, "hr":{ "borderColor":"#aaa", "width":"100%", "borderWidth":0.5, "height":0, }, "b":{"fontSize":16,"lineHeight":33}, "per":{ "color":"#eee", "backgroundColor":"#334455", "padding":[2,4], "borderRadius":2, }, }, ), ) pie1.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left",pos_top="30%",orient="vertical"), toolbox_opts=opts.ToolboxOpts(), title_opts=opts.TitleOpts(title="消费者关注占比分布")) pie1.set_series_opts( tooltip_opts=opts.TooltipOpts(trigger="item",formatter="{a} {b}:{c}({d}%)") ) pie1.render() 看来,螺蛳粉的口感(好不好吃)是客户最最最关注的点,没有之一,占比高达41.45%,领先其他类别N个身位。 包装、原料、品牌,而物流和日期则提及较少,消费者貌似不太关注,或者说目前基本满足要求。 那不同类别正负面评价占比是怎么样的呢? frompyechartsimportoptionsasopts frompyecharts.chartsimportBar frompyecharts.commons.utilsimportJsCode frompyecharts.globalsimportThemeType list2=[ {"value":1484.0,"percent":1484.0/(1484.0+27.0)}, {"value":692.0,"percent":692.0/(692.0+3.0)}, {"value":539.0,"percent":539.0/(539.0+63.0)}, {"value":422.0,"percent":422.0/(422.0+0)}, {"value":142.0,"percent":142.0/(142.0+66.0)}, {"value":124.0,"percent":124.0/(124.0+22.0)}, {"value":58.0,"percent":58.0/(58.0+3.0)}, ] list3=[ {"value":27.0,"percent":27.0/(27.0+1484.0)}, {"value":3.0,"percent":3.0/(3.0+692.0)}, {"value":63.0,"percent":63.0/(63.0+539.0)}, {"value":0,"percent":0/(0+422.0)}, {"value":66.0,"percent":66.0/(66.0+142.0)}, {"value":22.0,"percent":22.0/(22.0+124.0)}, {"value":3.0,"percent":3.0/(3.0+58.0)}, ] bar1=Bar(init_opts=opts.InitOpts(width="1350px",height="750px",theme=ThemeType.LIGHT)) bar1.add_xaxis(["口感","包装","原料","品牌","日期","性价比","物流"]) bar1.add_yaxis("正面评论",list2,stack="stack1",category_gap="50%") bar1.add_yaxis("负面评论",list3,stack="stack1",category_gap="50%") bar1.set_global_opts(title_opts=opts.TitleOpts(title="关注点细分占比分布")) bar1.set_series_opts( label_opts=opts.LabelOpts( position="right", formatter=JsCode( "function(x){returnNumber(x.data.percent*100).toFixed()+"%";}" ), ) ) bar1.render() importjieba importjieba.analyse txt=df["content"].str.cat(sep="。") #添加关键词 jieba.add_word("李子柒") #读入停用词表 stop_words=[] withopen("stop_words.txt","r",encoding="utf-8")asf: lines=f.readlines() forlineinlines: stop_words.append(line.strip()) #添加停用词 stop_words.extend(["40","hellip","一袋","一包","一个月", "一点","一个多月","第一次","哈哈哈", "螺狮粉","螺蛳"]) #评论字段分词处理 word_num=jieba.analyse.extract_tags(txt, topK=100, withWeight=True, allowPOS=()) #去停用词 word_num_selected=[] foriinword_num: ifi[0]notinstop_words: word_num_selected.append(i) key_words=pd.DataFrame(word_num_selected,columns=["words","num"]) key_words.head() frompyecharts.chartsimportWordCloud frompyecharts.globalsimportSymbolType #词云图 word1=WordCloud(init_opts=opts.InitOpts(width="1350px",height="750px")) word1.add("",[*zip(key_words.words,key_words.num)], word_size_range=[20,200], shape=SymbolType.DIAMOND) word1.set_global_opts(title_opts=opts.TitleOpts("评论分布词云图"), toolbox_opts=opts.ToolboxOpts()) word1.render() frompyecharts.chartsimportPage page=Page() page.add(pie1,bar1,word1) page.render("评论分析.html") 以上就是关于螺蛳粉的全部分析内容啦。要问为什么螺蛳粉这么臭,还有这么多人爱呢? 其实对吃货们而言,喜欢的就是螺蛳粉又腥又臭又辣的味道,等疫情过去,螺蛳粉店估计也要爆满了。 关注CDA数据分析师公众号 CDA数据分析师 本文出品:CDA数据分析师(ID: cdacdacda)