Yelp数据集数据分析

数据说明

  • business_id门店ID
  • Date 日期
  • Rating 评分
  • Content 评价内容
  • Review_auther 点评作者
  • Review_image 点评插图
  • Reactions 互动
  • Replies 回复
  • review_order 点评序号(针对同一家店)
  • Eelite_status 表示点评作者是否具有elite标识
  • check-in_status 表示点评作者是否在门店办理了入住手续
  • business_name 被点评的门店名称
1
2
3
4
5
6
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from wordcloud import WordCloud
import matplotlib
1
2
3
# 设置matplotlib字体为SimHei
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号
1
2
3
4
5
6
7
8
# 数据集文件路径
file_path = "C:\\Users\\28696\\Desktop\\人工智能\\yelp\\Yelp businesses reviews.csv"

# 读取数据集
df = pd.read_csv(file_path)

# 数据清洗
df.dropna(subset=['Rating'], inplace=True)

1、评分分布与变化趋势:

分析整个数据集中评分的平均值、中位数、标准差等统计指标
了解整体评分水平

1
2
3
4
5
6
7
8
9
10
11
12
# 计算基本统计指标
mean_rating = df['Rating'].mean()
median_rating = df['Rating'].median()
std_dev_rating = df['Rating'].std()
min_rating = df['Rating'].min()
max_rating = df['Rating'].max()

