Valores extremos aplicado ao fluxo de veículos

A teoria dos valores extremos é um ramo da estatística que estuda a distribuição e a probabilidade de eventos raros ou extremos, entre eles, podemos citar como exemplo inundações, terremotos, furacões, etc. Essa teoria é útil para modelar e prever o comportamento de fenômenos que fogem da normalidade e que podem ter consequências graves ou catastróficas. O passo principal nesta consiste e encontrar os valores mais altos de uma série ou de uma distribuição. Esses números são conhecidos como valores extremos.

Essa teoria pode ser aplicada em muitas áreas. A mais comum é a área climática, para prever chuvas mais fortes ou temperaturas mais altas, entretanto, há exemplos aplicados ao esporte, à área financeira, e à demanda de serviços, entre outras.”

A fórmula é essa:

\[ p(x|\xi, \sigma, \mu)\ = \ \left\{ \begin{array}{rcl} \frac{1}{\sigma}(1 + \xi\frac{x - \mu}{\sigma})^{-\frac{1}{\xi}},\ \mbox{se}& \xi \neq 0\\ \frac{1}{\sigma}\exp\left\{-\frac{(x - \mu)}{\sigma}\right\}, \ \mbox{se}& \xi = 0 \end{array}\right. \]

Bonita, mas acredito que não seja interessante explicá-la detalhadamente, o relevante é vermos um exemplo de sua aplicação.

library(tidyverse)
library(POT)
# setwd("D:/OneDrive/DEV/strans_fluxo/files")

obs.: Foi preciso criar um arquivo com a frequência, pois para trabalhar com todos arquivos, exigiria muito da máquina que utilizo. O código abaixo consiste no método utilizado para construir o arquivo com dados que foram utilizados.

# csv_files <- list.files(path = "D:/OneDrive/DEV/strans_fluxo/files/", pattern = "T1113")

# combined_df <- NULL

# # 362 files
# for (file in csv_files) {
#   df <- read.csv(file, fileEncoding = "UTF-8")
#   combined_df <- rbind(combined_df, df)
# }

# combined_df$DataHoraPassagem = lubridate::ymd_hms(combined_df$DataHoraPassagem)
# combined_df$day = lubridate::date(combined_df$DataHoraPassagem)
# combined_df$day|>
#   table()|>
#   as.data.frame()|>
#   write.csv("fluxo_day.csv")

Aplicação ao fluxo de trânsito

Nas cidades, a quantidade de veículos circulando diariamente influencia o funcionamento da cidade (e o humor das pessoas). Uma grande quantidade de veículos significa mais lentidão e maior risco de acidentes. Uma análise descritiva pode ajudar a entender a frequência de veículos nas ruas, mas em grandes quantidades, a situação pode ser apenas a ponta do iceberg para o caos.

# loading the file
fluxo_day = read.csv("fluxo_day.csv")
#chat
fluxo_day|>
ggplot2::ggplot()+
ggplot2::aes(x = X, y = Freq)+
ggplot2::geom_line()+
ggthemes::theme_fivethirtyeight()

A teoria dos valores extremos pode ser aplicada para determinar em quais dias o fluxo de veículos foi muito intenso e qual valor esperar até determinado período. Para isso, o passo determinante é a escolha do limiar, ou seja, o valor em que a distribuição se torna uma distribuição de extremos. Esse processo é feito através de análises gráficas.

Após esse processo, podemos criar nosso modelo que explica os dados extremos.

O limiar foi determinado no valor de 23.700 passagens de véiculo no ponto do radar. O que significa que 12,3% de todos os valores podem ser considerados extremos.

DfGrapif = data.frame(time = c(1:length(fluxo_day$Freq)),
                      obs = fluxo_day$Freq)
diplot(DfGrapif)
abline(v = 23700)

O comando a seguir apresentar os valores dos parâmetros da função

ajuste = fitgpd(fluxo_day$Freq, 23700)
ajuste
Estimator: MLE 
 Deviance: 654.9398 
      AIC: 658.9398 

Varying Threshold: FALSE 

  Threshold Call: 23700 
    Number Above: 47 
Proportion Above: 0.1298 

Estimates
   scale     shape  
625.9130   -0.4748  

Standard Error Type: observed 

Standard Errors
   scale     shape  
131.5742    0.1675  

Asymptotic Variance Covariance
       scale       shape     
scale   1.731e+04  -2.080e+01
shape  -2.080e+01   2.807e-02

Optimization Information
  Convergence: successful 
  Function Evaluations: 56 
  Gradient Evaluations: 23 

Análise da qualidade do modelo

par(mfrow=c(1,2))
pp(ajuste,main="PP, u=0.2");qq(ajuste,main="QQ, u=0.2")

Fluxo esperado

Utilizando a formula \(p = 1 - \frac{1}{t}\), podemos verificar o maior fluxo esperado para um período determinado na escala em uso. No caso em análise, dias. O pacote possui funções que apresentam trabalham a formula e escolhemos calcular entre o intervalo de 10 a 60 dias

O gráfico a seguir mostra o o valores esperados de acordo com os dias de intevalo e o intervalo de confiança.

retornos = retlev(ajuste,npy= ajuste$pat, xlab="dias", ylab="valor")

A tabela a seguir apresenta os valores esperados de acordo com uma sequencia que foi criada de 10 a 60 dias

retornos = retlev(ajuste,npy= ajuste$pat, xlab="dias", ylab="valor")

#create a sequence
days = seq(10,60,5)
fluxo_etv = c()

for (i in days) {
  result <- retornos(i)
  fluxo_etv <- c(fluxo_etv, as.numeric(result))
}

data.frame(Dias = c(days),
          Fluxo = c(fluxo_etv))|>
          knitr::kable()
Dias Fluxo
10 23853.70
15 24057.64
20 24180.29
25 24264.53
30 24327.04
35 24375.83
40 24415.30
45 24448.10
50 24475.92
55 24499.92
60 24520.90

Os dados indicam que em 10 dias o maior valor extremo esperado é de 23.854 veículos. Ocorre um crescimento do valores devido pois a distância de tempos ocasiona um aumento do valor e expanção do intervalo de confiança.

É importante destacar que o valor do limiar pode ser determinado de forma abritária. No exemplo, utilizamos o valor calculado, mas poderiamos usar um valor específico. Esta situção depende da pesquisa e da busca dos resutaldo mais adequados a realidade.