用pandas_profiling快速探索數(shù)據(jù),算不算EDA(Exploratory Data Analysis)首選工具

拿到數(shù)據(jù)進(jìn)行分析之前,應(yīng)該對(duì)數(shù)據(jù)進(jìn)行探索,所謂的探索性數(shù)據(jù)分析(EDA: Exploratory Data Analysis),了解數(shù)據(jù)集的變量類型、大致分布、異常值、缺失值……等等等等。

Report generated with pandas-profiling

在探索Pandas表格時(shí)經(jīng)常會(huì)被用到的命令包括:

  • pandas.info()查看變量數(shù)據(jù)類型;
  • pandas.describe()查看數(shù)值型(離散型、日期型)變量的匯總統(tǒng)計(jì)信息。如數(shù)值型變量的非NA值計(jì)數(shù)count、最大值max、最小值min、均值mean、標(biāo)準(zhǔn)差std以及三個(gè)分位數(shù)( [0.25, 0.5, 0.75] );
  • pandas.head()、pandas.tail()查看數(shù)據(jù)集最前(后)5條數(shù)據(jù);
  • pandas.value_counts()查看序列中各個(gè)值的出現(xiàn)頻次;
    此外,可能用到的命令還包括計(jì)算樣本值的偏度skew()和峰度kurt(),此外,單變量的直方圖,雙變量 間的相關(guān)系數(shù)計(jì)算,缺失值的統(tǒng)計(jì)與濾除(替換)等也都是免不了的。
    雖然探索性數(shù)據(jù)分析的方法明確步驟清晰,但要用到這么多命令,難免掛一漏萬。何況各個(gè)命令又有一堆參數(shù),要想熟練使用必須經(jīng)過一段時(shí)間才能熟悉。比如pandas.describe()默認(rèn)只對(duì)數(shù)據(jù)集中的數(shù)值型變量虛擬統(tǒng)計(jì),傳入include參數(shù)才能看到離散型變量的統(tǒng)計(jì)信息。
    pandas.describe()示例

    優(yōu)達(dá)學(xué)城的專欄上看到了pandas_profiling的推薦,似乎找到了快速搞定EDA的利器。正如其名稱所示,df.ProfileReport()給出一個(gè)DataFrame表格的全方位快照,便于用戶了解數(shù)據(jù)集的各類信息。

pandas_profiling的安裝

pandas-profiling官方文檔中的安裝方法如下:

pip install pandas-profiling
# 直接從github上安裝
pip install <https://github.com/pandas-profiling/pandas-profiling/archive/master.zip>
# conda安裝
conda install -c conda-forge pandas-profiling

不過在本人的機(jī)器上出了點(diǎn)小插曲。安裝成功后提示錯(cuò)誤,無法導(dǎo)入pandas_profiling包。

cannot import name 'to_html'.jpg

重新安裝后導(dǎo)入倒是成功了,但無法運(yùn)行profile_report()命令。
cannot import name 'GridspecLayout'

自己懷疑是版本沖突的原因,在網(wǎng)上搜索了沒找到直接的答案,不過看到ImportError: cannot import name 'AppLayout' from 'ipywidgets'一個(gè)類似問題,提到的解決方法是將ipywidgets制定版本為7.5。照貓畫虎按此居然將GridspecLayout的importerror也給解決了(竊笑,機(jī)智)。
記下一筆看有沒有會(huì)碰到同樣問題的人。
stackoverflow上關(guān)于ipywidgets錯(cuò)誤的回答

對(duì) pandas 數(shù)據(jù)表進(jìn)行預(yù)覽分析(Profiling)

安裝成功后,使用很簡單,直接df.profile_report()就行了。以Kaggle上的 ASHRAE 建筑能耗預(yù)測中的數(shù)據(jù)集為例,本文題圖即為building_metadata.csv中的數(shù)據(jù)快照。

weather_train = pd.read_csv(f'weather_train.csv',  encoding = "utf-8", 
                            parse_dates = ['timestamp'],  index_col = 'timestamp')
weather_train.profile_report()

有時(shí)候會(huì)遇到Error rendering Jupyter widget: missing widget manager的報(bào)錯(cuò)。

profile = weather_train.profile_report(title = "Pandas Profiling Reprot")
profile.to_notebook_iframe()
#保存快照為獨(dú)立的html文件
profile.to_file(output_file="your_report.html")

pandas_profiling探索報(bào)告示例:

pandas-profiling.gif

第一印象就是生成的報(bào)告內(nèi)容非常全面。包括Overview、Variables、Correlations、Missing values和Sample五個(gè)部分。
Overview概述部分主要就是變量類型的分類統(tǒng)計(jì),如數(shù)值型變量、日期型變量、離散型變量等分別有幾個(gè)。由于后面還有專門的Variables報(bào)告部分,所以沒有像df.info()命令那樣羅列每個(gè)列的數(shù)據(jù)類型。
值得一提的是概述部分中的Warnings警告部分。給出了各類需要引起注意的提示信息,如下圖官方文檔中提供的NZA (open data from the Dutch Healthcare Authority)報(bào)告所示。
NZA(open data from the Dutch Healthcare Authority)數(shù)據(jù)集快照

包括變量間相關(guān)系數(shù)過大、NA值(或zero值)的比例過高、偏度值過大等等等等,都會(huì)提示warnings。
Variables變量部分的數(shù)據(jù)類型及統(tǒng)計(jì)信息,如unique值、NA值、zero值的計(jì)數(shù)及占比等;點(diǎn)開Toggle details才是精華所在,單變量分析的各類信息基本上都已經(jīng)給出了。
Variables給出各列變量的統(tǒng)計(jì)信息、直方圖等

Correlations部分計(jì)算變量間的(Spearman, Pearson and Kendall)相關(guān)系數(shù):
Correlations結(jié)果

Missing values給出了各列變量中缺失值的相關(guān)信息。Counts是非NA值的計(jì)數(shù);Matrix顯示的時(shí)各變量中NA值出現(xiàn)的位置;Heatmap給出了NA值出現(xiàn)機(jī)率的相關(guān)性,在missingno文檔中將其稱為無效相關(guān)性(Nullity Correlation)。當(dāng)某列出現(xiàn)NA值時(shí)另外一列必定出現(xiàn)NA值,則Nullity Correlation值為1;某列出現(xiàn)NA值時(shí)另外一列必定不出現(xiàn)NA值,則Nullity Correlation值為-1;NA值出現(xiàn)不相干是值為0。Dendrogram部分則是按照NA值繪制的各列的樹枝狀圖。總的印象,Missing values部分的結(jié)果與另一個(gè)missingno包的結(jié)果非常相像,不知道是不是pandas_profiling作者直接調(diào)用了missingno執(zhí)行的結(jié)果?
Missing values結(jié)果

sample部分最簡單,相當(dāng)于df.head(10)加df.tail(10)的結(jié)果。
sample部分顯示最前(后)10行數(shù)據(jù)

其它的命令參數(shù)還包括如結(jié)果保存為JSON文件、傳入字典指定直方圖的bins等分?jǐn)?shù)量;對(duì)于大數(shù)據(jù)集指定minimal=True使不進(jìn)行耗時(shí)的相關(guān)系數(shù)計(jì)算等。更詳細(xì)的信息大家可參閱pandas-profiling官方文檔

# As a string
json_data = profile.to_json()
# As a file
profile.to_file(output_file="your_report.json")

profile = ProfileReport(df, title='Pandas Profiling Report', style={'full_width':True})
profile

profile = df.profile_report(title='Pandas Profiling Report', plot={'histogram': {'bins': 8}})
profile.to_file(output_file="output.html")

profile = ProfileReport(large_dataset, minimal=True)

結(jié)論

  • pandas_profiling可以給出DataFrame表格的快照,涵蓋了感興趣的絕大多數(shù)統(tǒng)計(jì)信息,且效率更高;
  • 默認(rèn)參數(shù)下計(jì)算時(shí)間可能會(huì)較長,因此數(shù)據(jù)集較大時(shí)可指定ProfileReport(minimal=True)不進(jìn)行相關(guān)系數(shù)等計(jì)算;
參考資料
  1. pandas.DataFrame.describe
  2. 優(yōu)達(dá)學(xué)城:Python數(shù)據(jù)分析,有哪些不為人知的小技巧?
  3. ImportError: cannot import name 'AppLayout' from 'ipywidgets'
  4. 相關(guān)性分析指標(biāo)-Pearson,Spearman,Kendall,Multual information
  5. https://github.com/ResidentMario/missingno
  6. pandas-profiling官方文檔
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,416評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,597評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評(píng)論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,029評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,403評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,746評(píng)論 2 370