Прогнозирование данных временных рядов в Oracle / SQL

#sql #oracle

#sql #Oracle

Вопрос:

Есть ли способ, которым мы можем сгенерировать прогнозирование временных рядов для набора данных, используя аналитические функции Oracle? Как мы выполняем экстраполяцию в SQL / ORACLE.

Ниже приведены мои потребности

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

 Cust_id  Year  Revnue
1        2016  679862
1        2017  705365
1        2018  ?
2        2016  51074
2        2017  50611
2        2018  ?
3        2016  190706
3        2017  90393
3        2018  ?
4        2016  31649
4        2017  19566
4        2018  ?
  

Комментарии:

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

2. @Tim Biegeleisen просто интересуюсь доступными вариантами.. Лично я предпочитаю линейную регрессию с полиномиальной подгонкой

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

Ответ №1:

Вы можете создать простой прогноз, используя функции линейной регрессии REGR.

 --Ordinary least squares forecast for each customer for the next year.
select
    cust_id,
    max(year)  1 forecast_year,
    -- y = mx b
    regr_slope(revenue, year)
        * (max(year)   1)
          regr_intercept(revenue, year) forecasted_revenue
from customer_data
group by cust_id;

CUST_ID   FORECAST_YEAR   FORECASTED_REVENUE
-------   -------------   ------------------
1                  2018               730868
2                  2018                50148
4                  2018                 7483
3                  2018                -9920
  

Ниже приведена примерная схема. Или вы можете использовать этот SQLFiddle.

 create table customer_data
(
    cust_id number,
    year number,
    revenue number
);

insert into customer_data
select 1, 2016, 679862 from dual union all
select 1, 2017, 705365 from dual union all
select 2, 2016, 51074  from dual union all
select 2, 2017, 50611  from dual union all
select 3, 2016, 190706 from dual union all
select 3, 2017, 90393  from dual union all
select 4, 2016, 31649  from dual union all
select 4, 2017, 19566  from dual;
  

REGR Функция имеет дело с парами чисел, она не понимает бизнес-правил, таких как «доход не может быть ниже 0». Если вы хотите ограничить прогнозы, чтобы они всегда оставались равными 0 или выше, может помочь CASE выражение:

 --Forecasted revenue, with minimum forecast of 0.
select cust_id, forecast_year,
    case when forecasted_revenue < 0 then 0 else forecasted_revenue end forecasted_revenue
from
(
    --Ordinary least squares forecast for each customer for the next year.
    select
        cust_id,
        max(year)  1 forecast_year,
        -- y = mx b
        regr_slope(revenue, year)
            * (max(year)   1)
              regr_intercept(revenue, year) forecasted_revenue
    from customer_data
    group by cust_id
);

CUST_ID   FORECAST_YEAR   FORECASTED_REVENUE
-------   -------------   ------------------
1                  2018               730868
2                  2018                50148
4                  2018                 7483
3                  2018                    0
  

Комментарии:

1. Спасибо, есть ли у нас в Oracle функция полиномиальной подгонки? например, подгонка кривой со степенью 1 (линейный регресс)?? для повышения точности??

2. @sunnybabau Насколько я знаю, нет. Пакет DBMS_STAT_FUNCS имеет функции для определения соответствия выборки, но он не прогнозирует. Возможно, в API интеллектуального анализа данных есть что-то, о чем я не знаю. Я не очень разбираюсь в статистике. В двух случаях, когда я видел профессиональное прогнозирование, использовался только описанный выше подход. (Похоже, что большинство прогнозов — это обработка исключений на 99%, формулы на 1%.)

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

4. @sunnybabau Смотрите мой отредактированный ответ. Я не думаю, что ABS было бы хорошей идеей, но ограничение ответа минимальным значением 0 могло бы сработать лучше. Учитывая мой ограниченный опыт прогнозирования, уравнения были самой простой частью. Большая часть усилий уходит на управление всеми исключениями.

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