前言
機器學習常用來解決相關分析和迴歸分析的問題,有時候大家會混淆兩者之間的差異,這裏通過對比分析來說明兩者的區別和聯繫,最後會以調用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()