Простой алгоритм онлайн-определения выбросов общего временного ряда

88

Я работаю с большим количеством временных рядов. Эти временные ряды в основном представляют собой измерения сети, проводимые каждые 10 минут, и некоторые из них являются периодическими (т. Е. Пропускная способность), а некоторые другие - нет (т. Е. Объем трафика маршрутизации).

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

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

double outlier_detection (double * vector, double value);

где вектор - это массив значений типа double, содержащий исторические данные, а возвращаемое значение - это показатель аномалии для новой выборки «значение».

Джанлука
источник
1
Просто для ясности, вот оригинальный вопрос о SO: stackoverflow.com/questions/3390458/…
Мэтт Паркер
1
Я думаю, что мы должны поощрять постеров размещать ссылки как часть вопроса, если они разместили этот же вопрос на другом сайте SE.
да, ты совершенно прав. В следующий раз я упомяну, что сообщение является перекрестным.
Джанлука
Я также предлагаю вам ознакомиться с другими связанными ссылками в правой части страницы. Это популярный вопрос, и он уже задавался различными вопросами ранее. Если они не являются удовлетворительными, лучше обновить ваш вопрос о специфике вашей ситуации.
Энди Вт
Хороший улов, Энди! Давайте объединим этот вопрос с другим.
whuber

Ответы:

75

Вот простая функция R, которая найдет выбросы временных рядов (и при желании отобразит их на графике). Он будет обрабатывать сезонные и несезонные временные ряды. Основная идея состоит в том, чтобы найти надежные оценки трендовых и сезонных компонентов и вычесть их. Тогда найдите выбросы в остатках. Тест на остаточные выбросы такой же, как и для стандартного коробчатого графика - точки, превышающие 1,5 IQR выше или ниже верхнего и нижнего квартилей, предполагаются выбросами. Количество IQR выше / ниже этих пороговых значений возвращается как «балл» выброса. Таким образом, оценка может быть любым положительным числом, и будет равным нулю для не-выбросов.

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

