「Python 數據分析系列」數據科學基本介紹

來源 |  Data Science from Scratch, Second Edition

校對 | gongyouliu

編輯 | auroral-L

第一章  數據科學基本介紹

1.1 數據的崛起

1.2 什麼是數據科學

1.3 激勵假設:DataSciencester

    1.3.1 尋找關鍵聯繫人

    1.3.2 你可能知道的數據科學家

    1.3.3 工資和工作年限

    1.3.4 付費賬戶

    1.3.5 感興趣的主題

    1.3.6 展望

“數據!數據!!數據!!!” 他不耐煩地咆哮着,“巧婦難爲無米之炊!”

——阿瑟 • 柯南 • 道爾

1.1 數據的崛起

生活中,數據無處不在。網站會記錄每個用戶的每次點擊。智能手機會記錄你每時每刻的位置和速度。“量化自我的人” 戴着智能計步器記錄自己的心率、運動習慣、飲食習慣和睡眠模式。智能汽車記錄駕駛習慣,智能家居記錄生活習慣,智能購物設備記錄購買習慣。互聯網本就是一幅巨大的知識圖譜,其中包括(除此之外)有無數交叉引用的百科全書,如電影、音樂、體育賽事、彈球機、表情包、雞尾酒等特定領域的數據庫,以及很多政府部門發佈的不計其數的統計數據(其中一些還挺真實的) 充斥在你的頭腦中。

在這些數據中隱藏着無數問題的答案,有些問題甚至無人提及。我們將在本書中學習如何找到這些答案。

1.2 什麼是數據科學

有一個笑話說,數據科學家是計算機科學家中的統計學家,也是統計學家中的計算機科學家。(哈哈,好像並不好笑。)事實上,一些數據科學家從實際的角度看就是統計學家,而其他數據科學家則與軟件工程師沒什麼區別。有些數據科學家是機器學習專家,有些數據科學家則在機器學習方面知之甚少。有些數據科學家是博士,出版過令人印象深刻的學術作品,而有些數據科學家卻從未閱讀過學術論文(這有點尷尬)。所以說,無論如何定義數據科學,你都會發現有些數據科學從業者與那些定義完全不相稱。

儘管如此,這並不能阻止我們嘗試定義數據科學家。我們會說數據科學家是從凌亂的數據中提取有用信息的人。今天,世界各地有無數人在此領域耕耘。

例如,交友網站 OkCupid 要求其會員回答成百上千個問題,以便爲他們找到最合適的交友對象。但它也會分析這些聽起來無害的問題,比如你可以從某人回答的問題中得出他 / 她有多可能在第一次約會時和你上牀。

Facebook 要求你填寫家鄉位置和居住位置的信息,表面上是爲了讓你的朋友更容易找到你並與你聯繫,但它也會分析這些位置,以研究全球移民模式以及各個橄欖球隊的粉絲羣的分佈情況。

大型零售商 Target 會跟蹤你線上和線下的購買習慣和互動習慣。它使用這些數據預測哪些顧客懷孕了,以便更好地向她們推銷母嬰商品。

2012 年,奧巴馬的競選團隊僱用了數十名數據科學家,他們通過數據挖掘和實驗的方式來識別需要額外關注的選民,選擇最佳的針對特定捐助者的籌款呼籲和方案,並將投票努力集中在最有可能有用的地方。在 2016 年,特朗普的競選活動測試了令人震驚的各種在線廣告,並分析了這些數據,以找出哪些是有效的,哪些是無效的。

現在,如果你開始覺得上面的例子枯燥,那麼讓我們看一些更有意義的善舉:一些數據科學家偶爾會利用他們的技能提高政府的工作效率,幫助無家可歸者,並改善公共健康等。當然,如果你能想出提高廣告點擊率的好方法,這同樣會對你的職業生涯有幫助。

1.3 激勵假設:DataSciencester

恭喜!你剛剛被聘請來領導 DataSciencester 的數據科學工作。DataSciencester 是數據科學家的社交網絡。

注意

在寫本書第 1 版時,我認爲 “數據科學家的社交網絡” 是一個有趣而愚蠢的提議。在那之後,人們實際上已經爲數據科學家創建了社交網絡,並且從風險投資公司那裏籌集的資金遠遠超過我從寫書中得到的收益。或許這是一個關於愚蠢的數據科學假設和出版圖書的寶貴教訓。

雖然是爲數據科學家服務,但 DataSciencester 從未真正實踐數據科學工作。(公正地說,DataSciencester 從未真正構建自己的產品。)這是你的工作!在本書中,我們將通過解決在工作中遇到的實際問題來學習數據科學的概念。我們有時會研究用戶直接提供的數據,有時會研究用戶與網站交互生成的數據,有時甚至會研究我們自己設計的實驗所產生的數據。

