R實戰之從頭到尾分析廣告資料集

R實戰之從頭到尾分析廣告資料集

前言

這篇文章主要用簡單的線性迴歸模型來介紹統計學中一些很重要的概念。比如:置信區間(confidence interval)、t-statistic、p-value、R2R^2 statistic和F-statistic等一些概念。我會用具體的資料集來分析這些值分別意味著什麼?並用具體的R程式碼來分析資料集並做出一個好的決策?

資料分析之前的幾個重要問題

在提出問題之前,我先介紹一下Advertising資料集。資料集包含了200個不同市場的產品銷售額,每個銷售額對應3種廣告媒體,分別是:TV, radio, 和 newspaper

如果我們能分析出廣告媒體與銷售額之間的關係,我們就可以更好地分配廣告開支並且使銷售額最大化。換句話說:我們的目標是開發出一個基於這3個廣告媒體,準確預測銷售額的模型。

下面,我提出幾個問題,有著這些問題目標,我們的資料分析才有意義。

  1. 廣告預算與銷售額之間存在關係嗎?
  2. 如果存在關係,它們之間的關係有多強?
  3. 哪個媒體與銷售額之間存在關係?
  4. 每個媒體對銷售額有多大的影響?
  5. 我們對未來銷售額的預測有多準確?

這篇文章中,我們假設線性模型是正確的,銷售額之間是不存在協同關係的。在以後的文章中,我會寫這些問題的。

估算線性迴歸係數並評估其準確性

為了清楚地解釋一些統計學上的概念,在這裡我只用最簡單的線性迴歸,也就是隻有一個變數的模型。定義如下模型:

sales^=β0^ β1^×TV^

\hat{sales}=\hat{\beta_0} \hat{\beta_1}×\hat{TV}

在用R估算兩個係數之前,我先給出residual sum of squares(RSS)的定義。如下:

RSS=(y1−β0^−β1^×x1)2 (y2−β0^−β1^×x2)2 ⋯ (yn−β0^−β1^×xn)2

RSS=(y_1-\hat{\beta_0}-\hat{\beta_1}×x_1)^2 (y_2-\hat{\beta_0}-\hat{\beta_1}×x_2)^2 \dots (y_n-\hat{\beta_0}-\hat{\beta_1}×x_n)^2

least squares方法就是選擇出最好的β0^和β1^\hat{\beta_0}和\hat{\beta_1}來最小化RSS.下面我用具體的R程式碼來做這件事情。

adver <- read.csv("Advertising.csv",colClasses=c("NULL",NA,NA,NA,NA)) # 讀取Advertising資料集,跳過第一列
fitadver=lm(Sales~TV,data=adver) # 用線性迴歸fit
coef(fitadver) # 檢視估算出的係數
# plot資料點和已經估算出的線,圖形如下
plot(adver$TV, adver$Sales, col="red", xlab='TV', ylab='sales')
abline(fit1)

R實現線性迴歸

PS:如果你想儲存你的Plots作為圖片,下面的程式碼就行,具體其它的格式請參考Saving Plots in R

dev.copy(png,'myplot.png')
dev.off()

為了更好地分析資料,下面給大家來點理論知識吧。哈哈!!!

上面我們已經估算出了相應的係數,可是這個係數有多麼準確呢?為了更好地解釋這個,我先舉個例子。假設我們有一個隨機變數Y,我們想找出它的平均值μ\mu,但是我只知道它可能取到的一部分值y1,y2,…,yny_1,y_2,\dots,y_n, 因此這部分值的平均值是對μ\mu很合理的一個估算。除非我們非常幸運,否則我們的這個估算值是不可能等於μ\mu的,它要麼比μ\mu小,要麼比μ\mu大。但是,如果我們有很多這樣的集合,我們就可以有很多的估算值,然後我們把這些值平均下來就會等於μ\mu了。那麼對β0和β1\beta_0和\beta_1的估算是同樣的道理。

我們已經知道把很多資料集上估算的值平均下來會很接近真正的μ\mu值。但是,單個估算的值會與真正的μ\mu值相差多少呢?為了回答這個問題,我們要求出μ^\hat{\mu}的standard error.記作SE(μ^)SE(\hat{\mu}).這裡有個非常有名的公式:

Var(μ^)=SE(μ^)2=σ2n

Var(\hat{\mu})=SE(\hat{\mu})^2=\frac{\sigma^2}{n}

由上面的公式我們可以看出,其實求的就是μ^\hat{\mu}的方差,即它離平均值(真正的μ\mu)的距離。同樣的道理, 對於β0^和β1^\hat{\beta_0}和\hat{\beta_1}也有相應的公式。

SE(β0^)2=σ2(1n x¯2∑ni=1(xi−x¯)2)SE(β1^)2=σ2∑ni=1(xi−x¯)2

