今天给大家推荐一个数据分析与挖掘的实战项目案例“基于京东手机销售数据用回归决策树预测价格”。该项目先基于京东手机销售数据做出一系列分析后,利用回归决策树仅根据手机外部特征进行价格预测。
本项目来自于实验楼《楼+ 数据分析与挖掘实战》第五期学员:Ted_Wei。
数据获取由于手机的价格以及评论数是需要经过 javascript 渲染的动态信息,单纯用 requests 模块是爬取不到的。我的解决方案是首先使用 selenium 的 webbrowser 模块使用本地 Chrome 浏览器爬取每一款手机在京东的内部id,价格,以及评论数。然后再根据爬取到的id找到每款手机的销售页面,爬取每款手机的关键参数。
爬虫代码parsing_code.py可通过此页面: https://www.kaggle.com/ted0001/dm05-998494/data 获取。
数据清洗获取到的数据包含1199行,21列,每一行代表一款正在销售的手机,每一列包含关于手机的一项参数(比如价格,内存大小,像素,等等)。 获取到的数据大多为自然语言,非数值信息,对于分析十分不友好。所以数据分析的重点在于,找到实际上的缺失信息(如‘无’,‘参考官方数据’等都可认为是缺失数据NaN),以使用re模块解析自然语言,提取其中有用的数值信息。
数据清洗的步骤其实相当繁琐,如果把代码贴出也会占用过多篇幅,因此数据清洗的代码data_clean.py可通过此页面: https://www.kaggle.com/ted0001/dm05-998494/data 获取。
数据分析下面直接进入正题,主要完成估计各品牌手机销量并进行比较分析、对决定手机价格因素的探索、尝试用机器学习方法预测手机价格。
首先调用所需的模块
import numpy as np # linear algebra import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv) import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeRegressor from sklearn.metrics import mean_absolute_error as mae读取已经清洗好的数据,数据也可在 https://www.kaggle.com/ted0001/dm05-998494/data 获取。
data=pd.read_csv(\'../input/data-acquisitioncleaning/cleaned_data.csv\') data=data.set_index([\'Unnamed: 0\']) #DataFrame在存储为csv file以后原来的index会变为一个列,因此要重新设置index data.shape输出结果:
(1199,21) 估计各品牌手机销量并进行比较分析拿到清洗好的数据后的第一个想法,便是对各个品牌的手机的销量进行一个比较。由于京东只显示了每部手机的评论数量而不是具体销量,我们只好默认评论数量comments和销量成正比,从而估计各个手机品牌的销量占比
pie_plt=data.groupby([\'brand\']).sum()[\'comments\'].sort_values(ascending=False)#统计每个品牌评论总数,以此作为我们对销量的估计 pie_plt输出结果:
brand HUAWEI 11320592.0 Apple 9797100.0 XIAOMI 7995236.0 NOKIA 1324000.0 Philips 1227100.0 OPPO 1205300.0 vivo 1101330.0 K-Touch 793300.0 MEIZU 574900.0 SAMSUNG 539800.0 smartisan 364000.0 lenovo 275500.0 realme 157000.0 Meitu 109200.0 nubia 86000.0 chilli 58000.0 360 31000.0 ZTE 17000.0 Coolpad 12000.0 BlackBerry 10000.0 WE 90.0 Name: comments, dtype: float64我们可以对以上数据用扇形图更好地展现出来
#绘制各个手机品牌估计销量的占比扇形图 fig,axes=plt.subplots(figsize=(12,12)) comment_sum=pie_plt.values.sum() percen=[np.round(each/comment_sum*100,2) for each in pie_plt.values] axes.pie(pie_plt.values,labels=pie_plt.index,labeldistance=1.2,autopct = \'%3.1f%%\') axes.legend([pie_plt.index[i]+\': \'+str(percen[i])+"%" for i in range(len(percen))],loc=\'upper right\',bbox_to_anchor=(1, 0, 1, 1)) axes.set_title(\'Estimated Handphone Market Share in China\') plt.show()输出结果:
从以上扇形图我们可以估计,在中国市场销量前三的手机品牌分别是华为,苹果,小米,分别占到了总销量的30.6%,26.5%,21.6%,剩下的品牌销量则远远不及销量前三的品牌。 为了验证以上估计的正确性,我查阅了2019年中国手机市场各个品牌份额的相关资料。发现华为,苹果,小米的占比分别为34%,9%,12%,除华为外,小米和苹果的市场份额数据均有较大出入。而vivo,oppo的市场份额则分别是19%和18%,与原来的数据差距就更大了。 如果京东的评论数量可以大致反映手机线上销售情况的话,我想造成数据有如此大差异的原因可能在于没有考虑中国市场的线下销售。根据平时的生活经验,苹果和小米的线下门店数量(特别是在小城市)是远远不及oppo,vivo的门店数量的。整个手机市场既包括线上市场也包括线下市场,而造成我统计到的数据与权威数据差异的原因,很可能是因为我的数据没有包含线下销售。 如果能够获得线下销售数据,那么也可以对以上推论进行进一步的验证。