Exercício 11: manipulação de dados com o conjunto
diamonds.
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.
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.
## 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.…
## 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.
Selecionamos apenas diamantes com peso (carat)
maior ou igual a 1,0, separando o segmento de pedras
maiores.
## [1] 19060
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.
&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
## 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.
%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.
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.
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
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.
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.
As equações abaixo aparecem frequentemente em inferência estatística e complementam a leitura sobre modelos e testes.
\[ 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.
\[ \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.
\[ 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.
\[ \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.
\[ 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.
Figuras relacionadas à ciência de dados. Dois diagramas amplamente usados para descrever o ciclo de trabalho de projetos de Ciência de Dados.
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.
Hadley Wickham e Garrett Grolemund propõem um encadeamento prático: importar, organizar (tidy), transformar, visualizar, modelar e comunicar (Wickham and Grolemund 2017).
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.