京东手机评价分析
为了更熟练地使用python进行数分学习,使用jupyter notebook 交互式python工具开展电商评论类NLP的简单应用和分析
一、数据信息
数据来源:网上开源数据 《京东手机评论.csv》
数据量:3637
原始字段:21
二、分析目的
通过分析评论数据来了解手机类商品的用户体验情况,寻找商品潜在特征与问题,为产品挖掘可优化点;同时,通过分析评论内容,增添用户行为标签。
三、结论
1、手机类产品重点关注点在于品牌、功能、外观。
2、差评用户以及略不满意用户主动反馈的有效信息多于高分好评用户,主要反馈问题在于:店铺人员(客服、售后等),店铺行为(发货、换货、退货等),产品自身(屏幕、充电、电池等)。
3、评价情绪划分:1-3分可归为低情绪;4-5分归为高情绪;低情绪内容主要提供当前可优化点,高情绪内容主要提供未来展望点。
4、因此商家应从运营售后人员以及退换货流程上,定位和排查问题;而手机生产商首要提升手机屏幕和续航的品控;快递方提升配送,派件的效率和质量。
四、探索性数据分析jupyter实现
1、数据导入
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import snownlp
import time
import urllib.request
import urllib.parse
import json
import hashlib
import base64
import wordcloud
import jieba
with open('./jd_phone_comments.csv', encoding='utf-8') as f:
data = pd.read_csv(f)2、数据信息审查
#基础信息
data.info()<class 'pandas.core.frame.DataFrame'> RangeIndex: 3637 entries, 0 to 3636 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sku_id 3637 non-null int64 1 _id 3637 non-null object 2 item_name 3637 non-null object 3 comment_id 3637 non-null int64 4 content 3637 non-null object 5 creation_time 3637 non-null object 6 reply_count 3637 non-null int64 7 score 3637 non-null int64 8 useful_vote_count 3637 non-null int64 9 useless_vote_count 3637 non-null int64 10 user_level_id 3637 non-null int64 11 user_province 0 non-null float64 12 nickname 3637 non-null object 13 user_level_name 3637 non-null object 14 user_client 3637 non-null int64 15 user_client_show 3462 non-null object 16 is_mobile 3636 non-null float64 17 days 3636 non-null float64 18 reference_time 3636 non-null object 19 after_days 3636 non-null float64 20 after_user_comment 3636 non-null object dtypes: float64(4), int64(8), object(9) memory usage: 596.8+ KB
数据集大小:3637*21
#缺失值审查
na_cols = data.isnull().any(axis=0)
na_colssku_id False _id False item_name False comment_id False content False creation_time False reply_count False score False useful_vote_count False useless_vote_count False user_level_id False user_province True nickname False user_level_name False user_client False user_client_show True is_mobile True days True reference_time True after_days True after_user_comment True dtype: bool
其中7列数据存在数值缺失,分别为:user_province、user_client_show、is_mobile、days、reference_time、after_days、after_user_comment。不过对于本次分析没有影响,所以不对其做预处理。
3、描述性分析
3.1 评分分布情况
data['score'].value_counts()
plt.pie(data['score'].value_counts(normalize=True),labels=data['score'].value_counts().index,autopct="%1.1f%%")
plt.title('3.1-1 评分分布图')
plt.show()
上图3.1-1中可以看到有5分好评占比达95%以上,处在京东手机品类正常区间(95%-98%)。且可以预测整体评论夸赞内容会远多于批评投诉内容。
3.1.1 主动被动好评率
data['content_len'] = data['content'].str.len()
pattern = r'默认好评|未填写'
data.insert(loc=data.columns.get_loc('content')+1, column='default_comment', value=None)
data['default_comment'] = data.loc[data['score']==5]['content'].str.contains(pattern,regex=True)
data['default_comment'].value_counts()
plt.pie(data['default_comment'].value_counts(normalize=True),labels=data['default_comment'].value_counts().index,autopct="%1.1f%%")
plt.title('3.1-2 默认好评占比图')
plt.show()False 3327 True 134 Name: content, dtype: int64

