Este relatório reúne os cinco itens da atividade, um em cada aba: manipulação de um conjunto de dados, tabela interativa, equações em LaTeX, figuras e referências. A organização segue a ideia de que ciência de dados junta preparação dos dados, visualização e modelos (Donoho 2017). O documento em si está em R Markdown, o formato descrito por (Xie et al. 2018).
O arquivo data/carros.csv traz 32 carros de passeio
publicados na Motor Trend em 1974 e analisados por (Henderson e Velleman
1981). Cada linha é um carro e cada coluna é uma variável, no
formato tidy de (Wickham 2014). As colunas são o
modelo, o consumo em milhas por galão (consumo_mpg), o
número de cilindros, a cilindrada em polegadas cúbicas, a potência em
hp, o peso em milhares de libras e o câmbio (manual ou
automatico).
carros <- read.csv(
"data/carros.csv",
stringsAsFactors = FALSE,
encoding = "UTF-8"
)
dplyr::glimpse(carros)## Rows: 32
## Columns: 7
## $ modelo <chr> "Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Driv…
## $ consumo_mpg <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2…
## $ cilindros <int> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4…
## $ cilindrada <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 14…
## $ potencia <int> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 1…
## $ peso <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.…
## $ cambio <chr> "manual", "manual", "manual", "automatico", "automatico", …
A leitura devolve 32 linhas e 7 colunas. glimpse mostra
o tipo de cada uma: modelo e câmbio são texto; as outras cinco são
numéricas. Nenhuma linha se perdeu na importação.
Os carros foram ordenados do maior para o menor consumo em milhas por galão. Quem fica no topo percorre mais milhas com um galão.
carros_ordenados <- carros %>%
arrange(desc(consumo_mpg))
knitr::kable(
head(carros_ordenados, 6),
caption = "Seis carros com maior consumo em milhas por galão.",
digits = 2,
align = "lrrrrrl"
)| modelo | consumo_mpg | cilindros | cilindrada | potencia | peso | cambio |
|---|---|---|---|---|---|---|
| Toyota Corolla | 33.9 | 4 | 71.1 | 65 | 1.83 | manual |
| Fiat 128 | 32.4 | 4 | 78.7 | 66 | 2.20 | manual |
| Honda Civic | 30.4 | 4 | 75.7 | 52 | 1.61 | manual |
| Lotus Europa | 30.4 | 4 | 95.1 | 113 | 1.51 | manual |
| Fiat X1-9 | 27.3 | 4 | 79.0 | 66 | 1.94 | manual |
| Porsche 914-2 | 26.0 | 4 | 120.3 | 91 | 2.14 | manual |
Os primeiros lugares são compactos de quatro cilindros. O Toyota Corolla lidera, com 33,9 milhas por galão, e o Fiat 128 vem em seguida, com 32,4. No fim da tabela, empurrados pela ordenação decrescente, ficam os carros grandes de oito cilindros: Cadillac Fleetwood e Lincoln Continental têm 10,4 milhas por galão.
O filtro conserva só os carros com mais de seis cilindros. Neste arquivo, isso corresponde aos modelos de oito cilindros.
carros_8cil <- carros %>%
filter(cilindros > 6) %>%
arrange(desc(potencia))
knitr::kable(
carros_8cil,
caption = "Carros com mais de seis cilindros, do mais potente ao menos potente.",
digits = 2,
align = "lrrrrrl"
)| modelo | consumo_mpg | cilindros | cilindrada | potencia | peso | cambio |
|---|---|---|---|---|---|---|
| Maserati Bora | 15.0 | 8 | 301.0 | 335 | 3.57 | manual |
| Ford Pantera L | 15.8 | 8 | 351.0 | 264 | 3.17 | manual |
| Duster 360 | 14.3 | 8 | 360.0 | 245 | 3.57 | automatico |
| Camaro Z28 | 13.3 | 8 | 350.0 | 245 | 3.84 | automatico |
| Chrysler Imperial | 14.7 | 8 | 440.0 | 230 | 5.34 | automatico |
| Lincoln Continental | 10.4 | 8 | 460.0 | 215 | 5.42 | automatico |
| Cadillac Fleetwood | 10.4 | 8 | 472.0 | 205 | 5.25 | automatico |
| Merc 450SE | 16.4 | 8 | 275.8 | 180 | 4.07 | automatico |
| Merc 450SL | 17.3 | 8 | 275.8 | 180 | 3.73 | automatico |
| Merc 450SLC | 15.2 | 8 | 275.8 | 180 | 3.78 | automatico |
| Hornet Sportabout | 18.7 | 8 | 360.0 | 175 | 3.44 | automatico |
| Pontiac Firebird | 19.2 | 8 | 400.0 | 175 | 3.85 | automatico |
| Dodge Challenger | 15.5 | 8 | 318.0 | 150 | 3.52 | automatico |
| AMC Javelin | 15.2 | 8 | 304.0 | 150 | 3.44 | automatico |
O filtro reduziu a base de 32 para 14 carros. A potência média desse grupo é 209.2 hp, acima da média geral de 146.7 hp. O mais potente é o Maserati Bora, com 335 hp. As colunas continuam as mesmas; o que muda é o conjunto de linhas.
Duas colunas foram calculadas a partir das que já existiam.
km_por_litro passa o consumo para quilômetros por
litro. Uma milha tem 1,609344 km e um galão tem 3,785411784 L, então o
fator é \(1{,}609344 /
3{,}785411784\).potencia_por_peso divide a potência pelo peso e mede
quantos cavalos o carro oferece por mil libras.fator_km_por_litro <- 1.609344 / 3.785411784
carros_enriquecido <- carros %>%
mutate(
km_por_litro = consumo_mpg * fator_km_por_litro,
potencia_por_peso = potencia / peso
) %>%
arrange(desc(km_por_litro))
knitr::kable(
carros_enriquecido %>%
select(modelo, consumo_mpg, km_por_litro, potencia, peso, potencia_por_peso) %>%
head(6),
caption = "Novas variáveis nos seis carros de maior autonomia.",
digits = 2
)| modelo | consumo_mpg | km_por_litro | potencia | peso | potencia_por_peso |
|---|---|---|---|---|---|
| Toyota Corolla | 33.9 | 14.41 | 65 | 1.83 | 35.42 |
| Fiat 128 | 32.4 | 13.77 | 66 | 2.20 | 30.00 |
| Honda Civic | 30.4 | 12.92 | 52 | 1.61 | 32.20 |
| Lotus Europa | 30.4 | 12.92 | 113 | 1.51 | 74.69 |
| Fiat X1-9 | 27.3 | 11.61 | 66 | 1.94 | 34.11 |
| Porsche 914-2 | 26.0 | 11.05 | 91 | 2.14 | 42.52 |
A ordem por km_por_litro coincide com a ordem por
consumo_mpg, porque a conversão multiplica todo mundo pelo
mesmo número positivo. Muda a unidade, não o ranking.
potencia_por_peso responde outra pergunta: um carro pode
ter muitos cavalos e, se for muito pesado, ainda assim pouca potência
para cada unidade de peso.
resumo_cilindros <- carros_enriquecido %>%
group_by(cilindros) %>%
summarise(
n = n(),
consumo_medio_mpg = mean(consumo_mpg),
km_por_litro_medio = mean(km_por_litro),
potencia_media = mean(potencia),
peso_medio = mean(peso),
.groups = "drop"
) %>%
arrange(cilindros)
knitr::kable(
resumo_cilindros,
caption = "Médias de consumo, potência e peso por número de cilindros.",
digits = 2
)| cilindros | n | consumo_medio_mpg | km_por_litro_medio | potencia_media | peso_medio |
|---|---|---|---|---|---|
| 4 | 11 | 26.66 | 11.34 | 82.64 | 2.29 |
| 6 | 7 | 19.74 | 8.39 | 122.29 | 3.12 |
| 8 | 14 | 15.10 | 6.42 | 209.21 | 4.00 |
Há 11 carros de 4 cilindros, 7 de 6 e 14 de 8. O consumo médio cai quando o número de cilindros sobe; a potência média e o peso médio sobem. As figuras da aba 4 mostram esse padrão carro a carro.
A tabela usa o pacote DT, que leva a biblioteca DataTables para o
HTML. Os dados são os da aba 1, já com km_por_litro e
potencia_por_peso. Dá para ordenar clicando no nome da
coluna, buscar na caixa de pesquisa, restringir cada coluna pelos campos
do topo e trocar de página pelos controles de paginação.
rotulos <- c(
"Modelo", "Consumo (mpg)", "Cilindros", "Cilindrada",
"Potência (hp)", "Peso (1000 lb)", "Câmbio",
"Consumo (km/L)", "Potência por peso"
)
DT::datatable(
carros_enriquecido,
rownames = FALSE,
filter = "top",
colnames = rotulos,
caption = "Carros de 1973-74 com consumo convertido e potência por peso.",
options = list(
pageLength = 8,
lengthMenu = c(8, 16, 32),
searching = TRUE,
ordering = TRUE,
autoWidth = TRUE,
language = list(
search = "Buscar:",
lengthMenu = "Mostrar _MENU_ linhas",
info = "Mostrando _START_ a _END_ de _TOTAL_ carros",
infoEmpty = "Nenhum carro",
infoFiltered = "(filtrado de _MAX_ carros)",
zeroRecords = "Nenhum carro encontrado",
paginate = list(previous = "Anterior", `next` = "Próxima")
)
)
)A página inicial tem 8 linhas, então os 32 carros ocupam mais de uma página. A busca é global: “Toyota” deixa Corolla e Corona; “manual” deixa só o câmbio manual. Ordenar por potência coloca o Maserati Bora no topo.
As cinco equações abaixo são de uso corrente em ciência de dados. A notação segue (James et al. 2021). Em cada uma, o texto diz o que os símbolos representam.
\[f(x \mid \mu, \sigma) = \frac{1}{\sigma \sqrt{2\pi}} \exp\left( -\frac{(x - \mu)^{2}}{2\sigma^{2}} \right)\]
\(f(x \mid \mu, \sigma)\) é a altura da curva normal no ponto \(x\). \(\mu\) é a média e marca o centro. \(\sigma > 0\) é o desvio-padrão e controla a largura. O fator \(1/(\sigma\sqrt{2\pi})\) faz a área sob a curva valer 1, de modo que \(f\) funcione como densidade de probabilidade. Ruído de medição e vários estimadores, em amostra grande, se aproximam dessa forma.
\[\hat{\beta} = \left(X^{\top} X\right)^{-1} X^{\top} y\]
Na regressão linear \(y = X\beta + \varepsilon\), \(y\) é o vetor da resposta, \(X\) é a matriz das variáveis explicativas (com uma coluna de uns para o intercepto) e \(\beta\) é o vetor de coeficientes desconhecidos. \(\hat{\beta}\) é o valor que minimiza a soma dos quadrados dos resíduos. A inversa existe quando as colunas de \(X\) não são combinações lineares umas das outras. Nos carros deste relatório, esse estimador é o que ligaria o consumo ao peso e à potência.
\[P(Y = 1 \mid x) = \frac{1}{1 + \exp\left( -(\beta_0 + \beta^{\top} x) \right)}\]
\(Y\) vale 1 ou 0. Um exemplo, nestes dados, é o câmbio ser manual. \(x\) reúne as medidas do carro e \(\beta_0 + \beta^{\top} x\) é um escore linear. A função logística leva esse escore para uma probabilidade entre 0 e 1: escore alto empurra a probabilidade para 1, escore baixo empurra para 0. O logaritmo da chance, \(\log\frac{P}{1 - P}\), é igual ao escore \(\beta_0 + \beta^{\top} x\).
\[P(H \mid D) = \frac{P(D \mid H)\, P(H)}{P(D)}\]
\(H\) é uma hipótese e \(D\) são os dados. \(P(H)\) é a probabilidade da hipótese antes de observar os dados. \(P(D \mid H)\) é a probabilidade de ver esses dados se a hipótese for verdadeira. \(P(D)\) é a probabilidade dos dados considerando as hipóteses em jogo. \(P(H \mid D)\) é a probabilidade da hipótese depois dos dados. A crença sobe na medida em que a hipótese explica bem o que foi observado, e desce quando os dados seriam raros sob ela.
\[\mathrm{RMSE} = \sqrt{ \frac{1}{n} \sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^{2} }\]
\(n\) é o número de observações, \(y_i\) é o valor observado e \(\hat{y}_i\) é a previsão do modelo. A diferença \(y_i - \hat{y}_i\) é o erro. O quadrado trata erro para cima e erro para baixo do mesmo jeito e dá mais peso aos erros grandes. A raiz devolve a medida na unidade de \(y\). Se a resposta for consumo em km/L, o RMSE também fica em km/L e indica o tamanho típico do erro da previsão.
As duas figuras usam a tabela enriquecida da aba 1. Elas desenham o que o resumo por cilindros já resumiu em médias: mais cilindros andam juntos com mais peso, mais potência e menos autonomia.
ggplot(carros_enriquecido, aes(x = factor(cilindros), y = consumo_mpg)) +
geom_boxplot(
fill = "#9ecae1",
color = "#08519c",
width = 0.6,
outlier.shape = NA
) +
geom_jitter(width = 0.12, height = 0, size = 2.2, color = "#08306b", alpha = 0.85) +
labs(
title = "Consumo de combustível por número de cilindros",
x = "Cilindros",
y = "Consumo (milhas por galão)"
) +
theme_minimal(base_size = 13)Consumo em milhas por galão segundo o número de cilindros. Cada ponto é um carro; a caixa marca mediana e quartis.
A mediana do consumo desce dos carros de 4 cilindros para os de 6 e de novo para os de 8. O grupo de 4 cilindros também é o mais espalhado: há compactos muito econômicos e outros só moderados. Entre os de 8 cilindros, todos ficam abaixo de 20 milhas por galão.
ggplot(
carros_enriquecido,
aes(x = peso, y = potencia, color = factor(cilindros))
) +
geom_point(size = 3) +
labs(
title = "Potência e peso dos carros",
x = "Peso (milhares de libras)",
y = "Potência (hp)",
color = "Cilindros"
) +
theme_minimal(base_size = 13)Potência em função do peso. A cor indica o número de cilindros.
Carros mais pesados tendem a ser mais potentes. Os de 8 cilindros ocupam o canto de muito peso e muita potência. Os de 4 cilindros ficam à esquerda, leves, todos com menos de 120 hp. O Maserati Bora sobe acima dos vizinhos de peso parecido: 335 hp sem ser o carro mais pesado do grupo.
As cinco obras citadas nas abas anteriores estão listadas abaixo. Henderson e Velleman analisam os dados de carros da Motor Trend. Wickham formaliza a organização tidy usada na manipulação. Xie, Allaire e Grolemund descrevem o R Markdown deste relatório. James, Witten, Hastie e Tibshirani apresentam a regressão linear, a regressão logística e as medidas de erro das equações. Donoho situa essas peças no campo da ciência de dados.