统计分析——描述统计之数据水平描述

一组样本数据的数值特征一般来说可以从三个方面来描述:

  1. 数据的水平(也可以称之为集中趋势或位置度量),反映数据的数值大小

  2. 数据的差异,反映数据间的离散程度

  3. 数据的分布形状,反映数据分布的偏度峰度

描述水平的统计量

数据水平是指数值大小,描述数据水平的统计量有平均数分位数众数,同时这几个统计量也可以用来描述数据的集中趋势度

平均数

**简单平均数(simple mean)**的公式:

x ˉ = x 1 + x 2 + x 3 + . . . + x n n = i = 1 n x i n \bar{x} = \frac{x_{1}+x_{2}+x_{3}+...+x_{n}}{n} = \frac{\sum_{i=1}^{n}x_{i}}{n}

加权平均数(weighted mean):如果样本被分为K组,每组的组中值(组上限与下限的平均数)为m1,m2,…,mk表示各组的频数用f1,f2,…,fk表示,则样本平均数的计算公式为:
x ˉ = m 1 f 1 + m 2 f 2 + m 3 f 3 + . . . + m k f k f 1 + f 2 + f 3 + . . . + f k = i = 1 k m i f i i = 1 k f i \bar{x} = \frac{m_{1}f_{1}+m_{2}f_{2}+m_{3}f_{3}+...+m_{k}f_{k}}{f_{1}+f_{2}+f_{3}+...+f_{k}} = \frac{\sum_{i=1}^{k}m_{i}f_{i}}{\sum_{i=1}^{k}f_{i}}

一般来说,总体的平均数是无从得知的,因为无法得到总体是数据,所以我们常常从样本的平均数来推测总体的平均数。

R方法

# 在 R中求简单平均数
load(".\\tongjixue\\example\\ch3\\example3_1.RData")    #  30名学生的成绩
head(example3_1,5)   # 展示前5名学生的成绩
mean(example3_1$分数)  # 求分数的平均值


# mean(x, trim = 0, na.rm = FALSE, ...)
#  x - 向量
#  trim - 取值在0~0.5之间,例如trim=0.1,表示计算之前先排序,然后去掉前10%和后10%的数据,最后计算剩余数据的平均值
#  na.rm - 默认为FALSE,当为TRUE时,表示去掉数据中的缺失值。(当数据中有缺失值时无法计算)
分数
85
55
91
66
79
80
# 在 R中求加权平均数
load(".\\tongjixue\\example\\ch3\\example3_2.RData") 
example3_2

weighted.mean(example3_2$组中值, example3_2$人数)


# weighted.mean(x, w,...,na.rm=FALSE)
#  x - 计算加权平均数的对象,对应公式中的 f
#  w - 相应的权数向量,相当于公式中的 m
分组 组中值 人数
60以下 55 3
60—70 65 4
70—80 75 4
80—90 85 10
90—100 95 9
81

python方法

import numpy as np
import pandas as pd
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"    # jupyter结果多行显示

data_1 = np.array([[1, 2], [3, 4]])   # 矩阵
data_2 = pd.DataFrame(data_1)  # 数据框
data_2
0 1
0 1 2
1 3 4
# 在 python中求简单平均数


# 利用数据框自带的方法
data_2.mean()


# data.mean(axis=None, skipna=True)
#   axis - 默认为axis=None,即输出每列的平均值
#   skipna:布尔值,默认为True,计算结果时排除NA / null值


# 使用 numpy的函数
np.mean(data_1,axis=(1,0))


# np.mean(data, axis=None)
#   axis - 默认为axis=None,如果为元组,则计算多轴上的平均值。例如(0,1)计算行和列的所有数据的平均值。
0    2.0
1    3.0
dtype: float64

2.5
# 导入数据
data_2 = pd.read_csv('.\\tongjixue\\example\\ch3\\example3_2.csv',engine='python')
data_2
分组 组中值 人数
0 60以下 55 3
1 60—70 65 4
2 70—80 75 4
3 80—90 85 10
4 90—100 95 9
# 在python中求 加权平均数

np.average(data_2['组中值'],weights=data_2['人数'])


# numpy.average(a, axis=None, weights=None,...)
#   a - array_like,计算加权平均数的对象,对应公式中的 f
#   weights - array_like,相应的权数向量,相当于公式中的 m
#   axis - 默认为axis=None,如果为元组,则计算多轴上的平均值。
81.0
data = np.arange(6).reshape((3,2))
data

np.average(data,axis=1, weights=[1./4, 3./4])
array([[0, 1],
       [2, 3],
       [4, 5]])

array([0.75, 2.75, 4.75])

因为加权平均数是使用组中值来代表该组数据的,所以同一组数据,简单平均和加权平均结果不同,除非每组数据在组中值两侧成对称分布,故除非数据本来就是分组情况,一般都用简单平均求平均值。

分位数

分位数代表数据水平的高低,常用的分位数有四分位数中位数百分位数

中位数

中位数是一组数据排序后位于中间位置的数值,用Me表示
M e = { x ( n + 1 2 ) , n为奇数 1 2 { x ( n 2 ) + x ( n + 1 2 ) } , n为偶数 M_{e} =\left\{\begin{matrix}x_{(\frac{n+1}{2})}&,\text{n为奇数}\\ \frac{1}{2}\begin{Bmatrix}x_{(\frac{n}{2})}+x_{(\frac{n+1}{2})}\end{Bmatrix} &,\text{n为偶数} \end{matrix}\right.
中位数的特点是不受极端值的影响

四分位数

同中位数,将数据排序后位于1/4和3/4位置的数据。

百分位数
同四分位数,利用99个数据点将数据分为100份,百分位数提供了数据在最大值和最小值期间数据点分布信息。

R方法

# 利用之前example3.1的学生成绩数据
# 中位数
median(example3_1$分数)

# 四分位数
quantile(example3_1$分数,probs = c(0.25,0.75))
# R总计算分位数有9种方法,默认type=7。

#百分位数
quantile(example3_1$分数,probs=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9))
85

25%     75%
70.5    90

10%     20%     30%     40%     50%     60%     70%     80%     90%
60.4    66.8    74.1    81.6    85      86      89.3    91      92.3

python方法

data_3 = pd.read_csv('.\\tongjixue\\example\\ch3\\example3_1.csv',engine='python')

np.percentile(data_3.分数,(25,50,75))

array([70.5, 85. , 90. ])

求分位数在统计雪上有多种方法,当分位点位于两个数值中间时有不同的取值的方法,这个以后详细讨论。

众数

一组数据众数数显频数最多的数值,用 M 0 M_{0} 表示,众数在数据量比较大时才有意义,众数可能不存在,也可能有2个或者多个。

R中没有直接求出众数的内置函数,所以需要自己写自定义众数函数

R方法

# 自定义函数
getmode <- function(x){
    y <- sort(unique(x))    # 去重数值并排序
    tab <- tabulate(match(x,y))  # 比较x与y中的数值,并列出他们在y中的位置,在计算每个位置的频数放入对象tab中
    y[tab==max(tab)]   # 找出y中频数最多的元素
}
getmode(example3_1$分数)
86

python方法

在numpy或者pandas是没有求众数的方法的,但是我们可以利用scipy科学计算库中的mode函数

from scipy.stats import mode
m0 = mode(data_3['分数'])[0][0]
print(m0)

# 或者利用numpy中的bincount()函数,此函数将数据按直方图统计
count = np.bincount(data_3['分数'])
m0_1 = np.argmax(count)
print(m0_1)
86
86

猜你喜欢

转载自blog.csdn.net/ICERON/article/details/84556440