1. 程式人生 > >《深入淺出資料分析》一書要點記錄(三):第10章到第13章

《深入淺出資料分析》一書要點記錄(三):第10章到第13章

10. 迴歸——預測

要點:

(1)演算法:為了完成某個計算而執行的任何過程。

(2)散點圖:見第4章,用於顯示觀察結果的成對關係。

(3)平均值圖:一種散點圖,顯示了與X軸上的每個區間相對應的Y軸數值。

(4)迴歸線:最準確地貫穿平均值圖中各個點的直線,可以用等式來表達,用來預測某個範圍內的X變數對應的Y變數。

斜率b的計算如下(其中r是相關係數,σ是標準偏差):

b=r \times \sigma _{y }/\sigma _{x }

(5)相關性:兩種變數之間的線性關係,對應的散點圖上的點會大致沿著直線分佈。相關係數叫做r,範圍為-1到1,0表示無相關性。

案例:

根據過去提過的加薪要求和對應的加薪結果,製作了一個加薪資料迴歸方程,用於替客戶預測給定加薪要求的加薪結果。

R指令:

employees <- read.csv("xxx/hfda_ch10_employees.csv", header=TRUE): 載入csv檔案

plot(employees$requested[employees$negotiated==TRUE], employees$received[employees$negotiated==TRUE]): 繪製散點圖,[]內的條件是要求加薪的

cor(employees$requested[employees$negotiated==TRUE], employees$received[employees$negotiated==TRUE]): 計算加薪要求和加薪結果之間的相關係數

myLm <- lm(received[negotiated==TRUE]~requested[negotiated==TRUE], data=employees): 建立一個線性模型

myLm$coefficients: 顯示截距a和斜率b

my_raise <- 5, 2.3 + 0.7*my_raise: 已知x (my_raise),使用線性迴歸方程(y = 2.3 + 0.7x)計算y

資料:

hfda_ch10_employees.csv加薪資料表

11. 誤差——合理誤差

要點:

(1)外插法:用迴歸方程預測資料範圍以外的數值。因為對這裡的情況不瞭解,所以如果要使用此法,就需要指定附加假設條件,明確表示不考慮資料集外發生的情況。

(2)內插法:對資料範圍內的點進行預測。

(3)機會誤差(殘差):實際結果與預測結果之間的偏差。可以用均方根誤差定量表示線性迴歸方程的殘差分佈。

均方根誤差的計算如下(其中r是相關係數,σ是標準偏差):

\sigma _{y }\times \sqrt{1-r^{2}}

(4)分割:將資料分拆為幾個組成為分割。如果為幾個分組分別建立預測模型比單獨使用一個模型更能減小誤差,則應進行分割。

案例:

通過把加薪資料分割為兩組,建立了兩個擁有更低均方根誤差和更靠譜斜率的迴歸方程模型,並指出了加薪方程式應用範圍,讓客戶可以更好地預測加薪結果。

R指令:

employees <- read.csv("xxx/hfda_ch10_employees.csv", header=TRUE): 同上一章

myLm <- lm(received[negotiated==TRUE]~requested[negotiated==TRUE], data=employees): 同上一章

summary(myLm): 顯示模型的統計彙總

summary(myLm)$sigma:顯示均方根誤差

myLmBig <- lm(received[negotiated==TRUE & requested > 10]~requested[negotiated==TRUE & requested > 10], data=employees):以高出10%的加薪資料建立一個線性模型,是激進談判者的新模型

myLmSmall <- lm(received[negotiated==TRUE & requested <= 10]~requested[negotiated==TRUE & requested <= 10], data=employees):以低於或等於10%的加薪資料建立一個線性模型,是膽小談判者的新模型

summary(myLmSmall)$coefficients:顯示截距a和斜率b

summary(myLmSmall)$sigma:顯示均方根誤差

summary(myLmBig)$coefficients

summary(myLmBig)$sigma

資料:

hfda_ch10_employees.csv加薪資料表(同上一章)

12. 關係資料庫——你能關聯嗎?

要點:

(1)資料庫:一張表格或一組表格,表格以某種方式對資料進行管理,是資料之間的相互關係顯而易見。資料庫軟體對錶格進行管理。比如Oracle、MySQL等。

