正在加载中...

展开本页目录
算法教程StandardDeviation-标准差赋权法

StandardDeviation-标准差赋权法

No.095 · 在线教程

标准差赋权法(Standard Deviation Weighting)是一类典型的客观赋权方法,其核心思想是:某指标在样本中的离散程度越大,说明其区分不同对象的能力越强,因此应赋予更高权重。

StandardDeviation-标准差赋权法

1. 方法概述

标准差赋权法(Standard Deviation Weighting)是一类典型的客观赋权方法,其核心思想是:某指标在样本中的离散程度越大,说明其区分不同对象的能力越强,因此应赋予更高权重。

但就本项目 具体的算法3/多指标评价/StandardDeviation-标准差赋权法 的实际实现而言,该模块并不是“只计算一组客观权重”,而是一个完整的“赋权 + 综合评分 + 排名 + 导出”的一体化评价流程。结合 core/calculator.pyui/main_window.pyui/results_widget.py,当前实现的标准流程为:

  • 读取对象列与指标列数据;
  • 对正向指标、负向指标、适度指标进行同向化处理;
  • 按用户选择执行 min-maxz-score + min-max 标准化;
  • 在标准化矩阵上计算各指标标准差;
  • 将标准差归一化为权重;
  • 用加权求和得到对象综合得分;
  • 按得分降序生成排名;
  • 导出 Excel、图表与复现脚本。

设共有 \(m\) 个评价对象、\(n\) 个指标,原始决策矩阵记为

$$ X=(x_{ij})_{m\times n}, \quad i=1,2,\ldots,m, \quad j=1,2,\ldots,n \tag{1} $$

设最终客观权重向量记为

$$ w=\big(w_1,w_2,\ldots,w_n\big)^\top, \quad w_j\ge 0, \quad \sum_{j=1}^{n}w_j=1 \tag{2} $$

项目最终结果表中的核心列为:

  • 对象
  • 得分
  • 排名

其中 得分越大表示对象越优,排名=1 表示最优对象

2. 输入结构与项目流程

2.1 输入数据结构

上传页 ui/upload_widget.py 支持 .xlsx.xls.csv 文件,也支持直接加载示例数据。结合 utils/data_validator.pycore/calculator.py 的实际实现,当前项目对输入数据的要求可概括为:

  • 第 1 列为对象名称列;
  • 第 2 列及以后为指标列;
  • 上传校验阶段要求至少包含 1 个指标列;
  • 核心计算阶段要求最终选中的指标数不少于 2 个;
  • 指标列必须全部能转为数值;
  • 指标列不允许空值;
  • 对象名称允许重复,但会给出告警;
  • 常数列允许存在,但会给出告警,且其最终权重将为 0。

因此,进入 Calculator.run_analysis() 的标准数据结构可写为

$$ \mathcal{D}=\{A_i,\ x_{i1},x_{i2},\ldots,x_{in}\}_{i=1}^{m} \tag{3} $$

其中 \(A_i\) 表示第 \(i\) 个对象名称。

需要特别说明两点工程实现细节:

  • 上传校验函数 validate_excel_data() 只在上传页被调用,重复对象和常数列都只是“提示但不阻断”;
  • utils/data_validator.py 中虽然仍保留 validate_method_settings(),但当前 StandardDeviation 主流程并未调用它,且其字段要求与本模块现行参数页并不一致,因此本文以 ui/main_window.py -> core/calculator.py 的真实调用链为准。

2.2 界面参数流程

主窗口 ui/main_window.py 的当前流程为:

  1. 上传数据;
  2. 进入指标设置页;
  3. 选择参与计算的指标并设置指标类型;
  4. 进入参数设置页,配置标准化方式、标准差口径与敏感性分析;
  5. 结果页自动启动计算并导出结果。

指标页 ui/indicators_widget.py 会收集以下参数:

  • selected_indicators:参与计算的指标集合;
  • indicator_types:每个指标的类型;
  • standard_values:适度指标的目标值。

参数页 ui/methods_widget.py 当前提供的关键参数为:

  • normalizationmin-maxz-score
  • std_ddof01
  • sensitivity:是否开启敏感性分析;
  • sensitivity_delta:权重扰动比例 \(\Delta\)。

其中:

  • std_ddof=0 表示总体标准差;
  • std_ddof=1 表示样本标准差。

