編輯導語:作為多元統計分析裏的降維方法之一,因子分析可以應用於多個場景、如調研、數據建模等場景之中。本篇文章裏,作者就對因子分析做了詳細介紹,對其原理邏輯、用途及代碼實現過程進行了相關展示,讓我們來看一下。
數據分析中,主成分分析(PCA)是被大家熟知的數據降維方法。而因子分析和主成分分析是非常相似的兩種方法,他們都屬於多元統計分析裏的降維方法。但因子分析最大的優點就是:對新的因子能夠進行命名和解釋,使因子具有可解釋性。
因此,因子分析可以作為「需要滿足可解釋性數據建模」的前期數據降維的方法。下文會介紹因子分析的原理邏輯、用途以及Python代碼的實現過程。
一、什麼是因子分析?因子分析的起源是這樣的,1904年英國的一個心理學家發現學生的英語、法語和古典語成績非常有相關性,他認為這三門課程背後有一個共同的因素驅動,最後將這個因素定義為“語言能力”。基於這個想法,發現很多相關性很高的因素背後有共同的因子驅動,從而定義了因子分析。
因子分析在經濟學、心理學、語言學和社會學等領域經常被用到,一般會探索出背後的影響因素如:語言能力、智力、理解力等。這些因素都是無法直接計算,而是基於背後的調研數據所推算出的公共因子。
因此概括下,因子分析就是將存在某些相關性的變量提煉為較少的幾個因子,用這幾個因子去表示原本的變量,也可以根據因子對變量進行分類。
舉個例子。學生有語文、英語、歷史、數學、物理、化學六門成績,通過因子分析會發現這六門課由兩個公共因子驅動,前三門是由“文科”因子,後三門是“理科”因子;從而可以計算每個學生的文科得分和理科得分來評估他在兩個方面的表現。
二、因子分析可以解決什麼問題?1. 在多變量場景下,挖掘背後影響因子比如在企業和品牌調研中,消費者會調查很多問題來評估企業品牌。對這些問題通過因子分析可以刻畫出背後少量的潛在影響因素,比如服務質量、商品質量等等。
2. 用於數學建模前的降維因子分析和主成分分析都可用於降維。但因子分析的優點是,因子作為新的解釋變量去建模,有更好的解釋性。
因此對於有些需要業務解釋的數據建模,可以在建模前通過因子分析提取關鍵因子,再用因子得分為解釋變量,通過迴歸或者決策樹等分類模型去建模。
三、算法實現步驟首先需要注意的是,和主成分分析一樣,兩種方法的目的都是降維,所以兩種方法的前提假設都是:特徵之間不是完全互相交互。
因子分析是尋找不線性相關的“變量”的線性組合來表示原始變量,這些“變量”稱為因子,如下圖中的F就是因子,X是原始變量,eps是原始變量不可被公共因子表示的部分。
以上的公式還需要滿足:
- 要求因子的數據小於原始變量的數量,即m≤p;
- 因子F之間是相互獨立且方差為1;
- 因子F和eps之間的相關性為0,eps之間相關性為0。
因此,因子分析的過程就是實現以下幾個目的的過程:
- 求解方程中的因子F的係數;
- 給予因子F實際的解釋;
- 展示原始特徵和公共因子之間的關係,從而實現降維和特徵分類等目的。
求解方程的過程,就是分析變量的相關係數矩陣,從而找到少數幾個隨機變量去描述所有變量。又因為求解的不唯一性,最後通常會對因子的載荷矩陣做一次正交旋轉,目的是為了方便理解每個因子的意義。
彙總一下:對於因子分析的實操可以提煉為以下幾個步驟。
1)充分性檢驗
- 目的:檢驗變量之間是否存在相關性,從而判斷是否適合做因子分析;
- 方法:抽樣適合性檢驗(KMO檢驗)或者 巴特利特檢驗(Bartlett’s Test)。
2)選擇因子個數
- 目的:通過數據定義最合適的潛在公共因子個數,這個決定後面的因子分析效果;
- 方法:Kaiser”s準則 或者 累積貢獻率原則。
3)提取公共因子並做因子旋轉
提取公共因子就是上面提到的求解函數的過程,一般求解方法有:主成分法、最大似然法、殘差最小法等等。
因子旋轉的原因是提取公共因子的解有很多,而因子旋轉後因子載荷矩陣將得到重新分配,可以使得旋轉後的因子更容易解釋。常用的方法是方差最大法。
4)對因子做解釋和命名
- 目的:解釋和命名其實是對潛在因子理解的過程;這一步非常關鍵,需要非常瞭解業務才可。這也是我們使用因子分析的主要原因。
- 方法:根據因子載荷矩陣發現因子的特點。
5)計算因子得分
對每一樣本數據,得到它們在不同因子上的具體數據值,這些數值就是因子得分。
四、案例講解數據集介紹:美國洛杉磯2000年街區普查數據,共有110個街區,15個變量,變量具體情況見下表。
想分析影響不同街區下人口分佈的潛在因子。
1. 第一步:數據預處理和分析新增“人口密度”特徵,刪除特徵人口量、面積、經度和維度。
import pandas as pd
import numpy as np
LA_data = pd.read_csv(‘LA.Neighborhoods.csv’)
#新增人口密度,去掉人口量、面積、經度和維度
LA_data[‘density’] = LA_data[‘Population’]/LA_data[‘Area’]
LA_data_final = LA_data.drop([‘Population’,’Area’,’Longitude’,’Latitude’],axis=1)
LA_data_final_feat = LA_data_final.drop([‘LA_Nbhd’],axis=1)
2. 第二步:因子分析——充分性檢驗巴特利特P值小於0.01,KMO值大於0.6;説明此數據適合做因子分析。
3. 第三步:因子個數確定特徵值大於1的因子數有2個,且兩個因子的累計方差有68%;因此確定因子個數為2個。
from factor_analyzer import FactorAnalyzer
fa = FactorAnalyzer(LA_data_final_feat.shape[1]+1, rotation=None)
fa.fit(LA_data_final_feat)
ev, v = fa.get_eigenvalues # 計算特徵值和特徵向量
var=fa.get_factor_variance#給出方差貢獻率
4. 第四步:做因子分析調用因子分析函數,並得到因子載荷矩陣;從載荷矩陣可以看到,第一個因子和收入、有房家庭比例、復員軍人比例及歐裔比例成正相關;第二個因子和非裔比例成正相關,反而和收入及有房比例等成負相關。
fa = FactorAnalyzer(2, rotation=”varimax”)fa.fit(LA_data_final_feat)# 輸出載荷矩陣df_loading=pd.DataFrame(fa.loadings_,index=LA_data_final_feat.columns.tolist)df_loading
5. 第五步:計算因子得分其中因子1得分越大表示:收入、有房家庭比例、復員軍人比例及歐裔比例更高;因子2得分高表示:非裔人羣比例更高。
綜上,以上就是本文要介紹的全部內容。
因子分析在互聯網數據分析場景下用到的比較少,主要原因就是很多人不知道怎麼用?不知道用到哪裏?希望看完文章的你能初步瞭解因子分析,能知道下面幾個問題的答案(不記得就回頭看上面的介紹分享哦)。
- 什麼是因子分析?
- 因子分析可以解決什麼問題?
- 因子分析的算法邏輯和分析流程是什麼?
- Python代碼如何實現?
作者:須臾即永恆;公眾號:須臾即永恆;
本文由 @須臾即永恆 原創發佈於人人都是產品經理。未經許可,禁止轉載
題圖來自Unsplash,基於CC0協議