(2)關係資料庫管理系統(Relational Database Management System, RDBMS): 最重要最有效地資料管理方法之一。每一行都有一把鑰匙,通常稱為ID(標識),鑰匙可以確保這些量化關係不被破壞。其中的資料可以進行無窮無盡的比較。

(3)SQL(Structured Query Language): 結構化查詢語言,是一種關係資料庫檢索方法,可以通過輸入程式碼或使用能建立SQL程式碼的圖形介面,令資料庫回答你的SQL問題。

案例:

通過關聯資料庫和散點圖,幫助《資料邦新聞》一刊找到了最佳文章數目用來確保最高銷量,以及最受歡迎的作者用來提高銷量。

Excel公式:

(1)Article count列公式,用來計算issues表格裡的issueID(A2)在articles表格裡的issueID一列裡(B:B)的出現次數,即計算該期刊的文章數目:

=COUNTIF(hfda_ch12_articles.csv!B:B,hfda_ch12_issues.csv!A2)

(2)Sales列公式,用來計算當issues表格裡的issueID(A2)在sales表格裡的issueID一列裡(B:B)出現時,對應lotSize一列裡(C:C)的銷量總和,即每一期的總銷量:

=SUMIF(hfda_ch12_sales.csv!B:B, hfda_ch12_issues.csv!A2, hfda_ch12_sales.csv!C:C)

(3)關於如何自動填充一列的公式,可參考網頁如下:

R指令:

dispatch <- read.csv("xxx/dispatch analysis.csv", header=TRUE): 載入csv檔案

plot(Sales~jitter(Article.count),data=dispatch): 繪製散點圖,並利用jitter使資料相互分隔,更容易識別

articleHitsComments <- read.csv("xxx/hfda_ch12_articleHitsComments.csv",header=TRUE)

library(lattice): 載入lattice資料包

xyplot(webHits~commentCount|authorname,data=articleHitsComments): 根據作者名稱authorname,建立散點圖

資料:

hfda_ch12_issues.csv期數表格,hfda_ch12_sales.csv銷量表格,hfda_ch12_articles.csv文章表格 -> 資料需要彙總到dispatch.csv

hfda_ch12_articleHitsComments.csv評論率和點選率表格

13. 整理資料——井然有序

要點:

(1)清理混亂資料的步驟:

儲存原始資料副本 -> 設想資料集的最終外觀 -> 區分混亂資料中重複出現的模式 -> 整理並重新構造 -> 使用最終資料

(2)正則表示式:一種程式設計工具,可以用這個工具指定複雜的模式以便匹配和替換文字字串。

案例:

通過分隔資料、刪除不必要的字元及資料列和刪除重複資料,為Head First獵頭公司整理了一份求職人員名單。

Excel指令:

(1)選擇A列資料,點選資料選項卡下的“分列”按鈕,用“#”作為分隔符號,將資料分為多個列。

(2)NewFirstName列公式,用來把FirstName(B2)裡的"^"符號替換成"",即刪去FirstName裡的"^"符號:

=SUBSTITUTE(B2,"^","")

R指令:

hfhh <- read.csv("xxx/hfda_data_for_R.csv",header=TRUE): 載入csv檔案

NewLastName <- sub("\\(.*\\)","",hfhh$LastName):把帶有"()"和其中包括的所有字元替換成""

hfhh$LastName <- NULL: 刪除原有的LastName向量

hfhh("LastName") <- NewLastName: 在hfhh中增加LastName向量

write.csv(hfhh, file="hfhh.csv"): 將結果寫入csv檔案

hfhhSorted <- hfhh[order(hfhh$PersonID), ]: 根據PersonID一列對資料框架排序

hfhhNamesOnly <- hfhhSorted: 建立新資料框架

hfhhNamesOnly$CallID <- NULL: 刪除不必要數列CallerID

hfhhNamesOnly$Time <- NULL: 刪除不必要數列Time

hfhhNamesOnly <- unique(hfhhNamesOnly): 刪除重複資料

write.csv(hfhhNamesOnly, file="hfhhNamesOnly.csv")

資料:

hfda_ch13_raw_data.csv原始求職人員名單