结果页 ui/results_widget.py 通过后台线程 StatsWorker 调用 Calculator.run_analysis(),成功后展示权重表、得分表,并开放以下按钮:

  • 打开结果目录;
  • 打开结果文件;
  • 导出复现代码;
  • 重置并回到主页面。

3. 指标类型处理与标准化口径

3.1 指标类型

当前项目支持三类指标:

  • 正向指标:值越大越优;
  • 负向指标:值越小越优;
  • 适度指标:值越接近目标值越优。

设经过方向处理但尚未进入最终标准化流程的中间矩阵记为

$$ U=(u_{ij})_{m\times n} \tag{4} $$

3.2 正向指标

若第 \(j\) 个指标为正向指标,则程序不做额外变换,直接令

$$ u_{ij}=x_{ij} \tag{5} $$

3.3 负向指标

若第 \(j\) 个指标为负向指标,core/calculator.py 的实现并不是直接写成常见的

\(\frac{\max-x}{\max-\min}\)

形式,而是先做一次线性镜像变换:

$$ u_{ij}=x_j^{\max}+x_j^{\min}-x_{ij} \tag{6} $$

其中

$$ x_j^{\max}=\max_{1\le i\le m}x_{ij}, \quad x_j^{\min}=\min_{1\le i\le m}x_{ij} \tag{7} $$

随后再与其他指标一起进入统一标准化流程。

3.4 适度指标

若第 \(j\) 个指标为适度指标,程序先构造“接近目标值”的得分:

$$ u_{ij}=1-\frac{|x_{ij}-t_j|}{\max\left(|x_j^{\max}-t_j|,\ |x_j^{\min}-t_j|\right)} \tag{8} $$

并将结果裁剪到 \([0,1]\) 区间。这里 \(t_j\) 表示第 \(j\) 个适度指标的目标值。

当前项目的目标值来源分两层:

  • 正常 UI 流程下,用户在指标页输入目标值;
  • 若直接调用核心类且未提供该值,核心会回退为该列均值,并写入告警。

因此,项目中的目标值口径为

$$ t_j= \begin{cases} \text{用户提供值}, & \text{若已提供}\\ \dfrac{1}{m}\sum_{i=1}^{m}x_{ij}, & \text{若未提供} \end{cases} \tag{9} $$

若式(8)的分母为 0,说明该列所有值都与目标值重合,程序会直接令

$$ u_{ij}=1 \tag{10} $$

需要特别说明:ui/indicators_widget.py 在用户把某列切换为“适度指标”时,会尝试把该列均值自动填入输入框;而 core/calculator.py 也保留了“缺失时回退均值”的兜底逻辑。因此,适度指标的“默认取均值”是 UI 和核心双重存在的实现策略。

3.5 Z-score 阶段

若参数页选择 normalization="z-score",程序会先在矩阵 \(U\) 上做标准分数变换:

$$ z_{ij}=\frac{u_{ij}-\mu_j}{\sigma_j} \tag{11} $$

其中

$$ \mu_j=\frac{1}{m}\sum_{i=1}^{m}u_{ij} \tag{12} $$

$$ \sigma_j=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(u_{ij}-\mu_j)^2} \tag{13} $$

这里必须强调一个和很多论文写法容易混淆的点:Z-score 阶段固定使用 ddof=0,这一口径不受参数 std_ddof 影响。

若 \(\sigma_j=0\),程序直接把该列置为 0,并追加告警,即

$$ z_{ij}=0 \tag{14} $$

3.6 Min-Max 阶段

无论用户起初选择的是 min-max 还是 z-score,程序最终都会执行一次 Max-Min 归一化。记进入该阶段的列值为 \(v_{ij}\),则

$$ n_{ij}=\frac{v_{ij}-v_j^{\min}}{v_j^{\max}-v_j^{\min}} \tag{15} $$

其中:

  • normalization="min-max" 时,\(v_{ij}=u_{ij}\);
  • normalization="z-score" 时,\(v_{ij}=z_{ij}\)。

若某列在进入该阶段时满足 \(v_j^{\max}=v_j^{\min}\),程序会直接令

$$ n_{ij}=0 \tag{16} $$

并写入“常数列”告警。

最终实际用于后续权重计算与综合评分的标准化矩阵记为

$$ N=(n_{ij})_{m\times n} \tag{17} $$

这意味着:即便适度指标在式(8)中已经被压到 \([0,1]\),项目仍会继续对其执行式(15)这一统一标准化步骤,而不是在式(8)后直接停止。

4. 标准差权重计算

4.1 标准差定义

在得到标准化矩阵 \(N\) 后,程序对每个指标列计算标准差。设第 \(j\) 个指标的均值为

$$ \bar{n}_j=\frac{1}{m}\sum_{i=1}^{m}n_{ij} \tag{18} $$

则其标准差定义为

$$ s_j=\sqrt{\frac{1}{m-\text{ddof}}\sum_{i=1}^{m}(n_{ij}-\bar{n}_j)^2} \tag{19} $$

其中

$$ \text{ddof}\in\{0,1\} \tag{20} $$

并由参数页中的 std_ddof 决定。

因此:

  • std_ddof=0 时,对应总体标准差;
  • std_ddof=1 时,对应样本标准差。

4.2 权重归一化

标准差赋权法在本项目中的权重定义为

$$ w_j=\frac{s_j}{\sum_{k=1}^{n}s_k} \tag{21} $$

$$ \sum_{k=1}^{n}s_k\le 0 \tag{22} $$

则程序直接报错“标准差为 0,无法计算权重”,不会继续生成结果。

这说明:当前实现不提供“全列无差异时自动回退等权”的兜底分支,而是明确认为此时不存在可区分的客观赋权基础。

5. 综合得分与排序

5.1 加权求和得分

当前 StandardDeviation 模块在得到权重后,直接采用加权求和得到对象综合得分。对第 \(i\) 个对象,其得分定义为

$$ S_i=\sum_{j=1}^{n}n_{ij}w_j \tag{23} $$

矩阵形式可写为

$$ S=Nw \tag{24} $$

这里 \(S=(S_1,S_2,\ldots,S_m)^\top\)。

5.2 排名规则

程序按得分降序排序,排名函数为

$$ R_i=\operatorname{rank}_{\downarrow}(S_i) \tag{25} $$

但实际代码采用的是 pandas.rank(ascending=False, method="min"),因此若有并列得分,则并列对象会取得相同的最小名次。例如两个对象并列第 2,则下一名次会跳到第 4。

此外,结果表会再按

  • 排名 升序;
  • 对象 升序

进行二次排序。因此,若得分或名次相同,最终展示顺序还会受对象名称字符串顺序影响。

6. 敏感性分析

6.1 开启条件

当参数页勾选 开启敏感性分析 时,程序会对每一个指标分别构造“权重上调”和“权重下调”两个扰动场景。

设原始权重向量为 \(w\),扰动比例为 \(\Delta\),若对第 \(j\) 个指标做正向扰动,则先令

$$ \tilde{w}_j^{(+)}=w_j(1+\Delta) \tag{26} $$

其余权重先保持原值不变,再整体归一化为

$$ w_k^{(+)}=\frac{\tilde{w}_k^{(+)}}{\sum_{r=1}^{n}\tilde{w}_r^{(+)}} \tag{27} $$

若做负向扰动,则程序先令

$$ \tilde{w}_j^{(-)}=w_j\max(0,1-\Delta) \tag{28} $$

再做相同的归一化。

6.2 输出指标

对每个扰动场景,程序重新计算得分,并与基准得分比较。设扰动后第 \(i\) 个对象的新得分为 \(S_i^{(\pm,j)}\),则分值变化量为

$$ \Delta S_i^{(\pm,j)}=S_i^{(\pm,j)}-S_i \tag{29} $$

结果表中输出两项统计量:

$$ \operatorname{MaxChange}_j^{(\pm)}= \max_{1\le i\le m}\left|\Delta S_i^{(\pm,j)}\right| \tag{30} $$

$$ \operatorname{MeanChange}_j^{(\pm)}= \frac{1}{m}\sum_{i=1}^{m}\left|\Delta S_i^{(\pm,j)}\right| \tag{31} $$

Excel Sensitivity 工作表与结果字典中的 step_results["sensitivity"] 都基于上述统计结果生成。

若用户输入的 sensitivity_delta 不在 \((0,1)\) 内,核心会自动把它重置为 0.1 并记录告警。

7. 结果结构、导出内容与工程约束

7.1 结果字典结构

Calculator.get_results() 返回的统一结果字典包含以下主键:

  • raw_data
  • processed_data
  • step_results
  • final_results
  • charts
  • parameters

