六月份似乎太忙,将近一个月没有写博客,于是挑一个多元统计分析中的方法写一篇 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
df = pd.read_excel(r'/Users/zhenchen/Downloads/git/Statistics-book/datas/data-pca.xlsx', index_col=0) # 读取数据
data = scale(df.values) # 标准化,标准化之后就自动根据协方差矩阵进行主成分分析了
pca = PCA(n_components=3) # the number of principal components
pca.fit(data) # fit the data by PCA
print(
f"explained variance of each principal component: {pca.explained_variance_ratio_}"
) # output the explained variance ratio
principal_components = pca.fit_transform(data)
print(f"principal components shown the first 10 rows:\n {principal_components[0:10]}")
- 输出特征根用
pca.singular_values_
- 通过
fit()
对数据应用主成分分析 - 通过
fit_transform()
得到主成分得分,即降维后的数据
输出结果:
explained variance of each principal component: [0.88630543 0.05673211 0.01960694]
principal components shown the first 10 rows:
[[ 6.15730299 1.50580702 -0.24358303]
[ 0.6584214 1.12711694 0.50454916]
[-1.00494186 0.43604681 -0.02179728]
[-1.49665533 0.84460379 0.51878362]
[-0.54983004 0.2663682 -0.21121333]
[ 0.51041752 0.61976593 0.23667515]
[-0.57584909 0.31359856 0.11823377]
[-0.12918681 0.93587395 -0.29813732]
[ 9.8916323 -0.83011997 -0.08360848]
[ 1.64543386 -0.49026241 0.09447958]]
- 主成分分析通常是数据分析中的一个中间步骤,常用于降维,为后续的聚类、分类或可视化等任务做准备。