1、准备工作
这里用到pandas和numpy库
import pandas as pd
import numpy as np
引入自带的数据集合
df = pd.resd_csv(“/resources/jupyter/DA001/DA001-003/clean_df.csv”)
df.head()#查看前5行
输出:
将个体特征模式可视化
#先引入包
!pip install seaborn
#导入可视化库matplotlib和seborn
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#查询数据的类型以便于下一步
df.dtypes
输出:
选择查看其中一列的数据类型:
print(df["stroke"].dtypes)
输出 float64
2、计算其中几项的相关性
函数corr()
df[["bore", "stroke", "compression", "horsepower"]].corr()
输出:可以画散点图观察连续数值变量之间是否有正负相关、或者弱相关的关系。调用函数regplot()
sns.regplot(x = "engine_size", y = "price" ,data = df)
plt.ylim(0,)
至于为什么要加ylim函数,可以从这篇博客里面x = np.linspace、plt.xlim和xticks的区别
通过不同函数得到不同函数的图像表达效果。
总结如下
函数 | 效果 |
---|---|
x = np.linspace(a, b, c) | 画出来的图像仅在a到b之间显示,显示c个点 |
plt.xlim((a,b)) | 画出的x轴被限制在(a,b)中 |
e = np.linspace(a, b, c) plt.xticks(e) | x轴的刻度显示a到b,并且有c个均匀的刻度 |
对于数据类型为int和object的可以使用箱型图。引入seaborn中的函数sns.boxplot()。
不过像下图这样的特征才是最想要的,因为重叠少。
当然还可以用上个博客里面的df.describe(include = [“某列表头”])函数查询各个变量(默认)和某些变量(include)的计数、均值、标准差、最小值、IQR、最大价值。
3、值计算
drive_wheels_counts = df["drive-wheels"].value_counts().to_frame()
print(drive_wheels_counts)
drive_wheels_counts.rename(columns = {"drive-wheels":"value_counts"},inplace = True)#原数据重命名
drive_wheels_counts.index.name = "drive-wheels"#为数据的索引命名
drive_wheels_counts.head()
这个功能可以看到数据的分布。如果分步不均匀,要采取特殊的模型进行预测。比如engine-location有198个front前引擎,3个rear后引擎,数据是倾斜的。
4、数据分组分析
将一列的不同类别的数据分组,并可以对整个类别的数据进行分析,可以观察到一个变量如何影响另一个变量。
一个变量的表达方法:unique()
df["drive-wheels"].unique()
输出:
形成类别数组,然后使用groupby函数分析下列代码实现:平均地来说,哪种类型的驱动轮最有价值。现将驱动轮分组,然后计算平均值。
df_group_one = df[['drive-wheels", "body-style", "price"]]#将这几列的数据提出出来
df_group_one = df_group_one.groupby(["drive-wheels"], as_index = False).mean()
df_group_one
输出:
两个变量的分组计算
df_gptest=df[['drive-wheels','body-style','price']]
grouped_test1=df_gptest.groupby(['drive-wheels','body-style'],as_index= False).mean()
grouped_test1
输出:
两个变量的透视表(函数pivot)。以其中一个变量为行,一个变量为列生成价值表格。
df_gptest=df[['drive-wheels','body-style','price']]#取数据
grouped_test1=df_gptest.groupby(['drive-wheels','body-style'],as_index= False).mean()#做分组
grouped_pivot=grouped_test1.pivot(index='drive-wheels',columns='body-style')#做透视表
grouped_pivot
grouped_pivot=grouped_pivot.fillna(0) #用0代替缺失值
grouped_pivot
输出
5、相关性和因果关系
一般情况下用皮尔森值衡量连续值变量的相关性,方法分析结果衡量分组的差异性质。下面先用可视化的方法观察数据。
plt.pcolor(grouped_pivot, cmap = 'RdBu')#根据刚才的透视图数据grouped_pivot画热图
plt.colorbar()
plt.show()
为图像添加修饰
fig, ax=plt.subplots()
im=ax.pcolor(grouped_pivot, cmap='RdBu')
#标签的名称
row_labels=grouped_pivot.columns.levels[1]
col_labels=grouped_pivot.index
#将刻度和标签移动到中心。
ax.set_xticks(np.arange(grouped_pivot.shape[1])+0.5, minor=False)
ax.set_yticks(np.arange(grouped_pivot.shape[0])+0.5, minor=False)
#插入标签
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(col_labels, minor=False)
#旋转标签如果太长。
plt.xticks(rotation=90)
fig.colorbar(im)
fig.colorbar(im)
5.1皮尔森person相关
度量两个变量之间的线性依赖关系(比如在这个例子中,可以计算衡量各个连续值属性和price的相关性。具体计算方式参考这篇博客
两个连续变量(X,Y)的pearson相关性系数(Px,y)等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX,σY)。系数的取值总是在-1.0到1.0之间,接近0的变量被成为无相关性,接近1或者-1被称为具有强相关性。
from scipy import stats
pearson_coef, p_value = stats.pearsonr(df['wheel-base'], df['price'])#分别计算皮尔森值和对应的显著性水平
print("P is", pearson_coef, " with a P-value of P =", p_value) #输出
得出的结论举例:
由于p值< 0.001,孔与价格之间的相关性具有统计学意义,但线性关系仅为中度(~0.521)。
由于p值< 0.001,发动机尺寸与价格之间的关系具有统计学意义,线性关系非常强。
由于p值< 0.001,城市mpg与价格之间的相关性具有统计学意义,而~ -0.687的系数为负,且为中等强度。
6、方差分析
统计同一个属性的不同组数据之间是否有限显著差异。方差分析返回两个参数
- F-test评分。ANOVA假设所有组的平均值是相同的,然后通过计算平均值偏离假设的程度来得到评分值,值越大差距越大。
- P值。同上,计算其显著性水平。
6.1、F-test评分计算方法
由于ANOVA是分组进行的,仍然能用到groupby函数
grouped_test2=df_gptest[['drive-wheels','price']].groupby(['drive-wheels'])
#对drive-wheels和price进行分组
grouped_test2.head(2)输出为:
grouped_test2.get_group('4wd')['price']#将drive-wheels中值为4wd的price值取出来。
from scipy import stats#引库
f_val, p_val = stats.f_oneway(grouped_test2.get_group('fwd')['price'], grouped_test2.get_group('rwd')['price'], grouped_test2.get_group('4wd')['price']) #计算
print( "ANOVA results: F=", f_val, ", P =", p_val)#输出值
由stats.f_oneway函数计算进行方差分析stats.f_oneway(drives中值为fwd的, drives中值为rwd的, drives中值为4wd的)
输出为:
ANOVA results: F= 67.9540650078 , P = 3.39454435772e-23