Press "Enter" to skip to content

Mann-Kendall趋势检验使用Python

介绍

曼-肯德尔趋势检验,以H.A.曼和D.R.肯德尔命名,是一种非参数检验方法,用于确定趋势是否随时间显著变化。趋势可以是随时间单调增加或单调减少的。由于这是一种非参数检验方法,所以我们不必担心数据的分布。但是数据不应该具有串联相关性/自相关性(时间序列中的误差项从一个时期转移到另一个时期)。

曼-肯德尔检验旨在检测单调趋势,即随时间持续增加或减少的趋势,而不假设数据的特定分布。当处理可能不满足参数检验(如正态性)假设的数据时,它特别有用。

本文是数据科学博客马拉松的一部分。

样本量要求

如果你有非常小的样本,比如3或4个,那么很有可能找不到任何趋势。随着时间的推移,我们拥有的样本越多,测试统计量的可靠性就越高。尽管测试也可以针对非常小的样本进行,但建议的数据量至少为10。

Mann-Kendall趋势检验使用Python 四海 第1张

测试目标

在本文中,我们研究了火车出轨事故随时间的相关情况。奥迪沙最近的火车出轨事故再次对铁路安全提出了质疑。铁路事故可以按照事故类型进行分类(例如正面碰撞、尾部碰撞、爆炸、侧面碰撞、出轨、火灾等)。随着时间的推移,铁路在技术和基础设施方面有了许多改进。尽管现代化的进展已经到位,但世界各地的火车事故仍然很常见。火车事故是全球铁路系统中发生的不幸事件。这些事故可能导致生命损失、伤害和财产损失。

在本研究中,我们将确定在印度,随着这些年所做的各种进步,我们是否能够减少火车事故(我们将研究事故类别中的出轨事故)。我们获得的有关印度出轨事故的数据是时间序列数据。我们拥有从2001年到2016年的出轨数据。数据按时间顺序排列。

我们的数据

从上表中,我们可以清楚地看到数据呈下降趋势。自2001年以来,出轨事故的数量大大减少。在2001年,我们有350起与出轨相关的事故,而在2016年减少到65起。由于数据是按顺序排列的,我们可以直接将其输入到Python环境中并进行处理。让我们在Python中绘制一个图来正确地可视化数据。

!pip install seaborn
import seaborn as sns
import matplotlib.pyplot as plt
fig = plt.subplots(figsize=(20, 5))
sns.lineplot(x='Year', y='Derailments', data=df)
sns.set_theme(style='white', font_scale=3)

Mann-Kendall趋势检验使用Python 四海 第2张

从上图中,我们可以清楚地看到存在下降趋势。但我们能否说这种下降趋势是显著的呢?尽管从图中很明显,但让我们使用曼-肯德尔趋势假设检验来验证一下。

步骤

  • 该检验的零假设(H0)是数据中不存在单调趋势。
  • 备择假设(H1)是存在趋势。趋势可以是单调递增的正趋势或单调递减的负趋势。
  • 检验统计量:M检验产生一个被表示为“T”的检验统计量。T的正值表示增长趋势,而负值表示减少趋势。T的大小表示趋势的强度。
  • 显著性水平(Alpha):确定统计显著性阈值的显著性水平(例如,0.05或0.10)。这代表在数据中没有实际趋势时观察到趋势的最大概率。
  • p值:曼-肯德尔检验计算出一个p值,该值量化在假设零假设为真的情况下,观察到的检验统计量与观察到的检验统计量一样极端的概率。p值表示反对零假设的证据。
    • 如果p值小于显著性水平(p < α),则表明有强有力的证据来拒绝零假设。这表示数据中存在统计显著的趋势。
    • 如果p值大于或等于显著性水平(p ≥ α),则表明没有足够的证据来拒绝零假设。这意味着数据中没有统计显著的趋势。
    • 结论:根据p值和显著性水平,您可以得出关于数据中是否存在显著趋势的结论。
    • 如果p < α,则可以得出结论,数据中存在统计显著的趋势。请确保根据检验统计量(T)的符号考虑趋势的方向。
    • 如果p ≥ α,则可以得出结论,数据中不存在统计显著的趋势。没有足够的证据表明存在趋势。

Python 代码步骤

  • 读取数据集
import pandas as pd
df=pd.read_csv("C:\\Users\\DELL\\OneDrive\\Desktop\\AnalyticsVidhya\\derailment.csv")
df.head()
  • 导入库:
!pip install pymannkendall
import numpy as np
import pymannkendall 

Mann-Kendall趋势检验使用Python 四海 第3张

  • Mann Kendall 测试:
mk.original_test(df["Derailments"])

Mann-Kendall趋势检验使用Python 四海 第4张

结论

趋势是下降的,P-Value 非常显著。因此,我们拒绝了零假设,并得出结论:随着时间的推移,火车脱轨事故显著减少。技术进步和基础设施变化导致了脱轨相关事故的显著减少。

  • 强大而多功能:Mann-Kendall 测试对异常值具有鲁棒性,并且不假设特定的数据分布。
  • 广泛适用性:Mann-Kendall 测试在各个领域都有应用,包括气候科学、水文学、环境监测、经济学和其他处理时间序列数据的学科。
  • 简单计算:Mann-Kendall 统计量的计算涉及对数据进行排序,确定成对差异的符号,并对这些符号进行求和。然后使用得到的统计量来评估趋势的存在。

常见问题

本文中显示的媒体不归 Analytics Vidhya 所有,仅由作者自行决定使用。

Leave a Reply

Your email address will not be published. Required fields are marked *