SE(\hat{\beta_0})^2=\sigma^2\left(\frac{1}{n} \frac{\bar{x}^2}{\sum_{i=1}^n(x_i-\bar{x})^2}\right) \\ SE(\hat{\beta_1})^2=\frac{\sigma^2}{\sum_{i=1}^n(x_i-\bar{x})^2}

  • 上面的σ2=Var(ϵ)\sigma^2=Var(\epsilon)
  • 為了使公式嚴格地成立,我們需要假設每個observation的誤差ϵi\epsilon_i是不相關的

通過上面求出的standard error,我們可以用它來計算confidence intervals.對於β1\beta_1來說:我們有如下的confidence interval:

[β1^−2∗SE(β1^),β1^ 2∗SE(β1^)]

\left[\hat{\beta_1}-2*SE(\hat{\beta_1}),\hat{\beta_1} 2*SE(\hat{\beta_1})\right]

大約有95%的機會真正的β1\beta_1值包含在上面的區間中。對於β0\beta_0也是同樣的道理,我們也可以寫出相似的confidence interval.下面,我用具體的R程式碼來求出上面β1和β0\beta_1和\beta_0的confidence interval.

confint(fitadver)
# 輸出結果如下
2.5 %     97.5 %
(Intercept) 6.12971927 7.93546783
TV          0.04223072 0.05284256

從上面的結果我們可以得出,對於β0\beta_0來說:95%的confidence interval為[6.12971927,7.93546783];對於β1\beta_1來說:95%的confidence interval為[0.04223072,0.05284256]。因此,我們可以得出結論:在沒有廣告的情況下,平均的銷售額為6.12971927和7.93546783之間的某個值。在電視廣告上我們每增加$1,000,增加的平均的銷售額在42.23072和52.84256之間。

standard error也可以對係數執行hypothesis tests.最普遍的假設是null
hypothesis(H0H_0:在X和Y之間沒有關係)和alternative hypothesis(HaH_a:在X和Y之間有關係)。數學上對應的是H0:β1=0和Ha:β1≠0H_0:\beta_1=0和H_a:\beta_1\ne0

為了判斷上面的假設是否正確,下面我來介紹一下t-statistic和p-value這兩個概念。為了拒絕null hypothesis我們需要判斷β1的估算β1^\beta_1的估算\hat{\beta_1}是夠遠離0的,因此我們可以很自信地說β1\beta_1是非0的。但是,多遠算是足夠遠呢?這取決於SE(β1^)SE(\hat{\beta_1})。如果SE(β1^)SE(\hat{\beta_1})是小的,那麼即使是比較小的β1^\hat{\beta_1}也有很強的證據表明β1≠0\beta_1\ne0,因此在X和Y之間存在關係。但是,如果SE(β1^)SE(\hat{\beta_1})是大的,那麼只有在絕對值β1^\hat{\beta_1}很大的時候才能拒絕null hypothesis.在實際應用中,我們通常計算β1^\hat{\beta_1}的t-statistic:

t=β1^−0SE(β1^)

t=\frac{\hat{\beta_1}-0}{SE(\hat{\beta_1})}

上面的公式度量的實際是β1^\hat{\beta_1}距離0的標準差。t越大證明它離0越遠。在假設β1=0\beta_1=0的情況下,p-value是可以觀察到任何值大於等於|t|的概率。簡單地說:在predictor和response之間沒有關係的情況下,一個小的p-value表明你不可能在predictor和response之間觀察到大的關聯。因此,如果我們看到一個小的p-value就可以推斷出在predictor和response之間存在關係。通常情況下,拒絕null hypothesis的p-value的切分點是5%或1%。當n=30,它們分別對應的t-statistic值大約為2和2.75

下面,我來用具體的R程式碼來列印上面模型係數的t-statistic和p-value

summary(fitadver)
# 輸出結果如下
Coefficients:
Estimate Std. Error t value Pr(>|t|)    
(Intercept) 7.032594   0.457843   15.36   <2e-16 ***
TV          0.047537   0.002691   17.67   <2e-16 ***

由於t-statistic的值為係數和其對應的standard error的比值,而β0^和β1^\hat{\beta_0}和\hat{\beta_1}相對於它們的standard error來說很大,所以它們的t-statistic也很大。那麼H0H_0成立的情況下,看到這麼大的t-statistic值的概率幾乎為0,大的t-statistic代表係數離0很遠,因此H0H_0不成立。我們現在可以得出結論為β0≠0和β1≠0\beta_0\ne0和\beta_1\ne0

評估模型的準確性

