python数据分析之《太平洋汽车》点评数据及论坛文本分析

前言:这是我学数据分析以来,第一次用python进行数据分析实战,一边做,一遍看我平时做的笔记,查看别人的博客,同时也新加了很多我重来没有学过的新功能,幸不辱命,协助完成了一篇上档次的纯python毕业论文,以上所用到的数据均来自我爬取的《太平洋汽车》点评和论坛。学习编程真的是这样,如果自己不进行实战操作,永远不知道自己会遇见什么问题,也无从提升自己的能力,这是一个好的开始,简单的梳理一下自己所做的数据分析模块吧!

文章目录


操作环境: windows10,jupyter notebook,谷歌浏览器
数据下载: https://www.lanzous.com/i9rq8af
爬取数据博客: 学习python爬虫看一篇就足够了之爬取《太平洋汽车》论坛及点评实战爬虫大全
分析要求:在这里插入图片描述
这个是我自己列出的分析要求,自己对数据分析也不是很了解,就是在获取数据的时候觉得哪些数据可以用来做哪些统计或分析,所以就把要求之外的数据也获取下来备用,想不到后来对我的学习还真的排上了用场。而且对于做毕业论文,选择这个网页的数据是非常明智的,因为它有丰富的信息供自己研究使用,如用户,时间,地点,评分,评价等,它们直接就是分好类的,所以对于研究数据分析,简直就是太方便了。


导入数据及预处理

我一共爬取了三种车的数据作为研究对象,这里只以排在第一的 大众朗逸轿车 做为研究对象进行分析

导入数据

(1)导入python相关库

import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
%matplotlib inline

如果自己的电脑上面没有安装这几个库,可以直接使用 pip install numpy 进行安装。

(2)导入“太平洋汽车_朗逸轿车.xlsx”

