knitr::include_graphics("Rlogo.png")

knitr::include_graphics("images.png")

1. Manipulação de dados

1.1 Carregando o conjunto de dados

Usaremos o conjunto mtcars, built-in da própria linguagem. Ele contém dados da revista Motor Trend (1974) sobre 32 modelos de carros e 11 variáveis (consumo, cilindros, potência, peso etc.).

dados <- mtcars
dados$modelo <- rownames(mtcars)
rownames(dados) <- NULL
head(dados)
##    mpg cyl disp  hp drat    wt  qsec vs am gear carb            modelo
## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4         Mazda RX4
## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     Mazda RX4 Wag
## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        Datsun 710
## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    Hornet 4 Drive
## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 Hornet Sportabout
## 6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1           Valiant

1.2 Descrição do conjunto de dados e das variáveis

O conjunto mtcars foi extraído da revista americana Motor Trend US (1974) e reúne medidas de desempenho e características de projeto de 32 automóveis (modelos de 1973 e 1974). Cada linha é um carro (observação) e cada coluna é uma característica (variável). Ele é distribuído junto com o R, no pacote datasets, e pode ser consultado com ?mtcars.

São 11 variáveis originais, todas armazenadas como numéricas, embora algumas representem categorias:

Variável Descrição Unidade / valores Natureza
mpg Consumo de combustível (miles per gallon) milhas por galão Quantitativa contínua
cyl Número de cilindros do motor 4, 6 ou 8 Quantitativa discreta
disp Cilindrada (volume deslocado pelos pistões) polegadas cúbicas Quantitativa contínua
hp Potência bruta (gross horsepower) cavalos-vapor (hp) Quantitativa contínua
drat Relação do eixo traseiro (rear axle ratio) razão (adimensional) Quantitativa contínua
wt Peso do veículo milhares de libras (1000 lb) Quantitativa contínua
qsec Tempo para percorrer 1/4 de milha (aceleração) segundos Quantitativa contínua
vs Formato do motor 0 = em V, 1 = em linha Qualitativa binária
am Tipo de câmbio 0 = automático, 1 = manual Qualitativa binária
gear Número de marchas à frente 3, 4 ou 5 Quantitativa discreta
carb Número de carburadores 1 a 8 Quantitativa discreta

Além delas, no código acima foi criada a coluna modelo, com o nome de cada carro (no original, os nomes ficam como nomes de linha e não como coluna).

Resumindo a estrutura do conjunto:

data.frame(
  Característica = c("Observações (carros)", "Variáveis originais",
                     "Variáveis quantitativas", "Variáveis qualitativas (binárias)"),
  Valor = c(nrow(mtcars), ncol(mtcars), 9, 2)
)
##                      Característica Valor
## 1              Observações (carros)    32
## 2               Variáveis originais    11
## 3           Variáveis quantitativas     9
## 4 Variáveis qualitativas (binárias)     2

cyl, gear e carb são contagens, mas aqui valem poucos valores distintos; por isso, dependendo da análise, podem ser tratadas como categorias. Já vs e am são códigos 0/1 para categorias e, por isso, serão convertidas em fatores com rótulos na seção 1.4.

1.3 Resumo e verificação de valores ausentes

summary(dados[, c("mpg", "hp", "wt")])
##       mpg              hp              wt       
##  Min.   :10.40   Min.   : 52.0   Min.   :1.513  
##  1st Qu.:15.43   1st Qu.: 96.5   1st Qu.:2.581  
##  Median :19.20   Median :123.0   Median :3.325  
##  Mean   :20.09   Mean   :146.7   Mean   :3.217  
##  3rd Qu.:22.80   3rd Qu.:180.0   3rd Qu.:3.610  
##  Max.   :33.90   Max.   :335.0   Max.   :5.424
colSums(is.na(dados))
##    mpg    cyl   disp     hp   drat     wt   qsec     vs     am   gear   carb 
##      0      0      0      0      0      0      0      0      0      0      0 
## modelo 
##      0

A função summary() mostra mínimo, quartis, média e máximo. Com ela, é possível ver que o consumo (mpg) vai de 10.4 a 33.9 milhas por galão, com média de 20.09. O segundo comando colSums(is.na()) conta os valores NA (nulos e/ou faltantes) por coluna; o resultado é zero em todas, então não precisamos tratar dados faltantes nesse caso.

