📌 写在前面
大家好!👋
欢迎来到**【一起学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 ✅ 更代表"典型值"
┌────────────┬──────────────┬──────────────┐│ 指标 │ 优点 │ 适用场景 │├────────────┼──────────────┼──────────────┤│ 均值(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 文本格式的优劣对比
- 🔸 实战:数据预处理后的持久化存储
敬请期待! 🚀
💡 学习小贴士
- 统计函数选择:
- 对称分布 → 用均值
- 偏态/含异常值 → 用中位数
- 分类数据 → 用众数
- axis参数记忆:
axis=0 → "压扁行",结果形状少一行维度axis=1 → "压扁列",结果形状少一列维度- 不确定?先
print(arr.shape) 再试
- 异常值处理:
- 先用统计量识别(IQR/3σ法则)
- 再根据业务决定:删除/替换/保留
- 不要盲目删除,可能包含重要信息!
📚 学习路线图
第74天:NumPy安装 ✓第75天:ndarray对象 ✓第76天:数据类型 ✓第77天:数组属性 ✓第78天:创建数组 ✓第79天:切片和索引 ✓第80天:高级索引 ✓第81天:数组运算 ✓第82天:数组操作 ✓第83天:数学函数 ✓第84天:统计函数 ✓ ← 你今天在这里第85天:文件读写第86天:与pandas结合...
💬 写在最后
统计函数是数据分析的**"透视眼"**,掌握它们,你就能:
✅ 快速理解数据分布特征✅ 科学识别异常值与质量问题✅ 为机器学习特征工程打下基础
今天重点掌握:
- ✅ 均值/中位数/标准差的核心含义
- ✅ axis参数在聚合函数中的用法
- ✅ IQR法则检测异常值的实战技巧
如果觉得有用,记得:
- 👍 点赞支持一下
- ⭐ 收藏方便复习
- 📤 分享给更多小伙伴
完成作业的同学,欢迎在评论区打卡! 💪
【一起学Python】每天进步一点点,365天后遇见更优秀的自己!
👉 关注公众号,不错过每天的学习内容!
🎯 今日金句:
"统计是数据的语言,函数是你的翻译官。掌握统计量,让数据告诉你真相!" 🔍✨
明天见! 🌟