首頁 > 軟體

python因子分析的範例

2022-03-04 13:01:52

一、起源

        因子分析的起源是這樣的:1904年英國的一個心理學家發現學生的英語、法語和古典語成績非常有相關性,他認為這三門課程背後有一個共同的因素驅動,最後將這個因素定義為“語言能力”。

        基於這個想法,發現很多相關性很高的因素背後有共同的因子驅動,從而定義了因子分析,這便是因子分析的由來。

二、基本思想

        我們再通過一個更加實際的例子來理解因子分析的基本思想:

        現在假設一個同學的數學、物理、化學、生物都考了滿分,那麼我們可以認為這個學生的理性思維比較強,在這裡理性思維就是我們所說的一個因子。在這個因子的作用下,偏理科的成績才會那麼高。

        到底什麼是因子分析?就是假設現有全部自變數x的出現是因為某個潛在變數的作用,這個潛在的變數就是我們說的因子。在這個因子的作用下,x能夠被觀察到。

        因子分析就是將存在某些相關性的變數提煉為較少的幾個因子,用這幾個因子去表示原本的變數,也可以根據因子對變數進行分類

        因子分子本質上也是降維的過程,和主成分分析(PCA)演演算法比較類似。

三、演演算法用途

        因子分析法和主成分分析法有很多類似之處。因子分析的主要目的是用來描述隱藏在一組測量到的變數中的一些更基本的,但又無法直接測量到的隱性變數。因子分析法也可以用來綜合評價。

        其主要思路是利用研究指標的之間存在一定的相關性,從而推想是否存在某些潛在的共性因子,而這些不同的潛在的共性因子不同程度地共同影響著研究指標。因子分析可以在許多變數中找出隱藏的具有代表性的因子,將共同本質的變數歸入一個因子,可以減少變數的數目。

四、因子分析步驟

應用因子分析法的主要步驟如下:

  • 對所給的資料樣本進行標準化處理
  • 計算樣本的相關矩陣R
  • 求相關矩陣R的特徵值、特徵向量
  • 根據系統要求的累積貢獻度確定主因子的個數
  • 計算因子載荷矩陣A
  • 最終確定因子模型

五、factor_analyzer庫

利用Python進行因子分析的核心庫是:factor_analyzer

pip install factor_analyzer

這個庫主要有兩個主要的模組需要學習:

  • factor_analyzer.analyze(重點)
  • factor_analyzer.factor_analyzer

官網學習地址:factor_analyzer package — factor_analyzer 0.3.1 documentation

六、範例詳解

 資料來源於中國統計年鑑。

1.匯入庫

# 資料處理
import pandas as pd
import numpy as np
 
# 繪圖
import seaborn as sns
import matplotlib.pyplot as plt
# 因子分析
from factor_analyzer import FactorAnalyzer

2.讀取資料

df = pd.read_csv("D:桌面demo.csv",encoding='gbk')
df

輸出:

 如果不想要城市那一列的話,可以在讀取的時候就刪除,也可以後面再刪

比如,讀取時刪除

df = pd.read_csv("D:桌面demo.csv", index_col=0,encoding='gbk').reset_index(drop=True)
df

返回:

 然後我們查詢一下,資料的缺失值情況:

df.isnull().sum()

返回:

 然後,我們可以針對的,對資料進行一次處理:

比如刪除無效欄位的那一列

#  去掉無效欄位
df.drop(["變數名1","變數名2","變數名3"],axis=1,inplace=True)

或者,刪除空值

# 去掉空值
df.dropna(inplace=True)

3.充分性檢測

        在進行因子分析之前,需要先進行充分性檢測,主要是檢驗相關特徵陣中各個變數間的相關性,是否為單位矩陣,也就是檢驗各個變數是否各自獨立。

3.1 Bartlett's球狀檢驗

        檢驗總體變數的相關矩陣是否是單位陣(相關係數矩陣對角線的所有元素均為1,所有非對角線上的元素均為零);即檢驗各個變數是否各自獨立。

        如果不是單位矩陣,說明原變數之間存在相關性,可以進行因子分子;反之,原變數之間不存在相關性,資料不適合進行主成分分析

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檢驗

        檢查變數間的相關性和偏相關性,取值在0-1之間;KOM統計量越接近1,變數間的相關性越強,偏相關性越弱,因子分析的效果越好。

通常取值從0.6開始進行因子分析

#KMO檢驗
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all,kmo_model=calculate_kmo(df)
kmo_model

