Press "Enter" to skip to content

如何识别时间序列数据集中的缺失数据

时间序列数据,几乎每秒从多个来源收集,经常遭受几个数据质量问题的困扰,其中包括缺失数据。

在连续数据的背景下,缺失信息可能由于几个原因而产生,即在采集系统中发生的错误(例如故障传感器),在传输过程中发生的错误(例如故障的网络连接),或在数据收集过程中发生的错误(例如数据记录过程中的人为错误)。这些情况通常会在我们的数据集中生成零星和明确的缺失值,对应于收集数据流中的小间隙。

此外,由于领域本身的特点,缺失信息也可能自然而然地产生,从而在数据中创建更大的间隙。例如,某个特征在一段时间内停止收集,生成非明确的缺失数据。

无论其潜在原因如何,时间序列中存在缺失数据对于预测和预测建模来说都是极具偏见的,可能对个人(例如错误的风险评估)和业务结果(例如有偏见的业务决策,收入和机会的损失)产生严重后果。

因此,在为建模方法准备数据时,一个重要的步骤是能够识别这些未知信息的模式,因为它们将帮助我们决定处理数据的最佳方法,以提高数据的一致性和效率,可以通过某种形式的对齐校正、数据插值、数据填充,或在某些情况下进行逐案删除(即,在特定分析中使用的特征的缺失值的情况下省略特征)。

出于这个原因,进行全面的探索性数据分析和数据概述是必不可少的,不仅可以理解数据的特征,还可以在如何最好地准备数据进行分析上做出明智的决策。

在这个实践教程中,我们将探索如何使用ydata-profiling中最新版本的功能解决这些问题。我们将使用Kaggle上提供的美国污染数据集(许可证DbCL v1.0),该数据集详细描述了美国各州的NO2、O3、SO2和CO污染物的信息。

 

实践教程:对美国污染数据集进行概述

 

为了开始我们的教程,我们首先需要安装最新版本的ydata-profiling:

pip install ydata-profiling==4.5.1

 

然后,我们可以加载数据,删除不必要的特征,并专注于我们想要调查的内容。对于这个示例,我们将重点关注亚利桑那州马里科帕县斯科茨代尔站的空气污染物测量的特定行为:

import pandas as pd
 
data = pd.read_csv("data/pollution_us_2000_2016.csv")
data = data.drop('Unnamed: 0', axis=1) # 删除不必要的索引
 
# 选择亚利桑那州马里科帕县斯科茨代尔站的数据(Site Num: 3003)
data_scottsdale = data[data['Site Num'] == 3003].reset_index(drop=True)

 

现在,我们准备开始对数据集进行概述!请记住,为了使用时间序列概述,我们需要传递参数tsmode=True,这样ydata-profiling可以识别出时间相关的特征:

# 将'Data Local'更改为日期时间格式
data_scottsdale['Date Local'] = pd.to_datetime(data_scottsdale['Date Local'])
 
# 创建概述报告
profile_scottsdale = ProfileReport(data_scottsdale, tsmode=True, sortby="Date Local")
profile_scottsdale.to_file('profile_scottsdale.html')

 

时间序列概述

 

输出报告将与我们已知的内容相似,但具有改进的体验和针对时间序列数据的新的摘要统计信息:

  如何识别时间序列数据集中的缺失数据 四海 第1张  

从概述中,我们可以立即对数据集有一个总体了解,通过查看呈现的摘要统计信息:

  • 它包含14个不同的时间序列,每个序列有8674个记录值;
  • 数据集报告了从2000年1月到2010年12月的10年数据;
  • 时间序列的平均时间间隔为11小时和(几乎)7分钟。这意味着平均而言,我们每11小时有一次测量。

我们还可以获得数据中所有系列的概览图,无论是原始值还是缩放值:我们可以轻松把握序列的总体变化情况,以及正在测量的组成部分(NO2,O3,SO2,CO)和特征(平均值,第一最大值,第一最大小时,AQI)。

 

检查缺失数据

 

在对数据有一个整体了解之后,我们可以关注每个时间序列的具体情况。

在ydata-profiling的最新版本中,针对时间序列数据的分析报告得到了大幅改进,即“时间序列”和“间隙分析”指标的报告。这些新功能极大地方便了趋势和缺失模式的识别,现在可以提供具体的摘要统计和详细的可视化。

