python数据可视化的特点_Python数据可视化,看这⼀篇就够了开个玩笑了,其实可视化想做深⼊,只看这⼀篇,必然是不够的了~ ⼊个门估计差不多可以的。
为什么写这⼀篇呢?算是继续上⼀篇最嗨的歌最快的车:Data Fountain光伏发电量预测 Top1 开源分享z huanlan.zhihu
写的,上⼀篇概括了数据分析⽐赛的思路和整体流程,从这篇开始写每个部分如何操作。当然不⽌适⽤于⽐赛,常规的Projec也是可以参考。
⼀般的数据⽐赛,时间紧任务重,⾼效的探索性分析显得很重要,说⽩了作图可视化,必须要做,因为不做不知道数据的规律没有思路,做可视化⼜不舍得花太多时间,所以提前准备好⼤概的框架很有必要。。
第⼀次接触⽐赛的时候为了看个分布图,拿Python了半天不知道咋搞,最后开了SPSS搞。。然⽽SPSS作图功能⼜有限,Python相⽐起来灵活很多。。了解可视化和Python做图的地⽅太多了,Kaggle, datacamp, 各种包推出的官⽅⽂档都是好资源,特别是Kaggle最近修改了⾃⼰提供的Kernel服务,随便注册下就可以免费使⽤4CPU,17G内存,5G硬盘带NVIDIA Tesla K80 GPU的机器,还是很慷慨的。毕竟这个配置⾃⼰买下来⾄少要3万多我估计,可以去试试。
⾔归正传,记录下学来的各种作图。
python是做什么的通俗易懂的
本⽂所演⽰的的可视化⽅法散点图 (Scatterplot)
直⽅图 (Histogram)
⼩提琴图 (Violinplot)
特征两两对⽐图(Pairplot)
安德鲁斯曲线 (Andrews curves)
核密度图 (Kernel density estimation plot)
平⾏坐标图 (Parallel coordinates)
Radviz (⼒矩图?)
热⼒图 (Heatmap)
⽓泡图 (Bubbleplot)
这⾥主要使⽤Python⼀个流⾏的作图⼯具: Seaborn library,同时Pandas和bubbly辅助。为什么Seaborn⽐较好?
因为很多时候数据分析,建模前,都要清洗数据,清洗后数据的结果总要有个格式,我知道的最容易使⽤,最⽅便输⼊模型, 最好画图的格式叫做"Tidy Data" (Wickham H. Tidy data[J]. Journal of Statistical Software, 2014, 59(10): 1-23.) 其实很简单,Tidy Data格式就是:每条观察(记录)⾃⼰占⼀⾏
观察(记录)的每个特征⾃⼰占⼀列
举个例⼦,我们即将作图的数据集IRIS就是Tidy Data(IRIS(IRIS数据集)_百度百科):
Iris数据集是常⽤的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是⼀类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪⼀类。
该数据集包含了5个属性:
Sepal.Length(花萼长度),单位是cm;
Sepal.Width(花萼宽度),单位是cm;
Petal.Length(花瓣长度),单位是cm;
Petal.Width(花瓣宽度),单位是cm;
种类:Iris Setosa(⼭鸢尾)、Iris Versicolour(杂⾊鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
# 这⾥引⼊所⽤到的包
import pandas as pd
import warnings
warnings.filterwarnings("ignore")
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(, color_codes=True)
# 读⼊数据
iris = pd.read_csv("Iris.csv") # the iris dataset is now a Pandas DataFrame
# 看下数据前5⾏
iris.head()IRIS数据
可以看到,每条观察(ID=0,)⾃⼰占⼀⾏,每个特征(四个部位长/宽度,种类)⾃⼰占⼀列。Seaborn就是为Tidy Data设计的,所以⽅便使⽤。
所以这个数据集有6列,6个特征,很多时候做可视化就是为了更好的了解数据,⽐如这⾥就是想看每个种类的花有什么特点,怎么样根据其他特征把花分为三类。我个⼈的喜好是⾸先⼀张图尽量多的包含数据点,展⽰数据信息,从中发现规律。我们可以利⽤以下代码完全展⽰全部维度和数据这⾥⽤的bubbly:
from bubbly.bubbly import bubbleplot
from __future__ import division
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode()
#这⾥设置x,y,z轴,⽓泡,⽓泡⼤⼩,⽓泡颜⾊分别代表6列~在⼆维平⾯想展⽰6个维度,除了x,y,z之外,
#只能⽤颜⾊,⼤⼩等代表其他维度了,bubbly还可以承受更⾼维度的数据,可以⾃⼰搜索
figure = bubbleplot(dataset=iris, x_column='SepalLengthCm', y_column='PetalLengthCm', z_column='SepalWidthCm',
bubble_column='Id', size_column='PetalWidthCm', color_column='Species',
x_title="SepalLength(Cm)", y_title="PetalLength(Cm)", z_title='SepalWidth(Cm)',
title='IRIS Visualization',
x_logscale=False,scale_bubble=0.1,height=600)
#展⽰图⽚
iplot(figure, config={'scrollzoom': True})三维图,全局观察
Python做出来,其实是⼀张可以拖动⾓度,放⼤缩⼩的图,拖⼀拖看各⾓度视图会发现三类还是分的挺
明显的。Github上这个bubbly还是很厉害的,⽅便。
接下来开始做⼀些基础的可视化,没有⽤任何修饰,代码只有最关键的画图部分,可视化作为⽐赛的⼀个基础和开端,个⼈理解做出的图能看就⾏,美不美⽆所谓,不美也不扣分。因为
散点图,可以得到相关性等信息,⽐如基本上SepalLengthCm越⼤,SepalWidthCm越⼤
# 普通⼆维散点图
sns.FacetGrid(iris, hue="Species", size=5) \
.map(plt.scatter, "SepalLengthCm", "SepalWidthCm") \
.add_legend()散点图
使⽤Jointplot, 看两个变量的分布,KDE图,同时展⽰对应的数据点
sns.jointplot(x="SepalLengthCm", y="SepalWidthCm", data=iris,kind="reg")
就像上⼀篇说的,⽐赛中的每个环节都⾄关重要,很有必要看下这些分布直⽅图,kde图,根据这些来处理异常值等,这⾥请教,为什么画了直⽅图还要画KDE??我理解说的都是差不多的东西。
关于KDE:"由于核密度估计⽅法不利⽤有关数据分布的先验知识,对数据分布不附加任何假定,是⼀种从数据样本本⾝出发研究数据分布特征的⽅法,因⽽,在统计学理论和应⽤领域均受到⾼度的重视。"
⽆论如何,我们先画直⽅图,再画KDE
# 画不同Species情况下,SepalWidthCm直⽅图
g = sns.FacetGrid(iris, col="Species")
g = g.map(plt.hist, "SepalWidthCm", bins=20)直⽅图
# 画不同Species情况下,PetalLengthCm KDE图
sns.FacetGrid(iris, hue="Species", size=6) \
.map(sns.kdeplot, "PetalLengthCm") \
.add_legend()KDE 图
这⾥通过KDE可以说,由于Setosa的KDE与其他两种没有交集,直接可以⽤Petailength线性区分Setosa与其他两个物种。
# Pairplot, 看三个品种在不同的两特征组合中的区分情况,对⾓线由于X,Y是⼀个特征,多以画了KDE
sns.pairplot(iris.drop("Id", axis=1), hue="Species", size=3, diag_kind="kde")Pairplot
箱线图,显⽰⼀组数据分散情况的统计图。形状如箱⼦。主要⽤于反映原始数据分布的特征,关键的5个⿊线是最⼤值、最⼩值、中位数和两个四分位数。在判断异常值,处理异常值时候有⽤。
#箱线图,可以把原始数据点加上,⽤jitter=True避免点重合
ax = sns.boxplot(x="Species", y="PetalLengthCm", data=iris)
ax = sns.stripplot(x="Species", y="PetalLengthCm", data=iris, jitter=True, edgecolor="gray")BoxPlot
⼩提琴图
# ⼩提琴图,箱线图与核密度图的结合体,能代表的信息和上图相似
sns.violinplot(x="Species", y="PetalLengthCm", data=iris, size=6)Violinplot
ls.plotting import andrews_curves
andrews_curves(iris.drop("Id", axis=1), "Species")
这个Andrews curves很有趣,它是把所有特征组合起来,计算个值,展⽰该值,可以⽤来确认这三个物种到底好不好区分,的说法是“If there is structure in the data, it may be visible in the Andrews' curves of the data.”(Andrews plot -
Wikipedia)Andrews' curves
# parallel_coordinates 做法是把每个特征放⼀列,不同物种⽤不同颜⾊连起来看看有没有规律
ls.plotting import parallel_coordinates
parallel_coordinates(iris.drop("Id", axis=1), "Species")
# radviz
ls.plotting import radviz
radviz(iris.drop("Id", axis=1), "Species")radviz
Radviz可视化原理是将⼀系列多维空间的点通过⾮线性⽅法映射到⼆维空间的可视化技术,是基于圆形平⾏坐标系的设计思想⽽提出的多维可视化⽅法。圆形的m条半径表⽰m维空间,使⽤坐标系中的⼀点
代表多为信息对象,其实现原理参照物理学中物体受⼒平衡定理。 多维空间的点映射到⼆维可视空间的位置由弹簧引⼒分析模型确定。 (Radviz可视化原理 - CSDN博客) ,能展⽰⼀些数据的可区分规律。
#特征间相关系数热⼒图
f = iris.drop("Id", axis=1).corr()
sns.heatmap(f, annot=True)
数值是⽪尔森相关系数,浅颜⾊表⽰相关性⾼,⽐如Petal.Length(花瓣长度)与 Petal.Width(花瓣宽度)相关性0.96,也就是花瓣长的花,花瓣宽度也⼤,也就是个⼤花。
这些是我见过⽐较常⽤的,对数据探索有帮助的可视化⽅法。
实际上现在机器学习的很多⽅向,包括可视化都在做⾃动化,也就是把数据⼀输⼊,点点⿏标全搞定,可视化真的需要这种⾃动化,能提⾼效率的好东西。
机器学习这些东西,更新太快,必须得紧跟时代,哪天出了什么新的东西,千万不能守着⾃⼰原来做过的东西不放,⼀直保持开放的学习态度还是重要的。
原来上学时候有个做传统信号处理的⽼师说“什么什么神经⽹络?都是XXX扯淡。。。”然后第⼆年,神经⽹络⼤热,拿下各种冠军。。可能他对⾃⼰的研究投⼊太多,确实难放下,所以排斥新⽅法。