1 概述
目前,随着经济的飞速发展,人民生活水平不断提高,老百姓对汽车的需求也越来越大,其中,二手车是汽车交易行业的重要支柱。从老百姓角度来讲,二手车价格是影响人们生活的重要因素,对二手车价格进行数据分析具有极大的应用价值。
2 数据描述
(1)数据来源
数据来源于二车之家的web网站,如下图所示为爬取目标网站的截图。采用urllib和BeautifulSoup完成数据爬取,首先通过urllib.request发起请求,采用BeautifulSoup解析页面,完成数据提取。数据爬取核心代码如下:
for page in range(2, 100):
url = 'http://www.che168.com/china/a0_0msdgscncgpi1lto8csp' + str(page) + 'exx0/?pvareaid=102179#currengpostion'
f = urllib.request.urlopen(url)
resp = f.read()
html = BeautifulSoup(resp, 'html.parser', from_encoding='gbk')
lis = html.findAll(class_='cards-bottom')
for li in lis:
carType = li.h4.text
carInfo = li.p.text
carPrice = li.s.text
print(carType)
print(carInfo)
print(carPrice)
oneCar = [carType, carInfo, carPrice]
writer.writerow(oneCar)
csvfile.close()
数据处理
数据处理包括缺失值处理、价格处理以及重复值处理。其中,缺失值处理基于dropna方法实现,重复值处理采用drop_duplicates实现,对价格的处理为删除单位万,缺失值和重复值处理后的数据量为4358。数据处理核心代码如下:
data=pd.read_csv(r'data.csv',encoding='gb18030')
#删除原价为 NaN 缺失值的数据
data.dropna(subset=['价格'],inplace=True)
#删除价格为 已涨价xx元 已降价xx元的数据
data=data[ ~data['价格'].str.contains('已')] #删除某列包含特殊字符的行
#缺失值 检测当前的数据有没有缺失值
data.isnull()
print('当前缺失值为')
print(data.isnull().sum())
#重复值的检测
print('当前重复值为')
print(data.duplicated().sum())
#删除重复值
data.drop_duplicates(inplace=True)
print('缺失值和重复值处理后的数据量为',len(data))
# 去除单位万
data['价格']=data.价格.map(lambda x:float(x.replace('万','')))
data = data.reset_index(drop=True)
3 数据分析内容
(1)区间数据分析
为了分析不同价格区间的二手车情况,首先定义分区列表,然后采用cut方法与plto.bar相结合的方式绘制柱状图,具体实现代码如下:
def qujianCount():
bins = [0, 30, 60, 90, 120, 150, 180]
# 画成直方图 rot 把x轴的数据进行旋转 ,如旋转水平角度为0度
pd.cut(data.价格, bins).value_counts().plot.bar(rot=0, title='区间分析')
plt.show()
(2)车型分析
为了分析主要在售车型的分布情况,基于value_counts方法和plot.barh方法分析车型情况,并绘制图表,具体实现代码如下:
data.车型.value_counts()[:10].plot.barh(title='车型分析')
plt.show()
(3)车型价格分析
为了探究车型的价格,对不同车型求均价,选取前10进行图表展示,具体实现代码如下:
data.groupby(['车型'])['价格'].mean().sort_values()[-10:].plot.barh(title='均价前10的车型')
plt.show()
(4)车型饼图分析
前面的车型分析中,包含了配置不同的车型,存在局限性,本次分析首先将车型统一,即删除车型的配置,如奔驰S级 2020款 S 350 L 商务型 臻藏版处理为1奔驰S级,具体实现代码如下:
for i in range(len(data)):
data.at[i,'车型'] = data.at[i,'车型'].split(' ')[0]
top10 = data.车型.value_counts()[:10]
print(top10)
top10 = ['宝马5系', '宝马3系', '奔驰E级', '奔驰C级', '奥迪A4L', 'Model', '奥迪A6L', 'MINI', '高尔夫', '天籁']
data_top10 = data[data['车型'].isin(top10)]
print('Top10车型占总车型的比例: %.2f%%' % ((data_top10.shape[0] / data.shape[0]) * 100))
# 画饼图
plt.axes(aspect='equal') # 将横轴,纵轴坐标标准化处理,保证饼图是一个正圆,否则为椭圆
plt.pie(data_top10['车型'].value_counts(), explode=[0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0], startangle=0, labels=top10,
autopct='%.2f%%', radius=2)
# radus半径
plt.show()
4 数据分析图表
5 数据分析结果
经过数据分析后,可以发现,在不同车型中,幻影、库里南等豪车价格较高,主流的车型为宝马、奔驰、奥迪等,更符合市场需求,其中宝马系车辆,在前10的车型中,数量占比高达30%,具有较高的市场份额。在价格分析中,0-30万的二手车是主流,为市场的主要需求。