Parte 2: Gerando gráficos de forecast utilizando R para previsão de medalhas nas Olimpíadas

Na parte 1 do post, mostramos como capturar dados das medalhas conquistadas na história das Olimpíadas utilizando o Power Query. Agora, vamos criar análises a partir destes dados utilizando o R. Para quem não conhece, o R é uma ferramenta que permite criar visualizações gráficas utilizando técnicas estatísticas e é um dos softwares mais populares na área de data science.

A nossa ideia é tentar prever, utilizando os dados históricos do total de medalhas conquistadas por cada país e algoritmos estatísticos de forecast, quantas medalhas os países deverão conquistar nos próximos Jogos Olímpicos. Será realizada uma análise básica apenas para entendimento do que é necessário para utilizar as funções de forecast do R – não serão feitos ajustes de tendência, sazonalidade, testes de estacionariedade, etc, ou seja, não será feita uma validação estatística da série.

Leitura dos dados e criação de subsets

Inicialmente vamos indicar o nosso diretório de trabalho e ler o arquivo CSV que possui os dados das medalhas conquistadas pelos países nas Olimpíadas, que organizamos na parte 1 do post, atribuindo ele a uma variável chamada “olimpiadas”. Em seguida vamos utilizar o comando head() para consultar os dados que a variável possui.

setwd("C:/") #diretório de trabalho
olimpiadas <- read.csv(file="MedalhasAtualizado.csv",head=TRUE,sep=";") #lendo arquivo CSV
head(olimpiadas) #verificando as primeiras linhas
r_head_olimpiadas

Resultado do comando head(olimpiadas)

Como podemos perceber, o nosso arquivo possui dados de medalhas conquistadas por todos os países em todas as Olimpíadas. Para criarmos gráficos separados com a previsão de medalhas para cada país, vamos utilizar o conceito de subset do R, ou seja, nós vamos criar três subconjuntos com dados de medalhas para três países: Estados Unidos, China e Brasil. Como as Olimpíadas não foram realizadas em 1940 e 1944 devido à Segunda Guerra Mundial, vamos realizar também um filtro de tempo, buscando dados a partir de 1948. No caso da China, que conquistou a primeira medalha em 1984 e dos Estados Unidos, que não participaram das Olimpíadas de 1980, vamos trazer dados a partir de 1984, para não perdermos a sequência de tempo.

usa <- subset(olimpiadas, Country == "United States" & as.Date(Data) >= as.Date("1984-01-01")) #subset estados unidos
china <- subset(olimpiadas, Country == "China" & as.Date(Data) >= as.Date("1984-01-01")) #subset china
brasil <- subset(olimpiadas, Country == "Brazil" & as.Date(Data) >= as.Date("1948-01-01")) #subset brasil

head(brasil,n=30) #verificando dados atribuídos

Para organizar os dados para traçar a linha de projeção corretamente, vamos ordenar os registros em ordem crescente de data utilizando os comandos a seguir:

ord.usa <- usa[order(usa$Data),] #ordenando por data
ord.china <- china[order(china$Data),] #ordenando por data
ord.brasil <- brasil[order(brasil$Data),] #ordenando por data

Convertendo os dados em séries temporais

Para utilizar a função de forecast do R, um dos requisitos é converter os valores em um objeto de “time series”. Utilizando a função ts() do R, vamos definir o início desta série e a frequência (como as Olimpíadas ocorrem de 4 em 4 anos, definimos a frequência como 0.25). No final do script vamos traçar um gráfico básico do R com os dados atuais (ainda sem a previsão) usando a função plot().

ts_olimpiadas_usa = ts(ord.usa$Total, 
                    start=c(1984,1),frequency=0.25) #início 1984, frequência de 4 em 4 anos

ts_olimpiadas_chi = ts(ord.china$Total, 
                    start=c(1984,1),frequency=0.25) #início 1984, frequência de 4 em 4 anos


ts_olimpiadas_bra = ts(ord.brasil$Total, 
                    start=c(1948,1),frequency=0.25) #início 1948, frequência de 4 em 4 anos


plot(ts_olimpiadas_usa) #gráfico de medalhas dos estados unidos até 2016
plot(ts_olimpiadas_chi) #gráfico de medalhas da china até 2016
plot(ts_olimpiadas_bra) #gráfico de medalhas do brasil até 2016

Gerando o gráfico de forecast

Agora que nós já temos os dados das medalhas conquistadas por Estados Unidos, China e Brasil organizados, podemos gerar a previsão de medalhas para este países. Vamos utilizar o modelo de ETS do R, que implementa o modelo estatístico “Exponential smoothing” . Este modelo gera no gráfico os valores médio, máximo e mínimo do intervalo de predição. Vamos realizar a previsão de medalhas para as próximas 4 Olimpíadas. O script abaixo gera os respectivos gráficos de forecast para cada país (utilizando a função plot()) e também mostra o resumo do resultado (função summary()).

library(forecast) #biblioteca de forecast

m_ets_usa = ets(ts_olimpiadas_usa) #modelo de ets, estados unidos
m_ets_chi = ets(ts_olimpiadas_chi) #modelo de ets, china
m_ets_bra = ets(ts_olimpiadas_bra) #modelo de ets, brasil

f_ets_usa = forecast(m_ets_usa, h=4) # previsão próximas 4 Olimpíadas
f_ets_chi = forecast(m_ets_chi, h=4) # previsão próximas 4 Olimpíadas
f_ets_bra = forecast(m_ets_bra, h=4) # previsão próximas 4 Olimpíadas

