数据分析中常用的指标或方法

news2024/9/22 1:36:27

  • 一、方差与标准差
  • 二、协方差
  • 三、皮尔逊系数
  • 四、斯皮尔曼系数
  • 五、卡方检验
  • 六、四分位法和箱线图
  • 七、

一、方差与标准差

总体方差
V a r ( x ) = σ 2 = ∑ i = 1 n ( x i − x ˉ ) 2 n = ∑ i = 1 n x i 2 − n x ˉ 2 n = E ( x 2 ) − [ E ( x ) ] 2 Var(x)=\sigma^2=\frac {\sum\limits_{i=1}^{n} (x_i - \bar{x})^2} {n} =\frac{\sum\limits_{i=1}^nx_i^2-n\bar{x}^2} {n} =E(x^2)-[E(x)]^2 Var(x)=σ2=ni=1n(xixˉ)2=ni=1nxi2nxˉ2=E(x2)[E(x)]2

样本方差
V a r ( x ) = s 2 = ∑ i = 1 n ( x i − x ˉ ) 2 n − 1 = ∑ i = 1 n x i 2 − n x ˉ 2 n − 1 Var(x)=s^2=\frac {\sum\limits_{i=1}^{n} (x_i - \bar{x})^2} {n-1} =\frac{\sum\limits_{i=1}^nx_i^2-n\bar{x}^2} {n-1} Var(x)=s2=n1i=1n(xixˉ)2=n1i=1nxi2nxˉ2

标准差
S D ( x ) = σ ∣ s = V a r ( x ) SD(x)=\sigma|s=\sqrt{Var(x)} SD(x)=σs=Var(x)

方差用来衡量随机变量离其期望值的分散程度,标准差在方差的基础上消除了量纲的影响。

二、协方差

总体协方差
C o v ( x , y ) = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) n = ∑ i = 1 n x i y i − n x ˉ y ˉ n {Cov}(x, y) = \frac {\sum\limits_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})} {n} =\frac{\sum\limits_{i=1}^nx_iy_i-n\bar{x}\bar{y}} {n} Cov(x,y)=ni=1n(xixˉ)(yiyˉ)=ni=1nxiyinxˉyˉ

样本协方差
C o v ( x , y ) = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) n − 1 = ∑ i = 1 n x i y i − n x ˉ y ˉ n − 1 {Cov}(x, y) = \frac {\sum\limits_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})} {n-1} =\frac{\sum\limits_{i=1}^nx_iy_i-n\bar{x}\bar{y}} {n-1} Cov(x,y)=n1i=1n(xixˉ)(yiyˉ)=n1i=1nxiyinxˉyˉ

对协方差公式的直观理解:以 ( x ˉ , y ˉ ) (\bar{x}, \bar{y}) (xˉ,yˉ)为坐标原点,计算各个点到原点构成的矩形面积之和,然后除以n-1。其中一三象限面积为正,二四象限面积为负。

协方差的含义可以从以下几个方面理解:

  • 正值和负值: 协方差为正表示两个变量呈正相关关系,即一个变量增大,另一个变量也倾向于增大;协方差为负表示两个变量呈负相关关系,即一个变量增大,另一个变量倾向于减小。
  • 绝对值的大小: 协方差的绝对值大小表示变量之间的线性关系的强度。绝对值越大,说明两个变量之间的线性关系越强;绝对值越小,说明关系越弱。
  • 零值: 协方差为零表示两个变量之间没有线性关系。但需要注意,协方差为零并不意味着两个变量之间没有其他类型的关系,只是没有线性关系。
  • 单位: 协方差的单位是两个变量单位的乘积,即结果受量纲的影响。

直观理解可以参考https://www.youtube.com/watch?v=J9pXAfd_Kmc

三、皮尔逊系数

公式1
r = ∑ ( x i − x ˉ ) ( y i − y ˉ ) ∑ ( x i − x ˉ ) 2 ∑ ( y i − y ˉ ) 2 = C o v ( x , y ) σ x σ y r=\frac {\sum (x_i - \bar{x}) (y_i - \bar{y})} {\sqrt{\sum(x_i - \bar{x})^2 \sum(y_i - \bar{y})^2}} =\frac{Cov(x,y)} {\sigma_x\sigma_y} r=(xixˉ)2(yiyˉ)2 (xixˉ)(yiyˉ)=σxσyCov(x,y)

