中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

帶你和Python與R一起玩轉(zhuǎn)數(shù)據(jù)科學(xué): 探索性數(shù)據(jù)分析(附代碼)

2018-08-06    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用
內(nèi)容簡介

本系列將介紹如何在現(xiàn)在工作中用兩種最流行的開源平臺玩轉(zhuǎn)數(shù)據(jù)科學(xué)。本文先來看一看數(shù)據(jù)分析過程中的關(guān)鍵步驟 – 探索性數(shù)據(jù)分析(Exploratory Data Analysis,EDA)。

探索性數(shù)據(jù)分析發(fā)生在數(shù)據(jù)收集和數(shù)據(jù)清理之后,而在數(shù)據(jù)建模和分析結(jié)果可視化展現(xiàn)之前。然而,這是一個可反復(fù)的過程。做完某種EDA后,我們可以嘗試建立一些數(shù)據(jù)模型或者生成一些可視化結(jié)果。同時,根據(jù)最新的分析結(jié)果我們又可以進(jìn)行進(jìn)一步的EDA,等等。所有的這些都是為了更快地找到線索,而不用糾結(jié)在數(shù)據(jù)細(xì)節(jié)和美觀上。EDA的主要目的是為了了解我們的數(shù)據(jù),了解它的趨勢和質(zhì)量,同時也是為了檢查我們的假設(shè)甚至開始構(gòu)建我們的假設(shè)算法。

了解了以上內(nèi)容,我們將解釋如何用描述統(tǒng)計學(xué)、基本繪圖和數(shù)據(jù)框來回答一些問題,同時指導(dǎo)我們做進(jìn)一步的數(shù)據(jù)分析。

準(zhǔn)備數(shù)據(jù)

我們將繼續(xù)使用在介紹數(shù)據(jù)框時已經(jīng)裝載過的相同的數(shù)據(jù)集。因此你可以接著數(shù)據(jù)框相關(guān)教程繼續(xù)這個章節(jié)。

我們要回答的問題

在任何的數(shù)據(jù)分析過程中,總有一個或多個問題是我們要回答的。定義這些問題,是整個數(shù)據(jù)分析過程中最基本也是最重要的一個步驟。因為我們要在我們的結(jié)核病數(shù)據(jù)集中做探索性數(shù)據(jù)分析,有一些問題需要我們回答:

哪些國家擁有最高傳染性結(jié)核病發(fā)病率?

從1990年到2007年世界結(jié)核病的總體趨勢是什么?

哪些國家沒有符合這個趨勢?

還有哪些關(guān)于這個疾病的真相可以從我們的數(shù)據(jù)中得到?

描述性統(tǒng)計

Python

在Python中,對一個pandas.DataFrame對象的基本的描述性統(tǒng)計方法是describe()。它等同于R語言中data.frame的summary()方法。

 

 

這里列出了所有列的統(tǒng)計信息,我們可以用以下方法來訪問每個列的匯總信息:

 

 

Pandas包中有多得可怕的描述性統(tǒng)計方法。其中一部分已經(jīng)包含在了我們的summary對象中,但是還有更多的方法不在其中。在接下來的教程中我們將好好的利用它們來更好的了解我們的數(shù)據(jù)。

例如,我們可以得到西班牙(Spain)每年結(jié)核病發(fā)病量的變化百分比:

 

 

同時從以上結(jié)果得到最大值:

 

 

也可以對英國(United Kingdom)做同樣的操作:

 

 

如果我們要了解索引值(year),我們用argmax 方法(或Pandas新版本中的idmax調(diào)用方法)如下:

 

 

也就是說,1998年和1992年分別是西班牙和英國肺結(jié)核發(fā)病量增長最糟糕的年。

R

在R語言中基本的描述性統(tǒng)計方法,如我們說過的,是summary()。

 

 

這個方法返回一個表格對象,使我們擁有了一個包含各列統(tǒng)計信息的數(shù)據(jù)框。表格對象有利于我們觀察數(shù)據(jù),但作為數(shù)據(jù)框卻不利于我們訪問和索引數(shù)據(jù);旧希覀兪前阉(dāng)作矩陣,通過坐標(biāo)位來訪問其中的數(shù)據(jù)。通過這種方法,如果我們要得到第一列,Afghanistan的相關(guān)數(shù)據(jù),我們該這樣做:

 

 

有個竅門可以通過列名訪問數(shù)據(jù),那就是將原始數(shù)據(jù)框中的列名和which()方法一起使用。我們還可以在結(jié)果集上構(gòu)建一個新的數(shù)據(jù)框。

 

 

