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

导入相关库

from pyecharts import Bar,Pie
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time

数据清洗与简单统计

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

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

时间格式的转化

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

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

  • 按周统计
df['commentTime']=pd.to_datetime(df['commentTime'])
df['weekday'] = df['commentTime'].dt.weekday
df2= df.groupby(['weekday']).size()
# 周末吃外卖的还是教平时多了一些
from pyecharts import Bar
bar =Bar("按周统计",width=750,height=400)
weekday=["一","二","三","四","五","六","日"]
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)
bar

  • 按天统计
df['commentTime']=pd.to_datetime(df['commentTime'])
df['day'] = df['commentTime'].dt.day
df2= df.groupby(['day']).size()
df2
from pyecharts import Bar
bar =Bar("按天统计",width=1000,height=400)
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)
bar

  • 按时统计
df['commentTime']=pd.to_datetime(df['commentTime'])
df['hour'] = df['commentTime'].dt.hour
df2= df.groupby(['hour']).size()
df2
from pyecharts import Bar
bar =Bar("按时统计",width=1000,height=600)
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)
bar

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

套餐的统计

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

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

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

套餐与评价汇总

# df.groupby(['menu','star']).size().to_excel("all_menu_star.xls") 可以直接导出到excel
df.groupby(['menu','star']).size()
menu                      star
2人午晚餐 10 329
20 533
30 2002
40 2704
50 2072
4人午/晚自助 10 131
20 68
30 432
40 414
50 536
6人午/晚自助 10 8
30 112
40 142
50 245
单人下午自助烤肉 10 98
20 20
30 208
40 144
50 169
单人午/晚自助 30 10
40 27
50 30
单人午晚餐 10 106
20 298
30 1215
40 1208
50 1093
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 20 10
30 46
40 66
50 87
周一至周五自助烤肉,免费WiFi 50 22
学生专享午晚自助 10 101
20 191
30 529
40 954
50 863
dtype: int64
df.groupby(['star','menu',]).size()
star  menu
10 2人午晚餐 329
4人午/晚自助 131
6人午/晚自助 8
单人下午自助烤肉 98
单人午晚餐 106
学生专享午晚自助 101
20 2人午晚餐 533
4人午/晚自助 68
单人下午自助烤肉 20
单人午晚餐 298
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 10
学生专享午晚自助 191
30 2人午晚餐 2002
4人午/晚自助 432
6人午/晚自助 112
单人下午自助烤肉 208
单人午/晚自助 10
单人午晚餐 1215
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 46
学生专享午晚自助 529
40 2人午晚餐 2704
4人午/晚自助 414
6人午/晚自助 142
单人下午自助烤肉 144
单人午/晚自助 27
单人午晚餐 1208
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 66
学生专享午晚自助 954
50 2人午晚餐 2072
4人午/晚自助 536
6人午/晚自助 245
单人下午自助烤肉 169
单人午/晚自助 30
单人午晚餐 1093
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 87
周一至周五自助烤肉,免费WiFi 22
学生专享午晚自助 863
dtype: int64
  • 评分最高的套餐分布
df.groupby(['star','menu',]).size()[50]
menu
2人午晚餐 2072
4人午/晚自助 536
6人午/晚自助 245
单人下午自助烤肉 169
单人午/晚自助 30
单人午晚餐 1093
周一至周五自助烤肉/周六日及节假日自助烤肉2选1 87
周一至周五自助烤肉,免费WiFi 22
学生专享午晚自助 863
dtype: int64

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

评分与用户等级汇总

