124在线民宿 UGC 数据挖掘实战--利用 pyecharts 进行可视化分析

利用 pyecharts 进行可视化分析

数据准备

本次使用数据来自实验一的最后结果,首先使用 Pandas 加载数据,并查看数据维度和第一行数据。

import pandas as pd
data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/2628/1-2.csv')
print(data.shape)
data.head(1)

数据属性如下表所示


image.png

pyecharts 是一个基于 Python 用于生成 Echarts 图表的类库,本次直接可以将可视化的数据图形在 notebook 内部进行展示。


image.png

下面我们开始安装 pyecharts。
!pip install pyecharts==1.6.2

顾客特征分析

用户评论高频词分析
词频分析 (Word Frequency Analysis) 是对文献正文中重要词汇出现的次数进行统计与分析,是文本挖掘的重要手段。 它是文献计量学中传统的和具有代表性的一种内容分析方法,方法繁多。本实验通过简单的词频法即可进行分析,基本原理是通过词出现频次多少的变化,来确定热点及其变化趋势,我们首先加载词频统计模块,并由大到小排序进行展示。

# 加载词频统计模块
from sklearn.feature_extraction.text import CountVectorizer

# 设定 topn 的高频词语阈值,可以根据需要进行改变大小
topn = 500
# 加载统计模块
count_extract = CountVectorizer(max_features=topn)
# 开始对语料进行统计
count_extract.fit_transform(data['text_cut'])

# 输入数据中的每一个词为(word,value)这样的元祖形式,然后将所有的词放入一个list中
comment_count_pair = [(k, int(v))
                      for k, v in count_extract.vocabulary_.items()]

通过用户评论中的高频词分布情况,找出在用户评价中出现频率最高的词语,分析用户兴趣点。 通过顾客对餐馆、饭菜等词语的提及发现用户对餐饮方面关注度较高,同理通过单间、露台、马桶等词语发现顾客对民宿设施有强烈需求,其他方面也可以同理进行分析。

# 加载词云模块
from pyecharts.charts import WordCloud
# 加载 pyecharts 配置模块配置词云显示
from pyecharts import options as opts

comment_wordcloud = WordCloud()
# word_size_range 表示词语大小范围,可以根据需要改变
comment_wordcloud.add(
    series_name="", data_pair=comment_count_pair, word_size_range=[10, 100]
)
# 设置词云的全局配置
comment_wordcloud.set_global_opts(
    title_opts=opts.TitleOpts(title="高频词云分析",
                              # 设置标题文字大小
                              title_textstyle_opts=opts.TextStyleOpts(font_size=15)),
    # 显示词云中的词频数字
    tooltip_opts=opts.TooltipOpts(is_show=True),
)
# 直接在 notebook 中显示词云
comment_wordcloud.render_notebook()

用户等级分析
首先对用户等级进行聚合。

# 提取用户等级信息
user_level_info = data['user_level'].groupby(
    data['user_level']).count().items()

# 将用户等级标签和统计量进行合并成 list
data_level_pair = [[i[0], i[1]] for i in user_level_info]
data_level_pair

通过对用户等级信息进行饼图可视化,我们发现大部分的顾客等级在初级用户在评论中占最多,这些用户可能是初次或者很少居住民宿,初次居住民宿居多,喜好定位还未明确,喜欢尝试不同的民宿风格,仍旧在尝试新鲜期,这类客户属于民宿盈利的关键群体。 第二的达人段位也占了很大的比重,居于第二位,这些顾客往往以回头客居多,已经对民宿有了自己的喜好认知,培养了自己的民宿喜好。第三位的评论等级最高级 master 占到第三位,这类顾客往往以专业点评人 PGC 的身份进行民宿居住,发出的评价内容往往以优质内容为主,以意见领袖 KOL 居多。

# 加载饼图模块
from pyecharts.charts import Pie

# 初始化画布大小
pie = Pie(init_opts=opts.InitOpts(width='660px', height='350px'),)
pie.add(series_name="",
        data_pair=data_level_pair,
        label_opts=opts.LabelOpts(is_show=True,),
        )