R做為一種函數(shù)式語言,我們可以對向量使用函數(shù)方法例如sum、 mean、 sd等等。記住一個數(shù)據(jù)框就是一個向量的列表(也就是說各個列都是一個值的向量),如此我們便可以很容易地用這些函數(shù)作用于列上。最終我們將這些函數(shù)和lapply或sapply一起使用并作用于數(shù)據(jù)框的多列數(shù)據(jù)上。

不管怎樣,在R語言中有一家族的函數(shù)可以作用于列數(shù)據(jù)或行數(shù)據(jù)上以直接得到均值或和值。這樣做比用apply函數(shù)更有效,并且還允許我們將他們不光用在列數(shù)據(jù)上,更可用在行數(shù)據(jù)上。例如,你輸入‘?colSums’命令,幫助頁面會彈出所有這些函數(shù)的描述性說明。

比如我們想得到每年的平均病發(fā)量,我們只需要一個簡單的函數(shù)調(diào)用:

 

 

圖表繪制

在這個章節(jié)中我們要看一看在Python/Pandas和R中的基本的繪圖制表功能。然而,還有其它如ggplot2,這樣繪圖功能更強(qiáng)大語言包可以選擇。ggplot2最初是為R語言創(chuàng)建的,Yhat的人又提供了它的Python語言的實現(xiàn)。

Python

Pandas包中DataFrame對象實現(xiàn)的即時可用的作圖方法有3個之多第一個方法是一個基本的線圖繪制,作用于索引中的連續(xù)變量。當(dāng)我們用IPython notebook工具繪圖時,這第一條線也許我們會用得著:

 

 

或者我們可以用箱線圖來得到給定連續(xù)變量的摘要視圖:

 

 

還有一個histogram()方法,但是我們現(xiàn)在還不能將它作用于我們這種類型的數(shù)據(jù)。

R

和ggplot2相比,R語言的基礎(chǔ)繪圖不是非常精密復(fù)雜,但它還是功能強(qiáng)大同時又操作便利的。它的很多數(shù)據(jù)類型都自定義并實現(xiàn)了plot()方法,可以允許我們簡單地調(diào)用方法對它們進(jìn)行繪圖。然而并不總是如此便利,更多的情況是我們需要將正確的元素集傳給我們的基礎(chǔ)繪圖函數(shù)。

正像之前用Python/Pandas繪制線型圖,我們也從基礎(chǔ)的線型圖繪制開始:

 

 

 

 

你可以比較出在Pandas中繪制三條連續(xù)變量線型圖是多么容易,而用R的基礎(chǔ)繪圖繪制相同的圖代碼是多么冗長。我們至少需要三個函數(shù)調(diào)用,先是為了圖形和線,然后還有圖的標(biāo)注,等等。R語言的基本繪圖的真正用意就是繪制快速而不完善的圖。

現(xiàn)在讓我們來使用箱線圖:

 

 

這是一段簡短的箱線圖代碼,我們甚至沒有要圖的顏色和圖例說明。

回答問題

現(xiàn)在讓我們開始正真好玩的章節(jié)。一旦我們了解了我們的工具(從之前的數(shù)據(jù)框教程到當(dāng)下這個教程),我們就可以用它們來回答關(guān)于傳染性肺結(jié)核病在全球的發(fā)病率和盛行率的一些問題。

問題:我們想知道,每年,哪個國家存在的、新的傳染性肺結(jié)核病例最多?

Python

如果我們只是想得到病例最多的國家,我們可以利用apply和argmax函數(shù)。記住,默認(rèn)的,apply作用于列數(shù)據(jù)(在我們的例子里是國家列),而我們希望它作用于每一年。如此這樣,我們需要在使用數(shù)據(jù)框之前顛倒它的行列位置,或傳入?yún)?shù)axis=1。

 

 

但是這樣做過分簡單了。另外,我們要得到的是位于最后四分區(qū)的國家。而我們首先要做的是找出全球的總的發(fā)病趨勢。

全球傳染性肺結(jié)核發(fā)病趨勢:

為了探索全球總趨勢,我們需要對三個數(shù)據(jù)集中所有國家的每年的數(shù)據(jù)分別求和。

 

 

現(xiàn)在我們要創(chuàng)建一個新的數(shù)據(jù)框,里面包含各個之前得到的和集,然后用數(shù)據(jù)框的plot()方法進(jìn)行繪圖。

 

 

看上去全球每十萬人中現(xiàn)存病例總數(shù)歷年來呈整體下降趨勢。然而新的病例總數(shù)呈上升趨勢,雖然2005年后好像有所下降。所以怎么可能在新的病例總數(shù)增長的情況下現(xiàn)存病例總數(shù)下降呢?其中一個原因可能是我們可以在圖中觀察到的上升的每十萬人的因病死亡人數(shù),但是我們不得不考慮其主要原因是因為人們得到了治療而恢復(fù)了健康?祻(fù)率加上死亡率大于新的病發(fā)率?傊,看上去新的發(fā)病率增加了,而同時我們治愈它們的水平也更好了。我們需要改進(jìn)預(yù)防措施和傳染病控制能力。

