当前位置:首页>python>【一起学Python】第84天:NumPy统计函数大全,数据分析必备神器!

【一起学Python】第84天:NumPy统计函数大全,数据分析必备神器!

  • 2026-10-11 08:07:58
【一起学Python】第84天:NumPy统计函数大全,数据分析必备神器!

📌 写在前面

大家好!👋

欢迎来到**【一起学Python】**的第84天!🎉

前83天,我们从安装环境一路学到数学函数,今天我们要解锁数据分析的核心技能——统计函数!

🤔 为什么要学统计函数?

  • ✅ 快速洞察数据:均值、中位数、标准差一键计算
  • ✅ 数据质量评估:方差、极值帮助发现异常
  • ✅ 特征工程基础:标准化、归一化全靠统计量
  • ✅ 可视化前置:统计结果是图表的灵魂

今天你将学到:

  • 🔸 集中趋势:mean、median、mode实战
  • 🔸 离散程度:std、var、ptp精准度量
  • 🔸 分位数与百分位数:quantile、percentile应用
  • 🔸 实战:用统计函数完成数据质量报告

准备好了吗?让我们开始吧!🚀

一、集中趋势:找到数据的"中心" 🎯

1.1 均值(mean):最常用的平均值

import numpy as np# 模拟学生成绩数据scores = np.array([85, 92, 78, 95, 60, 88, 91, 76])# 计算算术平均值mean_score = np.mean(scores)print("平均分:", mean_score)  # 输出: 83.125# 沿指定轴计算(二维数组)data_2d = np.array([[85, 92, 78],                     [95, 60, 88],                     [91, 76, 84]])# 按列求平均(每门课的平均分)print("每门课平均分:", np.mean(data_2d, axis=0))# 输出: [90.33 76.   83.33]# 按行求平均(每个学生的平均分)print("每个学生平均分:", np.mean(data_2d, axis=1))# 输出: [85.   81.   83.67]

💡 关键提醒:

  • axis=0 → 沿行方向聚合(结果保留列)
  • axis=1 → 沿列方向聚合(结果保留行)

1.2 中位数(median):抗异常值的"稳健平均"

# 模拟含异常值的收入数据income = np.array([3000, 3500, 4000, 4200, 3800, 50000])  # 50000是异常值print("均值:", np.mean(income))      # 11416.67 ⚠️ 被异常值拉高print("中位数:", np.median(income))  # 3900.0 ✅ 更代表"典型值"
📊 均值 vs 中位数
┌────────────┬──────────────┬──────────────┐│   指标     │   优点       │   适用场景   │├────────────┼──────────────┼──────────────┤│ 均值(mean) │ 计算简单     │ 数据分布均匀 ││ 中位数     │ 抗异常值     │ 偏态/长尾分布│└────────────┴──────────────┴──────────────┘

1.3 众数(mode):出现最频繁的值

# NumPy没有直接求众数的函数,可用np.unique+bincount实现data = np.array([1, 2, 2, 3, 2, 4, 2, 5])# 方法:统计每个值出现次数values, counts = np.unique(data, return_counts=True)mode = values[np.argmax(counts)]print("众数:", mode)  # 输出: 2print("出现次数:", np.max(counts))  # 输出: 4
💡 应用场景:分类数据的最常见类别、用户偏好分析等。

二、离散程度:度量数据的"波动" 📈

2.1 标准差(std)与方差(var)

# 两组成绩数据,均值相同但波动不同class_a = np.array([80, 82, 78, 81, 79])  # 成绩稳定class_b = np.array([60, 95, 70, 90, 85])  # 成绩波动大print("A班 - 均值:", np.mean(class_a), "标准差:", np.std(class_a))# 输出: 均值:80.0 标准差:1.41print("B班 - 均值:", np.mean(class_b), "标准差:", np.std(class_b))# 输出: 均值:80.0 标准差:12.49

