前言:这是我学数据分析以来,第一次用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
朗逸2015款1.6L手动舒适版 432
朗逸2013款经典款1.6L手动舒适版 368
朗逸2013款经典款1.6L手动风尚版 318
朗逸2015款1.6L自动舒适版 306
朗逸2013款改款1.4TSI手动舒适版 233
朗逸2015款1.6L手动风尚版 149
朗逸2015款1.6L自动风尚版 146
朗逸2013款1.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年发表的评论是最多的;从网页上朗逸的排名了看,它的趋势不应该会呈下降趋势呀,这里有很多可能因素造成了这样的结果
- 太平洋汽车上点评的用户在减少,照成数据呈下降趋势
- 用户买了车但是没有发表任何评论,照成数据减少
- 网络喜好倾向改变,用户发表评论的喜好减少
- … …
接下了查看 发表时间 和 购买时间 有什么关系
问题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(['车主',