帶你和Python與R一起玩轉數據科學: 探索性數據分析(附代碼)

2021-03-02 數據分析

作者:Jose A Dianes ;翻譯:季洋 ;校對:丁楠雅

本文約5822字,建議閱讀20+分鐘。

本系列將介紹如何在現在工作中用兩種最流行的開源平臺玩轉數據科學。先來看一看數據分析過程中的關鍵步驟 – 探索性數據分析。

內容簡介

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

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

了解了以上內容,我們將解釋如何用描述統計學、基本繪圖和數據框來回答一些問題,同時指導我們做進一步的數據分析。

這系列教程的所有代碼和應用程式可以從GitHub(https://github.com/jadianes/data-science-your-way)中得到。你可以隨意參與並同我們分享你的進度。

準備數據

我們將繼續使用在介紹數據框時已經裝載過的相同的數據集。因此你可以接著數據框相關教程繼續這個章節,或者重新學習數據準備教程 (https://www.codementor.io/python/tutorial/python-vs-r-for-data-science-data-frames-i)。

我們要回答的問題

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

描述性統計


Python

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


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

Pandas包中有多得可怕的描述性統計方法(可參照文檔http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats)。其中一部分已經包含在了我們的summary對象中,但是還有更多的方法不在其中。在接下來的教程中我們將好好的利用它們來更好的了解我們的數據。

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

同時從以上結果得到最大值:

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

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

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

R

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

這個方法返回一個表格對象,使我們擁有了一個包含各列統計信息的數據框。表格對象有利於我們觀察數據,但作為數據框卻不利於我們訪問和索引數據。基本上,我們是把它當作矩陣,通過坐標位來訪問其中的數據。通過這種方法,如果我們要得到第一列,Afghanistan的相關數據,我們該這樣做:

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

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

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

比如我們想得到每年的平均病發量,我們只需要一個簡單的函數調用:

圖表繪製

在這個章節中我們要看一看在Python/Pandas和R中的基本的繪圖制表功能。然而,還有其它如ggplot2(http://ggplot2.org/)這樣繪圖功能更強大語言包可以選擇。ggplot2最初是為R語言創建的,Yhat(https://yhathq.com/)的人又提供了它的Python語言的實現(http://ggplot.yhathq.com/)。

Python

Pandas包中DataFrame對象實現的即時可用的作圖方法有3個之多(請參閱文檔http://pandas.pydata.org/pandas-docs/stable/api.html#id11。)第一個方法是一個基本的線圖繪製,作用於索引中的連續變量。當我們用IPython notebook工具繪圖時,這第一條線也許我們會用得著:

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

還有一個histogram()方法,但是我們現在還不能將它作用於我們這種類型的數據。

R

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

正像之前用Python/Pandas繪製線型圖,我們也從基礎的線型圖繪製開始:

你可以比較出在Pandas中繪製三條連續變量線型圖是多麼容易,而用R的基礎繪圖繪製相同的圖代碼是多麼冗長。我們至少需要三個函數調用,先是為了圖形和線,然後還有圖的標註,等等。R語言的基本繪圖的真正用意就是繪製快速而不完善的圖。

現在讓我們來使用箱線圖:

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

回答問題

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

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

Python

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

但是這樣做過分簡單了。另外,我們要得到的是位於最後四分區的國家。而我們首先要做的是找出全球的總的發病趨勢。

全球傳染性肺結核發病趨勢:

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

現在我們要創建一個新的數據框,裡面包含各個之前得到的和集,然後用數據框的plot()方法進行繪圖。

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

超出整體趨勢的國家

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

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

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

先得到上限值:

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

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

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

對於新病率(發生率):

現在我們可以用這些指標來對我們原始的數據框做篩選。

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

那麼現在的比例是多少呢?

讓我們得到相應的數據框。

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

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

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

現在讓我們再創建一個國家代表了其它國家的平均值:

現在讓我們用這兩個平均國家繪圖:

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

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

R

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

全球傳染性肺結核發病趨勢:

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

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

以下截圖數據下載連結不完整,分別為:https://docs.google.com/spreadsheets/d/12uWVH_IlmzJX_75bJ3IH5E-Gqx6-zfbDKNvZqYjUuso/pub?gid=0&output=CSV 

https://docs.google.com/spreadsheets/d/1Pl51PcEGlO9Hp4Uh0x2_QM0xVb53p2UDBMPwcnSjFTk/pub?gid=0&output=csv 

同時現在是按行求和。我們需要將返回的數字向量轉化為數據框。

現在我們可以用目前我們已經學到的技巧來繪出各線圖。為了得到一個包含各總數的向量以傳給每個繪圖函數,我們使用了以列名為索引的數據框。

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

超出整體趨勢的國家:

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

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

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

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

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

離群比例:

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

現在我們已經準備好了繪製圖形。

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

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

現在讓我們創建一個國家代表其他國家。

現在將這兩個國家放在一起。

谷歌一下關於肺結核病的事件以及日期

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

在疫情章節我們可以找到如下內容:

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

探索其它網頁

除Gapminder網站之外的關於結核病其它有趣的資源:

蓋茨基金會網站:

http://www.gatesfoundation.org/What-We-Do/Global-Health/Tuberculosis

http://www.gatesfoundation.org/Media-Center/Press-Releases/2007/09/New-Grants-to-Fight-Tuberculosis-Epidemic 

總結

探索性數據分析是數據分析的一個關鍵步驟。在此階段我們開始使接下來的工作逐漸成型。它發生於任一數據可視化或機器學習工作之前,向我們展示我們的數據或假設的好壞。

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

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

請記住這系列教程的所有代碼和應用程式可以從GitHub(https://github.com/jadianes/data-science-your-way)中得到。

你可以隨意參與並同我們分享你的進度!

 

原文標題:

Data Science with Python & R: Exploratory Data Analysis

原文連結:

https://www.codementor.io/jadianes/data-science-python-r-exploratory-data-analysis-visualization-du107jjms

譯者簡介:季洋,蘇州某IT公司技術總監,從業20年,現在主要負責Java項目的方案和管理工作。對大數據、數據挖掘和分析項目躍躍欲試卻苦於沒有機會和數據。目前正在摸索和學習中,也報了一些線上課程,希望對數據建模的應用場景有進一步的了解。不能成為巨人,只希望可以站在巨人的肩膀上了解數據科學這個有趣的世界。

版權聲明:本號內容部分來自網際網路,轉載請註明原文連結和作者,如有侵權或出處有誤請和我們聯繫。

相關焦點

  • 全流程記錄第一個Kaggle項目:探索性數據分析(EDA)和數據處理(附圖文代碼)
    目錄 第一篇:全流程記錄新手的第一個Kaggle項目:泰坦尼克預測從Top89%到Top10% (內附附數據集和代碼)連結:第二篇(本文):探索性數據分析(EDA)和數據處理第三篇:特徵工程和模型選擇第四篇:必備經驗整理和代碼總結0.
  • 數據科學中的Python與R
    圖3 數據科學團隊,引自《數據科學實戰》    綜合上述,關於數據科學的定義,此處引用《數據科學實戰》的描述:    「數據科學是將數據轉化為決策和行動(tradecraft)的藝術,是人和計算機一起工作將數據轉化為知識發現的工具
  • 數據科學探索(python 與 R 的比較)
    這一期主要應用python和R 這2種工具對某真實信貸數據進行分析,通過數據的讀取、清洗、探索、模型構建等,比較2種方法在機器學習數據科學上的實現
  • Python數據科學實踐 | 文本分析2
    大家好,基於Python的數據科學實踐課程又到來了,大家盡情學習吧。本期內容主要由智億同學與政委聯合推出。通過上周的推文(連結),我們已經掌握了文本分析的最基本的思路。這次推文主要學習如何利用Python實踐這些思路。
  • 數據科學大Battle,你站Python還是R
    在數據科學工作中,你可能也經常遇到這個選擇困難問題。本文作者Brian Ray基於數十年的Python和R在數據科學領域的使用檢驗,分享了自己的看法,希望能夠幫大家做出更好的選擇。希望這篇文章能幫助那些在數據科學中糾結於選擇Python還是R的小夥伴們。
  • R vs. Python,數據分析中誰與爭鋒?
    作者丨Sunil Kappal譯者丨安翔R和Python兩者誰更適合數據分析領域?在某些特定情況下誰會更有優勢?還是一個天生在各方面都比另一個更好?當我們想要選擇一種程式語言進行數據分析時,相信大多數人都會想到R和Python——但是從這兩個非常強大、靈活的數據分析語言中二選一是非常困難的。
  • 做數據分析,Python和R究竟哪個更強?
    幾十年來,研究人員和開發人員一直在爭論,對於進行數據科學和數據分析,Python和R語言哪個才是更好的選擇?近年來,數據科學在生物技術、金融和社交媒體等多個行業迅速發展。數據科學的重要性不僅得到了業內人士的認可,而且還得到了許多學術機構的認可,目前越來越多的學校都開始設立數據科學學位。
  • python數據科學-單變量數據分析
    我們把在正式開始機器學習之前對數據的了解過程成為探索性分析 , 簡稱 EDA。02|單變量數據分析:單邊量數據是指數據集中只有一個變量 ,也可以是多列中的某一列(可以理解成是某一個指標)。比如一個班的體測成績表是一個數據集(包含身高、體重、1000 米用時之類的各種指標),那麼該數據集裡面的某一個指標就可以看作是一個單變量數據。
  • 數據分析從業者必看,10 個加速 python 數據分析的簡單的小技巧
    ,在數據科學領域同樣如此。所以,下面是我最喜歡的一些技巧,我以本文的形式一起使用和編譯它們。其中,有些可能是相當有名的,有些可能是新的,但我相信下次您從事數據分析項目時,它們會非常有用。1.Profiling the pandas dataframeProfiling 是一個幫助我們理解數據的程序,而 Pandas Profiling 正是實現這一點的一個 python 包。這是對 pandas 數據幀進行探索性數據分析的一種簡單快速的方法。
  • 搞機器學習,Python 和 R 哪個更合適?
    人工智慧和數學分析是開源工具創新的兩大熱門領域。Python和R都營造了很好的開源生態環境,這有利各個水平的數據科學家更有效地完成科學工作。機器學習和數據分析之間的區別隨著時間的推移都是相對變化,但是,其主要的區別是機器學習偏向模型解釋,而數據分析側重解釋和事實推測。
  • python金融風控評分卡模型和數據分析
    (原創課程,版權所有,項目合作QQ:231469242,微信公眾號:pythonEducation) 課程介紹python金融風控評分卡模型和數據分析微專業課包含《python信用評分卡建模(附代碼)》,《python風控建模實戰lendingClub》,《金融現金貸用戶數據分析和畫像》三套課程系列
  • R與Python的巔峰對決——數據分析界的「華山論劍」
    從定位角度看,R致力於提供更好的,對用戶友好的數據分析、統計分析和繪圖模型;而Python則強調生產效率和代碼的可讀性。雙方的用戶群也有一定的差異。R主要用於學術和研究領域,如今正在快速拓展其企業市場的運用。Python的使用者,是那些想深入鑽研數據分析或者應用統計技術的程式設計師,以及向數據科學尋求幫護的開發者。
  • [原]深入對比數據科學工具箱:Python和R 非結構化數據的結構化
    概述在現實場景中,由於數據來源的異構,數據源的格式往往是難以統一的,這就導致大量具有價值的數據通常是以非結構化的形式聚合在一起的對於這些非結構化數據,最常見的數據結構就是JSON,而對應的資料庫就是MongoDB。利用MongoDB這樣的NoSQL資料庫,我們可以把異構的數據源整合到若干個collection中,通過key-value的形式對數據進行增刪改查。雖然MongoDB在數據聚合上有天然的優勢,但是在事務處理(OLTP)與數據分析(OLAP)上的表現卻不盡人意。
  • 一篇文章告訴你,該學R還是Python
    R和Python:數字的比較在網上可以經常看到比較R和Python人氣的數字,雖然這些數字往往就這兩種語言是如何在計算機科學的整體生態系統不斷發展,但是很難並列進行比較。主要的原因是,R僅在數據科學的環境中使用,而Python作為一種通用語言,被廣泛應用於許多領域,如網絡的發展。
  • 如何使用Pandas-Profiling進行探索性數據分析
    當開始一個新的機器學習項目時,獲得機器學習數據集之後的第一步就是要了解它。我們可以通過執行探索性數據分析(EDA)來實現這一點。這包括找出每個變量的數據類型、目標變量的分布、每個預測變量的不同值的數量、數據集中是否有重複值或缺失值等。進行EDA探索機器學習數據集的過程往往是非常耗時的。什麼是Pandas-Profiling?
  • 一篇文章告訴你,該學R還是Python!
    (註:DataCamp是一個在線互動教育平臺,提供了數據科學和R編程課程。)python和R是統計學中兩種最流行的的程式語言,R的功能性主要是統計學家在開發時考慮的(R具有強大的可視化功能),而Python因為易於理解的語法被大家所接受。在這篇文章中,我們將重點介紹R和Python以及它們在數據科學和統計上地位之間的差異。
  • 案例 :探索性文本數據分析的新手教程(Amazon案例研究)
    在一個機器學習項目的全流程中是沒有捷徑可走的,比如我們無法在收集齊所需的數據後直接跳到模型搭建的階段。我們需要有條理地規劃方法,而在此過程中探索性數據分析(EDA)階段是十分重要的。在我從事這一領域的前期,總是急切地要深入研究機器學習算法,但這常常得到不確定性的結果。通過個人經歷和導師的建議,我意識到在探索和理解數據上花時間是必要的。
  • R vs Python:硬碰硬的數據分析
    我們將在已有的數十篇從主觀角度對比Python和R的文章中加入自己的觀點,但是這篇文章旨在更客觀地看待這兩門語言。我們會平行使用Python和R分析一個數據集,展示兩種語言在實現相同結果時需要使用什麼樣的代碼。這讓我們了解每種語言的優缺點,而不是猜想。在Dataquest,我們教授兩種語言,並認為兩者在數據科學工具箱中都佔據各自的地位。
  • Python和R哪個更適合機器學習?兩者結合,雙倍快樂
    這篇文章不僅可以帶你了解Python和R之間的區別,還可以為你盤點兩種語言的優劣勢。OK,就讓文摘菌帶領大家開始吧!R和Python都是在數據科學領域中非常流行的語言。據統計,約69%的開發人員使用Python而使用R的只有24%,兩者都是免費開源的。但Python被定位為一種廣泛使用的程式語言,而R則多用於統計分析。
  • Python做數據分析-簡潔、易讀、強大
    在數據分析和交互、探索性計算以及數據可視化等方面,相對於R、MATLAB、SAS、Stata等工具,Python都有其優勢。近年來,由於Python庫的不斷發展(如pandas),使其在數據挖掘領域嶄露頭角。結合其在通用編程方面的強大實力,我們完全可以只使用Python這一種語言去構建以數據為中心的應用程式。