因子分析模型 - 因子分析法原理与代码实现 -(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

结论

本节带领大家了解了一下,因子分析。通过因子分析主要发掘变量背后存在的潜变量。并且提到了主成分分析与因子分析的不同,主成分分析主要是想寻找原始特征的一个线性组合。这个组合方差要最大。方差最大保证了主要成分的提取。为了计算方便,提出了一些假设,使得主成分分析成为了一个约束优化问题。而因子分析呢,是从假设开始入手,假设原始特征是由于因子的影响产生的,因此可以写出,从这个表达式逐步进行假设求解。当然呢,主成分分析和因子分析有相似的地方,主要就是求解过程中,都很巧妙地和特征值,特征向量挂起关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将两个DateTimePicker的日期和时间组合成一个值

有两个DateTimePicker&#xff0c;DateTimePicker1用于选择日期&#xff0c;DateTimePicker2用于选择Time&#xff0c;现在需要将两个DateTimePicker的值组合成一个DateTime使用。 方法&#xff1a; 1: DateTime dtTime Convert.ToDateTime(dateTimePicker1.Value.ToShortDate…

LeetCode 1255. 得分最高的单词集合(回溯)

1. 题目 你将会得到一份单词表 words&#xff0c;一个字母表 letters &#xff08;可能会有重复字母&#xff09;&#xff0c;以及每个字母对应的得分情况表 score。 请你帮忙计算玩家在单词拼写游戏中所能获得的「最高得分」&#xff1a;能够由 letters 里的字母拼写出的 任…

推荐几个网站 - (可视化、博客、社区、学习网站)

------------------------------------------------------------------------------------------------------------- 作者&#xff1a;Mf是个大坏蛋 原文&#xff1a;https://blog.csdn.net/destinymf/article/details/81186452 ----------------------------------------…

对Java注解(Annotation)初步的认识

----------------------android培训、java培训、期待与您交流&#xff01; ---------------------- 为注解增加属性 例如&#xff1a; import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;Retention(RetentionPolicy.RUNTIME)public interfac…

LeetCode 789. 逃脱阻碍者(曼哈顿距离)

1. 题目 你在进行一个简化版的吃豆人游戏。 你从 (0, 0) 点开始出发&#xff0c;你的目的地是 (target[0], target[1]) 。地图上有一些阻碍者&#xff0c;第 i 个阻碍者从 (ghosts[i][0], ghosts[i][1]) 出发。 每一回合&#xff0c;你和阻碍者们可以同时向东&#xff0c;西&…

ACDSee Photo Manager 12 中文绿色版

用WinRAR解压即玩&#xff0c;无需安装。可以拷贝到USB硬盘&#xff0c;便于携带 凭借易于使用且速度极快的特点&#xff0c;ACDSee 12提供了整理相片、优化拍摄以及与亲朋好友分享往事所需的全部功能。 幻灯片浏览 支持幻灯片浏览图片&#xff0c;并支持背景音乐和多种多样的图…

排序算法 - 6种 - 超炫的动画演示 - Python实现

1.冒泡排序 思路&#xff1a;遍历列表&#xff0c;每一轮每次比较相邻两项&#xff0c;将无序的两项交换&#xff0c;下一轮遍历比前一轮比较次数减1。 def bubble_sort(a_list):for passnum in range(len(a_list)-1, 0, -1):for i in range(passnum):if a_list[i] > a_list…

LeetCode 565. 数组嵌套

1. 题目 索引从0开始长度为N的数组A&#xff0c;包含0到N - 1的所有整数。 找到最大的集合S并返回其大小&#xff0c;其中 S[i] {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则。 假设选择索引为i的元素A[i]为S的第一个元素&#xff0c;S的下一个元素应该是A[A[i]]&…

因子分析模型 - Python 做因子分析简直比 SPSS 还简单 - ( Python、SPSS)

为什么&#xff1f; SPSS 那么简单还免费&#xff0c;为什么还要用 Python 做因子分析&#xff08;factor analysis&#xff09;呢&#xff1f;工作狗表示&#xff0c;建模的目的是要卖钱的&#xff0c;也就是要嵌入到公司开发的产品上去&#xff0c;用 Python 写因子分析&…

缺失值处理 - 拉格朗日插值法 - Python代码

目录 缺失值处理 拉格朗日差值法的理论基础 拉格朗日插值法代码实现 其他数据预处理方法 缺失值处理 处理缺失值常用的办法可分为三类&#xff1a;删除记录、数据插补、不处理。 其中常见的数据插补法有&#xff1a; 如果通过删除小部分的数据就可以达到既定的目标&#…

做po_requisitions_interface_all接口开发问题

po_requisitions_interface_all这个接口表的字段charge_account_id来源于: 1、组织参数的Material Account 2、工单类型的Outside Processing Account 转载于:https://www.cnblogs.com/songdavid/archive/2011/09/19/2181757.html

[Hands On ML] 3. 分类(MNIST手写数字预测)

文章目录1. 数据预览2. 数据集拆分3. 二分类4. 性能评估4.1 交叉验证4.2 准确率、召回率4.3 受试者工作特征&#xff08;ROC&#xff09;曲线5. 多分类6. 误差分析6.1 检查混淆矩阵本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 …

支持向量机 - 从原理到算法的实现

思想&#xff1a;寻找能够成功分开两类样本并且具有最大分类间隔的最优超平面。 1.原理解析 空间中任何一个平面的方程都可以表示为wxb 0,如上图&#xff0c;设最优超平面方程H为wxb0,支持向量x-到H的距离为,要使分类间隔最大&#xff0c;即该距离最大&#xff0c;而该距离只与…

Struts2初始化过程代码分析

根据web.xml的配置 调用FilterDispatcher.init(FilterConfig filterConfig) 1. 创建org.apache.struts2.Dispatcher&#xff0c;并调用init()方法 1.1. 创建com.opensymphony.xwork2.config.ConfigurationManager,其中属性List<ContainerProvider> containerProviders存放…

LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)