由於 DataSciencester 具有強大的原創精神,因此我們將從頭開始構建自己的工具。完成這些工作後,你會對數據科學的基礎知識有一個非常深刻的理解。你能將這項技能應用於更有前景的公司,或者着手解決任何有趣的問題。

歡迎加入 DataSciencester,祝你好運!(星期五可以穿牛仔褲上班,衛生間在大廳的右邊。)

1.3.1 尋找關鍵聯繫人

這是你在 DataSciencester 工作的第一天,網絡部副總有一堆關於用戶的問題沒有解決。以前他都沒有能討教的人,現在你來了,他很高興。

具體來說,他希望你確定誰是數據科學家中的 “關鍵聯繫人”。爲此,他爲你提供了整個 DataSciencester 用戶網絡的數據。(在實際工作中,人們通常不會向你提供所需的數據。第 9 章專門討論了獲取數據的方法。)

這是些什麼樣的數據呢?它是一個用戶信息列表,每一行都由包含用戶 ID(即 id,一串數字)和用戶名稱(即 name)的字典(dict)組成:

users = [ 
{ "id": 0, "name": "Hero" },{ "id": 1, "name": "Dunn" }, 
{ "id": 2, "name": "Sue" }, 
{ "id": 3, "name": "Chi" }, 
{ "id": 4, "name": "Thor" }, 
{ "id": 5, "name": "Clive" }, 
{ "id": 6, "name": "Hicks" }, 
{ "id": 7, "name": "Devin" }, 
{ "id": 8, "name": "Kate" }, 
{ "id": 9, "name": "Klein" } 
]

他還爲你提供了 “朋友關係” 的數據,這是由一對對 ID 組成的列表:

例如,元組 (0, 1) 表示 id 爲 0 的數據科學家 Hero 和 id 爲 1 的數據科學家 Dunn 是朋友。用戶關係網絡見圖 1-1。

圖 1-1:DataSciencester 網絡

將朋友關係表示爲元組(pairs)的列表並不是最簡單的表示方法。如果要找到用戶 1 的所有朋友,你必須迭代每個元組對以尋找哪個包含 1。如果你有很多元組對,則會需要很長時間。

相反,讓我們創建一個 dict,其中鍵(key)是用戶 id,對應的值(value)是朋友 id 的列表。(dict 的查詢效率非常高。)

注意

目前不要過於關注代碼的細節。第 2 章會涉足一些 Python 的速成課程,但現在只需試着大致瞭解我們正在做什麼即可。

我們仍需要查看每一對元組來創建 dict,但只需執行一次,之後我們將可以方便地查找:

現在 dict 中有了朋友關係的列表,我們可以輕鬆地根據圖中內容來提問,例如:“每個用戶平均擁有多少個朋友?”

首先通過對所有用戶的朋友列表長度求和,來找到連接總數:

然後將其除以用戶數:

這樣,如果我們找到擁有最多朋友的用戶,就找到了擁有最多聯繫人的用戶。

由於用戶不多,因此我們也能很容易地按照用戶朋友數量從多到少將他們排序:

我們剛剛所做事情的一種解讀是,識別人際關係網絡中心節點的一種方法。事實上,我們剛剛計算的是度中心性(degree centrality),這是一種網絡度量(見圖 1-2)。

圖 1-2:利用度計算 DataSciencester 的網絡大小

度中心性很容易計算,但它並不總能給出理想或期望的結果。例如,在 DataSciencester 網絡中,Thor(id 爲 4)只有 2 個朋友,而 Dunn(id 爲 1)有 3 個。然而,在網絡關係圖上,直覺上認爲 Thor 應該更具中心性。在第 22 章中,我們將更詳細地研究網絡,並探討更復雜的中心性概念,這些概念可能與我們的直覺一致,也可能不一致。

1.3.2 你可能知道的數據科學家

當你正在填寫新員工入職表時,人力部副總走到你桌旁。他希望鼓勵會員之間建立更多聯繫,因此要求你設計一個 “你可能知道的數據科學家” 的提示函數。

你的第一直覺是用戶可能知道他們朋友的朋友。因此你寫了一些代碼,依次迭代計算每個用戶的朋友信息,並收集其朋友的朋友的信息:

當我們對 user[0](Hero)調用這個函數時,它的結果如下所示:

這個列表中用戶 0 出現了兩次,因爲 Hero 確實是他的兩個朋友的朋友。雖然用戶 1 和用戶 2 已經是 Hero 的朋友,但這個列表中還是包括了用戶 1 和用戶 2。因爲 Chi 可通過兩個不同的朋友聯繫到,所以 3 也出現了兩次:

有趣的是,人們能通過多種方式成爲朋友的朋友。受此啓發,或許我們可以換一種數(count)共同朋友的方式來試着解決這個問題。我們應該排除已成爲朋友的用戶:

