当前位置:   article > 正文

基于pandas python的美团某商家的评论销售数据分析(可视化)_pythonn怎么比较美团和饿了么的价格

pythonn怎么比较美团和饿了么的价格

基于pandas python的美团某商家的评论销售数据分析(可视化)

基于pandas python的美团某商家的评论销售数据分析

导入相关库

  1. from pyecharts import Bar,Pie
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import time

数据清洗与简单统计

  • 评论数据,其中包括一下几个字段
  • 是否匿名,均价,评价(以去掉,后续会做一些关于这些评论的更为深入的分析),评价时间,交易截止时间,订单号,套餐,上传的图片链接,质量好坏,阅读量,回复量,评分,点赞数等。
  1. df=pd.read_excel("all_data_meituan.xlsx")
  1. df.drop('comment',axis=1).head(2)

9ebd4c2bgy1fu679dm0udj20q104zmxj.jpg

  1. df['avgPrice'].value_counts()
  2. # 同一家店的均价应该为同一个数值,所以这列数据没多大的意义
  1. 73 17400
  2. Name: avgPrice, dtype: int64
  1. df['anonymous'].value_counts()
  2. # 匿名评价与实名评价的比例大致在5:1左右
  1. False 14402
  2. True 2998
  3. Name: anonymous, dtype: int64

时间格式的转化

  1. def convertTime(x):
  2. y=time.localtime(x/1000)
  3. z=time.strftime("%Y-%m-%d %H:%M:%S",y)
  4. return z
  5. df["commentTime"]=df["commentTime"].apply(convertTime)
  6. df["commentTime"].head()
  1. 0 2018-05-09 22:21:48
  2. 1 2018-06-01 19:41:31
  3. 2 2018-04-04 11:52:23
  4. 3 2018-05-01 17:12:22
  5. 4 2018-05-17 16:48:04
  6. Name: commentTime, dtype: object
  1. # 在excel可以用筛选器直接看到这列中的数据含有缺失值,或者在拿到数据的时候,使用df.info() 查看每列的数据信息情况
  2. df['dealEndtime'].isna().value_counts()
  3. # 这列数据中含有177个缺失值,其余完整
  1. False 17223
  2. True 177
  3. Name: dealEndtime, dtype: int64

9ebd4c2bgy1fu64b1fo14j21dk07kta0.jpg

  • 按月统计
  1. df['commentTime']=pd.to_datetime(df['commentTime'])
  2. df1 = df.set_index('commentTime')
  3. df1.resample('D').size().sort_values(ascending=False).head(100)
  4. df2=df1.resample('M').size().to_period()
  5. df2=df2.reset_index()
  6. # df2.columns
  7. # from pyecharts import Bar
  8. bar =Bar("按月统计",width=1000,height=800)
  9. bar.add("按月统计",df2['commentTime'],df2[0],is_label_show=True, is_datazoom_show=True,is_toolbox_show=True,is_more_utils=True)
  10. bar

9ebd4c2bgy1fu6argpgrzj20rs0b4mxm.jpg

  • 按周统计
  1. df['commentTime']=pd.to_datetime(df['commentTime'])
  2. df['weekday'] = df['commentTime'].dt.weekday
  3. df2= df.groupby(['weekday']).size()
  4. # 周末吃外卖的还是教平时多了一些
  5. from pyecharts import Bar
  6. bar =Bar("按周统计",width=750,height=400)
  7. weekday=["一","二","三","四","五","六","日"]
  8. bar.add("按周统计",['周{}'.format(i) for i in weekday],df2.values,is_label_show=True, is_datazoom_show=False,is_toolbox_show=True,is_more_utils=True,is_random=True)
  9. bar

9ebd4c2bly1fu6as7lylzj20ku0b4q37.jpg

  • 按天统计
  1. df['commentTime']=pd.to_datetime(df['commentTime'])
  2. df['day'] = df['commentTime'].dt.day
  3. df2= df.groupby(['day']).size()
  4. df2
  5. from pyecharts import Bar
  6. bar =Bar("按天统计",width=1000,height=400)
  7. bar.add("按天统计",['{} 日'.format(i) for i in df2.index],df2.values,is_label_show=True, is_datazoom_show=True,is_toolbox_show=True,is_more_utils=True,is_random=True)
  8. bar

9ebd4c2bly1fu6au38nk7j20rs0b43zb.jpg

  • 按时统计
  1. df['commentTime']=pd.to_datetime(df['commentTime'])
  2. df['hour'] = df['commentTime'].dt.hour
  3. df2= df.groupby(['hour']).size()
  4. df2
  5. from pyecharts import Bar
  6. bar =Bar("按时统计",width=1000,height=600)
  7. bar.add("按时统计",['{} h'.format(i) for i in df2.index],df2.values,is_label_show=True, is_datazoom_show=True,is_toolbox_show=True,is_more_utils=True,is_random=True)
  8. bar

