資料建模 - 因子分析法原理
因子分析基本思想
和主成分分析相似,首先從原理上說,主成分分析是試圖尋找原有自變數的一個線性組合,取出對線性關係影響較大的原始資料,作為主要成分。
因子分析,是假設所有的自變數可以通過若干個因子(中間量)被觀察到。什麼意思呢,舉個例子,比如一個學生的考試成績,語文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
結論
本節帶領大家瞭解了一下,因子分析。通過因子分析主要發掘變數背後存在的潛變數。並且提到了主成分分析與因子分析的不同,主成分分析主要是想尋找原始特徵的一個線性組合。這個組合方差要最大。方差最大保證了主要成分的提取。為了計算方便,提出了一些假設,使得主成分分析成為了一個約束優化問題。而因子分析呢,是從假設開始入手,假設原始特徵是由於因子的影響產生的,因此可以寫出,從這個表示式逐步進行假設求解。當然呢,主成分分析和因子分析有相似的地方,主要就是求解過程中,都很巧妙地和特徵值,特徵向量掛起關係。