суббота, 30 мая 2020 г.

Временные ряды в R : объект класса ts



В R существует специальный класс объектов для работы с данными, представляющими собой временные ряды - ts (от time series - временной ряд).
Объект класса ts - это двумерный объект, в котором строки - это номер цикла (периода) например, год, месяц, неделя, а столбцы - единицы цикла (периода) например дни, месяцы, недели. Цикл (период) состоит из элементов цикла , количество элементов определяется частотой.


Объект ts состоит из двух элементов - значений временного ряда и соответствующих им временных меток. Кроме того, он также имеет несколько атрибутов, такие как серия, цикл, частота, и интервал времени между каждым последовательным наблюдением.
Для создания объектов этого класса служит одноименная функция - ts(). Основной синтаксис ts приведен ниже: ts(data, start, end, frequency) Здесь: Data: это вектор или матрица, содержащая значения данных; start: Это начальная точка или время первого наблюдения end: Это момент времени последнего наблюдения frequency: количество циклов в периоде start и end функции ts определяют время первого и последнего наблюдения соответственно
Аргументы start и end функции ts определяют время первого и последнего наблюдения соответственно. Эти аргументы могут определяется либо одним целым числом, либо вектором из двух целых чисел. Например, мы можем переопределить наш месячный временной ряд тремя возможными способами и в конце с помощью функции identical подтвердить, что они определяют один и тот же объект ts.

#Определяем время начала вектором двумя целыми числами 

ts1_month <- ts(data = df_month$visit,
              
start = c(2015, 1),
              
frequency = 12)

# Определяем время начала вектором одним целым числом 

ts2_month <- ts(data = df_month$visit,
              
start = 2015,
              
frequency = 12)


# Определяем время конца вектором двумя целыми числами 

ts3_month <- ts(data = df_month$visit,
              
end = c(2019, 12),
              
frequency = 12)


# Сравнивая все три серии с серией
my_ts

identical(ts1_month, ts2_month, ts3_month)

## [1] TRUE

Дальше будем работать с первым вариантом, точнее с первым именем

ts1_month

##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 2015 15262  7055  9901  9046 10894  9441  9860 10550 10214 12929 13640 12119
## 2016 14032  6739  9104  8601  8880  8271  9024  9126  9437 11078 12862 11448
## 2017 12046  5919  8172  7348  7835  7509  7685  8055  8515  9394 10718  9950
## 2018 10819  4997  7639  6338  6831  6725  6423  7173  7080  8082  9448  8239
## 2019  9096  4061  6232  5230  6338  5468  5419  6207  5730  6784  8102  6621

Класс полученного объекта можно определить с помощью функции class

class(ts1_month)

## [1] "ts"


Быстро ознакомится с особенностями временного ряда можно построив график объекта ts с помощью функции plot

plot.ts(ts1_month,
       
main = "Посетители магазина одежды по месяцам 2015-2019 годы",
       
xlab = "Месяц",       
       
ylab = "Количество посетителей",
       
ylim = c(3000, 16000)
)






Также можно проверить принадлежность нашего объекта к классу ts и вывести его длину

# Проверяем класс объекта

is.ts(ts1_month

## [1] TRUE

# Получаем количество наблюдений

length(ts1_month

## [1] 60

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

head(cycle(ts1_month), 24)

##  [1]  1  2  3  4  5  6  7  8  9 10 11 12  1  2  3  4  5  6  7  8  9 10 11 12

head(time(ts1_month), 12)

##  [1] 2015.000 2015.083 2015.167 2015.250 2015.333 2015.417 2015.500 2015.583
##  [9] 2015.667 2015.750 2015.833 2015.917

При выводе временных меток с помощью функции time можно увидеть временной шаг между наблюдениями, он равен 1/частота, в случае месячной частоты этот шаг равен 1/12 ~ 0.083 при квартальной частоте этот шаг равен 0.25. У первого значения в цикле временная метка равна нулю.
Также с помощью функций frequency и deltat можно вывести частоту и величину временного шага

frequency(ts1_month)

## [1] 12

deltat(ts1_month)

## [1] 0.08333333

С помощью функции ts_info можно получить краткое описание объекта

ts_info(ts1_month)

##  The ts1_month series is a ts object with 1 variable and 60 observations
##  Frequency: 12
##  Start time: 2015 1
##  End time: 2019 12

С помощью функции ts сделаем дневной и квартальный временные ряды

ts_day <- ts(data = df_day$visit,
                start = c(2015, 1),
                frequency = 365.25)


ts_qr <- ts(data = df_qr$visit,
             start = c(2015, 1),
             frequency = 4)


У дневного временного ряда из-за високосного года частота не 365, а 365.25
Выведем графики этих рядов

plot.ts(ts_day,
        main = "Посетители магазина одежды по дням 2015-2019",
        xlab = "День",
        ylab = "Количество посетителей")


plot.ts(ts_qr,
        main = "Посетители магазина одежды по кварталам 2015-2019",
        xlab = "Квартал",
        ylab = "Количество посетителей")



Далее рассмотрим функции для манипулирования данными ts объектов.

Функция window
Функция window предназначена для выделения данных в определенном временном диапазоне. Основными аргументы функции window являются start и end, которые определяют начало и конец рассматриваемого периода. Например, извлечь количество посетителей по месяцам за четыре года месячного набора данных можно таким образом :

window(ts1_month, start = c(2015,1), end = c(2018, 12))

##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 2015 15262  7055  9901  9046 10894  9441  9860 10550 10214 12929 13640 12119
## 2016 14032  6739  9104  8601  8880  8271  9024  9126  9437 11078 12862 11448
## 2017 12046  5919  8172  7348  7835  7509  7685  8055  8515  9394 10718  9950
## 2018 10819  4997  7639  6338  6831  6725  6423  7173  7080  8082  9448  8239

А с помощью такого выражения вывести значения марта по годам

window(ts1_month, start = c(2015,3),frequency = 1)

## Time Series:
## Start = 2015.167
## End = 2019.167
## Frequency = 1
## [1] 9901 9104 8172 7639 6232

Агрегирование ts объектов

Функция aggregate из пакета stats является обобщенной функцией агрегирования таких объектов как ts и data.frame . В контексте объекта ts она дает возможность свернуть частоты серии к более низкому частота (например, от месяца до квартального). Например, c ее помощью из месячного получим квартальный временной ряд и сравним его с ранее созданным

ts_qr_new <- aggregate(ts1_month, nfrequency = 4, FUN = "sum")

identical(ts_qr, ts_qr_new)

## [1] TRUE












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

Отправить комментарий