Datawhale组队学习2025.2 数学建模导论 Task1 数据处理与拟合模型
学习内容:
- 第6章 数据处理与拟合模型
- 引言
- 6.1 数据与大数据
- 6.1.1 什么是数?什么是数据?
- 6.1.2 数据与大数据
- 6.1.3 数据科学的研究
- 6.2 数据的预处理
- 6.2.1 为什么需要数据预处理
- 6.2.2 使用pandas处理数据的基础
- 6.2.3 数据的规约
- 6.3 常见的统计分析模型
- 6.3.1 回归分析与分类分析
- 6.3.2 假设检验
- 6.3.3 随机过程与随机模拟
- 6.4 数据可视化
- 6.4.1 Python三大数据可视化工具库的简介
- (1)Matplotlib:
- (2)Seaborn:
- (3)Plotnine:
- 6.4.2 基本图标Quick Start
- 6.4.1 Python三大数据可视化工具库的简介
- 6.5 插值模型
- 6.5.1 线性插值法
- 6.5.2 三次样条插值
- 6.5.3 拉格朗日插值
- 引言
学习时间:
- 2025/2/9-8:00 PM ~ 2025/2/13-3:00 AM
学习笔记(都是原文重点 Orz ):
引言
从数据中挖掘有用的价值,这个学科叫做数据挖掘,也是数学建模中必考的问题,也是各大数学建模竞赛中考察的重难点。它主要针对的就是从杂乱无章的数据到验证结论的全过程。
本章主要涉及到的知识点有:
- 数据与大数据
- Python数据预处理
- 常见的统计分析模型
- 随机过程与随机模拟
- 数据可视化
注意:本章内容涉及到基础的概率论与数理统计理论,如果对这部分内容不熟悉,可以参考相关概率论与数理统计的相关书籍,如果您想对此基础做入门学习,可以参考:https://github.com/Git-Model/init_Modeling。
6.1 数据与大数据
古希腊的先哲毕达哥拉斯说“万物皆数”,你或许无法想象,有一天唐诗宋词也会被称作“数据”吧?你或许无法想象,许嵩的一首歌也会被称作“数据”吧?你或许也无法想象,有关你女朋友的自拍也被称作为“数据”吧?但事实上,这些都是广义的“数据”。因为数据的目的,是为了描述与传递信息;而信息的载体是多种多样的,人类能够感知与认知的信息,计算机同样有办法处理。
而我们把这些信息的不同形式称之为“模态”,包括:
- 数值类数据,例如结构化的excel表格和SQL文件。
- 文本类数据,例如新闻报道、微博评论、餐饮点评等文字。
- 图像类数据,以一定尺寸的黑白或彩色图像在计算机内存储。
- 音频类数据,例如音乐、电话录音等。
- 信号类数据,例如地震波的波形、电磁波信号、脑电信号等。
面对不同的数据,能够使用最合适的方法最为重要。而判断此方法是否合适,一个根本的衡量就是数据的体量。
Drew Conway在2010年阐释“数据科学”的时候称:“数据科学是统计学、计算机科学和领域知识的交叉学科”。其实数学建模亦是如此,它需要数学基础,也需要计算机基础,但在解决实际工程问题的时候需要特定的工程背景。此三者缺一不可。