9ebd4c2bly1fu6asmrkzvj20rs0b474u.jpg

  1. # 处理数据前需要先处理缺失值
  2. # 订单结束时间清洗
  3. df['dealEndtime'].fillna(method='ffill').apply(lambda x:time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x))).head()
  1. 0 2018-06-30 14:00:00
  2. 1 2018-06-30 14:00:00
  3. 2 2018-06-30 14:00:00
  4. 3 2018-06-30 14:00:00
  5. 4 2018-06-30 14:00:00
  6. Name: dealEndtime, dtype: object

套餐的统计

  1. df['menu'].dropna().astype('category').value_counts()
  1. 2人午晚餐 7640
  2. 单人午晚餐 3920
  3. 学生专享午晚自助 2638
  4. 4人午/晚自助 1581
  5. 单人下午自助烤肉 639
  6. 6人午/晚自助 507
  7. 周一至周五自助烤肉/周六日及节假日自助烤肉21 209
  8. 单人午/晚自助 67
  9. 周一至周五自助烤肉,免费WiFi 22
  10. Name: menu, dtype: int64

9ebd4c2bgy1fu657vuie0j20rr0de3z2.jpg

  • 阅读数与评分的协方差(相关性)
  1. df['readCnt'].corr(df['star'])
  2. # 评论阅读书与客户评价分数高低的相关性
0.05909293203205019
  • 最受欢迎的套餐(2人午晚餐评价分布),基本上几种在30,40,50,评价都还好,怪不得卖得好
  1. df_most=df[(df["menu"]=="2人午晚餐")]['star'].value_counts().reindex(range(10,60,10))
  1. 10 329
  2. 20 533
  3. 30 2002
  4. 40 2704
  5. 50 2072
  6. Name: star, dtype: int64

9ebd4c2bgy1fu66bowlaaj20km0aljrt.jpg

  1. df[(df["menu"]=="单人午晚餐")]['star'].value_counts()
  1. 30 1215
  2. 40 1208
  3. 50 1093
  4. 20 298
  5. 10 106
  6. Name: star, dtype: int64
  1. # 学生专享午晚自助
  2. df[(df["menu"]=="学生专享午晚自助")]['star'].value_counts()
  1. 40 954
  2. 50 863
  3. 30 529
  4. 20 191
  5. 10 101
  6. Name: star, dtype: int64
  1. df[(df["menu"]=="4人午/晚自助")]['star'].value_counts()
  1. 50 536
  2. 30 432
  3. 40 414
  4. 10 131
  5. 20 68
  6. Name: star, dtype: int64
  1. df[(df["menu"]=="单人下午自助烤肉")]['star'].value_counts()
  1. 30 208
  2. 50 169
  3. 40 144
  4. 10 98
  5. 20 20
  6. Name: star, dtype: int64
  1. df[(df["menu"]=="6人午/晚自助")]['star'].value_counts()
  1. 50 245
  2. 40 142
  3. 30 112
  4. 10 8
  5. Name: star, dtype: int64
  1. #周一至周五自助烤肉/周六日及节假日自助烤肉2选1
  2. df[(df["menu"]=="周一至周五自助烤肉/周六日及节假日自助烤肉2选1")]['star'].value_counts()
  1. 50 87
  2. 40 66
  3. 30 46
  4. 20 10
  5. Name: star, dtype: int64
  1. df[(df["menu"]=="单人午/晚自助")]['star'].value_counts()
  1. 50 30
  2. 40 27
  3. 30 10
  4. Name: star, dtype: int64
  1. df[(df["menu"]=="周一至周五自助烤肉,免费WiFi")]['star'].value_counts().reindex(range(10,51,10)).fillna(0)
  1. 10 0.0
  2. 20 0.0
  3. 30 0.0
  4. 40 0.0
  5. 50 22.0
  6. Name: star, dtype: float64

