分布形态的度量-偏度系数与峰度系数的探讨

集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点,还应掌握数据分布的形态。
描述数据分布形态的度量有偏度系数和峰度系数,
其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。

1.偏度系数

偏度系数是刻划数据的对称性指标。关于均值对称的数据其偏度系数为0,右侧更分散的数据偏度系数为正,左侧更分散的数据偏度系数为负。
下图给出了偏度系数为正、零和负的情况。

R语言偏度 r语言偏度和峰度_R语言偏度


R语言偏度 r语言偏度和峰度_python_02


R语言偏度 r语言偏度和峰度_R语言偏度_03


R语言偏度 r语言偏度和峰度_R语言偏度_04

  • 偏度(Skewnes)也称为偏态系数,是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。在R软件中的计算公式如下:
    R语言偏度 r语言偏度和峰度_数据_05

偏度的作用:

  • 对于正态分布,其偏度为0,两侧尾部长度对称。此时:众数=中位数=平均数。
  • 若分布的偏度小于0,则说明该分布具有负偏离,即左偏态,此时数据位于均值左边的比位于右边的少,直观表现为左边的尾部相对于与右边的尾部要长,因为有少数变量值很小,使曲线左侧尾部拖得很长。分布左偏时:众数>中位数>平均数。
  • 若分布的偏度大于0,即右偏态,此时数据位于均值右边的比位于左边的少,直观表现为右边的尾部相对于与左边的尾部要长,因为有少数变量值很大,使曲线右侧尾部拖得很长。分布右偏时:平均数>中位数>众数。
# 例1:为研究新生儿出生时的体重,在某妇产医院随机地选取了100个新生儿,其重量如表(数据存放在birth.csv文件中)。计算新生儿体重数据的偏度系数.
birth<-read.table('data/birth.csv',header=TRUE,sep=',')
head(birth,n=5)

A data.frame: 5 × 1

x

<int>

1

1740

2

3540

3

2760

4

3240

5

3960

自己编写计算偏度系数的函数:

skew<-function(x){
    n<-length(x)
    ((1/n)*sum((x-mean(x))^3))/(sd(x)^3)
}
skew(birth$x)    #偏度<0,说明数据是左侧更分散,属于左偏分布

-0.636551244523803

使用e1071包里的偏度计算函数:

library(e1071)
e1071::skewness(birth$x)    #计算偏度系数
Warning message:
"程辑包'e1071'是用R版本4.1.3 来建造的"

-0.636551244523803

使用timeDate包里的偏度计算函数:

timeDate::skewness(birth$x)    #计算偏度系数

-0.636551244523803

绘制直方图:

hist(birth$x)

R语言偏度 r语言偏度和峰度_R语言偏度_06

使用ggplot2包绘制直方图和密度曲线:

library(ggplot2)

#获取直方图相关参数
length_hist_results <- hist(birth$x,plot = FALSE)
#绘制直方图
ggplot(data = birth, mapping = aes(x)) +
    geom_histogram(
    aes(y = ..density..),
    breaks = length_hist_results$breaks,
    color = "darkgray",
    fill = "white"
    ) +
    #绘制概率密度曲线
    geom_density(colour = "blue")
Warning message:
"程辑包'ggplot2'是用R版本4.1.3 来建造的"

R语言偏度 r语言偏度和峰度_数据_07

2.峰度系数

峰度系数反映分布峰的尖峭程度的重要指标.当峰度系数大于0时,两侧极端数据较多;当峰度系数小于0时,两侧极端数据较少。

R语言偏度 r语言偏度和峰度_数据_08


R语言偏度 r语言偏度和峰度_数据分布_09


R语言偏度 r语言偏度和峰度_R语言偏度_10


R语言偏度 r语言偏度和峰度_数据_11


峰度(kurtosis),又称峰态系数,是表征概率密度分布曲线在平均值处峰值高低的指标。直观地说,这个指标反映地是峰部的尖度。该指标的计算是相对于正态分布而言的(正态分布的峰度为0),如果峰度大于0,则说明峰的形状比较尖,比正态分布要陡峭。在统计学中,**峰度高就意味着方差增大是由低频度的大于或小于平均值的极端差值引起的。**对于具有n个值的样本,在R软件中的计算公式如下:

R语言偏度 r语言偏度和峰度_算法_12

# 自己编写的计算峰度系数的函数:
kurt<-function(x){
    n<-length(x)
    ((1/n)*sum((x-mean(x))^4))/(sd(x)^4)-3
}

例1:为研究新生儿出生时的体重,在某妇产医院随机地选取了100个新生儿,其重量如表(数据存放在birth.csv文件中)。计算新生儿体重数据的峰度系数。

R语言偏度 r语言偏度和峰度_R语言偏度_13

# 例1:为研究新生儿出生时的体重,在某妇产医院随机地选取了100个新生儿,其重量如表(数据存放在birth.csv文件中)。计算新生儿体重数据的峰度系数.
birth<-read.table('data/birth.csv',header=TRUE,sep=',')
kurt(birth$x)

1.29416169656776

使用e1071包里的峰度计算函数:

e1071::kurtosis(birth$x)  #计算峰度系数

1.29416169656776

使用timeDate包里的峰度计算函数:

timeDate::kurtosis(birth$x) #计算峰度系数

1.29416169656776

教材例子验证

#代码3-5 通过psych包的describe()函数计算例3-2数据的描述性统计数
example3_2 <-read.table("swtj/Example3_2.csv", header=TRUE, sep=",")
library(psych)
psych::describe(example3_2)


A psych: 2 × 13

vars

n

mean

sd

median

trimmed

mad

min

max

range

skew

kurtosis

se

<int>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

<dbl>

x

1

10

4.976

4.039508

4.165

4.80625

4.07715

0.3

11.01

10.71

0.2946624

-1.765365

1.277405

y

2

10

109.000

61.948007

118.500

110.62500

76.35390

25.0

180.00

155.00

-0.2193784

-1.796665

19.589680

```R e1071::skewness(example3_2$x) #计算偏度系数 ```

0.294662406293528

e1071::skewness(example3_2$y)    #计算偏度系数

-0.219378443538772

e1071::kurtosis(example3_2$x)  #计算峰度系数

-1.76536531506354

e1071::kurtosis(example3_2$y)  #计算峰度系数

-1.79666514648305

用自编函数计算,结果与R包函数计算结果完全相同:

skew(example3_2$x)  #用自编函数计算偏度系数

0.294662406293528

skew(example3_2$y)  #用自编函数计算偏度系数

-0.219378443538772

kurt(example3_2$x)  #用自编函数计算峰度系数

-1.76536531506354

kurt(example3_2$y)  #用自编函数计算峰度系数

-1.79666514648305

参考文献:

【1】薛毅,陈立萍.[M].R语言在统计中的应用.北京:中国工信出版集团,人民邮电出版社,2017.04.

【2】杨泽峰.[M].R语言在生物统计中的应用.南京:南京大学出版社,2022.02