笔者看来,大数据科学研究的不仅仅是数据分析,它还包括了:
- 数据的获取和存储:包括爬虫、软件定义存储、硬件存储有关背景知识等。
- 数据的处理:包括分布式计算、并行计算、数据流等知识,以及Hadoop、Spark等大数据框架。
- 数据的分析:包括统计学、数据挖掘与机器学习、计算机视觉、自然语言处理等内容,重在挖掘数据中的模式与知识。
- 数据的管理:现代数据库系统及其架构等内容。
- 数据的应用:数据可视化、数据相关软件的开发、报表分析以及如何将数据挖掘得到的结果还原为实际问题的解决方案。
6.2 数据的预处理
上一节基本都是一些概念性的东西,这一节的主要目的就是总结归纳其中的操作方法。
在现实生活问题中,我们得到的原始数据往往非常混乱、不全面,模型往往无法从中有效识别并提取信息。数据和特征决定了效果的上限,而模型和算法只是逼近这个上限而已,在采集完数据后,建模的首要步骤以及主要步骤便是数据预处理。
一份数据可能并没有理想中那么规则,经常会出现空缺、重复和一些异常记录,那么如何识别并处理这些问题就非常关键了。对于重复数据直接将其删除即可。但缺失数据的处理有一些技巧。我们主要是观察缺失率,如果存在缺失的数据项(数表一行称作一个数据项)占比较少(大概5%以内)这个时候如果问题允许可以把行删掉。如果缺失率稍微高一点(5%-20%)左右就可以使用填充、插值的方法去处理,有关插值的方法我们会在下一节探讨,而填充方法包括常数填充、均值填充等方法;如果缺失率还高一些(20%-40%)那么就需要用预测方法例如机器学习去填充缺失数据了;但如果一行数据有**50%**以上都是缺失的,如果条件允许,我们可以把这一列都删掉(当然凡事都有例外,见机行事)。
仅仅使用简单处理数据api无法快速处理一些特定的任务,如:数据去重、填补缺失值等等。
数据为何需要规约?因为实际应用中数据的分布可能是有偏的,量纲影响和数值差异可能会比较大。规约是为了形成对数据的更高效表示,学习到更好的模型。它会保留数据的原始特征,但对极端值、异常值等会比较敏感。这里我们就介绍两个比较典型的规约方式:min-max规约和Z-score规约。
min-max规约的表达式形如:
x
n
e
w
=
x
−
min
(
x
)
max
(
x
)
−
min
(
x
)
(6.2.1)
{x_{new}} = \frac{{x - \min (x)}}{{\max (x) - \min (x)}} \tag{6.2.1}
xnew=max(x)−min(x)x−min(x)(6.2.1)
这一操作的目的是为了消除量纲影响,所有的属性都被规约到[0,1]的范围内,数据的偏差不会那么大。但是如果出现异常值,比如非常大的数值,那么这个数据的分布是有偏的。为了对数据的分布进行规约,还会使用到另一个常用的方法就是Z-score规约:
x
n
e
w
=
x
−
x
ˉ
s
t
d
(
x
)
(6.2.2)
{x_{new}} = \frac{{x - \bar x}}{{std(x)}} \tag{6.2.2}
xnew=std(x)x−xˉ(6.2.2)
本质上,一列数据减去其均值再除以标准差,如果这一列数据近似服从正态分布,这个过程就是化为标准正态分布的过程。Z-score规约和min-max规约往往不是二者取其一,有时候两个可以组合起来用。除此以外,还有很多的规约方法,但是这两种最为常用。若使用Python实现起来也非常简单。
6.3 常见的统计分析模型
统计分析的很多内容与机器学习的相关内容大差不差,但是侧重点不一样。统计分析通常在做“为什么”的任务,机器学习通常在做“预测未来”的任务。这里将介绍几种常用的统计分析的方法。
由于统计分析的原理涉及大量数学知识,对这部分知识的原理感兴趣的话,欢迎查看:https://github.com/Git-Model/Modeling-Universe/tree/main/Data-Story
回归分析与分类分析都是一种基于统计模型的统计分析方法。它们都研究因变量(被解释变量)与自变量(解释变量)之间存在的潜在关系,并通过统计模型的形式将这些潜在关系进行显式的表达。不同的是,回归分析中因变量是连续变量,如工资、销售额;而分类分析中因变量是属性变量,如判断邮件“是or否”为垃圾邮件。
假设检验是统计分析中重要的一环,它贯穿着统计分析的所有环节。在数学建模中,我们既能通过假设检验对数据进行探索性的信息挖掘,以给予我们选择模型充分且客观的依据;又能在建模完成后,通过特定的假设检验验证模型的有效性。因此,储备基本的假设检验知识,学会根据数据特点、任务需求选择相对应的假设检验十分重要。
假设检验大体上可分为两种:参数假设检验与非参数假设检验。若假设是关于总体的一个参数或者参数的集合,则该假设检验就是参数假设检验,刚刚的例子的假设是关于总体均值的,均值是参数,因此这是一个参数假设检验;若假设不能用一个参数集合来表示,则该假设检验就是非参数假设检验,一个典型就是正态性检验。
(1)正态性检验:于参数检验比非参数检验更灵敏,因此一旦数据是正态分布的,我们应该使用参数检验,此时对数据进行正态性检验就非常有必要了。
(2)单组样本均值假定的检验:
(2)两组样本的均值相等性检验:
(3)方差分析-多组样本间的均值相等性检验
既然我们检验的是不同总体的均值是否相等,那么观察各样本的样本均值的“差异程度”一定是非常自然且合理的想法,如果各样本的均值差异很大,那么它们的总体均值也有很大可能存在差异。
样本间均值的“差异程度”是一个很好的评判指标,但这并不足够,还有一个不起眼的指标也十分重要:各样本的样本内差异程度。在相同的样本间差异程度下,样本内差异程度越大,各总体间均值存在差异的可能性就越小,为什么呢?简单来说,就是样本内差异程度越大,“偶然性”越大,我们越难以判断两个不相等的均值是否真的不相等。
随机过程的世界是构建在概率论的世界上的,它拥有比概率论更为广阔的视野。那么,随机过程相比于概率论做了哪些深化的研究呢?首先,概率论仅仅研究的是在某一个时点,某个随机变量(随机向量)的分布情况。
因此,总结一下:随机过程就是在随机变量的基础上加入了时间维度(值得注意的是,时间维度不是随机变量,只是普通变量),随机过程与概率论有很强的关联性,又有不同。
(由于随机过程的相关原理需要大量数学理论,如果想系统了解相关理论,欢迎访问https://github.com/Git-Model/Modeling-Universe/tree/main/Data-Story)
6.4 数据可视化
使用文字表达结论往往显得过于单调与枯燥,所谓“一图抵千言”,适当使用图表会增加分析结论的有趣性与可读性,这里有一个关键词叫:数据可视化。
首先,我们先来探讨下“可视化”与“数据可视化”的联系与区别。可视化和数据可视化其实都旨在使用图表去表达观点,而数据可视化更加强调使用可视化的图表去表达数据中的信息,如数据分析中的结论。可视化与数据可视化的差别其实类似于:时尚杂志封面与学术杂志封面的区别,一个注重视觉的观感,另一个在注重观感的同时表达数据结论;
其次,数据可视化在一般情况下可以分为:在分析过程中的数据可视化与分析结果表达中的数据可视化。分析过程中的数据可视化强调辅助分析,即图表不是很在意观感如何,只要自己能看懂,自己从图表中得到有用的结论并辅助分析的流程其实就可以了。而分析结果表达中的数据可视化强调在阅读数据分析结论的人能更好地知道分析结论是什么,因此相对于分析过程中的数据可视化来说更加美观、表达的信息更全面;(在这里,我们主要探讨分析结果表达中的数据可视化)
最后,什么才能称得上是一个好的数据可视化图表呢?
- 图表展示的信息全面且无歧义
- 图表表达的信息越多、越全面越好
- 通俗易懂,不能太专业
Python三大数据可视化工具库
(1)Matplotlib
(2)Seaborn
(3)Plotnine
基本图标Quick Start
(1)类别型图表:类别型图表一般表现为:X类别下Y数值之间的比较,因此类别型图表往往包括:X为类别型数据、Y为数值型数据。类别型图表常常有:柱状图、横向柱状图(条形图)、堆叠柱状图、极坐标的柱状图、词云、雷达图、桑基图等等。
(2)关系型图表:关系型图表一般表现为:X数值与Y数值之间的关系,如:是否是线性关系、是否有正向相关关系等等。一般来说,关系可以分为:数值型关系、层次型关系和网络型关系。
(3)分布型图表:所谓数据的分布,其实就是数据在哪里比较密集,那里比较稀疏,描述数据的密集或者稀疏情况实际上可以用频率或者概率。
(4)时间序列型图表:
6.5 插值模型
插值方法实际上除了是用于处理缺失值一个很好的方法,也是做数据填充的很好的方法。比如,我获取了按日的数据,需要按小时对数据进行填充,这个时候就可以用插值去做填充任务。这里介绍几种比较常见的插值方法。
6.5.1 线性插值法
线性插值对两个点中的解析式是按照线性方程来建模。比如我们得到的原始数据列{y}和数据的下标{x},这里数据下标x可能并不是固定频率的连续取值而是和y一样存在缺失的。给定了数据点(xk,yk)和(xk+1,yk+1),需要对两个点之间构造直线进行填充。很显然,根据直线的点斜式方程,这个直线解析式为:
L
1
(
x
)
=
y
k
+
y
k
+
1
−
y
k
x
k
+
1
−
x
k
(
x
−
x
k
)
(6.5.1)
{L_1}(x) = {y_k} + \frac{{{y_{k + 1}} - {y_k}}}{{{x_{k + 1}} - {x_k}}}(x - {x_k}) \tag{6.5.1}
L1(x)=yk+xk+1−xkyk+1−yk(x−xk)(6.5.1)
6.5.2 三次样条插值
三次样条插值是一种非常自然的插值方法。它将两个数据点之间的填充模式设置为三次多项式。它假设在数据点(xk,yk)和(xk+1,yk+1)之间的三次式叫做Ik,那么这一组三次式需要满足条件:
a
i
x
i
3
+
b
i
x
i
2
+
c
i
x
i
+
d
i
=
a
i
+
1
x
i
+
1
3
+
b
i
+
1
x
i
+
1
2
+
c
i
+
1
x
i
+
1
+
d
i
+
1
(6.5.2)
{a_i}x_i^3 + {b_i}x_i^2 + {c_i}{x_i} + {d_i} = {a_{i + 1}}x_{i + 1}^3 + {b_{i + 1}}x_{i + 1}^2 + {c_{i + 1}}{x_{i + 1}} + {d_{i + 1}} \tag{6.5.2}
aixi3+bixi2+cixi+di=ai+1xi+13+bi+1xi+12+ci+1xi+1+di+1(6.5.2)
3
a
i
x
i
2
+
2
b
i
x
i
+
c
i
=
3
a
i
+
1
x
i
+
1
2
+
2
b
i
+
1
x
i
+
1
+
c
i
+
1
(6.5.3)
3{a_i}x_i^2 + 2{b_i}{x_i} + {c_i} = 3{a_{i + 1}}x_{i + 1}^2 + 2{b_{i + 1}}{x_{i + 1}} + {c_{i + 1}} \tag{6.5.3}
3aixi2+2bixi+ci=3ai+1xi+12+2bi+1xi+1+ci+1(6.5.3)
6
a
i
x
i
+
2
b
i
=
6
a
i
+
1
x
i
+
1
+
2
b
i
+
1
(6.5.4)
6{a_i}{x_i} + 2{b_i} = 6{a_{i + 1}}{x_{i + 1}} + 2{b_{i + 1}} \tag{6.5.4}
6aixi+2bi=6ai+1xi+1+2bi+1(6.5.4)
通过解方程的形式可以解出每一只三次式。而简而言之,也就是说某个数据点前后两条三次函数不仅在当前的函数值相等,一次导数值和二次导数值也要保持相等。
6.5.3 拉格朗日插值
对于一组数据{y}和下标{x},定义n个拉格朗日插值基函数:
l
k
(
x
)
=
∏
i
=
0
,
i
≠
k
n
x
−
x
i
x
k
−
x
i
(6.5.5)
{l_k}(x) = \prod\limits_{i = 0,i \ne k}^n {\frac{{x - {x_i}}}{{{x_k} - {x_i}}}} \tag{6.5.5}
lk(x)=i=0,i=k∏nxk−xix−xi(6.5.5)
这本质上是一个分式,当x=xk时lk(x)=1,这一操作实现了离散数据的连续化。按照对应下标的函数值加权求和可以得到整体的拉格朗日插值函数:
L
(
x
)
=
∑
k
=
0
n
y
k
l
k
(
x
)
(6.5.6)
L(x) = \sum\limits_{k = 0}^n {{y_k}{l_k}(x)} \tag{6.5.6}
L(x)=k=0∑nyklk(x)(6.5.6)
但很不幸,Python没有为我们提供拉格朗日插值函数的方法。不过好在实现并不算太困难,我们可以自己写一个:
def lagrange(x0,y0,x):
y=[]
for k in range(len(x)):
s=0
for i in range(len(y0)):
t=y0[i]
for j in range(len(y0)):
if i!=j:
t*=(x[k]-x0[j])/(x0[i]-x0[j])
s+=t
y.append(s)
return y
终于!!! 全是干货,就差把老师的原文档搬过来了QAQ

819

被折叠的 条评论
为什么被折叠?



