Objetivo

Introduzir conceitos básicos de Análise Exploratória de Dados (AED) aplicados a dados reais do futebol, utilizando o banco de dados da StatsBomb e referências teóricas do livro Estatística Básica (Bussab & Morettin).

O que é Estatística?

“Estatística é a ciência que recolhe, organiza, analisa e interpreta dados para a tomada de decisões.”
Bussab, W. O., & Morettin, P. A. (2017). Estatística Básica.

A Estatística divide-se em dois ramos principais:

1. Estatística Descritiva

Foca na organização e resumo dos dados por meio de tabelas, gráficos e medidas numéricas. Exemplos incluem:

  • Medidas de Tendência Central: Média, mediana, moda.

  • Medidas de Dispersão: Amplitude, variância, desvio padrão.

2. Estatística Inferencial

Utiliza uma amostra para fazer generalizações sobre uma população. Inclui métodos como:

  • Estimativas pontuais e intervalares.

  • Testes de hipóteses.

Análise Exploratória de Dados (AED)

De acordo com Bussab e Morettin (2017), a AED tem o objetivo de identificar padrões, tendências e anomalias nos dados. Os principais passos incluem:

1. Organização dos Dados

  • Garantir que variáveis e observações estejam bem estruturadas.

  • Diferenciar variáveis qualitativas (categóricas) e quantitativas (numéricas).

Amplitude:

No livro Estatística Básica de Wilton de Oliveira Bussab e Pedro A. Morettin, a amplitude é definida como uma medida de dispersão simples que representa a diferença entre o maior e o menor valor de um conjunto de dados.

A amplitude é dada por:

\[ A = \max(x) - \min(x) \]

Interpretação: A amplitude fornece uma ideia básica da variação total dos dados, mas é uma medida sensível a outliers (valores extremos). Por isso, em análises mais robustas, costuma-se utilizar outras medidas, como a variância e o desvio padrão.

Exemplo: Se um conjunto de dados for

x = c(2:15) # vetor qualquer no eixo x
x # variavel em análise
##  [1]  2  3  4  5  6  7  8  9 10 11 12 13 14 15
max = max(x) # ponto maximo
min = min(x) # ponto minimo

Amplitude =  max - min #  a subtração dos pontos em questão.
Amplitude # resultado da Estatistica.
## [1] 13

Essa medida ajuda a entender o “espaço” que os dados ocupam dentro de um intervalo.


Variância:

No livro Estatística Básica de Wilton de Oliveira Bussab e Pedro A. Morettin, a variância é definida como uma medida de dispersão que indica o quanto os dados de um conjunto se afastam da média. Ela mede a variabilidade dos dados em relação à média, sendo crucial para entender a distribuição dos valores.

A variância é calculada por:

\[ \sigma^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \mu)^2 \]

Interpretação: A variância calcula o quadrado das diferenças entre cada valor e a média, dividindo pela quantidade de dados menos 1. Valores de variância maiores indicam maior dispersão dos dados em relação à média, enquanto valores menores sugerem que os dados estão mais próximos da média.

media =  mean(x)
media
## [1] 8.5
variancia = var(x)
variancia
## [1] 17.5

Desvio Padrão:

No livro Estatística Básica de Wilton de Oliveira Bussab e Pedro A. Morettin, o desvio padrão é definido como a medida de dispersão que representa a raiz quadrada da variância. Ele indica, em média, o quanto os valores de um conjunto de dados se desviam da média.

O desvio padrão é a raiz quadrada da variância:

\[ \sigma = \sqrt{\sigma^2} \]


Interpretação: O desvio padrão expressa a dispersão dos dados em torno da média, na mesma unidade dos dados originais. Um desvio padrão maior indica maior variabilidade dos dados, enquanto um valor menor sugere que os dados estão mais próximos da média.

sd(x)
## [1] 4.1833

Importância: O desvio padrão é amplamente utilizado para avaliar a variabilidade dos dados e a consistência de um conjunto de observações. Em análises estatísticas, o desvio padrão é essencial para construir intervalos de confiança, realizar testes de hipóteses e avaliar a dispersão de dados em diversas áreas, como economia, esportes e qualidade industrial

Coeficiente de Variação:

No livro Estatística Básica de Wilton de Oliveira Bussab e Pedro A. Morettin, o coeficiente de variação (CV) é apresentado como uma medida relativa de dispersão, expressa em percentual. Ele relaciona o desvio padrão com a média do conjunto de dados, permitindo comparar a variabilidade de diferentes conjuntos, mesmo que possuam unidades ou médias distintas.

