
本文重點(diǎn)討論對降維中常用的統(tǒng)計(jì)分析方法之一:主成分分析法。對影響31個(gè)城市綜合評價(jià)的8個(gè)指標(biāo),用主成分分析法確定8個(gè)指標(biāo)的權(quán)重,并使用SPASS和Python兩種實(shí)戰(zhàn)方式進(jìn)行操作。
前置統(tǒng)計(jì)與概論相關(guān)知識(shí)點(diǎn)
- 協(xié)方差:衡量變量間相對于各自自身期望的變化趨勢的統(tǒng)計(jì)指標(biāo),比如變量X大于自身期望時(shí)變量Y也大于自身期望,此時(shí)變量XY的協(xié)方差為正值,反之則為負(fù)值。
- 協(xié)方差矩陣:由協(xié)方差構(gòu)成的矩陣稱之為協(xié)方差矩陣。
- 相關(guān)系數(shù):用以反映變量之間相關(guān)關(guān)系密切程度的統(tǒng)計(jì)指標(biāo)。相關(guān)系數(shù)也可以看成是一種剔除了兩個(gè)變量量綱影響、標(biāo)準(zhǔn)化后的特殊協(xié)方差,它消除了兩個(gè)變量變化幅度的影響,而只是單純反應(yīng)兩個(gè)變量每單位變化時(shí)的相似程度。
- 相關(guān)系數(shù)矩陣:由相關(guān)系數(shù)組成的矩陣稱之為相關(guān)系數(shù)矩陣。
理論:
基本原理
主成分分析(Principal components analysis)的思路主要是將原始多個(gè)變量通過線性組合的(矩陣旋轉(zhuǎn))方式轉(zhuǎn)化為幾個(gè)線無關(guān)的變量,且新生成的變量包含了原始變量的絕大部分信息,從而達(dá)到降維的目的。但因?yàn)樾律沙煞种兴性兞慷颊加幸欢ū壤?,不同比例之間沒有一個(gè)統(tǒng)一衡量的標(biāo)準(zhǔn),所以這種方式在解釋性方面相對較差。
實(shí)際使用的時(shí)候,如果變量間的數(shù)據(jù)波動(dòng)量比較大,需要進(jìn)行數(shù)據(jù)的歸一化處理。但在標(biāo)準(zhǔn)化的過程中會(huì)抹殺一部分原本刻畫變量之間離散程度差異的信息。所以標(biāo)準(zhǔn)化是視實(shí)際使用場景而定。
主成分篩選標(biāo)準(zhǔn)
- 保留使得方差貢獻(xiàn)率達(dá)到80%以上的主成分
- 保留方差(特征值)大于1的主成分的
- 根據(jù)碎石圖選取變化比較大的前幾個(gè)主要成分
適用場景
主成分分析不要求數(shù)據(jù)呈正態(tài)分布,主要是使用了線性變換的技術(shù),因?yàn)槠鋺?yīng)用范圍較廣,通過對原始變量進(jìn)行綜合與簡化,可以客觀地確定各個(gè)指標(biāo)的權(quán)重,避免主觀判斷的隨意性。但是從主成分的思路出發(fā),其主要適用于變量間相關(guān)性較強(qiáng)的數(shù)據(jù),如果原始數(shù)據(jù)相關(guān)性弱,則起不到很好的降維作用,且降維后存在一定的數(shù)據(jù)丟失。
分析的基本步驟
- 選取初始變量
- 根據(jù)初始變量特性選擇使用協(xié)方差矩陣還是相關(guān)矩陣來求主成分
- 計(jì)算協(xié)方差矩陣或相關(guān)矩陣的特征值和特征向量
- 確定主成分個(gè)數(shù)
- 對主成分做經(jīng)濟(jì)解釋,主成分的經(jīng)濟(jì)意義由各線性組合中權(quán)重較大的幾個(gè)指標(biāo)來確定
實(shí)戰(zhàn):
SPASS 實(shí)戰(zhàn)
數(shù)據(jù)準(zhǔn)備:
從食品,衣著,居住,家庭設(shè)備,交通通訊,文教娛樂,醫(yī)療保健,其他8個(gè)指標(biāo)對全國31個(gè)主要城市統(tǒng)計(jì)
注:數(shù)據(jù)不具實(shí)際含義,僅用于分析過程學(xué)習(xí)。
Spass操作:
- Spass -> 分析 -> 降維 -> 因子分析
注:基于相關(guān)系數(shù)進(jìn)行矩陣變換。 - 描述選項(xiàng)中勾選初始解,系數(shù),KMO和Bartlett形度檢驗(yàn)。
- 提取選項(xiàng)中選擇未旋轉(zhuǎn)的因子解,基于特征值,相關(guān)性矩陣。
- 方法選項(xiàng)卡中選擇無,載荷圖。
- 得分中選擇因子得分系數(shù)矩陣。
注Bartlett球形度檢驗(yàn):檢驗(yàn)是否適合主成分析。其原假設(shè)是變量間兩兩相互獨(dú)立。KMO判斷適合主成分析的程度。
結(jié)果分析:
KMO和Bartlett檢驗(yàn)表:

- Bartlett形度檢驗(yàn):與0.05的置信水平進(jìn)行比較,小于0.05認(rèn)為維度之間是相關(guān)的,適合主成分分析。
- KMO:取值在0到1之間,大于0.5認(rèn)為是適合主成分分析。
總方差解釋表:

查看各個(gè)主成分的特征根,方差,方差占比。
成分得分系數(shù)矩陣:

主要查看各個(gè)維度在成分上的載荷
權(quán)重計(jì)算
- 確定指標(biāo)在各個(gè)主成分中的系數(shù),系數(shù)求解公式=成分載荷數(shù)/√成分特征根
- 確定主成分的方差貢獻(xiàn)率:F = ∑Wi*Fi/∑Fj (W是主成分權(quán)重,F(xiàn)i的總方差中的占比,F(xiàn)j是成分方差占比之和)
- 指標(biāo)權(quán)重的歸一化:每個(gè)指標(biāo)的系數(shù)/指標(biāo)系數(shù)之和
注:這部分可以借助Excel完成
指標(biāo)計(jì)算
根據(jù)上一步的計(jì)算的權(quán)重計(jì)算主每個(gè)城市得分:
Indicator = ∑Di*Wi (D表示原始指標(biāo)數(shù)值,W表示當(dāng)前維度的權(quán)重)
結(jié)果可視化

Python實(shí)戰(zhàn)
我們采用機(jī)器學(xué)習(xí)庫Scikit-learn進(jìn)行PCA操作,基于協(xié)方差進(jìn)行矩陣變換。
步驟一:數(shù)據(jù)準(zhǔn)備
data_pca = pd.read_excel('data_pca.xlsx', 'consumption', index_col=0, na_values=['NA'])
步驟二:PCA操作
# 該步驟主要是 計(jì)算特征根,方差占比,成分系數(shù)
# n_components的其他取值:主成分占比(主成分累計(jì)方差占比),維度(指定下降之后的維度),‘mle’(會(huì)自動(dòng)確定保留的特征數(shù))
pca = PCA(n_components='mle')
pca.fit(data_pca)
print('輸出特征根:')
print(pca.explained_variance_)
print('輸出解釋方差比:')
print(pca.explained_variance_ratio_)
importance = pca.explained_variance_ratio_
plt.scatter(range(1,8),importance)
plt.plot(range(1,8),importance)
plt.title('碎石圖')
plt.xlabel('Factors')
plt.ylabel('Eigenvalue')
plt.grid()
plt.show()
print('輸出主成分系數(shù)陣:默認(rèn)列是指標(biāo),行是指標(biāo)在成為上的系數(shù)')
# print(pca.components_)
print('輸出主成分個(gè)數(shù): {}'.format(pca.n_components_))

步驟三: 權(quán)重計(jì)算
# 由碎石圖和方差占比可知,前兩個(gè)主成分的方差變化比較大,且累計(jì)方差占比查過90%。所以我們選取前兩個(gè)成分。
explained_variance_need = pca.explained_variance_[0:2]
print(explained_variance_need)
component_need = pca.components_[:2,:]
print(component_need)
# 確定指標(biāo)在各個(gè)主成分中的系數(shù),系數(shù)求解公式=成分載荷數(shù)/√成分特征根
component1 = component_need[0,:]/np.sqrt(explained_variance_need[0])
component2 = component_need[1,:]/np.sqrt(explained_variance_need[1])
components = np.vstack((component1.reshape(1,8),component2.reshape(1,8)))
# print(components)
# 確定主成分的方差貢獻(xiàn)率:F = ∑Wi*Fi/∑Fj (W是主成分權(quán)重,F(xiàn)i的總方差中的占比,F(xiàn)j是成分方差占比之和)
component1_ratio = pca.explained_variance_ratio_[0]
component2_ratio = pca.explained_variance_ratio_[1]
weights = []
for x in range(8):
weight = (components[0][x]*component1_ratio + components[1][x]*component2_ratio)/(component1_ratio+component2_ratio)
weights.append(weight)
print(weights)
# 指標(biāo)權(quán)重的歸一化:每個(gè)指標(biāo)的系數(shù)/指標(biāo)系數(shù)之和
# weights/np.sum(weights)
步驟四: 指標(biāo)計(jì)算
data_pca['indicator'] = np.matrix(data_pca.values).dot(np.transpose(np.matrix(weights)))
步驟五: 結(jié)果可視化
show_pic('上海在全國消費(fèi)指數(shù)中排名第一',data_pca['indicator'].sort_values(ascending = False),False)

小結(jié)
從3.1和3.2結(jié)果中可以看到排名中有些城市在兩種方式上的結(jié)果略微有些差異,這個(gè)是SPASS和Scikit-learn實(shí)現(xiàn)上存在一定的差異,本文的重點(diǎn)在于討論主成分分析在兩種方式上的實(shí)現(xiàn)。
如果問題,歡迎回復(fù)交流。如有需要源數(shù)據(jù)的,可以回復(fù)獲取。
特別聲明,本文的數(shù)據(jù)來自于隨機(jī)制造,不構(gòu)成任何效力,僅用于技術(shù)學(xué)習(xí)使用。