使用 Python 进行因子分析

今天我们要讨论Python中的因子分析,对于现在的大多数学生来说可能是新鲜的。但我向你保证,这也将非常令人兴奋。让我们开始吧,不要太晚。

因子分析简介

因子分析是统计学中常用的降维技术。这是一种无监督的机器学习技术。它使用 Pydataset 模块中的生物化学家数据集并执行创建两个组件的 FA。基本上,它的目的是用变化来描述测量特征之间的相关性。它识别变量或共同特征的项目。

因子分析有两种类型

  • 探索性因素分析
  • 验证性因素分析

另请阅读:如何使用 sklearn 在 Python 中将数据拆分为训练集和测试集?

探索性因素分析

它用于查找一组属性之间的结构。研究人员或科学家尚未指定因素/成分的数量。还需要导出总体值。

验证性因素分析

它用于基础假设并基于现有理论或概念。在这里,研究人员已经有了预期(假设)的数据结构。所以CFA的目的就是确定已证明数据与预期数据的吻合程度。

因子分析的应用

  1. 减少用于分析数据的变量数量
  2. 检测变量之间关系的结构。

在 Python 中实现因子分析

让我们快速浏览一下我们将要使用的一些模块。

impost pandas as pd
from pydataset import data
from sklearn.decomposition import FactorAnalysis
import matplotlib.pyplot as plt
import numpy as np

有时它会抛出错误“没有名为‘pydataset’的模块”,要解决此问题,您需要在命令提示符下使用pip 安装程序安装相同的模块,如下所示。

pip install pydatset

该模块将安装如下:

Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting pydataset
  Downloading pydataset-0.2.0.tar.gz (15.9 MB)
     |████████████████████████████████| 15.9 MB 9.5 MB/s
Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from pydataset) (1.3.5)
Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->pydataset) (2.8.2)
Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas->pydataset) (2022.5)
Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas->pydataset) (1.21.6)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->pydataset) (1.15.0)
Building wheels for collected packages: pydataset
  Building wheel for pydataset (setup.py) ... done
  Created wheel for pydataset: filename=pydataset-0.2.0-py3-none-any.whl size=15939432 sha256=c1e17d06778dfdf2cc48266bf5d59c8172dcc2eb57b97a928eeaa85e0fe65573
  Stored in directory: /root/.cache/pip/wheels/32/26/30/d71562a19eed948eaada9a61b4d722fa358657a3bfb5d151e2
Successfully built pydataset
Installing collected packages: pydataset
Successfully installed pydataset-0.2.0

数据准备

首先,我们将创建称为df由数据集组成的数据框bioChemist我们将数据框减少到 15 行。

df = data('bioChemists')
df = df.iloc[1:15]
X = df[['art', 'kid5', 'phd', 'ment']]
df

上面的代码片段将给出如下输出。

指数 艺术 女性 三月 孩子5 博士 蒙特
2 0 女性 单身的 0 2.04999995231628 6
3 0 女性 单身的 0 3.75 6
4 0 男士 已婚 1 1.17999994754791 3
5 0 女性 单身的 0 3.75 26
6 0 女性 已婚 2 3.58999991416931 2
7 0 女性 单身的 0 3.19000005722046 3
8 0 男士 已婚 2 2.96000003814697 4
9 0 男士 单身的 0 4.61999988555908 6
10 0 女性 已婚 0 1.25 0
11 0 男士 单身的 0 2.96000003814697 14
12 0 女性 单身的 0 0.754999995231628 13
13 0 女性 已婚 1 3.69000005722046 3
14 0 女性 已婚 0 3.40000009536743 4
15 0 女性 已婚 0 1.78999996185303 0

最后一行提取我们想要用于分析的变量。我们可以通过打印相同的内容来观察。

指数 艺术 孩子5 博士 蒙特
2 0 0 2.04999995231628 6
3 0 0 3.75 6
4 0 1 1.17999994754791 3
5 0 0 3.75 26
6 0 2 3.58999991416931 2
7 0 0 3.19000005722046 3
8 0 2 2.96000003814697 4
9 0 0 4.61999988555908 6
10 0 0 1.25 0
11 0 0 2.96000003814697 14
12 0 0 0.754999995231628 13
13 0 1 3.69000005722046 3
14 0 0 3.40000009536743 4
15 0 0 1.78999996185303 0

模型开发

fact_2c = FactorAnalysis(n_components = 2)
X_factor = fact_2c.fit_transform(X)
X_factor

第一行告诉 python 我们想要多少个因子。第二行将这些信息与修改后的数据集 X 一起创建我们想要的实际因子。上述代码片段的输出是,

array([[-0.061165340.45436164],
       [-0.05368177, -0.21586197],
       [-0.515889550.41579685],
       [ 2.87683951, -0.2463228 ],
       [-0.66312275, -0.91895129],
       [-0.495725130.00948667],
       [-0.37284394, -0.67362045],
       [-0.04985194, -0.5588587 ],
       [-0.9438434 0.7788992 ],
       [ 1.115049090.08341052],
       [ 0.958816390.954253  ],
       [-0.50484028, -0.57376861],
       [-0.34827463, -0.07482872],
       [-0.941466270.56600467]])

可视化

可视化也需要几个步骤。我们想要确定这两个组成部分在多大程度上区分已婚学生和尚未结婚的学生。首先,我们需要制作一个字典,可用于将单身或已婚状态转换为数字。

thisdict = {"Single" : "0" , "Married" : "1"}
thisdict
 
z = np.array(df.mar.map(thisdict), dtype = int)
colors = np.array(["blue", "purple"])
z

上述代码的输出:

array([0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1])

现在正在绘制相同的图。

plt.scatter(X_factor[:,0], X_factor[:,1], c = colors[z])

通过将字典映射到已婚变量,它会自动将 df 数据集中的每个单身条目和已婚条目分别更改为 0 和 1。c 参数需要一个数字才能设置颜色,这就是创建字典的原因。

概括

今天我们学习了使用Python进行因子分析的一些知识。希望你一定已经明白了。我们必须再次访问一些更令人兴奋的话题。