📝 核心理解:

  • 方差 = 每个数据与均值差的平方的平均
  • 标准差 = 方差的平方根(与原数据同单位,更直观)
  • 标准差越大 → 数据越分散;越小 → 数据越集中

2.2 极差(ptp):最大值-最小值

data = np.array([10, 25, 30, 15, 40, 20])# ptp = peak to peakrange_val = np.ptp(data)print("极差:", range_val)  # 输出: 30 (40-10)# 等价写法print("手动计算:", np.max(data) - np.min(data))  # 30

2.3 分位数(quantile)与百分位数(percentile)

# 模拟100个学生的考试成绩scores = np.random.normal(75, 10, 100)  # 均值75,标准差10# 计算四分位数q1 = np.percentile(scores, 25)  # 25%分位q2 = np.percentile(scores, 50)  # 50%分位 = 中位数q3 = np.percentile(scores, 75)  # 75%分位print("Q1(25%):", round(q1, 1))print("Q2(50%):", round(q2, 1))print("Q3(75%):", round(q3, 1))print("IQR(四分位距):", round(q3 - q1, 1))
🎯 实战应用:箱线图异常值检测
# IQR法则:小于Q1-1.5×IQR 或 大于Q3+1.5×IQR 视为异常值iqr = q3 - q1lower_bound = q1 - 1.5 * iqrupper_bound = q3 + 1.5 * iqroutliers = scores[(scores < lower_bound) | (scores > upper_bound)]print("异常值数量:", len(outliers))print("异常值:", np.round(outliers, 1))

三、高级统计函数 🚀

3.1 相关系数(corrcoef):衡量变量关系

# 模拟学习时长与成绩的关系study_hours = np.array([2, 4, 6, 8, 10, 12])exam_scores = np.array([65, 70, 78, 85, 90, 95])# 计算皮尔逊相关系数corr_matrix = np.corrcoef(study_hours, exam_scores)corr = corr_matrix[0, 1]print("相关系数:", round(corr, 3))  # 输出: 0.993(强正相关)

📊 相关系数解读:

| 相关系数 | 关系强度 ||---------|---------|| 0.8~1.0 | 极强相关 || 0.6~0.8 | 强相关   || 0.4~0.6 | 中等相关 || 0.2~0.4 | 弱相关   || 0.0~0.2 | 极弱/无相关 |

3.2 加权平均(average):不同权重的均值

# 期末成绩计算:平时30% + 期中30% + 期末40%scores = np.array([85, 90, 95])  # 平时、期中、期末weights = np.array([0.3, 0.3, 0.4])final_score = np.average(scores, weights=weights)print("加权平均分:", final_score)  # 输出: 90.5

3.3 累积统计:cumsum、cumprod

data = np.array([10, 20, 30, 40])# 累积求和print("累积和:", np.cumsum(data))  # [10 30 60 100]# 累积乘积print("累积积:", np.cumprod(data))  # [10 200 6000 240000]

💡 应用场景:时间序列的累计销量、复利计算等。

四、实战:一键生成数据质量报告 📋

import numpy as npdef data_report(arr, name="数据"):    """生成数据质量报告"""    print(f"\n📊 {name}统计报告")    print("=" * 40)    print(f"样本量: {len(arr)}")    print(f"均值: {np.mean(arr):.2f}")    print(f"中位数: {np.median(arr):.2f}")    print(f"标准差: {np.std(arr):.2f}")    print(f"最小值: {np.min(arr):.2f}")    print(f"最大值: {np.max(arr):.2f}")    print(f"极差: {np.ptp(arr):.2f}")    print(f"25%分位: {np.percentile(arr, 25):.2f}")    print(f"75%分位: {np.percentile(arr, 75):.2f}")    # 异常值检测(IQR法则)    q1, q3 = np.percentile(arr, [25, 75])    iqr = q3 - q1    outliers = arr[(arr < q1-1.5*iqr) | (arr > q3+1.5*iqr)]    print(f"异常值数量: {len(outliers)}")    print("=" * 40)# 测试np.random.seed(42)test_data = np.random.normal(100, 15, 200)  # 模拟200个数据data_report(test_data, "测试数据")

