当前位置: 首页 > java >正文

【数学建模学习笔记】数据标准化

零基础小白入门:用 Pandas 做数据标准化

如果你是刚接触数据分析的 “小白”,可能会疑惑:什么是 “数据标准化”?为什么要做这件事?这篇文章会用大白话拆解核心概念,把复杂的方法变成 “一步一步能跟着做” 的指南,帮你轻松入门。

一、先搞懂:什么是数据标准化?为什么要做?

1. 用例子理解 “数据尺度问题”

假设你有一份班级数据(就像文中的例子),包含 “文化平均分(60-90 分)”“体育平均分(30-50 分)”“挂科率(10%-20%)”。这些数据的 “尺度” 完全不一样:

  • 文化分差 10 分很常见,挂科率差 10 分就天差地别了。

如果直接用这些数据做分析(比如比较哪个班级综合表现好),计算机可能会 “偏爱大数字”(比如文化分),忽略小数字(比如挂科率)的影响 —— 这就像用 “米” 和 “厘米” 一起称重,结果肯定不准。

2. 数据标准化的作用

简单说,标准化就是把不同尺度的数据,变成同一尺度(比如都缩到 0-1 之间,或都围绕 0 波动),让它们能公平比较,也能让后续的分析 / 算法(比如机器学习)更准确。

二、核心准备:先搭好 “工具环境”

文中用了两个 Python 库:pandas(处理表格数据)和numpy(做数学计算),还有一份班级数据。

1. 先 “导入工具” 和 “加载数据”

你只需要复制下面的代码到 Python(比如 Jupyter Notebook)里运行,就能拿到数据:

# 导入需要的工具库
import numpy as np
import pandas as pd# 加载班级数据(直接从网上获取,不用自己找文件)
df = pd.read_excel('https://labfile.oss.aliyuncs.com/courses/40611/%E6%95%B0%E6%8D%AE%E6%A0%87%E5%87%86%E5%8C%96.xlsx')# 查看前5行数据(确认数据加载成功)
print(df.head())

运行后会看到这样的表格(和文中一致):

班级文化平均分成绩体育平均分优秀率挂科率
071391910
161451319
277301310

三、13 种标准化方法:大白话 + 代码 + 用法

文中讲了 13 种方法,我们按 “常用程度” 和 “简单程度” 排序,每个方法都讲 “是什么、怎么算、怎么用、适合场景”。

1. 最常用:Min-Max 标准化(缩到 0-1 之间)

是什么?

把数据 “挤压” 到 0 到 1 的区间里,原始数据的最小值会变成 0,最大值会变成 1,其他数据按比例缩小。
比如 “体育平均分” 原始范围是 30-45,标准化后:30→0,45→1,39→(39-30)/(45-30)=0.6。

公式(不用记,理解就行):

新数据 = (原始数据 - 数据最小值) / (数据最大值 - 数据最小值)

代码(复制就能用):
# 定义Min-Max标准化函数
def min_max_normalize(df):return (df - df.min()) / (df.max() - df.min())# 对数据做标准化
df_min_max = min_max_normalize(df)# 查看结果(前5行)
print(df_min_max.head())
适合场景:
  • 希望数据在固定区间(0-1)内,比如 “计算班级综合得分”(得分范围 0-1,直观)。
  • 缺点:如果数据里有极端值(比如某个班级文化分突然 100 分),会让其他数据挤在一起,不准。

2. 适合正态分布:Z-score 标准化(均值 0,标准差 1)

是什么?

把数据变成 “围绕 0 波动” 的形式:所有数据的平均值会变成 0,标准差(衡量数据分散程度)会变成 1。
比如 “文化平均分” 原始均值是 75.25,标准差是 8.95,某班级 71 分标准化后:(71-75.25)/8.95≈-0.47(表示比均值低 0.47 个标准差)。

公式(不用记):

新数据 = (原始数据 - 数据平均值) / 数据标准差

