1、什么是線性回歸
- 線性回歸(Linear Regression)是利用數(shù)理統(tǒng)計中回歸分析椿疗,來確定兩種或兩種以上變量間相互依賴的定量關(guān)系的一種統(tǒng)計分析方法。
- 線性回歸利用稱為線性回歸方程的最小平方函數(shù)對一個或多個自變量和因變量之間關(guān)系進行建模。這種函數(shù)是一個或多個稱為回歸系數(shù)的模型參數(shù)的線性組合。只有一個自變量的情況稱為簡單回歸,大于一個自變量情況的叫做多元回歸躁锁。
2、線性回歸模型的應用
線性回歸模型屬于經(jīng)典的統(tǒng)計學模型卵史,應用場景是根據(jù)已知變量(自變量)來預測某個連續(xù)的數(shù)值變量(因變量)战转。例如,餐廳根據(jù)每天的營業(yè)數(shù)據(jù)預測就餐規(guī)囊郧或營業(yè)額槐秧;醫(yī)生根據(jù)患者病例數(shù)據(jù)預測某種疾病發(fā)生的概率。
3、一元線性回歸
一元線性回歸刁标,也就是有一個自變量颠通,其模型可以表示為: y = a + bx + ?
其中,x為自變量,y為因變量命雀,a為截距,b為斜率斩箫,?為誤差項的隨機變量吏砂。a和b統(tǒng)稱為回歸系數(shù),誤差項?是為了平衡等號兩邊的值而存在乘客,通常被稱為模型無法解釋的部分狐血。可以這么來理解?:我們對y的預測是不可能達到與真實值完全一樣的易核,這個真實值只有上帝知道匈织,因此必然會產(chǎn)生誤差,我們就用?來表示這個無法預測的誤差牡直。
4缀匕、一元線性回歸實例
下面以《深入淺出統(tǒng)計學》最后一章的案例來演示一元線性回歸模型的應用:兩個兄弟打算開露天音樂會,可是不幸天上飄來烏云碰逸。他們想要根據(jù)天晴時數(shù)來預測出音樂會聽眾人數(shù)乡小。
import pandas as pd
h = [1.9, 2.5, 3.2, 3.8, 4.7, 5.5, 5.9, 7.2]
p = [22, 33, 30, 42, 38, 49, 42, 55]
df = pd.DataFrame({'晴天時數(shù)':h, '聽眾人數(shù)(百人)':p})
df
晴天時數(shù) 聽眾人數(shù)(百人)
0 1.9 22
1 2.5 33
2 3.2 30
3 3.8 42
4 4.7 38
5 5.5 49
6 5.9 42
7 7.2 55
以上為樣本數(shù)據(jù),利用這些數(shù)據(jù)饵史,我們?nèi)绾位诋斕斓奶烨鐣r數(shù)估計出票情況满钟?
4.1 相關(guān)性
首先繪制散點圖,觀察一下兩個變量之間的關(guān)系
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(df['晴天時數(shù)'], df['聽眾人數(shù)(百人)'], color='b')
通過散點圖趨勢可以看出晴天時數(shù)和聽眾人數(shù)成正相關(guān)關(guān)系胳喷,即隨著天晴時數(shù)的增加湃番,聽眾人數(shù)也會增加。那么如何通過晴天時數(shù)預測聽總會人數(shù)呢吭露?辦法就是在散點圖上畫一條直線吠撮,是這條直線盡量接近各個點。能最好的接近所有數(shù)據(jù)點的直線被稱為最佳擬合線讲竿。
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
sns.lmplot(x='聽眾人數(shù)(百人)', y='晴天時數(shù)', data=df, ci=None)
通過上圖畫出來的就是最佳擬合線纬向,但是它是怎么求得的呢?
4.2 擬合線求解
如何確定兩個系數(shù)a和b呢?人們總是希望尋求一定的規(guī)則和方法戴卜,使得所估計的樣本回歸方程是總體回歸方程的最理想的代表逾条。最理想的回歸直線應該盡可能從整體來看最接近各實際觀察點,即散點圖中各點到回歸直線的垂直距離投剥,即因變量的實際值與相應的回歸估計值的誤差整體來說為最小师脂。由于誤差有正有負,正負會相互抵消,通常采用觀測值與對應估計值之間的誤差平方總和來衡量全部數(shù)據(jù)總的誤差大小吃警。因此糕篇,回歸直線應滿足的條件是:全部觀測值與對應的回歸估計值的誤差平方的總和為最小(最小二乘法)酌心,即:
最小
由于自變量x和因變量y的值都是已知的拌消,因此求解誤差平方和的問題就是求目標函數(shù)的最小值問題,而該函數(shù)的參數(shù)就是a和b安券。
該目標函數(shù)為一個二元二次函數(shù)墩崩,分別對a和b求偏導,令結(jié)果為0侯勉,即為目標函數(shù)的最小值鹦筹,同時求出a和b的值。
最終求得結(jié)果:
4.3址貌、Python實現(xiàn)
from sklearn import linear_model
linear = linear_model.LinearRegression()
linear.fit(df['晴天時數(shù)'].values.reshape(-1,1), df['聽眾人數(shù)(百人)'])
print('斜率b:', linear.coef_[0])
print('截距a:', linear.intercept_)
斜率b: 5.336410534890034
截距a: 15.728319304914475
所以線性回歸模型可表示為:聽眾人數(shù)(百人)= 15.73 + 5.34 * 晴天時數(shù)(小時)铐拐。 第二圖中的最佳擬合線即為此方程得出,被稱為回歸線练对。
這樣我們就可以預測不在數(shù)據(jù)集中的晴天時數(shù)對應的聽眾人數(shù)了遍蟋。兩兄弟說聽眾人數(shù)超過3500才不會賠本。我們可以利用回歸方程算下至少需要多少的晴天時數(shù)呢
h = (35 - 15.73) / 5.34
print('至少需要晴天%.2f小時才不會賠本' %h)
至少需要晴天3.61小時才不會賠本
模型算出來了螟凭,那么這個模型的擬合程度怎樣呢匿值?為此我們需要進行評估。
決定系數(shù)R2(R的平方),它是可以用x變量進行解釋的y變量的變異百分數(shù)赂摆,例如可以用決定系數(shù)指出露天音樂會聽眾人數(shù)中有多大比例的變異可以由預計天晴時數(shù)進行解釋挟憔。
- 如果R2=0,則無法從x預測y值烟号。
- 如果R2=1绊谭,則可以從x預測y值,且無誤差
- 如果R2介于0和1之間汪拥,R2越接近1达传,越能通過x預測y;越接近0迫筑,x越無法預測y宪赶。
R2可以利用score()函數(shù)進行計算
linear.score(df['晴天時數(shù)'].values.reshape(-1,1), df['聽眾人數(shù)(百人)'])
0.8394574407934108
R2=0.84,可以看出模型的擬合程度還是可以的脯燃。
4.4搂妻、變量的顯著性檢驗
變量的顯著性檢驗的目的:剔除回歸系數(shù)中不顯著的解釋變量(也就是X),使得模型更簡潔辕棚。在一元線性模型中欲主,我們只有有一個自變量X邓厕,就是要判斷X對Y是否有顯著性的影響;多元線性回歸中扁瓢,驗證每個Xi自身是否真的對Y有顯著的影響详恼,不顯著的就應該從模型去掉。
這里用到statsmodels模塊中的summary()函數(shù)進行驗證
import statsmodels.api as sm
df.columns = ['h', 'p']
model = sm.formula.ols('p~h', data=df).fit()
model.summary()
Dep. Variable: p R-squared: 0.839
Model: OLS Adj. R-squared: 0.813
Method: Least Squares F-statistic: 31.37
Date: Thu, 21 Feb 2019 Prob (F-statistic): 0.00138
Time: 20:52:56 Log-Likelihood: -22.359
No. Observations: 8 AIC: 48.72
Df Residuals: 6 BIC: 48.88
Df Model: 1
Covariance Type: nonrobust
coef std err t P>|t| [0.025 0.975]
Intercept 15.7283 4.437 3.545 0.012 4.871 26.586
h 5.3364 0.953 5.601 0.001 3.005 7.668
Omnibus: 2.454 Durbin-Watson: 3.403
Prob(Omnibus): 0.293 Jarque-Bera (JB): 0.846
Skew: 0.188 Prob(JB): 0.655
Kurtosis: 1.452 Cond. No. 13.3
T檢驗(P>|t|=0.001)用于對某一個自變量Xi對于Y的線性顯著性引几,如果某一個Xi不顯著昧互,意味著可以從模型中剔除這個變量,使得模型更簡潔伟桅。p值小于0.05即通過顯著性檢驗敞掘。
F檢驗(F-statistic=31.37)用于對所有的自變量X在整體上看對于Y的線性顯著性。