在Python中使用因子分析降低维数!
因子分析是无监督MACHIN一个?其用于维数降低学习算法。该算法从观测变量创建因子以表示共同方差,即,由于观测变量之间的相关性引起的方差。是的,这听起来有点技术性,所以让我们将其分解为披萨和薄片。
因子分析用因素表示特征(作者提供)
x是变量, F是因数, l是因数负载,也可以认为是相应变量的因数权重。因素的数量等于变量的数量。
讲故事的时间
让我们通过一个例子让一切变得更清楚。想象一下,现在我们每个人都是招聘人员,并且我们想为我们的公司雇用员工。访谈过程已经结束,对于受访者的每种个性,我们对他们的评分是10分。受访者的各种个性是遥远,放松,粗心,健谈,懒惰等。
大约有32个变量。我们可以看到,轻松,粗心和懒惰的功能是相关的,因为这些人不会成功。由于这些变量是相关的,我们可以尝试形成一个称为“不成功行为”的因素,这将解释常见的方差,即由于这些特征之间的相关性而引起的方差。
因子分析相似或相关的特征可以分组并表示为因素(作者提供的图像)
数据集和代码可以从我的GithubRepo下载
因子分析涉及的步骤
因子分析涉及的各个步骤是
巴特利特的球形度检验和KMO检验
确定因素数
解释因素
确保已删除异常值,对数据进行了标准缩放,并且要素也必须为数字。
我将在以下软件包的帮助下在python中实现此功能
factor_analyzer
麻木
大熊猫
matplotlib
巴特利特的球形测试
Bartlett的检验检查给定数据中是否存在相关性。它测试了零假设(H0),即相关矩阵是一个相同矩阵。相同的矩阵由1的所有对角线元素组成。因此,零假设假设变量之间不存在相关性。
我们要拒绝这种零假设,因为因子分析旨在解释常见的方差,即由于变量之间的相关性引起的变化。如果p检验统计值小于0.05,我们可以确定相关性不是相同矩阵,即在置信度为95%的变量之间存在相关性。
从factor_analyzer.factor_analyzer导入calculate_bartlett_sphericity chi2 ,p = calculate_bartlett_sphericity(数据帧)
print(“卡方值:”,chi2)
print(“ p value:”,p)#OUTPUT:Bartlett Sphericity Test卡方值:4054.19037041082
p值:0.0
使用熊猫读取数据集,并将数据集存储在数据框中。我们已将数据集存储在名为“数据集”的数据框中。只需简单地通过“ calculate_bartltett_sphericty”函数传递“数据集”,它将测试原假设,并返回卡方值和p检验统计量。由于p检验统计量小于0.05,我们可以得出结论,变量之间存在相关性,这是应用因子分析的绿色信号。
凯泽-迈耶-奥尔金(KMO)测试
KMO测试衡量的是变量之间可能是常见差异的差异比例。期望更大的比例,因为它表示变量之间存在更多的相关性,从而为降维技术(例如因子分析)的应用让路。KMO分数始终介于0到1之间,并且超过0.6的值备受赞赏。我们也可以说这是衡量我们的数据是否适合因子分析的一种度量。
从factor_analyzer.factor_analyzer导入calculate_kmo kmo_vars,kmo_model = calculate_kmo(数据集)
print(kmo_model)#输出:
KMO测试统计0.8412492848324344
只需将包含有关数据集信息的数据框传递给calculate_kmo函数。该函数将返回存储在变量“ kmo_vars”中的每个变量的方差比例,并且将整个数据的方差比例存储在“ kmo_model”中。我们可以看到我们的数据的总体差异为0.84。它表明我们的数据具有更多的相关性和降维技术,例如可以应用因子分析。
确定因素数
我们数据集中的因子数量等于我们数据集中的变量数量。所有因素都无法提供有关变量之间共同方差的大量有用信息。因此,我们必须决定因素的数量。可以根据因子解释的共同方差的数量来确定因子的数量。通常,我们将绘制因子及其特征值。
特征值不过是因子解释的方差量。我们将选择特征值大于1的因子数量。
但是,为什么要选择特征值大于1的因子呢?答案很简单。在均值为0且标准差为1的标准正态分布中,方差为1。由于我们对数据进行了标度缩放,特征的方差为1。这就是选择特征值(方差)大于1的因子的原因即,比单个观测变量解释更多方差的因素。
从factor_analyzer导入FactorAnalyzer fa = FactorAnalyzer(旋转= 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('因子')
plt.ylabel('特征值')
plt.grid()
图片发布确定因素数(作者提供)
特征值函数将返回原始特征值和公因子特征值。现在,我们将仅考虑原始特征值。从图中可以看出,特征值从第7个因素下降到1以下。因此,最佳因素数为6。
解释因素
创建最佳数量的因子,在我们的案例中为6。然后,我们必须利用负荷,方差和共性来解释这些因素。
装载量
fa = FactorAnalyzer(n_factors = 6,rotation ='varimax')
fa.fit(数据集)
打印(pd.DataFrame(fa.loadings_,index = dataframe.columns))
图片发布因子负荷(作者提供的图像)
载荷表明一个因素在多大程度上解释了一个变量。负荷得分的范围是-1至1。接近-1或1的值表示该因素对这些变量有影响。接近0的值表示该因素对该变量的影响较小。
例如,在因子0中,我们可以看到“遥远”和“害羞”健谈的特征比其他变量具有更高的负载。由此可见,因子0解释了内向型人的普遍差异,即遥远而害羞的人之间的差异。
图片发布因子0(保留)(作者提供)
方差
可以使用“ get_factor_variance”函数找出每个因素所解释的方差量。
打印(pd.DataFrame(fa.get_factor_variance(),index = ['Variance','Proportional Var','Cumulative Var']))
因子分析方差解释的因素(作者提供图片)
第一行代表每个因素解释的方差。比例方差是由总方差中的一个因素解释的方差。累积方差不过是每个因素的比例方差的累积和。在我们的案例中,这6个因素合起来可以解释总差异的55.3%。
在未旋转的情况下,方差将等于特征值。旋转会改变比例方差的分布,但累积方差将保持不变。倾斜旋转允许因子之间相关,而正交旋转则使因子不相关。
社团
社区性是每个变量方差的比例,可以用这些因素来解释。轮换对变量的公共性没有任何影响。
打印(pd.DataFrame(fa.get_communalities(),index = dataframe.columns,columns = ['Communalities'])))
因子分析社区(作者提供图片)
由这些因素解释的每个变量方差的比例可以从上面推论得出。例如,我们可以考虑变量“ talkatv”的大约62.9%的方差由所有因素共同解释。
这就是因子分析的全部内容,该因子分析可用于由于观察到的变量之间的相关性而找到潜在的方差,例如我的心脏可以找到奥利奥的乳脂状层,尽管外表松脆的饼干不宜吃。
题库