admin管理员组

文章数量:1571359

在互联网浪潮的推动下,电商已经深刻改变了人们的消费习惯,消费者对商品的评论也具有重要的意义。于商家而言,能通过评论了解消费者对产品或服务的看法,进而更好地了解消费者的情感倾向、市场需求以及产品改进的方向。在此,对京东上一款较火的笔记本电脑评论进行数据分析。

一.数据爬取

数据爬取主要使用requests库。爬取之前首先对url进行分析,url的具体结构如下。

url = ('https://club.jd/comment/productPageComments.action?'  
                   '&productId=100052135186'  # 商品ID
                   f'&score={j+1}'  # 0表示全部,1表示差评,2表示中评,3表示好评,5追加
                   '&sortType=5' 
                   f'&page={i+1}'  # 页面数
                   '&pageSize=10'  # 每页评论数
                   '&isShadowSku=0'
                   '&fold=1')

对url进行分析后,就要在网页上查找自己所需的数据,可以看到评论的相关信息可以通过json获取自己所需要的。

从json中获取的信息,因为有些评论是没有地址显示的,所以做了判断处理:

response = requests.get(url=url, headers=headers)
json=response.json()
data=json['comments']
for t in data:
    id = t['id']                       #评论id
    creationTime = t['creationTime']   #评论时间
    content = t['content']             #内容
    score = t['score']                 #星数
    rate = j + 1                       #评论类型  1表示差评,2表示中评,3表示好评,5追加
    version = t['productSize']         #版本
    size = t['productColor']           #类型配置
    productId = t['referenceId']       #产品id(版本+尺寸)
    if 'location' in t :
        location = t['location']       #发表评论的位置
    else :
        location = '未知'

即便是有20w+的评论,但是京东上面最多只显示100页,估计只显示最新的评论信息。为了尽可能的获取评论数量,所以分别获取好评、差评、中评以及追评的评论数据,但是追评数据可能又有包含好/中/差评的内容,所以要先对追评的数据进行爬取,然后在获取好/中/差评时,根据id是否存在进行数据的爬取。

那么一共是获取到2771条的评论数据,数据量虽少,但是无论数据的多少,重要的是数据分析的思路,2771条也能进行简单的分析。

二.数据处理

1.数据的完整性检验

 使用info对数据进行检查,数据没有缺失。

在网页上可以看到评论的数量,即便是除去追评也不应该只有2771条数据,所以具体查看一下是什么原因导致的。

可以看到,好评跟差评的数据是正常获取的,中评和追评的数据就感觉缺少了很多,追评只有190条,可以去网页查看一下,0条大概就是20页左右。

到21页追评就没有数据了,好家伙,原来是碟中谍(叠中叠),估计是商家隐藏了一些重复性的数据又或者有可能是有水军(机器人)。中评的情况也是如此,这也反应了获取数据的代码是没有问题的。

2.数据的预处理

从上图的数据显示来看,这些评论数据是需要进行处理的,首先是对时间的格式进行处理,只需要年月日即可,年月日与后面的时间中间是用空格隔开的,所有可以用split进行分割获取时间。

from datetime import datetime
for i in range(len(comment_data_all)):
    comment_data_all['creationTime'][i] = comment_data_all['creationTime'][i].split(' ')[0]

有些数据的版本(version)和配置(size)混淆的,通过观察主要是MateBook 14和无版本这些评论信息出现这种情况,在处理混淆数据的同时还要为缺少的版本号赋值MateBook 14。

for i in range(len(comment_data_all)):
    if 'MateBook 14' in comment_data_all['size'][i] or comment_data_all['size'][i] == '' :
        t = comment_data_all['size'][i]
        comment_data_all['size'][i] = comment_data_all['version'][i]
        comment_data_all['version'][i] = t
    if comment_data_all['version'][i] == '':
        comment_data_all['version'][i] = 'MateBook 14'

通过检查,确定所有的版本(version)和配置(size)调整正确。

有些评论内容是进行换行的,爬取之后评论内容就会显示\n,使用replace将\n换成空格符。

for i in range(len(comment_data_all)):
    if '\n' in comment_data_all['content'][i] :
        comment_data_all['content'][i] = comment_data_all['content'][i].replace('\n',' ')

检查数据,评论内容修改完毕。

3.数据备份或保存

这里使用两种方式,第一种是保存为csv文件,第二种是保存到MySQL数据库。

①备份/保存为csv文件。