data = pd.read_excel("./太平洋汽车_朗逸轿车.xlsx") #读入数据
data.head() #显示前五行
车主 发表时间 购买车型 购买时间 地点 价格 价格单位 平均油耗 油耗单位 行驶里程(公里) ... 优点 缺点 外观 内饰 空间 配置 动力 操控 油耗 舒适
0 137926969XX 2020-01-31 朗逸2019款朗逸启航1.5L  自动风尚版国VI 2020-01-01 北京市北京 11.99 万元 8.0 L/100km 560 ... 我喜欢这种风格,如果你也喜欢,那我们可能是一路人,科幻时尚年轻的感觉啦,开着很棒 油耗有点高,可能是我自己还没开习惯这车 外观就是好看,线条很好,肌肉大气感是特别的存在 内饰设计师绝对的不错,科技感,豪华感满满,档把超酷 空间一流,还可以的吧,坐姿挺高的 配置很不错,该有的配置都有了,功能挺多的,我很满意。 起步要给点油,动力都很棒,速能力有目共睹,起步稍弱,但个人觉得加好点的油可以弥补这个缺点,大... 方向盘控制的是很好的,很轻,用着真舒服,别的轿车方向盘也没有这个用着舒服。 跟官方称出入不大,现在还是新车状态吧,还的看看接下来的表现,满意是在预期状态吧 车子坐起来舒不舒服特别重要,这款车子就挺好,座椅够软,够质感。
1 开心就好笑笑笑 2020-01-30 朗逸2019款1.5L自动视野版国VI 2020-01-01 云南昆明 13.69 万元 7.5 L/100km 340 ... 外观帅气时尚,更多还是在这么多品牌里面觉得他不错,价位里面也没什么其他选择了,适合年轻人,运... 最不满意的就是避震太不好了,是偏运动 相当满意,就是看中的外观,精巧时尚的风格 时尚新颖,一看就是很符合年轻人的口味,尤其是多功能的大屏看起来就很有科技感。 空间上就我来说够用了,前排空间比较大一些,对驾驶员的来说更舒适一些开着也很舒适。 动力好标配配置:显示屏,倒影,雷达标配。 中规中矩,舍得给油也可以开得很轻快,安静速度提的也不错。 操控很准,指哪打哪,转向准,路感舒适,但还是可以听到不小的胎噪声音。 最近跑了一趟长途,高速全空调加上部分接近百公里的城镇道路,7L左右,靠谱了 舒适性性还可以吧,偏运动也能很强,其实说也很合格吧,空间的话坐的人不多的时候问题不大。
2 hongfeng0417 2020-01-30 朗逸2019款朗逸启航1.5L手动风尚版国VI 2020-01-01 黑龙江牡丹江 9.99 万元 9.0 L/100km 420 ... 用车一小段时间了,说不上什么特别满意的,整体来说比较均衡,没有什么特别突出,自己喜欢就是了 空间确实是一般吧 外观上猛然看上去很年轻时尚吧,但是时间长细看总有种不协调的感觉,相对来说大一款更合适 不错,做工再好一点就更好了,用料也符合这个,没什么太大的毛病。 家用,够了,前后排的空间给我的感受很好,车的后备厢大小也不在话下。 配置情况还可以,我觉得好用的话也得配上 油门多踩一点就很冲,上坡时,的确有点肉,高速上跑起来没有问题,感觉很好。 操控性只能说一般偏上的水平吧。刹车和油门还不错,都挺轻的。 这个跟官方的数据也差不多。我走的大多是城市公路路,偶尔跑跑高速。 车子整体的舒适度还是可以的,不过就是坐垫的质量一般,路不好时也会出现一些颠簸感。
3 jdikio 2020-01-30 朗逸2019款朗逸启航1.5L手动舒适版国VI 2020-01-01 北京市北京 11.09 万元 9.8 L/100km 460 ... 外形犀利感强了,这车开起来吧,高大稳重,很有安全感,舒适性程度很高,座椅的舒服柔软,车内的隔... 油耗有点高,动力一般般。 外观高大,硬朗,空间也很好,前脸的大气特别好,开出去也觉得很有面子。 内饰布局方便,按键位置合理,坐在车里面的豪华感氛围很不错。 空间肯定没什么问题,和几个同事外出很方便,作为工作车。 配置很好,没什么可挑出来的毛病,一般的方便配置都有。 动力中中等等,人坐多变肉了,油耗也高挺多的。 开起来还是挺不错的,挺稳,好开,驾乘都好。 稍微觉得油耗高一些,排量不大,我觉得可以降低一点。 舒适性好,车的隔音效果不错,噪音小,车内聊天很安静,驾驶座宽敞,视野好
4 sailor_1205 2020-01-27 朗逸2019款朗逸启航1.5L自动舒适版国VI 2020-01-01 广东深圳 11.29 万元 7.4 L/100km 500 ... 大致上我都是较为满意的,除了内饰之外,要不然也不会选择这款车了。我觉得动力吧,动力是最满意的地方 内饰自我感觉塑料感有点点不满意吧。 我爸说这整车时尚运动的造型,屁股也非常耐看,尾灯很有标志性。 内饰可以说比较一般嘛,质感,不是很精美,不是很吸引人吧。 空间足够大,一家人出游感觉绰绰有余了。 ABS防抱死,刹车辅助,牵引力控制等等,用料不错不错。 因为我开车温柔不爱乱超车。。开着很不错。。也没他们说的动力肉的感觉啊。。过红灯的时候也没让人... 方向指向准确,A柱宽大有点遮挡视线,急踩油门延迟1秒后推背,刹车及悬挂调教合适舒服 目前油耗差不多是7.4,有时走走停停就高点8.2那样。 座椅包裹感填充一般,软硬度适中

(3)查看数据形状

data.shape
(4682, 28)

结果分析: 表示该表格的数据一共有4682条(行),每天数据有28列

数据去重

1、整行去重。

DataFrame.drop_duplicates()

  • 里面可以有三个参数
  • DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False)
  • 使用 subset 指定重复值判断列,keep={‘first’,‘last’,False} 指定怎么判断哪些是重复项;first保留第一个,last保留最后一个,False不保留;

2、按照其中某一列或多列去重

DataFrame.drop_duplicates(subset=[‘列名1’,‘列名2’])

data.drop_duplicates(subset=None, keep='first', inplace=True)#去除行相同的数据
data.shape # 查看去重后的结果
(4516, 28)

结果分析: 这个方法去掉的是行数据,原数据有 4682 行,去重后有 4516行。