上面我們已經解釋了估算出的係數的準確性,predictor和response之間是否有關係。下面,我們來解釋一下估算出係數以後,整個模型的準備性到底怎麼樣?此時,你可能會想,只要我們的係數估算的準確,那模型正確率就是100%啊,但事實並非如此。其實我們的資料集來自的模型是這樣的:Y=f(X) ϵY=f(X) \epsilon,即使你把所有的係數都求對,即f(X)f(X)求對,你的預測也不一定正確,因為誤差項我們沒法知道。

因此,我們要從現有的資料集中來評估模型的準確性。下面,我給出residual standard error(RSE)的定義:

RSE=1n−2RSS−−−−−−−−−−√=1n−2∑i=1n(yi−yi^)2−−−−−−−−−−−−−−−−√

RSE=\sqrt{\frac{1}{n-2}RSS}=\sqrt{\frac{1}{n-2}\sum_{i=1}^n(y_i-\hat{y_i})^2}

實際上,RSE就是ϵ\epsilon的標準差的估算。簡單的說,它就是response
(預測值)偏離真正迴歸線的平均值。

回到我們上面的那個例子中,還是用summary那個R命令,我們就可以列印出求得的RSE為3.259。

如果預測值非常接近真實值,那麼RSE將會很小,因此我們可以得出模型非常好在擬合了資料。然而,如果一個或多個observations的預測值和真實值相距很遠,那麼RSE會非常大,這表明模型並沒有很好地擬合資料。

RSE是一種絕對的度量關於模型fit資料的不足。由於它的度量是以預測和真實值之間的絕對差異的形式進行的,因此什麼樣的RSE是一個好的RSE不總是清晰的。下面,我來介紹R2R^2 statistic,它的值始終在0與1之間,它相比RSE來說,具有更好地解釋性。

R2=TSS−RSSTSS=1−RSSTSS

R^2=\frac{TSS-RSS}{TSS}=1-\frac{RSS}{TSS}

  • TSS=∑(yi−y¯)2TSS=\sum(y_i-\bar{y})^2,叫做total sum of squares(TSS)

TSS測量的是關於response的總方差,可以把它當作是線上性迴歸執行前,內在變化性總量。而RSS測量的是線上性迴歸執行後,剩下未解釋的變化性總量。因此,TSS − RSS測量的是通過執行線性迴歸,response中被解釋的變化性總量。R2R^2測量的是Y被X解釋的變化性的比率。R2R^2 statistic接近於1表明response中大部分的變化性都被迴歸給解釋了,而接近於0表明不沒有解釋太多的變化性,出現這樣的情況可能是線性模型是錯的,或者內部誤差σ2\sigma^2很高。

在我們上面的例子中,R2R^2 statistic是0.6119,因此TV只解釋了sales中23\frac{2}{3}的變化性。

多元線性迴歸

現在,我們已經知道了一些統計學的概念。下面,讓我們來完善上面的模型吧。上面我用TV這一個predictor,現在我要用資料集中的所有predictors來構建模型。具體的R程式碼如下:

fitall=lm(Sales~.,data=adver)

在我們執行完多元線性迴歸後,你可能會感興趣下面的幾個問題。

一、至少有一個predictors對於預測response是有用的嗎?

答:在只有一個predictor的時候,我們的H0假設為β1=0H_0假設為\beta_1=0。那麼現在假設我們有p個predictors,我們要把H0的假設修改為β1=β2=⋯=βp=0H_0的假設修改為\beta_1=\beta_2=\dots=\beta_p=0,而Ha為至少有一個βj≠0H_a為至少有一個\beta_j\ne0。先前我們計算t-statistic,現在我們計算F-statistic,公式如下:

F=(TSS−RSS)/pRSS/(n−p−1)

F=\frac{(TSS-RSS)/p}{RSS/(n-p-1)}
如果H0H_0為true,F-statistic的值接近於1;如果HaH_a為true,F-statistic將大於1.通過R中的summary命令,我們列印出上面模型的F-statistic值為570.3,遠遠大於1,這表明有很強的現象認為H0H_0為false.也就是說,大的F-statistic表明至少有一個廣告相關於sales.
然而,到底多大的F-statistic可以認為H0H_0為false呢?答案是這取決於n和p的值。當n很大的時候,僅僅是比1大一點的F-statistic都可以認為H0H_0為false;當n很小的時候,則需要一個更大的F-statistic. 前面t-statistic有一個對應的p-value,而對於F-statistic來說,同樣有其對應的p-value,只要給定對應的n和p值,統計軟體都會幫你計算出相應的p-value值。基於這個p-value,我們可以決定是否拒絕H0H_0
對於我們的資料集來說,F-statistic對應的p-value值非常接近於0,因此我們有強烈的跡象表明至少一個廣告與sales是相關聯的。