comment_data_all.to_csv('comment_data.csv',encoding='utf-8')

导出的csv文件可能会出现乱码的情况,这跟评论内容含有表情等特殊符号有关系,可以使用VsCode打开,然后修改编码格式,选择 UTF-8 with BOM 格式保存就能解决。

②保存到MySQL数据库。

from datetime import datetime
from sqlalchemy import  create_engine,text
import pymysql
 
#  root:mysql用户名
#  123321:我的密码
#  pytest:数据库名,要先创建
#  name='表名'   
engine=create_engine('mysql+pymysql://root:123321@localhost/pytest?charset=utf8mb4')
comment_data_all.to_sql(name='comment_data',con=engine,index=False,if_exists='replace')

三.数据分析

1.词云分析

分别从好/中/差评中提取20个高频词用来制作词云图,可以大致的了解到消费者对这款电脑产品的使用感受或者对服务的满意程度,从而制定更好营销策略以及产品改进方向。

import jieba
import jieba.analyse as anls
import pickle
import wordcloud
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

stop_words = open(r"停用词.txt",encoding='utf-8').read().split("\n")

for i in range(1,4):
    title = " ".join(comment_data_all[comment_data_all['rate'] == i]['content']) 
    #topK 关键词个数
    keywords = anls.extract_tags(title, topK=30, withWeight=True) 
    keyword = []  #词
    keyweight = [] #权重值
    for word, weight in keywords:
        keyword.append(word)
        keyweight.append(weight)
 
    keyword = " ".join(keyword) 
    word = "".join(jieba.lcut(keyword))
    wc = wordcloud.WordCloud(
        width=700,
        height=700,
        background_color="white",
        scale=15,
        font_path="msyh.ttc",
        stopwords = stop_words
    )
    wc.generate("".join(word))
    plt.imshow(wc)
    plt.title(f"rate{i}")
    plt.show()

差评词云图(rate1):结合词云图和部分评论,部分消费者不认可客服的服务与售后,服务与售后或许还有提升空间;消费者对商品降价不满,但这是不可避免的,可以在降价活动期间提高宣传;最后就是消费者对没有配备鼠标感到不满,以后的新品可以考虑配备鼠标。

中评词云图(rate2):跟差评的情况相差不大,主要是客服服务、没有配备鼠标与降价让部分消费者不满意,部分消费者的电脑存在开机和屏幕问题,客服可以提高这两方面的产品知识,这样可以更加快速的解决消费者遇到的相关问题。

好评词云图(rate3):消费者对电脑的屏幕、外观、运行速度感到满意。从中也可以得出消费者对电脑产品的关注点,未来的电脑产品方向可以以外观轻薄、高画质屏幕显示、快速运行等方面进行发展。

2.收货地区分析

评论地区大概率就收货地区,可以根据地区收货数来配备各个地区的货源数量。

comment_location = comment_data_all[comment_data_all['location'] != '未知']
loc_com = comment_location.groupby('location')['id'].count().reset_index().rename(columns={'id':'total'})
loc_com = loc_com.sort_values('total',ascending=False)
loc_total = loc_com[:10]
loc_total.loc[len(loc_total)] = ['其他',loc_com['total'][11:].sum()]
loc_total = loc_total.sort_values('total',ascending=False)

plt.figure(figsize=(12, 12))  # 设置图像大小
plt.pie(loc_total['total'], labels=loc_total['location'], autopct='%1.1f%%', startangle=90)
plt.title('地区数量占比')
 
# 显示图像
plt.show()

除去未知地区,制作饼图,数量前十的显示占比,之后的归为其他。

从图可得,应该在广东、北京、江浙沪这些区域配备更多的产品,这样不但可以减少运输成本,还能让消费者更快的收到产品,有助于提高消费者的购物满意度。

3.产品分析

产品分析是根据用户购买电脑配置的数量进行分析,选取选择数量前五制作水平条形图。

size_data = comment_data_all.groupby('size')['id'].count().reset_index().rename(columns={"id":"total"})
size_data = size_data.sort_values('total',ascending=True)

# plt.figure(figsize=(8,8))

# 创建柱状图
plt.barh(range(len(size_data['total'][len(size_data)-5:len(size_data)])), size_data['total'][len(size_data)-5:len(size_data)], align='center',color='lightblue')
 