公式2
r = 1 n ∑ i = 1 n x i y i − x ˉ y ˉ σ x σ y r=\frac{\frac1n\sum\limits_{i=1}^nx_iy_i-\bar{x}\bar{y}} {\sigma_x\sigma_y} r=σxσyn1i=1nxiyixˉyˉ

公式1表明皮尔逊系数其实就是x, y的协方差与x, y各自标准差的乘积之比。皮尔逊系数的值域范围为[-1, 1],不受量纲的影响。

下面分别给出值域的证明和公式1–>公式2的推导。

(1)值域证明:

  1. x i − x ˉ = a i , y i − y ˉ = b i x_i-\bar{x}=a_i,y_i-\bar{y}=b_i xixˉ=aiyiyˉ=bi,则公式1= ∑ a i b i ∑ a i 2 ∑ b i 2 \frac{\sum{a_ib_i}} {\sqrt{\sum{a_i}^2\sum{b_i}^2}} ai2bi2 aibi
  2. 根据柯西不等式的一般形式有: ∑ i = 1 n a i 2 ∑ i = 1 n b i 2 ≥ ( ∑ i = 1 n a i b i ) 2 \sum\limits_{i=1}^{n}a_i^2 \sum\limits_{i=1}^{n}b_i^2\ge(\sum\limits_{i=1}^{n}a_ib_i)^2 i=1nai2i=1nbi2(i=1naibi)2
  3. 由1、2知道原式中的分子 ∑ a i b i \sum{a_ib_i} aibi的绝对值必小于等于分母 ∑ a i 2 ∑ b i 2 \sqrt{\sum{a_i}^2 \sum{b_i}^2} ai2bi2 ,所以对应值域[-1,1]

看到一个关于柯西不等式的证明很有意思,分享下。原地址https://zhuanlan.zhihu.com/p/397034475
在这里插入图片描述
(2)公式1–>公式2推导:
r = ∑ ( x i − x ˉ ) ( y i − y ˉ ) ∑ ( x i − x ˉ ) 2 ∑ ( y i − y ˉ ) 2 = ∑ ( x i y i − x ˉ y i − x i y ˉ + x ˉ y ˉ ) ∑ ( x i 2 − 2 x i x ˉ + x ˉ 2 ) ∑ ( y i 2 − 2 y i y ˉ + y ˉ 2 ) = ∑ x i y i − n x ˉ y ˉ − n x ˉ y ˉ + n x ˉ y ˉ ( ∑ x i 2 − 2 n x ˉ 2 + n x ˉ 2 ) ( ∑ y i 2 − 2 n y ˉ 2 + n y ˉ 2 ) = ∑ x i y i − n x ˉ y ˉ ( ∑ x i 2 − n x ˉ 2 ) ( ∑ y i 2 − n y ˉ 2 ) \begin{aligned} r&=\frac {\sum(x_i - \bar{x}) (y_i - \bar{y})} {\sqrt{\sum(x_i - \bar{x})^2 \sum(y_i - \bar{y})^2}}\\ &=\frac{\sum(x_iy_i-\bar{x}y_i-x_i\bar{y}+\bar{x}\bar{y})} {\sqrt{\sum(x_i^2-2x_i\bar{x}+\bar{x}^2) \sum(y_i^2-2y_i\bar{y}+\bar{y}^2)}}\\ &=\frac{\sum{x_iy_i}-n\bar{x}\bar{y}-n\bar{x}\bar{y}+n\bar{x}\bar{y}} {\sqrt{(\sum{x_i^2}-2n\bar{x}^2+n\bar{x}^2) (\sum{y_i^2}-2n\bar{y}^2+n\bar{y}^2)}}\\ &=\frac{\sum{x_iy_i}-n\bar{x}\bar{y}} {\sqrt{(\sum{x_i^2}-n\bar{x}^2) (\sum{y_i^2}-n\bar{y}^2)}} \end{aligned} r=(xixˉ)2(yiyˉ)2 (xixˉ)(yiyˉ)=(xi22xixˉ+xˉ2)(yi22yiyˉ+yˉ2) (xiyixˉyixiyˉ+xˉyˉ)=(xi22nxˉ2+nxˉ2)(yi22nyˉ2+nyˉ2) xiyinxˉyˉnxˉyˉ+nxˉyˉ=(xi2nxˉ2)(yi2nyˉ2) xiyinxˉyˉ
分子分母除以n,结合上面方差的公式即可证明。

