09.交叉&结构&相关分析

1.交叉分析

用于分析两个或两个以上,分组变量之间的联系,以交叉表形式进行变量间关系的对比分析。

  • 定量 & 定量分组交叉
  • 定量 & 定性分组交叉
  • 定性 & 定性分组交叉

交叉统计函数

pivot_table(values, index, columns, aggfunc, fill_value)
  • values:数据透视表中的值
  • index:数据透视表中的行
  • columns:数据透视表中的列
  • aggfunc:统计函数
  • fill_value:NA值的统一替换
import numpy
import pandas
data = pandas.read_csv(
    '/users/bakufu/desktop/5.4/data.csv'        
)
Out[2]: 
       用户ID   注册日期         身份证号码     性别    出生日期  年龄
0      100000  2011/1/1  15010219621116401I  男  1962/11/16  52
1      100001  2011/1/1  45092319910527539E  男   1991/5/27  23
2      100002  2011/1/1  35010319841017421J  男  1984/10/17  30
3      100006  2011/1/1  37110219860824751B  男   1986/8/24  28
4      100010  2011/1/1  53042219860714031J  男   1986/7/14  28
5      100011  2011/1/1  32012519871028001B  男  1987/10/28  27
6      100012  2011/1/1  23030219930828581I  男   1993/8/28  21
7      100013  2011/1/1  42112619900301477J  男    1990/3/1  24
8      100015  2011/1/1  53012119811002001I  男   1981/10/2  33
9      100016  2011/1/1  21050219890110061C  男   1989/1/10  26
10     100017  2011/1/2  22038219841212024A  女  1984/12/12  30
      ...       ...                 ... ..         ...  ..
59100  199501  2011/9/2  42102319931117009A  男  1993/11/17  21
[59101 rows x 6 columns]

bins = [
    min(data.年龄)-1, 20, 30, 40, max(data.年龄)+1      
]
Out[4]:
[2, 20, 30, 40, 88]

labels = [
    '20岁及以下', '21岁到30岁', '31岁到40岁', '41岁及以上'        
]
Out[6]:
['20岁及以下', '21岁到30岁', '31岁到40岁', '41岁及以上']

data['年龄分层'] = pandas.cut(
    data.年龄,
    bins,
    labels=labels
)
Out[9]: 
       用户ID   注册日期      身份证号码        性别    出生日期  年龄   年龄分层
0      100000  2011/1/1  15010219621116401I  男  1962/11/16  52   41岁及以上
1      100001  2011/1/1  45092319910527539E  男   1991/5/27  23  21岁到30岁
2      100002  2011/1/1  35010319841017421J  男  1984/10/17  30  21岁到30岁
3      100006  2011/1/1  37110219860824751B  男   1986/8/24  28  21岁到30岁
4      100010  2011/1/1  53042219860714031J  男   1986/7/14  28  21岁到30岁
5      100011  2011/1/1  32012519871028001B  男  1987/10/28  27  21岁到30岁
6      100012  2011/1/1  23030219930828581I  男   1993/8/28  21  21岁到30岁
7      100013  2011/1/1  42112619900301477J  男    1990/3/1  24  21岁到30岁
8      100015  2011/1/1  53012119811002001I  男   1981/10/2  33  31岁到40岁
9      100016  2011/1/1  21050219890110061C  男   1989/1/10  26  21岁到30岁
10     100017  2011/1/2  22038219841212024A  女  1984/12/12  30  21岁到30岁
      ...       ...                 ... ..         ...  ..      ...
59100  199501  2011/9/2  42102319931117009A  男  1993/11/17  21  21岁到30岁
[59101 rows x 7 columns]

ptResult = data.pivot_table(
    values=['年龄'],
    index=['年龄分层'],
    columns=['性别'],
    aggfunc=[numpy.size]        
)
Out[11]: 
年龄分层       女      男        
20岁及以下    111   1950
21岁到30岁   2903  43955
31岁到40岁    735   7994
41岁及以上    567    886

