本篇文档将介绍如何使用Python对正态分布数据进行可视化分析。
正态分布的基础知识
正态分布是一种连续的概率分布,也被称为高斯分布。正态分布在自然界中十分常见,比如身高、体重、智商、测量误差等等都服从正态分布。正态分布的概率密度函数为:
$$
f(x)=\dfrac{1}{\sigma\sqrt{2\pi}}e^{-\dfrac{(x-\mu)^2}{2\sigma^2}}
$$
其中$\mu$为均值,$\sigma$为标准差。
数据可视化
要对正态分布进行数据可视化,我们可以使用在Python中常用的两个可视化库:Matplotlib和Seaborn。
Matplotlib实现
使用Matplotlib可视化正态分布分为以下几步:
- 生成正态分布样本数据;
- 计算概率密度函数值;
- 使用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()
该示例展示了不同参数的正态分布。通过可视化比较了均值和标准差不同的三个正态分布,我们可以清晰地看到这些参数的变化,对分布形态的影响。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python数据可视化正态分布简单分析及实现代码 - Python技术站