四、斯皮尔曼系数

斯皮尔曼系数的计算和皮尔逊系数相同,唯一区别只是将皮尔逊系数中的原始值替换为了原始值所对应的秩(序号)。

假设有两个 ( x , y ) (x,y) (x,y)的变量,对应的顺序编号为 ( R ( x ) , R ( y ) ) (R(x),R(y)) (R(x),R(y)),将 ( R ( x ) , R ( y ) ) (R(x),R(y)) (R(x),R(y))当做 ( x , y ) (x,y) (x,y)代入到皮尔逊系数公式则得到斯皮尔曼系数的一般计算公式:
ρ = ∑ ( R ( x i ) − R ( x i ) ˉ ) ( R ( y i ) − R ( y i ) ˉ ) ∑ ( R ( x i ) − R ( x i ) ˉ ) 2 ∑ ( R ( y i ) − R ( y i ) ˉ ) 2 = C o v ( R ( x ) , R ( y ) ) σ R ( x ) σ R ( y ) \rho=\frac {\sum (R(x_i) - \bar{R(x_i)}) (R(y_i) - \bar{R(y_i)})} {\sqrt{\sum(R(x_i) - \bar{R(x_i) })^2 \sum(R(y_i) - \bar{R(y_i)})^2}} =\frac{Cov(R(x),R(y))} {\sigma_{R(x)} \sigma_{R(y)}} ρ=(R(xi)R(xi)ˉ)2(R(yi)R(yi)ˉ)2 (R(xi)R(xi)ˉ)(R(yi)R(yi)ˉ)=σR(x)σR(y)Cov(R(x),R(y))

x , y x,y x,y中均不包含重复值时,可以使用下面的简单公式计算:
r = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) r=1-\frac{6\sum{d_i^2}} {n(n^2-1)} r=1n(n21)6di2

其中 d i = R ( x i ) − R ( y i ) d_i=R(x_i)-R(y_i) di=R(xi)R(yi),表示 x , y x,y x,y之间的序号差。下面先举个例子了解实际如何计算,再给出一般公式到简单公式的证明。

(1)实际计算
这里直接拿维基百科上的截图,下面的数据中, X , Y X,Y X,Y分别表示智商和每周看电视的时间。
在这里插入图片描述
接下来先根据 X i X_i Xi进行排序,得到rank x i x_i xi,再在 X i X_i Xi排完序的基础上,对 Y i Y_i Yi进行排序,得到rank y i y_i yi,然后分别计算它们之间的序号差 d i d_i di d i 2 d_i^2 di2
在这里插入图片描述
最后代入到公式 1 − 6 ∑ d i 2 n ( n 2 − 1 ) 1-\frac{6\sum{d_i^2}}{n(n^2-1)} 1n(n21)6di2得到 r = 1 − 6 ∗ 194 10 ( 1 0 2 − 1 ) ≈ − 0.1758 r=1-\frac{6*194}{10(10^2-1)}\approx-0.1758 r=110(1021)61940.1758

简单公式只适用于 X i , Y i X_i,Y_i Xi,Yi中均无重复值的情况,任一列有重复值使用简单公式计算的结果就会有偏差。至于为什么有偏差,可以从下面(2)中的公式推导看出。

当有重复值时,一般采用平均顺序作为所有重复值的序号,例如对于序列[1, 1, 1, 2, 3],1的序号为(1+2+3)/3,均为2。原序列对应的序号为[2, 2, 2, 4, 5],经过验证在pandas的corr方法中采用的就是平均顺序计算。