# 设置饼图的配置,包含标题、标题的大小、标签显示等
pie.set_global_opts(
    title_opts=opts.TitleOpts(
        title="用户等级分布",
        title_textstyle_opts=opts.TextStyleOpts(font_size=15)),
    tooltip_opts=opts.TooltipOpts(is_show=True),
)

# 设置显示的标签,b 代表是标签信息,c 表示统计信息
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
pie.render_notebook()

顾客评价的时间序列分析
对时间特征进行清洗,去除发表时间中的 "发表于" 字段。

data['post_time_clean'] = data['post_time'].apply(
    lambda x: x.replace('发表于', ''))

# 查看去除后的效果
data.head(1)

按照顾客评论的日期进行统计排名,并取出 topn,了解顾客在民宿居住时间序列上的规律。

# topn 可以根据需要进行收放
topn = 10
data['post_time_clean'].value_counts()[:topn]

开始对用户评价的时间序列信息进行聚合。

# 提取用户评价时间和统计信息
post_time, post_count = [], []
for i in data['post_time_clean'].groupby(data['post_time_clean']).count().items():
    # 取出时间标签
    post_time.append(i[0])
    # 取出计数信息
    post_count.append(i[1])

通过可视化用户评论时间序列,横坐标表示用户评论的时间,纵坐标表示用户评论量。我们可以发现一些规律。通过对序列峰值和 topn 的排序可以了解到,重庆民宿在每年的五一开始直到十一都是民宿业的主要营收时间,通过评论量和订单量的等价映射,订单量在五一和十一期间占比较大。

# 使用折线图
from pyecharts.charts import Line

# 加载图的配置,长宽的参数设置
line = Line(init_opts=opts.InitOpts(width='660px', height='350px'))

# 设置横坐标为时间
line.add_xaxis(post_time)
# 设置纵坐标为用户评论条数
line.add_yaxis("", post_count)
# 设置标题
line.set_global_opts(title_opts=opts.TitleOpts(title='用户评论时间序列图'))

# 设置显示统计量
line.set_series_opts(label_opts=opts.LabelOpts(is_show=True),)
line.render_notebook()

民宿特征分析

民宿店名分析
分词器加载和预热。

import jieba
" ".join(jieba.lcut('测试结巴'))

对民宿店名进行批量分词,并查看第一条分词后的民宿分词结果。

name_cut_list = [' '.join(jieba.lcut(i)) for i in data['hotel_name'].unique()]
name_cut_list[0]

加载词频统计模块,对分词后的民宿店名进行词频统计。

vectorizer = CountVectorizer()
# 导入分词后的店名 list
vectorizer.fit_transform(name_cut_list)

# 将统计信息整理成输入的格式
name_count_pair = [(k, int(v)) for k, v in vectorizer.vocabulary_.items()]
# 打印第一个分词统计量
name_count_pair[0]

通过词云图对民宿店名进行分析,可以了解到当前民宿店名的起名方式也是满足顾客需求,出现的店名关键词如养生、观景、度假、农家乐等,旨在打造与传统的酒店的差异化,减少同质化。顾客在预定的时候直接从名字就可以选择自己喜欢的民宿类型,也为搜索引擎的检索提供方便。

# 加载词云模块
name_wordcloud = WordCloud()

# 设置词云字体大小,并导入统计量信息 name_count_pair
name_wordcloud.add(
    series_name="", data_pair=name_count_pair, word_size_range=[10, 50]
)

# 词云设置标题和大小
name_wordcloud.set_global_opts(title_opts=opts.TitleOpts(
    title="店名特征分析",
    # 设置标题大小
    title_textstyle_opts=opts.TextStyleOpts(font_size=15)),
    tooltip_opts=opts.TooltipOpts(is_show=True), )
name_wordcloud.render_notebook()

顾客满意度分析

用户情感极性分布分析
首先对模型推理出来的用户情感极性保留两位小数,然后进行标签化处理,最后打印出分类聚合的 topn 顾客情感极性排序。

