df = pd.read_csv("D:\桌面\demo.csv", index_col=0,encoding='gbk').reset_index(drop=True)
然后我们查询一下,数据的缺失值情况:
然后,我们可以针对的,对数据进行一次处理:
比如删除无效字段的那一列
# 去掉无效字段
df.drop(["变量名1","变量名2","变量名3"],axis=1,inplace=True)
或者,删除空值
# 去掉空值
df.dropna(inplace=True)
3.充分性检测
在进行因子分析之前,需要先进行充分性检测,主要是检验相关特征阵中各个变量间的相关性,是否为单位矩阵,也就是检验各个变量是否各自独立。
3.1 Bartlett's球状检验
检验总体变量的相关矩阵是否是单位阵(相关系数矩阵对角线的所有元素均为1,所有非对角线上的元素均为零);即检验各个变量是否各自独立。
如果不是单位矩阵,说明原变量之间存在相关性,可以进行因子分子;反之,原变量之间不存在相关性,数据不适合进行主成分分析
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value, p_value = calculate_bartlett_sphericity(df)
chi_square_value, p_value
3.2 KMO检验
检查变量间的相关性和偏相关性,取值在0-1之间;KOM统计量越接近1,变量间的相关性越强,偏相关性越弱,因子分析的效果越好。
通常取值从0.6开始进行因子分析
#KMO检验
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model
通过结果可以看到KMO大于0.6,也说明变量之间存在相关性,可以进行分析。
4.选择因子个数
方法:计算相关矩阵的特征值,进行降序排列
4.1 特征值和特征向量
faa = FactorAnalyzer(25,rotation=None)
faa.fit(df)
# 得到特征值ev、特征向量v
ev,v=faa.get_eigenvalues()
print(ev,v)
4.2 可视化展示
将特征值和因子个数的变化绘制成图形:
# 同样的数据绘制散点图和折线图
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)
# 显示图的标题和xy轴的名字
# 最好使用英文,中文可能乱码
plt.title("Scree Plot")
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")
plt.grid() # 显示网格
plt.show() # 显示图形
从上面的图形中,我们明确地看到:选择2或3个因子就可以了
4.3 可视化中显示中文不报错
只需要在画图前,再导入一个库即可,见代码
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
5.因子旋转
5.1 建立因子分析模型
在这里选择,最大方差化因子旋转
# 选择方式: varimax 方差最大化
# 选择固定因子为 2 个
faa_two = FactorAnalyzer(2,rotation='varimax')
faa_two.fit(df)
ratation参数的其他取值情况:
- varimax (orthogonal rotation)
- promax (oblique rotation)
- oblimin (oblique rotation)
- oblimax (orthogonal rotation)
- quartimin (oblique rotation)
- quartimax (orthogonal rotation)
- equamax (orthogonal rotation)
5.2 查看因子方差-get_communalities()
查看公因子方差
# 公因子方差
faa_two.get_communalities()
查看每个变量的公因子方差数据
pd.DataFrame(faa_two.get_communalities(),index=df.columns)
5.3 查看旋转后的特征值
faa_two.get_eigenvalues()
pd.DataFrame(faa_two.get_eigenvalues())
5.4 查看成分矩阵
查看它们构成的成分矩阵:
# 变量个数*因子个数
faa_two.loadings_
如果转成DataFrame格式,index就是我们的变量,columns就是指定的因子factor。转DataFrame格式后的数据:
pd.DataFrame(faa_two.loadings_,index=df.columns)
5.5 查看因子贡献率
通过理论部分的解释,我们发现每个因子都对变量有一定的贡献,存在某个贡献度的值,在这里查看3个和贡献度相关的指标:
- 总方差贡献:variance (numpy array) – The factor variances
- 方差贡献率:proportional_variance (numpy array) – The proportional factor variances
- 累积方差贡献率:cumulative_variances (numpy array) – The cumulative factor variances
我们来看一下总方差贡献吧
faa_two.get_factor_variance()
6.隐藏变量可视化
为了更直观地观察每个隐藏变量和哪些特征的关系比较大,进行可视化展示,为了方便取上面相关系数的绝对值:
df1 = pd.DataFrame(np.abs(faa_two.loadings_),index=df.columns)
print(df1)
然后我们通过热力图将系数矩阵绘制出来:
plt.figure(figsize = (14,14))
ax = sns.heatmap(df1, annot=True, cmap="BuPu")
# 设置y轴字体大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")
# 设置y轴标签
plt.ylabel("Sepal Width", fontsize="xx-large")
# 显示图片
plt.show()
# 保存图片
# plt.savefig("factorAnalysis", dpi=500)
到此这篇关于python因子分析的实例的文章就介绍到这了,更多相关python 因子分析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!