前言
机器学习常用来解决相关分析和回归分析的问题,有时候大家会混淆两者之间的差异,这里通过对比分析来说明两者的区别和联系,最后会以调用sklearn包中LinearRegression方法进行简单线性回归分析为例,说明如何使用python进行数据分析。
一、相关分析和回归分析
1.1 两者的定义
相关分析(Correlation analysis):研究两个或两个以上处于同等地位的随机变量间的相关关系的统计分析方法。
对于线性相关而言有三种类型:正线性相关(总体表现直线朝上);负线性相关;非线性相关。
回归分析(Regression analysis):确定两种或两种以上变量间相互依赖定量关系的统计方法。
根据不同的维度可以将回归分析分为:一元回归和多元multivariate回归分析(因变量多少);简单回归和多重multiple回归分析(自变量多少);线性回归和非线性回归(自变量及因变量间关系类型)。
1.2衡量指标
相关分析:
- 相关系数corrcoef(data):先对变量做标准化变换,然后再计算协方差,把先标准化变换后做协方差运算定义为变量间的相关系数(皮尔逊相关系数)。
- 协方差cov(data,bias=1):描述变量间相互关系,两随机向量X,Y之间的协方差定义为cov(X,Y)=E[(X-E(X))(Y-E(Y))],E表示数学期望。
回归分析:
- 决定系数R平方:评估得到的回归方程是否较好的拟合了样本数据。
1.3区别与联系
两者的区别
- 相关分析中涉及的变量不区分自变量和因变量,变量之间关系是对等的;回归分析中,需要根据研究对象的性质和研究分析的目的,区分变量为自变量和因变量。
- 相关分析中所有变量必须是随机变量;回归分析中,自变量是确定的,而因变量才是随机的。
- 相关分析主要通过“相关系数”反映变量间相关程度的大小,因为变量间关系是对等的,所有相关系数是唯一的;回归分析中,自变量和因变量之间可能存在多个回归方程。
两者的联系
- 相关分析是回归分析的基础和前提,回归分析是相关分析的深入和继续。
- 相关分析表现变量间数量变化的相关程度,回归分析表现变量间数量相关的具体形式。
- 只有变量间存在高度相关时,进行回归分析需求具体形式才有意义。
二、回归分析的Python实现
问题:探究“学习时长”和“学习成绩”之间是否存在相关性关系,如果有找出其回归方程。
2.1理解数据
1、导入数据包
#导入数据包
import warnings
from collections import OrderedDict
import pandas as pd
import numpy as np
warnings.filterwarnings('ignore')
2、创建数据并查看数据
#创建数据并查看数据
examDict={'学习时间':list(np.arange(0.5,5.5,0.25)),
'学习成绩':[10, 22, 13, 43, 20, 22, 33, 50, 62,
48, 55, 75, 62, 73, 81, 76, 64, 82, 90, 93]}
examOrderedDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderedDict)
examDf.head()
#查看数据描述统计信息
examDf.describe()
>>>
学习时间 学习成绩
0 0.50 10
1 0.75 22
2 1.00 13
3 1.25 43
4 1.50 20
学习时间 学习成绩
count 20.00000 20.000000
mean 2.87500 53.700000
std 1.47902 26.435821
min 0.50000 10.000000
25% 1.68750 30.250000
50% 2.87500 58.500000
75% 4.06250 75.250000
max 5.25000 93.000000
3、提取特征值和标签
#特征值:解释变量(自变量),一般加X为后缀
#标签:因变量,一般加y为后缀
exam_X=examDf['学习时间']
exam_y=examDf['学习成绩']
4、利用散点图查看数据间关系
import matplotlib.pyplot as plt
#散点图
plt.scatter(exam_X,exam_y,color='b',label='考试数据')
#横纵轴标签
plt.legend(loc=2)
plt.xlabel('学习时间')
plt.ylabel('学习成绩')
plt.show()
5、求出变量间相关系数
#变量间的相关系数
rDf=examDf.corr()
print(rDf)
>>>
学习时间 学习成绩
学习时间 1.0000 0.9379
学习成绩 0.9379 1.0000
从散点图中,我们可以看出学习时长和学习成绩之间应该存在线性相关关系,且相关系数为0.9379呈现强线性相关关系(模型选择时,我们会创建线性回归模型进行拟合)。
2.2构建模型
1、从数据集中分离出训练数据train和测试数据test
from sklearn.cross_validation import train_test_split
#建立训练集和测试集数据
train_X,test_X,train_y,test_y =train_test_split(exam_X,exam_y,train_size=0.8)
#输出训练集和测试集数据大小
print('训练集大小',train_X.shape,train_y.shape)
print('测试集大小',test_X.shape,test_y.shape)
>>>
训练集大小 (16,) (16,)
测试集大小 (4,) (4,)
2、创建线性回归模型
#导入线性回归模型
from sklearn.linear_model import LinearRegression
#创建模型
model=LinearRegression()
3、训练模型
在这里插入代码片#导入模型的数据应为一列数据
train_X=train_X.values.reshape(-1,1)
train_y=train_y.values.reshape(-1,1)
test_X=test_X.values.reshape(-1,1)
test_y=test_y.values.reshape(-1,1)
print('训练集大小',train_X.shape,train_y.shape)
print('测试集大小',test_X.shape,test_y.shape)
model.fit(train_X,train_y)
>>>
训练集大小 (16, 1) (16, 1)
测试集大小 (4, 1) (4, 1)
2.3评估模型
1、查看模型得分
#查看模型得分
print('模型得分为',round(model.score(test_X,test_y),4))
>>>
模型得分为 0.4662
2、求出并绘制模型拟合线(模型的回归方程)y=a+bx
#模型拟合线(模型的回归方程)y=a+bx
a=model.intercept_
b=model.coef_
print('模型的回归方程是:y=%f+%f x'%(a,b))
>>>
模型的回归方程是:y=4.197326+16.893159 x
#绘制拟合曲线
plt.scatter(train_X,train_y,color='b',label='train data')
test_y_pred=model.predict(test_X)
plt.plot(test_X,test_y_pred,color='black',label='best line')
#测试集数据的散点图
plt.scatter(test_X,test_y,color='r',label='test data')
#坐标轴
plt.xlabel('学习时间')
plt.ylabel('学习成绩')
plt.legend(loc=2)
plt.show()