C#实现封装SPC过程能力工具类ProcessCababilityHelper
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相关推荐
- ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。
DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...
- 封装一个邮件发送工具类,一个字,巴适
系列文章目录 文章目录 系列文章目录 前言 一. 介绍 二.二话不说开始干 1.引入库 2. 邮件发送实体(Mail) 3. 邮件发送类型枚举(MailType ) 4.邮件发送抽象类(Abstrac ...
- 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive
第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive ...
- Flutter - 一个fultter练习项目(仿写微信UI、实现一些常用效果、封装通用组件和工具类)
demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 pwd:123456 代码不定期更新 注:Flut ...
- Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类
准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://blog.csdn.net/weixin_44953227/articl ...
- 少年郎,你需要封装好的ViewPager工具类
作者:夏至,欢迎转载,也请保留这段申明,谢谢 blog.csdn.net/u011418943/- 你是否有遇到这样的问题,每次开发一个新的项目,在 viewpager 这一块上,总是在做重复的东西, ...
- java封装统一返回结果工具类(CommonResultUtils)
1. 在common模块下创建子模块common_utils 2.common_utils 模块内定义返回状态码接口以及返回结果类 返回状态码: /*** 定义返回状态码*/ public inter ...
- Android开发封装高德实时定位工具类
前言 1.使用高德开放平台中的Android 定位SDK最新版本:v4.6.0 2.测试机型:魅蓝note2 系统5.1.1 华为荣耀畅玩7x 系统8.0.0 一.集成高德Android定位sdk ...
- java封装Mongodb3.2.1工具类
由于最近项目要使用mongodb来处理一些日志,提前学习了一下mongodb的一些基本用法,大概写了一些常用的. 开发环境为:WIN7-64,JDK7-64,MAVEN3.3.9-64,IDEA201 ...
- Android开发-差点儿被Logcat骗了,用Logcat输出一行有长度限制,用递归方式封装一个Logcat工具类
问题描述: 最近,调试一个程序,差点儿被一个简单的Logcat日志蒙蔽了双眼. 过程是这样的:在代码中,用Log.i(TAG, msg)来输出msg的信息.输出的结果却只输出了前面一部分,后面的字符没 ...
最新文章
- netperf -R用法
- swift瀑布流实现_CSS 实现瀑布流布局(display: flex)
- 计算机视觉如何给企业带来不同?
- 《从零开始学ASP.NET CORE MVC》课程介绍
- Git的使用(快速入门)
- 474. 一和零 golang动态规划
- 怎样把台式机变成虚拟服务器,怎么把文件传到虚拟主机
- 项目经理的第二手准备-坚强的挺着(4)
- ThinkPHP 3 的输出
- gitee怎么仓库间传文件_薄书的Gitee 码云使用教程学习纪录 - 薄书
- 关于虚拟主机软件配置的问题
- MasterPage嵌套及MasterPage中的控件和变量的访问
- extjs 教程 java_ExtJS6.2学习
- eclipse语言包安装太慢,或者卡住不动的解决方法
- 基于 Creator 3.0 的 3D 换装
- Hololens环境搭建
- 从隔壁兄弟那爬点网页数据,整理成word文档
- win10 卸载cuda10.1
- uniapp小程序使用getUserProfile登录(获取昵称统一为‘微信用户’+头像为灰色头像)
- 软件测试-硬件配置测试