StabilityAnalyzer.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /*
  2. 详细的伪代码计划 (以注释形式嵌入文件头部)
  3. 1. 定义 StabilityAnalyzer 类及其内部类 StabilityMetrics:
  4. - StabilityMetrics 包含:Mean, StdDeviation, ThreeSigmaRange, Kurtosis, Cpk, Range, CV, Confidence95
  5. - 每个属性在注释中说明含义与计算公式
  6. 2. AnalyzeStability 方法:
  7. - 将输入值转换为数组并验证长度(至少10个数据点)
  8. - 计算平均值 mean(data.Average())
  9. - 计算标准差 stdDev(调用 CalculateStandardDeviation)
  10. - 构建 StabilityMetrics 实例并填充:
  11. - Mean = mean
  12. - StdDeviation = stdDev
  13. - ThreeSigmaRange = 6 * stdDev (表示 ±3σ 的区间宽度)
  14. - Kurtosis = CalculateKurtosis(data)
  15. - Range = data.Max() - data.Min()
  16. - CV = (stdDev / mean) * 100 (百分比)
  17. - Confidence95 = Calculate95ConfidenceInterval(data)
  18. - 如果提供上下规格限(lowerSpec 和 upperSpec),调用 CalculateProcessCapability 并设置 metrics.Cpk
  19. - 返回 metrics
  20. 3. GetStabilityRating 方法:
  21. - 基于标准差评级返回稳定性评价字符串
  22. 4. GetCpkRating 方法:
  23. - 根据 cpk 返回等级字符串
  24. 5. 统计计算辅助方法:
  25. - CalculateStandardDeviation:样本标准差,采用 n-1 分母(样本标准差)
  26. - CalculateRange:极差(最大值 - 最小值)
  27. - CalculateCV:变异系数,返回百分比
  28. - CalculateAccuracy:与理论值的绝对偏差
  29. - Calculate95ConfidenceInterval:95%置信区间,使用 1.96 * s / sqrt(n)
  30. - GetStdDeviation:封装标准差计算
  31. - Get3SigmaRange:返回平均值 ± 3σ 的上下限
  32. - CalculateKurtosis:使用 Fisher 定义(正态分布为 0)的峰度计算公式
  33. - CalculateProcessCapability:计算 Cp 和 Cpk,使用 6σ 和 3σ 的定义,返回 (cp, cpk)
  34. 4. 注释策略:
  35. - 对所有公开类、属性和方法添加 XML 注释(供 VS IntelliSense 使用)
  36. - 在方法内部添加行内注释,解释关键步骤与公式
  37. - 保持注释为中文,简洁明确,便于维护
  38. 以上伪代码被置于文件顶部注释中,随后是实现代码,包含完整的中文注释与 XML 文档注释。
  39. */
  40. using System;
  41. using System.Collections.Generic;
  42. using System.Linq;
  43. namespace TeamAAS_VP.Core
  44. {
  45. /// <summary>
  46. /// 稳定性分析器:提供一组统计方法用于评估一组数值数据的稳定性与过程能力。
  47. /// </summary>
  48. public class StabilityAnalyzer
  49. {
  50. /// <summary>
  51. /// 稳定性度量结果集
  52. /// </summary>
  53. public class StabilityMetrics
  54. {
  55. /// <summary>
  56. /// 样本平均值
  57. /// </summary>
  58. public double Mean { get; set; } // 平均值
  59. /// <summary>
  60. /// 样本标准差(使用 n-1 分母的样本标准差)
  61. /// </summary>
  62. public double StdDeviation { get; set; } // 标准差 (核心1)
  63. /// <summary>
  64. /// 3σ 区间的宽度(等于 6 * StdDeviation,表示 ±3σ 总宽)
  65. /// </summary>
  66. public double ThreeSigmaRange { get; set; } // 3σ范围 (核心2)
  67. /// <summary>
  68. /// 峰度(使用 Fisher 定义,正态分布为 0)
  69. /// </summary>
  70. public double Kurtosis { get; set; } // 峰度 (核心3)
  71. /// <summary>
  72. /// 过程能力指数 Cpk(若未提供规格限则为默认 0)
  73. /// </summary>
  74. public double Cpk { get; set; } // 过程能力指数 (核心4)
  75. /// <summary>
  76. /// 极差(最大值 - 最小值)
  77. /// </summary>
  78. public double Range { get; set; } // 极差
  79. /// <summary>
  80. /// 变异系数(标准差 / 平均值 * 100%)
  81. /// </summary>
  82. public double CV { get; set; } // 变异系数
  83. /// <summary>
  84. /// 95% 置信区间,返回 (Lower, Upper)
  85. /// </summary>
  86. public (double Lower, double Upper) Confidence95 { get; set; }
  87. }
  88. /// <summary>
  89. /// 对一组数值进行稳定性分析,返回各项统计度量。
  90. /// </summary>
  91. /// <param name="values">输入数据序列(至少 10 个点)</param>
  92. /// <param name="lowerSpec">下规格限(可选)</param>
  93. /// <param name="upperSpec">上规格限(可选)</param>
  94. /// <returns>StabilityMetrics 包含多项指标</returns>
  95. /// <exception cref="ArgumentException">当数据点少于 10 个时抛出</exception>
  96. public static StabilityMetrics AnalyzeStability(IEnumerable<double> values,
  97. double? lowerSpec = null,
  98. double? upperSpec = null)
  99. {
  100. // 将输入转换为数组以便重复使用并获取长度
  101. var data = values.ToArray();
  102. if (data.Length < 10) throw new ArgumentException("至少需要10个数据点");
  103. // 计算平均值与标准差(样本标准差)
  104. var mean = data.Average();
  105. var stdDev = CalculateStandardDeviation(data);
  106. // 构建指标对象并填充常规统计量
  107. var metrics = new StabilityMetrics
  108. {
  109. Mean = mean,
  110. StdDeviation = stdDev,
  111. // ThreeSigmaRange 表示 ±3σ 的总宽度(6σ)
  112. ThreeSigmaRange = CalculateKurtosis(data),//6 * stdDev,
  113. Kurtosis = CalculateKurtosis(data),
  114. Range = data.Max() - data.Min(),
  115. // 变异系数以百分比形式表示
  116. CV = (stdDev / mean) * 100,
  117. Confidence95 = Calculate95ConfidenceInterval(data)
  118. };
  119. // 如果提供了规格限,则计算并设置 Cpk(cp 也被计算但不保存)
  120. if (lowerSpec.HasValue && upperSpec.HasValue)
  121. {
  122. metrics.Cpk = CalculateProcessCapability(data,
  123. lowerSpec.Value, upperSpec.Value).cpk;
  124. }
  125. return metrics;
  126. }
  127. /// <summary>
  128. /// 根据标准差(StdDeviation)返回稳定性等级描述。
  129. /// 阈值为经验值,可根据业务需求调整。
  130. /// </summary>
  131. /// <param name="metrics">稳定性度量结果</param>
  132. /// <returns>稳定性等级字符串(中文 + 英文)</returns>
  133. public static string GetStabilityRating(StabilityMetrics metrics)
  134. {
  135. // 根据标准差的绝对值分级:阈值为示例值,应结合量纲与业务场景判断
  136. if (metrics.StdDeviation < 0.001)
  137. return "优秀 (Excellent)";
  138. else if (metrics.StdDeviation < 0.005)
  139. return "良好 (Good)";
  140. else if (metrics.StdDeviation < 0.01)
  141. return "合格 (Acceptable)";
  142. else
  143. return "不稳定 (Unstable)";
  144. }
  145. /// <summary>
  146. /// 根据 Cpk 值返回过程能力等级(常用阈值)
  147. /// </summary>
  148. /// <param name="cpk">Cpk 值</param>
  149. /// <returns>等级描述(中文)</returns>
  150. public static string GetCpkRating(double cpk)
  151. {
  152. if (cpk >= 1.67) return "卓越";
  153. if (cpk >= 1.33) return "良好";
  154. if (cpk >= 1.00) return "可接受";
  155. if (cpk >= 0.67) return "不足";
  156. return "严重不足";
  157. }
  158. /// <summary>
  159. /// 计算样本标准差(除以 n-1),适用于样本数据的离散程度估计。
  160. /// 公式:sqrt( Sum((x - mean)^2) / (n - 1) )
  161. /// </summary>
  162. /// <param name="values">输入数据序列</param>
  163. /// <returns>样本标准差</returns>
  164. public static double CalculateStandardDeviation(IEnumerable<double> values)
  165. {
  166. var vals = values.ToArray();
  167. var n = vals.Length;
  168. if (n < 2) return 0.0;
  169. var avg = vals.Average();
  170. var sumSq = vals.Sum(v => Math.Pow(v - avg, 2));
  171. // 使用样本标准差(除以 n-1)
  172. return Math.Sqrt(sumSq / (n - 1));
  173. }
  174. /// <summary>
  175. /// 计算极差(最大值 - 最小值)
  176. /// </summary>
  177. /// <param name="values">输入数据序列</param>
  178. /// <returns>极差</returns>
  179. public static double CalculateRange(IEnumerable<double> values)
  180. {
  181. var vals = values.ToArray();
  182. if (vals.Length == 0) return 0.0;
  183. return vals.Max() - vals.Min();
  184. }
  185. /// <summary>
  186. /// 计算变异系数(标准差 / 平均值 * 100%)
  187. /// </summary>
  188. /// <param name="values">输入数据序列</param>
  189. /// <returns>变异系数的百分比表示</returns>
  190. public static double CalculateCV(IEnumerable<double> values)
  191. {
  192. var vals = values.ToArray();
  193. var stdDev = CalculateStandardDeviation(vals);
  194. var mean = vals.Average();
  195. if (Math.Abs(mean) < double.Epsilon) return double.NaN; // 避免除以 0
  196. return (stdDev / mean) * 100; // 百分比
  197. }
  198. /// <summary>
  199. /// 计算与理论值的绝对偏差(常用于评估准确性)
  200. /// </summary>
  201. /// <param name="values">输入数据序列</param>
  202. /// <param name="theoreticalValue">理论或目标值</param>
  203. /// <returns>平均值与理论值的绝对差</returns>
  204. public static double CalculateAccuracy(IEnumerable<double> values, double theoreticalValue)
  205. {
  206. var mean = values.Average();
  207. return Math.Abs(mean - theoreticalValue);
  208. }
  209. /// <summary>
  210. /// 计算 95% 置信区间(基于正态近似,使用 z=1.96)
  211. /// 置信区间 = mean ± 1.96 * s / sqrt(n)
  212. /// </summary>
  213. /// <param name="values">输入数据序列</param>
  214. /// <returns>置信区间下限与上限</returns>
  215. public static (double lower, double upper) Calculate95ConfidenceInterval(IEnumerable<double> values)
  216. {
  217. var vals = values.ToArray();
  218. var n = vals.Length;
  219. if (n == 0) return (0, 0);
  220. var mean = vals.Average();
  221. var stdDev = CalculateStandardDeviation(vals);
  222. var margin = 1.96 * stdDev / Math.Sqrt(n); // 1.96 对应 95% 置信度(正态分布近似)
  223. return (mean - margin, mean + margin);
  224. }
  225. /// <summary>
  226. /// 便捷方法:返回样本标准差
  227. /// </summary>
  228. /// <param name="values">输入数据序列</param>
  229. /// <returns>样本标准差</returns>
  230. public static double GetStdDeviation(IEnumerable<double> values)
  231. {
  232. return CalculateStandardDeviation(values);
  233. }
  234. /// <summary>
  235. /// 返回平均值 ± 3σ 的上下限(约包含 99.73% 的正态分布数据)
  236. /// </summary>
  237. /// <param name="values">输入数据序列</param>
  238. /// <returns>(lower, upper)</returns>
  239. public static (double lower, double upper) Get3SigmaRange(IEnumerable<double> values)
  240. {
  241. var vals = values.ToArray();
  242. if (vals.Length == 0) return (0, 0);
  243. var mean = vals.Average();
  244. var stdDev = CalculateStandardDeviation(vals);
  245. return (mean - 3 * stdDev, mean + 3 * stdDev);
  246. }
  247. /// <summary>
  248. /// 计算峰度(Kurtosis),使用 Fisher 定义(返回值在正态分布时为 0)
  249. /// 公式(简化样本版本): (n * sum((x-mean)^4)) / (sum((x-mean)^2)^2) - 3
  250. /// </summary>
  251. /// <param name="values">输入数据序列</param>
  252. /// <returns>峰度值</returns>
  253. public static double CalculateKurtosis(IEnumerable<double> values)
  254. {
  255. var vals = values.ToArray();
  256. var n = vals.Length;
  257. if (n < 4) return 0.0; // 数据过少时峰度意义不大
  258. var mean = vals.Average();
  259. var sum4 = vals.Sum(v => Math.Pow(v - mean, 4));
  260. var sum2 = vals.Sum(v => Math.Pow(v - mean, 2));
  261. if (Math.Abs(sum2) < double.Epsilon) return 0.0;
  262. // Fisher 峰度(正态分布为 0)
  263. return (n * sum4) / Math.Pow(sum2, 2) - 3;
  264. }
  265. /// <summary>
  266. /// 计算过程能力指标 Cp 与 Cpk
  267. /// Cp = (USL - LSL) / (6 * sigma)
  268. /// Cpk = min( (USL - mean) / (3 * sigma), (mean - LSL) / (3 * sigma) )
  269. /// </summary>
  270. /// <param name="values">输入数据序列</param>
  271. /// <param name="lowerSpec">下规格限(LSL)</param>
  272. /// <param name="upperSpec">上规格限(USL)</param>
  273. /// <returns>(cp, cpk)</returns>
  274. public static (double cp, double cpk) CalculateProcessCapability(
  275. IEnumerable<double> values,
  276. double lowerSpec,
  277. double upperSpec)
  278. {
  279. var vals = values.ToArray();
  280. var stdDev = CalculateStandardDeviation(vals);
  281. var mean = vals.Average();
  282. if (stdDev <= 0) return (double.NaN, double.NaN); // 避免除以 0
  283. // Cp 反映公差带相对于总体变异的宽度
  284. var cp = (upperSpec - lowerSpec) / (6 * stdDev);
  285. // Cpk 考虑均值偏移,取靠近任一边的能力
  286. var cpu = (upperSpec - mean) / (3 * stdDev);
  287. var cpl = (mean - lowerSpec) / (3 * stdDev);
  288. var cpk = Math.Min(cpu, cpl);
  289. return (cp, cpk);
  290. }
  291. }
  292. }