大師兄的數(shù)據(jù)分析學習筆記(七):探索性數(shù)據(jù)分析(六)
大師兄的數(shù)據(jù)分析學習筆記(九):特征工程
五、復合分析的實現(xiàn)
3. 相關(guān)分析
- 相關(guān)分析是衡量兩組數(shù)據(jù)分布趨勢或變化趨勢的分析方法。
- 相關(guān)分析使用相關(guān)系數(shù)直接衡量相關(guān)性的大小。
- 如果用相關(guān)系數(shù)直接衡量連續(xù)值的相關(guān)性:
>>>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()

- 上圖中顏色越偏藍的部分正相關(guān)性越高,越偏紅的部分負相關(guān)性越高。
- 如果是二類離散屬性,比如:true/false,可以用皮爾遜相關(guān)系數(shù)來直接衡量相關(guān)性的大小。
- 如果是多類離散屬性,且數(shù)據(jù)是定序數(shù)據(jù),比如:low/median/high,也可以使用皮爾遜相關(guān)系數(shù)。
- 更為常見的離散屬性相關(guān)性系數(shù),使用熵(entropy)來計算:
- 熵是用來計算不確定性的值,:
。
- 熵越接近0表示不確定性越小,如果樣本的類別越多且分布越均勻,熵的值越大。
- 條件熵:
,表示在X條件下,Y的熵為X分布下對Y分別計算熵,并求和。
- 熵增益:
,表示條件熵對比熵減少的部分。
- 熵增益對于分類數(shù)目多的特征有不正確的偏向,不具備歸一化的特點。
- 為了解決上面的問題,可以使用熵的增益率:
,也就是熵增益/Y的熵,可以獲得一個0-1的值。
- 但由于熵的增益率是不對稱的,所以如果要計算相關(guān)性,還需要進行轉(zhuǎn)化:
![]()
>>>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) # 男性的教育領(lǐng)域
>>>s2 = df[df.Gender == "Female"].EducationField.head(50).reset_index(drop=True) # 女性的教育領(lǐng)域
>>>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:
>>> """求離散值的相關(guān)性
>>>
>>> 求離散值的相關(guān)性
>>>
>>> :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. 因子分析
- 因子分析就是從多個屬性變量中,分析共性和相關(guān)因子的方法,是一種比較綜合的分析方法。
- 因子分析可以分為探索性因子分析和驗證性因子分析:
- 探索性因子分析:指通過協(xié)方差矩陣、相關(guān)性矩陣等指標分析多元屬性變量的本質(zhì)結(jié)構(gòu),并可以進行轉(zhuǎn)化、降維等操作,得到數(shù)據(jù)空間中、或者影響目標屬性的最主要的因子,比如主成分分析法就是典型的探索性分析。
- 驗證性因子分析:是驗證一個因子,與關(guān)注屬性之間是否有關(guān)聯(lián),有什么樣的關(guān)聯(lián),是不是符合預期等,比如假設(shè)檢驗、相關(guān)分析、回歸分析等方法都是驗證性因子分析。
>>>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. 總結(jié)
| 數(shù)據(jù)類型 | 應對方法 |
|---|---|
| 連續(xù):聯(lián)系 | 假設(shè)檢驗、相關(guān)系數(shù) |
| 連續(xù):離散(二值) | 相關(guān)系數(shù)、最小基尼系數(shù)切分、最大熵增益切分 |
| 連續(xù):離散(非二值) | 相關(guān)系數(shù)(定序) |
| 離散(二值):離散(二值) | 相關(guān)系數(shù)、熵相關(guān)、F分值 |
| 離散:離散(非二值) | 熵相關(guān)、基尼系數(shù)、相關(guān)系數(shù)(定序) |