C#实现封装SPC过程能力工具类ProcessCababilityHelper

  • 背景
  • 代码实现
    • 直方图分组确定
    • 获取子组容量
    • 获取望目值
    • 获取分辨率,如果返回resolution为0,则标识数组中数据均相同
    • 组距,数据有误或数据均相同时返回0
    • 获取组内左边界
    • 获取组内右边界
    • 获取组内中值
    • 分布密度
    • 获取正态分布数据密度
    • 获取单个正态分布数据
    • 获取组内正态分布数据密度
    • 获取准确度
    • ppm小于lsl,ppm百万分之不良
    • ppm大于usl,ppm百万分之不良
    • 获取正三倍标准差
    • 获取负三倍标准差
  • 完整代码下载

背景

在不同项目开的发过程中,可能会用到许多相同或类似的功能开发或业务处理,从抽象设计的角度考虑,通常会把这些功能或业务操作进行封装,方便在不同项目中调用,这也是重用思想的重要体现。本次分享的是在C#中实现SPC过程能力相关方法的封转,是六西格玛数据统计工具类SixSigmaHelper类的功能补充。在大数据、人工智能、数据科学家炙手可热的当下,本类可以说是C#工程师在处理数据分析业务上的必备类。

相关概念请学习SPC相关课程和歇息MiniTab工具的使用
本类依赖SixSigmaHelper,请参看https://blog.csdn.net/zlbdmm/article/details/101770432

代码实现

直方图分组确定

/// <summary>
/// 直方图分组确定
/// </summary>
/// <param name="length">样本数</param>
/// <returns>返回分组数</returns>
public static int GetGroupNum(int length)
{double k = 1 + 3.31 * Math.Log10(length);return (int)Math.Floor(k);
}

获取子组容量

/// <summary>
/// 获取子组容量
/// </summary>
/// <param name="length">样本数</param>
/// <param name="groupNum">子组数</param>
/// <returns>返回子组容量</returns>
public static int GetGroupSize(int length, int groupNum)
{return (int)Math.Ceiling((decimal)length / (decimal)groupNum);
}

获取望目值

/// <summary>
/// 获取望目值
/// </summary>
/// <param name="usl">目标上限值</param>
/// <param name="lsl">目标下限值</param>
/// <returns>返回望目值</returns>
public static double GetTarget(double usl, double lsl)
{return DoubleFormat(5, (usl + lsl) / 2);
}

获取分辨率,如果返回resolution为0,则标识数组中数据均相同

/// <summary>
/// 获取分辨率,如果返回resolution为0,则标识数组中数据均相同
/// </summary>
/// <param name="original">原始数据</param>
/// <returns>返回数据分辨率</returns>
public static double GetResolution(double[] original)
{try{Array.Sort(original);if (original.Length == 1){return DoubleFormat(5, original[0]);}double resolution = 0.0;for (int i = 1; i < original.Length; i++){resolution = original[i] - original[i - 1];if (resolution > 0){break;}}return DoubleFormat(5, resolution);}catch (Exception ex){return 0.0;}
}

组距,数据有误或数据均相同时返回0

/// <summary>
/// 组距,数据有误或数据均相同时返回0
/// </summary>
/// <param name="digits">精度,小数位数</param>
/// <param name="max">最大值</param>
/// <param name="min">最小值</param>
/// <param name="groupNum">子组数</param>
/// <param name="original">原始数据</param>
/// <returns>返回组距</returns>
public static double GetGroupDistance(int digits, double max, double min, int groupNum, double[] original)
{double gd = 0.0;if (GetResolution(original) != 0){double r = GetResolution(original);double originalDistance = Math.Abs(max - min) / groupNum;gd = DoubleFormat(digits, Math.Ceiling(originalDistance / r) * r);}return gd;
}

获取组内左边界

/// <summary>
/// 获取组内左边界
/// </summary>
/// <param name="min">最小值</param>
/// <param name="groupDistance">组距</param>
/// <param name="groupNum">子组数</param>
/// <returns>返回组内左边界</returns>
public static double[] GetGroupDownBound(double min, double groupDistance, int groupNum)
{double[] gdb = new double[groupNum];for(int i= 1;i <= groupNum; i++){gdb[i - 1] = DoubleFormat(5, min + (i - 1) * groupDistance - groupDistance / 2);}return gdb;
}

获取组内右边界

/// <summary>
/// 获取组内右边界
/// </summary>
/// <param name="min">最小值</param>
/// <param name="groupDistance">组距</param>
/// <param name="groupNum">子组数</param>
/// <returns>返回组内右边界</returns>
public static double[] GetGroupUpBound(double min, double groupDistance, int groupNum)
{double[] gub = new double[groupNum];for(int i= 1;i <= groupNum; i++){gub[i - 1] = DoubleFormat(5, min + (i - 1) * groupDistance + groupDistance / 2);}return gub;
}

获取组内中值

