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).

Itens da atividade

1. Manipulação dos dados

Pacotes e leitura do arquivo

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).

library(dplyr)
library(ggplot2)
library(DT)
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.

Ordenaçã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"
)
Seis carros com maior consumo em milhas por galão.
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.

Filtragem

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"
)
Carros com mais de seis cilindros, do mais potente ao menos potente.
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.

Novas variáveis

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
)
Novas variáveis nos seis carros de maior autonomia.
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 por número de cilindros

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
)
Médias de consumo, potência e peso por número de cilindros.
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.

2. Tabela interativa

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.

3. Equações

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.

3.1 Densidade da distribuição normal

\[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.

3.2 Estimador de mínimos quadrados

\[\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.

3.3 Probabilidade no modelo logístico

\[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\).

3.4 Teorema de Bayes

\[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.

3.5 Raiz do erro quadrático médio

\[\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.

4. Figuras

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.

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.

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.

5. Referências

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.

Donoho, David. 2017. “50 Years of Data Science”. Journal of Computational and Graphical Statistics 26 (4): 745–66. https://doi.org/10.1080/10618600.2017.1384734.
Henderson, Harold V., e Paul F. Velleman. 1981. “Building Multiple Regression Models Interactively”. Technometrics 23 (4): 311–20. https://doi.org/10.1080/00401706.1981.10487649.
James, Gareth, Daniela Witten, Trevor Hastie, e Robert Tibshirani. 2021. An Introduction to Statistical Learning: with Applications in R. 2º ed. Springer. https://doi.org/10.1007/978-1-0716-1418-1.
Wickham, Hadley. 2014. “Tidy Data”. Journal of Statistical Software 59 (10): 1–23. https://doi.org/10.18637/jss.v059.i10.
Xie, Yihui, J. J. Allaire, e Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown/.