| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- /*
- 详细的伪代码计划 (以注释形式嵌入文件头部)
- 1. 定义 StabilityAnalyzer 类及其内部类 StabilityMetrics:
- - StabilityMetrics 包含:Mean, StdDeviation, ThreeSigmaRange, Kurtosis, Cpk, Range, CV, Confidence95
- - 每个属性在注释中说明含义与计算公式
- 2. AnalyzeStability 方法:
- - 将输入值转换为数组并验证长度(至少10个数据点)
- - 计算平均值 mean(data.Average())
- - 计算标准差 stdDev(调用 CalculateStandardDeviation)
- - 构建 StabilityMetrics 实例并填充:
- - Mean = mean
- - StdDeviation = stdDev
- - ThreeSigmaRange = 6 * stdDev (表示 ±3σ 的区间宽度)
- - Kurtosis = CalculateKurtosis(data)
- - Range = data.Max() - data.Min()
- - CV = (stdDev / mean) * 100 (百分比)
- - Confidence95 = Calculate95ConfidenceInterval(data)
- - 如果提供上下规格限(lowerSpec 和 upperSpec),调用 CalculateProcessCapability 并设置 metrics.Cpk
- - 返回 metrics
- 3. GetStabilityRating 方法:
- - 基于标准差评级返回稳定性评价字符串
- 4. GetCpkRating 方法:
- - 根据 cpk 返回等级字符串
- 5. 统计计算辅助方法:
- - CalculateStandardDeviation:样本标准差,采用 n-1 分母(样本标准差)
- - CalculateRange:极差(最大值 - 最小值)
- - CalculateCV:变异系数,返回百分比
- - CalculateAccuracy:与理论值的绝对偏差
- - Calculate95ConfidenceInterval:95%置信区间,使用 1.96 * s / sqrt(n)
- - GetStdDeviation:封装标准差计算
- - Get3SigmaRange:返回平均值 ± 3σ 的上下限
- - CalculateKurtosis:使用 Fisher 定义(正态分布为 0)的峰度计算公式
- - CalculateProcessCapability:计算 Cp 和 Cpk,使用 6σ 和 3σ 的定义,返回 (cp, cpk)
- 4. 注释策略:
- - 对所有公开类、属性和方法添加 XML 注释(供 VS IntelliSense 使用)
- - 在方法内部添加行内注释,解释关键步骤与公式
- - 保持注释为中文,简洁明确,便于维护
- 以上伪代码被置于文件顶部注释中,随后是实现代码,包含完整的中文注释与 XML 文档注释。
- */
- using System;
- using System.Collections.Generic;
- using System.Linq;
- namespace TeamAAS_VP.Core
- {
- /// <summary>
- /// 稳定性分析器:提供一组统计方法用于评估一组数值数据的稳定性与过程能力。
- /// </summary>
- public class StabilityAnalyzer
- {
- /// <summary>
- /// 稳定性度量结果集
- /// </summary>
- public class StabilityMetrics
- {
- /// <summary>
- /// 样本平均值
- /// </summary>
- public double Mean { get; set; } // 平均值
- /// <summary>
- /// 样本标准差(使用 n-1 分母的样本标准差)
- /// </summary>
- public double StdDeviation { get; set; } // 标准差 (核心1)
- /// <summary>
- /// 3σ 区间的宽度(等于 6 * StdDeviation,表示 ±3σ 总宽)
- /// </summary>
- public double ThreeSigmaRange { get; set; } // 3σ范围 (核心2)
- /// <summary>
- /// 峰度(使用 Fisher 定义,正态分布为 0)
- /// </summary>
- public double Kurtosis { get; set; } // 峰度 (核心3)
- /// <summary>
- /// 过程能力指数 Cpk(若未提供规格限则为默认 0)
- /// </summary>
- public double Cpk { get; set; } // 过程能力指数 (核心4)
- /// <summary>
- /// 极差(最大值 - 最小值)
- /// </summary>
- public double Range { get; set; } // 极差
- /// <summary>
- /// 变异系数(标准差 / 平均值 * 100%)
- /// </summary>
- public double CV { get; set; } // 变异系数
- /// <summary>
- /// 95% 置信区间,返回 (Lower, Upper)
- /// </summary>
- public (double Lower, double Upper) Confidence95 { get; set; }
- }
- /// <summary>
- /// 对一组数值进行稳定性分析,返回各项统计度量。
- /// </summary>
- /// <param name="values">输入数据序列(至少 10 个点)</param>
- /// <param name="lowerSpec">下规格限(可选)</param>
- /// <param name="upperSpec">上规格限(可选)</param>
- /// <returns>StabilityMetrics 包含多项指标</returns>
- /// <exception cref="ArgumentException">当数据点少于 10 个时抛出</exception>
- public static StabilityMetrics AnalyzeStability(IEnumerable<double> values,
- double? lowerSpec = null,
- double? upperSpec = null)
- {
- // 将输入转换为数组以便重复使用并获取长度
- var data = values.ToArray();
- if (data.Length < 10) throw new ArgumentException("至少需要10个数据点");
- // 计算平均值与标准差(样本标准差)
- var mean = data.Average();
- var stdDev = CalculateStandardDeviation(data);
- // 构建指标对象并填充常规统计量
- var metrics = new StabilityMetrics
- {
- Mean = mean,
- StdDeviation = stdDev,
- // ThreeSigmaRange 表示 ±3σ 的总宽度(6σ)
- ThreeSigmaRange = CalculateKurtosis(data),//6 * stdDev,
- Kurtosis = CalculateKurtosis(data),
- Range = data.Max() - data.Min(),
- // 变异系数以百分比形式表示
- CV = (stdDev / mean) * 100,
- Confidence95 = Calculate95ConfidenceInterval(data)
- };
- // 如果提供了规格限,则计算并设置 Cpk(cp 也被计算但不保存)
- if (lowerSpec.HasValue && upperSpec.HasValue)
- {
- metrics.Cpk = CalculateProcessCapability(data,
- lowerSpec.Value, upperSpec.Value).cpk;
- }
- return metrics;
- }
- /// <summary>
- /// 根据标准差(StdDeviation)返回稳定性等级描述。
- /// 阈值为经验值,可根据业务需求调整。
- /// </summary>
- /// <param name="metrics">稳定性度量结果</param>
- /// <returns>稳定性等级字符串(中文 + 英文)</returns>
- public static string GetStabilityRating(StabilityMetrics metrics)
- {
- // 根据标准差的绝对值分级:阈值为示例值,应结合量纲与业务场景判断
- if (metrics.StdDeviation < 0.001)
- return "优秀 (Excellent)";
- else if (metrics.StdDeviation < 0.005)
- return "良好 (Good)";
- else if (metrics.StdDeviation < 0.01)
- return "合格 (Acceptable)";
- else
- return "不稳定 (Unstable)";
- }
- /// <summary>
- /// 根据 Cpk 值返回过程能力等级(常用阈值)
- /// </summary>
- /// <param name="cpk">Cpk 值</param>
- /// <returns>等级描述(中文)</returns>
- public static string GetCpkRating(double cpk)
- {
- if (cpk >= 1.67) return "卓越";
- if (cpk >= 1.33) return "良好";
- if (cpk >= 1.00) return "可接受";
- if (cpk >= 0.67) return "不足";
- return "严重不足";
- }
- /// <summary>
- /// 计算样本标准差(除以 n-1),适用于样本数据的离散程度估计。
- /// 公式:sqrt( Sum((x - mean)^2) / (n - 1) )
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>样本标准差</returns>
- public static double CalculateStandardDeviation(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- var n = vals.Length;
- if (n < 2) return 0.0;
- var avg = vals.Average();
- var sumSq = vals.Sum(v => Math.Pow(v - avg, 2));
- // 使用样本标准差(除以 n-1)
- return Math.Sqrt(sumSq / (n - 1));
- }
- /// <summary>
- /// 计算极差(最大值 - 最小值)
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>极差</returns>
- public static double CalculateRange(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- if (vals.Length == 0) return 0.0;
- return vals.Max() - vals.Min();
- }
- /// <summary>
- /// 计算变异系数(标准差 / 平均值 * 100%)
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>变异系数的百分比表示</returns>
- public static double CalculateCV(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- var stdDev = CalculateStandardDeviation(vals);
- var mean = vals.Average();
- if (Math.Abs(mean) < double.Epsilon) return double.NaN; // 避免除以 0
- return (stdDev / mean) * 100; // 百分比
- }
- /// <summary>
- /// 计算与理论值的绝对偏差(常用于评估准确性)
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <param name="theoreticalValue">理论或目标值</param>
- /// <returns>平均值与理论值的绝对差</returns>
- public static double CalculateAccuracy(IEnumerable<double> values, double theoreticalValue)
- {
- var mean = values.Average();
- return Math.Abs(mean - theoreticalValue);
- }
- /// <summary>
- /// 计算 95% 置信区间(基于正态近似,使用 z=1.96)
- /// 置信区间 = mean ± 1.96 * s / sqrt(n)
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>置信区间下限与上限</returns>
- public static (double lower, double upper) Calculate95ConfidenceInterval(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- var n = vals.Length;
- if (n == 0) return (0, 0);
- var mean = vals.Average();
- var stdDev = CalculateStandardDeviation(vals);
- var margin = 1.96 * stdDev / Math.Sqrt(n); // 1.96 对应 95% 置信度(正态分布近似)
- return (mean - margin, mean + margin);
- }
- /// <summary>
- /// 便捷方法:返回样本标准差
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>样本标准差</returns>
- public static double GetStdDeviation(IEnumerable<double> values)
- {
- return CalculateStandardDeviation(values);
- }
- /// <summary>
- /// 返回平均值 ± 3σ 的上下限(约包含 99.73% 的正态分布数据)
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>(lower, upper)</returns>
- public static (double lower, double upper) Get3SigmaRange(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- if (vals.Length == 0) return (0, 0);
- var mean = vals.Average();
- var stdDev = CalculateStandardDeviation(vals);
- return (mean - 3 * stdDev, mean + 3 * stdDev);
- }
- /// <summary>
- /// 计算峰度(Kurtosis),使用 Fisher 定义(返回值在正态分布时为 0)
- /// 公式(简化样本版本): (n * sum((x-mean)^4)) / (sum((x-mean)^2)^2) - 3
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <returns>峰度值</returns>
- public static double CalculateKurtosis(IEnumerable<double> values)
- {
- var vals = values.ToArray();
- var n = vals.Length;
- if (n < 4) return 0.0; // 数据过少时峰度意义不大
- var mean = vals.Average();
- var sum4 = vals.Sum(v => Math.Pow(v - mean, 4));
- var sum2 = vals.Sum(v => Math.Pow(v - mean, 2));
- if (Math.Abs(sum2) < double.Epsilon) return 0.0;
- // Fisher 峰度(正态分布为 0)
- return (n * sum4) / Math.Pow(sum2, 2) - 3;
- }
- /// <summary>
- /// 计算过程能力指标 Cp 与 Cpk
- /// Cp = (USL - LSL) / (6 * sigma)
- /// Cpk = min( (USL - mean) / (3 * sigma), (mean - LSL) / (3 * sigma) )
- /// </summary>
- /// <param name="values">输入数据序列</param>
- /// <param name="lowerSpec">下规格限(LSL)</param>
- /// <param name="upperSpec">上规格限(USL)</param>
- /// <returns>(cp, cpk)</returns>
- public static (double cp, double cpk) CalculateProcessCapability(
- IEnumerable<double> values,
- double lowerSpec,
- double upperSpec)
- {
- var vals = values.ToArray();
- var stdDev = CalculateStandardDeviation(vals);
- var mean = vals.Average();
- if (stdDev <= 0) return (double.NaN, double.NaN); // 避免除以 0
- // Cp 反映公差带相对于总体变异的宽度
- var cp = (upperSpec - lowerSpec) / (6 * stdDev);
- // Cpk 考虑均值偏移,取靠近任一边的能力
- var cpu = (upperSpec - mean) / (3 * stdDev);
- var cpl = (mean - lowerSpec) / (3 * stdDev);
- var cpk = Math.Min(cpu, cpl);
- return (cp, cpk);
- }
- }
- }
|