1.4 Transformando variáveis

dados <- dados |>
  mutate(
    cambio = factor(am, levels = c(0, 1), labels = c("Automático", "Manual")),
    cilindros = factor(cyl),
    kpl = mpg * 0.425144,          # milhas/galão -> km/litro
    peso_kg = wt * 453.592,        # 1000 lb -> kg
    # razão potência/peso
    hp_por_tonelada = hp / (peso_kg / 1000),
    # categoria de eficiência
    eficiencia = case_when(
      kpl >= 10 ~ "Alta",
      kpl >= 7  ~ "Média",
      TRUE      ~ "Baixa"
    ),
    eficiencia = factor(eficiencia, levels = c("Baixa", "Média", "Alta"))
  )

dados |> select(modelo, mpg, kpl, wt, peso_kg, hp_por_tonelada, eficiencia) |> head()
##              modelo  mpg      kpl    wt  peso_kg hp_por_tonelada eficiencia
## 1         Mazda RX4 21.0 8.928024 2.620 1188.411        92.56057      Média
## 2     Mazda RX4 Wag 21.0 8.928024 2.875 1304.077        84.35085      Média
## 3        Datsun 710 22.8 9.693283 2.320 1052.333        88.37503      Média
## 4    Hornet 4 Drive 21.4 9.098082 3.215 1458.298        75.43038      Média
## 5 Hornet Sportabout 18.7 7.950193 3.440 1560.356       112.15386      Média
## 6           Valiant 18.1 7.695106 3.460 1569.428        66.90334      Média

mutate() cria ou altera colunas. Com essas transformações garate-se que:

  • factor() transforma números em categorias com rótulos (0/1 viram “Automático”/“Manual”).
  • kpl e peso_kg convertem unidades do sistema imperial para o unidades do Sistema Internacional de Unidades (SI).
  • hp_por_tonelada é uma variável nova: quanto mais alta, mais “esportivo” o carro.
  • case_when() cria a categoria eficiencia a partir de regras sobre kpl.

1.5 Filtrando linhas

potentes <- dados |>
  filter(hp > 150, cambio == "Manual") |>
  select(modelo, hp, kpl, cambio)

potentes
##           modelo  hp      kpl cambio
## 1 Ford Pantera L 264 6.717275 Manual
## 2   Ferrari Dino 175 8.375337 Manual
## 3  Maserati Bora 335 6.377160 Manual

A função filter() mantém só as linhas que satisfazem todas as condições (separadas por vírgula = “E”). Aqui ficaram 3 carros com mais de 150 hp e câmbio manual. Por fim, select() escolhe apenas as colunas de interesse.

1.6 Ordenando

dados |>
  arrange(desc(kpl)) |>
  select(modelo, kpl, hp, eficiencia) |>
  head(5)
##           modelo      kpl  hp eficiencia
## 1 Toyota Corolla 14.41238  65       Alta
## 2       Fiat 128 13.77467  66       Alta
## 3    Honda Civic 12.92438  52       Alta
## 4   Lotus Europa 12.92438 113       Alta
## 5      Fiat X1-9 11.60643  66       Alta

arrange(desc(kpl)) ordena do maior para o menor consumo em km/l. O primeiro da lista, Toyota Corolla, é o carro mais econômico do conjunto. Sem desc(), a ordem seria crescente.

1.7 Agrupando e resumindo

resumo <- dados |>
  group_by(cilindros) |>
  summarise(
    n = n(),
    kpl_medio = round(mean(kpl), 2),
    hp_medio = round(mean(hp), 1),
    peso_medio_kg = round(mean(peso_kg), 0),
    .groups = "drop"
  )

resumo
## # A tibble: 3 × 5
##   cilindros     n kpl_medio hp_medio peso_medio_kg
##   <fct>     <int>     <dbl>    <dbl>         <dbl>
## 1 4            11     11.3      82.6          1037
## 2 6             7      8.39    122.           1414
## 3 8            14      6.42    209.           1814

