《數據科學R語言實踐:面向計算推理與問題求解的案例研究法》一一2.5 為跨年度的個人參賽選手構造記錄...

本節書摘來自華章計算機《數據科學R語言實踐:面向計算推理與問題求解的案例研究法》一書中的第2章,第2.5節,作者:[美] 德博拉·諾蘭(Deborah Nolan)  鄧肯·坦普·朗(Duncan Temple Lang)  更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。

2.5 為跨年度的個人參賽選手構造記錄

我們需要為參加過多次櫻花賽的參賽選手進行記錄匹配。由于每位選手的比賽結果沒有唯一的標識,因此我們需要從每位參賽選手的信息中構造唯一標識。理想情況下,我們將使用記錄的全部信息,即選手的姓名、居住地、年齡、跑步時間和比賽年份。然而,如果這些信息從某一個年份到下一個年份被記錄的不一致,可能會減少匹配的條數。另一方面,即使使用全部的信息,我們可能也會錯誤地匹配來自兩個不同運動員的記錄。任何設計的方法都不可能完全準確,本節的目的是探討幾種可能的方法,然后確定其中我們認為合理的一個。
現在考慮下列問題:
14年里總共有多少參賽選手?
這些參賽選手中有多少不重復的姓名?
有多少姓名出現兩次、三次、四次,等等,最常見的姓名是什么?
一年之內多次出現的姓名的出現頻率是多少?
回答以上這些問題可以使我們體會到匹配問題的量級大小。此外,我們可以考慮如何通過清洗name和home的值來提高匹配率。例如,記得前面我們解析文本表格時,在字段末尾附加了一些空格,現在可能是消除它們的好時機。在前面我們也注意到大小寫的不一致問題,可以證明匹配記錄的不確定性。伴隨我們開始進一步仔細檢查記錄,其他有關清洗字符串的問題也會隨之涌現。在回答這些問題之前,我們先來清洗姓名。
任何出現在一個姓名前面或后面的空格都可以被舍棄。此外,如果出現多個空格,例如,在名字和姓氏之間有多個空格,我們可以把它們轉換成一個。gsub()函數可以實現這些操作。下面我們創建一個幫助函數,trimBlanks()來完成該工作:

第一次替代消除所有開始的空格,第二次替代消除所有末尾的空格,第三次用一個空格替代多個連續的空格。注意我們使用元字符“[:blank:]”,這樣可以找到所有形式的空格,包括制表符。清洗姓名如下:

現在可以開始回答關于姓名唯一性的問題了。我們通過檢查概要統計和記錄集合來完成該工作。
14次比賽中共有多少參賽選手呢?用length()函數進行查找:

回顧在前面的部分,我們舍棄了那些比賽用時少于30分鐘和年齡低于16歲的記錄。
那么有多少不重復的姓名呢?

有多少姓名出現一次、兩次等?我們可以通過調用兩次table()函數來進行判定,也就是

這個表格說明什么呢?我們可以看到14次比賽中有超過7000個姓名出現了兩次。有一個姓名出現了30次,而我們知道這個姓名至少對應3個人,因為僅僅有14次的比賽結果。
哪個姓名出現了30次呢?我們可以用如下代碼進行查找:

下面來檢查關于30個Michael Smith的其他信息。我們從數據框中提取它們:

其居住地包括:

由于額外的空格,這里出現幾個不同的Annapolis MD版本。顯然我們也需要清洗home字段。
進一步考慮,我們可能會問:可以通過更多的清洗潛在地提高匹配的效率嗎?我們已知列標題有大小寫不一致的情況,毫無疑問,姓名也存在同樣的問題。我們可以檢查大小寫,但也可以簡單地將所有字符變為小寫字母:

再次檢查最常見的姓名:

通過這次額外清洗又多找到了3個Michael Smith。
此外,可以刪除標點符號,例如某人中間名縮寫的后面及任意零散的逗號,我們通過調用一次gsub()函數進行處理:

既然有如此多重復的姓名,下面我們計算一個姓名在相同年份中出現的次數。可以創建一個年份-姓名的組合表格:

然后調用max()函數來查找有最大計數值的表格單元,即

這又是Michael Smith嗎?還需要通過一些處理找到與這個最大計數值關聯的名字。這個存儲在tabNameYr里的表格為table類,我們看到它是一個具有3個屬性的數值向量:dim、dimnames和class。調用class()、mode()和attributes()函數,可以幫助我們得到以上信息,即

這個數據結構有多重含義。首先,一些矩陣函數可以在table類上進行處理,例如,我們可以調用dim()和colnames()函數進行查找:

注意我們發現了另一條混亂的數據!為了找出是哪個單元中的計數值為5,我們可以使用which()函數,但是要找到行和列的位置,需要在調用中包含arr.ind參數。也就是

最后,對姓名進行定位如下:

它是Michael Brown,不是Michael Smith!
現在我們有了一個清洗過的選手姓名的版本,下面將它添加到我們的數據框中:

我們使用這種格式的姓名去創建唯一的選手標識。
因為我們有選手的年齡和比賽的年份,所以也可以獲得選手近似的出生年份。比賽是在每年4月的第一個星期日舉行,因此這兩者之間的差值是對年齡的一個近似。那些生日在4月開始七天內的參賽選手,有可能對他們年齡的記錄在兩個比賽年份中是不一致的。可以預知記錄的哪些部分會出現這種問題嗎?我們在數據框中創建一個新的變量yob:

另外,我們發現在居住地名里也有空格和大小寫的問題。這里將對它們的處理留作練習,要求清洗home值,并將清洗過的home版本添加到cbMenSub為homeClean。
下面讓我們更加仔細地查看在數據框中的這些新的、清洗過的關于Michael Brown的變量。代碼如下:

針對以上各種不同的michael brown行可以得到怎樣的觀察結果呢?
出生于1953年的3條michael brown記錄好像是同一個人,因為他們的居住地都是“north east md”。除此之外,他3場比賽的用時相差不到7分鐘。
出生于1958年的4條michael brown記錄參加比賽的時間分別是2008年、2009年、2010年和2012年。最近一條記錄的居住地登記的是Reston VA,而其他的3個居住地顯示為Ashburn VA。那么會有1、2、3或者4個不同的michael brown嗎?2010年的該選手是4次比賽中跑得最慢的,差了約11分鐘,其他3次更接近一些。互聯網搜索顯示,Reston和Ashburn相距不到22千米。可以猜想這4條記錄屬于同一個人,他可能在2010年4月到2012年4月間從Reston搬到了Ashburn,但對此我們并不能完全確定。
另外3條記錄中michael brown都出生于1966年。除了在2006年的記錄中州名MD沒有提供外,3條記錄的居住地都是Chevy Chase。當我們檢查2006年其他的參賽選手時,發現他們中也沒有人列出州名。3條michael brown記錄中比賽時間之間也存在11分鐘之差,其中在中間年份2010年跑得最快。因此這些記錄很可能屬于同一個人,但是我們發現2006年記錄中的居住地和其他年份的不同。
接下來,還有4條michael brown的記錄是出生于1984年,參加比賽的時間分別是2008年、2010年、2011年和2012年。其中,2010年記錄中的選手似乎和其他三條記錄中的選手不是同一個人,因為他的居住地是New York,NY,且他的跑步時間也比其他三條紀錄慢了25~40分鐘。其他三條記錄的居住地同為Arlington,VA,他們的跑步時間也從2008年的84分鐘提升到2012年的71分鐘。因此認為這三條記錄同屬于一個人似乎是合理的,因為一個人隨著年齡的增長,他訓練和跑步的速度也會更快。而對此我們同樣不能完全確定。
最后,我們注意到2012年注冊的5條michael brown記錄具有不同的出生年份(1953、1958、1966、1984和1988)和5個不同的居住地,因此這是5位不同的參賽選手。
我們總結各種不同的觀察結果,并第一次嘗試為個體選手創建標識符,然后可能將清洗后的姓名和推導出的出生年份粘合在一起。代碼如下:

