Python 中的密度图 – 全面概述

密度图用于可视化数据集中连续数值变量的分布。它也称为核密度图。

在开始对数据应用任何机器学习技术之前,最好先充分了解您的数据。

作为一名优秀的机器学习从业者,我们应该问一些问题,例如:

  • 我们的数据是什么样的?
  • 它是正态分布还是具有某种不同的形状?
  • 我们打算应用于数据的算法,它是否对数据分布有任何潜在的假设?

在我们获取数据后立即解决这些问题可以极大地改善后期的结果并节省我们大量的时间。

直方图和密度图等图为我们提供了回答上述问题的方法。

为什么在学习密度图之前先了解直方图?

密度图与直方图非常相似。我们使用直方图可视化分布的形状。可以通过对数据进行分箱并保留每个分箱中的观测值计数来创建直方图。在直方图中,y 轴通常表示 bin 计数,但也可以用每单位的计数(也称为密度)表示。

箱数较少的直方图

如果我们增加直方图中的箱数,分布形状会显得更平滑。

直方图具有更多数量的 bin

现在,想象一条平滑的连续线穿过每个箱的顶部,创建我们的分布形状的轮廓。我们得到的结果就是所谓的密度图。

带直方图的密度图

了解密度图

我们可以将密度图视为平滑直方图的图,这现在非常直观。密度图主要使用 密度估计核密度估计可以通过消除噪声来实现更平滑的分布。

密度图不受箱数的影响,箱数是考虑直方图时的主要参数,因此使我们能够更好地可视化数据的分布。

总之,它就像一个直方图,但在每个箱的顶部绘制了一条平滑的曲线。

野外存在多种分布形式。我们很可能遇到的一些最常见的形状是:

一些分布形状

使用 Python 绘制密度图

我们可以使用 python 以多种方式绘制密度图。我们来看看几种常用的方法。

1.使用Python scipy.stats模块

scipy.stats模块为我们提供了gaussian_kde 类来找出给定数据的密度。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
 
data = np.random.normal(10,3,100) # Generate Data
density = gaussian_kde(data)
 
x_vals = np.linspace(0,20,200) # Specifying the limits of our data
density.covariance_factor = lambda : .5 #Smoothing parameter
 
density._compute_covariance()
plt.plot(x_vals,density(x_vals))
plt.show()
使用 Scipy 绘制密度图

covariance_factor我们更改类的函数gaussian_kde并传递不同的值以获得更平滑的绘图。_compute_covariance记得更改函数后调用。

2.使用Seabornkdeplot模块

Seaborn模块为我们提供了一种更简单的方法来执行上述任务,并且更加灵活。

import numpy as np
import seaborn as sb
import matplotlib.pyplot as plt
 
data = np.random.normal(10,3,300) #Generating data.
plt.figure(figsize = (5,5))
sb.kdeplot(data , bw = 0.5 , fill = True)
plt.show()
使用 Kdeplot 绘制密度图

Seabornkdeplot需要一个单变量数据数组或一个 pandas 系列对象作为其输入参数。bw参数相当于上面演示的类covariance_factorgaussian_kde 参数。我们可以传递fill=False来不用颜色填充曲线下方的区域,而只是绘制一条曲线。

3.使用pandas绘图功能

Pandasplot方法还可以通过提供kind = 'density'输入参数来绘制密度图。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 
x_values = np.random.random(10,3,300) #Generating Data
df = pd.DataFrame(x_values, columns = ['var_name'] ) #Converting array to pandas DataFrame
df.plot(kind = 'density)
使用 Pandas 绘制密度图

4.使用Seaborndistplot

我们还可以使用seaborndistplot方法来可视化连续数值数据的分布。seaborn.distplot( )方法需要一个单变量数据变量作为输入参数,它可以是 pandas 系列、一维数组或列表。

seaborn.distplot( )我们可以根据需要传递一些重要参数来调整绘图:

  • hist: ( Type – Bool ) 是否绘制直方图。
  • kde: ( Type – Bool) 是否绘制高斯核密度估计。
  • bins:(类型 – 数字)指定直方图中的箱数。
  • hist_kws:(类型 – 字典)matplotlib.axes.Axes.hist() 的关键字参数字典 
  • kde_kws:(类型 – Dict)kdeplot()的关键字参数 作为字典传递。
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sb
 
data = np.random.normal(10, 3, 1000) #Generating data randomly from a normal distribution.
 
sb.set_style("whitegrid"# Setting style(Optional)
plt.figure(figsize = (10,5)) #Specify the size of figure we want(Optional)
sb.distplot(x = data  ,  bins = 10 , kde = True , color = 'teal'\
             , kde_kws=dict(linewidth = 4 , color = 'black'))
plt.show()
使用 Seaborn 绘制密度图distplot

要了解有关seaborn的更多信息,distplot您可以参考这篇有关seaborn Distplots的文章。

结论

这使我们进入了文章的结尾!我们希望您今天已经了解了很多有关不同密度图的知识。您可以阅读这些文章以了解有关我们在本文中使用的PandasMatplotlib库的更多信息。