A função group_by() separa os dados por número de cilindros e summarise() calcula uma estatística por grupo. O padrão esperado é claro: quanto mais cilindros, maior a potência e o peso médios e menor o rendimento (km/l), o que mostra a relação de compromisso entre desempenho e economia.

ggplot(dados, aes(x = cilindros, y = kpl, fill = cilindros)) +
  geom_boxplot(show.legend = FALSE) +
  labs(x = "Cilindros", y = "Consumo (km/l)",
       title = "Rendimento por número de cilindros") +
  theme_minimal()

Segundo gráfico o boxplot, é confirmado visualmente na tabela: a mediana de km/l cai conforme o número de cilindros aumenta.

2. Tabela interativa (DT)

A tabela abaixo permite ordenar (clique no cabeçalho), buscar (campo “Search”), filtrar por coluna e paginar.

tabela <- dados |>
  select(Modelo = modelo, Cilindros = cilindros, Câmbio = cambio,
         `Potência (hp)` = hp, `Consumo (km/l)` = kpl,
         `Peso (kg)` = peso_kg, Eficiência = eficiencia) |>
  mutate(`Consumo (km/l)` = round(`Consumo (km/l)`, 2),
         `Peso (kg)` = round(`Peso (kg)`, 0))

datatable(
  tabela,
  filter = "top",
  rownames = FALSE,
  extensions = "Buttons",
  options = list(
    pageLength = 8,
    lengthMenu = c(5, 8, 15, 32),
    dom = "Bfrtip",
    buttons = c("copy", "csv", "excel"),
    language = list(url = "//cdn.datatables.net/plug-ins/1.13.6/i18n/pt-BR.json")
  )
) |>
  formatStyle("Consumo (km/l)",
              background = styleColorBar(range(tabela$`Consumo (km/l)`), "lightblue"),
              backgroundSize = "100% 80%", backgroundRepeat = "no-repeat",
              backgroundPosition = "center")

3. Equações

3.1 Regressão linear: estimador de mínimos quadrados

\[\hat{\boldsymbol{\beta}} = \left(\mathbf{X}^{\top}\mathbf{X}\right)^{-1}\mathbf{X}^{\top}\mathbf{y}\]

Significado: dá os coeficientes que minimizam a soma dos quadrados dos resíduos. \(\mathbf{X}\) é a matriz de variáveis explicativas e \(\mathbf{y}\) o vetor da variável resposta.

Autores: Hastie et al. (2009) apresentam os métodos lineares de regressão, com os mínimos quadrados como ponto de partida.

Aplicação em ciência de dados: é o modelo de referência (baseline) para problemas de previsão e a base para interpretar o efeito de cada variável. No R, a função lm() calcula esse estimador (internamente por decomposição QR, que é numericamente mais estável do que inverter \(\mathbf{X}^{\top}\mathbf{X}\)). No nosso conjunto, serviria para prever o consumo (kpl) a partir de peso e potência.

3.2 Teorema de Bayes (forma contínua)

