六月份似乎太忙,將近一個月沒有寫博客,於是挑一個多元統計分析中的方法寫一篇 python 操作實現的。
主成分分析(Principle Component Analysis, PCA)是數據降維的一個方法:原始的統計數據中有很多變量,可以採用主成分分析方法將原始數據降維爲少數幾個變量的數據。
主成分分析的求解一般採用特徵根分解,即求解原始數據協方差矩陣或相關係數矩陣最大特徵根對應的特徵向量,即爲第一主成分,第二主成分爲第二大特徵根對應的特徵向量,其他的主成分可以依次得出。主成分貢獻率爲對應特徵根佔所有特徵根加和的比例。(更嚴謹的可以說通過奇異值分解求主成分)
採用 python 主成分分析時,常用的包爲 Sklearn,其他一些包也能做(例如 matplotlib.mlab.PCA)。需要注意的是
- 最好對原始數據進行標準化
- sklearn 計算主成分時使用的是協方差矩陣,而不是相關係數矩陣。
舉例,下面一個統計數據:
食品 | 衣着 | 居住 | 家庭設備 | 交通通訊 | 文教娛樂 | 醫療保健 | 其他 | |
---|---|---|---|---|---|---|---|---|
北 京 | 1736 | 379 | 854 | 327 | 615 | 797 | 504 | 103 |
天 津 | 1171 | 257 | 614 | 117 | 328 | 329 | 179 | 40 |
河 北 | 888 | 156 | 399 | 101 | 222 | 226 | 135 | 39 |
山 西 | 830 | 202 | 201 | 69 | 160 | 280 | 103 | 33 |
內蒙古 | 1054 | 150 | 335 | 84 | 293 | 309 | 176 | 44 |
遼 寧 | 1127 | 221 | 378 | 100 | 301 | 377 | 234 | 68 |
吉 林 | 1003 | 168 | 257 | 82 | 285 | 261 | 194 | 56 |
黑龍江 | 924 | 184 | 527 | 74 | 257 | 277 | 254 | 49 |
上 海 | 2684 | 366 | 1320 | 458 | 748 | 937 | 562 | 204 |
江 蘇 | 1569 | 191 | 512 | 168 | 364 | 479 | 199 | 85 |
浙 江 | 2061 | 319 | 914 | 260 | 618 | 723 | 416 | 121 |
安 徽 | 1000 | 117 | 345 | 106 | 197 | 257 | 134 | 41 |
福 建 | 1518 | 187 | 457 | 154 | 366 | 357 | 154 | 100 |
江 西 | 1221 | 125 | 326 | 96 | 230 | 276 | 155 | 56 |
山 東 | 1088 | 160 | 446 | 137 | 294 | 377 | 188 | 46 |
河 南 | 859 | 132 | 318 | 83 | 160 | 178 | 123 | 39 |
湖 北 | 1192 | 125 | 310 | 110 | 223 | 272 | 135 | 62 |
湖 南 | 1433 | 128 | 307 | 114 | 219 | 329 | 168 | 58 |
廣 東 | 1789 | 144 | 530 | 152 | 412 | 361 | 204 | 116 |
廣 西 | 1187 | 79 | 380 | 95 | 214 | 226 | 123 | 44 |
海 南 | 1135 | 66 | 146 | 92 | 178 | 199 | 93 | 60 |
重 慶 | 1130 | 96 | 231 | 96 | 163 | 250 | 143 | 33 |
四 川 | 1244 | 116 | 234 | 102 | 172 | 225 | 144 | 36 |
貴 州 | 820 | 80 | 236 | 62 | 99 | 161 | 72 | 24 |
雲 南 | 976 | 80 | 226 | 67 | 100 | 183 | 122 | 35 |
西 藏 | 1185 | 182 | 84 | 81 | 79 | 28 | 44 | 39 |
陝 西 | 813 | 124 | 212 | 84 | 163 | 297 | 166 | 38 |
甘 肅 | 859 | 92 | 241 | 74 | 155 | 258 | 114 | 27 |
青 海 | 893 | 156 | 329 | 84 | 208 | 110 | 152 | 43 |
寧 夏 | 923 | 143 | 346 | 77 | 178 | 178 | 199 | 51 |
新 疆 | 804 | 171 | 333 | 68 | 183 | 159 | 169 | 36 |
對其主成分分析的 Python 代碼爲:
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
import pandas as pd
import numpy as np
df = pd.read_excel(r'D:\Users\chen_\git\Statistics-book\datas\data-pca.xlsx', index_col=0) # 讀取數據
data = scale(df.values) # 標準化,標準化之後就自動根據協方差矩陣進行主成分分析了
# data2 = np.corrcoef(np.transpose(data)) # 沒有必要單獨計算協方差陣或相關係數陣
pca = PCA() # 可以調整主成分個數,n_components = 1
pca.fit(data)
print(pca.explained_variance_) # 輸出特徵根
print(pca.explained_variance_ratio_) # 輸出解釋方差比
print(pca.components_) # 輸出主成分
輸出結果:
[7.32679152 0.46898546 0.16208403 0.1035709 0.07520292 0.06908562
0.04006575 0.02088048]
[0.88630543 0.05673211 0.01960694 0.01252874 0.00909713 0.00835713
0.00484666 0.00252586]
[[ 0.34197826 0.32541509 0.36029958 0.36486138 0.3682146 0.36096996
0.35616496 0.34854195]
[ 0.54451489 -0.61527353 -0.11520953 0.11674732 -0.03494752 -0.07480108
-0.2943857 0.4522824 ]
[ 0.27960446 0.69192655 -0.19973533 -0.07235855 -0.02963776 -0.42452329
-0.39881297 0.24037227]
[-0.21745238 -0.1359657 0.65924912 -0.30353519 0.15040126 -0.53935545
0.07814873 0.29639958]
[-0.15267545 -0.0164215 -0.46139281 -0.58549298 0.44015111 0.1955926
0.1948895 0.38828316]
[ 0.16110958 -0.00739226 0.32020717 -0.29565015 0.42815873 0.33310541
-0.60500836 -0.35175729]
[ 0.63371524 -0.02206104 -0.01490419 -0.36536854 0.00175525 -0.23513962
0.46603443 -0.43785863]
[-0.10113902 -0.13222512 -0.25839752 0.43837388 0.68017775 -0.4341369
0.01092949 -0.2492196 ]]