(2)一般公式到简单公式的推导
推导可以从皮尔逊系数的计算公式2开始,只不过这里的 x i , y i x_i,y_i xi,yi代表的不是原值,而是原值对应的秩。下面推导过程中的前置条件为: x i , y i x_i,y_i xi,yi均服从类似1, 2, 3, 4, …这样的分布,均为正整数且不含重复值,因为这里的 x i , y i x_i,y_i xi,yi表示的是序号。这就要求原值中不能包含重复值。
ρ = 1 n ∑ i = 1 n x i y i − x ˉ y ˉ σ x σ y = 1 n ∑ i = 1 n 1 2 ( x i 2 + y i 2 − d i 2 ) − x ˉ 2 σ x σ y = 1 2 n ∑ i = 1 n x i 2 + 1 2 n ∑ i = 1 n y i 2 − 1 2 n ∑ i = 1 n d i 2 − x ˉ 2 σ x σ y = ( 1 n ∑ i = 1 n x i 2 − x ˉ 2 ) − 1 2 n ∑ i = 1 n d i 2 σ x σ y = σ x 2 − 1 2 n ∑ i = 1 n d i 2 σ x σ y = σ x σ y − 1 2 n ∑ i = 1 n d i 2 σ x σ y = 1 − 1 2 n ∑ i = 1 n d i 2 σ x σ y = 1 − 1 2 n ∑ i = 1 n d i 2 1 n ∑ i = 1 n x i 2 − x ˉ 2 \begin{aligned} \rho&=\frac{\frac1n\sum\limits_{i=1}^nx_iy_i-\bar{x}\bar{y}} {\sigma_x\sigma_y}\\ &=\frac{\frac1n\sum\limits_{i=1}^n\frac12(x_i^2+y_i^2-d_i^2)-\bar{x}^2} {\sigma_x\sigma_y}\\ &=\frac{\frac1{2n}\sum\limits_{i=1}^nx_i^2+\frac1{2n}\sum\limits_{i=1}^ny_i^2-\frac1{2n}\sum\limits_{i=1}^nd_i^2-\bar{x}^2} {\sigma_x\sigma_y}\\ &=\frac{(\frac1n\sum\limits_{i=1}^nx_i^2-\bar{x}^2)-\frac1{2n}\sum\limits_{i=1}^nd_i^2} {\sigma_x\sigma_y}\\ &=\frac{\sigma_x^2-\frac1{2n}\sum\limits_{i=1}^nd_i^2} {\sigma_x\sigma_y}\\ &=\frac{\sigma_x\sigma_y-\frac1{2n}\sum\limits_{i=1}^nd_i^2} {\sigma_x\sigma_y}\\ &=1-\frac{\frac1{2n}\sum\limits_{i=1}^nd_i^2} {\sigma_x\sigma_y}\\ &=1-\frac{\frac1{2n}\sum\limits_{i=1}^nd_i^2} {\frac1n\sum\limits_{i=1}^nx_i^2-\bar{x}^2} \end{aligned} ρ=σxσyn1i=1nxiyixˉyˉ=σxσyn1i=1n21(xi2+yi2di2)xˉ2=σxσy2n1i=1nxi2+2n1i=1nyi22n1i=1ndi2xˉ2=σxσy(n1i=1nxi2xˉ2)2n1i=1ndi2=σxσyσx22n1i=1ndi2=σxσyσxσy2n1i=1ndi2=1σxσy2n1i=1ndi2=1n1i=1nxi2xˉ22n1i=1ndi2

其中 ∑ i = 1 n x i 2 = 1 2 + 2 2 + 3 2 + . . . + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum\limits_{i=1}^nx_i^2=1^2+2^2+3^2+...+n^2=\frac{n(n+1)(2n+1)}{6} i=1nxi2=12+22+32+...+n2=6n(n+1)(2n+1)(金字塔数), x ˉ 2 = ( 1 + n 2 ) 2 \bar{x}^2=(\frac{1+n}{2})^2 xˉ2=(21+n)2,代入上面得到 ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho=1-\frac{6\sum{d_i^2}}{n(n^2-1)} ρ=1n(n21)6di2

斯皮尔曼系数值域同样为[-1, 1],因为本身的计算还是基于皮尔逊系数公式。

参考https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient

五、卡方检验

皮尔逊系数和和斯皮尔曼系数都只适合度量数值型变量之间的相关关系,对于离散型的分类变量,可以通过卡方检验分析它们之间是否相互独立还是有相关关系。

下面随机生成100条数据,每条数据中均包含性别与是否打游戏这两个特征,基于此测试数据创建交叉表,统计不同性别中打游戏与不打游戏各自出现的频次。并基于交叉表进行卡方检验分析是否打游戏与性别之间是否存在关系。

首先提出零假设与备择假设:

  • 零假设(H0):性别与是否打游戏之间没有联系
  • 备择假设(H1):性别与是否打游戏之间存在联系
