0x00 前言
- 你想知道背單詞軟體有大概多少人註冊第一天都沒有背完嘛?
- 你想知道背單詞軟體這麼火,這麼多人在使用,真的有多少人真的在背誦嘛?
別急,Python程式設計師用資料給你說話.
文章目錄如下:
- 0x00 前言
- 0x01 問題的提出和任務的分解
- 0x02 任務一,資訊爬取
- ox03 任務二,清理和儲存
- 0x04 任務三,分析
- 0x05 任務四,結論
- 0x06 整個流程的不足和反思.
- 0x07 程式碼.
0x01 問題的提出和任務的分解
前兩天,就在一個雷電交加的夜晚,我躺在床上,草草的看了一篇英文文章,突然想到一個非常有意思的問題:
是不是大部分的人做事真的不能堅持呢?比如,背單詞.
好,那我就看看到底有多少人是堅持不下來的?
那麼,我們的問題就變成了這樣子:
- 有多少人是在堅持或者曾經堅持過背單詞呢?(假設100天以上算的上是背單詞的話)
- 有多少夢想,毀於不能堅持?
- 背單詞的人們學習的量,是不是符合正太分佈呢?
於是我選中了業內的標杆扇貝軟體作為分析的物件.抽取其中的大約1/30的使用者的公開資料,也就是遊客使用者都可以看得到的資料,進行抽樣調查.
調查的具體內容如下:
- 打卡最高/成長值最高/學習單詞數量最高
- 平均每個人打卡次數/成長值/學習單詞數量
- 打卡/成長值/學習單詞數量的分佈(也就是已經堅持了多少天了)
那麼,我的任務也就可以分解如下:
- 爬取資料
- 使用Python2的Scrapy進行爬站
- 清理資料
- sql語句和pandas運算
- 分析資料
- pandas + seaborn + ipython book
- 得出結論
0x02 任務一,資訊爬取,清理和儲存
每個使用者的資訊都在這裡:
http://www.shanbay.com/bdc/review/progress/2
使用beautifulsoup4 進行解析即可.其他部分參考程式碼.
扇貝的工程師反爬蟲做的還不錯,主要有兩點:
- 訪問數量超標,封禁IP半個小時.對應的方法就是代理伺服器.(程式碼中已經刪除代理伺服器,所以,如果你執行不了程式碼,那你應該知道怎麼做了.)
- cookie如果不禁用很快就無法爬取.對應的方法就是禁用Cookie.
0x03 任務二,清理和儲存
對於資料庫,使用Postgresql儲存就好了.也沒有什麼大問題.參考程式碼.有問題在評論下面問.
通常情況下在存入資料庫的時候需要進行資料的淨化,不處理也沒有什麼大問題.
0x04 任務三,分析
分析階段,使用IPython notebook. 通常情況下,我們使用的是Anaconda裡面的Python3版本 .可以到這裡下載,注意,mac和ubuntu下載的是命令列版本.
https://www.continuum.io/downloads
安裝完畢以後,重啟終端.環境變數生效.
1 2 |
#直接安裝seaborn pip install seaborn |
切換到指定目錄然後敲入命令ipython notebook開啟瀏覽器進行編輯.
至於怎麼使用,請看程式碼.
0x05 任務三,結論
在這裡省去部分的分析過程直接貼出結論.
總共抓取1111111張網頁,成功獲取610888個使用者的資訊.
於是得出結論如下:
扇貝之最:
- 最高打卡天數: chainyu 1830天
- 最高成長值: Lerystal 成長值 28767
- 最高單詞數量: chenmaoboss 單詞量 38313
平均到每一個人身上
- 平均每人打卡天數: 14.18,而超過成長平均值的人數為71342,佔總抽樣人數的,額,11.69%
- 平均成長值: 121.79,而超過平均成長的人數為13351,佔總抽樣人數的,額,11.42%
- 平均學習單詞數量: 78.92,而背超過平均單詞的人數為13351,佔總抽樣人數的,額,2.19%(注意,真的是2%左右)
那麼,我們來看看打卡,成長值,單詞數量的,分佈吧.
第一個,所有人的打卡數量直方圖.
簡直慘不忍睹.
第二個,非零使用者的打卡數量直方圖.
這真是一段悲傷的故事.由於堅持不了幾天的使用者實在是太多,簡直就是反比例函式嘛,導致影象嚴重畸形.那麼,我們只能分段了看使用者打卡天數在0~20,20~100,100~500,500~2000範圍的分佈圖了.
分別如下:
其他成長值的各種分佈也是如此,在此就不貼出來了.
正如你所看到的,我再來總結一下,
在抽樣中,
- 英語夢死在前0天的有416351人,佔總比68.15%;
- 英語夢死在前1天的有466761人,佔總比76.40%;
- 英語夢死在前2天的有484535人,佔總比79.31%;
- 英語夢死在前5天的有510230人,佔總比83.52%;
- 英語夢死在前10天的有531219人,佔總比86.95%;
- 英語夢死在前20天的有551557人,佔總比90.28%;
- 英語夢死在前50天的有575975人,佔總比的94.28%;
- 英語夢死在前100天的有590700人,佔總比96.69%;
- 英語夢死在前200天的有575975人,佔總比98.36%;
- 英語夢死在前263天的有600875人,佔總比98.81%;
你可以大致感受到殘酷的現實,幾乎沒有多少人可以堅持到200天以後.
但是,你還需要注意到的事情是:
抽樣的來源是ID為1~1111111之間的60W成員
眾所周知的事情是:
- 早期的使用者往往質量相對會高一些.而且,註冊的ID越大,證明註冊時間距離現在越近.獲得200天的機率也就低了不少.
那麼,這樣的話,英語夢死在200天之前的人數比例還會大上不少.
回到文章開始:
問: 背單詞軟體有大概多少人註冊第一天都沒有背完嘛?
答:68.15%
問:有多少人是在堅持或者曾經堅持過背單詞呢?(假設100天以上算的上是背單詞的話)
答:保守估計,不足3.4%
問:有多少夢想,毀於不能堅持?
答:不妨乾了這碗雞湯,歌唱青春一去不復返.
問:背單詞的人們學習的量,是不是符合正太分佈呢?
答:不是,簡直就是反比例函式.
丟擲一個結論:
以絕大部分人努力之低,根本就用不著拼天賦.
贈給你我,共勉.
0x06 整個流程的不足和反思.
扇貝的工程師反爬蟲做的還不錯,主要有兩點:
- 訪問數量超標,封禁IP半個小時.對應的方法就是代理伺服器.
- cookie如果不禁用很快就無法爬取.對應的方法就是禁用Cookie.
爬蟲框架使用Scrapy,這樣就免去了大量的繁瑣的執行緒排程問題,直接寫獲取資訊的邏輯程式碼,以及儲存資訊的邏輯程式碼就好了.
在編寫爬蟲的過程中,有一些經驗:
- 在爬蟲開啟以後,由於我暴力的關閉,導致還是有不少的item沒有完成請求處理和儲存.
- 我在處理異常的時候忘了應當把失敗的item存放放在檔案中,方便我第二次補充,這樣的話就不會丟失一部分的使用者資訊了.
- 代理伺服器需要自己寫指令碼進行測試,否則你可能有很多很多的請求都會超時(畢竟很多代理伺服器還是很不靠譜的).
我的分析資料能力並不是很強,僅僅是從CS109裡面偷學了一點點,然後使用Seaborn畫圖,但是這整個過程中還是覺得自己分析不過來,不是寫不出程式碼,而是不清楚使用什麼樣的資料模型進行分析更好.
0x07 程式碼
程式碼放在了Github上面,咳咳,注意,沒有把代理伺服器放進去.如果你跑一下會發現只能半小時抓取300+頁面,這不是我的問題,是你沒有把代理伺服器填好.程式碼比較粗糙,還請輕拍.
程式碼的地址為:
https://github.com/twocucao/DataScience/
倉庫裡包含了抓取網站的程式碼和分析資料的IPython Notebook,自己閱讀吧.
如果喜歡本文,就點個喜歡吧.