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