現在你可能會想,我們可以看每個係數對應的p-value,其中只要有一個值是非常小的,我們就可以說至少有一個predictor是相關於response的。為什麼要費勁去計算F-statistic呢?這樣的邏輯看似合理,實際上是不對的,尤其是當predictor的數量是非常大的時候。

假設我們有100個predictor,這100個predictor沒有一個與response是相關的。但是,每一個predictor對應的p-value有5%的機會是小於0.05的。也就是說,對於100個predictor而言,我們有5個predictor對應的p-value是小的,即使在我們明知道這100個predictor沒有一個與response是相關的情況下。因此,如果我們想要用單獨的p-value去說明問題的話,那麼會有很大的機率去總結一個錯誤的結論。而F-statistic沒有這樣的弊端,它是獨立於predictor的數量的,即使在H0H_0為true的情況下,它只有5%的概率p-value會很小,不論你有多少的predictor,這個概率都不會變。

二、哪一個predictor是重要的?

答:我們已經用F-statistic去表明至少有一個變數與response是有關聯的。接下來我們會想,哪個變數是有關聯的呢?這裡我只列出幾個經典方法的名字,有興趣的可以去Google一下具體的做法,在以後的文章我會介紹更好的方法。
1、Forward selection
2、Backward selection
3、Mixed selection

三、模型擬合資料有多好?

答:我們還是看R2和RSER^2和RSE這兩個量。
關於R2R^2有一點應該注意:當更多的變數加入到模型中時,即使是這些變數與response有很弱地關聯,R2R^2總是會增加。這是因為加變數使least squares方法更加準確地擬合training data(即使對testing data是沒有必要的),R2R^2也在training data被計算,因此它一定增加。
關於先前計算RSE的公式這裡我也修正一下:

1n−p−1RSS−−−−−−−−−−−−−√

\sqrt{\frac{1}{n-p-1}RSS}
先前的公式只不過是當p=1時的特例

四、作出的預測有多麼準確?

我們這裡不討論模型是否有偏差,也就是說我們認為線性模型是正確的。那麼現在就只剩下兩個應該考慮的問題。

  1. 我們的預測值與真正的f(X)f(X)有多麼接近?
  2. 我們的預測值Y^\hat{Y}與真正的YY有多麼接近?

在回答這兩個問題之前,我先介紹一點知識。

通常情況下,真正Y與X之間的關係是:Y=f(X) ϵY=f(X) \epsilon,你可以把f(X)f(X)想象成我們要通過機器學習手段來學習到資料中潛在的模式,這個是reducible error,我們可以通過恰當的機器學習技術來減少我們的預測模型與它之間的誤差。但是,ϵ\epsilon是irreducible error,這不是一個關於X的函式,因此你不能用X去預測它,在實際應用中我們也沒法測量它,有很多因素會影響它的值,我們不去管它。我們真正關心的是要把reducible error做到最小。

如果你理解我上面說的,confidence interval度量的就是預測值與f(X)f(X)之間有多麼接近。而prediction interval度量的是預測值與Y之間有多麼接近。因此,prediction interval的區間範圍要比confidence interval的區間範圍要寬。

下面我用具體的R程式碼來演示一下:

new <- data.frame(TV=c(2,3,4),Radio=c(345,23,12), Newspaper=c(45,23,2)) # 我們想要預測的新資料
predict(fitall, new, interval="confidence") # 預測的結果以及相應的confidence interval
# 輸出結果如下
fit       lwr       upr
1 68.026587 62.584096 73.469078
2  7.388511  6.922937  7.854086
3  5.382233  4.838660  5.925806
predict(fitall, new, interval="prediction") # 預測的結果以及相應的prediction interval
# 輸出結果如下
fit       lwr       upr
1 68.026587 61.649275 74.403900
2  7.388511  4.032001 10.745022
3  5.382233  2.014018  8.750449

從上面的結果我們也可以看出prediction interval的區間範圍要比confidence interval的區間範圍要寬。

文章開篇問題答案

1題答案如下:

在多元線性迴歸那節,我們計算了F-statistic,它對應的p-value值很小,這表明廣告預算與銷售額之間存在關係。

2題答案如下:

R2R^2 statistics大約為90%,也就是廣告媒體解釋了銷售額90%的方差。這表明廣告媒體與銷售額之間存在很強的關係。

3題答案如下:

我們可以檢視每個predictor對應的p-values值。在多元線性迴歸那節,TV和radio的p-values值是低的,而newspaper不是。這表明只有TV和radio與銷售額之間存在關係。

4題答案如下:

我們看相應係數的置信區間就行了。

5題答案如下:

前面我已經解釋過了,用prediction interval和confidence interval

結尾

有需要資料集的,留言給我,看到之後我發給你。