本文需要用到的Python库:

Pandas

Seaborn

本文纲要:

一、什么是交叉表?

二、例子中用到的数据

三、用Pandas构建交叉表

四、交叉表可视化

一、什么是交叉表?

交叉表是一种常用的分类汇总表格,用于频数分布统计,主要价值在于描述了变量间关系的深刻含义。虽然两个(或以上)变量可以是分类的或数量的,但是以都是分类的情形最为常见。

假设我们有两个变量,性别(男性或女性)和手性(右或左手)。 进一步假设,从非常大的人群中随机抽取100个人,作为对手性的性别差异研究的一部分。 可以创建一个交叉表来显示男性和右撇子,男性和左撇子,女性和右撇子以及女性和左撇子的个人数量。 这样的交叉表如下所示。

男性,女性以及右撇子和左撇子个体的数量称为边际总数。总计(即交叉表中所代表的个人总数)是右下角的数字。

二、例子中用到的数据

例子中用到的数据来自http://Kaggle.com,是一个关于facebook的真实和虚假账号的数据集,包含了889个账户真实与否信息、好友数、教育情况、性别、等信息。数据集里有一个缺失值,进一步处理之前,先把缺失值去掉。数据集链接​www.kaggle.com

import pandas as pd

df = pd.read_csv('facebookac.csv')

dr = df.dropna()

df.columns

#Index(['Status', 'No Friend', 'education', 'about me', 'family', 'gender',

'relationship', 'phototag*', 'photopost*', 'video', 'checkin', 'sport',

'player', 'music', 'film', 'series', 'book', 'game', 'restaurant',

'like', 'group', 'note', 'post shared/post posted rate'],

dtype='object')

我们发现有的账户没有显示情感关系状态,因此那一行显示的是“ ”(空格)。为了不引起混淆,我们把这些空格改成“not available”。

df = df.replace(' ', 'not available')

比如我们可以账户真实与否和情感关系状态的交叉频数。账户真实与否是表格中的“Status”列,情感关系状态是表格中的“relationship”列。

三、用Pandas构建交叉表

1、基本的pandas方法

Pandas的crosstab()方法(官方文档在此)能够快速构建交叉表,并可以通过参数加以个性化的设置。其中,第一个参数将构成交叉表的行,第二个参数将构成交叉表的列。通过这个快捷的方法,我们能看到真实和虚假账户中不同情感关系状态的频数,非常清晰明了。

pd.crosstab(df['relationship'], df['Status'])

pandas的DataFrame中的另外两个用于数据汇总转换的方法——groupby()、pivot_table()——也分别都可以实现这个效果,不过会麻烦一些。DataFrame.grouby()官方文档在此,DataFrame.pivot_table()官方文档在此。

df.groupby(['relationship','Status'])['relationship'].count().unstack()

df.pivot_table(values='education', index='relationship', columns='Status', aggfunc=len)

可以看到,用corsstab()一句就解决了,实乃交叉表构建神器。

2.crosstab()重要参数

在交叉表中,我们常常需要统计边际总数(各行和各列的总和)。当然我们可以用sum()先算出各行、各列的和再用cancat()合并到交叉表中,不过这样实在太麻烦了。Crosstab()的参数margins可以帮我们“一键解决”,还可以通过margins_name设置总计行(列)的名称(默认名称是“All”)。

pd.crosstab(df['relationship'], df['Status'], margins=True, margins_name='Total')

在实际应用中,我们常常需要统计交叉表中各项的相对频率(即所占百分比)。一开始,我总是繁琐地先用sum()算出总和,然后用div()来求出相对相对频率。后来发现可以在crosstab()中,直接通过参数normalize设置,方便多了。

pd.crosstab(df['relationship'], df['Status'], normalize=True)

如果需要计算的是各项在所在行(列)的相对频数,normalize一样可以解决。normalize可以接受三种不同类型的参数,分别是{True, False}、{‘all’, ‘index’, ‘columns’}和 {0,1}。其中“index”或0表示按行统计(每行总和都为1),“columns”或“1”表示按列统计(每列总和都为1)。

pd.crosstab(df['relationship'], df['Status'], normalize=0)

pd.crosstab(df['relationship'], df['Status'], normalize=1)

3. 分层交叉表

crosstab()的参数index和columns可以接受列表传入,构建分层交叉表。比如,我们在交叉表中再加入性别(表格中的“gender”列)信息,并按列计算相对频率,看看在真实和虚假账户中,不同的性别和情感关系状态和是怎么分布的。这个交叉表中,每一列的总和为1。

dfv = pd.crosstab([df['gender'], df['relationship']], df['Status'],normalize=1)

dfv

四、交叉表可视化

看到上面的这个交叉表,大家心里可能会默默算一下哪些类型占比高,哪些类型占比低。如果数据多了,就会很难有直观感受。好在,我们有热图。Seaborn库中的heatmap()能快速生成热图,官方文档在此。

import seaborn as sns

sns.heatmap(dfv, cmap='YlOrRd', annot=True)

cmap='YlOrRd'是把颜色设置为:数值从低到高,颜色依次是黄色、橙色、红色。annot=True是指在热图中保留数值。可以看到,返回的热图中,每一列的把两层分组的索引值标注了出来,非常清晰。在虚假账户中,最多的是“单身女性”,其次是“单身男性”,其他的组合极少甚至没有。而真实账户中,最多的是“单身男性”,并且在各种组合中都有分布。