import pandas as pd
import numpy as np

# 设置随机数种子并生成100条测试数据
np.random.seed(12)
data = {'性别': np.random.choice(['男', '女'], size=100),
        '是否打游戏': np.random.choice(['是', '否'], size=100)}
df = pd.DataFrame(data)

# 创建交叉表
# margins、margins_name参数只是在频次结果的基础上增加个统计,这里是为了后续手工计算验证中方便对比,实际不需要带
frequency = pd.crosstab(df['性别'], df['是否打游戏'], margins=True, margins_name='总计')
frequency

在这里插入图片描述

基于上面频次统计结果,进行卡方检验,分别获取卡方值、P值、自由度和期望频数。

from scipy.stats import chi2_contingency

# 执行卡方检验,分别获取卡方值、P值、自由度和期望频数
# 该方法默认会对结果进行修正,correction参数设置为False是为了获取结果的原值方便后续对比
chi2, p, dof, expected = chi2_contingency(frequency.iloc[:2, :2], correction=False)
chi2, p, dof, expected

在这里插入图片描述

卡方值、P值、自由度分别为0.77、0.38、1。对结果的解读有两种方式:

  • 实际分析中一般关注P值,若P值<0.05,则代表可以拒绝原假设,即分类变量间存在影响。这里P值为0.38,表示是否打游戏和性别之间可以认为存在联系。这里说下对P值的理解:指的是在原假设成立即分类变量间相互独立的情况下,当前观测值出现的概率。
  • 也可以根据卡方值和自由度通过比对卡方分布表选择是否拒绝原假设。在卡方值分布表中通过自由度和自己选定的概率找到对应位置的卡方值,如果结果的卡方值比表中的卡方值大,则可以拒绝原假设,即分类变量间存在联系。卡方值可以理解成当分类变量间相互独立时的期望值与实际观测值之间的差异。后面会手工计算卡方值。

P值可以通过卡方值和自由度得到:

from scipy.stats import chi2

# 输入卡方统计量和自由度
chi_square_value = 0.7673361121636983
degrees_of_freedom = 1

# 计算P值
p_value = 1 - chi2.cdf(chi_square_value, degrees_of_freedom)
p

在这里插入图片描述
用Out[2]中的自由度和卡方值计算得到P值。

下面,手工计算一下卡方值。卡方值的计算过程为:

  1. 分别根据分类变量的类别组合统计各组合在观测值也就是实际数据中出现的频次,得到交叉表。
  2. 以分类变量相互间独立为前提,计算每个组合(即单元格)的期望频次。计算公式为:单元格所在行总和 × \times ×所在列总和 ÷ \div ÷样本总数。
  3. 通过公式 χ 2 = ∑ ( O i − E i ) 2 E i \chi^2=\sum\frac{(O_i-E_i)^2}{E_i} χ2=Ei(OiEi)2计算卡方值,其中 O i , E i O_i,E_i Oi,Ei分别为每个单元格的观测频次和期望频次。

以测试数据的交叉表为例,性别为女、打游戏为否的这个单元格,期望频次=52*42/100=21.84, 同理按从上到下从左到右的顺序另外三个单元格的期望频次分别为30.16、20.16、27.84,符合代码中输出的期望值expected

这里解释下期望频次的公式,还是以性别为女、打游戏为否的这个单元格为例,要理解这个公式,首先要明白一个前提就是假设分类变量间相互独立不存在影响。单元格所在的行和为52,表示100个样本中性别为女的样本有52个,所在列的和为42,表示100个样本中不打游戏的样本一共有42个,那么因为相互独立,所以性别为女且不打游戏的概率就应该等于样本中性别为女的概率乘样本中不打游戏的概率,最后再乘上总样本数量,就是在相互独立的情况下理论上的出现次数,即期望频次。

最后根据交叉表中的实际观测值和上面计算得到的期望值,通过步骤3中的公式得到卡方值。

def calc(o, e):
    return pow(o - e, 2) / e

chi2 = calc(24, 21.84) + calc(28, 30.16) + calc(18, 20.16) + calc(30, 27.84)
chi2

在这里插入图片描述
和卡方检验中输出的卡方值一致。但需要注意的是为了验证计算过程,在卡方检验中设置了参数correction=False,取消了方法中自带的误差修正,实际计算中应该取消设置。