我們忽略居住地和跑步時間所提供的信息,因此創建了限制最少的標識符。
由于我們的目標是研究一個運動員跑步時間隨著年齡增長的變化,下面讓我們重點關注那些ID至少出現8次的選手。為了完成這個目標,我們首先判定每個ID在cbMenSub中出現的次數,代碼如下:

然后選擇那些ID至少出現8次的記錄:

我們選擇屬于這些標識符的記錄構建子集menRes:

最后,組織數據框使相同ID的記錄相連,這樣就使諸如手工檢查記錄等操作變得更加容易:

另一種數據組織方式是將races8中每一個ID的元素存儲為一個列表。該列表中,每個元素是一個數據框且僅包含具有相同ID的記錄結果。通過如下代碼創建列表:

其中哪種數據結構更好呢?這將取決于我們想如何處理數據。接下來,我們將展示如何使用兩種方法來完成一項任務,以便在這兩種數據結構之間進行比較。在下一節中,我們會發現使用數據框中的列表進行處理是最容易的,因為我們常常需要將含有多個參數的函數應用于每個參賽選手的記錄。
創建列表后還剩下多少個ID呢?

這和代碼length(men8L)的功能是一樣的。如果兩年間的比賽成績變化太大,我們可能就會放棄記錄的匹配。那么多大的起伏變化會讓我們認為是錯誤地連接了兩個不同的選手呢?當然,我們不想通過消除跑步時間變化很大的個體而使結果產生偏見。下面讓我們查看一些在相鄰兩年內跑步時間之差超過20分鐘的記錄。使用如下方法找出那些滿足該約束的記錄:

或者使用

有多少時間差超過20分鐘的選手?

前兩位運動員經過稍微重新格式化的顯示結果如下:

姓名為abiy zewde的選手似乎非同尋常,很可能是同一個人參加了14次比賽中的12次,雖然有幾年居住地改變了,且最近一次年齡為45歲的比賽結果與最快的一次相差了幾乎40分鐘。事實上,谷歌搜索定位了一個網頁http://storage.athlinks.com/racer/results/65866776,發布了他在幾次不同比賽中的跑步時間。網頁截圖如圖2-16所示,可以清晰地看到這些記錄是屬于同一個人的。
image

圖2-16 一個參賽選手比賽結果的網頁截圖。這個網址為http://storage.athlinks.com的網頁包含一個選手在14年中的12次參加櫻花公路賽的比賽結果數據。注意他最快的跑步時間是在最近的2012年,完成比賽的時間少于85分鐘,那時他45歲。而他最慢的時間是2002年的123分鐘,那時他35歲
想用同一個居住地來進一步約束我們的匹配項嗎?這樣可以消除諸如abiy zewde記錄中的不同,盡管我們相當確定這些記錄是屬于同一個人的。我們可以識別不當匹配,并手動檢查潛在的錯誤匹配結果。因為2006年的記錄中沒有州名,所以我們需要從那些記錄項的末尾去除州名的縮寫。可以用一個空字符串替換出現在字符串末尾的一個空格及后面跟著的兩個字母。例如:

這可能會導致太過自由的匹配,例如,匹配Springfield IL和Springfield MA。在此我們將它留作練習,確定如何將匹配限制到那些具有相同居住地的記錄中,并評估是否應該在匹配過程中添加額外的限制條件。
這里,我們考慮一個不太嚴格的匹配,僅僅匹配那些具有相同居住州的記錄。為此,我們創建一個新的變量來保存州名的兩個縮寫字母。因為數據結構比較簡單,我們返回去處理cbMenSub,并保持一致性。從每個居住地的字符串中提取最后2個字母。如果存在,它就是州名。我們知道在2006年的記錄中沒有出現州名,因此將其設置為NA。對于來自美國以外的運動員,提取國家或者省份的最后兩個字母,但這些不應該顯著地影響我們的匹配。
首先確定在每個home值中有多少個字母,代碼如下:

然后使用如下代碼提取最后兩個字母,并將它們添加回數據框里:

并且將2006年的值設置為NA:

接下來,我們重新創建一個新的ID以使其包含state,代碼如下:

然后,我們再次選擇那些至少出現8次的ID。代碼如下:

