
课程名称:Python语言与数据分析
课 程 报告
项目名称 平板电脑数据集分析
班 级
学 号
姓 名 刘建杰
任课教师
开课学期:2021 至 2022 学年第 2 学期
完成时间: 2022 年 6 月 8 日
《平板电脑》数据分析报告
目录
目录
平板电脑也叫便携式电脑是一种小型、方便携带的个人电脑,以触摸屏作为基本的输入设备,它最大特点是,触摸屏和手写识别输入功能,以及强大的笔输入识别、语音识别、手势识别能力,且具有移动性。随着科技的进步,信息化的提高,平板电脑在我们日常生活中越来越常见,其功能与作用越来越接近电脑与手机,能提高我们的生产力和工作效率,本文的目的是对于我们能快速对平板电脑的发展与其各种参数有个宏观了解,了解平板电脑的价格有哪些因素影响,以及提供新手选购平板电脑选购思路和参考
本数据分析报告内的平板电脑数据来源于中关村在线网站【平板电脑】平板电脑报价及图片大全-ZOL中关村在线。

自己编写爬虫程序,分析网址数据页构成,思考如何编写增量爬虫逻辑,利用request请求获取html,再用beautifulsoup解析html获取逐个字段,最终成功爬取平板电脑的各项数据参数并保存csv文件到本地。

从中关村网站共爬取1417条数据,17个关键参数的字段。
17个平板电脑数据集参数的字段分别为公司名称、产品名称、上市年份、上市月份、价格(元)、阶段、运行内存(GB)、存储容量(GB)、操作系统、处理器型号、屏幕尺寸(英寸)、屏幕分辨率、重量(g)、评论人数、评分、电池类型、电池容量
使用Pandas将csv数据导入后,使用pandas库中dateframe的info()函数,数据集信息如下

因网站存储的平板电脑信息不是很全,导致有的字段不为空的行数小于1417,存在空值的字段,由于含有空值字段比较分散,而且数据集量并不是很大,不能采用一刀切删除操作,于是采用等数据分析具体内容字段时,再删除空值的行或者不纳入数据分析的范围。
使用duplicated()函数清除重复的行,数据集良好,未有重复的行

爬取的字段有17个,字段较多,而有些个字段与本次数据分析内容暂时无关,所以删除数据表中的上市月份、电池容量、电池类型等无关字段
通过分析每年上市的数量有利于我们对平板电脑的发展趋势与兴起有个宏观了解
通过分析各公司平板电脑数量,可以体现出市场的多样性,市场中哪几个品牌占有市场最多的份额,能让我们消费者普通人能更好的选购大品牌
通过分析不同价位的数量可以得出平板电脑什么价位数量最多,证明这个价位最亲民,最适合我们普通大众的价位
通过分析电脑价格与评价的关系,可以验证平板电脑领域是否与我们所熟知的那样,评价与价格正比,评价随价格的提升而提升
简单从3个电脑配置方面分析配置与价格之间的关系,有助于我们了解平板电脑价格因什么而增长,以及什么配置影响因素最大,为我们解释为什么不同平板电脑配置导致价格差异较大。
分析屏幕尺寸的占比与屏幕尺寸是否对价格有影响
分析屏幕分辨率的占比与屏幕分辨率是否对价格有影响
分析存储器容量的占比与存储器容量是否对价格有影响