代码:
# 定义Z-score标准化函数
def z_score_normalize(df):return (df - df.mean()) / df.std()# 对数据做标准化
df_z_score = z_score_normalize(df)# 查看结果
print(df_z_score.head())
适合场景:
  • 数据接近 “正态分布”(比如考试分数、身高体重),比如 “分析班级成绩是否正常”。
  • 优点:不受极端值影响,适合后续做机器学习(比如线性回归)。

3. 看比例:归一化(Sum Normalization)

是什么?

把每个数据变成 “它占总和的比例”,所有数据加起来等于 1(或 100%)。
比如 “班级” 列有 1-19 个班级,总和是 190,1 班标准化后就是 1/190≈0.005(占比 0.5%)。

公式:

新数据 = 原始数据 / 所有数据的总和

代码:
# 定义归一化函数
def sum_normalize(df):return df / df.sum()# 对数据做标准化
df_sum = sum_normalize(df)# 查看结果
print(df_sum.head())
适合场景:
  • 想知道 “每个数据的占比”,比如 “各班级优秀率占总优秀率的比例”。

4. 消均值:中心化(Centering)

是什么?

把数据 “往下挪”,让所有数据的平均值变成 0。
比如 “挂科率” 原始均值是 14.45,某班级挂科率 10,标准化后就是 10-14.45=-4.45(表示比均值低 4.45)。

公式:

新数据 = 原始数据 - 数据平均值

代码:
# 定义中心化函数
def centering(df):return df - df.mean()# 对数据做标准化
df_centered = centering(df)# 查看结果
print(df_centered.head())
适合场景:
  • 想关注 “数据偏离均值的程度”,比如 “分析哪个班级挂科率比平均水平低多少”。

5. 其他常用方法(简单了解 + 代码)

剩下的方法原理更简单,我们直接用 “表格 + 代码” 快速掌握:

方法名称核心逻辑适合场景代码(复制即用)
均值化数据除以平均值,让平均值变成 1看数据是平均值的几倍,比如 “某班文化分是平均的 1.2 倍”def mean_normalize(df): return df/df.mean() ; df_mean = mean_normalize(df)
区间化缩到自定义区间(比如 1-5),比 Min-Max 灵活需要指定区间,比如 “把得分缩到 1-5 分制”def interval_normalize(df,a=1,b=5): return a+(b-a)*(df-df.min())/(df.max()-df.min()) ; df_interval = interval_normalize(df)
最小值化数据除以最小值,让最小值变成 1看数据是最小值的几倍,比如 “某班体育分是最低分的 1.5 倍”def min_value_normalize(df): return df/df.min() ; df_min_value = min_value_normalize(df)
最大值化数据除以最大值,让最大值变成 1看数据接近最大值的程度,比如 “某班优秀率是最高优秀率的 80%”def max_value_normalize(df): return df/df.max() ; df_max_value = max_value_normalize(df)

6. 特殊场景:指标处理(正向 / 负向 / 中间型 / 区间型)

这些方法是 “针对评价指标” 的标准化,比如分析 “班级综合表现” 时,不同指标的 “好坏方向” 不同:

  • 正向指标:数值越大越好(比如优秀率);
  • 负向指标:数值越小越好(比如挂科率);
  • 中间型指标:数值越接近某个 “最佳值” 越好(比如 “出勤率” 最佳是 95%,太高太低都不好);
  • 区间型指标:数值在某个 “最佳区间” 内最好(比如 “平均分” 在 70-80 之间最好)。
(1)正向指标处理(和 Min-Max 一样,越大越接近 1)
def positive_indicator(df):return (df - df.min()) / (df.max() - df.min())
df_positive = positive_indicator(df)  # 优秀率用这个方法,越大得分越高
(2)负向指标处理(反向 Min-Max,越小越接近 1)
def negative_indicator(df):return (df.max() - df) / (df.max() - df.min())
df_negative = negative_indicator(df)  # 挂科率用这个方法,越小得分越高
(3)中间型指标处理(越接近 “最佳值” 越接近 1)