O coeficiente de variação é a razão entre o desvio padrão e a média:

\[ CV = \frac{\sigma}{\mu} \]

cv = (sd(x)/mean(x))*100
cv
## [1] 49.2153

Importância: Comparabilidade: Permite comparar a dispersão de conjuntos de dados com médias diferentes ou unidades distintas. Aplicação: Muito utilizado em áreas como economia, qualidade industrial e finanças para avaliar a consistência dos dados. Avaliação de Risco: Em finanças, por exemplo, o CV é usado para medir o risco de um investimento em relação ao retorno esperado.

Assimetria

A assimetria mede o grau de simetria da distribuição em relação à média. Indica se os dados estão mais concentrados à esquerda ou à direita da média.

Fórmula da Assimetria (Sk)

Fórmula da Assimetria

A assimetria (\(\text{Skewness}\)) pode ser calculada pela fórmula:

\[ \text{Sk} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^3 / n}{\sigma^3} \]

Onde:
- \(x_i\) é cada valor da amostra
- \(\bar{x}\) é a média da amostra
- \(\sigma\) é o desvio padrão
- \(n\) é o número total de observações

# Cálculo da assimetria
assimetria <- function(x) {
  n <- length(x)                      # Número de observações
  media <- mean(x)                    # Média dos dados
  desvio_padrao <- sd(x)              # Desvio padrão dos dados
  soma <- sum((x - media)^3) / n      # Soma das diferenças elevadas ao cubo
  skewness <- soma / (desvio_padrao^3) # Fórmula da assimetria
  return(skewness)
}

# Exemplo de uso
dados <- c(10, 12, 14, 18, 20, 30)     # Vetor de dados de exemplo

assimetria(dados)                      # Chama a função e calcula
## [1] 0.6476928

Interpretação: Assimetria positiva (Sk > 0): Cauda mais longa à direita (distribuição inclinada para a direita). Assimetria negativa (Sk < 0): Cauda mais longa à esquerda (distribuição inclinada para a esquerda). Assimetria nula (Sk = 0): Distribuição simétrica (similar à distribuição normal).

Curtose (Kurtosis) A curtose mede o grau de achatamento ou “pontiagudez” da distribuição dos dados em relação à distribuição normal. Avalia a concentração dos valores em torno da média.

Fórmula da Curtose

A curtose (\(\text{Kurtosis}\)) mede o grau de achatamento da distribuição dos dados e é dada por:

\[ \text{K} = \frac{\sum_{i=1}^{n} (x_i - \bar{x})^4 / n}{\sigma^4} \]

Onde:
- \(x_i\) é cada valor da amostra
- \(\bar{x}\) é a média da amostra
- \(\sigma\) é o desvio padrão
- \(n\) é o número total de observações

# Carregar biblioteca necessária
library(moments)
#install.packages("moments")

# Dados de exemplo
dados <- c(2, 4, 6, 8, 10)

# Calcular a curtose
curtose <- kurtosis(dados)
print(curtose)
## [1] 1.7

Interpretação: Curtose positiva (K > 0): Distribuição mais “pontiaguda” que a normal (Leptocúrtica). Apresenta caudas mais pesadas. Curtose negativa (K < 0): Distribuição mais achatada que a normal (Platicúrtica). Apresenta caudas mais leves. Curtose nula (K = 0): Distribuição com a mesma “pontiagudez” da normal (Mesocúrtica).

#Banco de dados Este banco de dados lida com inumeras variações de eventos que ocorrem em partidas pelo mundo no campo analitico do futebol, disponivel para treinamento e desenvolvimento cientifico.

  • Instale as bibliotecas pendentes.

Se ainda não estiver instalado no R, execute:install.packages(“devtools”) Em seguida, instale este pacote R como:devtools::install_github(“statsbomb/StatsBombR”) Finalmente,library(StatsBombR)

# Bibliotecas utilizaveis

library(tidyverse) #sempre carregar quando for utilizado
library(tidyr)
library(StatsBombR)

library(ggplot2)
library(dplyr)
library(ggimage)
library(jpeg)
library(grid)

# Inicio de leitura de API
Ligas = FreeCompetitions()
## [1] "Whilst we are keen to share data and facilitate research, we also urge you to be responsible with the data. Please credit StatsBomb as your data source when using the data and visit https://statsbomb.com/media-pack/ to obtain our logos for public use."
torneios <- FreeCompetitions()%>% # Competition filtrate
  filter(competition_id == 16 & season_id == 4) # Division by filter