套餐与评价汇总

  1. # df.groupby(['menu','star']).size().to_excel("all_menu_star.xls") 可以直接导出到excel
  2. df.groupby(['menu','star']).size()
  1. menu star
  2. 2人午晚餐 10 329
  3. 20 533
  4. 30 2002
  5. 40 2704
  6. 50 2072
  7. 4人午/晚自助 10 131
  8. 20 68
  9. 30 432
  10. 40 414
  11. 50 536
  12. 6人午/晚自助 10 8
  13. 30 112
  14. 40 142
  15. 50 245
  16. 单人下午自助烤肉 10 98
  17. 20 20
  18. 30 208
  19. 40 144
  20. 50 169
  21. 单人午/晚自助 30 10
  22. 40 27
  23. 50 30
  24. 单人午晚餐 10 106
  25. 20 298
  26. 30 1215
  27. 40 1208
  28. 50 1093
  29. 周一至周五自助烤肉/周六日及节假日自助烤肉21 20 10
  30. 30 46
  31. 40 66
  32. 50 87
  33. 周一至周五自助烤肉,免费WiFi 50 22
  34. 学生专享午晚自助 10 101
  35. 20 191
  36. 30 529
  37. 40 954
  38. 50 863
  39. dtype: int64
  1. df.groupby(['star','menu',]).size()
  1. star menu
  2. 10 2人午晚餐 329
  3. 4人午/晚自助 131
  4. 6人午/晚自助 8
  5. 单人下午自助烤肉 98
  6. 单人午晚餐 106
  7. 学生专享午晚自助 101
  8. 20 2人午晚餐 533
  9. 4人午/晚自助 68
  10. 单人下午自助烤肉 20
  11. 单人午晚餐 298
  12. 周一至周五自助烤肉/周六日及节假日自助烤肉21 10
  13. 学生专享午晚自助 191
  14. 30 2人午晚餐 2002
  15. 4人午/晚自助 432
  16. 6人午/晚自助 112
  17. 单人下午自助烤肉 208
  18. 单人午/晚自助 10
  19. 单人午晚餐 1215
  20. 周一至周五自助烤肉/周六日及节假日自助烤肉21 46
  21. 学生专享午晚自助 529
  22. 40 2人午晚餐 2704
  23. 4人午/晚自助 414
  24. 6人午/晚自助 142
  25. 单人下午自助烤肉 144
  26. 单人午/晚自助 27
  27. 单人午晚餐 1208
  28. 周一至周五自助烤肉/周六日及节假日自助烤肉21 66
  29. 学生专享午晚自助 954
  30. 50 2人午晚餐 2072
  31. 4人午/晚自助 536
  32. 6人午/晚自助 245
  33. 单人下午自助烤肉 169
  34. 单人午/晚自助 30
  35. 单人午晚餐 1093
  36. 周一至周五自助烤肉/周六日及节假日自助烤肉21 87
  37. 周一至周五自助烤肉,免费WiFi 22
  38. 学生专享午晚自助 863
  39. dtype: int64
  • 评分最高的套餐分布
  1. df.groupby(['star','menu',]).size()[50]
  1. menu
  2. 2人午晚餐 2072
  3. 4人午/晚自助 536
  4. 6人午/晚自助 245
  5. 单人下午自助烤肉 169
  6. 单人午/晚自助 30
  7. 单人午晚餐 1093
  8. 周一至周五自助烤肉/周六日及节假日自助烤肉21 87
  9. 周一至周五自助烤肉,免费WiFi 22
  10. 学生专享午晚自助 863
  11. dtype: int64

9ebd4c2bgy1fu66hxb8tmj20kb0arjrp.jpg

  • 用户id统计
  1. # userId
  2. # 这家店铺有好多回头客,万万没想到
  3. df[df['userId']!=0]['userId'].value_counts().head(40)
  1. 266045270 64
  2. 152775497 60
  3. 80372612 60
  4. 129840082 60
  5. 336387962 60
  6. 34216474 60
  7. 617772217 60
  8. 82682689 54
  9. 287219504 49
  10. 884729389 45
  11. ...
  12. 232697160 40
  13. 141718492 40
  14. 879430090 40
  15. 696143486 40
  16. 13257519 40
  17. 983797146 40
  18. 911947863 40
  19. 993057629 40
  20. 494215297 40
  21. Name: userId, dtype: int64
  • 用户名统计,应该与用户id对应
  1. df[df['userName']!="匿名用户"]['userName'].value_counts().head(40)
  1. xuruiss1026 64
  2. 黑发飘呀飘 60
  3. 么么哒我是你聪叔 60
  4. jIx325233926 60
  5. siisgood 60
  6. vTF610712604 60
  7. 始于初见的你 60
  8. yumengkou 54
  9. Daaaav 49
  10. 梁子7543 45
  11. oev575457132 40
  12. oUI806055883 40
  13. joF498901567 40
  14. liE32679330 40
  15. ...
  16. 清晨cxh98 40
  17. cBj31240225 40
  18. 天蛟Wing 40
  19. 榴莲馅月饼 40
  20. leeman666888 40
  21. 迅行天下 40
  22. 滨海之恋33 40
  23. pHO437742850 40
  24. SzX539077433 40
  25. Name: userName, dtype: int64

