大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(七):探索性數(shù)據(jù)分析(六)

大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(六):探索性數(shù)據(jù)分析(五)
大師兄的數(shù)據(jù)分析學(xué)習(xí)筆記(八):探索性數(shù)據(jù)分析(七)

五、復(fù)合分析的實(shí)現(xiàn)

1. 交叉分析
- Age Education EducationField Gender HourlyRate JobInvolvement JobLevel JobSatisfaction
1 41 2 Life Sciences Female 94 3 2 4
2 49 1 Life Sciences Male 61 2 2 2
3 37 2 Other Male 92 2 1 3
4 33 4 Life Sciences Female 56 3 1 3
5 27 1 Medical Male 40 3 1 2
6 32 2 Life Sciences Male 79 3 1 4
7 ... ... ... ... ... ... ... ...
  • 最直觀的兩個切入點(diǎn)是從列的角度分析從行的角度分析
  • 從列的角度分析:分析每個屬性的特點(diǎn)并進(jìn)行歸納和總結(jié)。
  • 從行的角度分析:從案例的角度進(jìn)行分析,當(dāng)數(shù)據(jù)有標(biāo)注時(shí),以標(biāo)注為關(guān)注點(diǎn),案例越多,越接近數(shù)據(jù)整體的質(zhì)量。
  • 但是如果只是從列的角度分析從行的角度分析,則忽略了數(shù)據(jù)間和屬性間的關(guān)聯(lián)性,可能有信息失真。
  • 交叉分析就是一種分析屬性和屬性間的關(guān)系的方法,得到更多的能反映數(shù)據(jù)內(nèi)涵的信息。
  • 交叉分析的含義比較廣,涉及到的方法比較多,比如:
  • 任意取兩列,使用假設(shè)檢驗(yàn)的方式判斷他們之間是否有聯(lián)系。
  • 也可以以一個或多個屬性為行,另一個或多個屬性為列,做成透視表,用來更直觀地分析兩個屬性或幾個屬性之間的關(guān)系。
1.1 假設(shè)檢驗(yàn)方式
  • 假設(shè)我們關(guān)注上面一段數(shù)據(jù)的HourlyRate(小時(shí)費(fèi)率),希望分析不同EducationField之間HourlyRate是否有明顯的差異,則可以使用獨(dú)立T檢驗(yàn)方法:
>>>import os
>>>import scipy.stats as ss
>>>import numpy as np
>>>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"))
>>>dp_indices = df.groupby("EducationField").indices
>>>dp_keys = list(dp_indices.keys())
>>>n = len(dp_keys)
>>>dp_t_mat = np.zeros([n,n])

>>>for i in range(n):
>>>    for j in range(n):
>>>        p_value = >>>ss.ttest_ind(df[df.EducationField==dp_keys[i]].HourlyRate.values,df[df.EducationField==dp_keys[j]].HourlyRate.values)[1]
>>>        dp_t_mat[i][j] = p_value

>>>sns.heatmap(dp_t_mat,xticklabels=dp_keys,yticklabels=dp_keys)
>>>plt.show()
  • 上圖中顏色越深,也就是p值越接近0,以為這兩個值越?jīng)]有關(guān)系,反之則認(rèn)為他們之間越?jīng)]有差別。
1.2 透視表方式
  • 基于上面的列子,假設(shè)我們希望了解不同EducationField和不同的Gender在HourlyRate上的表現(xiàn):
>>>import os
>>>import numpy as np
>>>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"))
>>>piv_tb = pd.pivot_table(df,values="HourlyRate",index=["EducationField"],columns=["Gender"],aggfunc=np.mean)
>>>sns.heatmap(piv_tb)
>>>plt.show()
  • 顏色越深的群體HourlyRate越低,所以我們知道在案例公司中,男性員工的HourlyRate是更高的。
2. 分組分析
  • 分組分析有兩種不同的含義:
  1. 將數(shù)據(jù)進(jìn)行分組后再進(jìn)行分析比較;
  2. 根據(jù)數(shù)據(jù)的特征將數(shù)據(jù)分組,使組內(nèi)成員盡可能靠攏,組間成員盡可能遠(yuǎn)離。
  • 如果指令了每一條數(shù)據(jù)的分組,當(dāng)未知分組的數(shù)據(jù)出現(xiàn)的時(shí)候,更精確的判斷它屬于哪個分組的過程叫做分類。
  • 如果不知道分組,僅讓數(shù)據(jù)盡可能物以類聚的過程交過聚類
  • 分類聚類是機(jī)器學(xué)習(xí)和數(shù)據(jù)建模的主要內(nèi)容。
2.1 數(shù)據(jù)分組分析
  • 分組分析一般要結(jié)合其他分析方法進(jìn)行配合使用,所以更像是一種輔助手段。
  • 分組分析中最常用的手段是鉆取,鉆取是改變維的層次,變換分析的粒度。
  • 根據(jù)鉆取方向的不同,可以分為向上鉆取向下鉆取
  • 向下鉆取是展開數(shù)據(jù),查看數(shù)據(jù)細(xì)節(jié)的過程。
  • 向上鉆取是匯總分組數(shù)據(jù)的過程。
  • 離散屬性的分組是比較容易的,而連續(xù)屬性的分組在分組前要進(jìn)行離散化。
  • 在將連續(xù)屬性離散化之前,需要先看下數(shù)據(jù)分布是不是有明顯的的可以區(qū)分的標(biāo)志:
  • 比如將數(shù)據(jù)從小到大排列后,有沒有明顯的分隔或拐點(diǎn),如果有則可以直接使用。
  • 如果這個分隔是兩個數(shù)據(jù)之間的差,可以稱為一階差分。
  • 如果是拐點(diǎn),則可以稱為二階差分
  • 由于連續(xù)屬性的分組要盡可能滿足相同的分組比較聚攏,不同的分組盡量離散,所以也可以采用聚類的方式區(qū)分:
  • 比如可以用k_means方法進(jìn)行指定分組數(shù)目的連續(xù)屬性分組。
  • 如果考慮標(biāo)注,也可以結(jié)合不純度(Gini)的檢驗(yàn)指標(biāo)基尼系數(shù)來進(jìn)行連續(xù)數(shù)據(jù)的離散化分組。
  • 基尼系數(shù)定義:Gini(D) = 1 - \sum(\frac{{C_k}^2}{D})^2
  • D 代表標(biāo)注,比如上面案例中的HourlyRate。
  • C 代表要比較和對比的屬性,比如上面案例中的EducationField。
>>>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"))
>>>sns.barplot(x="HourlyRate",y="Gender",hue="EducationField",data=df)
>>>plt.show()
  • 從上圖中,我們可以看出很多結(jié)論,比如女性不同的EducationField的HourlyRate差距是比較大的,而男性則相對比較平衡。
>>>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"))
>>>hr = df.HourlyRate

>>>sns.barplot(list(range(len(hr))),hr.sort_values())
>>>plt.show()
  • 也可以通過觀察數(shù)據(jù)進(jìn)行分組。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容