📝 输出示例:

📊 测试数据统计报告========================================样本量: 200均值: 99.87中位数: 99.42标准差: 14.23最小值: 65.31最大值: 138.92极差: 73.6125%分位: 90.1575%分位: 109.88异常值数量: 3========================================

📝 今日作业

基础题 ⭐

  • 创建数组 [10, 20, 30, 40, 50],计算均值、中位数、标准差
  • 使用 np.percentile 计算数组的25%、50%、75%分位数
  • 对比 np.mean() 和 np.average() 的用法差异

进阶题 ⭐⭐

  • 生成100个正态分布随机数(均值50,标准差10),计算各项统计量
  • 使用IQR法则检测并标记异常值
  • 模拟两组数据,计算它们的相关系数并解读

挑战题 ⭐⭐⭐

  • 编写函数:输入任意数组,返回包含均值/中位数/标准差/异常值的字典
  • 实现"数据标准化":(x - mean) / std,验证标准化后均值为0、标准差为1
  • 模拟销售数据:12个月销售额,计算季度均值、同比增长率、波动系数

💡 参考代码(标准化函数):

import numpy as npdef standardize(arr):    """Z-score标准化"""    mean = np.mean(arr)    std = np.std(arr)    return (arr - mean) / std# 验证data = np.random.randn(100) * 10 + 50  # 均值50,标准差10normalized = standardize(data)print("标准化后均值:", np.mean(normalized))  # ≈0print("标准化后标准差:", np.std(normalized))  # ≈1

🎓 明日预告

第85天:NumPy文件读写与数据持久化

你将学到:

  • 🔸 np.save / np.load 保存NumPy数组
  • 🔸 np.savetxt / np.loadtxt 读写CSV文件
  • 🔸 二进制格式 vs 文本格式的优劣对比
  • 🔸 实战:数据预处理后的持久化存储

敬请期待! 🚀

💡 学习小贴士

  1. 统计函数选择:
    • 对称分布 → 用均值
    • 偏态/含异常值 → 用中位数
    • 分类数据 → 用众数
  2. axis参数记忆:
    • axis=0 → "压扁行",结果形状少一行维度
    • axis=1 → "压扁列",结果形状少一列维度
    • 不确定?先 print(arr.shape) 再试
  3. 异常值处理:
    • 先用统计量识别(IQR/3σ法则)
    • 再根据业务决定:删除/替换/保留
    • 不要盲目删除,可能包含重要信息!

📚 学习路线图

第74天:NumPy安装 ✓第75天:ndarray对象 ✓第76天:数据类型 ✓第77天:数组属性 ✓第78天:创建数组 ✓第79天:切片和索引 ✓第80天:高级索引 ✓第81天:数组运算 ✓第82天:数组操作 ✓第83天:数学函数 ✓第84天:统计函数 ✓ ← 你今天在这里第85天:文件读写第86天:与pandas结合...

💬 写在最后

统计函数是数据分析的**"透视眼"**,掌握它们,你就能:

✅ 快速理解数据分布特征✅ 科学识别异常值与质量问题✅ 为机器学习特征工程打下基础

今天重点掌握:

  • ✅ 均值/中位数/标准差的核心含义
  • ✅ axis参数在聚合函数中的用法
  • ✅ IQR法则检测异常值的实战技巧

如果觉得有用,记得:

  • 👍 点赞支持一下
  • ⭐ 收藏方便复习
  • 📤 分享给更多小伙伴

完成作业的同学,欢迎在评论区打卡! 💪

【一起学Python】每天进步一点点,365天后遇见更优秀的自己!

👉 关注公众号,不错过每天的学习内容!

🎯 今日金句:

"统计是数据的语言,函数是你的翻译官。掌握统计量,让数据告诉你真相!" 🔍✨

明天见! 🌟

最新文章

随机文章