标准差SD、相对标准偏差RSD学习和python实现

标准差SD、相对标准偏差RSD学习和python实现

  • 一、SD和RSD的定义、公式、深层意义
      • (1)定义
      • (2)公式
      • (3)RSD的必要性
      • (4)多学一点(关于n-1)
  • 二、Python实现
    • 1.求SD
      • 2.求RSD

一、SD和RSD的定义、公式、深层意义

(1)定义

RSD定义:相对标准偏差(relative standard deviation;RSD)又叫标准偏差系数、变异系数、变动系数等,由标准偏差除以相应的平均值乘100%所得值,可在检验检测工作中分析结果的精密度。
SD定义:标准差也被称为标准偏差,标准差(Standard Deviation)描述各数据偏离平均数的距离(离均差)的平均数,它是离差平方和平均后的方根,用σ表示。

(2)公式

SD:
标准差SD、相对标准偏差RSD学习和python实现_第1张图片
RSD:
标准差SD、相对标准偏差RSD学习和python实现_第2张图片
多了解点:
标准差SD、相对标准偏差RSD学习和python实现_第3张图片

(3)RSD的必要性

只用SD不足以反映数据偏离中心的程度!
虽然标准偏差能够反映检测结果的精密程度,但是对于下面两组数据则无法正确体现:
第一组:10.1、10.2、10.3、10.4、10.5.
SD=0.158
第二组: 0.1、0.2、0.3、0.4、0.5.
SD=0.158
虽然这两组数据的都为0.158,但第一组数据是在10.3的基础上“波动”0.158,第二组数据是在“0.3”的基础上“波动”0.158,两组数据的“波动基础”明显不同。
数量级不同,绝对波动不能反映真实的波动程度,要用相对波动!
这样,必须引人“相对标准偏差”这个概念来体现这种波动的相对大小。这样,第一组数据的RSD=1.5%,第二组数据的RSD=52.7%,精密程度立刻体现出来。

(4)多学一点(关于n-1)

多学一点:为什么SD的分母是n-1,而不是n,我理解数学家大概的想法排除掉样本中偏离度比较大的点,但是没有实际的排除,是从维度自由度上解决的,即n-1。这个问题知有很好的文章写的很好,链接:https://www.zhihu.com/question/20099757?rf=21126585
补充知识:有偏估计、无偏估计和标准差的一些关系,去看看概率统计相关

二、Python实现

1.求SD

(1)numpy.std() 求标准差的时候默认是除以 n 的,即是有偏的,np.std无偏样本标准差方式为加入参数 ddof = 1;关于numpy.std()的官网手册链接:https://numpy.org/doc/stable/reference/generated/numpy.std.html
(2)pandas.std() 默认是除以n-1 的,即是无偏的,如果想和numpy.std() 一样有偏,需要加上参数ddof=0 ,即pandas.std(ddof=0) ;DataFrame的describe()中就包含有std();

以numpy.std举例:
代码:

import numpy as np
import pandas as pd
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
std1 = np.std(a, ddof = 1)                                     #方法1,np.std无偏样本标准差方式为加入参数 ddof = 1
std2 = np.sqrt(((a - np.mean(a)) ** 2).sum() / (a.size - 1))   #方法3,直接用公式啦

print(std1) 
print(std2)

输出结果:

3.0276503540974917
3.0276503540974917

Process finished with exit code 0

关于pandas:要了解下DataFrame,下次再写。
补看下这篇文章,参考链接https://www.jianshu.com/p/8024ceef4fe2

2.求RSD

import numpy as np

a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
std1 = np.std(a, ddof = 1)                                     #方法1,np.std无偏样本标准差方式为加入参数 ddof = 1
std2 = np.sqrt(((a - np.mean(a)) ** 2).sum() / (a.size - 1))   #方法2,直接用公式啦
print(std1)
print(std2)

ave = np.mean(a)
rsd1 = std1 / ave
rsd2 = std2 / ave
print(rsd1)
print(rsd2)

结果:

3.0276503540974917
3.0276503540974917
0.6728111897994427
0.6728111897994427

Process finished with exit code 0

先写这点,回头再加


你可能感兴趣的:(数据分析,python)