/// <summary>
/// 获取组内中值
/// </summary>
/// <param name="min">最小值</param>
/// <param name="groupDistance">组距</param>
/// <param name="groupNum">子组数</param>
/// <returns>返回组内中值</returns>
public static double[] GetGroupMedian(double min, double groupDistance, int groupNum)
{double[] gm = new double[groupNum];for (int i = 1; i <= groupNum; i++){gm[i - 1] = DoubleFormat(5, min + (i - 1) * groupDistance);}return gm;
}

分布密度

/// <summary>
/// 分布密度
/// </summary>
/// <param name="groupDistance">组距</param>
/// <param name="groupDownBound">组内左边界</param>
/// <param name="groupUpBound">组内右边界</param>
/// <param name="original">原始数据</param>
/// <returns>返回分布密度</returns>
public static double[] GetDistributionDensity(double groupDistance, double[] groupDownBound, double[] groupUpBound, double[] original)
{double[] g = new double[groupUpBound.Length];double[] count = new double[groupUpBound.Length];//初始化count数值for(int i= 0;i<count.Length;i++){count[i] = 0.0;}for (int i = 0; i < groupUpBound.Length; i++){for (int j = 0; j < original.Length; j++){if (groupDownBound[i] < original[j] && original[j] < groupUpBound[i]){count[i] = count[i] + 1;}}}for (int i = 0; i < count.Length; i++){g[i] = DoubleFormat(5, (count[i] / original.Length) * (1 / groupDistance));}return g;
}

获取正态分布数据密度

/// <summary>
/// 获取正态分布数据密度
/// </summary>
/// <param name="original">原始数据</param>
/// <returns>返回分布密度</returns>
public static double[] GetNormalDistribution(double[] original)
{double[] values = new double[original.Length];for (int i = 0; i < original.Length; i++){values[i] = DoubleFormat(5, 1 / ((Math.Sqrt(2 * Math.PI) * SixSigmaHelper.GetTotalStdDev(original))) * Math.Pow(Math.E, -Math.Pow((original[i] - SixSigmaHelper.GetAverageValue(original)), 2) / (2 * Math.Pow(SixSigmaHelper.GetTotalStdDev(original), 2))));}return values;
}

获取单个正态分布数据

/// <summary>
/// 获取单个正态分布数据
/// </summary>
/// <param name="x"></param>
/// <param name="ave">均值</param>
/// <param name="stdDev">标准差</param>
/// <returns>返回单个正态分布数据</returns>
public static double GetNormalDistributionValue(double x, double ave, double stdDev)
{return DoubleFormat(5, 1 / ((Math.Sqrt(2 * Math.PI) * stdDev)) * Math.Pow(Math.E, -Math.Pow((x - ave), 2) / (2 * Math.Pow(stdDev, 2))));
}

获取组内正态分布数据密度

/// <summary>
/// 获取组内正态分布数据密度
/// </summary>
/// <param name="groupNum">子组数</param>
/// <param name="original">原始数据</param>
/// <returns>返回组内正态分布数据密度</returns>
public static double[] GetGroupNormalDistribution(int groupNum, double[] original)
{double[] values = new double[original.Length];double inGroupStdDev = SixSigmaHelper.GetInGroupStdDev(2, original);double ave = SixSigmaHelper.GetAverageValue(original);for (int i = 0; i < original.Length; i++){values[i] = DoubleFormat(5, 1 / ((Math.Sqrt(2 * Math.PI) * inGroupStdDev) * Math.Pow(Math.E, -Math.Pow((original[i] - ave), 2) / (2 * Math.Pow(inGroupStdDev, 2)))));}return values;
}

获取准确度

/// <summary>
/// 获取准确度
/// </summary>
/// <param name="usl">目标上限</param>
/// <param name="lsl">目标下限</param>
/// <param name="ave">均值</param>
/// <returns>返回准确度</returns>
public static double GetCA(double usl, double lsl, double ave)
{double diff = (usl - lsl) / 2;double sum = (usl + lsl) / 2;return DoubleFormat(5, Math.Abs(sum - ave) / diff);
}

ppm小于lsl,ppm百万分之不良

/// <summary>
/// ppm小于lsl,ppm百万分之不良
/// </summary>
/// <param name="lsl">目标下限</param>
/// <param name="original">原始数据</param>
/// <returns>返回ppm小于lsl的值</returns>
public static double GetPpmLessLsl(double lsl, double[] original)
{double count = 0.0;for(int i= 0;i<original.Length;i++){if (original[i] < lsl){count += 1;}}return DoubleFormat(5, (count / original.Length) * 1000000);
}

ppm大于usl,ppm百万分之不良

/// <summary>
/// ppm大于usl,ppm百万分之不良
/// </summary>
/// <param name="usl">目标上限</param>
/// <param name="original">原始数据</param>
/// <returns>返回ppm大于usl的值</returns>
public static double GetPpmMoreUsl(double usl, double[] original)
{double count = 0.0;for (int i = 0; i < original.Length; i++){if (original[i] > usl){count += 1;}}return DoubleFormat(5, (count / original.Length) * 1000000);
}