1. 题目 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。 请你返回元素总和小于或等于阈值的正方形区域的最大边长&#xff1b; 如果没有这样的正方形区域&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[…

从这十大算法开始学习机器学习与建模

本文介绍了机器学习新手需要了解的 10 大算法&#xff0c;包括线性回归、Logistic 回归、朴素贝叶斯、K 近邻算法等。 在机器学习中&#xff0c;有一种叫做「没有免费的午餐」的定理。简而言之&#xff0c;它指出没有任何一种算法对所有问题都有效&#xff0c;在监督学习&…

SQL Server中行列转换 Pivot UnPivot

PIVOT用于将列值旋转为列名&#xff08;即行转列&#xff09;&#xff0c;在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是&#xff1a;PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法&#xff1a; table_source PIVOT( 聚合函数&#xff08;value_col…

LeetCode 835. 图像重叠

1. 题目 给出两个图像 A 和 B &#xff0c;A 和 B 为大小相同的二维正方形矩阵。&#xff08;并且为二进制矩阵&#xff0c;只包含0和1&#xff09;。 我们转换其中一个图像&#xff0c;向左&#xff0c;右&#xff0c;上&#xff0c;或下滑动任何数量的单位&#xff0c;并把…

数据标准化 - scale() - Python代码

标准化 去均值&#xff0c;方差规模化 数据分析的过程中&#xff0c;比如线性规划这一类的分析&#xff0c;如果有些特征的数值远远高于或低于其他数值&#xff0c;通常称之为独立点、异常值或噪点&#xff0c;那么对于受噪点影响较大的模型就无法正确地去学习其他特征。 St…

LeetCode 813. 最大平均值和的分组(DP)

1. 题目 我们将给定的数组 A 分成 K 个相邻的非空子数组 &#xff0c;我们的分数由每个子数组内的平均值的总和构成。 计算我们所能得到的最大分数是多少。 注意我们必须使用 A 数组中的每一个数进行分组&#xff0c;并且分数不一定需要是整数。 示例: 输入: A [9,1,2,3,9…