主成分分析是利用降維的思想,在損失很少信息的前提下把多個指標轉(zhuǎn)化為幾個綜合指標的多元統(tǒng)計方法。
算法的具體步驟如下:
1)對向量X進行去中心化。
2)計算向量X的協(xié)方差矩陣,自由度可以選擇0或者1。
3)計算協(xié)方差矩陣的特征值和特征向量。
4)選取最大的k個特征值及其特征向量。
5)用X與特征向量相乘。
代碼如下:
一、導入庫
# 數(shù)據(jù)處理
import pandas as pd
import numpy as np
# 繪圖
import seaborn as sns
import matplotlib.pyplot as plt
二、讀取數(shù)據(jù)集
df = pd.read_csv(r"C:\Users\1\Desktop\mydata.csv", encoding='gbk', index_col=0).reset_index(drop=True)
## 數(shù)據(jù)來源:國家統(tǒng)計局 2020年31個城市空氣質(zhì)量情況 http://www.stats.gov.cn/tjsj/ndsj/2021/indexch.htm
df
三、球狀檢驗
# Bartlett's球狀檢驗
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value, p_value = calculate_bartlett_sphericity(df)
print(chi_square_value, p_value)
四、KMO檢驗
# 檢查變量間的相關(guān)性和偏相關(guān)性,取值在0-1之間;KOM統(tǒng)計量越接近1,變量間的相關(guān)性越強,偏相關(guān)性越弱,因子分析的效果越好。
# 通常取值從0.6開始進行因子分析
from factor_analyzer.factor_analyzer import calculate_kmo
kmo_all, kmo_model = calculate_kmo(df)
print(kmo_all)
五、相關(guān)矩陣
### step-1 標準化
from sklearn import preprocessing
df = preprocessing.scale(df)
df
### step-2 相關(guān)系數(shù)矩陣
covX = np.around(np.corrcoef(df.T),decimals=3)
covX
### step-3 特征值和特征向量
featValue, featVec= np.linalg.eig(covX.T) #求解系數(shù)相關(guān)矩陣的特征值和特征向量
featValue, featVec
### step-4 對特征值進行排序并輸出 降序
featValue = sorted(featValue)[::-1]
featValue
六、繪制散點圖和折線圖
# 同樣的數(shù)據(jù)繪制散點圖和折線圖
plt.scatter(range(1, df.shape[1] + 1), featValue)
plt.plot(range(1, df.shape[1] + 1), featValue)
# 顯示圖的標題和xy軸的名字
# 最好使用英文,中文可能亂碼
plt.title("Scree Plot")
plt.xlabel("Factors")
plt.ylabel("Eigenvalue")
plt.grid() # 顯示網(wǎng)格
plt.show() # 顯示圖形
七、特征值貢獻度
gx = featValue/np.sum(featValue)
gx
八、特征值的累計貢獻率
lg = np.cumsum(gx)
lg
九、排序選出主成分
#選出主成分
k=[i for i in range(len(lg)) if lg[i]<0.85]
k = list(k)
print(k)
十、選出主成分對應的特征向量矩陣
selectVec = np.matrix(featVec.T[k]).T
selectVe=selectVec*(-1)
selectVec
十一、主成分得分文章來源:http://www.zghlxwxcb.cn/news/detail-630325.html
finalData = np.dot(df,selectVec)
finalData
十二、熱力圖文章來源地址http://www.zghlxwxcb.cn/news/detail-630325.html
# 繪圖
plt.figure(figsize = (14,14))
ax = sns.heatmap(selectVec, 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)
到了這里,關(guān)于主成分分析(PCA)-Python代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!