# 在每个柱子上添加数值标签
for i, v in enumerate(size_data['total'][len(size_data)-5:len(size_data)]):
    plt.text(v, i, str(v), va='center', ha='right')
 
# 设置Y轴标签
plt.yticks(range(len(size_data['total'][len(size_data)-5:len(size_data)])), size_data['size'][len(size_data)-5:len(size_data)])

plt.title('配置购买数量直方图')
plt.xlabel('数量')
plt.ylabel('配置')
# 显示图形
plt.show()size_data = comment_data_all.groupby('size')['id'].count().reset_index().rename(columns={"id":"total"})
size_data = size_data.sort_values('total',ascending=True)

# plt.figure(figsize=(8,8))

# 创建柱状图
plt.barh(range(len(size_data['total'][len(size_data)-5:len(size_data)])), size_data['total'][len(size_data)-5:len(size_data)], align='center',color='lightblue')
 
# 在每个柱子上添加数值标签
for i, v in enumerate(size_data['total'][len(size_data)-5:len(size_data)]):
    plt.text(v, i, str(v), va='center', ha='right')
 
# 设置Y轴标签
plt.yticks(range(len(size_data['total'][len(size_data)-5:len(size_data)])), size_data['size'][len(size_data)-5:len(size_data)])

plt.title('配置购买数量直方图')
plt.xlabel('数量')
plt.ylabel('配置')
# 显示图形
plt.show()

那么根据消费者的购买情况,内存16G、CPU i5、固态硬盘512G/1T、皓月银这些配置参数更受消费者青睐,未来设计新的产品,商家可以参看以上五款笔记本电脑配置的优点。

以上是购买数量少的配置,这些配置部分是新发布的,或者性价比较低,亦或是配置产品力不被认可的,商家以后设计新品的时候,可以避免这些配置存在的缺点。

4.时间分析

时间分析可以很好的观察到消费者什么时候对电脑产品购买力高,也能观察到这款电脑产品大致的销售趋势。

提取出年、月,根据月份分类,观察哪些月份电脑产品的销量高。

month_data = comment_data_all.groupby('month')['id'].count().reset_index().rename(columns={"id":"total"})

x = month_data['month']
y = month_data['total']

plt.figure(figsize=(8,8))

# 创建折线图
plt.plot(x, y, 'o-')  # 'o-' 表示带有圆点标记的线
 
# 为每个数据点添加文本标签
for i in range(len(x)):
    plt.text(x[i], y[i], str(y[i]))  # 在每个点的旁边显示y值

plt.title('各月份销售数量')
plt.xlabel('月份')
plt.ylabel('数量')
plt.show()

5-6月份销售数据是出于上升阶段,这应该与618购物活动有关系;7-9月也是上升趋势的,这应该与开学季有关系;11月是一年销售数量最高的时候,看来很多消费者会选择在双十一购买电脑产品,这几个时间点,商家可以提前备好产品;4-5月份的销售数量是最低的。

接下来看年度销量。

year_data = comment_data_all.groupby('year')['id'].count().reset_index().rename(columns={"id":"total"})
 
values = year_data['total']
bars = year_data['year']

plt.figure(figsize=(6,6))
plt.bar(bars, values, color=('r', 'g', 'b', 'y'), alpha=0.8)
 
for bar, value in zip(bars, values):
    plt.text(bar, value, value, ha='center', va='bottom')
 
# 设置标题和轴标签
plt.title('年销售数量')
plt.xlabel('年')
plt.ylabel('数量')
 
plt.show()

从2021年以来,该款笔记本电脑的销量都是在上升的,虽然2024年还没有结束,但是现在只是4月初,销售高峰的月份还没有到,估计2024年这款笔记本电脑销量会比2023年更上一层楼。

5.情感分析

由于爬取的数据好评与差评合计就差不多2000条,这里做情感分析没有意义,仅提供操作过程进行参考,不作具体的分析。

import snownlp
import seaborn as sn
import matplotlib

sentiment = comment_data_all['content'].apply(lambda x:snownlp.SnowNLP(x).sentiments)

pd.set_option('display.max_rows', None)  # 显示所有行
matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['font.size']=12
matplotlib.rcParams['axes.unicode_minus']=False
ax=sn.distplot(sentiment,hist_kws={'color':'deepskyblue'},kde_kws={'color':'orange'},bins=20)
ax.set_title("消费者评论情感倾向")
plt.show()

四.仪表盘

使用tableau搭建仪表盘。

本文标签: 品牌电脑京东