统计学方法:主成分分析(PCA)实战

本文重点讨论对降维中常用的统计分析方法之一:主成分分析法。对影响31个城市综合评价的8个指标,用主成分分析法确定8个指标的权重,并使用SPASS和Python两种实战方式进行操作。

前置统计与概论相关知识点

  • 协方差:衡量变量间相对于各自自身期望的变化趋势的统计指标,比如变量X大于自身期望时变量Y也大于自身期望,此时变量XY的协方差为正值,反之则为负值。
  • 协方差矩阵:由协方差构成的矩阵称之为协方差矩阵。
  • 相关系数:用以反映变量之间相关关系密切程度的统计指标。相关系数也可以看成是一种剔除了两个变量量纲影响、标准化后的特殊协方差,它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。
  • 相关系数矩阵:由相关系数组成的矩阵称之为相关系数矩阵。

理论:

基本原理

主成分分析(Principal components analysis)的思路主要是将原始多个变量通过线性组合的(矩阵旋转)方式转化为几个线无关的变量,且新生成的变量包含了原始变量的绝大部分信息,从而达到降维的目的。但因为新生成成分中所有原变量都占有一定比例,不同比例之间没有一个统一衡量的标准,所以这种方式在解释性方面相对较差。

实际使用的时候,如果变量间的数据波动量比较大,需要进行数据的归一化处理。但在标准化的过程中会抹杀一部分原本刻画变量之间离散程度差异的信息。所以标准化是视实际使用场景而定。

主成分筛选标准

  • 保留使得方差贡献率达到80%以上的主成分
  • 保留方差(特征值)大于1的主成分的
  • 根据碎石图选取变化比较大的前几个主要成分

适用场景

主成分分析不要求数据呈正态分布,主要是使用了线性变换的技术,因为其应用范围较广,通过对原始变量进行综合与简化,可以客观地确定各个指标的权重,避免主观判断的随意性。但是从主成分的思路出发,其主要适用于变量间相关性较强的数据,如果原始数据相关性弱,则起不到很好的降维作用,且降维后存在一定的数据丢失。

分析的基本步骤

  • 选取初始变量
  • 根据初始变量特性选择使用协方差矩阵还是相关矩阵来求主成分
  • 计算协方差矩阵或相关矩阵的特征值和特征向量
  • 确定主成分个数
  • 对主成分做经济解释,主成分的经济意义由各线性组合中权重较大的几个指标来确定

实战:

SPASS 实战

数据准备:

从食品,衣着,居住,家庭设备,交通通讯,文教娱乐,医疗保健,其他8个指标对全国31个主要城市统计
注:数据不具实际含义,仅用于分析过程学习。

Spass操作:

  • Spass -> 分析 -> 降维 -> 因子分析
    注:基于相关系数进行矩阵变换。
  • 描述选项中勾选初始解,系数,KMO和Bartlett形度检验。
  • 提取选项中选择未旋转的因子解,基于特征值,相关性矩阵。
  • 方法选项卡中选择无,载荷图。
  • 得分中选择因子得分系数矩阵。

注Bartlett球形度检验:检验是否适合主成分析。其原假设是变量间两两相互独立。KMO判断适合主成分析的程度。

结果分析:

KMO和Bartlett检验表:

  • Bartlett形度检验:与0.05的置信水平进行比较,小于0.05认为维度之间是相关的,适合主成分分析。
  • KMO:取值在0到1之间,大于0.5认为是适合主成分分析。

总方差解释表:

查看各个主成分的特征根,方差,方差占比。

成分得分系数矩阵:

主要查看各个维度在成分上的载荷

权重计算

  • 确定指标在各个主成分中的系数,系数求解公式=成分载荷数/√成分特征根
  • 确定主成分的方差贡献率:F = ∑Wi*Fi/∑Fj (W是主成分权重,Fi的总方差中的占比,Fj是成分方差占比之和)
  • 指标权重的归一化:每个指标的系数/指标系数之和
    注:这部分可以借助Excel完成

指标计算

根据上一步的计算的权重计算主每个城市得分:
Indicator = ∑Di*Wi (D表示原始指标数值,W表示当前维度的权重)

结果可视化

SPASS方式结果

Python实战

我们采用机器学习库Scikit-learn进行PCA操作,基于协方差进行矩阵变换。

步骤一:数据准备

data_pca = pd.read_excel('data_pca.xlsx', 'consumption', index_col=0, na_values=['NA'])

步骤二:PCA操作

# 该步骤主要是 计算特征根,方差占比,成分系数
# n_components的其他取值:主成分占比(主成分累计方差占比),维度(指定下降之后的维度),‘mle’(会自动确定保留的特征数)
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('输出主成分系数阵:默认列是指标,行是指标在成为上的系数')
# print(pca.components_)

print('输出主成分个数: {}'.format(pca.n_components_))
碎石图

步骤三: 权重计算

# 由碎石图和方差占比可知,前两个主成分的方差变化比较大,且累计方差占比查过90%。所以我们选取前两个成分。
explained_variance_need = pca.explained_variance_[0:2]
print(explained_variance_need)
component_need = pca.components_[:2,:]
print(component_need)

# 确定指标在各个主成分中的系数,系数求解公式=成分载荷数/√成分特征根
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)

# 确定主成分的方差贡献率:F = ∑Wi*Fi/∑Fj (W是主成分权重,Fi的总方差中的占比,Fj是成分方差占比之和)
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)  

# 指标权重的归一化:每个指标的系数/指标系数之和
# weights/np.sum(weights)

步骤四: 指标计算

data_pca['indicator'] = np.matrix(data_pca.values).dot(np.transpose(np.matrix(weights)))

步骤五: 结果可视化

show_pic('上海在全国消费指数中排名第一',data_pca['indicator'].sort_values(ascending = False),False)
Python方式结果

小结

从3.1和3.2结果中可以看到排名中有些城市在两种方式上的结果略微有些差异,这个是SPASS和Scikit-learn实现上存在一定的差异,本文的重点在于讨论主成分分析在两种方式上的实现。

如果问题,欢迎回复交流。如有需要源数据的,可以回复获取。

特别声明,本文的数据来自于随机制造,不构成任何效力,仅用于技术学习使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容