其中:

  • raw_data 存储原始数据预览、字段名、形状和 source_file
  • processed_data 存储对象列、指标集合、指标类型、标准值、标准化方式、std_ddof 以及标准化矩阵预览;
  • step_results 存储标准差、权重、敏感性分析预览和告警列表;
  • final_results 存储最终权重、得分排名和权重统计量。

需要特别指出的是:processed_data["normalized"] 不是完整 DataFrame,而是包含

  • shape
  • columns
  • head

的预览字典。这是当前版本为控制结果体量而采取的工程化结构。

7.2 权重统计量

当前项目除输出权重向量外,还会附带三类集中度统计。设 \(w=(w_1,\ldots,w_n)\),则:

赫芬达尔指数(HHI)为

$$ HHI=\sum_{j=1}^{n}w_j^2 \tag{32} $$

有效指标数为

$$ N_{\text{eff}}=\frac{1}{\sum_{j=1}^{n}w_j^2} \tag{33} $$

权重熵为

$$ H(w)=-\sum_{j=1}^{n}w_j\ln w_j \tag{34} $$

但在实际代码中,式(34)仅对 \(w_j>0\) 的项求和。

这些统计量被写入 final_results["weights_stats"],并导出到 Excel 的 Weights_Stats 工作表。

7.3 Excel 导出结构

core/calculator.py 当前会输出以下工作表:

  • Parameters
  • RawData
  • Normalized
  • StdDeviations
  • Weights
  • Scores
  • Weights_Stats
  • Sensitivity
  • Warnings
  • Charts

需要注意:这些工作表名称全部采用英文命名,而不是中文命名,这一点与部分其他算法模块不同。

其中 Weights 表除 指标权重 外,还额外输出:

  • 权重(%)
  • 累计权重

7.4 图表输出

当前版本可输出的图表包括:

  • weights.png
  • weights_pie.png
  • scores.png
  • scores_sorted.png
  • std_values.png
  • sensitivity.png

其中 sensitivity.png 仅在开启敏感性分析时生成。

7.5 输出路径与复现脚本

若未传入 output_file,程序会在模块 results 目录下自动创建时间戳子目录,并生成

标准差赋权结果_时间戳.xlsx

若传入 output_file,程序也不会直接覆盖该路径,而是以目标文件名 stem 为基础再创建一个时间戳目录。

结果页 ui/results_widget.py 还支持导出复现脚本 repro_standard_deviation_template_时间戳.py。该脚本会:

  • 自动尝试定位算法目录;
  • 优先读取原始数据文件;
  • 若原始数据路径缺失,则尝试从结果 Excel 的 RawData 工作表回读数据;
  • 复用当前分析参数再次调用 Calculator.run_analysis()

因此,当前模块已经形成“结果文件 + 图表 + 复现脚本”的完整复现实验输出链。

8. 与代码实现的对应关系

与很多教材或论文中的“纯标准差赋权”描述相比,本项目当前实现有以下几个必须单独说明的差异:

8.1 不是只输出权重,而是直接输出排序

很多标准差赋权法文献只把该方法作为“客观确定权重”的步骤,再与 TOPSIS、VIKOR 或其他评价模型结合使用。而本项目当前实现直接采用式(23)的加权求和作为最终评价模型,因此它在工程上是一个完整的综合评价模块,而不是单独的赋权子模块。

8.2 负向指标和适度指标先处理,再统一标准化

本项目并不是在权重公式里单独区分成本项和效益项,而是在 core/calculator.py 中先把负向指标线性翻转、把适度指标转成接近度,再对所有列统一执行 z-scoremin-max。因此,最终标准差权重是建立在“已完成同向化”的矩阵 \(N\) 上,而不是原始矩阵 \(X\) 上。

8.3 std_ddof 只影响权重阶段,不影响 Z-score 阶段

这是当前实现中最容易被写错的一点:

  • Z-score 阶段固定使用 ddof=0
  • std_ddof 只作用于式(19)的标准差权重计算。

如果论文说明里把两者写成同一个自由参数,就与当前代码不一致。

8.4 上传页“提示但不阻断”,核心层再做兜底

重复对象名称、常数列在上传时不会直接中断,只会弹出提示。进入核心层后:

  • 重复对象仍允许继续计算,但会在 warnings 中写入提示;
  • 常数列在标准化后会变成 0 列,对应标准差为 0,最终权重为 0。

