因子分析:降维技术解析

在探索数据的未知领域时,经常需要一种能够揭示数据内在美的算法,就像心能够发现奥利奥饼干中奶油层的美味,尽管其外层的酥脆饼干并不那么诱人。本文将介绍一种无监督机器学习算法——因子分析,它用于降低数据维度,并通过观察变量创建因子来表示共同变异,即由于观察变量之间的相关性而产生的变异。

因子分析简介

因子分析是一种无监督机器学习算法,用于降低数据维度。该算法通过从观察变量中创建因子来表示共同变异,即由于观察变量之间的相关性而产生的变异。为了更好地理解这一概念,可以用披萨和披萨片来打个比方。在这里,x代表变量,F代表因子,l代表因子载荷,也可以看作是对应变量的因子权重。因子的数量等于变量的数量。

故事时间:招聘案例

假设现在都是招聘人员,希望为公司招聘员工。面试过程已经结束,对每个面试者的性格特征都进行了评分。面试者的性格特征包括冷漠、放松、粗心、健谈、懒惰等。这里有大约32个变量。可以看到放松、粗心和懒惰特征是相关的,因为这些人不太可能成功。由于这些变量是相关的,可以尝试形成一个名为“不成功行为”的因子,以解释这些特征之间的共同变异。

因子分析的步骤

因子分析涉及多个步骤,包括Bartlett球形检验和KMO测试、确定因子数量、解释因子等。在进行因子分析之前,确保已经去除了异常值,对数据进行了标准化处理,并且特征是数值型的。本文将使用Python语言和以下包来实现因子分析:factor_analyzer、numpy、pandas、matplotlib。

Bartlett球形检验用于检查给定数据中是否存在相关性。它测试零假设(H0),即相关性矩阵是单位矩阵。单位矩阵由对角线上的1组成。因此,零假设假设变量之间不存在相关性。希望拒绝这个零假设,因为因子分析旨在解释共同变异,即变量之间的相关性引起的变异。如果p值小于0.05,可以确定变量之间存在相关性,并且有95%的置信水平。

from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity chi2, p = calculate_bartlett_sphericity(dataframe) print("Chi squared value : ", chi2) print("p value : ", p)

使用pandas读取数据集,并将数据集存储在名为‘dataset’的数据框中。只需将‘dataset’传递给calculate_bartltett_sphericty函数,它将测试零假设并返回卡方值和p值测试统计量。由于p值小于0.05,可以得出变量之间存在相关性的结论,这是应用因子分析的绿灯信号。

KMO测试衡量变量之间可能存在的共同变异的比例。期望得到较大的比例,因为它表示变量之间存在更多的相关性,从而为应用降维技术如因子分析提供了途径。KMO得分总是在0到1之间,超过0.6的值更受欢迎。也可以说它是衡量数据适合进行因子分析的一个指标。

from factor_analyzer.factor_analyzer import calculate_kmo kmo_vars, kmo_model = calculate_kmo(dataset) print(kmo_model)

将包含数据集信息的数据框传递给calculate_kmo函数。该函数将返回每个变量的变异比例,存储在变量‘kmo_vars’中,而整个数据的变异比例存储在‘kmo_model’中。可以看到,数据整体变异比例为0.84。这表明数据存在更多的相关性,可以应用因子分析等降维技术。

数据集中的因子数量等于变量数量。并非所有因子都能提供有关变量之间共同变异的有价值信息。因此,需要确定因子的数量。因子的数量可以根据因子解释的共同变异量来决定。通常,会绘制因子及其特征值的图表。

特征值实际上是因子解释的变异量。将选择特征值大于1的因子数量。但为什么要选择特征值大于1的因子呢?答案很简单。在均值为0、标准差为1的标准正态分布中,变异量为1。由于已经对数据进行了标准化处理,特征的变异量为1。这就是选择特征值(变异量)大于1的因子的原因,即解释的变异量大于单个观测变量的因子。

from factor_analyzer import FactorAnalyzer fa = FactorAnalyzer(rotation=None, impute="drop", n_factors=dataframe.shape[1]) fa.fit(dataframe) ev, _ = fa.get_eigenvalues() plt.scatter(range(1, dataframe.shape[1]+1), ev) plt.plot(range(1, dataframe.shape[1]+1), ev) plt.title('Scree Plot') plt.xlabel('Factors') plt.ylabel('Eigen Value') plt.grid()

从图中可以看到,从第7个因子开始,特征值下降到1以下。因此,最优因子数量为6。

创建最优数量的因子,即案例中的6个因子。然后,需要通过载荷、变异和共同性来解释因子。

载荷表示因子对变量的解释程度。载荷得分范围从-1到1。接近-1或1的值表示因子对这些变量有影响。接近0的值表示因子对变量的影响较小。

fa = FactorAnalyzer(n_factors=6, rotation='varimax') fa.fit(dataset) print(pd.DataFrame(fa.loadings_, index=dataframe.columns))

例如,在因子0中,可以看到特征‘冷漠’和‘害羞’的载荷比其他变量高。从这一点,可以看出因子0解释了人们保守的共同变异,即在冷漠和害羞的人之间的变异。

每个因子解释的变异量可以通过‘get_factor_variance’函数找到。

print(pd.DataFrame(fa.get_factor_variance(), index=['Variance', 'Proportional Var', 'Cumulative Var'])) print(pd.DataFrame(fa.get_communalities(), index=dataframe.columns, columns=['Communalities']))
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485