五、探索性數(shù)據(jù)分析
原文:DS-100/textbook/notebooks/ch05
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
自豪地采用谷歌翻譯
探索性數(shù)據(jù)分析是一種態(tài)度,一種靈活的狀態(tài)幕屹,一種尋找那些我們認(rèn)為不存在和存在的東西的心愿太惠。
在探索性數(shù)據(jù)分析(EDA)磨淌,也就是數(shù)據(jù)科學(xué)生命周期的第三步中,我們總結(jié)垛叨,展示和轉(zhuǎn)換數(shù)據(jù)伦糯,以便更深入地理解它昨登。 特別是你虹,通過(guò) EDA,我們發(fā)現(xiàn)數(shù)據(jù)中的潛在問(wèn)題像云,并發(fā)現(xiàn)可用于進(jìn)一步分析的趨勢(shì)剂癌。
我們?cè)噲D了解我們數(shù)據(jù)的以下屬性:
結(jié)構(gòu):我們數(shù)據(jù)文件的格式淤翔。
粒度:每行和每列的精細(xì)程度。
范圍:我們的數(shù)據(jù)有多么完整或不完整佩谷。
時(shí)間性:數(shù)據(jù)是不是當(dāng)時(shí)的情況旁壮。
忠實(shí)度:數(shù)據(jù)捕捉“現(xiàn)實(shí)”有多好。
盡管我們分別介紹了數(shù)據(jù)清理和 EDA 來(lái)有助于組織本書(shū)谐檀,但在實(shí)踐中抡谐,你經(jīng)常會(huì)在兩者之間切換。 例如桐猬,列的可視化可能會(huì)向你展示麦撵,應(yīng)使用數(shù)據(jù)清理技術(shù)進(jìn)行處理的格式錯(cuò)誤的值。 考慮到這一點(diǎn)溃肪,我們回顧伯克利警察局的數(shù)據(jù)集來(lái)進(jìn)行探索免胃。
結(jié)構(gòu)和連接
結(jié)構(gòu)
數(shù)據(jù)集的結(jié)構(gòu)指的是數(shù)據(jù)文件的“形狀”。 基本上惫撰,這指的是輸入數(shù)據(jù)的格式羔沙。例如,我們看到呼叫數(shù)據(jù)集是 CSV(逗號(hào)分隔值)文件:
!head data/Berkeley_PD_-_Calls_for_Service.csv
CASENO,OFFENSE,EVENTDT,EVENTTM,CVLEGEND,CVDOW,InDbDate,Block_Location,BLKADDR,City,State
17091420,BURGLARY AUTO,07/23/2017 12:00:00 AM,06:00,BURGLARY - VEHICLE,0,08/29/2017 08:28:05 AM,"2500 LE CONTE AVE
Berkeley, CA
(37.876965, -122.260544)",2500 LE CONTE AVE,Berkeley,CA
17020462,THEFT FROM PERSON,04/13/2017 12:00:00 AM,08:45,LARCENY,4,08/29/2017 08:28:00 AM,"2200 SHATTUCK AVE
Berkeley, CA
(37.869363, -122.268028)",2200 SHATTUCK AVE,Berkeley,CA
17050275,BURGLARY AUTO,08/24/2017 12:00:00 AM,18:30,BURGLARY - VEHICLE,4,08/29/2017 08:28:06 AM,"200 UNIVERSITY AVE
Berkeley, CA
(37.865491, -122.310065)",200 UNIVERSITY AVE,Berkeley,CA
另一方面厨钻,截停數(shù)據(jù)集是 JSON(JavaScript 對(duì)象表示法)文件扼雏。
# Show first and last 5 lines of file
!head -n 5 data/stops.json
!echo '...'
!tail -n 5 data/stops.json
{
"meta" : {
"view" : {
"id" : "6e9j-pj9p",
"name" : "Berkeley PD - Stop Data",
...
, [ 31079, "C2B606ED-7872-4B0B-BC9B-4EF45149F34B", 31079, 1496269085, "932858", 1496269085, "932858", null, "2017-00024245", "2017-04-30T22:59:26", " UNIVERSITY AVE/6TH ST", "T", "BM2TWN; ", null, null ]
, [ 31080, "8FADF18D-7FE9-441D-8709-7BFEABDACA7A", 31080, 1496269085, "932858", 1496269085, "932858", null, "2017-00024250", "2017-04-30T23:19:27", " UNIVERSITY AVE / WEST ST", "T", "HM4TCS; ", "37.8698757000001", "-122.286550846" ]
, [ 31081, "F60BD2A4-8C47-4BE7-B1C6-4934BE9DF838", 31081, 1496269085, "932858", 1496269085, "932858", null, "2017-00024254", "2017-04-30T23:38:34", " CHANNING WAY / BOWDITCH ST", "1194", "AR; ", "37.867207539", "-122.256529377" ]
]
}
當(dāng)然坚嗜,還有很多其他類型的數(shù)據(jù)格式。 以下是最常見(jiàn)格式的列表:
逗號(hào)分隔值(CSV)和制表符分隔值(TSV)呢蛤。 這些文件包含由逗號(hào)(CSV)或制表符(
\t
惶傻,TSV)分隔的表格數(shù)據(jù)。 這些文件通常很容易處理其障,因?yàn)閿?shù)據(jù)的輸入格式與DataFrame
類似银室。JavaScript 對(duì)象表示法(JSON)。 這些文件包含嵌套字典格式的數(shù)據(jù)励翼。 通常我們必須將整個(gè)文件讀為 Python 字典蜈敢,然后弄清楚如何從字典中為
DataFrame
提取字段。-
可擴(kuò)展標(biāo)記語(yǔ)言(XML)或超文本標(biāo)記語(yǔ)言(HTML)汽抚。 這些文件也包含嵌套格式的數(shù)據(jù)抓狭,例如:
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
在后面的章節(jié)中,我們將使用 XPath 從這些類型的文件中提取數(shù)據(jù)造烁。
-
日志數(shù)據(jù)否过。許多應(yīng)用在運(yùn)行時(shí)會(huì)以非結(jié)構(gòu)化文本格式輸出一些數(shù)據(jù),例如:
2005-03-23 23:47:11,663 - sa - INFO - creating an instance of aux_module.Aux 2005-03-23 23:47:11,665 - sa.aux.Aux - INFO - creating an instance of Aux 2005-03-23 23:47:11,665 - sa - INFO - created an instance of aux_module.Aux 2005-03-23 23:47:11,668 - sa - INFO - calling aux_module.Aux.do_something 2005-03-23 23:47:11,668 - sa.aux.Aux - INFO - doing something
在后面的章節(jié)中惭蟋,我們將使用正則表達(dá)式從這些類型的文件中提取數(shù)據(jù)苗桂。
連接(Join)
數(shù)據(jù)通常會(huì)分成多個(gè)表格。 例如告组,一張表可能描述一些人的個(gè)人信息煤伟,而另一張表可能包含他們的電子郵件:
personal information while another will contain their emails:
people = pd.DataFrame(
[["Joey", "blue", 42, "M"],
["Weiwei", "blue", 50, "F"],
["Joey", "green", 8, "M"],
["Karina", "green", 7, "F"],
["Nhi", "blue", 3, "F"],
["Sam", "pink", -42, "M"]],
columns = ["Name", "Color", "Number", "Sex"])
people
Name | Color | Number | Sex | |
---|---|---|---|---|
0 | Joey | blue | 42 | M |
1 | Weiwei | blue | 50 | F |
2 | Joey | green | 8 | M |
3 | Karina | green | 7 | F |
4 | Fernando | pink | -9 | M |
5 | Nhi | blue | 3 | F |
6 | Sam | pink | -42 | M |
email = pd.DataFrame(
[["Deb", "deborah_nolan@berkeley.edu"],
["Sam", "samlau95@berkeley.edu"],
["John", "doe@nope.com"],
["Joey", "jegonzal@cs.berkeley.edu"],
["Weiwei", "weiwzhang@berkeley.edu"],
["Weiwei", "weiwzhang+123@berkeley.edu"],
["Karina", "kgoot@berkeley.edu"]],
columns = ["User Name", "Email"])
email
User Name | ||
---|---|---|
0 | Deb | deborah_nolan@berkeley.edu |
1 | Sam | samlau95@berkeley.edu |
2 | John | doe@nope.com |
3 | Joey | jegonzal@cs.berkeley.edu |
4 | Weiwei | weiwzhang@berkeley.edu |
5 | Weiwei | weiwzhang+123@berkeley.edu |
6 | Karina | kgoot@berkeley.edu |
為了使每個(gè)人匹配他或她的電子郵件,我們可以在包含用戶名的列上連接兩個(gè)表木缝。 然后便锨,我們必須決定,如何處理出現(xiàn)在一張表上而沒(méi)有在另一張表上的人我碟。 例如放案,Fernando
出現(xiàn)在people
表中,但不出現(xiàn)在email
表中矫俺。 我們有幾種類型的連接吱殉,用于每個(gè)匹配缺失值的策略。 最常見(jiàn)的連接之一是內(nèi)連接恳守,其中任何不匹配的行都不放入最終結(jié)果中:
# Fernando, Nhi, Deb, and John don't appear
people.merge(email, how='inner', left_on='Name', right_on='User Name')
Name | Color | Number | Sex | User Name | ||
---|---|---|---|---|---|---|
0 | Joey | blue | 42 | M | Joey | jegonzal@cs.berkeley.edu |
1 | Joey | green | 8 | M | Joey | jegonzal@cs.berkeley.edu |
2 | Weiwei | blue | 50 | F | Weiwei | weiwzhang@berkeley.edu |
3 | Weiwei | blue | 50 | F | Weiwei | weiwzhang+123@berkeley.edu |
4 | Karina | green | 7 | F | Karina | kgoot@berkeley.edu |
5 | Sam | pink | -42 | M | Sam | samlau95@berkeley.edu |
這是我們經(jīng)常使用的四個(gè)基本連接:內(nèi)連接,全連接(有時(shí)稱為“外連接”)贩虾,左連接和右連接催烘。 以下是個(gè)圖表,展示了這些類型的連接之間的區(qū)別缎罢。
運(yùn)行下面的代碼伊群,并使用生成的下拉菜單考杉,來(lái)展示people
和email
表格的四種不同的連接的結(jié)果。 注意對(duì)于外舰始,左和右連接崇棠,哪些行包含了NaN
值。
# HIDDEN
def join_demo(join_type):
display(HTML('people and email tables:'))
display_two(people, email)
display(HTML('<br>'))
display(HTML('Joined table:'))
display(people.merge(email, how=join_type,
left_on='Name', right_on='User Name'))
interact(join_demo, join_type=['inner', 'outer', 'left', 'right']);
結(jié)構(gòu)檢查清單
查看數(shù)據(jù)集的結(jié)構(gòu)之后丸卷,你應(yīng)該回答以下問(wèn)題枕稀。我們將根據(jù)呼叫和截停數(shù)據(jù)集回答它們。
數(shù)據(jù)是標(biāo)準(zhǔn)格式還是編碼過(guò)的谜嫉?
標(biāo)準(zhǔn)格式包括:
表格數(shù)據(jù):CSV萎坷,TSV,Excel沐兰,SQL
嵌套數(shù)據(jù):JSON哆档,XML
呼叫數(shù)據(jù)集采用 CSV 格式,而截停數(shù)據(jù)集采用 JSON 格式住闯。
數(shù)據(jù)是組織為記錄形式(例如行)的嗎瓜浸?如果不是,我們可以通過(guò)解析數(shù)據(jù)來(lái)定義記錄嗎比原?
呼叫數(shù)據(jù)集按行出現(xiàn)插佛;我們從截停數(shù)據(jù)集中提取記錄。
數(shù)據(jù)是否嵌套春寿?如果是這樣朗涩,我們是否可以適當(dāng)?shù)靥崛》乔短椎臄?shù)據(jù)?
呼叫數(shù)據(jù)集不是嵌套的绑改;我們不必過(guò)于費(fèi)力從截停數(shù)據(jù)集中獲取非嵌套的數(shù)據(jù)谢床。
數(shù)據(jù)是否引用了其他數(shù)據(jù)?如果是這樣厘线,我們可以連接數(shù)據(jù)嗎识腿?
呼叫數(shù)據(jù)集引用了星期表。連接這兩張表讓我們知道數(shù)據(jù)集中每個(gè)事件的星期造壮。截取數(shù)據(jù)集沒(méi)有明顯的引用渡讼。
每個(gè)記錄中的字段(例如,列)是什么耳璧?每列的類型是什么成箫?
呼叫和截停數(shù)據(jù)集的字段,在每個(gè)數(shù)據(jù)集的“數(shù)據(jù)清理”一節(jié)中介紹旨枯。
粒度
數(shù)據(jù)的粒度是數(shù)據(jù)中每條記錄代表什么蹬昌。 例如,在呼叫數(shù)據(jù)集中攀隔,每條記錄代表一次警務(wù)呼叫皂贩。
# HIDDEN
calls = pd.read_csv('data/calls.csv')
calls.head()
CASENO | OFFENSE | CVLEGEND | BLKADDR | EVENTDTTM | Latitude | Longitude | Day | |
---|---|---|---|---|---|---|---|---|
0 | 17091420 | BURGLARY AUTO | BURGLARY - VEHICLE | 2500 LE CONTE AVE | 2017-07-23 06:00:00 | 37.876965 | -122.260544 | Sunday |
1 | 17038302 | BURGLARY AUTO | BURGLARY - VEHICLE | BOWDITCH STREET & CHANNING WAY | 2017-07-02 22:00:00 | 37.867209 | -122.256554 | Sunday |
2 | 17049346 | THEFT MISD. (UNDER $950) | LARCENY | 2900 CHANNING WAY | 2017-08-20 23:20:00 | 37.867948 | -122.250664 | Sunday |
3 | 17091319 | THEFT MISD. (UNDER $950) | LARCENY | 2100 RUSSELL ST | 2017-07-09 04:15:00 | 37.856719 | -122.266672 | Sunday |
4 | 17044238 | DISTURBANCE | DISORDERLY CONDUCT | TELEGRAPH AVENUE & DURANT AVE | 2017-07-30 01:16:00 | 37.867816 | -122.258994 | Sunday |
在截停數(shù)據(jù)集中栖榨,每條記錄代表一次警務(wù)截停事件。
# HIDDEN
stops = pd.read_csv('data/stops.csv', parse_dates=[1], infer_datetime_format=True)
stops.head()
Incident Number | Call Date/Time | Location | Incident Type | Dispositions | Location - Latitude | Location - Longitude | |
---|---|---|---|---|---|---|---|
0 | 2015-00004825 | 2015-01-26 00:10:00 | SAN PABLO AVE / MARIN AVE | T | M | NaN | NaN |
1 | 2015-00004829 | 2015-01-26 00:50:00 | SAN PABLO AVE / CHANNING WAY | T | M | NaN | NaN |
2 | 2015-00004831 | 2015-01-26 01:03:00 | UNIVERSITY AVE / NINTH ST | T | M | NaN | NaN |
3 | 2015-00004848 | 2015-01-26 07:16:00 | 2000 BLOCK BERKELEY WAY | 1194 | BM4ICN | NaN | NaN |
4 | 2015-00004849 | 2015-01-26 07:43:00 | 1700 BLOCK SAN PABLO AVE | 1194 | BM4ICN | NaN | NaN |
另一方面明刷,我們可能以下列格式收到接受數(shù)據(jù):
# HIDDEN
(stops
.groupby(stops['Call Date/Time'].dt.date)
.size()
.rename('Num Incidents')
.to_frame()
)
Num Incidents | |
---|---|
Call Date/Time | |
2015-01-26 | 46 |
2015-01-27 | 57 |
2015-01-28 | 56 |
... | ... |
2017-04-28 | 82 |
2017-04-29 | 86 |
2017-04-30 | 59 |
825 rows × 1 columns
在這種情況下婴栽,表格中的每個(gè)記錄對(duì)應(yīng)于單個(gè)日期而不是單個(gè)事件。 我們會(huì)將此表描述為辈末,它具有比上述更粗的粒度愚争。 了解數(shù)據(jù)的粒度非常重要,因?yàn)樗鼪Q定了你可以執(zhí)行哪種分析本冲。 一般來(lái)說(shuō)准脂,細(xì)粒度由于粗粒度;雖然我們可以使用分組和旋轉(zhuǎn)將細(xì)粒度變?yōu)榇至6让识矗覀儧](méi)有幾個(gè)工具可以由粗到精狸膏。
粒度檢查清單
查看數(shù)據(jù)集的粒度后,你應(yīng)該回答以下問(wèn)題添怔。我們將根據(jù)呼叫和截停數(shù)據(jù)集回答他們湾戳。
一條記錄代表了什么?
在呼叫數(shù)據(jù)集中广料,每條記錄代表一次警務(wù)呼叫砾脑。在截停數(shù)據(jù)集中,每條記錄代表一次警務(wù)截停事件艾杏。
所有記錄的粒度是否在同一級(jí)別韧衣? (有時(shí)一個(gè)表格將包含匯總行。)
是的购桑,對(duì)于呼叫和截停數(shù)據(jù)集是如此畅铭。
如果數(shù)據(jù)是聚合的,聚合是如何進(jìn)行的勃蜘?采樣和平均是常見(jiàn)的聚合硕噩。
就有印象記住,在兩個(gè)數(shù)據(jù)集中缭贡,位置都是輸入為街區(qū)炉擅,而不是特定的地址。
我們可以對(duì)數(shù)據(jù)執(zhí)行什么類型的聚合阳惹?
例如谍失,隨著時(shí)間的推移,將個(gè)體聚合為人口統(tǒng)計(jì)分組莹汤,或個(gè)體事件聚合為總數(shù)快鱼。
在這種情況下,我們可以聚合為不同的日期或時(shí)間粒度。例如攒巍,我們可以使用聚合,找到事件最常見(jiàn)的一天的某個(gè)小時(shí)荒勇。我們也可能能夠按照事件地點(diǎn)聚合柒莉,來(lái)發(fā)現(xiàn)事件最多的伯克利地區(qū)。
范圍
數(shù)據(jù)集的范圍是指數(shù)據(jù)集的覆蓋面沽翔,與我們有興趣分析的東西相關(guān)兢孝。我們?cè)噲D回答我們數(shù)據(jù)范圍的以下問(wèn)題:
數(shù)據(jù)是否涵蓋了感興趣的話題?
例如仅偎,呼叫和截停數(shù)據(jù)集包含在伯克利發(fā)生的呼叫和截停事件跨蟹。然而,如果我們對(duì)加利福尼亞州的犯罪事件感興趣橘沥,那么這些數(shù)據(jù)集的范圍將會(huì)過(guò)于有限窗轩。
一般來(lái)說(shuō),較大的范圍比較小的范圍更有用座咆,因?yàn)槲覀兛梢詫⑤^大的范圍過(guò)濾為較小的范圍痢艺,但通常不能從較小的范圍轉(zhuǎn)到較大的范圍。例如介陶,如果我們有美國(guó)的警務(wù)截停數(shù)據(jù)集堤舒,我們可以取數(shù)據(jù)集的子集,來(lái)調(diào)查伯克利哺呜。
請(qǐng)記住舌缤,范圍是一個(gè)廣義術(shù)語(yǔ),并不總是用于描述地理位置某残。例如国撵,它也可以指時(shí)間覆蓋面 - 呼叫數(shù)據(jù)集僅包含 180 天的數(shù)據(jù)。
在調(diào)查數(shù)據(jù)生成的過(guò)程中驾锰,我們經(jīng)常會(huì)處理數(shù)據(jù)集的范圍卸留,并在 EDA 期間確認(rèn)數(shù)據(jù)集的范圍。讓我們來(lái)確認(rèn)呼叫數(shù)據(jù)集的地理和時(shí)間范圍椭豫。
calls
CASENO | OFFENSE | CVLEGEND | BLKADDR | EVENTDTTM | Latitude | Longitude | Day | |
---|---|---|---|---|---|---|---|---|
0 | 17091420 | BURGLARY AUTO | BURGLARY - VEHICLE | 2500 LE CONTE AVE | 2017-07-23 06:00:00 | 37.876965 | -122.260544 | Sunday |
1 | 17038302 | BURGLARY AUTO | BURGLARY - VEHICLE | BOWDITCH STREET & CHANNING WAY | 2017-07-02 22:00:00 | 37.867209 | -122.256554 | Sunday |
2 | 17049346 | THEFT MISD. (UNDER $950) | LARCENY | 2900 CHANNING WAY | 2017-08-20 23:20:00 | 37.867948 | -122.250664 | Sunday |
... | ... | ... | ... | ... | ... | ... | ... | ... |
5505 | 17021604 | IDENTITY THEFT | FRAUD | 100 MONTROSE RD | 2017-03-31 00:00:00 | 37.896218 | -122.270671 | Friday |
5506 | 17033201 | DISTURBANCE | DISORDERLY CONDUCT | 2300 COLLEGE AVE | 2017-06-09 22:34:00 | 37.868957 | -122.254552 | Friday |
5507 | 17047247 | BURGLARY AUTO | BURGLARY - VEHICLE | UNIVERSITY AVENUE & CHESTNUT ST | 2017-08-11 20:00:00 | 37.869679 | -122.288038 | Friday |
5508 rows × 8 columns
# Shows earliest and latest dates in calls
calls['EVENTDTTM'].dt.date.sort_values()
'''
1384 2017-03-02
1264 2017-03-02
1408 2017-03-02
...
3516 2017-08-28
3409 2017-08-28
3631 2017-08-28
Name: EVENTDTTM, Length: 5508, dtype: object
'''
calls['EVENTDTTM'].dt.date.max() - calls['EVENTDTTM'].dt.date.min()
# datetime.timedelta(179)
該表格包含 179 天的時(shí)間段的數(shù)據(jù)耻瑟,該時(shí)間段足夠接近數(shù)據(jù)描述中的 180 天,我們可以假設(shè) 2017 年 4 月 14 日或 2017 年 8 月 29 日沒(méi)有呼叫赏酥。
為了檢查地理范圍喳整,我們可以使用地圖:
import folium # Use the Folium Javascript Map Library
import folium.plugins
SF_COORDINATES = (37.87, -122.28)
sf_map = folium.Map(location=SF_COORDINATES, zoom_start=13)
locs = calls[['Latitude', 'Longitude']].astype('float').dropna().as_matrix()
heatmap = folium.plugins.HeatMap(locs.tolist(), radius = 10)
sf_map.add_child(heatmap)
除少數(shù)例外情況外,呼叫數(shù)據(jù)集覆蓋了伯克利地區(qū)裸扶。 我們可以看到框都,大多數(shù)警務(wù)呼叫發(fā)生在伯克利市中心和 UCB 校區(qū)的南部。
現(xiàn)在我們來(lái)確認(rèn)截停數(shù)據(jù)集的時(shí)間和地理范圍:
stops
Incident Number | Call Date/Time | Location | Incident Type | Dispositions | Location - Latitude | Location - Longitude | |
---|---|---|---|---|---|---|---|
0 | 2015-00004825 | 2015-01-26 00:10:00 | SAN PABLO AVE / MARIN AVE | T | M | NaN | NaN |
1 | 2015-00004829 | 2015-01-26 00:50:00 | SAN PABLO AVE / CHANNING WAY | T | M | NaN | NaN |
2 | 2015-00004831 | 2015-01-26 01:03:00 | UNIVERSITY AVE / NINTH ST | T | M | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... |
29205 | 2017-00024245 | 2017-04-30 22:59:26 | UNIVERSITY AVE/6TH ST | T | BM2TWN | NaN | NaN |
29206 | 2017-00024250 | 2017-04-30 23:19:27 | UNIVERSITY AVE / WEST ST | T | HM4TCS | 37.869876 | -122.286551 |
29207 | 2017-00024254 | 2017-04-30 23:38:34 | CHANNING WAY / BOWDITCH ST | 1194 | AR | 37.867208 | -122.256529 |
29208 rows × 7 columns
stops['Call Date/Time'].dt.date.sort_values()
'''
0 2015-01-26
25 2015-01-26
26 2015-01-26
...
29175 2017-04-30
29177 2017-04-30
29207 2017-04-30
Name: Call Date/Time, Length: 29208, dtype: object
'''
如承諾的那樣呵晨,數(shù)據(jù)收集工作從 2015 年 1 月 26 日開(kāi)始魏保。因?yàn)樗?2017 年 4 月 30 日起停止熬尺,數(shù)據(jù)似乎在 2017 年 5 月初左右下載。讓我們繪制地圖來(lái)查看地理數(shù)據(jù):
SF_COORDINATES = (37.87, -122.28)
sf_map = folium.Map(location=SF_COORDINATES, zoom_start=13)
locs = stops[['Location - Latitude', 'Location - Longitude']].astype('float').dropna().as_matrix()
heatmap = folium.plugins.HeatMap(locs.tolist(), radius = 10)
sf_map.add_child(heatmap)
我們可以證實(shí)谓罗,數(shù)據(jù)集中在伯克利發(fā)生的警務(wù)截停粱哼,以及大多數(shù)警務(wù)呼叫,都發(fā)生在伯克利市中心和伯克利西部地區(qū)檩咱。
時(shí)間性
時(shí)間性是指數(shù)據(jù)在時(shí)間上如何表示揭措,特別是數(shù)據(jù)集中的日期和時(shí)間字段。我們?cè)噲D通過(guò)這些字段來(lái)了解以下特征:
數(shù)據(jù)集中日期和時(shí)間字段的含義是什么刻蚯?
在呼叫和截停數(shù)據(jù)集中绊含,日期時(shí)間字段表示警務(wù)呼叫或截停的時(shí)間。然而炊汹,截停數(shù)據(jù)集最初還有一個(gè)日期時(shí)間字段躬充,記錄案件什么時(shí)候輸入到數(shù)據(jù)庫(kù),我們?cè)跀?shù)據(jù)清理過(guò)程中將其移除讨便,因?yàn)槲覀冋J(rèn)為它不適用于分析麻裳。
另外,我們應(yīng)該注意日期時(shí)間字段的時(shí)區(qū)和夏令時(shí)器钟,特別是在處理來(lái)自多個(gè)位置的數(shù)據(jù)的時(shí)候津坑。
日期和時(shí)間字段在數(shù)據(jù)中有什么表示形式?
雖然美國(guó)使用MM/DD/YYYY
格式傲霸,但許多其他國(guó)家使用DD/MM/YYYY
格式疆瑰。仍有更多格式在世界各地使用,分析數(shù)據(jù)時(shí)認(rèn)識(shí)到這些差異非常重要昙啄。
在呼叫和截停數(shù)據(jù)集中穆役,日期顯示為MM/DD/YYYY
格式。
是否有奇怪的時(shí)間戳梳凛,它可能代表空值耿币?
某些程序使用占位符而不是空值。例如韧拒,Excel 的默認(rèn)日期是 1990 年 1 月 1 日淹接,而 Mac 上的 Excel 則是 1904 年 1 月 1 日。許多應(yīng)用將生成 1970 年 1 月 1 日 12:00 或 1969 年 12 月 31 日 11:59 pm 的默認(rèn)日期時(shí)間叛溢,因?yàn)檫@是用于時(shí)間戳的 Unix 紀(jì)元塑悼。如果你在數(shù)據(jù)中注意到這些時(shí)間戳的多個(gè)實(shí)例,則應(yīng)該謹(jǐn)慎并仔細(xì)檢查數(shù)據(jù)源楷掉。 呼叫或截停數(shù)據(jù)集都不包含任何這些可疑值厢蒜。
忠實(shí)度
如果我們相信它能準(zhǔn)確捕捉現(xiàn)實(shí),我們將數(shù)據(jù)集描述為“忠實(shí)的”。通常斑鸦,不可信的數(shù)據(jù)集包含:
不切實(shí)際或不正確的值
例如愕贡,未來(lái)的日期,不存在的位置巷屿,負(fù)數(shù)或較大離群值颂鸿。
明顯違反的依賴關(guān)系
例如,個(gè)人的年齡和生日不匹配攒庵。
手動(dòng)輸入的數(shù)據(jù)
我們看到,這些通常充滿了拼寫(xiě)錯(cuò)誤和不一致败晴。
明顯的數(shù)據(jù)偽造跡象
例如浓冒,重復(fù)的名稱,偽造的電子郵件地址尖坤,或重復(fù)使用不常見(jiàn)的名稱或字段稳懒。
注意與數(shù)據(jù)清理的許多相似之處。 我們提到慢味,我們經(jīng)常在數(shù)據(jù)清理和 EDA 之間來(lái)回切換场梆,特別是在確定數(shù)據(jù)忠實(shí)度的時(shí)候。 例如纯路,可視化經(jīng)常幫助我們識(shí)別數(shù)據(jù)中的奇怪條目或油。
calls = pd.read_csv('data/calls.csv')
calls.head()
CASENO | OFFENSE | EVENTDT | EVENTTM | ... | BLKADDR | Latitude | Longitude | Day | |
---|---|---|---|---|---|---|---|---|---|
0 | 17091420 | BURGLARY AUTO | 07/23/2017 12:00:00 AM | 06:00 | ... | 2500 LE CONTE AVE | 37.876965 | -122.260544 | Sunday |
1 | 17038302 | BURGLARY AUTO | 07/02/2017 12:00:00 AM | 22:00 | ... | BOWDITCH STREET & CHANNING WAY | 37.867209 | -122.256554 | Sunday |
2 | 17049346 | THEFT MISD. (UNDER $950) | 08/20/2017 12:00:00 AM | 23:20 | ... | 2900 CHANNING WAY | 37.867948 | -122.250664 | Sunday |
3 | 17091319 | THEFT MISD. (UNDER $950) | 07/09/2017 12:00:00 AM | 04:15 | ... | 2100 RUSSELL ST | 37.856719 | -122.266672 | Sunday |
4 | 17044238 | DISTURBANCE | 07/30/2017 12:00:00 AM | 01:16 | ... | TELEGRAPH AVENUE & DURANT AVE | 37.867816 | -122.258994 | Sunday |
5 rows × 9 columns
calls['CASENO'].plot.hist(bins=30)
# <matplotlib.axes._subplots.AxesSubplot at 0x1a1ebb2898>
請(qǐng)注意17030000
和17090000
處的非預(yù)期的簇。通過(guò)繪制案例編號(hào)的分布驰唬,我們可以很快查看數(shù)據(jù)中的異常顶岸。 在這種情況下,我們可能會(huì)猜測(cè)叫编,兩個(gè)不同的警察團(tuán)隊(duì)為他們的呼叫使用不同的案件編號(hào)辖佣。
數(shù)據(jù)探索通常會(huì)發(fā)現(xiàn)異常情況;如果可以修復(fù)搓逾,我們可以使用數(shù)據(jù)清理技術(shù)卷谈。