用Python分析二手车的销售价格
如今,随着技术的进步,像机器学习等技术正在许多组织中得到大规模的应用。这些模型通常与一组预定义的数据点一起工作,以数据集的形式提供。这些数据集包含了一个特定领域的过去/以前的信息。在将这些数据点送入模型之前,组织这些数据点是非常重要的。这就是我们使用数据分析的地方。如果反馈给机器学习模型的数据没有得到很好的组织,它就会给出错误的或不想要的输出。这可能会给组织带来重大损失。因此,利用适当的数据分析是非常重要的。
关于数据集:
在这个例子中,我们要使用的数据是关于汽车的。特别是包含关于二手车的各种信息数据点,如价格、颜色等。在这里我们需要明白,仅仅收集数据是不够的。原始数据是没有用的。在这里,数据分析在解开我们所需要的信息和获得对这些原始数据的新见解方面起着重要作用。
考虑一下这个场景,我们的朋友奥蒂斯想卖掉他的车。但他不知道他的车应该卖多少钱!他想使利润最大化,但他也希望它能以合理的价格卖给想拥有它的人。所以在这里,我们,作为一个数据科学家,我们可以帮助我们的朋友奥蒂斯。
让我们像数据科学家一样思考,明确定义他的一些问题。例如,是否有关于其他汽车的价格及其特点的数据?汽车的哪些特征会影响其价格?颜色?品牌?马力是否也会影响售价,或许,还有其他方面?
作为一个数据分析师或数据科学家,这些是我们可以开始思考的一些问题。为了回答这些问题,我们将需要一些数据。但这些数据是以原始形式存在的。因此,我们需要先对其进行分析。这些数据以.csv/.data的格式提供给我们
要下载本例中使用的文件,请点击这里。提供的文件是.data格式的。按照下面的过程,将.data文件转换为.csv文件。
将.数据文件转换为.csv的过程:
1.打开MS Excel
2.转到数据
3.选择来自文本
4.在逗号上打勾(只)。
5.以.csv格式保存到你的电脑上你想要的位置!
需要的模块:
- pandas:Pandas是一个开源的库,允许你在Python中进行数据操作。Pandas提供了一种简单的方法来创建、操作和处理数据。
- numpy:Numpy是用Python进行科学计算的基本软件包。Numpy可以作为一个高效的通用数据的多维容器。
- matplotlib:Matplotlib是一个Python二维绘图库,它可以生成各种格式的出版质量的数字。
- seaborn:Seaborn是一个基于matplotlib的Python数据可视化库。Seaborn提供了一个高级接口,用于绘制有吸引力的、信息丰富的统计图形。
- scipy:Scipy是一个基于Python的数学、科学和工程开源软件的生态系统。
安装这些软件包的步骤:
- 如果你使用Anaconda-jupyter/ Syder或其他任何第三方软件来编写你的Python代码,请确保在你的电脑的命令提示符中设置该软件的 “scripts文件夹 “路径。
- 然后输入 – pip install package-name
示例:
pip install numpy
- 然后在安装完成后。(确保你已经连接到互联网!!)打开你的IDE,然后导入这些包。要导入,键入 – 导入软件包名称
示例:
import numpy
以下代码中使用的步骤(简短描述):
- 导入软件包
- 设置数据文件的路径(.csv文件)。
- 查找我们的文件中是否有任何空数据或NaN数据。如果有,则将其删除
- 对你的数据进行各种数据清洗和数据可视化操作。这些步骤在每行代码旁边以注释的形式说明,以便更好地理解,因为最好能看到代码的侧面,而不是在这里完全解释,这将是毫无意义的。
- 取得成果!
让我们开始分析数据。
第1步:导入所需的模块。
# importing section
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import scipy as sp
第二步:让我们检查一下数据集的前五个条目。
# using the Csv file
df = pd.read_csv('output.csv')
# Checking the first 5 entries of dataset
df.head()
输出:
第3步:为我们的数据集定义头文件。
headers = ["symboling", "normalized-losses", "make",
"fuel-type", "aspiration","num-of-doors",
"body-style","drive-wheels", "engine-location",
"wheel-base","length", "width","height", "curb-weight",
"engine-type","num-of-cylinders", "engine-size",
"fuel-system","bore","stroke", "compression-ratio",
"horsepower", "peak-rpm","city-mpg","highway-mpg","price"]
df.columns=headers
df.head()
输出:
第4步:找到缺失的值(如果有)。
data = df
# Finding the missing values
data.isna().any()
# Finding if missing values
data.isnull().any()
输出:
第4步:将mpg转换为L/100km,并检查每一列的数据类型。
# converting mpg to L / 100km
data['city-mpg'] = 235 / df['city-mpg']
data.rename(columns = {'city_mpg': "city-L / 100km"}, inplace = True)
print(data.columns)
# checking the data type of each column
data.dtypes
输出:
第5步:这里,价格是对象类型(字符串),它应该是int或float,所以我们需要改变它。
data.price.unique()
# Here it contains '?', so we Drop it
data = data[data.price != '?']
# checking it again
data.dtypes
输出:
第6步:通过使用简单的特征缩放方法示例(为其余部分做的)和分组–对价值进行归一化处理。
data['length'] = data['length']/data['length'].max()
data['width'] = data['width']/data['width'].max()
data['height'] = data['height']/data['height'].max()
# binning- grouping values
bins = np.linspace(min(data['price']), max(data['price']), 4)
group_names = ['Low', 'Medium', 'High']
data['price-binned'] = pd.cut(data['price'], bins,
labels = group_names,
include_lowest = True)
print(data['price-binned'])
plt.hist(data['price-binned'])
plt.show()
输出:
第7步:对数据分类到数值做描述性分析。
# categorical to numerical variables
pd.get_dummies(data['fuel-type']).head()
# descriptive analysis
# NaN are skipped
data.describe()
输出:
第8步:按照基于发动机尺寸的价格绘制数据。
# examples of box plot
plt.boxplot(data['price'])
# by using seaborn
sns.boxplot(x ='drive-wheels', y ='price', data = data)
# Predicting price based on engine size
# Known on x and predictable on y
plt.scatter(data['engine-size'], data['price'])
plt.title('Scatterplot of Enginesize vs Price')
plt.xlabel('Engine size')
plt.ylabel('Price')
plt.grid()
plt.show()
输出:
第9步:根据车轮、车身样式和价格对数据进行分组。
# Grouping Data
test = data[['drive-wheels', 'body-style', 'price']]
data_grp = test.groupby(['drive-wheels', 'body-style'],
as_index = False).mean()
data_grp
输出:
步骤10:使用透视法,并根据透视法得到的数据绘制热图。
# pivot method
data_pivot = data_grp.pivot(index = 'drive-wheels',
columns = 'body-style')
data_pivot
# heatmap for visualizing data
plt.pcolor(data_pivot, cmap ='RdBu')
plt.colorbar()
plt.show()
输出:
第11步:获得最终结果,并以图表的形式显示出来。由于斜率是沿正方向增加的,所以是正的线性关系。
# Analysis of Variance- ANOVA
# returns f-test and p-value
# f-test = variance between sample group means divided by
# variation within sample group
# p-value = confidence degree
data_annova = data[['make', 'price']]
grouped_annova = data_annova.groupby(['make'])
annova_results_l = sp.stats.f_oneway(
grouped_annova.get_group('honda')['price'],
grouped_annova.get_group('subaru')['price']
)
print(annova_results_l)
# strong corealtion between a categorical variable
# if annova test gives large f-test and small p-value
# Correlation- measures dependency, not causation
sns.regplot(x ='engine-size', y ='price', data = data)
plt.ylim(0, )
输出: