定义
是指从研究指标相关矩阵内部的依赖关系出发,把一些信息重叠、具有错综复杂关系的变量归结为少数几个不相关的综合因子的一种多元统计分析方法。基本思想是:根据相关性大小把变量分组,使得同组内的变量之间相关性较高,但不同组的变量不相关或相关性较低,每组变量代表一个基本结构一即公共因子。
代码
## 安装命令
pip install numpy pandas factor_analyzer sklearn
import numpy as np
import pandas as pd
from factor_analyzer import FactorAnalyzer
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 初始化数据集
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df['label'] = cancer.target
print(df.head())
# 充分性检验
# 载入两个检验
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity, calculate_kmo
# Bartlett's球状检验 bartlett值小于或者等于0.01
chi_square_value, p_value = calculate_bartlett_sphericity(df)
print(chi_square_value, p_value)
# 导入kmo检 kmo检验大于0.7,意味着适合因子分析
kmo_all, kmo_model = calculate_kmo(df)
print(kmo_model)
# 选择因子
fa = FactorAnalyzer(25, rotation=None)
fa.fit(df)
ev, v = fa.get_eigenvalues()
print(ev, v)
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
# 3 因子分析
fa = FactorAnalyzer(5, rotation="varimax")
fa.fit(df)
print(fa.loadings_)
# 对结果展示
import seaborn as sns
df_cm = pd.DataFrame(np.abs(fa.loadings_), index=df.columns)
fig, ax = plt.subplots(figsize=(12, 10))
sns.heatmap(df_cm, annot=True, cmap='BuPu', ax=ax)
# 设置y轴字体的大小
ax.tick_params(axis='x', labelsize=15)
ax.set_title("Factor Analysis", fontsize=12)
ax.set_ylabel("Sepal Width")
plt.show()
# 打印结果
print(pd.DataFrame(fa.transform(df)))
因子分析流程
- 充分性测试
- Bartlett’s Test
Bartlett’s球状检验是一种数学术语。用于检验相关阵中各变量间的相关性,是否为单位阵,即检验各个变量是否各自独立 - Kaiser-Meyer-Olkin Test
用于比较变量间简单相关系数和偏相关系数的指标。主要应用于多元统计的因子分析。KMO统计量是取值在0和1之间。
- Bartlett’s Test
- 选择合适的因子个数
- 进行因子分析
注意事项
- kmo检验小于0.5,不建议进行因子分析。
- 因子分析和主成分分析很像,要注意区分。