获取正三倍标准差

/// <summary>
/// 获取正三倍标准差
/// </summary>
/// <param name="expTarget">目标值</param>
/// <param name="stdDev">标准差</param>
/// <returns>返回目标值加上3倍的标准差</returns>
public static double GetPositive3Signa(double expTarget, double stdDev)
{return DoubleFormat(5, expTarget + 3 * stdDev);
}

获取负三倍标准差

/// <summary>
/// 获取负三倍标准差
/// </summary>
/// <param name="expTarget">目标值</param>
/// <param name="stdDev">标准差</param>
/// <returns>返回目标值减去3倍的标准差</returns>
public static double GetNegative3Signa(double expTarget, double stdDev)
{return DoubleFormat(5, expTarget - 3 * stdDev);
}

完整代码下载

完整代码下载

C#实现封装SPC过程能力工具类ProcessCababilityHelper相关推荐

  1. ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。

    DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...

  2. 封装一个邮件发送工具类,一个字,巴适

    系列文章目录 文章目录 系列文章目录 前言 一. 介绍 二.二话不说开始干 1.引入库 2. 邮件发送实体(Mail) 3. 邮件发送类型枚举(MailType ) 4.邮件发送抽象类(Abstrac ...

  3. 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive

    第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...

  4. Flutter - 一个fultter练习项目(仿写微信UI、实现一些常用效果、封装通用组件和工具类)

    demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 pwd:123456 代码不定期更新 注:Flut ...

  5. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类

    准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://blog.csdn.net/weixin_44953227/articl ...

  6. 少年郎,你需要封装好的ViewPager工具类

    作者:夏至,欢迎转载,也请保留这段申明,谢谢 blog.csdn.net/u011418943/- 你是否有遇到这样的问题,每次开发一个新的项目,在 viewpager 这一块上,总是在做重复的东西, ...

  7. java封装统一返回结果工具类(CommonResultUtils)

    1. 在common模块下创建子模块common_utils 2.common_utils 模块内定义返回状态码接口以及返回结果类 返回状态码: /*** 定义返回状态码*/ public inter ...

  8. Android开发封装高德实时定位工具类

    前言 1.使用高德开放平台中的Android 定位SDK最新版本:v4.6.0 2.测试机型:魅蓝note2  系统5.1.1 华为荣耀畅玩7x  系统8.0.0 一.集成高德Android定位sdk ...

  9. java封装Mongodb3.2.1工具类

    由于最近项目要使用mongodb来处理一些日志,提前学习了一下mongodb的一些基本用法,大概写了一些常用的. 开发环境为:WIN7-64,JDK7-64,MAVEN3.3.9-64,IDEA201 ...

  10. Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类

    问题描述: 最近,调试一个程序,差点儿被一个简单的Logcat日志蒙蔽了双眼. 过程是这样的:在代码中,用Log.i(TAG, msg)来输出msg的信息.输出的结果却只输出了前面一部分,后面的字符没 ...

最新文章

  1. netperf -R用法
  2. swift瀑布流实现_CSS 实现瀑布流布局(display: flex)
  3. 计算机视觉如何给企业带来不同?
  4. 《从零开始学ASP.NET CORE MVC》课程介绍
  5. Git的使用(快速入门)
  6. 474. 一和零 golang动态规划
  7. 怎样把台式机变成虚拟服务器,怎么把文件传到虚拟主机
  8. 项目经理的第二手准备-坚强的挺着(4)
  9. ThinkPHP 3 的输出
  10. gitee怎么仓库间传文件_薄书的Gitee 码云使用教程学习纪录 - 薄书
  11. 关于虚拟主机软件配置的问题
  12. MasterPage嵌套及MasterPage中的控件和变量的访问
  13. extjs 教程 java_ExtJS6.2学习
  14. eclipse语言包安装太慢,或者卡住不动的解决方法
  15. 基于 Creator 3.0 的 3D 换装
  16. Hololens环境搭建
  17. 从隔壁兄弟那爬点网页数据,整理成word文档
  18. win10 卸载cuda10.1
  19. uniapp小程序使用getUserProfile登录(获取昵称统一为‘微信用户’+头像为灰色头像)
  20. 软件测试-硬件配置测试

热门文章

  1. Python实现简单的用户管理系统
  2. java基础 CAS算法的简单理解
  3. Java垃圾回收的工作原理和最佳做法
  4. Chrome浏览器 显示 Flash不是最新版
  5. gp数据库与pg数据库
  6. Spring Boot 接入支付宝,实战来了!
  7. HDP直播个性化设置教程,简单几步提升电视盒子/投影仪观影体验
  8. kettle 创建脚本文件
  9. 第二代支付系统专题之报文篇(二)大额支付报文完整版(含二代新增功能业务说明)
  10. 集合经验模态分解matlab,emd经验模态分解matlab下载地址