美文网首页
09.交叉&结构&相关分析

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

作者: 李慕玄 | 来源:发表于2018-07-07 19:46 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:09.交叉&结构&相关分析

          本文链接:https://www.haomeiwen.com/subject/vevguftx.html