在下一節中,我們將單獨使用列表結構來進行處理。
這次添加完選手的ID后,進一步減少了完成8次比賽的選手數量,即

現在有306名運動員具有相同的姓名、出生年份和州名,并且都完成了14次比賽中的8次。迄今為止我們一直在已獲得的匹配集合上進行處理,在下一節,我們將研究參賽選手的成績如何隨著年齡增長而變化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281591.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281591.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281591.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 abp 微服務架構的開源低代碼平臺

你好,這里是 Dotnet 工具箱,定期分享 Dotnet 有趣,實用的工具或組件,希望對您有用!簡介 ABP-MicroService是 一個基于ABP vNext微服務架構、vue-element-admin的后臺管理框架,適用于大型分布式業務系統和企…

linux android sdk gengxinman,Android 實現增量更新

一、概述增量更新相較于全量更新的好處不言而喻,利用差分算法獲得1.0版本到2.0版本的差分包,這樣在安裝了1.0的設備上只要下載這個差分包就能夠完成由1.0-2.0的更新。比如:存在一個1.0版本的apkapk1.png然后需要升級到2.0版本,而2…

(轉)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別

linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown區別 原文:https://www.cnblogs.com/yi-meng/p/3214471.html這3個命令的用途都是啟動網絡接口,不過,ifup與ifdown僅就 /etc/sysconfig/network- scripts內的ifcfg-ethx(x為數…

Pycharm上Django的使用 Day8

2019獨角獸企業重金招聘Python工程師標準>>> 1.添加新條目 1>編寫用于添加新條目的表單 在forms.py中創建一個與模型Entry相關聯的表單 1處給字段text指定一個空標簽 2處定義小部件widgets,widgets是一個HTML表單元素 2>定義new_entry的URL模式 在用于添加新條…

物聯網創新領域的三大驅動性趨勢

從設備對接到區塊鏈,今天我們將介紹幾項物聯網開發者必須了解的最新技術趨勢。 物聯網正在快速改變著我們的工作與生活方式。過去十年以來,利用惟一IP地址實現聯網早已不是難事,但傳感器、處理器以及其它多種新興技術的涌現真正讓物聯網走向了…

TensorFlow.NET 實戰 -- 為.NET開發者開啟機器學習之旅

在IT技術飛速發展的今天,云計算、人工智能、大數據和云原生應用等新興技術的發展為我們帶來一波又一波的浪潮,也對軟件開發者提出了更高的要求,特別是人工智能開發領域,應運而生的新概念讓人目不暇接。作為一個.NET開發者的你&…

Arduino I/O Expansion Shield V7.1

介紹: 傳感器擴展板,目的是為初學者省去繁瑣的面包板接線和故障排除,專注實現自己的創意想法。 擴展板V7.1不僅保留老版本的所有優點,改善了它的易用性,更重要的是它兼容Arduino新一代主控器DUE。現在V7.1以其強大的擴…

展訊康一:2020年推出5G芯片 第一桶金含金量最高

工信部部長苗圩在全球5G大會上表示,5G網絡將2020年規模商用。對此,終端、芯片、網絡方面準備如何?國產自主芯片廠商展訊通信全球副總裁康一博士在接受搜狐科技專訪時透露,在5G方面,展訊投入較大,力爭在2018…

簡單的單臂路由的配置實驗 (思科)

實驗名稱:簡單的單臂路由的 配置實驗 (思科)實驗拓撲: 實驗需要:1、按圖中所示配置設網絡備vlan,IP地址2、能夠使各pc互相ping通。 實驗步驟: 1、配置終端設備:pc1-pc5按照拓撲圖中所…

C#實現生成Markdown文檔目錄樹

1前言(昨天那篇排版有點問題,不能忍,今天重發!)之前我寫了一篇關于C#處理Markdown文檔的文章:C#解析Markdown文檔,實現替換圖片鏈接操作算是第一次嘗試使用C#處理Markdown文檔,然后最…

漢諾塔c語言源程序步驟,漢諾塔問題的算法分析及C語言演示程序的實現

