最近看了很多的關(guān)于因子分析的資料,整理出這篇理論+實(shí)戰(zhàn)文章分享給大家。
后續(xù)會(huì)出一篇PCA主成分分析的文章,將主成分分析和因子分析兩種降維的方法進(jìn)行對(duì)比。
作為多元統(tǒng)計(jì)分析里的降維方法之一,因子分析可以應(yīng)用于多個(gè)場(chǎng)景,如調(diào)研、數(shù)據(jù)建模等場(chǎng)景之中。
因子分析的起源是這樣的:1904年英國(guó)的一個(gè)心理學(xué)家發(fā)現(xiàn)學(xué)生的英語(yǔ)、法語(yǔ)和古典語(yǔ)成績(jī)非常有相關(guān)性,他認(rèn)為這三門課程背后有一個(gè)共同的因素驅(qū)動(dòng),最后將這個(gè)因素定義為“語(yǔ)言能力”。
基于這個(gè)想法,發(fā)現(xiàn)很多相關(guān)性很高的因素背后有共同的因子驅(qū)動(dòng),從而定義了因子分析,這便是因子分析的由來(lái)。
我們?cè)偻ㄟ^(guò)一個(gè)更加實(shí)際的例子來(lái)理解因子分析的基本思想:
現(xiàn)在假設(shè)一個(gè)同學(xué)的數(shù)學(xué)、物理、化學(xué)、生物都考了滿分,那么我們可以認(rèn)為這個(gè)學(xué)生的理性思維比較強(qiáng),在這里理性思維就是我們所說(shuō)的一個(gè)因子。在這個(gè)因子的作用下,偏理科的成績(jī)才會(huì)那么高。
到底什么是因子分析?就是假設(shè)現(xiàn)有全部自變量x的出現(xiàn)是因?yàn)槟硞€(gè)潛在變量的作用,這個(gè)潛在的變量就是我們說(shuō)的因子。在這個(gè)因子的作用下,x能夠被觀察到。
因子分析就是將存在某些相關(guān)性的變量提煉為較少的幾個(gè)因子,用這幾個(gè)因子去表示原本的變量,也可以根據(jù)因子對(duì)變量進(jìn)行分類。
因子分子本質(zhì)上也是降維的過(guò)程,和主成分分析(PCA)算法比較類似。
因子分析又分為兩種:
假設(shè)有p個(gè)原始的變量,它們之間可能獨(dú)立也可能相關(guān)。將標(biāo)準(zhǔn)化后得到新的變量,我們可以建立如下的因子分析模型:
其中,我們可以定義以下幾個(gè)術(shù)語(yǔ):公共因子、特殊因子、載荷因子、載荷矩陣
1、第一點(diǎn):出現(xiàn)在每個(gè)變量的式子中且m<p,稱之為公共因子
2、第二點(diǎn):僅僅與變量相關(guān),稱之為特殊因子
3、第三點(diǎn):系數(shù)稱之為載荷因子
4、第四點(diǎn):稱之為載荷矩陣
上面的式子可以表示為:
同時(shí)也就滿足:
我們通常需要對(duì)上述模型的進(jìn)行假設(shè):
1.各個(gè)特殊因子以及特殊因子和公共因子之間相互獨(dú)立,即滿足:
2、各公共因子都是均值為0、方差為1的獨(dú)立正態(tài)隨機(jī)變量,其協(xié)方差矩陣為單位矩陣,即
3、m個(gè)公共因子對(duì)第i個(gè)變量方差的貢獻(xiàn)稱之為第i貢獻(xiàn)度,記為
4、特殊因子的方差稱之為特殊方差或者特殊值()
5、第i個(gè)變量的方差分解為:
具體的模型推導(dǎo)過(guò)程:https://blog.csdn.net/qq_29831163/article/details/88901245
關(guān)于因子載荷矩陣的幾個(gè)重要性質(zhì):
1、因子載荷是第i個(gè)變量與第j個(gè)公共因子的相關(guān)系數(shù),反映的是第i個(gè)變量和第j個(gè)公共因子之間的重要性。絕對(duì)值越大,表示相關(guān)性的密切程度越高。
2、貢獻(xiàn)度的統(tǒng)計(jì)意義
說(shuō)明:變量的貢獻(xiàn)度就是因子載荷矩陣的第i行的元素的平方和
上式兩邊同時(shí)求方差:
也就是:
可以看出來(lái):公共因子和特殊因子對(duì)變量的貢獻(xiàn)度之和為1。如果非常接近1,則非常小,則因子分析的效果非常好。
3、公共因子方差貢獻(xiàn)的統(tǒng)計(jì)意義
因子載荷矩陣中各列元素的平方和 成為對(duì)所有的的方差貢獻(xiàn)和,衡量的相對(duì)重要性。
應(yīng)用因子分析法的主要步驟如下:
利用Python進(jìn)行因子分析的核心庫(kù)是:factor_analyzer
pip install factor_analyzer
這個(gè)庫(kù)主要有兩個(gè)主要的模塊需要學(xué)習(xí):
官網(wǎng)學(xué)習(xí)地址:https://factor-analyzer.readthedocs.io/en/latest/factor_analyzer.html
下面通過(guò)一個(gè)案例來(lái)講解如何進(jìn)行因子分析。
本文中使用的數(shù)據(jù)是公開(kāi)的數(shù)據(jù)集,下面是數(shù)據(jù)的介紹和下載地址:
這個(gè)數(shù)據(jù)集收集了2800個(gè)人關(guān)于人格的25個(gè)問(wèn)題。同時(shí)這些數(shù)據(jù)和隱藏的5個(gè)特征相關(guān),
Big Five Model is widely used nowadays, the five factors include: neuroticism,extraversion,openness to experience,agreeableness and conscientiousness.
4.2特征關(guān)系
特征之間的對(duì)應(yīng)關(guān)系為:
事先我們并不知道這些隱形變量的對(duì)應(yīng)關(guān)系,所以想要通過(guò)因子分析來(lái)找到25個(gè)變量后面的隱藏變量。下面開(kāi)始進(jìn)行因子分析的實(shí)戰(zhàn)過(guò)程:
導(dǎo)入數(shù)據(jù)處理和分析所需要的庫(kù):
# 數(shù)據(jù)處理
import pandas as pd
import numpy as np
# 繪圖
import seaborn as sns
import matplotlib.pyplot as plt
# 因子分析
from factor_analyzer import FactorAnalyzer
首先我們先導(dǎo)進(jìn)數(shù)據(jù):總共是2800條數(shù)據(jù),28個(gè)特征屬性
df = pd.read_csv('bfi.csv', index_col=0).reset_index(drop=True)
df
查看下數(shù)據(jù)的缺失值情況:大部分的字段都是存在缺失值的
數(shù)據(jù)預(yù)處理包含去除3個(gè)無(wú)效的字段(對(duì)分析沒(méi)有任何作用:age、gender、education),同時(shí)去掉存在空值的數(shù)據(jù):
# 去掉無(wú)效字段
df.drop(['gender','education','age'],axis=1,inplace=True)
# 去掉空值
df.dropna(inplace=True)
在進(jìn)行因子分析之前,需要先進(jìn)行充分性檢測(cè),主要是檢驗(yàn)相關(guān)特征陣中各個(gè)變量間的相關(guān)性,是否為單位矩陣,也就是檢驗(yàn)各個(gè)變量是否各自獨(dú)立。通常是兩種方法:
檢驗(yàn)總體變量的相關(guān)矩陣是否是單位陣(相關(guān)系數(shù)矩陣對(duì)角線的所有元素均為1,所有非對(duì)角線上的元素均為零);即檢驗(yàn)各個(gè)變量是否各自獨(dú)立。
如果不是單位矩陣,說(shuō)明原變量之間存在相關(guān)性,可以進(jìn)行因子分子;反之,原變量之間不存在相關(guān)性,數(shù)據(jù)不適合進(jìn)行主成分分析
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value, p_value = calculate_bartlett_sphericity(df)
chi_square_value, p_value
# 結(jié)果
(18170.96635086924, 0.0)
我們發(fā)現(xiàn)統(tǒng)計(jì)量p-value的值為0,表明變量的相關(guān)矩陣不是單位矩陣,即各個(gè)變量之間是存在一定的相關(guān)性,我們就可以進(jìn)行因子分析。
檢查變量間的相關(guān)性和偏相關(guān)性,取值在0-1之間;KOM統(tǒng)計(jì)量越接近1,變量間的相關(guān)性越強(qiáng),偏相關(guān)性越弱,因子分析的效果越好。
Kaiser-Meyer-Olkin (KMO) Test measures the suitability of data for factor analysis. It determines the adequacy for each observed variable and for the complete model.
KMO estimates the proportion of variance among all the observed variable. Lower proportion id more suitable for factor analysis. KMO values range between 0 and 1. Value of KMO less than 0.6 is considered inadequate.
通常取值從0.6開(kāi)始進(jìn)行因子分析
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_all
KMO大于0.6,也說(shuō)明變量之間存在相關(guān)性,可以進(jìn)行分析。
在數(shù)據(jù)說(shuō)明中,我們已經(jīng)知道了這些變量是和5個(gè)隱藏的因子相關(guān)。但是很多情況下,我們并不知道這個(gè)個(gè)數(shù),需要自己進(jìn)行探索。
方法:計(jì)算相關(guān)矩陣的特征值,進(jìn)行降序排列
faa = FactorAnalyzer(25,rotation=None)
faa.fit(df)
# 得到特征值ev、特征向量v
ev,v=faa.get_eigenvalues()
我們將特征值和因子個(gè)數(shù)的變化繪制成圖形:
# 同樣的數(shù)據(jù)繪制散點(diǎn)圖和折線圖
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)
# 顯示圖的標(biāo)題和xy軸的名字
# 最好使用英文,中文可能亂碼
plt.title('Scree Plot')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid() # 顯示網(wǎng)格
plt.show() # 顯示圖形
從上面的圖形中,我們明確地看到:選擇5個(gè)因子是最合適的
我們選擇5個(gè)因子來(lái)進(jìn)行因子分子的建模過(guò)程,同時(shí)指定矩陣旋轉(zhuǎn)方式為:方差最大化
ratation參數(shù)的其他取值情況:
上面執(zhí)行fit建模后,我們查看每個(gè)因子的方差,使用方法:get_communalities()
查看變量的特征值:
現(xiàn)在有25個(gè)變量,5個(gè)隱藏變量(因子),查看它們構(gòu)成的成分矩陣:
如果轉(zhuǎn)成DataFrame格式,index就是我們的25個(gè)變量,columns就是指定的5個(gè)因子factor。轉(zhuǎn)成DataFrame格式后的數(shù)據(jù):
通過(guò)理論部分的解釋,我們發(fā)現(xiàn)每個(gè)因子都對(duì)變量有一定的貢獻(xiàn),存在某個(gè)貢獻(xiàn)度的值,在這里查看3個(gè)和貢獻(xiàn)度相關(guān)的指標(biāo):
為了更直觀地觀察每個(gè)隱藏變量和哪些特征的關(guān)系比較大,進(jìn)行可視化展示,為了方便取上面相關(guān)系數(shù)的絕對(duì)值:
然后我們通過(guò)熱力圖將系數(shù)矩陣?yán)L制出來(lái):
# 繪圖
plt.figure(figsize = (14,14))
ax = sns.heatmap(df1, annot=True, cmap='BuPu')
# 設(shè)置y軸字體大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title('Factor Analysis', fontsize='xx-large')
# 設(shè)置y軸標(biāo)簽
plt.ylabel('Sepal Width', fontsize='xx-large')
# 顯示圖片
plt.show()
# 保存圖片
# plt.savefig('factorAnalysis', dpi=500)
上面我們已經(jīng)知道了5個(gè)因子比較合適,可以將原始數(shù)據(jù)轉(zhuǎn)成5個(gè)新的特征,具體轉(zhuǎn)換方式為:
轉(zhuǎn)成DataFrame格式后數(shù)據(jù)展示效果更好:仍然是2436條數(shù)據(jù),5個(gè)特征(新特征)
至此,我們完成了如下的工作:
1、Factor Analysis:https://www.datasklr.com/principal-component-analysis-and-factor-analysis/factor-analysis
2、多因子分析:https://mathpretty.com/10994.html
3、factor_analyzer package
的官網(wǎng)使用手冊(cè):https://factor-analyzer.readthedocs.io/en/latest/factor_analyzer.html
4、淺談主成分分析和因子分析:https://zhuanlan.zhihu.com/p/37755749
尤而小屋,一個(gè)溫馨的小屋。小屋主人,一手代碼謀求生存,一手掌勺享受生活,歡迎你的光臨
秋招資料領(lǐng)??!
給大家分享一份數(shù)據(jù)分析筆試面試題集合,祝各位還在秋招的小伙伴早日拿下BAT offer。
當(dāng)然也歡迎各位小伙伴進(jìn)入筆試題,第一時(shí)間查收數(shù)據(jù)分析相關(guān)資料!
聯(lián)系客服