卡方值大小受自由度影响,对于一个mxn的交叉表,自由度为(m-1)(n-1),从卡方值的计算过程可以看到,自由度越大,求和项越多,卡方值一般越大,但具体还受实际值与期望值之间差异的影响。

六、四分位法和箱线图

四分位法主要用来检测数据集中是否有离群值,箱线图可以认为是它的图形化表示。

四分位法需要首先对数据进行排序,排完序后再分别找出数据集中 1 4 \frac14 41位置处点的值(Q1)和 3 4 \frac34 43位置处点的值(Q3),得到四分位距(IQR)=Q3-Q1,进而得到离群值判定的阈值:

  • 下界: Q 1 − 1.5 ∗ I Q R Q1-1.5*IQR Q11.5IQR
  • 上界: Q 3 + 1.5 ∗ I Q R Q3+1.5*IQR Q3+1.5IQR

当数据集中的值不属于这个范围时,就可以认为是离群值。

具体怎么找出Q1与Q3,方法不唯一,这里以pandas中quantile方法的默认处理方式为例(API)。
在这里插入图片描述

例如对于有序序列[12, 15, 17, 20, 22, 25, 27, 30, 32, 35],元素个数n=10,需要找出它的第一四分位数(Q1),可以通过以下步骤:

  1. 计算Q1的位置。 ( n − 1 ) ∗ 1 4 + 1 = 3.25 (n-1)*\frac14+1=3.25 (n1)41+1=3.25,大于3小于4,表示位置在第3个元素和第4个元素之间,更靠近第3个元素。
  2. Q 1 = V a l u e 3 + ( V a l u e 4 − V a l u e 3 ) ∗ 0.25 = 17 + ( 20 − 17 ) ∗ 0.25 = 17.75 Q1=Value_3+(Value_4-Value_3)*0.25=17+(20-17)*0.25=17.75 Q1=Value3+(Value4Value3)0.25=17+(2017)0.25=17.75,其中 V a l u e 3 , V a l u e 4 Value_3,Value_4 Value3,Value4分别表示第三个元素和第四个元素的值。从公式可以看出当位置处于两值之间时(也就是步骤1中结果为小数),Q1的结果是按照位置的权重在两值之间等比例增加的。

这里对步骤1中位置的计算方法进行下解释,因为刚开始我也有些迷惑。同一个数据集采用不同的计算方法可能会得到不同的位置结果。上面采用的方法中,是严格根据位置长度进行划分的。将10个数字有序排列,首尾数字之间9个间隔,那么 1 4 \frac14 41处的位置,就应该处于将整个长度四等分后的第一个等分点。因此应该等于 9 4 \frac94 49即2.25个长度。+1是因为对元素计数时是从第一个值开始数的,但是第二个值的位置才是第一个长度的位置。

代码验证也可以得到相同的结果:
在这里插入图片描述
下面,随机生成100个测试数据,其中包含5%的离群值和95%的正常值,然后通过四分位法找出这5个离群值。

import numpy as np
import pandas as pd

# 设置随机数种子和数值以小数形式显示
np.random.seed(42)
np.set_printoptions(suppress=True)

