美文网首页
大师兄的数据分析学习笔记(八):探索性数据分析(七)

大师兄的数据分析学习笔记(八):探索性数据分析(七)

作者: superkmi | 来源:发表于2022-05-13 17:38 被阅读0次

    大师兄的数据分析学习笔记(七):探索性数据分析(六)
    大师兄的数据分析学习笔记(九):特征工程

    五、复合分析的实现

    3. 相关分析
    • 相关分析是衡量两组数据分布趋势或变化趋势的分析方法。
    • 相关分析使用相关系数直接衡量相关性的大小。
    • 如果用相关系数直接衡量连续值的相关性:
    >>>import os
    >>>import pandas as pd
    >>>import matplotlib.pyplot as plt
    >>>import seaborn as sns
    
    >>>df = pd.read_csv(os.path.join(".","data","WA_Fn-UseC_-HR-Employee-Attrition.csv"))
    >>>corr = df.corr()
    >>>sns.heatmap(corr,vmin=-1,vmax=1,cmap=sns.color_palette("RdBu",n_colors=128))
    >>>plt.show()
    
    • 上图中颜色越偏蓝的部分正相关性越高,越偏红的部分负相关性越高。
    • 如果是二类离散属性,比如:true/false,可以用皮尔逊相关系数来直接衡量相关性的大小。
    • 如果是多类离散属性,且数据是定序数据,比如:low/median/high,也可以使用皮尔逊相关系数。
    • 更为常见的离散属性相关性系数,使用熵(entropy)来计算:
    • 是用来计算不确定性的值,:H(X) = - \sum{p_i\log{(p_i)}}
    • 越接近0表示不确定性越小,如果样本的类别越多且分布越均匀,的值越大。
    • 条件熵H(Y|X) = \sum{p(x_i)}H(Y|X=x_i),表示在X条件下,Y的熵为X分布下对Y分别计算熵,并求和。
    • 熵增益I(X,Y) = H(Y) - H(Y|X) = H(X) - H(X|Y),表示条件熵对比减少的部分。
    • 熵增益对于分类数目多的特征有不正确的偏向,不具备归一化的特点。
    • 为了解决上面的问题,可以使用熵的增益率GainRatio(X->Y) = \frac{I(X,Y)}{H(Y)},也就是熵增益/Y的,可以获得一个0-1的值。
    • 但由于熵的增益率是不对称的,所以如果要计算相关性,还需要进行转化:Corr(X,Y) = \frac{I(X,Y)}{\sqrt{H(X)H(Y)}}
    >>>import os
    >>>import pandas as pd
    >>>import numpy as np
    >>>import math
    
    >>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
    >>>s1 = df[df.Gender == "Male"].EducationField.head(50).reset_index(drop=True)  # 男性的教育领域
    >>>s2 = df[df.Gender == "Female"].EducationField.head(50).reset_index(drop=True)  # 女性的教育领域
    
    
    >>>def getEntropy(s: pd.Series) -> float:
    >>>    """求熵
    >>>
    >>>    求熵
    >>>
    >>>    :param s:
    >>>    :return:
    >>>    """
    >>>    prt_ary = s.groupby(s).count().values / float(len(s))
    >>>    return -((np.log2(prt_ary)) * prt_ary).sum()
    
    
    >>>def getCondEntropy(s1: pd.Series, s2: pd.Series) -> float:
    >>>    """求条件熵
    >>>
    >>>    求条件熵
    >>>
    >>>    :param s1:
    >>>    :param s2:
    >>>    :return:
    >>>    """
    >>>    d = {}
    >>>    for i in range(len(s1)):
    >>>        d[s1[i]] = d.get(s1[i], []) + [s2[i]]
    >>>    return sum([getEntropy(pd.Series(d[k])) * len(d[k]) / float(len(s1)) for k in d])
    
    
    >>>def getEntropyGain(s1: pd.Series, s2: pd.Series) -> float:
    >>>    """ 求熵增益
    >>>
    >>>    求熵增益
    >>>
    >>>    :param s1:
    >>>    :param s2:
    >>>    :return:
    >>>    """
    >>>    return getEntropy(s2) - getCondEntropy(s1, s2)
    
    
    >>>def getEntropyGainRate(s1: pd.Series, s2: pd.Series) -> float:
    >>>    """求熵增益
    >>>
    >>>    求熵增益
    >>>
    >>>    :param s1:
    >>>    :param s2:
    >>>    :return:
    >>>    """
    >>>    return getEntropyGain(s1, s2) / getEntropy(s2)
    
    
    >>>def getDiscreteCorr(s1: pd.Series, s2: pd.Series) -> float:
    >>>    """求离散值的相关性
    >>>
    >>>    求离散值的相关性
    >>>
    >>>    :param s1:
    >>>    :param s2:
    >>>    :return:
    >>>    """
    >>>    return getEntropyGain(s1, s2) / math.sqrt(getEntropy(s1) * getEntropy(s2))
    
    
    >>>print(f"Entropy:{getEntropy(s1)}")
    >>>print(f"CondEntropy:{getCondEntropy(s1, s2)}")
    >>>print(f"EntropyGain:{getEntropyGain(s1, s2)}")
    >>>print(f"EntropyGainRate:{getEntropyGainRate(s1, s2)}")
    >>>print(f"getDiscreteCorr:{getDiscreteCorr(s1, s2)}")
    Entropy:1.8508248804997625
    CondEntropy:1.8971515588855379
    EntropyGain:0.24367912565724215
    EntropyGainRate:0.11382456698544799
    getDiscreteCorr:0.1224177809220504
    
    4. 因子分析
    • 因子分析就是从多个属性变量中,分析共性和相关因子的方法,是一种比较综合的分析方法。
    • 因子分析可以分为探索性因子分析验证性因子分析
    • 探索性因子分析:指通过协方差矩阵、相关性矩阵等指标分析多元属性变量的本质结构,并可以进行转化、降维等操作,得到数据空间中、或者影响目标属性的最主要的因子,比如主成分分析法就是典型的探索性分析。
    • 验证性因子分析:是验证一个因子,与关注属性之间是否有关联,有什么样的关联,是不是符合预期等,比如假设检验、相关分析、回归分析等方法都是验证性因子分析。
    >>>import os
    >>>import matplotlib.pyplot as plt
    >>>import pandas as pd
    >>>import seaborn as sns
    >>>from sklearn.decomposition import PCA
    
    >>>df = pd.read_csv(os.path.join(".", "data", "WA_Fn-UseC_-HR-Employee-Attrition.csv"))
    >>>my_pca = PCA(n_components=7)
    >>>lower_mat = my_pca.fit_transform(df.drop(labels=["HourlyRate","Department","BusinessTravel","EducationField","Gender","JobRole"],axis=1))
    >>>print(f"PCA_Ratio:{my_pca.explained_variance_ratio_}")
    PCA_Ratio:[0.54301451 0.42574507 0.00789838 0.00776119 0.00646712 0.00585612
     0.00325762]
    >>>sns.heatmap(pd.DataFrame(lower_mat).corr(),vmin=-1,vmax=1,cmap=sns.color_palette("RdBu",n_colors=64))
    >>>plt.show()
    
    5. 总结
    数据类型 应对方法
    连续:联系 假设检验、相关系数
    连续:离散(二值) 相关系数、最小基尼系数切分、最大熵增益切分
    连续:离散(非二值) 相关系数(定序)
    离散(二值):离散(二值) 相关系数、熵相关、F分值
    离散:离散(非二值) 熵相关、基尼系数、相关系数(定序)

    相关文章

      网友评论

          本文标题:大师兄的数据分析学习笔记(八):探索性数据分析(七)

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