# 批量处理 sa_model_score 列,将模型打分进行保留两位小数进行处理
data['new_sa_model_score'] = data['sa_model_score'].apply(
    lambda x: str(round(x, 2)))

# 打印 topn 的顾客情感极性,可以根据需要进行更改
topn = 5
data['new_sa_model_score'].value_counts()[:topn]

对标签化的用户情感极性进行分类聚合,整理成输入格式。

# 聚合顾客情感极性和统计信息
user_score, user_score_count = [], []
for i in data['new_sa_model_score'].groupby(data['new_sa_model_score']).count().items():
    # 取出顾客情感极性标签
    user_score.append(i[0])
    # 取出计数信息
    user_score_count.append(i[1])

通过对用户细粒度的 topn 排序和打分条形图进行分析,在前 5 的顾客情感极性中,其中 4 项都是用户很好的评价反馈,大部分用户呈现高分分布,整体呈现满意情况。但是排在第 3 位的是用户极低的用户反馈,说明在民宿中仍旧存在用户不满意的方面,后续实验将通过细粒度的用户极性反馈研究用户在那些方面产生了不满意。

from pyecharts.charts import Bar

# 初始化饼图
bar = Bar(init_opts=opts.InitOpts(width='660px', height='350px'))

# 横坐标为用户真实打分
bar.add_xaxis(user_score)
# 纵坐标为顾客情感极性的统计量,不设置纵坐标的名字
bar.add_yaxis("", user_score_count)

# 设置图表的名字
bar.set_global_opts(title_opts=opts.TitleOpts(title='Customer_Satisfaction'))

# 设置数据展示
bar.set_series_opts(label_opts=opts.LabelOpts(is_show=False),)

# 直接在 jupyter 上进行显示
bar.render_notebook()

用户情感极性占比分析
对用户情感极性进行保留一位和标签化处理,并打印出顾客情感极性聚合的 topn 排序。

data['pie_sa_model_score'] = data['sa_model_score'].apply(
    lambda x: str(round(x, 1)))

# 打印 topn 的顾客情感极性,可以根据需要进行改变
topn = 5
data['pie_sa_model_score'].value_counts()[:topn]

将数据进行聚合并处理成输入格式。

# 提取处理之后的用户情感统计信息
data_pie_info = data['pie_sa_model_score'].groupby(
    data['pie_sa_model_score']).count().items()

# 将用户等级标签和统计量进行合并成 list
data_pie = [[i[0], i[1]] for i in data_pie_info]
# 打印第一个标签和统计量
data_pie[0]

通过粗粒度的用户标签聚合,超过 9 成的顾客意见情感极性呈现积极,并且整体满意度较好,但是用户负反馈排在了第二位,虽然整体占比不大,但是确实对整体的评分数影响比较大,在不改变原有体验的情况下,了解这部分人的需求并积极改善对提高整体顾客满意度指数有很大的帮助。

# 初始化饼图大小
pie = Pie(init_opts=opts.InitOpts(width='560px', height='350px'),)

# 导入聚合的用户极性数据
pie.add(series_name="",
        data_pair=data_pie,
        label_opts=opts.LabelOpts(is_show=False,),
        )

# 在 notebook 中显示
pie.render_notebook()

预览最终的数据文件:

data.head(1)

建议对策:通过三阶段分析得出,大部分顾客在五一和十一期间计划出游并且对民宿的需求旺盛,可以看出此部分顾客有着稳定的出游计划,属于职业人群体,另小部分群体以暑假出游,属于学生群体,通过用户等级分布看出以首次和次首次群体为主,并且大部人顾客以体验为主,未来可以培养成为稳定客户。对于提升入住率,店家可以针对在职人提供双节预定优惠或者打折活动,吸引更多的顾客前来体验,并通过拉新提供折扣的方式对自己的民宿进行宣传,为了提升曝光和检索效率,民宿起名和特征词应该增加差异化,可以因地制宜并增加休闲和娱乐。

你可能感兴趣的:(124在线民宿 UGC 数据挖掘实战--利用 pyecharts 进行可视化分析)