2.结构分析

在分组及交叉分析的基础上,计算各组成部分所占的比重,进而分析总体的内部特征的分析方法。
主要指定性分组,通过饼图或圆环图进行数据展现。

pandas中进行占比计算,使用groupby计算出分组结果,或pivot_table计算出交叉表的结果之后,如果
还需要继续运算,可使用数据框自带函数计算。

数据框的外运算函数,用于两个数据框之间的运算

运算 注释
add
sub
multiply
div

数据框的内运算函数,用于数据框自身的运算

运算 注释
sum 求和
mean 均值
var 方差
sd 标准差

设置axis参数,指定是按列运算还是按行运算
axis参数说明

  • 0:按列运算(默认)
  • 1:按行运算
import numpy
import pandas
data = pandas.read_csv(
    '/users/bakufu/desktop/5.5/data.csv'      
)
Out[14]: 
       用户ID   注册日期       身份证号码       性别   出生日期   年龄
0      100000  2011/1/1  15010219621116401I  男  1962/11/16  52
1      100001  2011/1/1  45092319910527539E  男   1991/5/27  23
2      100002  2011/1/1  35010319841017421J  男  1984/10/17  30
3      100006  2011/1/1  37110219860824751B  男   1986/8/24  28
4      100010  2011/1/1  53042219860714031J  男   1986/7/14  28
5      100011  2011/1/1  32012519871028001B  男  1987/10/28  27
6      100012  2011/1/1  23030219930828581I  男   1993/8/28  21
7      100013  2011/1/1  42112619900301477J  男    1990/3/1  24
8      100015  2011/1/1  53012119811002001I  男   1981/10/2  33
9      100016  2011/1/1  21050219890110061C  男   1989/1/10  26
10     100017  2011/1/2  22038219841212024A  女  1984/12/12  30
      ...       ...                 ... ..         ...  ..
59100  199501  2011/9/2  42102319931117009A  男  1993/11/17  21
[59101 rows x 6 columns]

bins = [
    min(data.年龄)-1, 20, 30, 40, max(data.年龄)+1        
]
Out[16]:
[2, 20, 30, 40, 88]

labels = [
    '20岁及以下', '21岁到30岁', '31岁到40岁', '41岁及以上'
]
Out[18]:
['20岁及以下', '21岁到30岁', '31岁到40岁', '41岁及以上']

data['年龄分层'] = pandas.cut(
    data.年龄,
    bins,
    labels=labels        
)
Out[21]: 
       用户ID   注册日期       身份证号码       性别   出生日期   年龄  年龄分层
0      100000  2011/1/1  15010219621116401I  男  1962/11/16  52   41岁及以上
1      100001  2011/1/1  45092319910527539E  男   1991/5/27  23  21岁到30岁
2      100002  2011/1/1  35010319841017421J  男  1984/10/17  30  21岁到30岁
3      100006  2011/1/1  37110219860824751B  男   1986/8/24  28  21岁到30岁
4      100010  2011/1/1  53042219860714031J  男   1986/7/14  28  21岁到30岁
5      100011  2011/1/1  32012519871028001B  男  1987/10/28  27  21岁到30岁
6      100012  2011/1/1  23030219930828581I  男   1993/8/28  21  21岁到30岁
7      100013  2011/1/1  42112619900301477J  男    1990/3/1  24  21岁到30岁
8      100015  2011/1/1  53012119811002001I  男   1981/10/2  33  31岁到40岁
9      100016  2011/1/1  21050219890110061C  男   1989/1/10  26  21岁到30岁
10     100017  2011/1/2  22038219841212024A  女  1984/12/12  30  21岁到30岁
      ...       ...                 ... ..         ...  ..      ...
59100  199501  2011/9/2  42102319931117009A  男  1993/11/17  21  21岁到30岁
[59101 rows x 7 columns]