超出整體趨勢的國家

所以之前是全球作為一個整體的總趨勢。那么哪些國家呈現(xiàn)不同的趨勢呢(更糟糕)?為了找出這些國家,首先我們需要了解每個國家平均年死亡率的分布情況。

 

 

我們可以畫出這些分布圖從而了解這些國家年平均分布情況。

 

 

我們要得到那些概率大于四分位間距(IQR、50%)1.5倍的國家。

先得到上限值:

 

 

現(xiàn)在我們可以利用這些值來得到從1990年到2007年平均概率大于這些上限值的國家。

 

 

我們有多少比例的國家是超出整體趨勢的?對于死亡率:

 

 

對于存在病率(患病率):

 

 

對于新病率(發(fā)生率):

 

 

現(xiàn)在我們可以用這些指標(biāo)來對我們原始的數(shù)據(jù)框做篩選。

 

 

這是一個嚴(yán)肅的事情。根據(jù)傳染性肺結(jié)核病的分布,我們有超過全球三分之一的國家在現(xiàn)存病率、新病率和死亡率上超出普遍概率。然而如果我們以四分位間距(IQR)的5倍為上限呢?讓我們重復(fù)之前的過程。

 

 

那么現(xiàn)在的比例是多少呢?

 

 

讓我們得到相應(yīng)的數(shù)據(jù)框。

 

 

讓我們把注意力放在傳染病控制上,來看一看這個新的數(shù)據(jù)框:

 

 

讓我們生成一些圖表來加深一下印象。

 

 

我們有了22個國家,在這些國家中新病的年平均率大于全球新病率中間值的5倍。讓我們創(chuàng)建一個國家代表了這22個國家的平均值:

 

 

現(xiàn)在讓我們再創(chuàng)建一個國家代表了其它國家的平均值:

 

 

現(xiàn)在讓我們用這兩個平均國家繪圖:

 

 

新病率的增長趨勢在平均特超國家(超出上限的22個國家的平均值代表)上非常顯著,這么顯著的趨勢很難在改善國家(22個國家之外的其它國家的平均值代表)中觀察到。在90年代,這些國家的傳染性肺結(jié)核病的發(fā)病數(shù)量有一個可怕的上漲。然而讓我們看一下真實的數(shù)據(jù)。

 

 

根據(jù)這張圖,改善和異常國家的發(fā)病率增長趨勢在同一時間發(fā)生了相同的波動和恢復(fù),并且在大約2002年的時候有事情發(fā)生。在下一章節(jié)中我們將嘗試找出到底發(fā)生了什么。

R

我們已經(jīng)了解到在R中我們可以用max函數(shù)作用于數(shù)據(jù)框的列上以得到列的最大值。額外的,我們還可以用which.max來得到最大值的位置(等同于在Pandas中使用argmax)。如果我們使用行列換位的數(shù)據(jù)框,我們可以用函數(shù)lapply或sapply對每一個年列進(jìn)行操作,然后得到一列表或一向量的指標(biāo)值(我們將會用sapply函數(shù)返回一個向量)。我們只需要做一點微調(diào),利用一個包含國家名的向量來使操作返回國家名而不是國家所在的位置。

 

 

全球傳染性肺結(jié)核發(fā)病趨勢:

再次,為了探索全球的總趨勢,我們需要將三個數(shù)據(jù)集中的所有國家的數(shù)值按年相加。

但是首先我們需要加載另外兩個數(shù)據(jù)集以得到死亡數(shù)量和新病數(shù)量。

 

 

同時現(xiàn)在是按行求和。我們需要將返回的數(shù)字向量轉(zhuǎn)化為數(shù)據(jù)框。

 

 

現(xiàn)在我們可以用目前我們已經(jīng)學(xué)到的技巧來繪出各線圖。為了得到一個包含各總數(shù)的向量以傳給每個繪圖函數(shù),我們使用了以列名為索引的數(shù)據(jù)框。

 

 

從上圖中得到的結(jié)論顯然和我們用Python時得到的相同。

超出整體趨勢的國家:

所以哪些國家是超出整體趨勢的呢(更糟糕)?再一次,為了找出答案,我們首先需要了解每個國家的年平均分布情況。我們用函數(shù)colMeans 以達(dá)到目的。

 

 

我們可以繪制出分布圖以對各個國家的年平均值的分布情況有所了解。我們對單個國家不是非常感興趣,我們感興趣的是分布情況本身。

 