比如 “体育平均分最佳是 40 分”:

def intermediate_indicator(df, x_best):  # x_best是你定的最佳值M = np.max(np.abs(df - x_best))  # 计算最大偏离度return 1 - np.abs(df - x_best) / Mx_best = 40  # 假设体育平均分最佳是40
df_intermediate = intermediate_indicator(df['体育平均分'], x_best)
(4)区间型指标处理(在 “最佳区间” 内得 1,超出则扣分)

比如 “文化平均分最佳区间是 70-80”:

def interval_indicator(df, a, b):  # a=区间下限,b=区间上限M = np.max([a - df.min(), df.max() - b])  # 最大偏离度result = df.copy()result[df < a] = 1 - (a - df[df < a]) / M  # 低于区间:越近得分越高result[(df >= a) & (df <= b)] = 1  # 在区间内:得1result[df > b] = 1 - (df[df > b] - b) / M  # 高于区间:越近得分越高return resulta = 70  # 文化分最佳区间下限
b = 80  # 上限
df_interval = interval_indicator(df['文化平均分成绩'], a, b)

四、怎么选:不同场景用什么方法?

最后给你一张 “选择指南表”,不用再纠结:

你的需求推荐方法
数据要缩到 0-1,做综合评分Min-Max 标准化 / 正向指标
数据是正态分布(比如考试分),做机器学习Z-score 标准化
想知道各数据的占比归一化(Sum)
想分析数据偏离平均值多少中心化
指标越小越好(比如挂科率)负向指标处理
指标要接近某个最佳值 / 区间(比如出勤率)中间型 / 区间型指标处理

五、动手试试!

  1. 复制文中的 “导入库和数据” 代码,先拿到数据;
  2. 选 1-2 个方法(比如 Min-Max 和负向指标),复制代码运行;
  3. 对比原始数据和标准化后的数据,看看变化 —— 你会发现数据真的 “变整齐” 了!

刚开始不用记所有公式,重点是理解 “每种方法的作用”,用到时再查代码就好~

http://www.xdnf.cn/news/19518.html

相关文章:

  • LeetCode刷题记录----74.搜索二维矩阵(Medium)
  • 构建无广告私人图书馆Reader与cpolar让电子书库随身携带
  • 站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准
  • Unity游戏打包——打包流程
  • 【C++】类型转换详解:显式与隐式转换的艺术
  • Vue2存量项目国际化改造踩坑
  • Ansible变量的定义与使用
  • 安卓11 12系统修改定制化_____常用的几种修改固件 实现指定 “运行内存” 显示
  • 【lucene】 中的impactsenum与impactsdisi有啥区别?
  • 拥抱智能高效翻译 ——8 款视频翻译工具深度测评
  • (附源码)留言系统的设计与实现
  • 标定分享3--lidar与rtk/ins标定外参工程实现分享
  • 变频器实习总结14 电子元件中的内部参考电压 Type-c口对于BMS开发的优点
  • Synchronized 概述
  • 平衡二叉树(一)
  • 2016考研数学(二)真题
  • sunset: noontide靶场
  • AlphaFold 2 本地部署与安装教程(Linux)
  • 高速CANFD通讯接口芯片ASM1042性能分析与5Mbps多节点测验
  • 包的相对导入
  • MPI-NCCL-TEST 训练自检,基础通信和可用的机器
  • 《Bishop PRML》10.1 (3) 理解VAE KL loss
  • 【贪心算法】day5
  • PPO、DPO和GRPO的区别
  • Python实现BP神经网络
  • 利用美团longcat.ai编写的C语言支持指定压缩算法通用ZIP压缩程序
  • 硬件工程师成长之路:从入门到精通的技术旅程
  • 科学研究系统性思维的方法体系:研究设计相关模版
  • go 开发环境配置 air + dlv debug 踩坑之旅
  • Linux shell 脚本基础 003