Как определить отсутствующие данные в наборах данных временных рядов

Определение отсутствующих данных в временных рядах

Временные ряды данных, собираемые практически каждую секунду из множества источников, часто подвержены ряду проблем с качеством данных, включая отсутствующие данные.

В контексте последовательных данных отсутствующая информация может возникать по нескольким причинам, в частности, из-за ошибок, возникающих в системах сбора данных (например, неисправности датчиков), ошибок в процессе передачи (например, неисправных сетевых соединений) или ошибок при сборе данных (например, человеческих ошибок при ведении журнала данных). Эти ситуации часто приводят к единичным и явным пропущенным значениям в наших наборах данных, соответствующим небольшим пробелам в потоке собранных данных.

Кроме того, отсутствующая информация может также возникать естественным образом из-за особенностей самой предметной области, создавая более крупные пробелы в данных. Например, характеристика, перестающая собираться в течение определенного периода времени, порождает неявные пропущенные данные.

Независимо от причины, наличие пропущенных данных в наших последовательностях временных рядов крайне вредно для прогнозирования и предиктивного моделирования и может иметь серьезные последствия как для отдельных лиц (например, неправильная оценка риска), так и для бизнес-результатов (например, предвзятые бизнес-решения, потеря дохода и возможностей).

При подготовке данных для моделирования важным шагом является способность определить эти шаблоны неизвестной информации, поскольку они помогут нам выбрать наилучший подход для эффективной обработки данных и улучшения их последовательности, будь то путем корректировки выравнивания, интерполяции данных, импутации данных или в некоторых случаях удаления случаев (т.е. исключение случаев с отсутствующими значениями для используемой в конкретном анализе характеристики).

Поэтому проведение тщательного исследовательского анализа данных и профилирования данных является неотъемлемым условием не только для понимания характеристик данных, но и для принятия обоснованных решений о том, как лучше подготовить данные для анализа.

В этом практическом руководстве мы рассмотрим, как 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' на datetime
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')

Обзор временных рядов

Выходной отчет будет знаком нам, но с улучшенным опытом и новыми сводными статистическими данными для временных рядов:

Немедленно из обзора мы можем получить общее представление о этом наборе данных, рассмотрев представленные сводные статистические данные:

  • Он содержит 14 различных временных рядов, каждый из которых содержит 8674 записанных значений;
  • Набор данных отчетливо отражает 10 лет данных с января 2000 года по декабрь 2010 года;
  • Средний период последовательности времени составляет 11 часов и (почти) 7 минут. Это означает, что в среднем мы делаем измерения каждые 11 часов.

Мы также можем получить общую диаграмму всех серий данных, как в их исходных, так и в масштабированных значениях: мы легко можем понять общую вариацию последовательностей, а также компоненты (NO2, O3, SO2, CO) и характеристики (среднее, первое максимальное значение, первый максимальный час, AQI), которые измеряются.

 

Инспектирование пропущенных данных

 

После общего представления о данных мы можем сосредоточиться на конкретиках каждой временной последовательности.

В последнем релизе ydata-profiling отчёт о профилировании существенно улучшился с помощью специального анализа временных рядов, в частности отчёт о метриках “Временные ряды” и “Анализ пробелов”. Определение трендов и обнаружение пропущенных шаблонов стало намного проще благодаря этим новым функциям, где теперь доступны конкретные сводные статистики и детальные визуализации.

Сразу заметно, что все временные ряды имеют нерегулярный паттерн, где между последовательными измерениями происходят определенные “скачки”. Это указывает на наличие пропущенных данных (“пробелов” пропущенной информации), которые следует более детально изучить. Давайте рассмотрим пример с S02 Mean.

 

   

Изучая детали, представленные в анализе пробелов, мы получаем информативное описание характеристик обнаруженных пробелов. В целом, во временных рядах есть 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} пропущен месяц {month}.')

 

# Год 2000 пропущен месяц 4.
# Год 2000 пропущен месяц 5.
# Год 2000 пропущен месяц 6.
# Год 2000 пропущен месяц 7.
# Год 2000 пропущен месяц 8.
# (...)
# Год 2007 пропущен месяц 5.
# Год 2007 пропущен месяц 6.
# Год 2007 пропущен месяц 7.
# Год 2007 пропущен месяц 8.
# (...)
# Год 2010 пропущен месяц 5.
# Год 2010 пропущен месяц 6.
# Год 2010 пропущен месяц 7.
# Год 2010 пропущен месяц 8.

 

Как и предполагалось, временной ряд имеет большие пропуски информации, которые, кажется, повторяются, даже сезонно: в большинстве лет данные не собирались с мая по август (месяцы с 5 по 8). Это могло произойти по непредсказуемым причинам или известным деловым решениям, например, связанным с сокращением затрат или просто связанным с сезонными вариациями загрязнителей, связанными с погодными условиями, температурой, влажностью и атмосферными условиями.

Исходя из этих выводов, мы можем исследовать причины такого происходящего, определить, что можно сделать, чтобы предотвратить это в будущем, и как обрабатывать имеющиеся данные.

 

Финальные мысли: Заполнить, Удалить, Выровнять?

 

В течение этого руководства мы видели, насколько важно понимать паттерны пропущенных данных во временных рядах и как эффективное профилирование может раскрыть тайны пробелов пропущенной информации. В телекоммуникации, здравоохранении, энергетике и финансах все секторы, собирающие временные ряды данных, столкнутся с пропущенными данными в какой-то момент и должны решить, как лучше всего обрабатывать и извлекать всевозможные знания из них.

С полным анализом данных мы можем принимать обоснованные и эффективные решения, исходя из характеристик имеющихся данных:

  • Пробелы в информации могут быть вызваны случайными событиями, возникающими из-за ошибок при сборе, передаче и обработке данных. Мы можем исправить проблему, чтобы предотвратить ее повторное возникновение, а также интерполировать или заполнить недостающие пробелы, в зависимости от их длительности;
  • Пробелы в информации также могут представлять сезонные или повторяющиеся паттерны. Мы можем выбрать переустройство нашего конвейера для начала сбора недостающей информации или заменить пропущенные пробелы внешней информацией из других распределенных систем. Мы также можем определить, был ли процесс извлечения данных неуспешным (возможно, это был опечатанный запрос со стороны инженеров данных, у нас все бывает!).

Я надеюсь, что этот учебник помог разобраться в том, как определять и характеризовать отсутствующие данные в вашем временном ряде правильно, и я с нетерпением жду, что вы обнаружите в своем собственном анализе пробелов! Оставьте мне комментарий с вопросами или предложениями или найдите меня в сообществе Data-Centric AI! Фабиана Клементе является сооснователем и главным директором по данным в YData, объединяющей понимание данных, причинности и конфиденциальности в качестве основных областей работы и исследований, с миссией сделать данные действенными для организаций. Как энтузиаст данных, она ведет подкаст When Machine Learning Meets Privacy и является приглашенным спикером в подкастах Datacast и Privacy Please. Она также выступает на конференциях, таких как ODSC и PyData.