df.groupby(['star','userLevel',]).size()
star  userLevel
10 0 187
1 139
2 164
3 193
4 80
5 10
20 0 223
1 88
2 304
3 294
4 207
5 21
30 0 1147
1 405
2 1057
3 1230
4 570
5 165
6 20
40 0 870
1 432
2 1360
3 1751
4 1026
5 261
6 25
50 0 698
1 386
2 1167
3 1670
4 802
5 318
6 130
dtype: int64
df_level_star = df.groupby(['userLevel','star']).size()
attr = np.arange(10,60,10) from pyecharts import Bar
bar = Bar("用户等级与评分",title_pos="center")
df_0 = df_level_star[0].values
df_1 = df_level_star[1].values
df_2 = df_level_star[2].values
df_3 = df_level_star[3].values
df_4 = df_level_star[4].values
df_5 = df_level_star[5].values
# df_6 = df_level_star[6].values
df_6 = df_level_star[6].reindex(attr).fillna(0).values bar.add("level 0",attr,df_0,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
bar.add("level 1",attr,df_1,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
bar.add("level 2",attr,df_2,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
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)
bar.add("level 4",attr,df_4,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
bar.add("level 5",attr,df_5,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
bar.add("level 6",attr,df_6,is_label_show=True,legend_pos='right',legend_orient='vertical',label_text_size=12)
bar

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

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

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

df['userLevel'].value_counts().reindex(range(7))
0    3125
1 1450
2 4052
3 5138
4 2685
5 775
6 175
Name: userLevel, dtype: int64
  • 用户等级分布
df_level=df['userLevel'].value_counts().reindex(range(7))
from pyecharts import Pie
pie=Pie("用户等级分布",title_pos="center",width=900)
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)
pie

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

基于pandas python的美团某商家的评论销售数据分析(可视化)的更多相关文章

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

    数据初步的分析 本文是该系列的第一篇 数据清洗 数据初步的统计 第二篇 数据可视化 第三篇 数据中的评论数据用于自然语言处理 from pyecharts import Bar,Pie import ...

  2. 基于pandas python sklearn 的美团某商家的评论分类(文本分类)

    美团店铺评价语言处理以及分类(NLP) 第一篇 数据分析部分 第二篇 可视化部分, 本文是该系列第三篇,文本分类 主要用到的包有jieba,sklearn,pandas,本篇博文主要先用的是词袋模型( ...

  3. python – 基于pandas中的列中的值从DataFrame中选择行

    如何从基于pandas中某些列的值的DataFrame中选择行?在SQL中我将使用: select * from table where colume_name = some_value. 我试图看看 ...

  4. [转发]Android视频技术探索之旅:美团外卖商家端的实践

    美团技术团队 2019-09-12 20:02:11 背景 2013年美团外卖成立,至今一直迅猛发展.随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸 ...

  5. 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境

    基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...

  6. 解决基于BAE python+bottle开发上的一系列问题 - artwebs - 博客频道 - CSDN.NET

    解决基于BAE python+bottle开发上的一系列问题 - artwebs - 博客频道 - CSDN.NET 解决基于BAE python+bottle开发上的一系列问题 分类: python ...

  7. 手写数字识别 ----在已经训练好的数据上根据28*28的图片获取识别概率(基于Tensorflow,Python)

    通过: 手写数字识别  ----卷积神经网络模型官方案例详解(基于Tensorflow,Python) 手写数字识别  ----Softmax回归模型官方案例详解(基于Tensorflow,Pytho ...

  8. 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译)

    目录 制作属于自己的翻译软件(基于PyQt5+Python+实时翻译) 翻译软件上传到github上. 软件截图 主要的思想 界面方面 程序方面 制作属于自己的翻译软件(基于PyQt5+Python+ ...

  9. 数据分析04 /基于pandas的DateFrame进行股票分析、双均线策略制定

    数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 目录 数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 需求1:对茅台股票分析 需求2 ...

随机推荐

  1. 用plsql 导入导出oracle表结构数据

    一.导出 (1)导出数据 进入pl/sql,"工具"---->"Export Tables...",然后在弹出的对话框中选择要导出的表,最后点击" ...

  2. MySQL on Linux 部署手册

    1. 背景 MySQL为开源数据库,因此可以基于源码实现安装.基于源码安装有更多的灵活性.也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码,根据不同的软件平台环境调整相关的编 ...

  3. PostgreSQL流复制

    原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...

  4. Scala单例对象和伴生对象

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  5. redis资料

    http://snowolf.iteye.com/blog/1630697  征服redis配置 http://redis.readthedocs.org/en/latest/  redis命令参考 ...

  6. [C/E] 等差数列求和

    题目:要求给定一个整数 N,求从 0 到 N 之间所有整数相加之和. 解1:使用 for 循环依次递加. #include <stdio.h> int main(void){ int x; ...

  7. 32位win7+vs2008编译mysql 5.6.22源码并安装

    以下这部分安装说明是来自http://www.2cto.com/database/201407/316681.html的win7+vs2010源码编译mysql,文章最后会说明用vs2008编译遇见的 ...

  8. 【EF框架】EF DBFirst 快速生成数据库实体类 Database1.tt

    现有如下需求,数据库表快速映射到数据库实体类 VS给出的两个选择都有问题,并不能实现,都是坑啊 EF .x DbContext 生成器 EF .x DbContext 生成器 测试结果如下 生成文件 ...

  9. [Apio2008]免费道路[Kruscal]

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1292  Solved:  ...

  10. Linux下进程隐藏的方法及其对抗

    零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...