plot(f_ets_usa) #gráfico de forecast básico, estados unidos
plot(f_ets_chi) #gráfico de forecast básico, china
plot(f_ets_bra) #gráfico de forecast básico, brasil

summary(f_ets_usa) #resumo das informações do forecast, estados unidos
summary(f_ets_chi) #resumo das informações do forecast, china
summary(f_ets_bra) #resumo das informações do forecast, brasil
forecast_basico_brasil

Gráfico de forecast inicial do Brasil

Obs: foi utilizada a versão 7.1 do pacote de forecast do R.

Aperfeiçoando o gráfico de forecast

Para conseguir utilizar recursos visuais mais avançados, vamos utilizar o pacote ggfortify do R. Inicialmente vamos modificar as cores das linhas dos dados históricos, as cores e o tipo da linha de projeção e as cores do preenchimento do forecast. Utilizaremos a função autoplot() e algumas propriedades adicionais, conforme abaixo:

autoplot(f_ets_usa, ts.colour = 'blue',predict.colour = 'red',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'lightblue') #gráfico de forecast dos estados unidos
autoplot(f_ets_chi, ts.colour = 'red',predict.colour = 'black',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow')  #gráfico de forecast da china
autoplot(f_ets_bra, ts.colour = 'darkgreen',predict.colour = 'blue',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow') #gráfico de forecast do brasil
forecast_brasil

Gráfico de forecast do Brasil com modificação de cores

Agora vamos acrescentar as descrições no gráfico: título, nomes para o eixo X e para o eixo Y, além de um texto abaixo com uma descrição da previsão de medalhas.

autoplot(f_ets_usa, ts.colour = 'blue',predict.colour = 'red',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'lightblue') + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=2000,y=-1,label="Previsão para 2020: 118 medalhas",color="red")
autoplot(f_ets_chi, ts.colour = 'red',predict.colour = 'black',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow') + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=2000,y=-1,label="Previsão para 2020: 72 medalhas",color="black")
autoplot(f_ets_bra, ts.colour = 'darkgreen',predict.colour = 'blue',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow') + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=1980,y=-1,label="Previsão para 2020: 15 medalhas",color="darkblue")
forecast_brasil_titulos

Gráfico de forecast do Brasil com descrições adicionadas

Adicionando imagem no gráfico do forecast

Para finalizar, vamos adicionar as imagens das bandeiras dos países aos nossos gráficos de forecast. Vamos utilizar os pacotes png e grid, as funções readPNG (para ler a imagem .png) e RasterGrob (para posicionar a imagem no gráfico), e o comando annotation_custom(), para adicionar a imagem no gráfico. O script a seguir realiza esta tarefa:

packs <- c("png","grid") #lendo bibliotecas
lapply(packs, require, character.only = TRUE)

imgusa <- readPNG("usa.png") #carregando imagem bandeira estados unidos
imgchina <- readPNG("china.png") #carregando imagem bandeira china
imgbrasil <- readPNG("brasil.png") #carregando imagem bandeira brasil

gusa<- rasterGrob(imgusa, x=.8, y=.1, height=.15,width=.2,interpolate=TRUE) #definindo posição bandeira estados unidos
gchi<- rasterGrob(imgchina, x=.8, y=.1, height=.15,width=.2,interpolate=TRUE) #definindo posição bandeira china
gbra<- rasterGrob(imgbrasil, x=.8, y=.1, height=.15,width=.2,interpolate=TRUE) #definindo posição bandeira brasil

autoplot(f_ets_usa, ts.colour = 'blue',predict.colour = 'red',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'lightblue') + annotation_custom(gusa) + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=2000,y=-1,label="Previsão para 2020: 118 medalhas",color="red") #adicionando função annotation_custom()
autoplot(f_ets_chi, ts.colour = 'red',predict.colour = 'black',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow') + annotation_custom(gchi) + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=2000,y=-1,label="Previsão para 2020: 72 medalhas",color="black")
autoplot(f_ets_bra, ts.colour = 'darkgreen',predict.colour = 'blue',predict.linetype = 'dashed', conf.int = TRUE,conf.int.fill = 'yellow') + annotation_custom(gbra) + ggtitle("Projeção de Total de Medalhas") + labs(x="Ano",y="Total de Medalhas") + annotate("text",x=1980,y=-1,label="Previsão para 2020: 15 medalhas",color="darkblue")

Obs: é importante que as imagens PNG das bandeiras dos países estejam no diretório de trabalho definido.

As imagens a seguir mostram a versão final dos gráficos:

forecast_estadosunidos_final

Gráfico de forecast final dos Estados Unidos

forecast_china_final

Gráfico de forecast final da China

forecast_brasil_final

Gráfico de forecast final do Brasil

O arquivo CSV “MedalhasAtualizado.csv” que possui os dados das medalhas, os scripts em R para instalação dos pacotes necessários e dos comandos para gerar os gráficos de previsão, além das imagens e dos pacotes do R utilizados, estão disponíveis no GitHub .

Referências:

Plotting Time Series with ggplot2 and ggfortify

Add a background png image to ggplot2

Subsetting Data

Time-Series Objects

Forecasting using ETS models

ggfortify : Extension to ggplot2 to handle some popular packages – R software and data visualization

Anúncios

Um pensamento sobre “Parte 2: Gerando gráficos de forecast utilizando R para previsão de medalhas nas Olimpíadas

  1. Pingback: Parte 1: Capturando dados das medalhas nas Olimpíadas de múltiplas páginas web utilizando Power Query/ Power BI Desktop | Blog Dataficação

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s