常用【描述性统计指标】含义(by python)

统计学有时候会被误解,好像必须有大量的样本数据,才能使统计结果有意义。

这会让我们觉得统计学离我们的日常生活很遥远。

其实,如果数据的准确度高的话,少量的样本数据同样能反映出真实的情况。

比如,很多国家选举时不断做的民意调查,一般做到有效样本1600多份就够了,不管你是几千万人的小国家,还是数亿人的大国,调查的样本数都差不多。

所以,正确地进行统计,即使样本数据量不大,我们也可以从中提取知识,避免被误导。

不过,在此之前,我们要能够清楚地理解统计数据 和各种统计指标的含义,以及它们在区分真相和误导时的作用。

1. 统计是什么

统计 是个很笼统的概念,它涉及到很多事情,简单来定义它的话,必然会掩盖很多细节。
统计学 可以被认为是处理数据的科学框架,其中包括与数据收集、分析和解释相关的所有任务。

那么,什么是数据
数据 是对世界观察的一般集合,其性质多种多样,从定性到定量。

比如,研究人员从实验中收集数据,企业家从用户那里收集数据,医生从病人那里收集数据等等。

本篇准备介绍一些在分析数据时常用的两种描述性指标,通过它们来实际的度量数据情况,而不是模凌两可的描述数据性质。

本文使用的示例数据来自scikit-learn中自带的糖尿病数据集。

python 复制代码
from sklearn.datasets import load_diabetes

# 糖尿病人数据集
ds = load_diabetes(as_frame=True, return_X_y=True, scaled=False)
data = ds[0]

data.head()

其中一共有400多条数据。

这里不做糖尿病的分析,只是用这个数据集来演示一些统计学描述指标的计算方式。

2. 集中度指标

首先是集中度指标 ,它表示数据的**"中间"** 是什么样的。
**"中间"**这个词是模糊的,我们可以用多种方式来定义中间。

2.1. 平均值

平均值 是一种描述性统计量,描述的是数据集中最典型的值。

比如,我们看看示例数据中,糖尿病病人的年龄平均值:

python 复制代码
# 获取年龄列表
ages = data["age"].tolist()

# 年龄之和
sum_ages = sum(ages)
# 人数
num_ages = len(ages)

# 平均年龄
avg_ages = sum_ages / num_ages
avg_ages

# 运行结果
48.51809954751131

这个平均年龄告诉我们,易患糖尿病的**"典型"** 年龄可能是48岁左右

2.2. 中位数

中位数 是数据**"中间"** 的另一种定义,它不像平均值 那样需要算术计算。

它只要将数据排序之后,取中间的那个值就行,如果数据集中数据的个数是偶数,则取排序后中间两个值的平均值。

python 复制代码
# 获取年龄列表
ages = data["age"].tolist()

sorted_ages = sorted(ages)

# 人数
num_ages = len(ages)
mid = int(num_ages / 2)

# 因为人数是偶数,所以中位数是中间两个数的平均值
med_ages = (sorted_ages[mid - 1] + sorted_ages[mid])/2
med_ages

# 运行结果
50.0

中位数 年龄50与上面计算的平均值 差别不大。

有时候,数据集中有一些异常值 (极大或极小的值),就会造成中位数平均值差别很大。

异常值 一般会对平均值 产生不利的影响,而对于中位数来说,一般影响不大。

2.3. 众数

众数 是数据中出现最频繁的值,它不像平均值中位数 那样更像数据的**"中间"** 。

不过,一个值在数据集中重复出现的次数越多,对平均值 的影响就越大,因此,众数 代表了对平均值的最高加权贡献因素。

python 复制代码
# 获取年龄列表
ages = data["age"].tolist()

ages_count = {}
# 统计每个年龄的个数
for i in ages:
    if i in ages_count:
        ages_count[i] += 1
    else:
        ages_count[i] = 1

# 出现次数最多的年龄
max_age, max_count = 0, 0
for k, v in ages_count.items():
    if v > max_count:
        max_age = k
        max_count = v

print(max_age, max_count)

# 运行结果
53.0 19

众数 也就是出现最多的年龄,是53岁 ,有19人。

众数 相当接近中位数,这让我们对于数据的集中趋势更有信心。

3. 离散度指标

集中度指标 让我们了解到数据的**"中间"** 是什么样的,而离散度指标则 是告诉我们数据**"变化"** 有多大。
离散度指标让我们可以度量数据的变化程度,哪怕是轻微的变化程度。

3.1. 极差

极差就是数据的最大值与最小值之差,它让我们了解到数据的变化范围有多大。

python 复制代码
# 获取年龄列表
ages = data["age"].tolist()

# 极差
max(ages) - min(ages)

# 运行结果
60.0

极差60岁,说明糖尿病患者的年龄差距很大,这是一种需要及早预防的疾病。

3.2. 标准差

标准差 是对观察结果分布的衡量,是对数据与**"典型"** 数据点的偏差程度的度量。
标准差 越大,数据在平均值附近的分布就越分散,反之越集中。

python 复制代码
# 标准差计算函数
def stdev(nums):
    diffs = 0
    avg = sum(nums)/len(nums)
    for n in nums:
        diffs += (n - avg)**(2)
    return (diffs/(len(nums)-1))**(0.5)

# 获取年龄列表
ages = data["age"].tolist()

stdev(ages)

# 运行结果
13.109027822041087

极差 看出年龄的差距有60岁 ,但是标准差 只有13岁左右,说明数据还算集中,不是太分散。

3.3. 方差

方差 就是标准差 的平方,它们几乎是完全相同的东西。

需要注意的是,方差 的单位是原始数据不一样,而标准差的单位和原始数据一样。

平均值 一样,方差标准差也会受到异常值的影响。

4. 总结

本篇主要内容包括:

  1. 描述性统计指标分两种:集中度 指标和离散度指标
  2. 描述性统计指标表示数据的简单摘要
  3. 平均值计算我们数据集的典型值,易受异常值影响
  4. 中位数是数据集排序后的中间值,不易受异常值影响
  5. 众数是出现次数最多的值
  6. 极差是数据集中最大值和最小值之间的差
  7. 方差标准差表示在平均值附近的波动情况
相关推荐
无须logic ᭄2 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
Channing Lewis15 分钟前
flask常见问答题
后端·python·flask
Channing Lewis16 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
数据小爬虫@5 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python
健胃消食片片片片5 小时前
Python爬虫技术:高效数据收集与深度挖掘
开发语言·爬虫·python
ℳ₯㎕ddzོꦿ࿐8 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb8 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天8 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python