一个立即显眼的特点是所有时间序列呈现的不稳定模式,在连续测量之间似乎发生了某些“跳跃”。这表明存在缺失数据(缺失信息的“间隙”),应该更仔细地研究。以“S02平均值”为例,让我们来看看。

  如何识别时间序列数据集中的缺失数据 四海 第2张

  如何识别时间序列数据集中的缺失数据 四海 第3张  

通过查看间隙分析中给出的详细信息,我们可以对已识别的间隙的特征有一个了解。总体上,时间序列中有25个间隙,最短间隔为4天,最长为32周,平均为10周。

从所呈现的可视化结果中,我们可以看到较“随机”的较小间隙被表示为较细的条纹,而较大的间隙似乎遵循着重复的模式。这表明我们的数据集中似乎存在两种不同的缺失数据模式。

较小的间隙对应于生成缺失数据的零星事件,很可能是由于采集过程中出现的错误导致的,通常可以很容易地进行插值或从数据集中删除。相反,较大的间隙更加复杂,需要更详细地分析,因为它们可能揭示出需要更彻底解决的潜在模式。

在我们的例子中,如果我们要调查较大的间隙,实际上我们会发现它们反映了一个季节性模式:

df = data_scottsdale.copy()
for year in df["Date Local"].dt.year.unique():
    for month in range(1,13):
        if ((df["Date Local"].dt.year == year) & (df["Date Local"].dt.month ==month)).sum() == 0:
            print(f'Year {year} is missing month {month}.')

 

# Year 2000 is missing month 4.
# Year 2000 is missing month 5.
# Year 2000 is missing month 6.
# Year 2000 is missing month 7.
# Year 2000 is missing month 8.
# (...)
# Year 2007 is missing month 5.
# Year 2007 is missing month 6.
# Year 2007 is missing month 7.
# Year 2007 is missing month 8.
# (...)
# Year 2010 is missing month 5.
# Year 2010 is missing month 6.
# Year 2010 is missing month 7.
# Year 2010 is missing month 8.

 

正如我们所怀疑的,该时间序列呈现出一些大的信息间隙,似乎是重复的,甚至是季节性的:在大多数年份中,从5月到8月(第5到8个月)之间没有收集到数据。这可能是由于不可预测的原因,或者已知的业务决策,例如削减成本,或者与天气模式、温度、湿度和大气条件相关的污染物的季节性变化有关。

基于这些发现,我们可以进一步调查为什么会发生这种情况,如果需要防止将来发生类似的情况,以及如何处理当前的数据。

 

最后的思考:插值、删除、重新调整?

 

在本教程中,我们看到了理解时间序列中缺失数据模式的重要性,以及有效的分析报告如何揭示缺失信息间隙背后的秘密。从电信、医疗保健、能源和金融等各个行业收集时间序列数据的所有部门都将在某个时候面临缺失数据,并需要决定处理和从中提取所有可能的知识的最佳方式。

通过全面的数据分析,我们可以根据手头的数据特征做出明智高效的决策:

  • 信息缺失可能是由于获取、传输和收集过程中的错误导致的间断性事件。我们可以修复问题,防止再次发生,并根据间隔的长度进行插值或填补缺失的间隙;
  • 信息缺失也可能表示季节性或重复的模式。我们可以选择重新构建我们的流程以开始收集缺失的信息,或者用其他分布式系统的外部信息替换缺失的间隙。我们还可以确定检索过程是否失败(也许是数据工程方面的输入错误,我们都会有那样的日子!)。

希望本教程能帮助您正确地识别和描述时间序列数据中的缺失数据,并期待看到您在自己的间隙分析中发现的内容!如有任何问题或建议,请在评论中给我留言,或在Data-Centric AI社区找到我!Fabiana Clemente是YData的联合创始人兼首席数据官,她的主要工作和研究领域涵盖数据理解、因果关系和隐私,并致力于使数据对组织产生实际影响。作为一名热情的数据从业者,她主持了《当机器学习遇见隐私》播客,并是《Datacast》和《Privacy Please》播客的嘉宾演讲者。她还在ODSC和PyData等会议上发表演讲。

Leave a Reply

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