Exercício 11: manipulação de dados com o conjunto diamonds.

Exercício 11

1) Filtragem

Utilizamos o conjunto diamonds do pacote ggplot2: cerca de 53.940 diamantes com preço e atributos físicos. Como manipulação, escolhemos filtragem com dplyr::filter() para selecionar subconjuntos relevantes e responder perguntas de negócio sem alterar a estrutura original.

Inspeção inicial

Antes de filtrar, inspecionamos a estrutura e um resumo numérico. Variáveis como cut, color e clarity são fatores (com níveis ordenados), enquanto price e dimensões são numéricas.

data("diamonds", package = "ggplot2")

glimpse(diamonds)
## Rows: 53,940
## Columns: 10
## $ carat   <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.…
## $ cut     <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Ver…
## $ color   <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I,…
## $ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, …
## $ depth   <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64…
## $ table   <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58…
## $ price   <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 34…
## $ x       <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.…
## $ y       <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.…
## $ z       <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.…
summary(diamonds)
##      carat               cut        color        clarity          depth      
##  Min.   :0.2000   Fair     : 1610   D: 6775   SI1    :13065   Min.   :43.00  
##  1st Qu.:0.4000   Good     : 4906   E: 9797   VS2    :12258   1st Qu.:61.00  
##  Median :0.7000   Very Good:12082   F: 9542   SI2    : 9194   Median :61.80  
##  Mean   :0.7979   Premium  :13791   G:11292   VS1    : 8171   Mean   :61.75  
##  3rd Qu.:1.0400   Ideal    :21551   H: 8304   VVS2   : 5066   3rd Qu.:62.50  
##  Max.   :5.0100                     I: 5422   VVS1   : 3655   Max.   :79.00  
##                                     J: 2808   (Other): 2531                  
##      table           price             x                y         
##  Min.   :43.00   Min.   :  326   Min.   : 0.000   Min.   : 0.000  
##  1st Qu.:56.00   1st Qu.:  950   1st Qu.: 4.710   1st Qu.: 4.720  
##  Median :57.00   Median : 2401   Median : 5.700   Median : 5.710  
##  Mean   :57.46   Mean   : 3933   Mean   : 5.731   Mean   : 5.735  
##  3rd Qu.:59.00   3rd Qu.: 5324   3rd Qu.: 6.540   3rd Qu.: 6.540  
##  Max.   :95.00   Max.   :18823   Max.   :10.740   Max.   :58.900  
##                                                                   
##        z         
##  Min.   : 0.000  
##  1st Qu.: 2.910  
##  Median : 3.530  
##  Mean   : 3.539  
##  3rd Qu.: 4.040  
##  Max.   :31.800  
## 

Interpretação: o summary() mostra mínimos, quartis e máximos para variáveis contínuas e a contagem por nível para fatores. Esses valores orientam quais cortes (limiares) fazem sentido na filtragem.

Filtro 1 — condição numérica simples

Selecionamos apenas diamantes com peso (carat) maior ou igual a 1,0, separando o segmento de pedras maiores.

d_grandes <- diamonds |>
  filter(carat >= 1.0)

nrow(d_grandes)
## [1] 19060
head(d_grandes, 6)

Resultado: restam 19.060 registros (de 53.940). Esse subconjunto representa diamantes do segmento mais alto de peso, em geral associados a preços maiores.

Filtro 2 — múltiplas condições combinadas com &

Combinamos faixa de preço e peso para isolar um segmento de mercado intermediário: peso entre 0,5 e 1,5 quilates e preço menor que 5.000.

d_intermediario <- diamonds |>
  filter(carat >= 0.5, carat <= 1.5, price < 5000)

nrow(d_intermediario)
## [1] 21517
summary(d_intermediario$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     584    1844    2655    2832    3820    4999

Interpretação: cada vírgula em filter() equivale a um E lógico (&). O summary(d_intermediario$price) confirma que o máximo respeita o limiar imposto e mostra a distribuição da subamostra.

Filtro 3 — condição categórica com %in%

Selecionamos apenas diamantes com cortes considerados de alta qualidade (Premium e Ideal), usando o operador %in% para listar mais de um valor de fator.

d_premium_ideal <- diamonds |>
  filter(cut %in% c("Premium", "Ideal"))

d_premium_ideal |>
  count(cut)

Resultado: o count() confirma o número de observações em cada nível do fator. O filtro categórico é útil quando queremos comparar grupos específicos sem incluir os demais.

Filtro 4 — combinação numérica + categórica

Por fim, combinamos um filtro numérico e um categórico: cortes Ideal com color entre os melhores níveis (D, E, F) e preço menor que 10.000. Esse filtro responde a uma pergunta concreta: quais diamantes “topo de linha” estão acessíveis nesse intervalo de preço?

d_topo <- diamonds |>
  filter(cut == "Ideal",
         color %in% c("D", "E", "F"),
         price < 10000)

nrow(d_topo)
## [1] 9921
head(d_topo, 10)

Leitura final: sobraram 9.921 registros que atendem simultaneamente às três condições. A filtragem é a operação dplyr mais simples para transformar uma pergunta de negócio em um subconjunto de dados pronto para visualização ou modelagem.

2) Tabela DT

Para demonstrar ordenação, busca e paginação, partimos de um subconjunto filtrado e tomamos uma amostra reprodutível de 1.000 linhas (semente fixa). A tabela é renderizada com DT::datatable().

set.seed(42)

dt_amostra <- diamonds |>
  filter(carat >= 0.5, price < 18000) |>
  slice_sample(n = 1000)

DT::datatable(
  dt_amostra,
  filter = "top",
  options = list(
    pageLength = 10,
    lengthMenu = c(5, 10, 25, 50),
    scrollX = TRUE,
    deferRender = TRUE
  )
) |>
  formatCurrency(columns = "price", currency = "$", digits = 0) |>
  formatRound(columns = c("carat", "depth", "table", "x", "y", "z"), digits = 2)

Como usar: na parte superior da tabela, use os controles para filtrar colunas, ordenar clicando no cabeçalho e mudar de página ou o número de linhas exibidas.

3) Equações

As equações abaixo aparecem frequentemente em inferência estatística e complementam a leitura sobre modelos e testes.

1. Densidade da distribuição Normal

\[ f(x \mid \mu, \sigma^2) = \frac{1}{\sigma\sqrt{2\pi}} \exp\!\left( -\frac{(x-\mu)^2}{2\sigma^2} \right) \]

Significado: \(f(x \mid \mu, \sigma^2)\) é a densidade da Normal com média \(\mu\) e variância \(\sigma^2\); descreve a probabilidade relativa de valores próximos da média versus caudas.

2. Log-verossimilhança amostral (Normal i.i.d.)

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

Significado: \(\ell\) é a log-verossimilhança dos dados \(x_1,\ldots,x_n\) assumindo observações independentes e identicamente distribuídas Normal\((\mu,\sigma^2)\); maximizar \(\ell\) em relação a \(\mu\) e \(\sigma^2\) produz estimadores de máxima verossimilhança.

3. Estatística t (teste da média com variância desconhecida)

\[ T = \frac{\bar{X} - \mu_0}{S/\sqrt{n}} \sim t_{n-1} \]

Significado: \(\bar{X}\) é a média amostral, \(\mu_0\) é a média sob a hipótese nula, \(S\) é o desvio-padrão amostral e \(n\) o tamanho da amostra; sob pressupostos gaussianos, \(T\) segue a \(t\) de Student com \(n-1\) graus de liberdade.

4. Intervalo de confiança para a média (variância desconhecida)

\[ \bar{X} \pm t_{\alpha/2,\,n-1}\, \frac{S}{\sqrt{n}} \]

Significado: Intervalo com coeficiente aproximado \(1-\alpha\) para a média populacional quando usamos o quantil \(t_{\alpha/2,\,n-1}\); interpretação frequente: método que, repetido, cobre o parâmetro em uma fração próxima de \(1-\alpha\) dos casos.

5. Estatística \(F\) na ANOVA (um fator)

\[ F = \frac{\dfrac{1}{k-1}\sum_{j=1}^{k} n_j(\bar{X}_j - \bar{X})^2}{\dfrac{1}{N-k}\sum_{j=1}^{k}\sum_{i=1}^{n_j}(X_{ij}-\bar{X}_j)^2} \]

Significado: Razão entre variabilidade entre grupos (numerador) e dentro dos grupos (denominador), com \(k\) grupos, tamanhos \(n_j\) e médias \(\bar{X}_j\); valores grandes sugerem diferenças entre médias de grupos sob pressupostos do modelo linear normal.

4) Figuras

Figuras relacionadas à ciência de dados. Dois diagramas amplamente usados para descrever o ciclo de trabalho de projetos de Ciência de Dados.

Ciclo CRISP-DM

O CRISP-DM (Cross Industry Standard Process for Data Mining) organiza projetos de mineração de dados em fases iterativas: compreensão do negócio e dos dados, preparação, modelagem, avaliação e implantação.

Diagrama do processo CRISP-DM (ciclo de vida comum em projetos de ciência de dados e mineração de dados). Fonte: www.dataimd.com
Diagrama do processo CRISP-DM (ciclo de vida comum em projetos de ciência de dados e mineração de dados). Fonte: www.dataimd.com

Fluxo proposto em R for Data Science

Hadley Wickham e Garrett Grolemund propõem um encadeamento prático: importar, organizar (tidy), transformar, visualizar, modelar e comunicar (Wickham and Grolemund 2017).

Fluxo de trabalho em ciência de dados com R (importar, arrumar, transformar, visualizar, modelar, comunicar). Fonte: R for Data Science.
Fluxo de trabalho em ciência de dados com R (importar, arrumar, transformar, visualizar, modelar, comunicar). Fonte: R for Data Science.

5) Referências

As cinco obras listadas a seguir cobrem desde comunicação técnica em R Markdown até aprendizado estatístico e análise exploratória, sustentando as escolhas feitas neste exercício.

Hastie, Trevor, Robert Tibshirani, and Jerome Friedman. 2009. The Elements of Statistical Learning: Data Mining, Inference, and Prediction. 2nd ed. Springer Series in Statistics. New York, NY: Springer.
James, Gareth, Daniela Witten, Trevor Hastie, and Robert Tibshirani. 2021. An Introduction to Statistical Learning with Applications in r. 2nd ed. Springer Texts in Statistics. New York, NY: Springer.
Tukey, John W. 1977. Exploratory Data Analysis. Reading, MA: Addison-Wesley.
Wickham, Hadley, and Garrett Grolemund. 2017. R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. Sebastopol, CA: O’Reilly Media. https://r4ds.had.co.nz.
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. R Markdown: The Definitive Guide. Boca Raton, FL: Chapman; Hall/CRC. https://bookdown.org/yihui/rmarkdown/.