\[p(\theta \mid x) = \frac{p(x \mid \theta)\,p(\theta)}{\int_{\Theta} p(x \mid \theta')\,p(\theta')\,d\theta'}\]

Significado: atualiza a crença sobre o parâmetro \(\theta\) (posteriori) combinando a verossimilhança \(p(x\mid\theta)\) com a crença prévia \(p(\theta)\). O denominador normaliza o resultado.

Autores: Gelman et al. (2013) sistematizam a análise de dados bayesiana, incluindo modelos hierárquicos e a checagem dos modelos.

Aplicação em ciência de dados: é usada em testes A/B bayesianos, em classificadores como o naive Bayes (filtros de spam) e na quantificação de incerteza de previsões. Como a integral do denominador raramente tem solução analítica, na prática a posteriori é obtida por simulação (MCMC), com ferramentas como Stan e o pacote brms no R.

3.3 Softmax com entropia cruzada (classificação)

\[\mathcal{L}(\mathbf{W}) = -\frac{1}{N}\sum_{i=1}^{N}\sum_{k=1}^{K} y_{ik}\,\log\!\left(\frac{e^{\mathbf{w}_k^{\top}\mathbf{x}_i}}{\sum_{j=1}^{K} e^{\mathbf{w}_j^{\top}\mathbf{x}_i}}\right)\]

Significado: função de perda de um classificador com \(K\) classes. A fração interna (softmax) converte pontuações em probabilidades; a perda é menor quando o modelo atribui alta probabilidade à classe correta (\(y_{ik}=1\)).

Autores: Goodfellow et al. (2016) mostram que minimizar a entropia cruzada equivale a maximizar a verossimilhança do modelo, o que justifica seu uso como perda padrão em classificação.

Aplicação em ciência de dados: é a camada final e a função de perda da maioria das redes neurais de classificação multiclasse, como reconhecimento de imagens e classificação de textos. Também é a função de perda da regressão logística multinomial.

3.4 Decomposição do erro quadrático médio (viés–variância)

\[\mathbb{E}\!\left[\left(y-\hat{f}(x)\right)^{2}\right] = \underbrace{\left(\mathbb{E}[\hat{f}(x)]-f(x)\right)^{2}}_{\text{viés}^2} + \underbrace{\mathbb{E}\!\left[\left(\hat{f}(x)-\mathbb{E}[\hat{f}(x)]\right)^{2}\right]}_{\text{variância}} + \underbrace{\sigma^{2}}_{\text{ruído irredutível}}\]

Significado: o erro esperado de um modelo se divide em viés (simplificação excessiva), variância (sensibilidade aos dados de treino) e ruído. Explica o sub e o sobreajuste.

Autores: Geman et al. (1992) formalizaram o chamado “dilema viés–variância” no contexto de redes neurais, e Hastie et al. (2009) o discutem na avaliação e seleção de modelos.

Aplicação em ciência de dados: orienta a escolha da complexidade do modelo. Justifica o uso de validação cruzada, de regularização (Ridge e Lasso) e de métodos de conjunto: bagging e florestas aleatórias reduzem a variância, enquanto boosting reduz o viés. É exatamente o que mostra a Figura 1.

3.5 Análise de Componentes Principais (via SVD)

\[\mathbf{X}_c = \mathbf{U}\boldsymbol{\Sigma}\mathbf{V}^{\top}, \qquad \lambda_j = \frac{\sigma_j^{2}}{n-1}, \qquad \text{Variância explicada}_j = \frac{\lambda_j}{\sum_{k=1}^{p}\lambda_k}\]

Significado: as colunas de \(\mathbf{V}\) são as direções de maior variância dos dados centrados \(\mathbf{X}_c\). Os autovalores \(\lambda_j\) medem quanta variância cada componente captura, o que permite reduzir a dimensionalidade.

Autores: Jolliffe and Cadima (2016) fazem uma revisão da técnica e de seus desenvolvimentos recentes, e Hastie et al. (2009) a tratam entre os métodos de aprendizado não supervisionado.

Aplicação em ciência de dados: é usada para reduzir dimensionalidade, visualizar dados de muitas variáveis em 2D, remover redundância (variáveis correlacionadas) e como pré-processamento antes de outros modelos.

4. Referências

As cinco obras abaixo foram citadas na aba de Equações e fundamentam as fórmulas apresentadas: mínimos quadrados (Hastie et al. 2009), inferência bayesiana (Gelman et al. 2013), aprendizado profundo (Goodfellow et al. 2016), viés–variância (Geman et al. 1992) e análise de componentes principais (Jolliffe and Cadima 2016).

Gelman, Andrew, John B. Carlin, Hal S. Stern, David B. Dunson, Aki Vehtari, and Donald B. Rubin. 2013. Bayesian Data Analysis. 3rd ed. Chapman; Hall/CRC.
Geman, Stuart, Elie Bienenstock, and René Doursat. 1992. “Neural Networks and the Bias/Variance Dilemma.” Neural Computation 4 (1): 1–58. https://doi.org/10.1162/neco.1992.4.1.1.
Goodfellow, Ian, Yoshua Bengio, and Aaron Courville. 2016. Deep Learning. MIT Press.
Hastie, Trevor, Robert Tibshirani, and Jerome Friedman. 2009. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. 2nd ed. Springer.
Jolliffe, Ian T., and Jorge Cadima. 2016. “Principal Component Analysis: A Review and Recent Developments.” Philosophical Transactions of the Royal Society A 374 (2065): 20150202. https://doi.org/10.1098/rsta.2015.0202.