通过4.1的折线图可以清晰的看出
通过4.2的横向柱形图可以得出
通过4.3的竖向柱形图可以获知
1000-2000价位范围内的平板电脑数量最多,说明这个价格最亲民,最普及大众,可以推测各公司的对这价位都投入了精力,为了获得许多大众的青睐打出品牌知名度,毕竟我们普通人都希望有较便宜且好用的电脑。
通过4.4的箱型图分析得知
屏幕的尺寸大小是平板电脑组成中比较重要的部分,尺寸的大小关系着我们日常使用,影音、小说等都需要在屏幕上展现出来。分析4.5.1的箱型图,根据q2中位数可以得出,随着尺寸的增大,价格普通也在提高,说明屏幕尺寸与价格是成正比的,也侧面反映企业若提高屏幕尺寸大小,平板电脑的制作成本也会增加,所以屏幕尺寸是影响价格是重要因素
屏幕分辨率是指纵横向上的像素点数,屏幕分辨率确定计算机屏幕上显示多少信息,所以不言而喻,分辨率是平板电脑组成中较重要的部分。通过分析4.5.2的箱型图,根据q2中位数可以得出,随着分辨率的增大,价格也在增长,但是增长速度较慢,不过也能反映出屏幕分辨率是影响价格的重要因素
这里分析的存储器容量是外存储器,外存用来存储程序、数据以及各种软件资源,毫无疑问,存储器容量是平板电脑组成的重要部分。分析4.5.3的折线图,根据折线的形状,可以清晰的看出,存储容量增长时,平均价格也在增长,而且增长速度很快,由此可断定,企业生产平板电脑存储器容量的增加,其成本会增加很多,所以存储器容量是影响平板电脑的一个非常重要的因素。
1.整个数据分析过程
首先,做此报告前,需要有平板电脑的数据集,但是我搜索了阿里云天池以及和鲸社区都没有找到相关的数据集,无奈之下只好自己写爬虫爬取数据集,本想爬京东的数据,想着京东的平板电脑数据信息比较齐全和权威,写了些相关爬取京东数据代码后才觉得并不合适,京东列出的平板电脑数据只是各个店铺上架的销售平板电脑的数据,会有重复值以及其它原因,做起来会非常复杂,遂放弃,后想起有中关村网站,这网站将平板电脑的数据分门别类,而且展示齐全,很符合我想要爬的数据,于是开始写爬虫代码爬取。由于爬虫库(request、re、beautifulsoup)代码并不熟悉,代码写得较困难,需要边翻书和查资料才能勉勉强强写出来。
然后,有了数据集csv文件后,需要使用pandas读取处理,再使用matplotlib库来绘图,pandas库并不是很熟悉,刚接触不久,matplotlib库更不用说了,各种函数与参数很难有个大概宏观映像,只好上matplotlib官网看例子,再上CSDN搜索相关matplotlib教程,再一步一步调试出来想要的图形效果,写代码绘图分析花费挺多时间,需要找到合适的图形来匹配分析的数据集,有时找的图形不合适又得换掉,综合对比哪个图好一点才决定最终图表。绘好图后,需要写文档了,但是各个小点的写法并没有思路,于是查看众多老师发的学长学姐的文档以及在和鲸社区相关项目后,才有思路开始着手写。
2.收获
了解熟悉了python爬虫代码的编写和思路,更多的是熟悉了pandas、numpy、matplotlib这三个库用来做数据分析的使用,增加了自己站在大数据下分析事物。还有增加自己搜索资料独立完成任务的能力,以及巩固这一学期python的各个知识点。
3.体会
做python的数据分析更多的是得动手实践才能加深理解和印象。python用来爬虫、数据分析都很有用,适合当自己的小工具。另外学python这段时间虽然比较艰苦,很短的时间得学很多知识,虽然累但是收获颇丰。
爬虫代码和数据集文件等CSDN恢复资源下载再发出链接来
- import matplotlib.pyplot as plt
-
- import pandas as pd
-
- import numpy as np
-
-
-
- df = pd.read_csv('平板电脑.csv', encoding='gbk')
-
- print(df.info())# 基本信息
-
- print('重复值:', df.duplicated().sum())# 处理重复值
-
- ydf = df.drop(['上市月份','电池类型','电池容量', '操作系统', '处理器型号'], axis=1)# 删除不需要的列
-
- print(ydf)
-
-
-
- # 设置图像样式
-
- font = {'family':'SimHei',
-
- 'weight':'bold',
-
- 'size':'18'}
-
- plt.rc('font', **font)
-
- plt.rc('axes', unicode_minus=False)
-
- # 开始根据要分析的内容绘图
-
- # 1.各年份公司产品折线图1
-
- plt.figure()
-
- ndf = ydf.copy()
-
- yearcts = ndf['上市年份'].value_counts().sort_index(axis=0)
-
- x = yearcts.index
-
- y = yearcts.values
-
- plt.plot(x, y, linewidth=1, color="orange", marker="o",label="Mean value")
-
- for i in range(len(yearcts)):#设置每个点上的数值
-
- plt.text(x[i], y[i], y[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',horizontalalignment='right')
-
- plt.title('各年份上市平板电脑的数量')
-
- plt.xlabel("年份")
-
- plt.ylabel("数量")
-
-
-
- # 2.各公司平板电脑数量规模对比
-
- plt.figure(dpi=80)
-
- ndf = ydf.copy()
-
- companyproct = ndf['公司名称'].value_counts()[0:20].sort_values(axis=0)
-
- x = companyproct.index
-
- y = companyproct.values
-
- rects1 = plt.barh(range(len(x)), y, height=0.4, color='orange') # 绘制横向的柱状图,width就需要改为height
-
- plt.yticks(range(len(y)), x)
-
- plt.grid(alpha=0.5) # 加格网,透明度设置为0.3
-
- plt.title("各公司产品数量规模", size=18)
-
- plt.bar_label(rects1, padding=3) # 设置bar的值
-
-
-
- # 3.平板电脑各个价位的数量
-
- plt.figure()
-
- ndf = ydf.copy()
-
- pricebins = [0,1000,2000,3000,4000,5000,10000,50000]
-
- ndf["price_arrange"] = pd.cut(x=ndf["价格(元)"],bins=pricebins)
-
- pricebinct = ndf["price_arrange"].value_counts().sort_index(axis=0)
-
- x = np.array(['(0,1000)','(1000,2000)','(2000,3000)','(3000,4000)','(4000,5000)','(5000,10000)','(10000,50000)'])
-
- y = pricebinct
-
- rects = plt.bar(x, y, color=['orange'])
-
- plt.bar_label(rects, padding=3)
-
- plt.title('平板电脑各个价位的数量')
-
- plt.xlabel("价格范围")
-
- plt.ylabel("数量")
-
-
-
- #4.价格与评价关系箱型图
-
- ndf = ydf.copy()
-
- ndf = ndf[(ndf['评分'] > 0)]# 过滤掉0分的行
-
- pricebins = [0,1000,2000,3000,4000,5000,10000,50000]
-
- ndf["price_arrange"] = pd.cut(x = ndf["价格(元)"], bins=pricebins)
-
- ndf.boxplot(column='评分', by='price_arrange',grid = True,showmeans=True,patch_artist=True, boxprops = {'color':'black','facecolor':'lightblue'},whiskerprops={'linestyle':'-','color':'black'})
-
- plt.title('价格与评价关系箱型图')
-
- plt.xlabel('价格范围')
-
- plt.ylabel('评分')
-
-
-
- #5.1屏幕尺寸对价格的影响
-
- #5.1.1屏幕尺寸占比图
-
- plt.figure()
-
- ndf = ydf.copy()
-
- ndf = ndf.dropna(subset=['屏幕尺寸(英寸)'])
-
- ccct = df['屏幕尺寸(英寸)'].value_counts().sort_values(axis=0,ascending=False)
-
- rate = ccct.values[0:10]
-
- labels = ccct.index[0:10]
-
- plt.pie(rate, labels=labels,autopct='%1.1f%%',shadow=False)
-
- plt.axis('equal')
-
- plt.legend()
-
- plt.title('主要屏幕尺寸占比',fontsize=20)
-
-
-
- #5.1,2屏幕尺寸对价格的影响箱型图
-
- ndf = ydf.copy()
-
- ndf = ndf[(ndf['价格(元)'] < 10000)].dropna(subset=['屏幕尺寸(英寸)'])
-
- ccbins = [3,6,9,12,15,18.5]
-
- ndf["chicun_arrange"] = pd.cut(x = ndf["屏幕尺寸(英寸)"], bins=ccbins)
-
- # ndf.boxplot(column='价格(元)', by='chicun_arrange',grid = True,showmeans=True,patch_artist=True,sym='-')
-
- ndf.boxplot(column='价格(元)', by='chicun_arrange',grid = True,showmeans=True,patch_artist=True, boxprops = {'color':'black','facecolor':'#FFCC99'},whiskerprops={'linestyle':'-','color':'black'})
-
- plt.title('屏幕尺寸与价格关系箱型图')
-
- plt.xlabel('屏幕尺寸')
-
- plt.ylabel('价格(元)')
-
-
-
- #5.2屏幕分辨率对价格的影响
-
- #5.2.1屏幕分辨率占比图
-
- plt.figure()
-
- ndf = ydf.copy()
-
- ndf = ndf.dropna(subset=['屏幕分辨率'])
-
- pmfblct = ndf['屏幕分辨率'].value_counts().sort_values(axis=0,ascending=False)
-
- rate = pmfblct.values[0:10]
-
- labels = pmfblct.index[0:10]
-
- plt.pie(rate, labels=labels,autopct='%1.1f%%',shadow=False)
-
- plt.axis('equal')
-
- plt.legend()
-
- plt.title('主要屏幕分辨率占比',fontsize=20)
-
-
-
- #5.2.2屏幕分辨率对价格影响的箱型图
-
- plt.figure()
-
- ndf = ydf.copy()
-
- ndf = ndf[(ndf['价格(元)'] < 10000)]
-
- ndf = ndf.dropna(subset=['屏幕分辨率']).sort_values(by=['屏幕分辨率'])
-
- fblbins = ['1024x600', '1024x768', '1280x800', '1920x1080', '1920x1200', '2000x1200', '2048x1536', '2560x1600']
-
- v1=[]
-
- for i in fblbins:
-
- v1.append(ndf[ndf['屏幕分辨率']==i]['价格(元)'].values)
-
- plt.boxplot(v1, showmeans=True, labels=fblbins)
-
- plt.title('屏幕分辨率与价格关系箱型图')
-
- plt.xlabel('屏幕分辨率')
-
- plt.ylabel('价格(元)')
-
-
-
- #5.3存储器容量对价格影响
-
- #5.3.1主要存储器容量占比
-
- plt.figure()
-
- ndf = ydf.copy()
-
- ndf = ndf.dropna(subset=['存储容量(GB)'])
-
- ndf['存储容量(GB)'] = ndf['存储容量(GB)'].astype(int)
-
- ccrlct = (ndf['存储容量(GB)'].value_counts())
-
- rate = ccrlct.values[0:10]
-
- labels = ccrlct.index[0:10]
-
- plt.pie(rate, labels=labels,autopct='%1.1f%%',shadow=False)
-
- plt.axis('equal')
-
- plt.legend()
-
- plt.title('主要存储器容量占比',fontsize=20)
-
-
-
- #5.3.2存储器容量平均价格的折线图
-
- plt.figure()
-
- ndf = ydf.copy()
-
- ndf = ndf[(df['价格(元)'] < 30000) & (df['存储容量(GB)'] >= 8)]
-
- ndf = ndf.dropna(subset=['存储容量(GB)'])
-
- ndf = ndf.groupby(['存储容量(GB)'])['价格(元)'].mean()
-
- x = ndf.index
-
- y = ndf.values.astype(int)
-
- plt.plot(x, y, linewidth=1, color="orange", marker="o",label="Mean value")
-
- for i in range(len(ndf)):#设置每个点上的数值
-
- plt.text(x[i], y[i], y[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',horizontalalignment='right')
-
- plt.title('存储器容量平均价格的折线图')
-
- plt.xlabel("存储器容量(GB)")
-
- plt.ylabel("平均价格(元)")
-
-
-
- plt.show()