# 生成100个测试数据 返回50*2的二维数组
def get_data(size=100, outlier_percent=0.05):
    # 从服从均值为0,标准差为1的正态分布中抽取95%的样本量,大部分数据(99.7%)处于均值±3个标准差的范围内
    normal_data = np.random.normal(size=int(size*(1-outlier_percent)))
    # 从范围为[10,20]的均匀分布中抽取5%的样本量
    outlier_data = np.random.uniform(10, 20, size=int(size*outlier_percent))
    # 合并数据
    data = np.concatenate((normal_data, outlier_data))
    # 打散顺序
    np.random.shuffle(data)
    return data.reshape(size//2, 2)


df = pd.DataFrame(get_data(), columns=list('AB'))

# 计算 Q1 Q3 及四分位距IQR
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3-Q1

# 计算离群值阈值范围 获取离群值行索引和列索引
outlier_lower = Q1-1.5*IQR
outlier_upper = Q3+1.5*IQR
row, col = np.where((df < outlier_lower) | (df > outlier_upper))

# 根据离群值行索引列索引,获取行号、列名及异常值
outlier = pd.DataFrame({
    '行号': df.index[row],
    '列名': df.columns[col],
    '离群值': df.values[row, col]
})
outlier

在这里插入图片描述

5个范围为[10, 20]的离群值都被找出,其中正态分布中的样本-2.619745也被识别为离群值,可以通过适当增大IQR的系数来调整。

下面通过箱线图查看测试数据的分布情况(箱线图API)。

import matplotlib.pyplot as plt

# 设置中文和负号正常显示
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif'] = ['SimHei']

# 绘图输出,IQR系数默认为1.5,可以通过参数 whis 修改
plt.boxplot(df, labels=df.columns)
plt.show()

在这里插入图片描述
从图形中可以看到A列有4个离群值,均大于10,B列有2个离群值,一个大于10一个小于0。

矩形箱体表示数据中间50%的部分,箱体上下边界线和中间的线分别代表Q3、Q1和Q2(中位数),箱体两侧细线(须线)的端点处分别代表所有非离群值中的最大值和最小值,超出这个范围的被归类为离群值,用圆点表示。

根据图形的形状可以大致估计数据分布情况:
(1)箱体和两边须线的长度可以反映数据的分布情况是集中还是发散,越长越发散越短越集中。
(2)中位数在箱体中的位置可以大致了解数据分布是否对称。
(3)小圆点的位置和个数可以看出离群值所处的范围和数量。

七、

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3566 linux加入uvc app

一、集成应用 SDK中external/uvc_app/目录提供了将板卡模拟成uvc camera的功能。如果external目录下没有uvc_app和minilogger&#xff0c;可从其它sdk中拷贝。需要拷贝以下文件&#xff1a; external\uvc_app external\minilogger \buildroot\package\rockchip\uvc_app \buil…

MCM备赛笔记——图论模型

Key Concept 图论是数学的一个分支&#xff0c;专注于研究图的性质和图之间的关系。在图论中&#xff0c;图是由顶点&#xff08;或节点&#xff09;以及连接这些顶点的边&#xff08;或弧&#xff09;组成的。图论的模型广泛应用于计算机科学、通信网络、社会网络、生物信息学…

2024年阿里云优惠券和代金券领取,活动整理服务器价格表

2024阿里云优惠活动&#xff0c;免费领取阿里云优惠代金券&#xff0c;阿里云优惠活动大全和云服务器优惠价格表&#xff0c;阿里云ECS服务器优惠价99元一年起&#xff0c;轻量服务器优惠价61元一年&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云优惠券免费领取、优惠活…

【已解决】namespace “Ui“没有成员 xxx

先说笔者遇到的问题&#xff0c;我创建一个QWidget ui文件&#xff0c;然后编辑的七七八八后&#xff0c;想要用.h与.cpp调用其&#xff0c;编译通过&#xff0c;结果报了这个错误&#xff0c;本方法不是普适性&#xff0c;但是确实解决了这个鸟问题。 问题来源 搭建ui后&…

MT36291替代MT3608 FP6291 低成本 用于移动电源,蓝牙音箱,便携式设备等

航天民芯原装MT36291 SOT23-6 PIN对PIN替代FP6291LR-G1 MT3608等&#xff0c;低成本&#xff0c;用于移动电源&#xff0c;蓝牙音箱&#xff0c;便携式设备等领域。 TEL:18028786817 专注于电源管理IC 一级代理 技术支持 欢迎试样&#xff01; 描述 MT36291是一个恒定频…

位运算的奇技淫巧

常见位运算总结&#xff1a; 1、基础位运算 左移<<运算 将二进制数向左移位操作&#xff0c;高位溢出则丢弃&#xff0c;低位补0。 右移>>运算 右移位运算中&#xff0c;无符号数和有符号数的运算并不相同。对于无符号数&#xff0c;右移之后高位补0&#xff…

软件测试|Python字典的访问方式你了解吗?

简介 Python中的字典&#xff08;dictionary&#xff09;是一种非常有用的数据结构&#xff0c;它允许您存储键-值对&#xff0c;从而可以快速查找、插入和删除数据。本文将详细介绍如何访问字典中的数据&#xff0c;包括基本访问、循环遍历、使用内置方法以及处理不存在的键等…

Redis持久化和集群架构

目录 Redis持久化 RDB快照&#xff08;snapshot&#xff09; RDB优点 RDB缺点 RDB的触发机制 AOF持久化 AOF文件重写 AOF触发机制 混合模式 Redis主从架构 Redis哨兵高可用架构 Redis Cluster架构 槽位定位算法 跳转重定位 Redis集群节点间的通信机制 Redis持久化…

centos安装主从mysql集群

在 CentOS 系统上安装和配置 MySQL 主从复制环境的步骤与 Debian/Ubuntu 系统有所不同。以下是在 CentOS 系统上进行配置的详细步骤&#xff1a; 步骤 1&#xff1a;在主服务器上安装和配置 MySQL&#xff08;10.206.0.13&#xff09; 安装 MySQL 服务器: 首先&#xff0c;添加…

NeRF资料整理

文章目录 1.NeRF原理讲解2.NeRF中用到的NDC空间坐标系3.NeRF中的sample_pdf概率采样函数 1.NeRF原理讲解 nerf 原理讲解&#xff1a;这个视频对NeRF中体渲染公式的讲解和推导非常好&#xff0c;言简意赅&#xff0c;而且和论文、代码都可以对应上。 2.NeRF中用到的NDC空间坐标…

【AI】ChatGPT和文心一言那个更好用

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读文章&#xff01; 此篇是【话题达人】序列文章&#xff0c;这一次的话题是《自然语言处理的发展》 文章将以博主的角度进行讲述&#xff0c;理解和水平有限&#xff0c;不足之处&#xff0c;望指正。 目录 背景自我介绍面试题…

linux 定时任务 crontab 使用笔记

最近在服务器上跑撸茅台的脚本&#xff0c;需要使用定时任务每天早上9点准时预约一次抢茅台的脚本&#xff0c;因此需要用到 crontab 命令。crontab主要是用于设置周期性执行命令&#xff0c;比如每分钟、每小时或者每周执行一个固定的命令&#xff0c;该命令从标准输入设备读取…

靶场实战(18):OSCP备考之VulnHub MY CMSMS

打靶思路 资产发现 主机发现服务发现漏洞发现&#xff08;获取权限&#xff09; 80端口/HTTP服务 组件漏洞URL漏洞3306端口/MySQL服务 组件漏洞口令漏洞80端口/HTTP服务 URL漏洞URL漏洞提升权限 www-data用户 sudosuidcron内核提权信息收集armour用户 sudo 1、资产发现 1.1…

Pytest系列(2) - assert断言详细使用

前言 与unittest不同&#xff0c;pytest使用的是python自带的assert关键字来进行断言assert关键字后面可以接一个表达式&#xff0c;只要表达式的最终结果为True&#xff0c;那么断言通过&#xff0c;用例执行成功&#xff0c;否则用例执行失败 assert小栗子 想在抛出异常之…

基于ssm+vue的宠物医院系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

01 MyBatisPlus快速入门

1. MyBatis-Plus快速入门 版本 3.5.31并非另起炉灶 , 而是MyBatis的增强 , 使用之前依然要导入MyBatis的依赖 , 且之前MyBatis的所有功能依然可以使用.局限性是仅限于单表操作, 对于多表仍需要手写 项目结构&#xff1a; 先导入依赖&#xff0c;比之前多了一个mybatis-plus…

肌营养不良患者生活质量的“提升”

肌营养不良患者基本上是生活无法自理的&#xff0c;那么作为肌营养不良患者的家属&#xff0c;提升病人的生活质量就迫在眉睫。看了这篇文章你就知道该怎么做了。 ①保持生活环境整洁 肌营养不良患者本身体质较弱&#xff0c;而且后期会卧病在床&#xff0c;为了防止并发症的发…

【机组】算术逻辑单元带进位运算实验的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f33a;一、 实验目…

Python初识——小小爬虫

一、找到网页端url 打开浏览器&#xff0c;打开百度官方网页点击图片&#xff0c;打开百度图片 鼠标齿轮向下滑&#xff0c;点击宠物图片 进入宠物图片网页&#xff0c;在网页空白处点击鼠标右键&#xff0c;弹出的框中最下方显示“检查”选项&#xff0c;点击&#xff08;我是…

AIGC - 视频生成模型的相关算法进展

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135688206 视频生成技术确实是一个很有潜力的颠覆性技术领域&#xff0c;可以作为企业创新梯队的重点关注方向&#xff0c;最近发展很快&#xff…