tsoutliers <- function(x,plot=FALSE)
{
    x <- as.ts(x)
    if(frequency(x)>1)
        resid <- stl(x,s.window="periodic",robust=TRUE)$time.series[,3]
    else
    {
        tt <- 1:length(x)
        resid <- residuals(loess(x ~ tt))
    }
    resid.q <- quantile(resid,prob=c(0.25,0.75))
    iqr <- diff(resid.q)
    limits <- resid.q + 1.5*iqr*c(-1,1)
    score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
    if(plot)
    {
        plot(x)
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}
Роб Хиндман
источник
+1 от меня, отлично. Итак,> 1,5 X межквартильный диапазон является консенсусным определением выбросов для зависящих от времени рядов? Было бы неплохо иметь независимую от масштаба ссылку.
Дуг
Тест на выбросы относится к остаткам, поэтому, надеюсь, зависимость от времени будет небольшой. Я не знаю о консенсусе, но коробочные участки часто используются для обнаружения выбросов и, кажется, работают достаточно хорошо. Есть лучшие методы, если кто-то хочет сделать функцию немного более изящной.
Роб Хиндман
Очень благодарю за помощь, я очень ценю. Я сейчас очень занят на работе, но я собираюсь как можно скорее опробовать такой подход, как ваш, и я вернусь с последними соображениями по этому вопросу. Одна только мысль: в вашей функции, из того, что я вижу, я должен вручную указать частоту временного ряда (при его построении), а компонент сезонности рассматривается только тогда, когда частота больше 1. Существует ли надежный способ бороться с этим автоматически?
Джанлука
1
Да, я предположил, что частота известна и указана. Существуют методы для автоматической оценки частоты, но это значительно усложнит функцию. Если вам нужно оценить частоту, попробуйте задать отдельный вопрос об этом - и я, вероятно, предоставлю ответ! Но это требует больше места, чем у меня есть в комментарии.
Роб Хиндман
2
@ Марчин, я рекомендую попробовать самому. Может быть, вставить свое решение на gist.github.com и опубликовать SO вопрос, когда вы закончите, чтобы другие проверили вашу работу?
Кен Уильямс
27

У хорошего решения будет несколько компонентов, в том числе:

  • Используйте устойчивое, подвижное окно, гладкое, чтобы удалить нестационарность.

  • Повторно выразите исходные данные так, чтобы остатки по отношению к сглаживанию были приблизительно симметрично распределены. Учитывая характер ваших данных, вполне вероятно, что их квадратные корни или логарифмы дадут симметричные остатки.

  • Примените методы контрольной диаграммы или, по крайней мере, мышление контрольной диаграммы к остаткам.

Что касается последнего, то анализ контрольной диаграммы показывает, что «обычные» пороги, такие как 2 SD или 1,5-кратное IQR за пределами квартилей, работают плохо, потому что они запускают слишком много ложных неконтролируемых сигналов. Люди обычно используют 3 SD в контрольной диаграмме, поэтому 2,5 (или даже 3) раза IQR вне квартилей будет хорошей отправной точкой.

Я более или менее обрисовал природу решения Роба Хиндмана, добавив к нему два основных момента: потенциальную необходимость повторного выражения данных и мудрость быть более консервативным в том, чтобы сигнализировать о выбросах. Я не уверен, что Лесс хорош для онлайн-детектора, потому что он плохо работает на конечных точках. Вместо этого вы могли бы использовать что-то столь же простое, как движущийся медианный фильтр (как в устойчивом сглаживании Тьюки). Если выбросы не входят в всплески, вы можете использовать узкое окно (возможно, 5 точек данных, которые будут разбиты только при всплеске из 3 или более выбросов в группе из 5).

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

Whuber
источник
3
Это необычный ответ для практического анализа. Никогда бы не подумал, что нужно попробовать 3 IQR за пределами квартилей.
Джон Робертсон
3
@John, 1,5 IQR - это оригинальная рекомендация Тьюки для самых длинных усов на боксплоте, а 3 IQR - его рекомендация отмечать точки как «далеко идущие» (риф на популярной фразе 60-х). Это встроено во многие алгоритмы boxplot. Рекомендация анализируется теоретически в Hoaglin, Mosteller, & Tukey, Понимание надежного и разведочного анализа данных.
whuber
Это подтверждает данные временного ряда, которые я пытался проанализировать. Окно среднее, а также окно стандартных отклонений. ((x - avg) / sd)> 3 - это точки, которые я хочу отметить как выбросы. Ну, по крайней мере, предупреждаю как выбросы, я отмечаю все, что выше 10 sd, как крайние ошибки. Проблема, с которой я сталкиваюсь, - какова идеальная длина окна? Я играю с чем-нибудь между 4-8 точками данных.
Джош Пик
1
@Neo Ваш лучший выбор может состоять в том, чтобы поэкспериментировать с подмножеством ваших данных и подтвердить свои выводы тестами по оставшейся части. Вы также можете провести более формальную перекрестную проверку (но требуется особая осторожность с данными временных рядов из-за взаимозависимости всех значений).
whuber
17

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


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

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

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

Предстоит еще кое-что настроить : насколько сильно отклонение от объема данных следует считать отдаленным и как далеко назад следует смотреть во времени? Давайте оставим их в качестве параметров для экспериментов. Вот Rреализация, примененная к данным (с для эмуляции данных) с соответствующими значениями :п = 1150 гx=(1,2,,n)n=1150y

# Parameters to tune to the circumstances:
window <- 30
threshold <- 5

# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z

# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)

Применительно к набору данных, подобному красной кривой, показанной в вопросе, он дает такой результат:

участок

Данные показаны красным, 30-дневное окно средних пороговых значений + 5 * MAD серым цветом, а выбросы - просто значения данных над серой кривой - черным.

(Порог можно рассчитать только начиная с конца начального окна. Для всех данных в этом начальном окне используется первый порог: именно поэтому серая кривая является плоской между x = 0 и x = 30.)

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

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


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

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline
Whuber
источник
Это действительно интересное решение, и я ценю, что могу реализовать его без использования R (просто используя простой JavaScript в веб-приложении). Спасибо!
hgoebl
15

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

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

АРС
источник
5

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

  1. Сначала установите базовые «нормальные» схемы трафика за год на основе ручного анализа исторических данных, который учитывает время дня, будний день или выходные, месяц года и т. Д.

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

Вы также можете просмотреть литературу по статистическому контролю процесса для некоторых идей.


источник
1
Да, это именно то, что я делаю: до сих пор я вручную разбивал сигнал на периоды, чтобы для каждого из них я мог определить доверительный интервал, в котором сигнал должен быть стационарным, и поэтому я могу использовать стандартные методы, такие как как стандартное отклонение ... Реальная проблема в том, что я не могу определить ожидаемую схему для всех сигналов, которые я должен анализировать, и поэтому я ищу что-то более интеллектуальное.
Джанлука
Вот одна идея: Шаг 1: Реализуйте и оцените общую модель временных рядов на разовой основе на основе исторических данных. Это можно сделать в автономном режиме. Шаг 2: Используйте полученную модель для обнаружения выбросов. Шаг 3: На некоторой частоте (возможно, каждый месяц?) Повторно откалибруйте модель временного ряда (это можно сделать в автономном режиме), чтобы обнаружение выбросов на шаге 2 не выходило за рамки текущих моделей трафика. Будет ли это работать для вашего контекста?
Да, это может сработать. Я думал о похожем подходе (пересчет базового показателя каждую неделю, который может потребовать много ресурсов процессора, если у вас есть сотни одномерных временных рядов для анализа). Кстати, действительно сложный вопрос: «Каков наилучший алгоритм в стиле черного ящика для моделирования полностью общего сигнала с учетом шума, оценки тренда и сезонности?». AFAIK, каждый литературный подход требует очень сложной фазы «настройки параметров», и единственный единственный автоматический метод, который я нашел, - это модель ARIMA от Hyndman ( robjhyndman.com/software/forecast ). Я что-то пропустил?
Джанлука
Пожалуйста, имейте в виду, что я не поленился исследовать эти параметры, суть в том, что эти значения должны быть установлены в соответствии с ожидаемой схемой сигнала, и в моем сценарии я не могу делать никаких предположений.
Джанлука
Модели ARIMA - это классические модели временных рядов, которые можно использовать для подбора данных временных рядов. Я бы посоветовал вам изучить применение моделей ARIMA. Вы можете подождать, пока Роб будет в сети, и, возможно, он поделится некоторыми идеями.
5

Сезонно скорректируйте данные так, чтобы обычный день выглядел ближе к плоскости. Вы можете взять сегодняшнюю выборку в 17:00 и вычесть или разделить среднее значение за предыдущие 30 дней в 17:00. Затем посмотрите прошлые N стандартных отклонений (измеренных с использованием предварительно откорректированных данных) на наличие выбросов. Это можно сделать отдельно для еженедельных и ежедневных «сезонов».

Джеймс Рот
источник
Опять же, это работает довольно хорошо, если предполагается, что сигнал имеет такую ​​сезонность, но если я использую совершенно другой временной ряд (т.е. среднее время прохождения сигнала TCP по времени), этот метод не будет работать (так как он был бы лучше обрабатывать это с простым глобальным средним и стандартным отклонением, используя скользящее окно, содержащее исторические данные).
Джанлука
1
Если вы не желаете реализовать общую модель временных рядов (которая имеет свои недостатки в плане задержки и т. Д.), Я пессимистично настроен, что вы найдете общую реализацию, которая в то же время достаточно проста для работы со всеми видами временных рядов.
Другой комментарий: я знаю, что хорошим ответом может быть «чтобы вы могли оценить периодичность сигнала и решить, какой алгоритм использовать в соответствии с ним», но я не нашел действительно хорошего решения этой другой проблемы (я играл немного со спектральным анализом с использованием DFT и временным анализом с использованием функции автокорреляции, но мои временные ряды содержат много шума, и такие методы дают некоторые сумасшедшие результаты самых больших моментов времени)
gianluca
Комментарий к вашему последнему комментарию: вот почему я ищу более общий подход, но мне нужен своего рода «черный ящик», потому что я не могу делать никаких предположений об анализируемом сигнале, и поэтому я не могу создать "лучший набор параметров для алгоритма обучения".
Джанлука
@gianluca Как вы уже поняли, базовая структура ARIMA может маскировать аномалию. Неправильная формулировка возможных причинных переменных, таких как время суток, день недели, влияние праздников и т. Д., Также может маскировать аномалию. Ответ довольно ясен, вам нужно иметь хорошее уравнение для эффективного обнаружения аномалий. Цитируя Бэкона: «Для тех, кто знает пути Природы, легче заметить ее отклонения, и, с другой стороны, тот, кто знает ее отклонения, будет более точно описывать ее пути».
IrishStat
3

Альтернативой подходу, изложенному Робом Хиндманом, было бы использование прогнозирования Холта-Винтерса . Полосы доверия, полученные по Холт-Уинтерсу, могут быть использованы для обнаружения выбросов. Вот документ, который описывает, как использовать Holt-Winters для «Обнаружения аберрантного поведения во временных рядах для мониторинга сети». Реализация RRDTool может быть найдена здесь .

Питер Преттенхофер
источник
2

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

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

Майкл Черник
источник
2
Не могли бы вы объяснить, как это решение будет определять "локальные нарушения"? Представление проработанного примера было бы чрезвычайно полезно. (Если честно, я предлагаю вам сделать это, потому что, выполняя такое упражнение, я полагаю, вы обнаружите, что ваше предложение неэффективно для обнаружения выбросов. Но я могу ошибаться ...)
whuber
1
@whuber Спектральный анализ покажет, где находятся все пики. Следующим шагом будет согласование модели серии yime с использованием синусоидальных и косинусных членов с частотами, определенными из спектрального анализа, и амплитудами, оцененными по данным. Если неровности означают пики с очень высокими амплитудами, то я думаю, что порог по амплитуде будет уместным. Если локальные неровности означают, что в течение периода амплитуда иногда значительно больше, чем в других, то ряд не является стационарным и спектральный анализ не будет оценен.
Майкл Черник
1
Я не следую за выводом об отсутствии стационарности. Например, сумма регулярной синусоидальной формы волны и отмеченного точечного пуассоновского процесса будет стационарной, но она не будет демонстрировать какую-либо периодичность, которую вы ищете. Тем не менее, вы обнаружите некоторые сильные пики на периодограмме, но они не скажут вам ничего, имеющего отношение к нерегулярным пикам данных, вводимым компонентом процесса Пуассона.
whuber
1
Стационарный временной ряд имеет постоянное среднее значение. Если пик для периодического компонента может изменяться со временем, он может определить среднее значение, изменяющееся со временем, и, следовательно, поля будут нестационарными.
Майкл Черник
2

Поскольку это данные временных рядов, простой экспоненциальный фильтр http://en.wikipedia.org/wiki/Exponential_smoothing сгладит данные. Это очень хороший фильтр, так как вам не нужно накапливать старые точки данных. Сравните каждое вновь сглаженное значение данных с его несглаженным значением. Как только отклонение превысит определенный заранее заданный порог (в зависимости от того, что, по вашему мнению, является выбросом в ваших данных), ваш выброс может быть легко обнаружен.

В CI будет делать следующее для 16-битной выборки в реальном времени (я думаю, что это можно найти где-то здесь <Объяснение - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-приближение к фильтру скользящего среднего >)

#define BITS2 2     //< This is roughly = log2( 1 / alpha ), depending on how smooth you want your data to be

short Simple_Exp_Filter(int new_sample) 
{static int filtered_sample = 0;
long local_sample = sample << 16; /*We assume it is a 16 bit sample */
filtered_sample += (local_sample - filtered_sample) >> BITS2;   
return (short) ((filtered_sample+0x8000) >> 16); //< Round by adding .5 and truncating.   
}


int main()
{
newly_arrived = function_receive_new_sample();
filtered_sample = Simple_Exp_Filter(newly_arrived);
if (abs(newly_arrived - filtered_sample)/newly_arrived > THRESHOLD)
    {
    //AN OUTLIER HAS BEEN FOUND
    }
 return 0;   
}
AyodeleO
источник
1

Вы можете использовать стандартное отклонение последних N измерений (вы должны выбрать подходящее N). Хорошим показателем аномалии будет количество стандартных отклонений измерения от скользящей средней.

Карлос Аккиоли
источник
Спасибо за ваш ответ, но что, если сигнал демонстрирует высокую сезонность (т. Е. Многие сетевые измерения характеризуются дневным и недельным графиком в одно и то же время, например, ночь по сравнению с днем ​​или выходные, по сравнению с рабочими днями)? Подход, основанный на стандартном отклонении, не будет работать в этом случае.
Джанлука
Например, если я получаю новую выборку каждые 10 минут, и я делаю обнаружение выбросов в полосе пропускания сети в компании, в основном в 18:00 эта мера упадет (это вполне ожидаемый нормальный шаблон), и стандартное отклонение, вычисленное по скользящему окну, потерпит неудачу (потому что оно наверняка вызовет предупреждение). В то же время, если показатель падает в 16:00 (отклоняясь от обычной базовой линии), это настоящий выброс.
Джанлука
1

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

Недостатком является то, что вам действительно нужно собрать год или около того данных, чтобы их было достаточно, чтобы stddev начал обретать смысл.

Александар Иванишевич
источник
Спасибо, это именно то, чего я пытался избежать (имея много образцов в качестве базовой линии), потому что я хотел бы действительно реактивный подход (например, онлайн-обнаружение, возможно, «грязный», после 1-2 недель базовой линии)
Джанлука
0

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

Тренировка

  • Соберите как можно больше сэмплов в памяти
  • Удалите очевидные выбросы, используя стандартное отклонение для каждого атрибута
  • Рассчитать и сохранить матрицу корреляции, а также среднее значение каждого атрибута
  • Рассчитайте и сохраните расстояния Махаланобиса для всех ваших образцов

Расчет "постороннего":

Для единичного образца, из которого вы хотите узнать его «внешность»:

Это будет ваш показатель выбросов: 100% - это экстремальный выброс.


PS. При расчете расстояния Махаланобиса используйте матрицу корреляции, а не ковариационную матрицу. Это более надежно, если выборочные измерения различаются по единице и количеству.

Ицен де Бур
источник
0

В случае, когда нужно быстро вычислить выбросы, можно использовать идею Роба Хиндмана и Махито Сугиямы ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), функция qsp) для вычисления выбросы следующим образом:

library(spoutlier)
rapidtsoutliers <- function(x,plot=FALSE,seed=123)
{
    set.seed(seed)
    x <- as.numeric(x)
    tt <- 1:length(x)
    qspscore <- qsp(x)
    limit <- quantile(qspscore,prob=c(0.95))
    score <- pmax((qspscore - limit),0)
    if(plot)
    {
        plot(x,type="l")
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}
orgesleka
источник
0

обнаружение аномалий требует построения уравнения, которое описывает ожидание. Обнаружение вмешательства доступно как в не причинно-следственной, так и в причинно-следственной связи. Если у вас есть ряд предикторов, таких как цена, то все может стать немного сложнее. Другие ответы здесь, по-видимому, не учитывают присваиваемую причину, связанную с указанными пользователем рядами предикторов, такими как цена, и поэтому могут быть ошибочными. Проданное количество может хорошо зависеть от цены, возможно, предыдущих цен и, возможно, количества, проданного в прошлом. Основа для обнаружения аномалий (импульсы, сезонные импульсы, сдвиги уровней и местные временные тренды) находится в https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf

IrishStat
источник
Ссылка не работает, не могли бы вы исправить это. Спасибо
Панкадж Джоши
сделано ..................
IrishStat