您的位置:首页 > 编程语言 > Python开发

python_20171123_二手车信息探索

2017-12-20 17:26 288 查看
## ************第一步:抓取该平台二手车的所有品牌 ***************
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os#貌似是自带的,不用下载包了
from sklearn.linear_model import LinearRegression
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
# 读取数据(记得需要将csv文件先另存为UTF-8的编码,否则会报编码错误)
cars = 'C:/Amy/桃花潭水/python数据分析学习/data/爬虫--二手车平台数据的获取/second_cars_info.csv'
pwd = os.getcwd()
os.chdir(os.path.dirname(cars))
cars = pd.read_csv(os.path.basename(cars))
N = np.sum(cars['Boarding_time']=='未上牌')
ratio = N/cars.shape[0]
# 由于未上牌的汽车数量占比极少,仅千分之八,这里不妨考虑将其删除
cars = cars[cars['Boarding_time']!='未上牌']
#cars = cars.loc[cars.Boarding_time != '未上牌',:]
#由于上面的清洗步骤,导致一些观测被删除,此时的行索引就不再是一个连续的自然数了,故需要重新设置索引,
# 以免产生不必要的错误(因为pandas模块中数据结构的行索引会自动对齐)。
# 重新设置行索引
cars.index = range(cars.shape[0])
# 取出上牌时间变量中的年和月
cars['year'] = cars['Boarding_time'].str[:4].astype('int')
print(cars['year'].head())
month = cars['Boarding_time'].str.findall('年(.*?)月')
# 由于month是列表构成的序列,所以需要非列表化,再序列化
print(month.head())#8
month = pd.Series(i[0] for i in month).astype('int')
cars['month'] = month
# 计算上牌日期距离2017年10月份的月数
cars['diff_months'] = (2017-cars.year)*12 + (10-cars.month) + 1
print(cars.head())
#行驶里程数字段的处理
## 行驶里程数为字符串,要实现字符串转数值,
#需要先将字段中的“万公里”字样去除,然后再进行数据类型的转换。
cars['Km'] = cars['Km'].str[:-3]
# “百公里内”的样本量
#N = np.sum(cars['Km']=='百公里内')
#Ratio = N/cars.shape[0]
#print(Ratio)
#行驶里程数为“百公里内”的样本量仅仅只有63条,占比为千分之六
# 我们不妨将“百公里内”的样本替换成50公里,即0.005万公里。
cars['Km'].replace('百', '.005', inplace=True)
cars['Km_new'] = cars['Km'].astype('float')
#cars['New_pri
4000
ce'] = cars['New_price'].str[:-1].astype('float')
#N = np.sum(cars['New_price']=='暂无')
#Ratio = N/cars.shape[0]
#print(Ratio)
cars = cars[cars['New_price']!='暂无']
cars['New_price'] = cars['New_price'].str[:-1].astype('float')
#print(cars.head(3))
#经过上面的数据清洗工作,数据中有一部分被删除,也有一部分值被替换。通过数据框结构的shape方法,可知目前数据集还剩
#下11,047个样本,一共减少了234条二手车样本。最后,我们再来看看数据集的概览情况:
# 数据集的概览信息
print(cars.describe())
#采用可视化方法进行数据探索
#直方图的绘制
#最关心的是二手车的价格分布吧,看看二手车的价格都落在什么范围内?首先,我们对二手车的价格
#绘制一张直方图,看看其分布形状。
max_Sec_price = np.max(cars['Sec_price'])
min_Sec_price = np.min(cars['Sec_price'])
plt.hist(cars['Sec_price'],# 二手车价格数据
bins=np.arange(min_Sec_price, max_Sec_price+10, 10),# 以10万元为组距
color='steelblue')
plt.title('二手车价格分布直方图')
plt.xlabel('价格')
plt.ylabel('频数')
plt.tick_params(top='off', right='off')
plt.show()
plt.hist(cars['Sec_price'],# 二手车价格数据
bins=np.arange(min_Sec_price, max_Sec_price+10, 10),# 以10万元为组距
normed=True,
cumulative=True,
color='steelblue')
# 添加水平参考线
plt.axhline(y=.5, color='blue', linestyle='--', linewidth=2)
plt.axhline(y=.8, color='red',linestyle='--', linewidth=2)
# 设置坐标轴标签和标题
plt.title('二手车价格累积分布直方图')
plt.xlabel('价格')
plt.ylabel('累积频率')
plt.xticks(np.arange(min_Sec_price, max_Sec_price, 50))
# 去除图形顶部边界和右边界的刻度
plt.tick_params(top='off', right='off')
# 图形显示
plt.show()
#条形图的绘制
#上面的直方图,其实质反映的就是等间距的条形图。如果需要自定义价格范围,然后基于这个范围再作条形图的绘制,该如何操
#作呢?这里需要借助于pandas模块中的cut函数,将连续的数值切割成不同的数据段:
# 指定任意的切割点,将数据分段
price_cuts = pd.cut(cars['Sec_price'], bins=[min_Sec_price,3,5,8,10,15,20,30,50,max_Sec_price])
# 按照数据段,进行数据的统计,即频数统计
price_stats = price_cuts.value_counts()
x = range(len(price_stats))#是9个区间段
#print(x)#range(0, 9)
# 将索引用作绘图的刻度标签
label = price_stats.index
fig = plt.figure(figsize=(10, 6))
plt.bar(x,# x轴数据
price_stats,# y轴数据
align='center',# 刻度居中对齐
color='steelblue',
alpha=.8)
# x轴刻度标签
plt.xticks(x, label)
# 设置y轴的刻度范围
plt.ylim(0, 2200)
plt.title('二手车价格区间条形图')
plt.xlabel('价格区间')
plt.ylabel('频数')
plt.tick_params(top='off', right='off')
# 占比用于绘图的数值标签
percent = [str(round(i*100,2))+'%' for i in price_stats/price_stats.sum()]
# 为每个条形图添加数值标签
for x,y,z in zip(x,price_stats,percent):
plt.text(x, y+30,'%s' %z,ha='center')
# 为了避免x轴日期刻度标签的重叠,设置x轴刻度自动展现,并且45度倾斜
fig.autofmt_xdate(rotation=45)
plt.show()
#饼图的绘制
#关心完了二手车的价格,是不是该关心一下这辆车跑了多少路了?毕竟二手车的价格跟行驶里程数也是有关系的嘛。
# 我们按照二手车网站的筛选条件,将行驶里程数分割为5段,
# 即1万公里以内、1~3万公里、3~5万公里、5~10万公里及10万公里以上。
Km_min = cars['Km_new'].min()
Km_max = cars['Km_new'].max()
Km_cuts = pd.cut(cars['Km_new'], bins=[Km_min,1,3,5,10,Km_max])
Km_stats = Km_cuts.value_counts()
# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 自定义颜色
colors = ['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555']
# 提取出索引作为标签,将分段的类别作为标签
#Km_stats.values为每一个类别的计数
labels = Km_stats.index
plt.pie(Km_stats.values,
labels=labels,
colors=colors,
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
counterclock = False, # 设置为顺时针方向
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
textprops = {'fontsize':12, 'color':'k'}) # 设置文本标签的属性值
plt.title('二手车行驶公里数分布(万公里)')
plt.show()
#散点图的绘制
#影响二手车价格的因素可能二手车的行驶时长、行驶公里数和汽车品牌,直观感觉,
# 二手车的价格应该与行驶时长、行驶公里数成反向关系,
# 即行驶时长或行驶公里数越大,则二手车的价格应该越便宜。
# 接下来我们来探索一下,是不是这么个道理,由于二手车的品牌也严重影响价格,故这里以奥迪和大众为例,绘制散点图。
# 取出奥迪和大众两种车辆
some_cars = cars[cars['Brand'].isin(['奥迪','大众'])]
#some_cars = cars.loc[cars['Brand']=='奥迪',:]
labels = some_cars['Brand'].unique()
colors = ['blue', 'red']
for i in range(len(labels)):
plt.scatter(some_cars.loc[some_cars['Brand']==labels[i],'Km_new'],
some_cars.loc[some_cars['Brand'] == labels[i], 'Sec_price'],
label=labels[i],
c=colors[i],
s=20,# 设置点的大小
marker='o',  # 设置点的形状
alpha=0.9,  # 设置点的透明度
linewidths=0.3,  # 设置散点边界的粗细
edgecolors='k',  # 设置散点边界的颜色
)
plt.title('二手车行驶公里数与价格的关系')
plt.xlabel('行驶公里数')
plt.ylabel('价格')
plt.tick_params(top='off', right='off')
plt.legend()
plt.show()
# 取出奥迪车的数据子集
aodi_cars = cars[cars['Brand']=='奥迪']
reg = LinearRegression()
reg.fit(aodi_cars['diff_months'].reshape(-1,1), aodi_cars['Sec_price'])
pred = reg.predict(aodi_cars['diff_months'].reshape(-1,1))
plt.scatter(aodi_cars['diff_months'],
aodi_cars['Sec_price'],
marker='o',
c='steelblue',
s=20,
linewidths=.5,
alpha=.7,
label='观测点')
plt.plot(aodi_cars['diff_months'], pred, color='red', linewidth=2, label='回归线')
plt.title('二手车的行驶时长与价格的关系')
plt.xlabel('行驶时长(月)')
plt.ylabel('价格(万元)')
plt.tick_params(top='off', right='off')
plt.legend(loc='best')# 显示图形
plt.show()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: