文章插图
作者 | 萝卜
来源 | 早起Python(ID: zaoqi-python)
用Python基于主成分分析常见的三个应用场景中,其中有一个是「数据描述」,以描述产品情况为例,比如著名的波士顿矩阵,子公司业务发展状况,区域投资潜力等,需要将多变量压缩到少数几个主成分进行描述,压缩到两个主成分是最理想的,这样便可在一张图内表现出来 。
但这类分析一般做主成分分析是不充分的,能够做到因子分析更好 。但因子分析的知识点非常庞杂,所以本文将跳过原理,直接通过案例再次「实战PCA分析」,用于主成分分析到因子分析的一个过渡,目标有两个:
- 能够通过主成分分析结果来估计生成的主成分所表示的含义
- 借以引出因子分析的优势和学习的必要性是本文的目标
需求说明公司希望从事数据分析岗位的你仅用两个短句就概括出以下数据集所反映出的经济现象 。
文章插图
用几个长句都不一定能够很好的描述数据集的价值,更何况高度凝练的两个短句,短短九个指标就已经十分让人头疼了,如果表格再宽一些呢,比如有二三十个变量?
Python实战本节我们将使用Python对上面的数据进行分析 。
数据探索 import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'})
# 设置中文字体的支持
plt.rcParams['axes.unicode_minus'] = False
# 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei') # 解决Seaborn中文显示问题
df = pd.read_csv('城市经济.csv')
df
文章插图
在做主成分分析前,都应该进行变量间相关性的探索,毕竟如果变量是独立的,则不可压缩 。
plt.figure(figsize=(8, 6))
sns.heatmap(data=https://www.isolves.com/it/cxkf/yy/Python/2020-08-31/df.corr, annot=True) # annot=True: 显示数字
发现变量间的相关性较高,有变量压缩的必要性
文章插图
PCA建模数据标准化使用中心标准化,即将变量都转化成
z分数
的形式,避免量纲问题对压缩造成影响from sklearn.preprocessing import scale
data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-31/df.drop(columns='area') # 丢弃无用的类别变量
data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-31/scale(data)
初步建模需要说明的是第一次的
n_components
参数最好设置得大一些(保留的主成份),观察explained_variance_ratio_
取值变化,即每个主成分能够解释原始数据变异的百分比from sklearn.decomposition import PCA
pca = PCA(n_components=9) # 直接与变量个数相同的主成分
pca.fit(data)
结果分析累积解释变异程度 # 累积解释变异程度
plt.plot(np.cumsum(pca.explained_variance_ratio_), linewidth=3)
plt.xlabel('成份数')
plt.ylabel('累积解释方差'); plt.grid(True)
文章插图
可以看出,当取主成分数为2时,累积解释方差就已经达到0.97有多(0.85 就已经足够),说明我们只需要取两个主成分即可
重新建模综上可知两个主成分就已经足够了
pca = PCA(n_components=2) # 直接与变量个数相同的主成分
pca.fit(data)
pca.explained_variance_ratio_
new_data = https://www.isolves.com/it/cxkf/yy/Python/2020-08-31/pca.fit_transform(data) # fit_transform 表示将生成降维后的数据
# 查看规模差别
print("原始数据集规模: ", data.shape)
print("降维后的数据集规模:", new_data.shape)
文章插图
可以看到9个变量压缩成两个主成分!
主成分中各变量的权重分析先看两个主成分与 9 个变量的系数关系
results = pd.DataFrame(pca.components_).T
results.columns = ['pca_1', 'pca_2']
results.index = df.drop(columns='area').columns
results
推荐阅读
- 各种自媒体工具,视频,音频,变现,数据分析工具,建议收藏
- Java案例实战:Httpclient 实现网络请求 + Jsoup 解析网页
- python开发app实战
- Python版本管理工具和虚拟环境
- 使用这个 Python 工具分析你的 Web 服务器日志文件
- vue 请求公共接口
- 适用于少量数据的深度学习结构
- 一款基于 Python 语言的 Linux 资源监视器
- 数据大屏可视化工具篇—DataV
- 爬虫原理与数据抓取