上周学习了数据的描述性统计,总结如下:
下面以我画的两张表格来比较下各特征值的异同:
中位数 | 众数 | 算数平均数 | 几何平均数 | |
---|---|---|---|---|
英文名 | Median | Mode | Arithmetic mean | Geometric Mean |
别称 | 中值 | 均值 | ||
定义 | 一组数据排序后处于中间位置上的变量值 | 一组数据中出现次数最多的变量值 | n个变量的和除以n | n个变量值连乘积的n次方根 |
优点 | 一组数据中间位置上的代表值,不受极端值的影响 | 一组数据分布的峰值,不受极端值的影响 | 利用了全部数据信息,实际应用最广泛 | 不受极端值的影响 |
缺点 | 需要先排序 | 不唯一,可能有零到多个众数 | 易受极端值的影响 | 变量值不能为0或负数,仅适用于计算平均比率 |
适用场景 | 顺序数据的集中趋势测度值 | 分类数据的集中趋势测度值 | 数值型数据的集中趋势测度值 | 计算现象的平均增长率 |
英文名 | 概念 | 公式 | |
---|---|---|---|
极差 | range | 一组数据的最大值与最小值之差 | |
平均差 | mean deviation | 各变量值与其平均数离差绝对值的平均数 | $M_{d}=\frac{\sum_{i=1}^{n}\left |
方差 | variance | 各变量值与其平均数离差平方的平均数 | |
标准差 | standard deviation | 方差的平方根 | |
标准分数 | standard score | 各变量值与其平均数的离差除以标准差 | |
离散系数 | coefficient of variation | 数据的标准差与平均数之比 |
这周就以 python 具体实现下描述性统计的内容。
完整代码见 github : StatisticLearning
一、集中趋势
还是以上周的 .xlsx
文件中的 9 个家庭的人均月收入数据(单位:元)为例:
1080 750 1080 1080 850 960 2000 1250 1630
首先读取文件中的数据:
import pandas as pd
df = pd.read_excel('data/2_table1.xlsx')
data = df['月收入']
1、众数
# 众数
# 法一
print('众数为:', data.mode().iloc[0])
# 法二
from collections import Counter
counts = Counter(data)
print('众数为:', counts.most_common(1)[0][0])
# 法三
from scipy.stats import mode
mode_num = mode(data)
print('众数为:', mode_num[0][0])
2、中位数
# 中位数
# 法一
print('中位数为:', data.median())
# 法二
import numpy as np
print('中位数为:', np.percentile(data, 50))
# 法三
print('中位数为:', data.quantile(.50))
3、分位数
类似中位数的计算,可以使用 numpy
库中的 percentile
方法。
也可以使用 pandas
库中的 quantile
方法。
注意:这两个函数确定四分位数位置的方法与上一周的方法略有不同,公式如下:
下四分位数:
上四分位数:
# 分位数
# 法一
print('下四分位数为:', np.percentile(data, 25))
print('上四分位数为:', np.percentile(data, 75))
# 法二
print('下四分位数为:', data.quantile(.25))
print('上四分位数为:', data.quantile(.75))
4、平均数
-
算术平均数
# 平均数 # 算数平均数 print('算数平均数为:', data.mean())
-
几何平均数
# 几何平均数 import math s = 1 for i in data: s *= i print('几何平均数为:', math.pow(s, 1/len(data)))
二、离散程度
1、异众比率
# 异众比率
# 众数
from collections import Counter
count = Counter(data)
modeCount = count.most_common(1)[0][1]
totalCount = len(data)
# 异众比率
ratio = (totalCount - modeCount) / totalCount
print(ratio)
2、四分位差
# 四分位差
# 法一
print('四分位差为:', np.percentile(data, 75) - np.percentile(data, 25))
# 法二
print('四分位差为:', data.quantile(.75) - data.quantile(.25))
3、极差
# 极差
print('极差为:', data.max() - data.min())
4、平均差
# 平均差
meanData = data.mean()
s = 0
for i in data:
s += (abs(i - meanData))
print('平均差为:', s/len(data))
5、方差
# 方差
print('方差为:', np.var(data))
6、标准差
# 标准差
print('标准差为:', np.std(data))
三、分布的形状
1、偏度
# 偏度
from scipy import stats
print('偏度为:', stats.skew(data))
2、峰度
# 峰度
print('峰度为:', stats.kurtosis(data))
参考资料:
《统计学(第七版)》贾俊平,所有数据都来自该书
统计学学习小组参加自公众号「数据科学家联盟」
数据的概括性度量:https://blog.csdn.net/qq_43315928/article/details/102151709
本代码的完整 github 链接:https://github.com/shiinerise/StatisticLearning