返回:

 通過結果可以看到KMO大於0.6,也說明變數之間存在相關性,可以進行分析。

4.選擇因子個數

方法:計算相關矩陣的特徵值,進行降序排列

4.1 特徵值和特徵向量

faa = FactorAnalyzer(25,rotation=None)
faa.fit(df)
 
# 得到特徵值ev、特徵向量v
ev,v=faa.get_eigenvalues()
print(ev,v)

返回:

4.2 視覺化展示

將特徵值和因子個數的變化繪製成圖形:

 # 同樣的資料繪製散點圖和折線圖
plt.scatter(range(1, df.shape[1] + 1), ev)
plt.plot(range(1, df.shape[1] + 1), ev)
 
# 顯示圖的標題和xy軸的名字
# 最好使用英文,中文可能亂碼
plt.title("Scree Plot")  
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")
 
plt.grid()  # 顯示網格
plt.show()  # 顯示圖形

返回:

 從上面的圖形中,我們明確地看到:選擇2或3個因子就可以了

4.3 視覺化中顯示中文不報錯

只需要在畫圖前,再匯入一個庫即可,見程式碼

import matplotlib as mpl
 
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定預設字型
mpl.rcParams['axes.unicode_minus'] = False  # 解決儲存影象是負號'-'顯示為方塊的問題

5.因子旋轉

5.1 建立因子分析模型

在這裡選擇,最大方差化因子旋轉

# 選擇方式: varimax 方差最大化
# 選擇固定因子為 2 個
faa_two = FactorAnalyzer(2,rotation='varimax')
faa_two.fit(df)

返回:

ratation引數的其他取值情況:

  • 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()

返回:

 檢視每個變數的公因子方差資料

pd.DataFrame(faa_two.get_communalities(),index=df.columns)

返回:

5.3 檢視旋轉後的特徵值

faa_two.get_eigenvalues()

返回:

pd.DataFrame(faa_two.get_eigenvalues())

返回:

 5.4 檢視成分矩陣

檢視它們構成的成分矩陣:

# 變數個數*因子個數
faa_two.loadings_

返回:

 

如果轉成DataFrame格式,index就是我們的變數,columns就是指定的因子factor。轉DataFrame格式後的資料:

pd.DataFrame(faa_two.loadings_,index=df.columns)

返回:

 5.5 檢視因子貢獻率

通過理論部分的解釋,我們發現每個因子都對變數有一定的貢獻,存在某個貢獻度的值,在這裡檢視3個和貢獻度相關的指標:

  • 總方差貢獻:variance (numpy array) – The factor variances
  • 方差貢獻率:proportional_variance (numpy array) – The proportional factor variances
  • 累積方差貢獻率:cumulative_variances (numpy array) – The cumulative factor variances

 我們來看一下總方差貢獻吧

faa_two.get_factor_variance()

返回:

 

 6.隱藏變數視覺化

為了更直觀地觀察每個隱藏變數和哪些特徵的關係比較大,進行視覺化展示,為了方便取上面相關係數的絕對值:

df1 = pd.DataFrame(np.abs(faa_two.loadings_),index=df.columns)
print(df1)

返回:

然後我們通過熱力圖將係數矩陣繪製出來:

# 繪圖
 
plt.figure(figsize = (14,14))
ax = sns.heatmap(df1, annot=True, cmap="BuPu")
 
# 設定y軸字型大小
ax.yaxis.set_tick_params(labelsize=15)
plt.title("Factor Analysis", fontsize="xx-large")
 
# 設定y軸標籤
plt.ylabel("Sepal Width", fontsize="xx-large")
# 顯示圖片
plt.show()
 
# 儲存圖片
# plt.savefig("factorAnalysis", dpi=500)

返回:

7.轉成新變數

上面我們已經知道了2個因子比較合適,可以將原始資料轉成2個新的特徵,具體轉換方式為:

faa_two.transform(df)

返回:

 轉成DataFrame格式後資料展示效果更好:

df2 = pd.DataFrame(faa_two.transform(df))
print(df2)

返回:

七、參考資料

1、Factor Analysis:Factor Analysis with Python — DataSklr

2、多因子分析:因子分析(factor analysis)例子–Python | 文藝數學君

3、factor_analyzer package的官網使用手冊:factor_analyzer package — factor_analyzer 0.3.1 documentation

4、淺談主成分分析和因子分析:淺談主成分分析與因子分析 - 知乎

到此這篇關於python因子分析的範例的文章就介紹到這了,更多相關python 因子分析內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com