问题1:这款车是否存在忠实粉丝

  • 这是一个假设:假设车主发布两次或两次以上的评论,我们就把他当作该款车的粉丝,这样我们可以使用去重的方法,用去重前的数据减去去重后的数据,就可以得到重复的数量,即为粉丝的数量

1.1、车主去重

# 车主去重
data['车主'].unique()
array(['137926969XX', '开心就好笑笑笑', 'hongfeng0417', ..., '春暖花开的节操',
       '婴宁是不会输的', '名字太长了'], dtype=object)

1.2、去重后的数量

#去重后的数量
data['车主'].unique().shape
(4459,)

1.3、计算粉丝量

#这里以重复评论的人当作忠实粉丝
fans = data.shape[0] - data['车主'].unique().shape[0]
print ("该型号车的粉丝数为:", fans)
该型号车的粉丝数为: 57

结果分析: 如果我们以假设的条件且假设成立,重复评论的人当作忠实粉丝,那么在该数据中一个有57个忠实粉丝。

1.4、查看粉丝车主参数

data[data.duplicated(['车主'])]

在这里插入图片描述
结果分析: 我们以车主中重复数据为条件,提取出57行 * 28列 数据,包含了该车主的评论数据,也验证了上面方法的正确性。



问题2:饼状图统计销量最高的前10名

2.1、查看一共有几种车型

data['购买车型'].unique().shape
(87,)

结果分析: 这里一共拥有87种车型

2.2、查看前10名的销量

  • 使用 value_counts() 函数进行频率统计,它的结果自动按降序排列,截取出前十个就是 1~10 名。
sort_7 = data['购买车型'].value_counts()[:10]
sort_7
朗逸2013款经典款1.6L自动舒适版      460
朗逸2013款改款1.4TSIDSG舒适版    445
朗逸20151.6L手动舒适版         432
朗逸2013款经典款1.6L手动舒适版      368
朗逸2013款经典款1.6L手动风尚版      318
朗逸20151.6L自动舒适版         306
朗逸2013款改款1.4TSI手动舒适版     233
朗逸20151.6L手动风尚版         149
朗逸20151.6L自动风尚版         146
朗逸20131.4TSIDSG舒适版      123
Name: 购买车型, dtype: int64

2.3、饼状图可视化

# 绘制前10名的饼状图
plt.figure(figsize=(8, 8))#设置图片比例
sort_7.plot(kind='pie', autopct='%1.2f%%',) #绘制饼图,保留两位百分数
plt.title("大众_朗逸前10销量占比图")
plt.savefig("./images/大众_朗逸前10销量占比图.png")
plt.show()

在这里插入图片描述

问题3:该平台车辆购买评论趋势

3.1、购买车辆时间趋势

3.1.1、时间格式转化

  • 为什么要进行时间格式的转换?因为我们导数数据的时候它是字符串的形式,我们需要把它转换为时间类型后才能使用时间的方法进行操作。
data['购买时间'] = pd.to_datetime(data['购买时间']) #数据类型转换
data['购买时间'] = data['购买时间'].map(lambda x: x.strftime('%Y/%m')) #转为年/月
data['购买时间']
0       2020/01
1       2020/01
2       2020/01
3       2020/01
4       2020/01
         ...   
4677    2012/09
4678    2012/09
4679    2013/01
4680    2013/01
4681    2012/08
Name: 购买时间, Length: 4516, dtype: object

3.1.2、查看前五行

在这里插入图片描述

3.2、折线图可视化

3.2.1、购买时间年月趋势

x_buy_time = data['购买时间'].value_counts()#统计相同时间出现的次数
x_buy_time = x_buy_time.sort_index(axis=0)#按索引排序
plt.figure(figsize=(8, 4))#设置图片比例
x_buy_time.plot(kind='line') #x_buy_count[::-1]转置数据
plt.title("大众轿车_朗逸购买日期详情评论趋势图")
plt.xlabel("年/月")
plt.ylabel("数量(辆)")
plt.savefig("./images/大众轿车_朗逸购买日期详情评论趋势图.png")#保存图片
plt.show()

在这里插入图片描述

3.2.2、购买日期评论趋势