image

 

 

 

再一次我們可以在圖上看到有三部分走勢,開始部分緩慢地上升,接下來第二部分上升走勢,最后一個尖起的峰值明顯地不同于其它部分。

這次讓我們跳過1.5倍的四分位間距部分,直接來到5倍四分位間距。在R語言中,我們要采用不同的方法。我們將使用函數(shù)quantile()來得到四分位間距從而判斷離群值的臨界值。

因為我們已經(jīng)從Python章節(jié)中知道了結(jié)果,讓我們只對新病率找出離群國家,如此一來我們要再次繪制之前的圖。

 

 

離群比例:

 

 

讓我們從中得到一個數(shù)據(jù)框,只包含離群的國家信息。

 

 

現(xiàn)在我們已經(jīng)準(zhǔn)備好了繪制圖形。

 

 

我們可以明顯看到使用Pandas基本繪圖與R基本繪圖的優(yōu)勢!

到目前為止結(jié)果是相符的。我們有22個國家,平均每年的新病例數(shù)大于分布中值的5倍。讓我們來創(chuàng)建一個國家代表這個平均值,在這里我們使用rowMeans()。

 

 

現(xiàn)在讓我們創(chuàng)建一個國家代表其他國家。

 

 

現(xiàn)在將這兩個國家放在一起。

 

 

谷歌一下關(guān)于肺結(jié)核病的事件以及日期

在此章節(jié)中我們只用Python來分析。關(guān)于谷歌檢索,其實我們只是直接訪問維基百科關(guān)于這個疾病的目錄(https://en.wikipedia.org/wiki/Tuberculosis#Epidemiology)。

在疫情章節(jié)我們可以找到如下內(nèi)容:

肺結(jié)核病的發(fā)病總數(shù)從2005年開始下降,而新病發(fā)現(xiàn)量則從2002年開始就已經(jīng)下降了。

這一點已經(jīng)被我們之前的分析證實了。

中國取得了尤其顯著的進(jìn)展,從1990年到2010年,傳染性肺結(jié)核病的死亡率下降了大約80%。讓我們來看一下:

 

 

在2007年,預(yù)估傳染性肺結(jié)核病的新病發(fā)生率最高的國家是斯威士蘭,10萬人中有1200起病例。

 

 

在維基百科中還有更多的發(fā)現(xiàn)是我們可以通過分析這些Google數(shù)據(jù)或其它Gapminder提供的數(shù)據(jù)來證實的。例如,傳染性肺結(jié)核病和艾滋病經(jīng)常被關(guān)聯(lián)起來,同它們一起關(guān)聯(lián)起來還有貧困水平。將它們相關(guān)的數(shù)據(jù)集關(guān)聯(lián)起來,探索它們各自的變化趨勢將會很有意思。讀者們可以去試著分析一下并和我們分享你們的發(fā)現(xiàn)。

總結(jié)

探索性數(shù)據(jù)分析是數(shù)據(jù)分析的一個關(guān)鍵步驟。在此階段我們開始使接下來的工作逐漸成型。它發(fā)生于任一數(shù)據(jù)可視化或機(jī)器學(xué)習(xí)工作之前,向我們展示我們的數(shù)據(jù)或假設(shè)的好壞。

傳統(tǒng)上,R語言是大多數(shù)探索性數(shù)據(jù)分析工作選擇的武器,雖然使用其它的展示能力更佳的繪圖程式庫是相當(dāng)方便的,如gglot2。事實上,當(dāng)我們用Python時,Pandas中所包含的基本的繪圖功能使這個步驟更加清晰和便捷。不管怎樣,我們這里回答的這些問題都非常簡單而且沒有包含多變量和數(shù)據(jù)編碼。在這種復(fù)雜的情況下,一個進(jìn)階的程式庫如ggplot2將大放光彩。除了能給我們更漂亮的繪圖之外,它的豐富的變現(xiàn)手法和重用性將大大地節(jié)省我們的時間。

盡管我們的分析和圖表都如此簡單,我們依然能夠證明一個論點,那就是像肺結(jié)核這樣的疾病引發(fā)的人道危機(jī)是多么嚴(yán)重,特別是考慮到這種疾病在更加發(fā)達(dá)的國家被相對更好地控制了。我們已經(jīng)看到了一些編程技巧和大量的求知欲,從而允許我們在此之上建立一些認(rèn)知和其它的全球化問題。

本文作者:Jose A Dianes

標(biāo)簽: Google 代碼 谷歌 數(shù)據(jù)分析

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Google計劃在新加坡建第三座數(shù)據(jù)中心 投資總額增至8.5億美元

下一篇:數(shù)據(jù)中心如何從模塊化走向智能化?