因子分析模型 - 因子分析法原理与代码实现 -(Python,R)
因子分析基本思想
和主成分分析相似,首先从原理上说,主成分分析是试图寻找原有自变量的一个线性组合,取出对线性关系影响较大的原始数据,作为主要成分。
因子分析,是假设所有的自变量可以通过若干个因子(中间量)被观察到。什么意思呢,举个例子,比如一个学生的考试成绩,语文80,数学95,英语79,物理97,化学94 ,那么我们认为这个学生理性思维较强,语言组织能力较弱。其中理性思维和语言组织能力就是因子。通过这两个因子,我们能够观察到他的偏理科的成绩较高,偏文科的成绩较低。这就是因子分析,通过这点,大家就可以感受到,因子分析和主成分分析是明显不一样的。
因子分析又存在两个方向,一个是探索性因子分析(exploratory factor analysis)。另一个是验证性因子分析(confirmatory factor analysis)。探索性因子分析是不确定一堆自变量背后有几个因子,我们通过这种方法试图寻找到这几个因子。而验证性因子分析是已经假设自变量背后有几个因子,试图通过这种方法去验证一下这种假设是否正确。验证性因子分析又和结构方程模型有很大关系。后面我们会专门的介绍,今天先介绍探索性因子分析。
数学推导
基于 Python 的因子分析
数据是来自行业的10 个相关指标,通过因子分析提取出一些反应不同特征的因子出来。最后根据因子对行业进行排名。
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
from factor_analyzer import FactorAnalyzerdatafile = u'D:\\pythondata\\textdata.xlsx'
data = pd.read_excel(datafile)
data = data.fillna(0)#用0填充空值fa = FactorAnalyzer()
fa.analyze(data, 5, rotation=None)#固定公共因子个数为5个
print("公因子方差:\n", fa.get_communalities())#公因子方差
print("\n成分矩阵:\n", fa.loadings)#成分矩阵
var = fa.get_factor_variance()#给出贡献率
print("\n解释的总方差(即贡献率):\n", var)fa_score = fa.get_scores(data)#因子得分
fa_score.head()#将各因子乘上他们的贡献率除以总的贡献率,得到因子得分中间值
a = (fa.get_scores(data)*var.values[1])/var.values[-1][-1]#将各因子得分中间值相加,得到综合得分
a['score'] = a.apply(lambda x: x.sum(), axis=1)
基于R的因子分析
数据是来自上市公司的财务指标,因此想通过因子分析将财务指标进降维,希望提取出一些反应不同特征的因子出来。最后根据因子对上市公司进行排名。
#设置路径
setwd('D:/Rdata')
#清除空间变量
rm(list = ls())
#载入读取excel的包
library(readxl)
library(psy) #读取数据
dat.fact <- read_excel(file='MicEcoData.xlsx')
head(dat.fact)
# A tibble: 6 x 8资产负债率 总资产增长率B 基本每股收益增长率B 净利润增长率B 营业利润增长率B 每股收益 每股营业收入<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.950996 0.324008 0.044776 0.026753 0.056436 0.7000 2.054515
2 0.552744 0.473920 0.315789 0.773855 0.799483 0.2500 0.379673
3 0.068507 1.966211 0.417778 1.195843 1.199118 0.1276 0.251927
4 0.580620 0.338351 1.479791 2.792940 2.749402 0.1902 0.296074
5 0.389105 0.083378 -0.250000 -0.224369 -0.177181 0.0600 0.153072
6 0.755508 0.061588 -0.444444 0.435094 0.435804 0.0500 0.206344
# ... with 1 more variables: 销售净利率 <dbl>
#重新命个名
names(dat.fact) <- paste('x', 1:ncol(dat.fact), sep='')
#进行因子分析,设置因子个数为两个
factor.result <- factanal(x=dat.fact, factor=2, scores="regression")
#查看图
psy::scree.plot(dat.fact)
#查看因子分析的各种结果
names(factor.result)[1] "converged" "loadings" "uniquenesses" "correlation" "criteria" "factors" [7] "dof" "method" "rotmat" "scores" "STATISTIC" "PVAL"
[13] "n.obs" "call"
print(factor.result)Call:
factanal(x = dat.fact, factors = 2, scores = "regression")Uniquenesses:x1 x2 x3 x4 x5 x6 x7 x8
0.508 0.005 0.005 0.005 0.005 0.281 0.507 0.710 Loadings:Factor1 Factor2
x1 0.695
x2 0.997
x3 0.997
x4 0.998
x5 0.998
x6 0.846
x7 0.702
x8 0.251 -0.476 Factor1 Factor2
SS loadings 4.054 1.931
Proportion Var 0.507 0.241
Cumulative Var 0.507 0.748Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 357.17 on 13 degrees of freedom.
The p-value is 2.4e-68
>
现在经过因子分析已经将原来的8个财务指标进行合并,形成了两个因子,那么这两个因子按照加权合并,就形成了一个指标,通过对这一个指标进行排序,就可以得到上市公司的排名。下面是代码实现 :
# 计算权重
lambdas <- eigen(factor.result$correlation)$value # 就是特指值所占的比例
(w <- lambdas[1:2]/sum(lambdas[1:2]))0.6391052 0.3608948#计算因子得分
score <- factor.result$scores
eva <- score %*% w # 进行排序 eva[,1][1,] 0.44919649[2,] -0.21418681[3,] -0.47822650[4,] -0.22218907[5,] -0.45469601[6,] -0.31123904[7,] -0.33324507[8,] -0.31634880[9,] 0.16510054
[10,] 0.19619702
结论
本节带领大家了解了一下,因子分析。通过因子分析主要发掘变量背后存在的潜变量。并且提到了主成分分析与因子分析的不同,主成分分析主要是想寻找原始特征的一个线性组合。这个组合方差要最大。方差最大保证了主要成分的提取。为了计算方便,提出了一些假设,使得主成分分析成为了一个约束优化问题。而因子分析呢,是从假设开始入手,假设原始特征是由于因子的影响产生的,因此可以写出,从这个表达式逐步进行假设求解。当然呢,主成分分析和因子分析有相似的地方,主要就是求解过程中,都很巧妙地和特征值,特征向量挂起关系。
因子分析模型 - 因子分析法原理与代码实现 -(Python,R)相关推荐
- 【数学建模】MATLAB应用实战系列(七十九)-因子分析法(附MATLAB 和Python代码实现)
前言 因子分析法和主成分分析法有很多类似之处.因子分析的主要目的是用来描述隐藏在一组测量到的变量中的一些更基本的,但又无法直接测量到的隐性变量.因子分析法也可以用来综合评价. 其主要思路是利用研究指标 ...
- 常见算法详解(原理及代码实现Python版本)
文章目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 7.二分法查找 总结 前言 最近复习了下常见的算法,在这里手动再写一遍,权当加深自己的印象.代码实现 ...
- 因子分析 factor analysis (七) :因子分析法与主成分分析的异同
因子分析系列博文: 因子分析 factor analysis (一 ):模型的理论推导 因子分析 factor analysis (二 ) : 因子分析模型 因子分析 factor analysis ...
- [LK光流法,disflow using Dense Inverse Search, VariationalRefinement变分优化 原理和代码]
文章目录 1.Fast Optical Flow using Dense Inverse Search 1.1 W的含义: 1.2 LK光流模型 1.3 LK光流模型求解(不含迭代) 1.4 LK光流 ...
- 数学建模笔记(十五):多元统计分析及R语言建模(判别分析、聚类分析、主成分分析、因子分析,含数据代码注释,均可供运行)
文章目录 一.多元数据的数学表达 1.多元分析资料的一般格式与矩阵化表示 2.数据特征(一元数据与多元数据的均值和方差) 二.R软件基本使用 1.向量创建(c函数) 2.行列合并(rbind,cbin ...
- 重磅综述:三万字长文读懂单细胞RNA测序分析的最佳实践教程 (原理、代码和评述)
原文链接: https://www.embopress.org/doi/10.15252/msb.20188746 主编评语 这篇文章最好的地方不只在于推荐了工具,提供了一套分析流程,更在于详细介绍了 ...
- PRI变换法原理解析及其matlab分析
---------------------------------------------------------------------------------------------------- ...
- 机器学习-特征抽取(主成分分析法/因子分析法/非负矩阵因子分解NMF算法)
1.特征抽取: 特征抽取是机器学习中另一种十分有用的方法,它与特性选择不同,特征抽取是对数据的特征进行概括和总结,而特性选择则主要是对数据中的不同特征进行比较和选取. 特征抽取是机器学习技术中的一个常 ...
- 因子分析模型(清风建模学习笔记)
简介:因子分析可以看成是主成分分析的推广与发展.因子分析法通过研究变量间的相关系数矩阵,把这些变量间错综复杂的关系归结成少数几个综合因子,由于归结出的因子个数少于原始变量的个数,但是它们又包含原始变量 ...
- 素因子分解法的优化代码
之前介绍了用素因子分解法求gcd.lcm,当时对素因数分解法的代码没有进行优化,这一期将这个素因数分解法的代码进行一步优化让时间复杂度最坏情况下降为O()即n本身为质数,不进入内循环但是外循环枚举到, ...
最新文章
- 公开课 | 人脸识别的最新进展以及工业级大规模人脸识别实践探讨
- 2021语言与智能技术竞赛上线!百度飞桨提供平台算力支持
- Spring IOC 之 加载 Bean
- input的readonly属性与TextBox的ReadOnly和Enabled属性区别
- Spark微博人口流动分析(1)
- 第三方免费开放API 获取用户IP 并查询其地理位置
- 『设计模式』小伙你的穿搭很潮!--装饰者模式
- LeetCode 2125. 银行中的激光束数量
- android自定义通知栏图标大小,Android不使用自定义布局情况下实现自定义通知栏图标的方法...
- python 三维图片 任意切片_在python中实现将一张图片剪切成四份的方法
- JSON.parse和eval的区别
- 计算机科学与技术的班会,计算机科学与技术学院2014级信管三班班会
- 堆排序算法知识点总结
- 您的php似乎没有安装运行wordpress所必需的mysql扩展_“您的 PHP 似乎没有安装运行 WordPress 所必需的 MySQL 扩展”处理方法...
- vscode 脑图插件mindmap
- rockchip 瑞芯微 SDK 一些解释
- python 百分号调用内置函数_打牢Python基础这12类内置函数你掌握了吗
- catboost 的实例应用附带特征重要度打印
- oracle冲账语句_ORA-00xx问题 -oracle卸载不成功
- 以后我给你们上课的机会可能越来越少了