## [1] "Whilst we are keen to share data and facilitate research, we also urge you to be responsible with the data. Please credit StatsBomb as your data source when using the data and visit https://statsbomb.com/media-pack/ to obtain our logos for public use."
#variavel 1 competition_id e variavel 2 season_id dentro do dataset

#Matches | Generations of Tournaments | Clubs | Matches

Matches <- FreeMatches(torneios) #Free Matches
## [1] "Whilst we are keen to share data and facilitate research, we also urge you to be responsible with the data. Please credit StatsBomb as your data source when using the data and visit https://statsbomb.com/media-pack/ to obtain our logos for public use."
StatsBombData <- free_allevents(MatchesDF = Matches, Parallel = TRUE) #All the events, data frame per matches
## [1] "Whilst we are keen to share data and facilitate research, we also urge you to be responsible with the data. Please credit StatsBomb as your data source when using the data and visit https://statsbomb.com/media-pack/ to obtain our logos for public use."
ucl <- allclean(StatsBombData) # higienização dos dados

#names(ucl) # identifica todas as variaveis

#Analise descritiva dos dados ou Analise Exploratória dos dados

#Será aplicado um filtro para acompanhar a temporada 2018/2019 do Campeão
liverpool_data <- ucl%>%
  filter(team.name == "Liverpool")

Exercício 1:

Remover as variaveis que estão faltando (NA’s), sempre vai existir na’s, crie um dataframe para uma variavel em analise (xg)do seu desejo.

Para remover valores ausentes (NA) do seu data.frame, você pode usar a função na.omit() ou filtrar manualmente as linhas onde não há NA. Aqui está como fazer isso:

Usando na.omit()

# Dados de exemplo

# variaveis disponiveis no meu banco de dados.
#names(liverpool_data)

# criar data frame e depois remover na's |  list 1 a)
xg =  data.frame( xg = liverpool_data$shot.statsbomb_xg,
                  player = liverpool_data$player.name)


# Limpando totalmente as linhas de NA's
xg_clean <- na.omit(xg)
  • Esse método remove todas as linhas que contêm NA em qualquer coluna do data.frame.

  • Usando dplyr (Recomendado para maior controle) Se você está usando o pacote dplyr, pode filtrar as linhas sem NA da seguinte forma:

xg <- xg %>% 
  filter(!is.na(xg), !is.na(player))
xg
##             xg                 player
## 1  0.783500000          Mohamed Salah
## 2  0.006203256 Trent Alexander-Arnold
## 3  0.039799260          Mohamed Salah
## 4  0.007077651          Mohamed Salah
## 5  0.009163179       Andrew Robertson
## 6  0.038274758          Mohamed Salah
## 7  0.018781843 Jordan Brian Henderson
## 8  0.021911133          Mohamed Salah
## 9  0.020487793 Fábio Henrique Tavares
## 10 0.046969783          Mohamed Salah
## 11 0.044091757    James Philip Milner
## 12 0.026962453 Jordan Brian Henderson
## 13 0.061952036        Virgil van Dijk
## 14 0.077972755     Divock Okoth Origi

exercicio 2 aplicaremos medidas descriptivas media ,mediana,amplituded , frecuencia variancia , desvio de padron , assimetria, variancia,coeficiente de variancia

para contextualizar tenemos que entender que x es nuestra variable de analisis de nuestro banco de datos vamos aplicar este concepto en xg (espectativa de gol) en este caso vamos aplicar en liverpool data que son los datos de la champions league de statsboms del 2019 este ejercicio sera respondido en lenguaje R.

nota observación el el max n°1 es una funcion que se ejerce después al max2 es el max que pasa a ser una variable max =max(xg$xg) max cambio de una letra a un punto maximo del numero

1.1 amplitude é definida como uma medida de dispersão simples que representa a diferença entre o maior e o menor valor de um conjunto de dados.* 1.2 Variancia é definida como uma medida de dispersão que indica o quanto os dados de um conjunto se afastam da média. Ela mede a variabilidade dos dados em relação à média, sendo crucial para entender a distribuição dos valores. 1.3 Desvio padrão é definido como a medida de dispersão que representa a raiz quadrada da variância. Ele indica, em média, o quanto os valores de um conjunto de dados se desviam da média. 1.4 assimetria mede o grau de simetria da distribuição em relação à média. Indica se os dados estão mais concentrados à esquerda ou à direita da média. 1.5 curtose mede o grau de achatamento ou “pontiagudez” da distribuição dos dados em relação à distribuição normal. Avalia a concentração dos valores em torno da média.

