一组样本数据的数值特征一般来说可以从三个方面来描述:
-
数据的水平(也可以称之为集中趋势或位置度量),反映数据的数值大小
-
数据的差异,反映数据间的离散程度
-
数据的分布形状,反映数据分布的偏度和峰度
描述水平的统计量
数据水平是指数值大小,描述数据水平的统计量有平均数
,分位数
,众数
,同时这几个统计量也可以用来描述数据的集中趋势度。
平均数
**简单平均数(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} xˉ=nx1+x2+x3+...+xn=n∑i=1nxi
加权平均数(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}}
xˉ=f1+f2+f3+...+fkm1f1+m2f2+m3f3+...+mkfk=∑i=1kfi∑i=1kmifi
一般来说,总体的平均数是无从得知的,因为无法得到总体是数据,所以我们常常从样本的平均数来推测总体的平均数。
R方法
1
2
3
4
5
6
7
8
9
10
11# 在 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 |
1
280
1
2
3
4
5
6
7
8
9
10
11# 在 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 |
1
281
python方法
1
2
3
4
5
6
7
8
9import 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 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 在 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)计算行和列的所有数据的平均值。
1
2
3
4
5
60 2.0 1 3.0 dtype: float64 2.5
1
2
3
4# 导入数据 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 |
1
2
3
4
5
6
7
8
9
10# 在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,如果为元组,则计算多轴上的平均值。
1
281.0
1
2
3
4
5data = np.arange(6).reshape((3,2)) data np.average(data,axis=1, weights=[1./4, 3./4])
1
2
3
4
5
6array([[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.
Me={x(2n+1)21{x(2n)+x(2n+1)},n为奇数,n为偶数
中位数的特点是不受极端值的影响
四分位数
同中位数,将数据排序后位于1/4和3/4位置的数据。
百分位数
同四分位数,利用99个数据点将数据分为100份,百分位数提供了数据在最大值和最小值期间数据点分布信息。
R方法
1
2
3
4
5
6
7
8
9
10
11# 利用之前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))
1
2
3
4
5
6
7
885 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方法
1
2
3
4
5data_3 = pd.read_csv('.\tongjixue\example\ch3\example3_1.csv',engine='python') np.percentile(data_3.分数,(25,50,75))
1
2array([70.5, 85. , 90. ])
求分位数在统计雪上有多种方法,当分位点位于两个数值中间时有不同的取值的方法,这个以后详细讨论。
众数
一组数据众数数显频数最多的数值,用 M 0 M_{0} M0表示,众数在数据量比较大时才有意义,众数可能不存在,也可能有2个或者多个。
R中没有直接求出众数的内置函数,所以需要自己写自定义众数函数
R方法
1
2
3
4
5
6
7
8# 自定义函数 getmode <- function(x){ y <- sort(unique(x)) # 去重数值并排序 tab <- tabulate(match(x,y)) # 比较x与y中的数值,并列出他们在y中的位置,在计算每个位置的频数放入对象tab中 y[tab==max(tab)] # 找出y中频数最多的元素 } getmode(example3_1$分数)
1
286
python方法
在numpy或者pandas是没有求众数的方法的,但是我们可以利用scipy科学计算库中的mode函数
1
2
3
4
5
6
7
8
9from 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)
1
2
386 86
最后
以上就是贪玩面包最近收集整理的关于统计分析——描述统计之数据水平描述的全部内容,更多相关统计分析——描述统计之数据水平描述内容请搜索靠谱客的其他文章。
发表评论 取消回复