knitr::include_graphics("Rlogo.png")
knitr::include_graphics("images.png")
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
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.
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.
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.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.
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.
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.
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")
\[\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.
\[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.
\[\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.
\[\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.
\[\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.
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).