摘要:該文對經典的“漢諾塔”問題進行了詳細的分析,并用C語言實現。通過問題的具體實現,使學習者了解問題的全過程,推廣到一般。關鍵詞:漢諾塔;遞歸;C語言中圖分類號:TP301.6文獻標識碼:A文章編號:1009-3044(2010)09-2130-02Algorithm Analysis and C Realization of Hanio Iss…

spring security xml配置詳解

security 3.x <?xml version"1.0" encoding"UTF-8"?> <beans:beans xmlns"http://www.springframework.org/schema/security" xmlns:beans"http://www.springframework.org/schema/beans" xmlns:xsi"http://www…

【Redis源碼分析】Redis命令處理生命周期

運營研發團隊 李樂 前言 本文主要講解服務器處理客戶端命令請求的整個流程&#xff0c;包括服務器啟動監聽&#xff0c;接收命令請求并解析&#xff0c;執行命令請求&#xff0c;返回命令回復等&#xff0c;這也是本文的主題“命令處理的生命周期”。 Redis服務器作為典型的事件…

博鰲直擊 | 區塊鏈在互聯網金融中扮演怎樣的角色?

雷鋒網3月24日報道&#xff0c;今日&#xff08;3月24日&#xff09;&#xff0c;第16屆博鰲亞洲論壇2017年年會在海南繼續進行中。據雷鋒網了解&#xff0c;在今日下午的數字貨幣與區塊鏈分論壇上&#xff0c;中國銀行前行長、中國互聯網金融協會區塊鏈工作組組長李禮輝講述了…

GDB調試qemu-kvm

GDB調試qemu-kvm 前面幾篇博文都是記錄一些kvm相關包編譯安裝及使用&#xff0c;但都沒深入去代碼看看。看源碼在配合上相關原理才能更好的理解kvm。但qemu-kvm的代碼量很多&#xff0c;對我來講直接看源碼收獲甚少&#xff0c;所以找了個調試工具——GDB來配合閱讀代碼。接下來…

c語言編譯錯誤 原文,C語言常見錯誤與警告

C語言常見錯誤與警告C語言常見錯誤與警告C語言常見錯誤&#xff1a;1 invalid type argument of ‘->’ (have ‘struct qstr_xid_element’)這種錯誤一般是沒有理解C中“->”與“.”用法的不同&#xff0c;“->”是指向結構體指針獲取結構體的成員變量時所用&#xf…

力爭營收渠道多樣化,Line 向自拍應用 Snow 投資 4500 萬美元

今年&#xff0c;在科技公司 IPO 市場不景氣的情況下&#xff0c;日本通信應用 Line順利進行了 IPO &#xff0c;目前正在尋求多樣化發展。今天, Line 宣布向自拍應用 Snow 投資 4500 萬美元(500 億韓元)。本次交易之后&#xff0c;Line 將獲得 Snow 25% 的股權。 Snow 常被稱為…

用.NET設計一個假裝黑客的屏幕保護程序

本文主要介紹屏幕保護程序的一些相關知識&#xff0c;以及其在安全方面的用途&#xff0c;同時介紹了如何使用 .NET 開發一款屏幕保護程序&#xff0c;并對核心功能做了介紹&#xff0c;案例代碼開源&#xff1a;https://github.com/sangyuxiaowu/HackerScreenSaver背景前幾天在…

【IntelliJ】IntelliJ IDEA常用設置及快捷鍵以及自定義Live templates

IntelliJ IDEA是一款非常優秀的JAVA編輯器&#xff0c;初學都可會對其中的一些做法感到很別扭&#xff0c;剛開始用的時候我也感到很不習慣&#xff0c;在參考了網上一些文章后在這里把我的一些經驗寫出來&#xff0c;希望初學者能快速適應它&#xff0c;不久你就會感覺到編程是…

復習Javascript專題(一):基本概念部分

一、數據類型 基本類型&#xff1a;Null Boolean String Undefined Number(NB SUN)引用類型&#xff1a;Array Function Object類型判斷&#xff1a;typeof 返回結果"undefined"&#xff08;未定義&#xff09; "boolean"(布爾值) "st…