x_buy_time_y = pd.to_datetime(data['购买时间']).map(lambda x: x.strftime('%Y')).value_counts()
x_buy_time_y = x_buy_time_y.sort_index(axis=0)
x_buy_time_y.plot(kind='line')
plt.title("大众轿车_朗逸购买年评论趋势图")
plt.xlabel("年份")
plt.ylabel("数量(辆)")
plt.savefig("./images/大众轿车_朗逸购买日期评论趋势图.png")#保存图片
plt.show()

在这里插入图片描述

3.2.3、发表评论趋势

x_share_times = pd.to_datetime(data['发表时间']).map(lambda x: x.strftime('%Y')).value_counts(ascending=False)
x_share_time = x_share_times.sort_index(axis=0)
x_share_time.plot(kind='line')
plt.title("大众轿车_朗逸评论时间趋势图")
plt.xlabel("年")
plt.ylabel("数量(辆)")
plt.savefig("./images/大众轿车_朗逸评论时间趋势图.png")#保存图片
plt.show()

在这里插入图片描述

结果分析: 从上面的购车时间和评论时间可以看出,2013年的购车量是最大的,2017年发表的评论是最多的;从网页上朗逸的排名了看,它的趋势不应该会呈下降趋势呀,这里有很多可能因素造成了这样的结果

  1. 太平洋汽车上点评的用户在减少,照成数据呈下降趋势
  2. 用户买了车但是没有发表任何评论,照成数据减少
  3. 网络喜好倾向改变,用户发表评论的喜好减少
  4. … …

接下了查看 发表时间 和 购买时间 有什么关系



问题4:对于发表时间和购买时间的研究

4.1、计算时间差

# 计算时间差并排序
data['时间差'] = pd.to_datetime(data['发表时间']) - pd.to_datetime(data['购买时间'])
data['时间差'].sort_values()
4368    -43 days
4434    -43 days
4469    -43 days
4476    -43 days
4483    -43 days
          ...   
86     3351 days
159    3357 days
99     3377 days
81     3567 days
708    5798 days
Name: 时间差, Length: 4516, dtype: timedelta64[ns]

结果分析: 从上面的结果看出,用发布时间减去购车时间,有很多值居然为负数,就相当于还没有买车就评论,很明显这个数据为异常值,我们在研究时间关系时,必须先把它去掉才不会影响到正常值。同时也可以反映,这个点评的网页页面功能有所缺陷,不应该让发布时间比购车时间大,这也有可能是影响上面结果的原因之一。


4.2、提取时间差大于0的正常数据

在这里插入图片描述
结果分析: 一共有76条数据存在异常情况,去掉异常数据后还有4430条数据正常,可以供我们研究使用。

4.3、计算时间差相关信息

buy_share_time = pd.to_datetime(normal_time['发表时间']) - pd.to_datetime(normal_time['购买时间']) #时间差
buy_share_time.describe() #描述统计信息
count                         4430 #总数
mean     1330 days 12:23:04.740406 #平均值
std       807 days 21:59:19.897105 #方差
min                0 days 00:00:00 #最小值
25%              658 days 00:00:00 #四分位值
50%             1492 days 00:00:00 #中值
75%             1857 days 00:00:00 #四分位值
max             5798 days 00:00:00 #最大值
dtype: object

结果分析: 从上面的结果可以看出,大多数用户都是在买车后近4年才开始评论,重商业上了说,这个值至关重要,最好至少要在4年左右的时间保证车辆的质量和服务,可以提高用户的满意值。

4.4、绘制时间差分布图

plt.plot(normal_time['时间差'].dt.days,'.',c='r')
plt.title("大众轿车_朗逸评论与购买时间差分布图")
plt.savefig("./images/大众轿车_朗逸评论与购买时间差分布图.png")#保存图片
plt.show()

在这里插入图片描述
结果分析: 从图中可以看出,用户评论的时间集中在3000天以下,在1000~2000这个范围是最集中的,其中还发现一共异常值,5000以上,其他的数据都没有超过4000,估计会对时间数据分析有略微的影响。



问题5:综合评分与车型和车型有关吗?

#查看表头
data.columns
Index(['车主', 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值