评分与用户等级汇总

  1. df.groupby(['star','userLevel',]).size()
  1. star userLevel
  2. 10 0 187
  3. 1 139
  4. 2 164
  5. 3 193
  6. 4 80
  7. 5 10
  8. 20 0 223
  9. 1 88
  10. 2 304
  11. 3 294
  12. 4 207
  13. 5 21
  14. 30 0 1147
  15. 1 405
  16. 2 1057
  17. 3 1230
  18. 4 570
  19. 5 165
  20. 6 20
  21. 40 0 870
  22. 1 432
  23. 2 1360
  24. 3 1751
  25. 4 1026
  26. 5 261
  27. 6 25
  28. 50 0 698
  29. 1 386
  30. 2 1167
  31. 3 1670
  32. 4 802
  33. 5 318
  34. 6 130
  35. dtype: int64
  1. df_level_star = df.groupby(['userLevel','star']).size()
  2. attr = np.arange(10,60,10)
  3. from pyecharts import Bar
  4. bar = Bar("用户等级与评分",title_pos="center")
  5. df_0 = df_level_star[0].values
  6. df_1 = df_level_star[1].values
  7. df_2 = df_level_star[2].values
  8. df_3 = df_level_star[3].values
  9. df_4 = df_level_star[4].values
  10. df_5 = df_level_star[5].values
  11. # df_6 = df_level_star[6].values
  12. df_6 = df_level_star[6].reindex(attr).fillna(0).values
  13. bar.add("level 0",attr,df_0,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  14. bar.add("level 1",attr,df_1,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  15. bar.add("level 2",attr,df_2,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  16. bar.add("level 3",attr,df_3,mark_line=["average"],mark_point=['max','min'],is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  17. bar.add("level 4",attr,df_4,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  18. bar.add("level 5",attr,df_5,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  19. bar.add("level 6",attr,df_6,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  20. bar

9ebd4c2bgy1fu66k2dzdgj20m80b4mxv.jpg

  1. bar = Bar("用户等级与评分",title_pos="center",title_color="red")
  2. attr = np.arange(10,60,10)
  3. df_0 = df_level_star[0].values
  4. df_1 = df_level_star[1].values
  5. df_2 = df_level_star[2].values
  6. df_3 = df_level_star[3].values
  7. df_4 = df_level_star[4].values
  8. df_5 = df_level_star[5].values
  9. # df_6 = df_level_star[6].values
  10. df_6 = df_level_star[6].reindex(attr).fillna(0).values
  11. bar.add("level 0",attr,df_0,legend_pos='right',legend_orient='vertical',label_text_size=12)
  12. bar.add("level 1",attr,df_1,legend_pos='right',legend_orient='vertical',label_text_size=12)
  13. bar.add("level 2",attr,df_2,legend_pos='right',legend_orient='vertical',label_text_size=12)
  14. bar.add("level 3",attr,df_3,is_stack=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  15. bar.add("level 4",attr,df_4,is_stack=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  16. bar.add("level 5",attr,df_5,is_stack=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  17. bar.add("level 6",attr,df_6,is_stack=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
  18. bar

9ebd4c2bly1fu66xjsuk6j20m80b4wet.jpg

  • 用户等级与评价的相关性
  1. df['star'].corr(df['userLevel'])
0.14389808871897794
  • 点赞分布
  1. df_zan=df['zanCnt'].value_counts()
  2. from pyecharts import Bar
  3. bar=Bar("点赞统计")
  4. bar.add("点赞分布",df_zan.index[1:],df_zan.values[1:],is_label_show=True)
  5. bar

9ebd4c2bgy1fu66vpau0lj20m80b43yp.jpg

  • 数值型数据的统计
  1. df.describe()

9ebd4c2bgy1fu66ujghx0j211i084wfj.jpg

  •  
  1. df['userLevel'].value_counts().reindex(range(7))
  1. 0 3125
  2. 1 1450
  3. 2 4052
  4. 3 5138
  5. 4 2685
  6. 5 775
  7. 6 175
  8. Name: userLevel, dtype: int64
  • 用户等级分布
  1. df_level=df['userLevel'].value_counts().reindex(range(7))
  2. from pyecharts import Pie
  3. pie=Pie("用户等级分布",title_pos="center",width=900)
  4. pie.add("levels distribution",["level "+str(i) for i in range(7)],df_level.values,is_random=True,radidus=[30,45],legend_pos='left',rosetype='area',legend_orient='vertical',is_label_show=True,label_text_size=20)
  5. pie

9ebd4c2bgy1fu66mxp9crj20p00b4gmb.jpg

  • 至此基本数据分析完成,后续会开始于其评论数据的挖掘
 
 
 
 
 
 
 

posted on 2018-08-11 23:37 多一点 阅读(...) 评论(...) 编辑 收藏

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/47170
推荐阅读
相关标签
  

闽ICP备14008679号