標籤:

紙上得來終覺淺 絕知此事要躬行

為什麼已經「學過」的東西在用的時候不給力?

在日常工作中,我會比較頻繁地用到R作為工具,但時常會出現這樣的現象:系統報錯後一通折騰,最後才發現是由於非常基礎的問題造成的;寫了N多行代碼才搞定的事情其實通過對基本命令活學活用,簡單幾行代碼就能解決問題……

最近重溫《R語言實戰》第一章和第二章,其中一些工作空間、輸入和輸出等方面的函數確實很有用,之前也確實看到過,但卻從沒有在實際中使用過。因為在現實工作中使用R的時候,這些東西在大腦里根本檢索不到,只有再次在資料里相遇的時候才有印象其實之前已經「學過」了。

在《大數據分析的道與術》中有一段話寫得很好:

學習為思考提供了素材和彈藥,但只學習而不思考,相當於沒有把學到的知識轉化為解決問題的能力、或成為探索世界的武器。面對實際問題時,依然回憶不起哪些所學知識可以幫助我們解決問題。《暗時間》一書中提到了一種關於人類記憶的理論:死記硬背,如抱著英語詞典背單詞,大腦存儲的索引是單詞順序表,很容易把單詞的順序記憶的很好。比如給定一個單詞,雖然記不起來這個單詞的意思,但能夠說出它的上一個單詞和下一個單詞。但語言的應用場景並不是這樣,需要在語境表達中判斷是否使用這個詞,這是另一種不同的索引。不正確的記憶索引,造成大多數中國學生單詞背得好,但口語和寫作能力很差。美國人在日常交流中只有幾千個常用辭彙,但因為他們對辭彙的記憶索引是應用場景,所以口語和寫作表達都非常順暢。那麼,如何將學習到的知識,轉變成一種基於應用場景的記憶索引呢?方法就是思考與實踐。其中,思考本身也是一種實踐,使人對知識的掌握更加系統化和深入化。

這是讀書和實踐的關係問題。因為對於這些知識,我只是在讀書的時候「看過」,而沒有「用過」,實踐得不夠。這些內容沒能被我從書上「固有的知識」轉化為實際中「嫻熟的技能」,更沒有內化成自己「真正的能力」。

讀書並不是學習的全部,而只是其中很小的一部分。學習包括讀書、思考、練習、實踐、質疑、反思等多個環節,並且這多個環節相互繼承、相互影響並且往複循環。將「看過」等同於「學過」是一種常見的錯覺,如果僅僅是「看過」,當然不能取得「學過」的效果。看完一本書就能掌握書中的內容是絕對不可能的,這之間還有很長的路要走,只能說明已經站在了起點位置而已。如果期望把《XXXX大全》認真地通讀過之後就能成為XXXX大師,那更是天方夜譚了。

捅破「窗戶紙」

學習每一樣東西,大多會經歷從無知到入門,進而到了解、掌握、精通這些里程碑中的部分或者全部。每次段位的升級都需要一個量變到質變的過程,捅破了那層「窗戶紙」就到了下一層境界。入門R語言數據結構的「窗戶紙」是各數據結構的概念、本質和之間的差別。

這次,嘗試使用網路爬蟲來爬取噹噹網中,關鍵字為「python」的自營書籍的信息:

代碼如下:

#安裝並載入R網路爬蟲包"rvest"install.packages("rvest")library(rvest)f<-function(i,p,n,d){#提取每一個商品的信息 mdpi<-mdp%>%html_nodes(paste0("li[ddt-pit=",i,"]")) k<-(p-1)*n+i #位置 d[k,1]<<-paste0(p,"-",i) #書名 d[k,2]<<-ifelse(length(mdpi%>%html_nodes("a.pic")%>%html_attr("title"))>0, mdpi%>%html_nodes("a.pic")%>%html_attr("title"), NA) #售價 d[k,3]<<-ifelse(length(mdpi%>%html_nodes("span.search_now_price") %>%html_text())>0, mdpi%>%html_nodes("span.search_now_price") %>%html_text(), NA) #定價 d[k,4]<<-ifelse(length(mdpi%>%html_nodes("span.search_pre_price") %>%html_text())>0, mdpi%>%html_nodes("span.search_pre_price")%>%html_text(), NA) #作者 d[k,5]<<-ifelse(length(mdpi%>%html_nodes("p.search_book_author") %>%html_nodes("span:first-child") %>%html_nodes("a:first-child")%>%html_attr("title"))>0, mdpi%>%html_nodes("p.search_book_author") %>%html_nodes("span:first-child") %>%html_nodes("a:first-child")%>%html_attr("title"), NA) #出版日期 d[k,6]<<-ifelse(length(mdpi%>%html_nodes("p.search_book_author") %>%html_nodes("span:nth-child(2)")%>%html_text())>0, mdpi%>%html_nodes("p.search_book_author") %>%html_nodes("span:nth-child(2)")%>%html_text(), NA) #出版社 d[k,7]<<-ifelse(length(mdpi%>%html_nodes("p.search_book_author a[name=P_cbs]") %>%html_text())>0, mdpi%>%html_nodes("p.search_book_author a[name=P_cbs]") %>%html_text(), NA) #評論數 d[k,8]<<-ifelse(length(mdpi%>%html_nodes("p.search_star_line") %>%html_nodes("a[name=itemlist-review]") %>%html_text())>0, mdpi%>%html_nodes("p.search_star_line") %>%html_nodes("a[name=itemlist-review]")%>%html_text(), NA) #補充介紹 d[k,9]<<-ifelse(length(mdpi%>%html_nodes("p[name=title]") %>%html_nodes("a[name=itemlist-title]") %>%html_attr("title"))>0, mdpi%>%html_nodes("p[name=title]") %>%html_nodes("a[name=itemlist-title]")%>%html_attr("title"), NA) #推薦 d[k,10]<<-ifelse(length(mdpi%>%html_nodes("p.detail")%>%html_text())>0, mdpi%>%html_nodes("p.detail")%>%html_text(),NA)} g<-function(p,url,n,d){#提取每一頁中的商品信息 urlp<-paste0(url,"&page_index=",p) mdp<<-urlp%>%read_html(encoding="GBK")%>%html_nodes("ul.bigimg") mapply(f,1:n,MoreArgs=list(p,n,d))}h<-function(url,n,p,c,s){#提取全部商品信息 #url:首頁地址;n:每頁提取幾個商品;p:共有幾頁; #c:每個商品提取的信息個數;s:商品關鍵字 d<<-matrix(data=NA,nrow=n*p,ncol=c, dimnames=list(rownames=NULL, colnames=c("locat","bookname", "now_price","price", "author","Publication", "press","comment", "supplement","recommend"))) mapply(g,1:p,MoreArgs=list(url,n,d)) d<<-data.frame(d) write.csv(d,paste0("D:/data_",s,".csv"),row.names=F)}#輸入商品首頁地址url_python<-"http://search.dangdang.com/?key=python&ddsale=1"#執行函數h(url=url_python,n=60,p=7,c=10,s="python")

這段代碼可以作為在噹噹網上爬取書籍信息的一個模板,修改後可直接使用。

這次嘗試爬蟲的「窗戶紙」是CSS語法,在網上找到CSS語法,對照著來寫也就基本上可以爬到簡單的信息了。

有了數據,接下來就要對數據進行清洗和整理。在數據整理方面的從無知到入門的那層「窗戶紙」是正則表達式,也基本上是對照著正則表達式的規則來寫即可。(由於數據整理的代碼比較繁雜,為了平衡文章結構就不將代碼列出了,如果有需要,可以給我留言。)

現在就出發!

包括我在內的不少人,在接觸新領域時會有這樣的想法:我現在知道的東西太少了,還不足以去實踐,等我再多學一些以後再說吧。其實,這是一種錯覺,實踐這件事實際上並沒有我們想像的那麼高的門檻,幾乎是可以隨時隨地開展的。

學習了數據結構,做一些力所能及的實踐完全是沒有問題的。現在已然一葉扁舟在此,嘗試著在數據海洋中航行,看雲捲雲舒,看日出日落。千萬不要以知識不足為借口而拒絕下水實踐,勇敢一些就好!

推薦閱讀:

分析泰坦尼克號遇難數據 - 張然
python入門第一課——安裝python和編譯器
開始做一件事情的最好時刻,是現在
數據分析(1)-Python基礎
數據分析入門之PYTHON語法

TAG:數據分析 |