利用Python和Power BI做Yelp大数据分析项目
利用Python和Power BI做Yelp大数据分析项目
项目介绍:
1.项目需求:
寻找影响用户对商户评价和评分的关键因素有哪些?
2.项目难点:
数据量比较大,数据清洗后需要重点观察的指标,如review_id记录超过668万条,user_id记录超过163万条,bussiness_id记录超过19万条,funny记录超过322万条,useful记录超过905万条,cool记录超过386万条。
3.分析思路:
1.分别从用户和商户两个方面,对其各方面指标进行观察分析;
2.利用多种方法对相关指标的概况进行描述分析,观察极值、均值等;
3.利用关键影响因素等方法,实现项目需求。
4.处理步骤:
1.利用Python在Jupyter Notebook中对各数据集进行清洗和处理;
2.利用Power BI对字段作简单处理并作可视化;
3.利用多种方法观察各指标对review的影响,实现项目需求。
处理流程如下:
第一部分:利用Python在Jupyter Notebook中观察、清洗和处理数据。Python代码和运行截图如下所示:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime as dt
from numpy import nan as NA
import warnings
warnings.filterwarnings(“ignore”)#取消警告内容
plt.rcParams[‘font.sans-serif’]=[‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’]=False #用来正常显示负号
第一步:观察数据集
#依次载入数据集,观察分析项目需求
#business_data=pd.read_csv(“business.csv”)
#business_data.head(2)
#tip_data=pd.read_csv(“tip.csv”)
#tip_data.head(10)
#checkin_data=pd.read_csv(“checkin.csv”)
#checkin_data.head(10)
#user_data=pd.read_csv(“user.csv”)
#user_data.head(10)#考虑到数据集较大,将运行结果截图保存,便于观察
#review_data=pd.read_csv(“review.csv”)
#review_data.head()#考虑到数据集较大,将运行结果截图保存,便于观察
第二步:进行数据清洗
1.对business数据进行处理
#business_data.info()#观察数据概况
business_data.head(3)#观察数据概况
#print(business_data.hours)#观察hours数据
##这段代码主要删除多余列,但保留categories后的数据集
business_data_clean1=business_data.drop(business_data.columns[[2,3,5,10,11,13]], axis=1)#暂时删除不考虑的列
business_data_clean2=business_data_clean1.dropna(axis=1,how=“all”)#删除整行为NaN的行值
#business_data_clean2.info()#观察知主要数据指标比较完整
business_data_clean2.head(10)
#business_data_clean2.to_csv(“business_data_clean2.csv”,index=False)#保存清洗后的数据
##这段代码主要删除categories后,构建一个新的数据集
business_data_clean1=business_data.drop(business_data.columns[[2,3,5,10,11,12,13]], axis=1)#暂时删除不考虑的列
business_data_clean2_new=business_data_clean1.dropna(axis=1,how=“all”)#删除整行为NaN的行值
#business_data_clean2.info()#观察知主要数据指标比较完整
business_data_clean2_new.head(10)
#business_data_clean2_new.to_csv(“business_data_clean2_new.csv”,index=False)#保存清洗后的数据
#观察categories的值
#business_data_clean2.categories.head(10)
#business_data_clean2.categories[1]#观察某一个business_id数据
#print(type(business_data_clean2.categories))
categories_cloud1=business_data_clean2.categories.str.split(",")#用 , 分隔categories
#print(type(categories_cloud1))
categories_cloud1.head()
#分段处理categories
categories_cloud2=categories_cloud1.dropna().apply(pd.value_counts)#删除NaN,并统计各类型的值
categories_cloud2.head()
#观察categories的值
categories_cloud2.info()
#分段处理categories
categories_cloud3=categories_cloud2.unstack()#转换为交叉表
categories_cloud3.head(20)
##分段处理categories,并观察数据
categories_cloud4=categories_cloud3.dropna().reset_index()#重构index
categories_cloud4.info()
##分段处理categories,并观察数据
categories_cloud4=categories_cloud3.dropna().reset_index()#重构index
categories_cloud4.head(20)
#分段处理categories
categories_cloud5=categories_cloud4[“level_0”]#罗列各标签
categories_cloud5.head(10)
#categories_cloud5.to_csv(“categories_cloud5.csv”,index=False)#文件大小偏大
categories_cloud5.to_excel(“categories_cloud5.xlsx”,index=False)#文件大小更小
2.对tip数据进行处理
#tip_data.info()#观察数据概况
tip_data_clean1=tip_data.drop(tip_data.columns[2],axis=1)#暂时删除不考虑的列
tip_data_clean2=tip_data_clean1.dropna(axis=1,how=“all”)#删除整行为NaN的行值
tip_data_clean2.info()#观察知主要数据指标比较完整
#print(tip_data_clean2.date[1])#观察数据的值
#print(type(tip_data_clean2.date[1]))#观察数据类型
##处理日期时间
tip_data_clean2.date=tip_data_clean2.date.str.split(" “,expand=True)#将日期与时间分隔
#tip_data_clean2.date
tip_data_clean2.head()
tip_data_clean2[“date_index”]=pd.to_datetime(tip_data_clean2.date,format=”%Y-%m-%d")#将str转换为datetime
#tip_data_clean2.info()#观察date_index的type
tip_data_clean2.head(10)
tip_data_clean3=tip_data_clean2.drop(tip_data_clean2.columns[2],axis=1)#删除原str的date
tip_data_clean3.head()
tip_data_clean3.to_csv(“tip_data_clean3.csv”,index=False)#保存清洗后的数据
3.对checkin数据进行处理
checkin_data.info()#观察数据概况
checkin_data.head(10)
4.对user数据进行处理
#user_data.info()#观察数据概况
#user_data.head(3)
#print(type(user_data))
#user_data.iloc[1][8]
user_data_clean0=user_data.drop(user_data.columns[[11,12,13,14,15,16,17,18,19,20,21]], axis=1)#暂时删除不考虑的列
user_data_clean0.head(3)
##处理yepling_since,变成日期类型
user_data_clean1=user_data_clean0
user_data_clean1.yelping_since=user_data_clean1.yelping_since.str.split(" “,expand=True)#将日期与时间分隔
user_data_clean1.yelping_since
user_data_clean1[“yepling_since_date”]=pd.to_datetime(user_data_clean1.yelping_since,format=”%Y-%m-%d")#将str转换为datetime
user_data_clean1.info()#观察数据概况
user_data_clean2=user_data_clean1.drop(user_data_clean1.columns[3],axis=1)#删除原str的yelping_since
user_data_clean2.info()#观察数据概况
user_data_clean3=user_data_clean2.drop(user_data_clean2.columns[-2],axis=1)#删除原str的yelping_since_year 误操作先添加了year这一列,后面因换名再删除掉
user_data_clean3.head(10)
#user_data_clean3.info()#观察数据概况
#print(type(user_data_clean3.elite[0]))
#print(type(user_data_clean3.elite[1]))
#user_data_clean3.to_csv(“user_data_clean3-2.csv”,index=False)# NaN 则需要在Power BI中处理
#user_data_clean3.to_excel(“user_data_clean3.xlsx”,index=False)# NaN 则需要在Power BI中处理
另第二种方法:直接在这里处理NaN,推荐第一种方法
#user_data_clean4=user_data_clean3.fillna({“elite”:“0”,“friends”:“0”})#将elite 和 friends中的NaN 填充为 str 型 0,方可计算len
#user_data_clean4.elite[1]#观察数据
#print(type(user_data_clean4.elite[1]))
#user_data_clean4.head(10)#观察数据
#user_data_clean4.to_csv(“user_data_clean4.csv”,index=False)
5.对review数据进行处理
review_data.info()#观察数据概况
review_data.head()
review_data_clean1=review_data.drop(review_data.columns[7],axis=1)#暂时删除不考虑的列
review_data_clean1.date=review_data_clean1.date.str.split(" “,expand=True)#将日期与时间分隔
review_data_clean1.date.head()
review_data_clean1[“date_new”]=pd.to_datetime(review_data_clean1.date,format=”%Y-%m-%d")#将str转换为datetime
review_data_clean1.info()#观察数据概况
review_data_clean1.head()
review_data_clean2=review_data_clean1.drop(review_data_clean1.columns[-2],axis=1)#删除原str的yelping_since
review_data_clean2.info()#观察数据概况
review_data_clean2.head()
#review_data_clean2.to_csv(“review_data_clean2.csv”,index=False)#保存清洗后的数据
#载入已处理后的review新数据集,便于观察
#review_data_clean=pd.read_csv(“review_data_clean2.csv”)
#review_data_clean.info()#观察数据概况
#review_data_clean.head()
6.构建日期索引
#方法一:建议在Excel中直接构建日期索引更简洁
#方法二:不推荐:构建日期索引,作为连接所有表的时间线
t_index=pd.date_range(“2004-10-01”,“2018-12-31”)#用起始时间生成日期范围
time_index=pd.DataFrame(t_index)#将生成的index类型转换为DateFrame类型,才能够保存
time_index.to_csv(“time_index.csv”,index=False)#保存时间索引,注意保存后首行会多出一个索引值0,使用时需要删除
time_index.to_excel(“time_index.xlsx”,index=False)#保存时间索引,注意保存后首行会多出一个索引值0,使用时需要删除