概述
一组样本数据的数值特征一般来说可以从三个方面来描述:
-
数据的水平(也可以称之为集中趋势或位置度量),反映数据的数值大小
-
数据的差异,反映数据间的离散程度
-
数据的分布形状,反映数据分布的偏度和峰度
描述水平的统计量
数据水平是指数值大小,描述数据水平的统计量有平均数
,分位数
,众数
,同时这几个统计量也可以用来描述数据的集中趋势度。
平均数
**简单平均数(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方法
# 在 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.
Me={x(2n+1)21{x(2n)+x(2n+1)},n为奇数,n为偶数
中位数的特点是不受极端值的影响
四分位数
同中位数,将数据排序后位于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} M0表示,众数在数据量比较大时才有意义,众数可能不存在,也可能有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
最后
以上就是贪玩面包为你收集整理的统计分析——描述统计之数据水平描述的全部内容,希望文章能够帮你解决统计分析——描述统计之数据水平描述所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复