大家好,我们来聊聊正态分布。
一篇文章,带你读懂~
想象一下,你们班考完数学,老师把所有同学的成绩统计出来,发现绝大多数同学的分数集中在70到80分之间,有几个学霸考了90多分,也有一些同学可能刚刚及格,甚至不及格。这种情况是不是挺常见的?高分和低分的人少,大部分同学成绩集中在某个范围里。
这就是正态分布的典型特征!它其实就是一种「大部分集中,中间多,两头少」的分布形状。在数学里,这种形状很经典,是个对称的“钟形”曲线,又叫“钟形曲线”。
正态分布的特点
平均值在中间:大多数人的成绩集中在一个「平均值」附近(比如70分左右)。 对称性:成绩的分布在平均值左右是对称的。比方说,考70分左右的最多,向左右两边走,分数越来越高或越来越低的人数就越来越少。 极端少见:特别高或特别低的成绩很少见,少数人会考到90分以上或低于50分。
举几个例子
这几个例子结束后,你会立刻明白一些东西~
身高:一般来说,大多数人的身高是集中在一个范围里的,比如成年男性大多数身高在170-180厘米之间,特别高的(比如190以上)和特别矮的(比如160以下)就会比较少,正好符合正态分布的钟形曲线。 体重:同样,大部分人的体重会在一个平均值附近,比如男性平均在70公斤左右,那么特别胖或者特别瘦的人就相对少,体重分布也是正态的。 考试成绩:刚才提到的考试成绩也是正态分布的一个好例子。大部分人考中等分数,极高分和极低分的同学比较少。
正态分布为什么重要?
正态分布之所以重要,是因为很多实际现象都符合这种规律,比如人的身高、考试成绩,甚至是股票市场中每天的波动幅度。所以研究正态分布,能帮助我们理解和预测这些「大部分集中,中间多,两头少」的现象。
总的来说,正态分布就是一种「中间多、两头少」的对称分布,生活中很多现象都会符合这个规律。当你看到很多数据大多数集中在某个值附近、两边逐渐减少的时候,就可以猜测这可能是个正态分布。
完整案例
我们使用Python模拟生成一个正态分布的虚拟数据集,计算其统计特征,并基于公式绘制正态分布曲线和一些数据分析图表。我们逐步推导正态分布的公式并使用它来生成分布曲线,大家对于原理理解起来会更加的通透。
核心公式
正态分布的概率密度函数(PDF)公式如下:
: 均值(数据的集中位置) : 标准差(数据的离散程度)
在代码中,我们会:
生成一个符合正态分布的虚拟数据集。 计算其均值和标准差,并基于公式绘制正态分布的曲线。 展示一些数据分析的图形。
完整代码
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm
# 生成符合正态分布的虚拟数据集
np.random.seed(42) # 设置随机种子,保证可重复性
mu, sigma = 70, 10 # 均值为70,标准差为10
data = np.random.normal(mu, sigma, 1000) # 生成1000个符合正态分布的数据
# 计算均值和标准差
mean = np.mean(data)
std_dev = np.std(data)
# 定义正态分布函数
def normal_dist(x, mean, std_dev):
return (1 / (np.sqrt(2 * np.pi * std_dev ** 2))) * np.exp(-((x - mean) ** 2) / (2 * std_dev ** 2))
# 设置x轴的范围用于绘制曲线
x_values = np.linspace(mean - 4*std_dev, mean + 4*std_dev, 1000)
y_values = normal_dist(x_values, mean, std_dev)
# 假设已有的数据和参数
data = np.random.normal(loc=0, scale=1, size=1000) # 示例正态分布数据
x_values = np.linspace(-5, 5, 1000) # x 轴的取值范围
y_values = norm.pdf(x_values, loc=0, scale=1) # 正态分布的概率密度函数
mean = np.mean(data) # 计算数据的均值
std_dev = np.std(data) # 计算数据的标准差
# 创建图表
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
fig.suptitle('Normal Distribution Dataset Analysis', fontsize=16, color='navy')
# 1. 正态分布的概率密度函数曲线
axes[0, 0].plot(x_values, y_values, color='magenta', lw=2, label='Normal Distribution Curve')
axes[0, 0].hist(data, bins=30, density=True, color='skyblue', alpha=0.6, label='Data Histogram')
axes[0, 0].set_title('Normal Distribution Curve and Histogram')
axes[0, 0].set_xlabel('Value')
axes[0, 0].set_ylabel('Probability Density')
axes[0, 0].legend()
# 2. 数据的盒须图(展示分布的偏态和离群点)
sns.boxplot(data=data, ax=axes[0, 1], color='orange')
axes[0, 1].set_title('Boxplot of Data')
axes[0, 1].set_ylabel('Value')
# 3. 数据的累积分布函数(CDF)
sorted_data = np.sort(data)
cdf = np.arange(len(sorted_data)) / float(len(sorted_data))
axes[1, 0].plot(sorted_data, cdf, color='green', lw=2)
axes[1, 0].set_title('Cumulative Distribution Function (CDF)')
axes[1, 0].set_xlabel('Value')
axes[1, 0].set_ylabel('Cumulative Probability')
# 4. Q-Q 图(检验数据是否符合正态分布)
theoretical_quantiles = norm.ppf((np.arange(len(data)) + 1) / (len(data) + 1), mean, std_dev)
axes[1, 1].scatter(theoretical_quantiles, sorted_data, color='purple')
axes[1, 1].plot(theoretical_quantiles, theoretical_quantiles, color='red', lw=2, linestyle='--', label='Theoretical Line')
axes[1, 1].set_title('Q-Q Plot')
axes[1, 1].set_xlabel('Theoretical Quantiles')
axes[1, 1].set_ylabel('Actual Quantiles')
axes[1, 1].legend()
plt.tight_layout(rect=[0, 0, 1, 0.96])
plt.show()
咱们详细的解释一下代码中的核心内容:
正态分布曲线及直方图:第一个图展示了生成的数据的直方图,显示了数据的大致分布。粉色曲线是我们根据正态分布公式绘制的理论概率密度函数,用于比较数据与理论正态分布的吻合程度。
盒须图(Box Plot):盒须图帮助我们观察数据的离群点和整体分布范围。可以快速看到数据的偏态和离群值的位置。
累积分布函数(CDF):累积分布函数展示了数值在不同位置上的累计概率。例如,可以从中看到有约50%的数据小于均值位置,CDF曲线也可以帮助判断数据的集中度。
Q-Q 图(Quantile-Quantile Plot):Q-Q 图用于判断数据是否符合正态分布。若数据是正态分布,实际分位数和理论分位数应大致落在红色的对角线上。这是验证正态性的一种方法。