因此,当前实现属于“前端宽松校验 + 核心数值兜底”的风格,而不是严格前端阻断式校验。

9. 项目回归测试口径

当前模块已配套如下测试:

  • Z冒烟测试/test_standard_deviation_smoke.py
  • Z冒烟测试/test_standard_deviation_baseline.py
  • Z冒烟测试/test_standard_deviation_ui_flow.py

其中基线回归 test_standard_deviation_baseline.py 使用:

  • 指标集合:C1, C2, C3, C4
  • 指标类型:正向, 负向, 正向, 适度
  • 适度指标目标值:C4 = 58
  • 标准化方式:min-max
  • 标准差口径:std_ddof = 0
  • 敏感性分析:开启,\Delta = 0.1

在这一代码基线下,期望权重向量为

$$ w= \big( 0.2542656898,\ 0.2685571889,\ 0.2389167877,\ 0.2382603336 \big)^\top \tag{35} $$

对应的对象排序为

$$ A3 \succ A5 \succ A4 \succ A1 \succ A2 \succ A6 \tag{36} $$

对应得分为

$$ \big( 0.6128494944,\ 0.6069681257,\ 0.5608183124,\ 0.4764491629,\ 0.3977570101,\ 0.3696460865 \big) \tag{37} $$

同时,测试还要求 processed_data["normalized"]["shape"]=(6,4),并验证:

  • 权重和为 1;
  • 敏感性分析结果非空;
  • UI 流程可从上传页进入结果页并成功重置回首页。

因此,上述数值可以直接作为当前项目版本撰写论文说明、方法附录或复现实验描述时的代码口径依据。

10. 论文写作模板

10.1 方法描述模板

“本文采用标准差赋权法对评价对象进行综合评价。首先根据指标属性对原始决策矩阵进行同向化处理,其中负向指标按式(6)转换,适度指标按式(8)映射为目标接近度;随后依据研究设定采用 Min-Max 标准化或 Z-score 与 Min-Max 组合标准化,得到标准化矩阵 \(N\)(式(11)–式(17))。在此基础上,根据各指标标准差计算客观权重(式(18)–式(22)),并采用加权求和模型计算各对象综合得分 \(S_i\)(式(23)–式(24)),最终按得分降序形成排序结果(式(25))。”

10.2 结果解释模板

结果部分可写为:标准差赋权结果表明,指标离散程度越大,其客观权重越高,因此该方法能够突出区分度较强的指标。在综合结果解释中,应同时关注权重结果与对象得分结果:一方面,权重较大的指标往往是影响排序的主要驱动因素;另一方面,综合得分 \(S_i\) 越大表示对象整体表现越优。若敏感性分析结果中的最大变化量与平均变化量均较小,则说明当前排序对权重扰动具有较好的稳健性。

10.3 表格标题模板

  1. 表 1 指标类型、标准值与标准化方法设置表
  2. 表 2 标准差赋权结果表
  3. 表 3 各对象综合得分与排名结果表
  4. 表 4 权重集中度统计结果表
  5. 表 5 权重敏感性分析结果表

10.4 图表题注模板

  1. 图 1 标准差赋权指标权重条形图。
  2. 图 2 标准差赋权指标权重饼图。
  3. 图 3 各对象综合得分分布图。
  4. 图 4 各对象综合得分排序图。
  5. 图 5 指标标准差对比图。
  6. 图 6 权重敏感性分析图。

10.5 表格示例

表 1 标准差赋权综合评价结果

对象 综合得分 \(S_i\) 排名
A1
A2

表注:综合得分 \(S_i\) 按式(23)计算,取值越大表示对象越优。

表 2 指标权重与统计量结果

指标 权重 权重(%) 累计权重
\(C_1\)
\(C_2\)

表注:各指标权重由标准差归一化得到,见式(21);权重统计量可结合式(32)–式(34)分析权重集中程度。

11. 单篇终审补充

