维度爆炸?Python实现数据压缩如此简单
作者 | 萝卜
来源 | 早起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=df.corr(), annot=True) # annot=True: 显示数字
发现变量间的相关性较高,有变量压缩的必要性
PCA建模
数据标准化
使用中心标准化,即将变量都转化成z分数
的形式,避免量纲问题对压缩造成影响
from sklearn.preprocessing import scale
data = df.drop(columns='area') # 丢弃无用的类别变量
data = 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 = 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
可以明显看出:
主成分1几乎不受data的第二个自变量
人均GDP
的影响,0.034,其他自变量对其影响程度都差不多。主成分2受data的第二个自变量
人均GDP
影响最大,达到了0.94
结果描述
通过上面的PCA建模,我们把9个自变量压缩成了2 主成分,每个主成分受哪些变量的影响也有了了解。虽然得到的主成分都没有什么意义,但我们是否可以通过变量们对主成分的影响程度来为生成的两个主成分命名呢?
第一个主成分在表达经济总量的指标上的权重相当,可考虑命名为经济总量水平
;而第二个主成分只在人均GDP上权重很高,可暂时考虑命名为人均水平
注意:这里的给主成分命名(包括后续有关因子分析的推文)都是对降维后的数据进行的,而不是生成的主成分,这样才有比较和描述的价值。每个自变量在生成的主成分上的权重只是给这个主成分的命名提供参考,真正的命名操作是对压缩后的数据进行。
new_data = pca.fit_transform(data) # fit_transform 表示将生成降维后的数据
results = df.join(pd.DataFrame(new_data, # new_data 是降维后的数据columns=['经济总量水平', '人均水平'])) # 与原来的数据拼接
results
绘制波士顿矩阵,这里的散点图的点标注代码是前人的优秀轮子,直接拿来用即可。
plt.figure(figsize=(10, 8))
# 基础散点图
x, y = results['经济总量水平'], results['人均水平']
label = results['area']
plt.scatter(x, y)
plt.xlabel('经济总量水平'); plt.ylabel('人均水平')# 对散点图中的每一个点进行文字标注## 固定代码,无需深究,拿来即用## 给点标注是需要将 x 和 y 以及标签如上段代码那样单独拆开
for a,b,l in zip(x,y,label):plt.text(a, b+0.1, '%s.' % l, ha='center', va='bottom', fontsize=14)# 添加两条竖线
plt.vlines(x=results['经济总量水平'].mean(), ymin=-1.5, ymax=3, colors='red')
plt.hlines(y=results['人均水平'].mean(), xmin=-4, xmax=6, colors='red')
最终从上图可以看出:
广西,河北,福建三地的人均水平和经济总量水平都偏低
上海的人均经济水平很高,但经济总量水平缺只是略优于均值
广东的人均经济水平稍次于均值,但经济总量水平很高
......
小结
本文讲解了基于主成分分析的样本特征描述,并使用Python示范了完整的流程。其中,也对由多个自变量生成的主成分的命名描述操作中需要注意的点作了比较详细的说明。其实PCA并不能非常好的满足维度分析的需求,能够做到「因子分析」最好,它是主成分方法的拓展,作为维度分析的手段,因子分析也是构造合理的聚类模型和稳健的分类模型的必然步骤。
Python商业数据挖掘自动化系列代码及数据已经上传GitHub,如有需要可以自行下载:「https://github.com/liuhuanshuo/zaoqi-Python/tree/master/商业数据分析实战」。
推荐阅读
算法实现太难了?机器学习也需要开源软件
TikTok算法背后是抖音用户数据?想多了
图解Transformer,读完这篇就够了
马小峰:金融科技界的区块链博士
2019年中国IaaS公有云市场排名及份额出炉
相关文章:

深入剖析C#的多态
作者: 天雨一、什么是多态 面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用…

/usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)
/usr/bin/ld: /usr/local/lib/libz.a(crc32.o): relocation R_X86_64_32 against a local symbol can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libz.a: could not read symbols: Bad value 一般是64 位 电脑才会出现。 解决方法如下&am…

关于BIO | NIO | AIO的讨论
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的。而描述IO,我们需要从两个层面: 编程语言实现原理…

NYOJ-49 开心的小明
开心的小明 时间限制:1000 ms | 内存限制:65535 KB难度:4描述小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间…

两个硬盘和文件相关的小技巧 (C#)
取系统的硬盘分区的盘符,用API函数:GetDriveType [DllImport("kernel32.dll", EntryPoint"GetDriveType")] public static extern int GetDriveType (string nDrive); 调用:string [] dirs Environment.GetLogicalDri…
从数百个Excel中查找数据,一分钟用Python搞定
作者 | 陈熹来源 | 早起Python今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大。需求说明首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿, 每天会根据当天日期建立…

namenode如何存储复本?
2019独角兽企业重金招聘Python工程师标准>>> namenode如何选择在哪个datanode存储复本?这里需要对可靠性,写入带宽和读取带宽进行权衡。例如,把所有复本都存储在一个节点损失的写入带宽最小,因为复制管线都是在同一节点…

EBS-使用 fnd_user_pkg API 创建用户,添加职责,修改用户
比如有一个外围支持系统,用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中,那么我们需要先把外围系统的用户创建在Oracle ERP中,并且分配职责给他。 DECLARE a BOOLEAN; BEGIN---------------------------------------------…
万字长文总结机器学习的模型评估与调参 | 附代码下载
作者 | Sebastian Raschka翻译&整理 | Sam来源 | SAMshare目录一、认识管道流1.1 数据导入1.2 使用管道创建工作流二、K折交叉验证2.1 K折交叉验证原理2.2 K折交叉验证实现三、曲线调参3.1 模型准确度3.2 绘制学习曲线得到样本数与准确率的关系3.3 绘制验证曲线得到超参和准…

[百万级]通用存储过程.分页存储过程
/* 名称:spAll_ReturnRows 输入: 输出: 调用: EXEC spAll_ReturnRows SELECT * FROM 表名, 页号, 返回记录数, 主键, 排序字段 spAll_ReturnRows SELECT * FROM all_Categories,2,10,[ID],[ID] 说明:[百万级]通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录 …

Unsupported major.minor version (jdk版本错误)解决方案
2019独角兽企业重金招聘Python工程师标准>>> 如果你遇到了 Unsupported major.minor version ,请认真看一下,说不定会有帮助。 我花两个小时总结的经验,你可能10分钟就得到了。 ^**^ 一、错误现象: 当改变了jdk版本时…

The key of C# 学习笔记I-II
作者 :Kemins booootLog http://blog.csdn.net/keminlau/ Sunday, October 3, 2004 微软提出的CLS(Common Language Specification, 通用语言标准)对能被用来编写dotNET程序的语言的最小功能集做出了规定。 就拿C#来说,它是目前程序设计语言“以效率换安…

分布式平台下的HS(High-Security) --Apache Shiro API(介绍)
在尝试保护你的应用时,你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用,只会让你更糊涂?本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方法。本文还解释了Apache Shiro的项目目…
豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」
来源 | HyperAI超神经这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 —— 孙正义,放到了聚光灯下。软银 CEO,传奇投资人,冒险家&am…

Java 集合 — HashMap
HashMap 无序(每次resize的时候都会变)非线程安全key和value都看可以为null使用数组和链表实现查找元素的时候速度快几个重要属性: loadFactor:用来计算thresholdthreshold:决定map是否需要扩容,threshold …
赠书 | 人工智能识万物:卷积神经网络的前世今生
来源 |《Python人工智能开发从入门到精通》作者 | 杨柳、郭坦、鲁银芝责编 | 晋兆雨深度学习在技术与应用上的突破引发了第三次人工智能浪潮,获得了空前成功。在前述章节的基础上,本章将主要介绍训练卷积神经网络和深度神经网络的重要方法与技巧…

通过WMI获得硬盘和CPU的物理序列号(VB.net)
作者:iwebsms获得硬盘序列号Dim cmicWmi As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")Dim Uint32 As UInt32For Each cmicWmiObj As ManagementObject In cmicWmi.GetUint32 cmicWmiObj("signature")…

[转] Zend studio中开发常用
转载自: http://www.cnblogs.com/iphper/archive/2012/03/21/2409397.html 、快捷键设置 在zendstudio中开发的过程中,我们应专注与代码的逻辑中,而不是把一大半的时间都浪费在编辑器的操作以及鼠标的点击中,经常使用快捷键进行操作会达到事半…

程序员新手 0年份等级 指导(一) 开发人员IT架构总览
程序员新手 0年份等级 指导(一) 开发人员IT架构总览 程序员新手 0年份等级 指导(一) 开发人员相关IT架构总览之职能分解 开发人员IT架构总览一、职能分解 软件项目的主要组成大体上按照一个项目的生命周期流程分为: 需…

磁盘配额的wmi版本(C#)
作者:iwebsmsusing System;using System.Management;namespace DiskQuota{/// <summary>/// Class1 的摘要说明。/// </summary>class Class1{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(string[] a…

Smarty的配置与高级缓存技术
前言 Smarty 是一个出色的PHP模板引擎,它分离了逻辑代码和user interface。 学习和使用Smarty,没有应用到它的缓存技术是一个很大的损失,它可以将用户最终看到的HMTL文件缓存成一个静态的HTML页,当设定Smarty的cache属性为true时&…
Get了!用Python制作数据预测集成工具 | 附代码
作者 | 李秋键责编 | 晋兆雨大数据预测是大数据最核心的应用,是它将传统意义的预测拓展到“现测”。大数据预测的优势体现在,它把一个非常困难的预测问题,转化为一个相对简单的描述问题,而这是传统小数据集根本无法企及的。从预测…

方差,标准差,协方差、期望值
方差:方差是变量与其平均值的平方和的算术平均值,例如: 有一组数据{4,5,6,7}, 平均值为:(4567)/422/45.5 其方差为:[(4-5.5)2(5-5.5)2(6-5.5)2(7-5.5)2]/4 标准差:方差的开2次方 例如上面那组数据的标准差为…

简单代码的性能差异
《.net 框架程序设计》里的几句代码,我重新整理了一下,写成函数,这样下面的反编译代码看起来更方便点:dahuzizyd的专栏 http://blog.csdn.net/dahuzizyd/publicvoidBoxing() { Int32 v 5; Conso…
求助贴:人工智能offer,阿里or腾讯,选哪个?
笔者曾在脉脉上看到一条网友求助帖:拿到两个offer,一个腾讯,一个阿里,选哪个?抛开“柠檬”这件事不说,笔者观察到另一件事:那就是他的offer都是视觉岗。前一阵刚巧也看到一份报告:人…

EIGRP注入默认路由
实验TOP: 三、实验要求: R1,R2,R3运行EIGRP,用ip default-network 命令使EIGRP向EIGRP域内传递缺省路由,各路由器的各环回口之间路由可达。 四:实验过程: 1、 基本接口的配置.(见图) 1(config)#int e0/0 R1(config-if)#ip add 12.0.0.1 255.255.255.0 R1(config-if)…

Python OpenCV学习笔记之:图像读取,显示及保存
为什么80%的码农都做不了架构师?>>> #-*- coding: utf-8 -*- # 读取,保存,显示图片 import cv2 as cv# 读取为灰度图片 img cv.imread("../../datas/images/fish.jpg",0)# 保存图片 cv.imwrite("../../datas/ima…
简单的特征值梯度剪枝,CPU和ARM上带来4-5倍的训练加速 | ECCV 2020
作者 | VincentLee来源 | 晓飞的算法工程笔记在训练过程中,特征值梯度的回传和权值梯度的计算占了大部分的计算消耗。由于这两个操作都是以特征值梯度作为输入,而且零梯度不会占用计算资源,所以稀疏化特征值梯度可以降低回传阶段的计算消耗以…

获得汉字字符串拼音首字母
作者:iwebsms的专栏 返回给定字符串的首字母Function IndexCode(ByVal IndexTxt As String) As StringDim i As IntegerFor i 1 To IndexTxt.LengthIndexCode IndexCode & GetOneIndex(Mid(IndexTxt, i, 1))NextEnd Function得到单个字符的首字母Private Func…

使用HTTP模块扩展 ASP.NET 处理
HTTP 模块是一个通过实现实现 IHttpModule 接口和处理事件,在每次针对应用程序发出请求时调用的程序集。HTTP 模块作为 ASP.NET 请求管线的一部分调用,能够在整个请求过程中访问生命周期事件。因此,HTTP 模块使我们有机会检查传入和传出的请求…