用pandas_profiling快速探索数据,算不算EDA(Exploratory Data Analysis)首选工具

拿到数据进行分析之前,应该对数据进行探索,所谓的探索性数据分析(EDA: Exploratory Data Analysis),了解数据集的变量类型、大致分布、异常值、缺失值……等等等等。

Report generated with pandas-profiling

在探索Pandas表格时经常会被用到的命令包括:

  • pandas.info()查看变量数据类型;
  • pandas.describe()查看数值型(离散型、日期型)变量的汇总统计信息。如数值型变量的非NA值计数count、最大值max、最小值min、均值mean、标准差std以及三个分位数( [0.25, 0.5, 0.75] );
  • pandas.head()、pandas.tail()查看数据集最前(后)5条数据;
  • pandas.value_counts()查看序列中各个值的出现频次;
    此外,可能用到的命令还包括计算样本值的偏度skew()和峰度kurt(),此外,单变量的直方图,双变量 间的相关系数计算,缺失值的统计与滤除(替换)等也都是免不了的。
    虽然探索性数据分析的方法明确步骤清晰,但要用到这么多命令,难免挂一漏万。何况各个命令又有一堆参数,要想熟练使用必须经过一段时间才能熟悉。比如pandas.describe()默认只对数据集中的数值型变量虚拟统计,传入include参数才能看到离散型变量的统计信息。
    pandas.describe()示例

    优达学城的专栏上看到了pandas_profiling的推荐,似乎找到了快速搞定EDA的利器。正如其名称所示,df.ProfileReport()给出一个DataFrame表格的全方位快照,便于用户了解数据集的各类信息。

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

不过在本人的机器上出了点小插曲。安装成功后提示错误,无法导入pandas_profiling包。

cannot import name 'to_html'.jpg

重新安装后导入倒是成功了,但无法运行profile_report()命令。
cannot import name 'GridspecLayout'

自己怀疑是版本冲突的原因,在网上搜索了没找到直接的答案,不过看到ImportError: cannot import name 'AppLayout' from 'ipywidgets'一个类似问题,提到的解决方法是将ipywidgets制定版本为7.5。照猫画虎按此居然将GridspecLayout的importerror也给解决了(窃笑,机智)。
记下一笔看有没有会碰到同样问题的人。
stackoverflow上关于ipywidgets错误的回答

对 pandas 数据表进行预览分析(Profiling)

安装成功后,使用很简单,直接df.profile_report()就行了。以Kaggle上的 ASHRAE 建筑能耗预测中的数据集为例,本文题图即为building_metadata.csv中的数据快照。

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

有时候会遇到Error rendering Jupyter widget: missing widget manager的报错。

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

pandas_profiling探索报告示例:

pandas-profiling.gif

第一印象就是生成的报告内容非常全面。包括Overview、Variables、Correlations、Missing values和Sample五个部分。
Overview概述部分主要就是变量类型的分类统计,如数值型变量、日期型变量、离散型变量等分别有几个。由于后面还有专门的Variables报告部分,所以没有像df.info()命令那样罗列每个列的数据类型。
值得一提的是概述部分中的Warnings警告部分。给出了各类需要引起注意的提示信息,如下图官方文档中提供的NZA (open data from the Dutch Healthcare Authority)报告所示。
NZA(open data from the Dutch Healthcare Authority)数据集快照

包括变量间相关系数过大、NA值(或zero值)的比例过高、偏度值过大等等等等,都会提示warnings。
Variables变量部分的数据类型及统计信息,如unique值、NA值、zero值的计数及占比等;点开Toggle details才是精华所在,单变量分析的各类信息基本上都已经给出了。
Variables给出各列变量的统计信息、直方图等

Correlations部分计算变量间的(Spearman, Pearson and Kendall)相关系数:
Correlations结果

Missing values给出了各列变量中缺失值的相关信息。Counts是非NA值的计数;Matrix显示的时各变量中NA值出现的位置;Heatmap给出了NA值出现机率的相关性,在missingno文档中将其称为无效相关性(Nullity Correlation)。当某列出现NA值时另外一列必定出现NA值,则Nullity Correlation值为1;某列出现NA值时另外一列必定不出现NA值,则Nullity Correlation值为-1;NA值出现不相干是值为0。Dendrogram部分则是按照NA值绘制的各列的树枝状图。总的印象,Missing values部分的结果与另一个missingno包的结果非常相像,不知道是不是pandas_profiling作者直接调用了missingno执行的结果?
Missing values结果

sample部分最简单,相当于df.head(10)加df.tail(10)的结果。
sample部分显示最前(后)10行数据

其它的命令参数还包括如结果保存为JSON文件、传入字典指定直方图的bins等分数量;对于大数据集指定minimal=True使不进行耗时的相关系数计算等。更详细的信息大家可参阅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)

结论

  • pandas_profiling可以给出DataFrame表格的快照,涵盖了感兴趣的绝大多数统计信息,且效率更高;
  • 默认参数下计算时间可能会较长,因此数据集较大时可指定ProfileReport(minimal=True)不进行相关系数等计算;
参考资料
  1. pandas.DataFrame.describe
  2. 优达学城:Python数据分析,有哪些不为人知的小技巧?
  3. ImportError: cannot import name 'AppLayout' from 'ipywidgets'
  4. 相关性分析指标-Pearson,Spearman,Kendall,Multual information
  5. https://github.com/ResidentMario/missingno
  6. pandas-profiling官方文档
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342