print(f"平均评分: {mean_rating}")
print(f"中位数评分: {median_rating}")
print(f"标准差: {std_dev_rating}")
print(f"最小评分: {min_rating}")
print(f"最大评分: {max_rating}")
平均评分: 3.869
中位数评分: 5.0
标准差: 1.4317433041187548
最小评分: 1
最大评分: 5
1
2
3
4
5
6
# 绘制评分分布图
df['Rating'].hist(bins=20, alpha=0.7, color='blue')
plt.title('评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()


output 6 0

时间趋势分析

1
2
3
4
5
6
# 时间趋势分析
monthly_ratings = df['Rating'].resample('M').mean().plot()
monthly_ratings.set_title('每月平均评分')
monthly_ratings.set_xlabel('日期')
monthly_ratings.set_ylabel('平均评分')
plt.show()


output 8 0

2、Elite用户影响力分析:

分析Elite(精英)用户的评论数量、内容特点以及对其他用户Reactions(点赞、收藏等)的影响
进行Elite用户影响力分析,可以从以下几个步骤入手:
(1)筛选Elite用户评论:从数据集中筛选出标记为Elite的用户评论。
(2)计算Elite用户评论数量:统计Elite用户评论的总数。
(3)分析Elite用户评论内容:可以对Elite用户的评论文本进行文本分析,比如词频分析、情感分析等。
(4)分析Elite用户评论的Reactions:统计Elite用户评论的点赞、收藏等互动数量,并与其他用户进行比较

1
2
3
4
5
# 检查 'Eelite_status' 字段
print(df['Eelite_status'].unique())

# 筛选出 'Eelite_status' 不是 NaN 且包含 'Elite' 的评论
elite_reviews = df[pd.notnull(df['Eelite_status']) & (df['Eelite_status'].str.contains('Elite', case=False, na=False))]
[nan 'Elite from 2023']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 计算Elite用户评论数量
elite_review_count = elite_reviews.shape[0]
print(f"Elite用户评论数量: {elite_review_count}")

# 绘制Elite用户评论数量的直方图
elite_reviews['Rating'].hist(bins=20, alpha=0.7, color='blue')
plt.title('Elite用户评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.show()

# 绘制Elite用户评论的Reactions(互动,如点赞、收藏等)数量直方图
elite_reviews['Reactions'].hist(bins=20, alpha=0.7, color='green')
plt.title('Elite用户评论Reactions数量')
plt.xlabel('Reactions数量')
plt.ylabel('数量')
plt.show()
Elite用户评论数量: 3

output 11 1

output 11 2

结论

(1)评分较高:Elite用户普遍给出较高的评分,这可能表明他们对商户的整体体验感到满意。
(2)Reactions认可:某些评论在特定的Reactions类别中获得了认可,这可能表明这些评论在某些特定方面(如幽默感、酷感)特别突出或引人注目。

进一步分析建议

  • 深入分析Reactions:可以进一步分析哪些评论获得了较多的Reactions,特别是那些在多个类别中都获得认可的评论。
  • 评论内容分析:对Elite用户的评论内容进行文本分析,识别他们特别关注或满意的方面。
  • 时间趋势分析:如果数据集包含时间戳,可以分析Elite用户评分和Reactions随时间的变化趋势,了解是否有季节性或趋势性的变化。

3、图片对评论的影响力分析:

统计Review_image存在的比例,分析包含图片的评论与无图片评论的Rating差异,了解图片是否对评分有显著影响
要进行图片对评论影响力分析,我们可以采取以下步骤:
(1)统计包含图片的评论比例:计算数据集中包含图片(Review_image 字段非空)的评论数量,并与总评论数量进行比较。
(2)分析包含图片的评论与无图片评论的评分差异:比较包含图片的评论的评分(Rating)与无图片评论的评分,看是否存在显著差异。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 计算包含图片的评论比例
image_reviews = df[df['Review_image'].notnull()]
no_image_reviews = df[df['Review_image'].isnull()]

total_reviews = df.shape[0]
image_review_count = image_reviews.shape[0]
no_image_review_count = no_image_reviews.shape[0]

image_review_percentage = (image_review_count / total_reviews) * 100
no_image_review_percentage = (no_image_review_count / total_reviews) * 100

print(f"包含图片的评论比例: {image_review_percentage:.2f}%")
print(f"不包含图片的评论比例: {no_image_review_percentage:.2f}%")

# 计算包含图片的评论的平均评分
mean_rating_image = image_reviews['Rating'].mean()
print(f"包含图片的评论的平均评分: {mean_rating_image:.2f}")

# 计算不包含图片的评论的平均评分
mean_rating_no_image = no_image_reviews['Rating'].mean()
print(f"不包含图片的评论的平均评分: {mean_rating_no_image:.2f}")

# 绘制包含图片和不包含图片评论的评分直方图
plt.figure(figsize=(10, 6))
plt.hist([image_reviews['Rating'], no_image_reviews['Rating']], bins=20, alpha=0.7, label=['有图片', '无图片'])
plt.title('包含图片和不包含图片评论的评分分布')
plt.xlabel('评分')
plt.ylabel('数量')
plt.legend()
plt.show()
包含图片的评论比例: 17.90%
不包含图片的评论比例: 82.10%
包含图片的评论的平均评分: 4.21
不包含图片的评论的平均评分: 3.79

output 14 1

结论

  • 图片对评分的影响:包含图片的评论平均评分显著高于不包含图片的评论,这可能表明图片在一定程度上提高了用户的满意度,从而影响了他们的评分。这可能是因为图片可以更直观地展示商户的产品或服务,增加了评论的可信度和吸引力。
  • 用户行为:较少的用户选择在评论中添加图片,但这些用户可能更倾向于给出更高的评分。这可能意味着他们对商户的体验非常满意,希望通过图片进一步支持他们的正面评价。

进一步分析建议

  • 深入分析图片内容:可以进一步分析图片的内容,了解哪些类型的图片(如食品、环境、服务等)更常见,以及这些图片是否与更高的评分相关联。
  • 评论文本分析:结合评论文本内容,分析图片评论中常见的关键词或短语,了解用户在哪些方面特别满意。
  • 时间因素:如果数据集包含时间戳,可以分析不同时间段内图片评论的比例和评分是否有变化,了解是否存在季节性或趋势性的影响。

4、点评序号与评分关系:

观察review_order与Rating之间的关系,研究随着点评数量的增长,新近点评的评分是否趋于稳定、是否存在“新鲜感”效应(即新开业或新加入Yelp的商家初期评分偏高)
要分析点评序号(review_order)与评分(Rating)之间的关系步骤如下:

  • 排序:根据点评序号对数据进行排序,确保点评序号是连续的。
  • 计算平均评分:按点评序号分组,计算每个组别的平均评分。来确保每个商户的评分是按时间顺序计算的
  • 绘制趋势图:绘制点评序号与平均评分的关系图,观察评分是否趋于稳定或存在“新鲜感”效应。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 设置matplotlib字体为SimHei
import matplotlib
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False # 正确显示负号

# 你的数据集文件路径
file_path = "C:\\Users\\28696\\Desktop\\人工智能\\yelp\\Yelp businesses reviews.csv"

# 读取数据集
df = pd.read_csv(file_path)

# 数据清洗
df.dropna(subset=['Rating', 'review_order'], inplace=True)

# 确保review_order是整数类型,同时处理NaN值
df['review_order'] = pd.to_numeric(df['review_order'], errors='coerce')

# 过滤掉非有限值
df = df[pd.isna(df['review_order']) == False]

# 按business_id分组,并按review_order排序
df_sorted = df.sort_values(by=['business_id', 'review_order'])

# 计算每个商户的评分平均值
average_ratings = df_sorted.groupby('business_id')['Rating'].rank(method='min').reset_index()

# 绘制点评序号与评分的关系图
plt.figure(figsize=(12, 6))
for business_id, group in df_sorted.groupby('business_id'):
plt.plot(group['review_order'], group['Rating'], marker='o', label=f'Business {business_id}')

plt.title('点评序号与评分关系')
plt.xlabel('点评序号')
plt.ylabel('评分')
plt.legend(title='商户ID')
plt.show()


output 17 0

结论

  • 评分趋势:如果评分随着点评序号的增加而趋于稳定,这可能表明用户对商户的评价逐渐趋于一致,没有明显的“新鲜感”效应。
  • 新鲜感效应:如果初期评分较高,随着点评数量的增加评分逐渐下降,这可能表明存在“新鲜感”效应,即新开业或新加入Yelp的商家初期评分偏高。

进一步分析建议

  • 时间序列分析:考虑时间因素,分析评分随时间的变化趋势。可以使用时间序列分析方法,如ARIMA模型,来预测评分的变化。
  • 商户类别分析:分析不同类别的商户是否存在不同的评分趋势。例如,餐饮业和服务业的评分趋势可能有所不同。
  • 用户行为分析:结合用户的行为数据(如用户评分习惯、评论频率等),分析用户行为对评分的影响。
  • 文本分析:对评论内容进行文本分析,提取关键词或情感倾向,分析评论内容与评分之间的关系。
  • 聚类分析:对商户进行聚类分析,找出评分趋势相似的商户群体,分析其共同特征。
  • 异常值检测:检测评分数据中的异常值,分析这些异常值背后的原因,如是否是恶意评分或虚假评论。