Python数据可视化正态分布简单分析及实现代码

  

本篇文档将介绍如何使用Python对正态分布数据进行可视化分析。

正态分布的基础知识

正态分布是一种连续的概率分布,也被称为高斯分布。正态分布在自然界中十分常见,比如身高、体重、智商、测量误差等等都服从正态分布。正态分布的概率密度函数为:

$$
f(x)=\dfrac{1}{\sigma\sqrt{2\pi}}e^{-\dfrac{(x-\mu)^2}{2\sigma^2}}
$$

其中$\mu$为均值,$\sigma$为标准差。

数据可视化

要对正态分布进行数据可视化,我们可以使用在Python中常用的两个可视化库:Matplotlib和Seaborn。

Matplotlib实现

使用Matplotlib可视化正态分布分为以下几步:

  1. 生成正态分布样本数据;
  2. 计算概率密度函数值;
  3. 使用Matplotlib绘制直方图和概率密度函数曲线。

下面是一个简单的例子:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

np.random.seed(1)
mu = 0
sigma = 1
x = np.random.normal(mu, sigma, 1000)

plt.hist(x, bins=50, density=1, alpha=0.5, color='g')
xmin, xmax = plt.xlim()
x_range = np.linspace(xmin, xmax, 100)
p = np.exp(-(x_range-mu)**2 /(2 * sigma**2))/(sigma*np.sqrt(2*np.pi))
plt.plot(x_range, p, color='r', linewidth=2)
plt.title('Normal distribution', fontsize=18)
plt.xlabel('Value', fontsize=16)
plt.ylabel('Probability density', fontsize=16)
plt.show()

该例子生成了一个均值为0,标准差为1的正态分布的样本数据,然后使用Matplotlib绘制了该分布的直方图和概率密度函数曲线。

Seaborn实现

Seaborn库在Matplotlib的基础上进一步封装了一些高级数据可视化功能。

要使用Seaborn可视化正态分布,我们可以直接使用Seaborn提供的distplot函数,该函数可以同时绘制直方图和概率密度函数曲线,具体方式如下:

import seaborn as sns
sns.set()

np.random.seed(1)
mu = 0
sigma = 1
x = np.random.normal(mu, sigma, 1000)

sns.distplot(x, bins=50, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})
plt.title('Normal distribution', fontsize=18)
plt.xlabel('Value', fontsize=16)
plt.ylabel('Probability density', fontsize=16)
plt.show()

该例子同样生成了一个均值为0,标准差为1的正态分布样本数据,并使用Seaborn的distplot函数绘制了该分布的直方图和概率密度函数曲线。

示例说明

下面我们再给出两个具体的示例说明。

示例1:观察随机抽样和样本量的影响

np.random.seed(1)
mu = 0
sigma = 1

x1 = np.random.normal(mu, sigma, 100)
x2 = np.random.normal(mu, sigma, 10000)

fig, axs = plt.subplots(1, 2, figsize=(12, 4))

sns.distplot(x1, ax=axs[0], bins=20, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})
sns.distplot(x2, ax=axs[1], bins=50, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})

axs[0].set_title('n=100', fontsize=16)
axs[0].set_xlabel('Value', fontsize=14)
axs[0].set_ylabel('Probability density', fontsize=14)

axs[1].set_title('n=10000', fontsize=16)
axs[1].set_xlabel('Value', fontsize=14)
axs[1].set_ylabel('Probability density', fontsize=14)

plt.show()

该示例展示了随机抽样和样本量对正态分布的影响。通过生成两个样本量不同的样本数据,我们可以看到当样本量较小时,分布的波动较大,而当样本量增大时,分布的形态变得较为稳定。

示例2:比较不同参数的正态分布

np.random.seed(1)
mu1, mu2, mu3 = -2, 0, 2
sigma1, sigma2, sigma3 = 0.5, 1, 2

x1 = np.random.normal(mu1, sigma1, 10000)
x2 = np.random.normal(mu2, sigma2, 10000)
x3 = np.random.normal(mu3, sigma3, 10000)

fig, axs = plt.subplots(1, 3, figsize=(16, 4))

sns.distplot(x1, ax=axs[0], bins=50, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})
sns.distplot(x2, ax=axs[1], bins=50, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})
sns.distplot(x3, ax=axs[2], bins=50, kde=True, hist_kws={'alpha':0.5, 'color':'g'}, kde_kws={'color':'r', 'linewidth':2})

axs[0].set_title('$\mu=-2,\sigma=0.5$', fontsize=16)
axs[0].set_xlabel('Value', fontsize=14)
axs[0].set_ylabel('Probability density', fontsize=14)

axs[1].set_title('$\mu=0,\sigma=1$', fontsize=16)
axs[1].set_xlabel('Value', fontsize=14)
axs[1].set_ylabel('Probability density', fontsize=14)

axs[2].set_title('$\mu=2,\sigma=2$', fontsize=16)
axs[2].set_xlabel('Value', fontsize=14)
axs[2].set_ylabel('Probability density', fontsize=14)

plt.show()

该示例展示了不同参数的正态分布。通过可视化比较了均值和标准差不同的三个正态分布,我们可以清晰地看到这些参数的变化,对分布形态的影响。

相关文章