统计分析
是理解数据集中各个变量彼此关系的重要过程,通过 统计分析
,我们就可以洞见数据中隐藏的趋势和规律,更好的揭示数据之间的关系。
在本教程中我们主要讨论三种 seaborn函数
:
relplot(kind) 画图函数kind参数可以为"scatter"或者"line"
scatterplot() 散点图函数
lineplot() 折线图函数
不论数据结构多么复杂,seaborn的这些函数可以很简明的将数据展示出来。比如在二维空间中,seaborn可以在图中通过色调(hue)、尺寸(size)、风格(style)等方式来展示三维数据结构。具体怎么使用请看继续往下学习
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns #让jupyter notebook的Cell可以将多个变量显示出来。 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = 'all' sns.set(style="darkgrid")
散点图是统计可视化方法中的中流砥柱。可以使用relplot(kind='scatter')或者scatter()作图
tips = pd.read_csv('tips.csv') #tips数据集中包含total_bill、tip、sex、smoker、day、time、size这些字段 tips.head() sns.relplot(x="total_bill", y="tip", data=tips) #sns.scatterplot(x="total_bill", y="tip", data=tips) #效果等同于relplot函数
当有第三个变量参与绘图,在seaborn中可以使用style(类别样式参数),因为类别本身也是带有信息的。
sns.relplot(x="total_bill", y="tip", style="smoker", data=tips)
但是上图看着smoker类目,No和yes很难在图中区分。如果能有色调的区别,更容易肉眼区分开来。这里使用色调参数 hue
sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips)
当然我们也可以在图中对四种变量进行统计性分析。四个变量分别是 total_bill、tip、smoker、time
sns.relplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips)
在两个例子中,我们可以自定义调色板(color palette),这样做有很多options。在这里,我们使用字字符串接口自定义 顺序调色板 。
sns.relplot(x="total_bill", y="tip", hue="size", #ch变化范围(2.5,-0.2),从浅色(大于0)到深色(小于0) #色调的明暗程度dark取值范围(0,1),dark值越大散点的颜色越浅 palette="ch:2.5,-0.2,dark=0.1", data=tips)
对于三个变量的可视化,其实还可以使用尺寸size参数来可视化。
sns.relplot(x='total_bill', y='tip', size='size', data=tips)
size还可以设置范围
sns.relplot(x='total_bill', y='tip', size='size', sizes=(15, 200), data=tips)
散点图使用很方便,但这并不是万能通用的可视化方法。例如,我们想探索某些数据集中的某个变量随着时间的变化趋势,或者该变量是连续型变量,此时使用 lineplot()
更好。或者 relplot(kind='line')
。
我们伪造一份随着时间变化的数据
data = dict(time=np.arange(500), value=np.random.randn(500).cumsum()) df = pd.DataFrame(data) g = sns.relplot(x="time", y="value", kind="line", data=df) g.fig.autofmt_xdate()
因为 lineplot()
假定我们绘制的图因变量是y,自变量是x。绘图前默认从x轴方向对数据进行排序。但是,这种情况是可以被禁用的:
df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0), columns=["x", "y"]) sns.relplot(x="x", y="y", sort=True, kind="line", data=df)
sns.relplot(x="x",
y="y",
sort=False,
kind="line",
data=df)
更复杂的数据集将对x变量的相同值有多个观测值。seaborn中默认通过绘制x的平均值和x的95%置信区间来聚合每个x的多个测量值:
fmri = pd.read_csv('fmri.csv') fmri.head() sns.relplot(x='timepoint', y='signal', kind='line', data=fmri)
使用bootstrapping来计算置信区间(confidence intervals),这对于较大的数据集来说会是时间密集型的。因此我们可以对该方法采用禁用。参数ci=None表示禁用
sns.relplot(x='timepoint', y='signal', kind='line', ci=None, data=fmri)
另一个好的选择,特别是对于更大的数据,是通过绘制 标准偏差sd
而不是置信区间来表示每个时间点的分布范围。ci参数设置为'sd'
sns.relplot(x='timepoint', y='signal', kind='line', ci='sd', data=fmri)
要完全剔除聚合效应,请将 estimator
参数设置为 None
。当数据在每个点上有多个观察值时,这可能会产生奇怪的效果。
sns.relplot(x='timepoint', y='signal', kind='line', estimator=None, data=fmri)
Plotting subsets of data with semantic mappings
lineplot()
拥有与 relplot()、scatterplot()
类似的灵活性:同样可以借助色调hue、尺寸size和样式style将三种变量展示在二维图表中。因此我们不用停下来思考如何使用matplotlib对点线具体的参数进行设置。
使用 lineplot()
也会诊断数据如何借助语义进行聚合。例如在制图时,加入 色调hue
会将图表分为两条曲线以及错误带(error band),每种颜色对应的指示出数据的子集:
下面我们看看hue具体例子
fmri = pd.read_csv('fmri.csv') fmri.sample(5) sns.relplot(x='timepoint', y = 'signal', hue='event', kind='line', data=fmri)
改变制图中的样式
sns.relplot(x='timepoint', y = 'signal', hue='event', style='event', kind='line', data=fmri)
注意上面代码中hue和style参数都是一个变量,所以绘制的图与之前生成的图变动不大。只是cue类曲线从实线变成虚线。
现在hue和style参数不同后,我们在运行试试
sns.relplot(x='timepoint', y = 'signal', hue='region', style='event', kind='line', data=fmri)
与散点图一样,要谨慎使用多个语义制作线图。 虽然这样操作有时候提供了信息,但图表更难解读。 但即使您只检查一个附加变量的变化,更改线条的颜色和样式也很有用。 当打印成黑白或有色盲的人观看时,这可以使情节更容易理解:
sns.relplot(x='timepoint', y = 'signal', hue='event', style='event', kind='line', data=fmri)
当您使用重复测量数据(即,您有多次采样的单位)时,您还可以单独绘制每个采样单位,而无需通过语义区分它们。这可以避免使图例混乱:
sns.relplot(x="timepoint", y="signal", hue="region", units="subject", estimator=None, kind="line", data=fmri.query("event == 'stim'"))
lineplot()中默认的色彩映射和图例处理还取决于 色调hue
是 分类型数据
还是 数字型数据
:
dots = pd.read_csv('dots.csv').query("align == 'dots'") dots.head() sns.relplot(x="time", y="firing_rate", hue="coherence", style="choice", kind="line", data=dots)
可能会发生这样的情况:即使色调变量palette是数字,它也很难用线性色标表示。 这就是这种情况,其中色调变量hue以对数方式缩放。 您可以通过传递列表或字典为每一行提供特定的颜色值:
#n_colors值与coherence种类数相等 palette = sns.cubehelix_palette(light=.8, n_colors=6) sns.relplot(x="time", y="firing_rate", hue="coherence", style="choice", palette=palette, kind="line", data=dots);
或者您可以更改色彩映射的规范化方式
from matplotlib.colors import LogNorm sns.relplot(x="time", y="firing_rate", hue="coherence", hue_norm=LogNorm(), style="choice", kind="line", data=dots);
改变线条的粗细
sns.relplot(x='time', y='firing_rate', size='coherence', style='choice', kind='line', data=dots)
df = pd.DataFrame(dict(time=pd.date_range("2017-1-1", periods=500), value=np.random.randn(500).cumsum())) df.head() g = sns.relplot(x="time", y="value", kind="line", data=df) g.fig.autofmt_xdate()
当你想要理解两个变量之间的关系如何依赖于多个其他变量时呢?
最好的方法可能是制作一个以上的图。 因为 relplot()
基于 FacetGrid
,所以这很容易做到。 要显示新增变量的影响,而不是将其分配给绘图中的一个语义角色,请使用它来“构思”(facet)可视化。 这意味着您可以创建多个轴并在每个轴上绘制数据的子集:
tips = pd.read_csv('tips.csv') sns.relplot(x="total_bill", y="tip", hue="smoker", col="time", #time有几种值,就有几列图 data=tips);
sns.relplot(x="timepoint",
y="signal",
hue="subject",
col="region", #region有几种值,就有几列图
row="event", #event有几种值,就有几行图
height=3,
kind="line",
estimator=None,
data=fmri);
sns.relplot(x="timepoint",
y="signal",
hue="event",
style="event",
col="subject",
col_wrap=3, #显示的图片的行数
height=3,
aspect=1, #长宽比,该值越大图片越方。
linewidth=2.5,
kind="line",
data=fmri.query("region == 'frontal'"));
100G Python学习资料(免费下载)
100G 文本分析语料资源(免费下载)
typing库:让你的代码阅读者再也不用猜猜猜
数据清洗 常用正则表达式大全
大邓强力推荐-jupyter notebook使用小技巧
PySimpleGUI: 开发自己第一个软件
深度特征合成:自动生成机器学习中的特征
Python 3.7中dataclass的终极指南(一)
Python 3.7中dataclass的终极指南(二)
2017年度15个最好的数据科学领域Python库
使用Pandas更好的做数据科学
[计算消费者的偏好]推荐系统与协同过滤、奇异值分解
机器学习: 识别图片中的数字
应用PCA降维加速模型训练
如何从文本中提取特征信息?
使用sklearn做自然语言处理-1
使用sklearn做自然语言处理-2
机器学习|八大步骤解决90%的NLP问题
Python圈中的符号计算库-Sympy
Python中处理日期时间库的使用方法
【 视频讲解】Scrapy递归抓取简书用户信息
美团商家信息采集神器
用chardect库解决网页乱码问题