前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >09.交叉&结构&相关分析1.交叉分析2.结构分析3.相关分析

09.交叉&结构&相关分析1.交叉分析2.结构分析3.相关分析

作者头像
用户1250179
发布2018-08-02 16:33:58
2.1K0
发布2018-08-02 16:33:58
举报
文章被收录于专栏:数说戏聊

1.交叉分析

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

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

交叉统计函数

代码语言:javascript
复制
pivot_table(values, index, columns, aggfunc, fill_value)
  • values:数据透视表中的值
  • index:数据透视表中的行
  • columns:数据透视表中的列
  • aggfunc:统计函数
  • fill_value:NA值的统一替换
代码语言:javascript
复制
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:按行运算
代码语言:javascript
复制
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调用:返回一个数值型,大小为相关度
代码语言:javascript
复制
# -*- 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.07.07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.交叉分析
  • 2.结构分析
  • 3.相关分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档