首頁 > 軟體

「Python資料分析系列」1. 資料科學基本介紹

2021-04-13 03:56:00

導讀

「資料!資料!!資料!!!」他不耐煩地咆哮著,「巧婦難為無米之炊!」

——阿瑟 柯南 道爾

智造掃地僧 釋出

轉載請註明來源和出處

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 展望

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

END

智造掃地僧-致力於關注智慧製造、工業4.0轉型升級的知識和經驗的傳播,致力於幫助那些期望進行數字化轉型或從事數字化工作的人,提供一個專業、嚴謹、科學的新媒體平臺!


IT145.com E-mail:sddin#qq.com