在所有5分好评中,用户主动评论数为3327条,占比96.1%。剩余存在134条好评内容为默认好评缺省值,在后续针对评论内容分析时无意义,应考虑其影响。
3.2 各评分评论长度
data['content_len'] = data['content'].str.len()
sns.boxplot(x='score',y='content_len',data=data).set_title("3.1-3 评论长度分布图")
plt.xlabel("评价分值")
plt.ylabel("评论内容长度")
plt.show()
从上图3.1-3可以看出,
差评用户(1分)评论明显最长;
略不满意用户(4分)和体验一般用户(3分)整体评论长度跟随其后;
而完全好评(5分)与体验较差用户(2分)整体评论较短。
说明差评用户以及略不满意用户主动反馈的信息更多。
4、探索性分析
4.1 评论情感分析
利用snowNLP库,优点在于开源,不受AI平台API接口各种限制,可自定义程度高。
#记录snownlp预测情感得分(0-0.5为消极情绪,0.5-1为积极情绪)
data.insert(loc=data.shape[1], column='emotion', value=None)
data['emotion'] = data['content'].apply(lambda x:snownlp.SnowNLP(x).sentiments)#画分布直方图
plt.hist(x = data['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-1 总体情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()
通过图4.1-1,可以明显看到情绪整体呈现严重两级分化趋势,情绪基本处于两种状态:完全满意(0.9以上)和完全不满意(0.1以下)。
进一步对不同评分评论情绪做拆分
plt.figure(1)
plt.subplot(211)
plt.hist(x = data.loc[(data['score']==5) & (data['default_comment']==False)]['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-2 5分评价情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()
plt.subplot(212)
plt.hist(x = data.loc[data['score']==1]['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-3 1分评价情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()
plt.figure(2)
plt.subplot(311)
plt.hist(x = data.loc[data['score']==4]['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-4 4分评价情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()
plt.subplot(312)
plt.hist(x = data.loc[data['score']==3]['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-5 3分评价情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()
plt.subplot(313)
plt.hist(x = data.loc[data['score']==2]['emotion'],bins = 20,alpha=0.8,edgecolor = 'white')
tick=np.arange(0,1.1,0.1)
plt.xlim(0,1)
plt.xticks(tick)
plt.xlabel('情感分')
plt.ylabel('数量')
plt.title('4.1-6 2分评价情感分分布图')
plt.grid(True,alpha=0.2)
plt.show()




可以明显观测到:
1分评价集中位于完全不满意(0.1以下),符合预期推测,需要进一步确认不满意原因。
而除1分评价外,2~3分情感分也集中位于左侧,完全不满意数量明显多于4分,说明可能存在习惯性非差评。
4分评价分布与总体分布相似,两级分化程度较低,总体情绪较高。
5分评价情感分与总体分布一致,包含较多明显完全不满意打分,与预期有一定程度冲突,需定位矛盾产生原因。
4.2 关键词
4.2.1 总体高频词
all = ''
for tmp in data['content']:
all += tmp
data_cut = ' '.join(jieba.lcut(all))
from jieba import analyse
key_words = jieba.analyse.extract_tags(sentence=all, topK=20, withWeight=True, allowPOS=())
key_words_np = np.array(key_words)
plt.barh(key_words_np[:,0][::-1],key_words_np[:,1].astype(float)[::-1])
plt.xlabel('频率')
plt.ylabel('高频词')
plt.title('4.2-1 整体TOP20高频词分布图')
plt.grid(True,alpha=0.2)
plt.show()
从图4.2-1中,可以发现用户对于手机品类,较多关注以下三个方面:
品牌(华为、小米、荣耀等)
功能(拍照、流畅、速度等)
外观(外观、手感、屏幕等)
4.2.2 差评高频词
all = ''
for tmp in data.loc[data['score']==1]['content']:
all += tmp
data_cut = ' '.join(jieba.lcut(all))
from jieba import analyse
key_words = jieba.analyse.extract_tags(sentence=all, topK=20, withWeight=True, allowPOS=())
key_words_np = np.array(key_words)
plt.barh(key_words_np[:,0][::-1],key_words_np[:,1].astype(float)[::-1])
plt.xlabel('频率')
plt.ylabel('高频词')
plt.title('4.2-2 1分高频词分布图')
plt.grid(True,alpha=0.2)
plt.show()
从图4.2-2中发现,造成用户体验不佳的主要原因可以归为以下几类:
店铺人员(客服、售后等)
店铺行为(发货、换货、退货等)
产品自身(屏幕、充电、电池等)
因此商家应从运营售后人员以及退换货流程上,定位和排查问题;
而手机生产商首要提升手机屏幕和续航的品控;
快递方提升配送,派件的效率和质量。
4.2.3 好评低情绪高频词
all = ''
for tmp in data.loc[(data['score']==5) & (data['default_comment']==False) & (data['emotion'] <= 0.1)]['content']:
all += tmp
data_cut = ' '.join(jieba.lcut(all))
from jieba import analyse
key_words = jieba.analyse.extract_tags(sentence=all, topK=20, withWeight=True, allowPOS=())
key_words_np = np.array(key_words)
plt.barh(key_words_np[:,0][::-1],key_words_np[:,1].astype(float)[::-1])
plt.xlabel('频率')
plt.ylabel('高频词')
plt.title('4.2-3 5分低情绪高频词分布图')
plt.grid(True,alpha=0.2)
plt.show()
从上图4.2-3 评价为5分,评论却被预测为“消极情绪”筛出Top的词中并无明显消极词汇,但也无偏向性,
且存在“hellip”等意义不明词汇,可能属于预测模型的oov造成误判。
五、心得感悟
1、项目收获
- 正面:经过这几次python小项目(豆瓣电影爬虫、京东手机评价等)的练手,浅尝了3个NLP、数据可视化相关的库(wordcloud\jieba\echarts),更加熟练地使用jupyter的基本应用。
- 反面:分析能力有待进一步提升,主要为以下两个方面:
- 业务相关性:由于是开源练手数据,并无明确分析目的,使得能指导业务开展有效工作的结论较简单且较浅;
- 数据利用率:这次的数据集共14个有效字段,当前仅对3个字段进行了分析,可以考虑对剩余字段进行特征挖掘和分析。
2、工具对比
python数据分析:墙裂推荐用jupyter,比pycharm真的方便很多!
对于图表分析,相较于易上手的excel、tableau工具,python的DIY程度更高,可以支持jiaba特征挖掘等更高级的功能,代价呢就是容易掉头发(毕竟需要写代码!)