交叉表数据量大的时候,即使热图也会让人看不过来。这时可以通过参数mask来筛选热图中显示的数据,不符合条件的就不会显示了。这样,我们就可以更集中地关注特定的数据。比如,我们只关注占比超过10%的类型,dfv<0.1可以把小于0.1的值过滤掉。

sns.heatmap(dfv, cmap='YlOrRd', annot=True, mask=dfv<0.1)

参考文献:

商务与经济统计(原书第13版). 机械工业出版社. 2018:33-34

crosstab交叉表_用Python统计推断——交叉表篇(上:crosstab与热图)相关推荐

  1. python 数据透视表_使用Python数据透视表探索幸福数据

    python 数据透视表 One of the biggest challenges when facing a new data set is knowing where to start and ...

  2. python如何打印乘法表_用python打印乘法表

    我决定用更复杂的策略来实践我的嵌套for循环逻辑,尽管有几种更简单的方法.我是一个初学者,所以我希望我的文档不会混淆我的思维过程.在 ^{1}$ 以下是我当前的输出: ^{pr2}$ 我尝试了一些快速 ...

  3. python mysql 分页_利用python对mysql表做全局模糊搜索并分页实例

    在写django项目的时候,有的数据没有使用模型管理(数据表是动态添加的),所以要直接使用mysql.前端请求数据的时候可能会指定这几个参数:要请求的页号,页大小,以及检索条件. "&quo ...

  4. python 哈希表_数据结构-7 哈希表

    python内部查找表非常快,就是用的哈希表(hash-table)实现的. 后续实现字典集合. 怎么解决冲突? 其实一种直观的想法是如果冲突了我能不能让数组中 对应的槽变成一个链式结构呢?这就是其中 ...

  5. python操作注册表能干啥_转 python操作注册表模块_winreg

    分类: WINDOWS 基本概念: KEY 键 Value 值 函数和作用: CloseKey() - 关闭一个Key ConnectRegistry() - 链接到其他机器的注册表 CreateKe ...

  6. python实现excel数据透视表_用python建立excel的数据透视表

    import pandas as pd import numpy as np #1.建立一维数据 a = pd.Series(['a','b','c','d','e']) print(a) #2.建立 ...

  7. python实现字母的加密和解密 字典_利用Python产生加密表和解密表的实现方法

    序言: 这是我第一次写博客,有不足之处,希望大家指出,谢谢! 这次的题目一共有三个难度,分别是简单,中等偏下,中等.对于一些刚刚入门的小伙伴来说,比较友好.废话不多说,直接进入正题. 正文: 简单难度 ...

  8. dataframe修改数据_利用Python进行数据分析(语法篇)

    一.数据 结构化数据: 1.多维数组--矩阵 2.表格型数据(关系型数据库中的数据) 3.通过关键列相连接的表 4.间隔平均或者不平均的时间序列 二.关于iPython 三.Numpy学习 numpy ...

  9. pandas 转化np数据_利用Python进行数据分析(语法篇)

    一.数据 结构化数据: 1.多维数组--矩阵 2.表格型数据(关系型数据库中的数据) 3.通过关键列相连接的表 4.间隔平均或者不平均的时间序列 二.关于iPython 三.Numpy学习 numpy ...

最新文章

  1. java 写文件 错误码_JAVA-读取文件错误1(错误)
  2. 计算机数据库基础知识笔记,计算机基础及技巧(我的电脑笔记,适合新手!包含使用电脑最基本的知识及DOS、网络及数据库等。)...
  3. 安装pywin32时:ImportError: DLL load failed: %1 不是有效的 Win32 应用程序和 DLL load failed...
  4. BZOJ3527: [Zjoi2014]力 [FFT]
  5. 基于图像灰度的模板匹配
  6. Git 版本管理工具命令速查
  7. pytorch中切换虚拟环境
  8. 【飞秋】SQL Server性能调教系列(4)--Profiler(上)
  9. android 编译系统make文件
  10. [算法]用Python实现十大排序算法
  11. killer网卡ubantu下不能wifi联网的问题(据说就是intel网卡)(心酸血泪史)(不升级内核)
  12. MOEA/D论文+代码
  13. AOP应用(Transactions 事务)
  14. CentOS 8: No URLs in mirrorlist error
  15. 机器学习定义及基本术语(根据周志华的《机器学习》概括)
  16. 这样的团建,真羡慕skr人~
  17. 登山鞋选对了才穿得舒服
  18. PAT-ADVANCED1011——World Cup Betting
  19. 云服务器连接手机本地文件夹,云服务器连接手机本地文件
  20. 学编程太枯燥?分享十几个边玩游戏边学编程的网站!第五个连孩子都在用

热门文章

  1. 解决mysql报Lock wait timeout exceeded; try restarting transaction的问题
  2. 友宝:掘金生活物联网
  3. Ceph 问题记录:MDSs report oversized cache / clients failing to respond to cache pressure
  4. alc236黑苹果驱动_黑苹果亮度调节及调节快捷键驱动
  5. Ansible Inventory内置参数
  6. k8s 详解 pod 生命周期 容器探测(live and ready) 钩子函数 pod的重启策略
  7. 易宝典——玩转O365中的EXO服务 之三十七 保留所有邮箱
  8. 你是真的“C”——详解C语言函数模块知识(上篇)
  9. 试用期没到辞职有工资吗?
  10. 浙江省软考报名时间成绩查询浙江省教育考试院浙江省人事考试网报名入口