11.1 图题与表题对齐建议

  • Parameters 表可写为:表X 标准差赋权参数设置表。
  • RawData 表可写为:表X 标准差赋权原始数据表。
  • Normalized 表可写为:表X 标准差赋权标准化矩阵表。
  • StdDeviations 表可写为:表X 指标标准差结果表。
  • Weights 表可写为:表X 标准差赋权权重表。
  • Scores 表可写为:表X 标准差赋权综合得分表。
  • Weights_Stats 表可写为:表X 权重统计量结果表。
  • Sensitivity 表可写为:表X 标准差赋权敏感性分析表。
  • Charts 表可写为:表X 标准差赋权图表索引表。
  • weights.png 建议写为:图X 标准差赋权权重条形图。
  • weights_pie.png 建议写为:图X 标准差赋权权重饼图。
  • std_values.png 建议写为:图X 指标标准差对比图。
  • scores.png 建议写为:图X 综合得分图。
  • scores_sorted.png 建议写为:图X 综合得分排序图。
  • sensitivity.png 建议写为:图X 权重敏感性分析图。

11.2 终审说明

  • 当前代表性结果目录可采用 results/manual_check_20260321_01/std_manual_20260321_050829。其中主工作簿为 std_manual_20260321_050829.xlsx,复现输出为 标准差赋权复现结果_20260321_050830.xlsx
  • 当前真实工作表为 Parameters/RawData/Normalized/StdDeviations/Weights/Scores/Weights_Stats/Sensitivity/Charts。论文表题应按这组英文 sheet 名落地。
  • 当前稳定实体图文件为 charts/weights.pngcharts/weights_pie.pngcharts/std_values.pngcharts/scores.pngcharts/scores_sorted.pngcharts/sensitivity.png。若正文解释“标准差越大权重越高”,应直接对应 StdDeviations 工作表和 std_values.png
  • 真实 repro 脚本为 repro_standard_deviation_template_20260321_050830.py。它默认优先通过 SRC_FILE = 'uploads/standard_deviation_sample.xlsx' 回读算法目录下的示例输入;若 SRC_FILE 为空,才会回退读取结果簿 RawData。这属于“优先示例输入、次级结果簿回读”的复现口径。
  • 当前脚本命名虽然带 template,但调用的是真实 core.calculator。论文附录可以明确写它是可执行复现脚本,而不是文档模板。

11.3 全量强化补充

  • 当前 StandardDeviation 文档应绑定真实算法目录 具体的算法3/多指标评价/StandardDeviation-标准差赋权法,代表性主目录为 具体的算法3/多指标评价/StandardDeviation-标准差赋权法/results/manual_check_20260321_01/std_manual_20260321_050829
  • 该目录首层主工作簿为 std_manual_20260321_050829.xlsx,真实工作表为 ParametersRawDataNormalizedStdDeviationsWeightsScoresWeights_StatsSensitivityCharts
  • 主图位于 charts/ 子目录,真实文件为 weights.pngweights_pie.pngstd_values.pngscores.pngscores_sorted.pngsensitivity.png
  • 当前目录同时保留了一套完整再生产物目录 标准差赋权复现结果_20260321_050830/,其内部也有一份结构一致的 xlsx 和同名 charts/ 图。这说明这里不是只放一轮主结果,而是“首层主结果 + 子目录复现结果”的两层证据。
  • 复现脚本 repro_standard_deviation_template_20260321_050830.py 的关键输入写法是 SRC_FILE = 'uploads/standard_deviation_sample.xlsx',并且输出文件路径写为 OUTPUT_FILE = RESULT_DIR / f'标准差赋权复现结果_{TS}.xlsx'。因此其复现链属于“回指算法 uploads 示例输入,再在结果目录生成新子目录产物”的结构。
  • 正文与附录若讨论可复现性,应明确把 std_manual_20260321_050829.xlsx 作为主结果,把 标准差赋权复现结果_20260321_050830/标准差赋权复现结果_20260321_050830.xlsx 作为复现再生产物,不要混写成同一份工作簿。

12. 软件实现核查补充(2026-07)

  • 当前主结果目录应写作 具体的算法3/多指标评价/StandardDeviation-标准差赋权法/results/manual_check_20260321_01/std_manual_20260321_050829
  • 正文应围绕 ParametersRawDataNormalizedStdDeviationsWeightsScoresWeights_StatsSensitivityCharts 来写。
  • 图证应对应 weights.pngweights_pie.pngstd_values.pngscores.pngscores_sorted.pngsensitivity.png
  • 复现脚本应按 repro_standard_deviation_template_20260321_050830.py + uploads/standard_deviation_sample.xlsx 的口径说明;标准差赋权复现结果_20260321_050830/ 只作为复现再生产物。