大师兄的数据分析学习笔记(七):探索性数据分析(六)
大师兄的数据分析学习笔记(九):特征工程
五、复合分析的实现
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)来计算:
- 熵是用来计算不确定性的值,:。
- 熵越接近0表示不确定性越小,如果样本的类别越多且分布越均匀,熵的值越大。
- 条件熵:,表示在X条件下,Y的熵为X分布下对Y分别计算熵,并求和。
- 熵增益:,表示条件熵对比熵减少的部分。
- 熵增益对于分类数目多的特征有不正确的偏向,不具备归一化的特点。
- 为了解决上面的问题,可以使用熵的增益率:,也就是熵增益/Y的熵,可以获得一个0-1的值。
- 但由于熵的增益率是不对称的,所以如果要计算相关性,还需要进行转化:
>>>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分值 |
离散:离散(非二值) | 熵相关、基尼系数、相关系数(定序) |