【数据分析项目实战】基于Python的商铺点评数据分析

说明:这是一个数据分析项目(附带数据+代码),本篇教程来源于网络,胖哥对此进行了完整的梳理,并把用到的数据+代码完全奉上。如需数据+完整代码可以直接到文章最后获取。

项目要求
成功读取“商铺数据.csv”文件
解析数据,存成列表字典格式:[{'var1':value1,'var2':value2,'var3':values,...},...,{}]
数据清洗:
comment,price两个字段清洗成数字
清除字段缺失的数据
commentlist拆分成三个字段,并且清洗成数字
结果存为.pkl文件

原始数据展示
通过爬虫在某点评APP上获取一下店铺数据,包含了7个字段,字段名及其对应的含义分别是:classify(店铺类别),name(店铺名),comment(点评人数),star(星级),price(平均消费),address(地址),commentlist(特定指标评分),以下为部分数据展示:

 

因为直接获取回来的数据并未进行数据清洗,因此存在以下几个问题:

文本数据存在多余的空格(或不可显示的制表符等),需要清除;
1)部分可以量化的指标需要转化为数值格式如星级等,另外平均消费字段中的价格也有多余的文本信息需要删除;
2)可选操作:通过将excel文件转存为pkl文件,不仅可以减少文件大小还可以一定程度对文件内容进行加密;

数据分析
读取数据
基于python有多种文件读取方式,本项目我们采用read_excel方式快速读取原始数据,由于windows系统打开xlsx文件时会在文件开头添加一些字符,因此如果在用Python读取文件前打开过原始数据,则再次读取数据后第一个字段名就不再是原来的字段了,比如说第一个字段名是classify,那么在windows上使用office等软件打开过一次的文件第一个字段名将不再是 classify ,而是前面还有一个字符,因此我们应该尽量避免直接打开xlsx文件,或者在读取文件后重命名字段列表,如下所示:

os.chdir(os.getcwd())
data=pd.read_excel("data.csv",encoding="utf-8")
data.columns=['classify', 'name', 'comment', 'star', 'price', 'address',
       'commentlist']
print(data.head())

 

 

 代码中的os.chdir(os.getcwd())作用是将工作路径设置为脚本所在绝对路径,这在项目所在文件夹进行移动复制的时候尤为管用,不论文件夹在何处,只要文件夹内各文件与脚本的相对位置不变,脚本都可以正确执行,而不用手工设置工作路径。

清洗数据
这里的数据清洗与一般意义上的去除异常值、处理缺失值等不同,更偏向于文本数据的清洗,即将文本数据整理地更规整便于后续分析使用,这里我将按照不同的处理方式分别定义匿名函数,具体代码如下所示:

(1) 直接去除多余空格,其实本例更为简单的做法是使用pandas数据框自带的方法,df['字段1'].str.replace(' ',''),处理效果与使用apply函数调用以下匿名函数完全相同:

remove_blank = lambda x: str(x).replace(" ", "")  # 简单删除空格

(2) 提取评论人数,涉及字符串分割知识即str.split(特定字符):

remove_blank_com = lambda x: int(str(x).replace(" ", "").split("条")[0]) if "条" in str(x) else None  # 提取评论人数

(3) 这里想法是将中文一到五转化为阿拉伯数字1到5,并不考虑准N星与N星的区别,即星级只有整数无小数情况,具体实现过程为构建一一对应的字典,并将原始数据与字典的键进行匹配:

star = {"一": 1, "二": 2, "三": 3, "四": 4, "五": 5}


def get_star(x):
    '''
    提取商户的星级
    '''
    for i in x:
        if i in star.keys():
            return star[i]
        else:
            continue
    # 无星级
    return None


remove_blank_star = lambda x: get_star(str(x))

(4) 清洗价格主要是提取文本信息中的数字部分,并剔除货币符号:

remove_blank_pri = lambda x: round(float(str(x).replace(" ", "").split("¥")[1]), 2) if "¥" in str(x) else None  # 提取价钱

(5) 点评详情数据中有大量多余空格并且数量不一致,因此可以通过以下匿名函数实现清洗工作,该函数为经验得到无特殊思路:

remove_blank_comlist = lambda x: str(x).replace("   ", "").replace("  ", ",").replace(",,", ",")

(6)定义完匿名函数,通过apply函数即可轻松将其应用到整个数据框中,最后再去除缺失值即可,调用方法如下所示:

# 清洗 'classify', 'name', 'address'
data[['classify', 'name', 'address']] = data[['classify', 'name', 'address']].applymap(remove_blank)
data["comment"] = data["comment"].apply(remove_blank_com)
data["star"] = data["star"].apply(remove_blank_star)
data["price"] = data["price"].apply(remove_blank_pri)
data["commentlist"] = data["commentlist"].apply(remove_blank_comlist)

# 清楚缺失值
data = data.dropna()
data.index = range(data.shape[0])

拆分数据
我们注意到commentlist(点评字段)包含了3个评分,因此我们需要将其拆分,为简化处理至设置3个指标——口味、环境和服务,具体代码如下所示:

data["口味"] = pd.Series(
    map(lambda x: round(float(str(x).split(" ")[0][2:]), 1), data["commentlist"]))  # 常数不可迭代,因此不能将 0,1,2作为参数传入lambda
data["环境"] = pd.Series(map(lambda x: round(float(str(x).split(" ")[1][2:]), 1), data["commentlist"]))
data["服务"] = pd.Series(map(lambda x: round(float(str(x).split(" ")[2][2:]), 1), data["commentlist"]))
# data=data[['classify', 'name', 'comment', 'star', 'price', 'address',"口味","环境","服务"]]
print(data.head())

 解析数据
最后解析数据较为简单,即将数据框转换为Json格式再转存pkl文件,Json格式的数据可以看做是字典列表,是网页数据常见的数据结构,具体实现过程如下:

data.to_excel('清洗后的数据.xlsx')

# 2.解析数据
store_data = []
for i in data.index:
    store_data.append(dict(data.iloc[i, :]))
print(store_data)

# 保存数据
import pickle

with open("商铺数据.pkl", "wb") as f:
    pickle.dump(store_data, f)

# 载入数据
with open("商铺数据.pkl", "rb") as f:
    st = pickle.load(f)
print(st)

最终清洗后的数据如下:

 

 数据图形化展示:

1)点评数据图类别占比图

 2)美食类店铺评论数量图

3)口味排名靠前100的店铺

 

 4)服务排名靠前50的商家

5)服务排名靠前50的商家

其它维度的一些分析,可根据清洗后的数据按照不同的维度自行分析,不在一一举例子。

 

完整Python代码和数据集的朋友们,请关注如下微信公众号,回复"商铺点评数据分析实战",即可获取完整内容;

添加胖哥微信:zy10178083,胖哥拉你进去python学习交流群,胖哥会不定期分享干货!

微信公众号:胖哥真不错。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖哥真不错

您的鼓励,将是我最大的坚持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值