max = max(xg$xg) #ponto maximo 
max
## [1] 0.7835
min =min(xg$xg) #ponto minimo
min
## [1] 0.006203256
amplitude= max-min
amplitude
## [1] 0.7772967
media= mean(xg$xg)
media
## [1] 0.08593912
variancia = var(xg$xg)
variancia
## [1] 0.04074953
sd(xg$xg)
## [1] 0.2018651
##
cv=(sd(xg$xg)/mean(xg$xg))*100
cv
## [1] 234.8932
# Cálculo da assimetria
assimetria <- function(xg) {
  n <- length(xg)                      # Número de observações
  media <- mean(xg)                    # Média dos dados
  desvio_padrao <- sd(xg)              # Desvio padrão dos dados
  soma <- sum((xg - media)^3) / n      # Soma das diferenças elevadas ao cubo
  skewness <- soma / (desvio_padrao^3) # Fórmula da assimetria
  return(skewness)
}
assimetria(xg$xg)
## [1] 2.922585
# Carregar biblioteca necessária
library(moments)
#install.packages("moments")

# Calcular a curtose
curtose <- kurtosis(xg$xg)
print(curtose)
## [1] 11.82185

analisis general el punto maximo de xg de liverpol el valor es 0.7835 , el punto minimo del liverpool el valor es 0.006203256 , la amplitude del liverpool el valor es 0.7772967 , la media del liverpool el valor es 0.08593912 , variancia del liverpoor el valor es 0.04074953.desvio padrāo del liverpool el es 0.2018651 ,coeficiente de variação del liverpool el valor es 234.8932 , la assimetria del liverpool el valor es 2.922585 , el valor del curtose del liverpool es 11.82185

# definindo xG 
summary(xg$xg)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.006203 0.019208 0.032619 0.085939 0.046250 0.783500
# DatavViz
hist(xg$xg)

# Definir os breaks ordenados corretamente
breaks <- c(0.006203, 0.019208, 0.032619, 0.085939, 0.046250, 0.783500)
breaks
## [1] 0.006203 0.019208 0.032619 0.085939 0.046250 0.783500
# Criar as classes com base nos breaks
chute_classes <- cut(as.numeric(xg$xg),
                     breaks = breaks,
                     right = FALSE, # Intervalo fechado à esquerda
                     labels = c("Muito Baixo", "Baixo", "Médio", "Alto", "Muito Alto"))

chute_classes
##  [1] <NA>        Muito Baixo Médio       Muito Baixo Muito Baixo Médio      
##  [7] Muito Baixo Baixo       Baixo       Alto        Médio       Baixo      
## [13] Alto        Alto       
## Levels: Muito Baixo Baixo Médio Alto Muito Alto
# Adicionar as classes ao dataset
xg$chute_Class <- chute_classes

# Contagem de cada classe
contagem_classes <- table(xg$chute_Class)

# Converter para data.frame
contagem_classes_df <- as.data.frame(contagem_classes)
colnames(contagem_classes_df) <- c("Classe", "Contagem")

# Adicionar valores médios para o eixo X
break_means <- (head(breaks, -1) + tail(breaks, -1)) / 2
contagem_classes_df$Valor_X <- break_means
# Carregar os pacotes necessários
library(png)
library(grid)

# Caminho do arquivo PNG
#logo_path <- "C:/Users/aldre/Downloads/Liverpool_FC.png"

# Ler a imagem PNG
#logo_grob <- rasterGrob(readPNG(logo_path), x = 0.9, y = 0.9, width = 0.15)

# Exibir a imagem (se necessário)
#grid.newpage()
#grid.draw(logo_grob)
# Criar o gráfico
fig_1 <- ggplot(contagem_classes_df, aes(x = Valor_X, y = Contagem)) +
  geom_point(size = 3, color = "#4575B4") + # Pontos
  geom_line(aes(group = 1), linetype = "dashed", color = "#4575B4", size = 1) + # Linha tracejada
  geom_text(aes(label = Classe), vjust = -1, hjust = 0.5, size = 3, color = "#4575B4") + # Rótulos
  scale_x_continuous(breaks = break_means) + # Ajuste do eixo X
  labs(title = "Distribuição de Classes de Chute",
       x = "Estatística Descritiva dos Chutes",
       y = "Distribuições de Frequências") +
  theme_minimal() 
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
#+ annotation_custom(logo_grob,
#                                     xmin = 0.5,
#                                     xmax = 0.8,
#                                     ymin = 5,
#                                     ymax = 10)  # Ajuste da posição da imagem

fig_1