這個結果正確地說明 Chi(id 爲 3)與 Hero(id 爲 0)有兩個共同的朋友,但與 Clive(id 爲 5)只有一個共同的朋友。

作爲一名數據科學家,你知道你可能也喜歡結交擁有共同興趣的用戶。(這是展示數據科學的 “專業技能” 的一個很好的例子。)在問了一圈人之後,你開始處理數據,設計出如下列表,其中每個元素都是成對的數據 (user_id, interest):

例如,Hero(id 爲 0)與 Klein(id 爲 9)沒有任何共同的朋友,但他們對 Java 和大數據都感興趣。

構建一個函數來查找具有特定興趣的用戶很容易:

這非常有效,但上面的算法每次搜索都需要遍歷整個興趣列表。如果用戶很多或用戶的興趣很多(或者我們只是想多進行一些搜索),則最好建立一個從興趣到用戶的索引:

另一個從用戶到興趣的索引:

現在很容易找到與給定用戶擁有最多共同興趣的用戶。   

  1. 迭代用戶的興趣。   

  2. 對於每個興趣,迭代尋找具有該興趣的其他用戶。   

  3. 記錄每個用戶在每次迭代中出現的次數。

代碼如下所示:

然後,結合共同的朋友和共同的興趣,我們可以建立一個更全面的 “你可能知道的數據科學家” 的特徵。第 23 章將繼續探討這類應用。

1.3.3 工資和工作年限

你準備去喫午飯時,公共關係部副總問你,是否可以提供一些有關數據科學家收入的有趣信息。工資數據相當敏感,因此他設法爲你提供了一個匿名數據集,其中包含每個用戶的工資(salary,以美元爲單位)和作爲數據科學家的工作年限(tenure,以年爲單位):

第一步自然是繪製數據的散點圖(第 3 章將介紹如何實現),你可以在圖 1-3 中看到結果。

圖 1-3:基於工作年限的工資圖

顯然,經驗豐富的人往往收入更高。怎麼才能把這變成一個有趣的事實呢?第一個想法是查看每個任期的平均工資:

事實證明這並不是特別有說服力,因爲任意兩個用戶的工作年限都不同,這意味着我們只是報告了用戶的個人工資狀況:

可能把工作年限分組以後會更有意義:

然後可以將每個組對應的工資合併在一起:

最後計算每組的平均工資:

這個結果看起來更有趣:

現在你可以說:“擁有 5 年以上工作經驗的數據科學家比新人收入高 65% !”

但是,我們是以非常隨意的方式分組的。我們原本希望說明的是多一年工作經驗對平均工資的影響。除了發現一個更有趣的現象外,這使我們能夠對不知道的工資做出預測。第 14 章將探討這個想法。

1.3.4 付費賬戶

當你回到辦公桌前,收益部副總正在等你。他希望更好地瞭解哪些用戶會爲賬戶付款,哪些用戶不會。(他知道用戶的名字,但這不是特別有用。)

你注意到多年經驗與付費賬戶之間似乎存在某種對應關係:

工作經驗很少和工作經驗豐富的用戶傾向於付費,而有一些工作經驗的用戶則不會。因此,如果你想創建一個模型——即使這些數據不足以建立模型——你可能會嘗試將工作經驗很少和工作經驗豐富的用戶預測爲 “付費”,而將有一些經驗的用戶預測爲 “不付費”:

當然,我們會持續關注這個人工經驗模型。

隨着更多數據(和更多數學知識)的引入,我們可以建立一個模型,根據用戶的工作年限預測他付費的可能性。第 16 章將研究這類問題。

1.3.5 感興趣的主題

當你正準備結束第一天的工作時,內容策略部副總來向你要數據,他想了解用戶最感興趣的主題,以便可以相應地規劃他的博客日曆。你已擁有來自朋友推薦項目的原始數據:

找到最受歡迎的興趣的一種簡單(並不是特別令人興奮)的方法是計算興趣詞彙的個數:

  1. 小寫每個興趣(因爲不同的用戶可能不會小寫他們的興趣);

  2. 將其分成單詞;

  3. 數結果。

代碼如下所示:

這樣可以輕鬆列出多次出現的單詞:

它給出了你期望的結果(除非你期望 “scikit-learn” 被分成兩個單詞,那樣就不會得到預期的結果了):

第 21 章將介紹從數據中提取主題的更復雜的方法。

1.3.6 展望

第一天非常成功!你一定很累,趕緊在有人繼續問問題之前回家吧。晚上好好休息,明天要參加新員工入職培訓。(是的,在入職培訓前,你已工作了一整天。明天去人力資源部報到吧。)

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/UtKwNLnhB9PaKgKimQ8BEw