ptResult = data.pivot_table(
    values=['年龄'],
    index=['年龄分层'],
    columns=['性别'],
    aggfunc=[numpy.size]
)
Out[23]:     
年龄分层      女      男         
20岁及以下    111   1950
21岁到30岁   2903  43955
31岁到40岁    735   7994
41岁及以上    567    886

#按列进行求和
ptResult.sum()
Out[24]: 
女      4316
男     54785
dtype: int64

#按列进行求和
ptResult.sum(axis=0)
Out[25]: 
女      4316
男     54785
dtype: int64

#按行进行求和
ptResult.sum(axis=1)
Out[26]: 
年龄分层
20岁及以下      2061
21岁到30岁     46858
31岁到40岁      8729
41岁及以上      1453
dtype: int64

#按行进行占比计算,不同年龄段的性别占比
ptResult.div(ptResult.sum(axis=1), axis=0)
Out[27]: 
年龄分层        女         男               
20岁及以下   0.053857  0.946143
21岁到30岁   0.061953  0.938047
31岁到40岁   0.084202  0.915798
41岁及以上   0.390227  0.609773

#按列进行占比计算,不同性别的年龄段占比
ptResult.div(ptResult.sum(axis=0), axis=1)
Out[28]: 
年龄分层         女         男        
20岁及以下   0.025718  0.035594
21岁到30岁   0.672614  0.802318
31岁到40岁   0.170297  0.145916
41岁及以上   0.131372  0.016172

3.相关分析

研究两个或两个以上随机变量之间相互依存关系的方向和密切程度的方法

  • 线性相关:当一个连续变量发生变动时,另一个连续变量相应的呈线性关系变动
  • 采用皮尔逊相关系数r的绝对值来度量连续变量之间线性相关强度
线性相关系数r(取绝对值)的范围 相关程度
0 ≤ r < 0.3 低度
0.3 ≤ r < 0.8 中度
0.8 ≤ r ≤ 1 高度

相关分析函数:

  • DataFrame.corr()
  • Series.corr(other)

函数说明:

  • 如果由数据框调用corr方法,将会计算每个列两两之间的相似度
  • 如果由序列调用corr方法,只计算该序列与传入的序列之间的相似度

返回值:

  • DataFrame调用:返回DataFrame
  • Series调用:返回一个数值型,大小为相关度
# -*- coding -*-
import pandas
data = pandas.read_csv(
    '/users/bakufu/desktop/5.6/data.csv'
)
Out[31]: 
    小区ID     人口  平均收入  文盲率  超市购物率  网上购物率  本科毕业率
0      1   3615  3624  2.1   15.1   84.9   41.3
1      2    365  6315  1.5   11.3   88.7   66.7
2      3   2212  4530  1.8    7.8   92.2   58.1
3      4   2110  3378  1.9   10.1   89.9   39.9
4      5  21198  5114  1.1   10.3   89.7   62.6
5      6   2541  4884  0.7    6.8   93.2   63.9
6      7   3100  5348  1.1    3.1   96.9   56.0
7      8    579  4809  0.9    6.2   93.8   54.6
8      9   8277  4815  1.3   10.7   89.3   52.6
9     10   4931  4091  2.0   13.9   86.1   40.6
10    11    868  4963  1.9    6.2   93.8   61.9

#两个列之间的相关度计算
data['人口'].corr(data['文盲率'])
Out[32]:
0.10762237339473261

#多列之间的相关度计算
#选择多列的方法
data[[
    '超市购物率', '网上购物率', '文盲率', '人口'      
]]
data[[
    '超市购物率', '网上购物率', '文盲率', '人口'      
]].corr()
Out[33]: 
          超市购物率   网上购物率     文盲率      人口
超市购物率  1.000000  -1.000000   0.702975   0.343643
网上购物率 -1.000000   1.000000  -0.702975  -0.343643
文盲率     0.702975  -0.702975   1.000000   0.107622
人口       0.343643  -0.343643   0.107622   1.000000
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容