python因子分析的實(shí)例
一、起源
因子分析的起源是這樣的:1904年英國(guó)的一個(gè)心理學(xué)家發(fā)現(xiàn)學(xué)生的英語(yǔ)、法語(yǔ)和古典語(yǔ)成績(jī)非常有相關(guān)性,他認(rèn)為這三門(mé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)算法比較類似。
三、算法用途
因子分析法和主成分分析法有很多類似之處。因子分析的主要目的是用來(lái)描述隱藏在一組測(cè)量到的變量中的一些更基本的,但又無(wú)法直接測(cè)量到的隱性變量。因子分析法也可以用來(lái)綜合評(píng)價(jià)。
其主要思路是利用研究指標(biāo)的之間存在一定的相關(guān)性,從而推想是否存在某些潛在的共性因子,而這些不同的潛在的共性因子不同程度地共同影響著研究指標(biāo)。因子分析可以在許多變量中找出隱藏的具有代表性的因子,將共同本質(zhì)的變量歸入一個(gè)因子,可以減少變量的數(shù)目。
四、因子分析步驟
應(yīng)用因子分析法的主要步驟如下:
- 對(duì)所給的數(shù)據(jù)樣本進(jìn)行標(biāo)準(zhǔn)化處理
- 計(jì)算樣本的相關(guān)矩陣R
- 求相關(guān)矩陣R的特征值、特征向量
- 根據(jù)系統(tǒng)要求的累積貢獻(xiàn)度確定主因子的個(gè)數(shù)
- 計(jì)算因子載荷矩陣A
- 最終確定因子模型
五、factor_analyzer庫(kù)
利用Python進(jìn)行因子分析的核心庫(kù)是:factor_analyzer
pip install factor_analyzer
這個(gè)庫(kù)主要有兩個(gè)主要的模塊需要學(xué)習(xí):
- factor_analyzer.analyze(重點(diǎn))
- factor_analyzer.factor_analyzer
官網(wǎng)學(xué)習(xí)地址:factor_analyzer package — factor_analyzer 0.3.1 documentation
六、實(shí)例詳解
數(shù)據(jù)來(lái)源于中國(guó)統(tǒng)計(jì)年鑒。
1.導(dǎo)入庫(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
2.讀取數(shù)據(jù)
df = pd.read_csv("D:\桌面\demo.csv",encoding='gbk') df
輸出:
如果不想要城市那一列的話,可以在讀取的時(shí)候就刪除,也可以后面再刪
比如,讀取時(shí)刪除
df = pd.read_csv("D:\桌面\demo.csv", index_col=0,encoding='gbk').reset_index(drop=True) df
返回:
然后我們查詢一下,數(shù)據(jù)的缺失值情況:
df.isnull().sum()
返回:
然后,我們可以針對(duì)的,對(duì)數(shù)據(jù)進(jìn)行一次處理:
比如刪除無(wú)效字段的那一列
# 去掉無(wú)效字段 df.drop(["變量名1","變量名2","變量名3"],axis=1,inplace=True)
或者,刪除空值
# 去掉空值 df.dropna(inplace=True)
3.充分性檢測(cè)
在進(jìn)行因子分析之前,需要先進(jìn)行充分性檢測(cè),主要是檢驗(yàn)相關(guān)特征陣中各個(gè)變量間的相關(guān)性,是否為單位矩陣,也就是檢驗(yàn)各個(gè)變量是否各自獨(dú)立。
3.1 Bartlett's球狀檢驗(yàn)
檢驗(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
返回:
3.2 KMO檢驗(yàn)
檢查變量間的相關(guān)性和偏相關(guān)性,取值在0-1之間;KOM統(tǒng)計(jì)量越接近1,變量間的相關(guān)性越強(qiáng),偏相關(guān)性越弱,因子分析的效果越好。
通常取值從0.6開(kāi)始進(jìn)行因子分析
#KMO檢驗(yàn) from factor_analyzer.factor_analyzer import calculate_kmo kmo_all,kmo_model=calculate_kmo(df) kmo_model
返回:
通過(guò)結(jié)果可以看到KMO大于0.6,也說(shuō)明變量之間存在相關(guān)性,可以進(jìn)行分析。
4.選擇因子個(gè)數(shù)
方法:計(jì)算相關(guān)矩陣的特征值,進(jìn)行降序排列
4.1 特征值和特征向量
faa = FactorAnalyzer(25,rotation=None) faa.fit(df) # 得到特征值ev、特征向量v ev,v=faa.get_eigenvalues() print(ev,v)
返回:
4.2 可視化展示
將特征值和因子個(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() # 顯示圖形
返回:
從上面的圖形中,我們明確地看到:選擇2或3個(gè)因子就可以了
4.3 可視化中顯示中文不報(bào)錯(cuò)
只需要在畫(huà)圖前,再導(dǎo)入一個(gè)庫(kù)即可,見(jiàn)代碼
import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認(rèn)字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題
5.因子旋轉(zhuǎn)
5.1 建立因子分析模型
在這里選擇,最大方差化因子旋轉(zhuǎn)
# 選擇方式: varimax 方差最大化 # 選擇固定因子為 2 個(gè) faa_two = FactorAnalyzer(2,rotation='varimax') faa_two.fit(df)
返回:
ratation參數(shù)的其他取值情況:
- varimax (orthogonal rotation)
- promax (oblique rotation)
- oblimin (oblique rotation)
- oblimax (orthogonal rotation)
- quartimin (oblique rotation)
- quartimax (orthogonal rotation)
- equamax (orthogonal rotation)
5.2 查看因子方差-get_communalities()
查看公因子方差
# 公因子方差 faa_two.get_communalities()
返回:
查看每個(gè)變量的公因子方差數(shù)據(jù)
pd.DataFrame(faa_two.get_communalities(),index=df.columns)
返回:
5.3 查看旋轉(zhuǎn)后的特征值
faa_two.get_eigenvalues()
返回:
pd.DataFrame(faa_two.get_eigenvalues())
返回:
5.4 查看成分矩陣
查看它們構(gòu)成的成分矩陣:
# 變量個(gè)數(shù)*因子個(gè)數(shù) faa_two.loadings_
返回:
如果轉(zhuǎn)成DataFrame格式,index就是我們的變量,columns就是指定的因子factor。轉(zhuǎn)DataFrame格式后的數(shù)據(jù):
pd.DataFrame(faa_two.loadings_,index=df.columns)
返回:
5.5 查看因子貢獻(xiàn)率
通過(guò)理論部分的解釋,我們發(fā)現(xiàn)每個(gè)因子都對(duì)變量有一定的貢獻(xiàn),存在某個(gè)貢獻(xiàn)度的值,在這里查看3個(gè)和貢獻(xiàn)度相關(guān)的指標(biāo):
- 總方差貢獻(xiàn):variance (numpy array) – The factor variances
- 方差貢獻(xiàn)率:proportional_variance (numpy array) – The proportional factor variances
- 累積方差貢獻(xiàn)率:cumulative_variances (numpy array) – The cumulative factor variances
我們來(lái)看一下總方差貢獻(xiàn)吧
faa_two.get_factor_variance()
返回:
6.隱藏變量可視化
為了更直觀地觀察每個(gè)隱藏變量和哪些特征的關(guān)系比較大,進(jìn)行可視化展示,為了方便取上面相關(guān)系數(shù)的絕對(duì)值:
df1 = pd.DataFrame(np.abs(faa_two.loadings_),index=df.columns) print(df1)
返回:
然后我們通過(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)
返回:
7.轉(zhuǎn)成新變量
上面我們已經(jīng)知道了2個(gè)因子比較合適,可以將原始數(shù)據(jù)轉(zhuǎn)成2個(gè)新的特征,具體轉(zhuǎn)換方式為:
faa_two.transform(df)
返回:
轉(zhuǎn)成DataFrame格式后數(shù)據(jù)展示效果更好:
df2 = pd.DataFrame(faa_two.transform(df)) print(df2)
返回:
七、參考資料
1、Factor Analysis:Factor Analysis with Python — DataSklr
2、多因子分析:因子分析(factor analysis)例子–Python | 文藝數(shù)學(xué)君
3、factor_analyzer package
的官網(wǎng)使用手冊(cè):factor_analyzer package — factor_analyzer 0.3.1 documentation
4、淺談主成分分析和因子分析:淺談主成分分析與因子分析 - 知乎
到此這篇關(guān)于python因子分析的實(shí)例的文章就介紹到這了,更多相關(guān)python 因子分析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。下面這篇文章主要給大家介紹了關(guān)于Python3如何利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法,需要的朋友可以參考下。2017-09-09pyspark?dataframe列的合并與拆分實(shí)例
這篇文章主要介紹了pyspark?dataframe列的合并與拆分實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03解決運(yùn)行出現(xiàn)''dict'' object has no attribute ''has_key''問(wèn)題
這篇文章主要介紹了快速解決出現(xiàn)class object has no attribute ' functiong' or 'var'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Python requests模塊基礎(chǔ)使用方法實(shí)例及高級(jí)應(yīng)用(自動(dòng)登陸,抓取網(wǎng)頁(yè)源碼)實(shí)例詳解
這篇文章主要介紹了Python requests模塊基礎(chǔ)使用方法實(shí)例及高級(jí)應(yīng)用(自動(dòng)登陸,抓取網(wǎng)頁(yè)源碼,Cookies)實(shí)例詳解,需要的朋友可以參考下2020-02-02Python&Matlab實(shí)現(xiàn)伏羲八卦圖的繪制
八卦最先由伏羲根據(jù)燧人氏造設(shè)的兩幅星圖歷法《河圖洛書(shū)》創(chuàng)設(shè)。本文將通過(guò)Python和Matlab分別繪制伏羲八卦圖,感興趣的小伙伴可以了解一下2022-03-03python 進(jìn)制轉(zhuǎn)換 int、bin、oct、hex的原理
這篇文章主要介紹了python 進(jìn)制轉(zhuǎn)換 int、bin、oct、hex的原理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01python Opencv將圖片轉(zhuǎn)為字符畫(huà)
這篇文章主要為大家詳細(xì)介紹了python Opencv將圖片轉(zhuǎn)為字符畫(huà)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境
這篇文章主要介紹了在Linux系統(tǒng)上部署Apache+Python+Django+MySQL環(huán)境的方法,使用到了mod_python 與mysqldb模塊進(jìn)行連接,需要的朋友可以參考下2015-12-12Windows系統(tǒng)下實(shí)現(xiàn)pycharm運(yùn)行.sh文件(本地運(yùn)行和打開(kāi)服務(wù)器終端)
PyCharm是Python開(kāi)發(fā)的高效率IDE,但是很多時(shí)候需要同時(shí)開(kāi)發(fā)Bash(shell)腳本,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下實(shí)現(xiàn)pycharm運(yùn)行.sh文件(本地運(yùn)行和打開(kāi)服務(wù)器終端)的相關(guān)資料,需要的朋友可以參考下2022-09-09