学习笔记(36):用概率密度方式来了解:正态分布拟合曲线

发布于:2025-07-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

学习笔记(36):用概率密度方式来了解:正态分布拟合曲线

一、用概率密度方式来了解:正态分布拟合曲线

用 “货架和水” 的例子,逐行拆解这段代码的逻辑,保证你能秒懂~

先明确代码要做什么

这段代码在画一条 “理论上的房价分布曲线”(假设房价符合正态分布),并让这条曲线和实际数据的直方图对齐。关键是理解公式 stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min())/100 的含义。

用 “货架和水” 类比代码中的变量

假设我们有 1000 套房子(总样本量),房价范围是 100-600 万。我们想画一条正态分布曲线,看看 “理论上” 房价应该怎么分布。这就像:

  • 总样本量 len(data) → 货架上总共有 200 瓶水(前面例子)。
  • 房价范围 x → 货架总长度 10 米(0-10 米)。
  • 正态分布的概率密度 stats.norm.pdf(x, mu, sigma) → 货架上每米的 “水占比密度”(比如 A 区每米占总水量的 15%,即 0.15 概率 / 米)。

逐行拆解代码

# 1. 拟合正态分布参数(类比:计算货架上的平均水量和波动)
mu, sigma = stats.norm.fit(data[price_col])

# 2. 生成100个均匀分布的房价点(覆盖整个房价范围)
# 类比:把10米货架分成100个小区间,每个区间宽0.1米
x = np.linspace(data[price_col].min(), data[price_col].max(), 100)

# 3. 绘制正态分布曲线(重点!)
plt.plot(x, stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100,
         'r--', linewidth=2, label=f'正态分布拟合: μ={mu:.2f}, σ={sigma:.2f}')

核心公式解析:stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100

这个公式其实是三部分的乘积,对应到 “货架和水” 的例子:

  1. stats.norm.pdf(x, mu, sigma)
    → 这是正态分布的概率密度函数,表示 “在房价为 x 时的理论密度”(单位:概率 / 万元)。
    → 类比货架:A 区每米的 “水占比密度” 是 0.15 概率 / 米(即每米占总水量的 15%)。

  2. len(data)
    → 总样本量(比如 1000 套房子),用于把 “概率” 转化为 “实际数量”。
    → 类比货架:总水量 200 瓶,15% 的占比对应 200×15%=30 瓶。

  3. (x.max() - x.min()) / 100
    → 这是区间宽度
    → x 是从房价最小值到最大值的 100 个点,所以相邻两点的距离 = (600 万 - 100 万)/100 = 5 万(每个区间宽 5 万)。
    → 类比货架:把 10 米分成 100 段,每段宽 0.1 米。

举个具体例子:算房价 300 万处的曲线高度

假设:

  • 总样本量 = 1000 套房子
  • 房价范围 = 100-600 万,区间宽度 = 5 万(500 万 / 100)
  • 正态分布在 x=300 万处的密度 = 0.0006 概率 / 万元(即每万元价格的概率是 0.0006)

那么,在 x=300 万这个点上,曲线的高度(理论频数)是:

理论频数 = 概率密度 × 区间宽度 × 总样本量  
         = 0.0006/万元 × 5万 × 1000  
         = 3 套  

→ 这意味着:理论上,300 万左右(±2.5 万范围内)的房子应该有 3 套。

为什么要这样算?

因为直方图的高度是 “实际频数”(比如 300 万左右实际有 4 套房子),而正态分布直接算出来的是 “概率密度”。通过乘以 “区间宽度” 和 “总样本量”,我们把 “理论概率” 转化成了 “理论频数”,让曲线和直方图能在同一尺度上比较!

一句话总结

这段代码的核心就是:
用正态分布算出 “每个房价区间的理论概率”,再乘以 “区间宽度” 和 “总样本量”,得到 “理论上该区间应该有多少套房”,最后画出曲线和实际数据对比

如果不做这个转换,正态分布曲线会因为 “概率密度值太小” 而几乎贴在 x 轴上,根本看不到!

二、理论频数 = 概率密度 × 区间宽度 × 总样本量公式的来源

这个公式 理论频数 = 概率密度 × 区间宽度 × 总样本量,是从概率密度的定义和 “频数与概率的关系” 推导来的,对应代码中最核心的绘图公式:

stats.norm.pdf(x, mu, sigma) * len(data) * (x.max() - x.min()) / 100

我们一步步拆解推导逻辑:

步骤 1:从概率密度到区间概率

根据概率密度的定义:
某区间的概率 = 概率密度 × 区间宽度

用货架和水的例子:

  • 概率密度 = 每米的水占比(比如 0.15 概率 / 米)
  • 区间宽度 = 0.1 米(把 10 米货架分成 100 段,每段宽 0.1 米)
  • 区间概率 = 0.15 × 0.1 = 0.015(即该 0.1 米区间的水占总水量的 1.5%)

步骤 2:从区间概率到理论频数

频数(即某个区间内的实际数量)与概率的关系是:
理论频数 = 总样本量 × 区间概率

继续用例子:

  • 总样本量 = 200 瓶水(货架上的总水量)
  • 区间概率 = 0.015(该区间的水占比)
  • 理论频数 = 200 × 0.015 = 3 瓶(即该 0.1 米区间理论上应有 3 瓶水)

步骤 3:合并公式

把 “区间概率 = 概率密度 × 区间宽度” 代入 “理论频数 = 总样本量 × 区间概率”,得到:
理论频数 = 概率密度 × 区间宽度 × 总样本量

对应到代码中的变量

  • stats.norm.pdf(x, mu, sigma) → 概率密度(每单位价格的概率)
  • (x.max() - x.min()) / 100 → 区间宽度(把房价范围分成 100 段,每段的宽度)
  • len(data) → 总样本量(所有房子的数量)

三者相乘,就是代码中计算 “理论频数” 的公式,目的是让正态分布曲线的高度与直方图的 “实际频数” 在同一尺度上可比。

一句话总结

代码中的绘图公式,本质是用 “概率密度→区间概率→理论频数” 的逻辑,把抽象的概率密度转化为可与实际数据对比的 “理论上应该出现的数量”,而推导的核心就是概率密度的定义(概率 = 密度 × 宽度)和频数与概率的换算关系(频数 = 总样本量 × 概率)。


网站公告

今日签到

点亮在社区的每一天
去签到