1. 程式人生 > >資料建模 - 因子分析法原理

資料建模 - 因子分析法原理

因子分析基本思想

    和主成分分析相似,首先從原理上說,主成分分析是試圖尋找原有自變數的一個線性組合,取出對線性關係影響較大的原始資料,作為主要成分。

    因子分析,是假設所有的自變數可以通過若干個因子(中間量)被觀察到。什麼意思呢,舉個例子,比如一個學生的考試成績,語文80,數學95,英語79,物理97,化學94 ,那麼我們認為這個學生理性思維較強,語言組織能力較弱。其中理性思維和語言組織能力就是因子。通過這兩個因子,我們能夠觀察到他的偏理科的成績較高,偏文科的成績較低。這就是因子分析,通過這點,大家就可以感受到,因子分析和主成分分析是明顯不一樣的。

    因子分析又存在兩個方向,一個是探索性因子分析(exploratory factor analysis)。另一個是驗證性因子分析(confirmatory factor analysis)。探索性因子分析是不確定一堆自變數背後有幾個因子,我們通過這種方法試圖尋找到這幾個因子。而驗證性因子分析是已經假設自變數背後有幾個因子,試圖通過這種方法去驗證一下這種假設是否正確。驗證性因子分析又和結構方程模型有很大關係。後面我們會專門的介紹,今天先介紹探索性因子分析。

數學推導

 

基於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.748

Test 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

結論

本節帶領大家瞭解了一下,因子分析。通過因子分析主要發掘變數背後存在的潛變數。並且提到了主成分分析與因子分析的不同,主成分分析主要是想尋找原始特徵的一個線性組合。這個組合方差要最大。方差最大保證了主要成分的提取。為了計算方便,提出了一些假設,使得主成分分析成為了一個約束優化問題。而因子分析呢,是從假設開始入手,假設原始特徵是由於因子的影響產生的,因此可以寫出,從這個表示式逐步進行假設求解。當然呢,主成分分析和因子分析有相似的地方,主要就是求解過程中,都很巧妙地和特徵值,特徵向量掛起關係。