经过不懈的努力, 2024年第十四届亚太地区大学生数学建模竞赛(中文赛项)B题洪水灾害的数据分析与预测论文和代码已完成,代码为C题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和求解)、模型的评价等等
2024年第十四届亚太地区大学生数学建模竞赛(中文赛项)论文和代码获取↓↓↓
https://www.yuque.com/u42168770/qv6z0d/pvp6x4xr006n3t31
问题重述
B题洪水灾害的数据分析与预测洪水是暴雨、急剧融冰化雪、风暴潮等自然因素引起的江河湖泊水量迅速增加,或者水位迅猛上涨的一种自然现象,是自然灾害。洪水又称大水,是河流、海洋、湖泊等水体上涨超过一定水位,威胁有关地区的安全,甚至造成灾害的水流。洪水一词,在中国出自先秦《尚书·尧典》。从那时起,四千多年中有过很多次水灾记载,欧洲最早的洪水记载也远在公元前1450 年。在西亚的底格里斯-幼发拉底河以及非洲的尼罗河关于洪水的记载,则可追溯到公元前40 世纪。
2023 年6 月24 日8 时至25 日8 时,中国15 条河流发生超警洪水。2023 年,全球洪水等造成了数十亿美元的经济损失。
洪水的频率和严重程度与人口增长趋势相当一致。迅猛的人口增长,扩大耕地,围湖造田,乱砍滥伐等人为破坏不断地改变着地表状态,改变了汇流条件,加剧了洪灾程度。在降水多的年份,洪水是否造成灾害,以及洪水灾害的大小,也离不开人为因素,长期以来人为的森林破坏是其重要原因。长江上游乱砍滥伐的恶果是惊人的水土流失。现已达35 万平方千米,每年土壤浸融量达25 亿吨。
河流、湖泊、水库淤积的泥沙量达20 亿吨。仅四川一省一年流入长江各支流的泥沙,如叠成宽高各1 米的堤,可以围绕地球赤道16 圈。我国第一大淡水湖洞庭湖每年沉积的泥沙达1 亿多吨,有专家惊呼:"这样下去,要不了50 年,洞庭湖将从地球上消失!"长江之险,险在荆江,由于泥沙俱下,如今荆江段河床比江外地面高出十多米,成了除黄河之外名副其实的地上河。对森林的肆意砍伐不仅危害自己,而且祸及子孙后代,世界上许多地方,如美索不达米亚、小亚细亚、阿尔卑斯山南坡等由于过度砍伐森林,最后都变成了不毛之地。
附件train.csv 中提供了超过100 万的洪水数据,其中包含洪水事件的id、季风强度、地形排水、河流管理、森林砍伐、城市化、气候变化、大坝质量、淤积、农业实践、侵蚀、无效防灾、排水系统、海岸脆弱性、滑坡、流域、基础设施恶化、人口得分、湿地损失、规划不足、政策因素和发生洪水的概率。
附件test.csv 中包含了超过70 万的洪水数据,其中包含洪水事件的id 和上述20 个指标得分,缺少发生洪水的概率。附件submit.csv 中包含test.csv 中的洪2水事件的id,缺少发生洪水的概率。
请你们的团队通过数学建模和数据分析的方法,预测发生洪水灾害的概率,解决以下问题:问题1. 请分析附件train.csv 中的数据,分析并可视化上述20 个指标中,哪些指标与洪水的发生有着密切的关联?哪些指标与洪水发生的相关性不大?并分析可能的原因,然后针对洪水的提前预防,提出你们合理的建议和措施。
问题2. 将附件train.csv 中洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征。然后,选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。
问题3. 基于问题1 中指标分析的结果,请建立洪水发生概率的预测模型,从20 个指标中选取合适指标,预测洪水发生的概率,并验证你们预测模型的准确性。如果仅用5 个关键指标,如何调整改进你们的洪水发生概率的预测模型?问题4. 基于问题2 中建立的洪水发生概率的预测模型,预测附件test.csv 中所有事件发生洪水的概率,并将预测结果填入附件submit.csv 中。然后绘制这74多万件发生洪水的概率的直方图和折线图,分析此结果的分布是否服从正态分布。
问题分析
这道题目围绕洪水灾害的数据分析与预测展开,要求参赛者利用给定的大规模数据集,通过数学建模和数据分析方法预测洪水发生的概率。题目包含四个子问题,涵盖了数据探索、风险分类、预测建模等多个方面,综合考察参赛者的数据分析能力和建模技巧。
问题1主要关注数据探索和特征分析。这个问题要求对20个指标与洪水发生概率的关系进行深入分析,并进行可视化。思路上可以先进行相关性分析,计算各指标与洪水概率的相关系数,识别出最相关的指标。然后可以使用各种可视化技术,如散点图、热力图等,直观展示指标与洪水概率的关系。对于相关性较强的指标,可以进一步分析其物理意义,探讨其影响洪水发生的可能机制。对于相关性较弱的指标,也需要考虑可能存在的非线性关系。最后,基于分析结果提出针对性的防洪建议,这需要结合实际情况,考虑经济、社会、环境等多方面因素。
问题2聚焦于风险分类和评价模型构建。首先需要对洪水概率进行聚类,可以考虑使用K-means、层次聚类等算法,将洪水事件划分为高、中、低风险类别。然后分析各类别的指标特征,可以使用统计检验方法比较不同类别间各指标的差异。在此基础上,选取有代表性的指标构建预警评价模型。模型选择上可以考虑决策树、随机森林等易于解释的模型,也可以使用逻辑回归等传统方法。权重计算可以采用信息增益、基尼系数等方法。最后进行灵敏度分析,可以通过改变输入参数,观察模型输出的变化,评估模型的稳定性和可靠性。
问题3要求建立洪水概率预测模型。基于问题1的分析结果,可以选择相关性较强的指标作为特征。模型选择上,可以考虑线性回归、决策树、随机森林、支持向量机、神经网络等多种算法。建议采用交叉验证的方式评估模型性能,选择最优模型。模型评估指标可以使用均方误差、R方等。对于5个关键指标的模型,可以采用特征选择技术,如递归特征消除、Lasso等方法选择最重要的5个特征。然后可以尝试集成学习方法,如随机森林、梯度提升树等,提高模型在有限特征下的预测能力。同时,可以考虑引入非线性变换,捕捉特征间的复杂关系。
问题4是对建立的模型进行应用和结果分析。首先需要使用问题3中建立的模型对test.csv中的数据进行预测,并将结果填入submit.csv。这一步需要注意数据预处理的一致性,确保测试集的特征与训练集保持一致。然后绘制预测结果的直方图和折线图,这可以使用matplotlib、seaborn等Python可视化库完成。分析分布是否服从正态分布,可以采用Q-Q图、Shapiro-Wilk检验等方法。如果发现分布显著偏离正态分布,需要进一步分析可能的原因,如是否存在异常值、是否有明显的偏态等。这一分析可能会为模型的进一步优化提供线索,也可能揭示洪水风险分布的某些特征。
模型的建立与求解
问题一模型的建立与求解
思路分析
问题1要求我们分析附件train.csv中的数据,探究20个指标与洪水发生概率之间的关系,并对此进行可视化分析。我们的思路是首先对数据进行预处理,包括处理缺失值、异常值,以及进行必要的数据转换。然后,我们将采用多种统计和机器学习方法来分析指标与洪水概率的关系。
具体来说,我们将采用以下步骤:
- 数据预处理:检查并处理缺失值和异常值,必要时进行数据标准化或归一化。
- 相关性分析:计算各指标与洪水概率之间的相关系数,识别出最相关的指标。
- 可视化分析:使用散点图、热力图等可视化技术,直观展示指标与洪水概率的关系。
- 特征重要性分析:使用机器学习模型(如随机森林)来评估各指标对洪水概率预测的重要性。
- 非线性关系分析:考虑到某些指标可能与洪水概率存在非线性关系,我们将使用互信息分析等方法来捕捉这些复杂关系。
- 多元统计分析:使用主成分分析(PCA)等方法,探索指标之间的相互关系及其对洪水概率的综合影响。
- 基于分析结果,提出针对性的防洪建议和措施。
通过这种多角度、多方法的分析,我们能够全面地理解各指标与洪水发生概率之间的关系,为后续的预测模型建立奠定基础。
相关性分析模型建立
为了深入分析20个指标与洪水发生概率之间的关系,我们首先建立相关性分析模型。这个模型将帮助我们量化每个指标与洪水概率之间的线性关系强度。
我们选择使用皮尔逊相关系数(Pearson correlation coefficient)作为主要的相关性度量指标。皮尔逊相关系数能够衡量两个变量之间的线性相关程度,其值范围在-1到1之间,其中1表示完全正相关,-1表示完全负相关,0表示无线性相关。
同时,考虑到某些指标可能与洪水概率存在非线性关系,我们还将计算斯皮尔曼等级相关系数(Spearman's rank correlation coefficient)。斯皮尔曼相关系数能够捕捉单调非线性关系,对异常值的敏感性较低。
此外,我们还将使用互信息(Mutual Information)来衡量指标与洪水概率之间的非线性相关性。互信息能够捕捉到更复杂的非线性关系,是对线性相关分析的有力补充。
- 皮尔逊相关系数:
皮尔逊相关系数计算公式如下:
r x y = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r_{xy} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \bar{y})^2}} rxy=∑i=1n(xi−xˉ)2 ∑i=1n(yi−yˉ)2 ∑i=1n(xi−xˉ)(yi−yˉ)
其中:
- r x y r_{xy} rxy 是x和y之间的皮尔逊相关系数
- x i x_i xi 和 y i y_i yi 分别是变量x和y的第i个观测值
- x ˉ \bar{x} xˉ 和 y ˉ \bar{y} yˉ 分别是x和y的平均值
- n是观测值的总数
解释:皮尔逊相关系数衡量了两个变量之间的线性相关程度。它的值范围在-1到1之间,1表示完全正相关,-1表示完全负相关,0表示无线性相关。
- 斯皮尔曼等级相关系数:
斯皮尔曼等级相关系数的计算公式如下:
ρ = 1 − 6 ∑ d i 2 n ( n 2 − 1 ) \rho = 1 - \frac{6 \sum d_i^2}{n(n^2 - 1)} ρ=1−n(n2−1)6∑di2
其中:
- ρ \rho ρ 是斯皮尔曼等级相关系数
- d i d_i di 是第i个观测值在x和y两个变量上的等级差
- n是观测值的总数
解释:斯皮尔曼等级相关系数衡量了两个变量之间的单调关系强度,它对异常值不敏感,能够捕捉非线性但单调的关系。
- 互信息:
互信息的计算公式如下:
I ( X ; Y ) = ∑ y ∈ Y ∑ x ∈ X p ( x , y ) log ( p ( x , y ) p ( x ) p ( y ) ) I(X;Y) = \sum_{y \in Y} \sum_{x \in X} p(x,y) \log\left(\frac{p(x,y)}{p(x)p(y)}\right) I(X;Y)=y∈Y∑x∈X∑p(x,y)log(p(x)p(y)p(x,y))
其中:
(略,见完整版本)
问题一模型的求解
基于上述建立的模型和算法步骤,我们现在开始对问题一进行具体的求解。我们将使用Python编程语言及其相关库(如pandas, numpy, scikit-learn, matplotlib等)来实现数据处理、分析和可视化。
前5个最相关的特征(基于皮尔逊相关系数):
洪水概率 (略,见完整版本)
湿地损失 (略,见完整版本)
规划不足 (略,见完整版本)
政策因素
(略,见完整版本)
PCA解释方差比:
(略,见完整版本)
问题二模型的建立与求解
思路分析
问题2要求我们将洪水发生的概率聚类成不同类别,分析具有高、中、低风险的洪水事件的指标特征,然后选取合适的指标,计算不同指标的权重,建立发生洪水不同风险的预警评价模型,最后进行模型的灵敏度分析。这个问题涉及多个步骤,需要我们综合运用多种数据分析和机器学习技术。我们的思路如下:
-
聚类分析:首先,我们需要对洪水发生概率进行聚类,将其分为高、中、低风险类别。考虑到数据的特性,我们可以采用K-means聚类算法或层次聚类算法。
-
特征分析:对每个风险类别,我们需要分析其特征分布情况。这可以通过描述性统计、可视化分析以及统计检验来实现。
-
指标选取:基于特征分析的结果,我们需要选取最能区分不同风险类别的指标。这可以通过特征重要性分析或者特征选择算法来实现。
-
权重计算:对选取的指标,我们需要计算其权重。可以考虑使用主成分分析(PCA)、信息增益或者基于机器学习模型的特征重要性来确定权重。
(后略,见完整版本)
K-means聚类模型建立
为了将洪水发生概率聚类成不同的风险类别,我们选择使用K-means聚类算法。K-means是一种常用的无监督学习算法,它能够将数据点分成k个簇,每个簇由其中心(质心)表示。
K-means算法的基本思想是:
- 随机选择k个点作为初始簇中心。
- 将每个数据点分配到最近的簇中心。
- 重新计算每个簇的中心(即簇中所有点的平均值)。
- 重复步骤2和3,直到簇的分配不再改变或达到最大迭代次数。
在我们的问题中,我们将k设为3,对应高、中、低三个风险类别。
K-means聚类算法步骤
- K-means聚类算法:
K-means算法的目标是最小化所有点到其簇中心的距离平方和,即最小化以下目标函数:
J = ∑ j = 1 k ∑ i = 1 n ∣ ∣ x i ( j ) − c j ∣ ∣ 2 J = \sum_{j=1}^{k} \sum_{i=1}^{n} ||x_i^{(j)} - c_j||^2 J=j=1∑ki=1∑n∣∣xi(j)−cj∣∣2
其中:
- J J J 是目标函数
- k k k 是簇的数量
- n n n 是数据点的数量
- x i ( j ) x_i^{(j)} xi(j) 是属于簇 j j j 的第 i i i 个数据点
- c j c_j cj 是簇 j j j 的中心
算法迭代过程中,每次更新簇中心的公式为:
c j = 1 ∣ S j ∣ ∑ x i ∈ S j x i c_j = \frac{1}{|S_j|} \sum_{x_i \in S_j} x_i cj=∣Sj∣1xi∈Sj∑xi
其中 S j S_j Sj 是属于簇 j j j 的所有数据点的集合。
- 肘部法则:
肘部法则通过计算不同k值下的簇内平方和(WSS)来确定最佳的聚类数。WSS的计算公式为:
W S S = ∑ j = 1 k ∑ i = 1 n j ∣ ∣ x i ( j ) − c j ∣ ∣ 2 WSS = \sum_{j=1}^{k} \sum_{i=1}^{n_j} ||x_i^{(j)} - c_j||^2 WSS=j=1∑ki=1∑nj∣∣xi(j)−cj∣∣2
其中 n j n_j nj 是簇 j j j 中的数据点数量。
- 方差分析(ANOVA):
ANOVA用于检验不同组之间的均值是否存在显著差异。其中,F统计量的计算公式为:
(略)
问题二模型的求解
以下是基于前面建立的模型,用于求解问题2的详细完整Python代码,包括数据处理、聚类分析、特征选择、模型构建、可视化和结果保存:
python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
from scipy import stats
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据
data = pd.read_csv('train.csv')
# 数据预处理
X = data.drop('洪水发生概率', axis=1)
y = data['洪水发生概率']
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# K-means聚类
kmeans = KMeans(n_clusters=3, random_state=42)
clusters = kmeans.fit_predict(y.values.reshape(-1, 1))
# 可视化聚类结果
(完整代码见完整版本)
# 可视化灵敏度分析结果
plt.figure(figsize=(12, 8))
plt.bar(sensitivity_df['特征'], sensitivity_df['敏感度'])
plt.title('特征灵敏度分析')
plt.xlabel('特征')
plt.ylabel('敏感度')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('问题2_特征灵敏度条形图.png', dpi=300)
plt.close()
print("问题2的所有分析和可视化结果已保存。")
其他图片与分析略,见完整版本