Este relatório apresenta uma análise exploratória reprodutível: carregamento e manipulação de dados, tabela interativa, fundamentos matemáticos, visualizações e referências. Cada requisito da atividade possui uma aba própria.

Objetivo: observar como as medidas das flores variam entre espécies e demonstrar operações simples de preparação de dados. Não serão ajustados modelos preditivos; as equações da terceira aba são apresentadas como fundamentos teóricos.

Relatório

1. Dados e manipulação

1.1. Carregamento e descrição

Utiliza-se iris, disponível no pacote datasets, que acompanha a instalação do R. Segundo a documentação oficial [1], o conjunto contém 150 flores, distribuídas igualmente entre três espécies, e quatro medidas em centímetros. Não é necessário baixar uma base externa.

# Carrega a base e cria uma cópia para preservar o conjunto original.
data("iris", package = "datasets")
dados <- iris

# Identificador que mantém a ligação com a linha original após a ordenação.
dados$id_flor <- seq_len(nrow(dados))

# Dimensões, tipos de variáveis e primeiras observações.
dim(iris)
## [1] 150   5
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
head(dados)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species id_flor
## 1          5.1         3.5          1.4         0.2  setosa       1
## 2          4.9         3.0          1.4         0.2  setosa       2
## 3          4.7         3.2          1.3         0.2  setosa       3
## 4          4.6         3.1          1.5         0.2  setosa       4
## 5          5.0         3.6          1.4         0.2  setosa       5
## 6          5.4         3.9          1.7         0.4  setosa       6

A base original possui 150 observações e 5 variáveis. As quatro medidas são numéricas; Species é um fator com três categorias. O identificador acrescentado não representa uma medida biológica.

Variável original Significado Unidade/tipo
Sepal.Length Comprimento da sépala cm
Sepal.Width Largura da sépala cm
Petal.Length Comprimento da pétala cm
Petal.Width Largura da pétala cm
Species Espécie da flor setosa, versicolor ou virginica

1.2. Verificação inicial

Antes das transformações, verificam-se valores ausentes, frequência das espécies e estatísticas descritivas. Valores ausentes poderiam afetar filtros e médias.

# Quantidade de valores ausentes em cada coluna.
colSums(is.na(dados))
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species      id_flor 
##            0            0            0            0            0            0
# Número de flores por espécie.
table(dados$Species)
## 
##     setosa versicolor  virginica 
##         50         50         50
# Mínimo, quartis, mediana, média e máximo das medidas.
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500

Foram encontrados 0 valores ausentes. Cada espécie possui 50 observações. O comprimento da pétala varia de 1,0 a 6,9 cm. As verificações permitem seguir com a transformação sem imputação nesta base.

1.3. Criação de duas variáveis

Criam-se um indicador de tamanho da pétala e uma razão entre medidas da sépala. As operações são vetorizadas: o R calcula o resultado para todas as linhas.

# Produto comprimento x largura da pétala: indicador em cm².
dados$area_proxy_petala <- dados$Petal.Length * dados$Petal.Width

# Razão sem unidade; valores maiores indicam sépalas mais alongadas.
stopifnot(all(dados$Sepal.Width > 0))
dados$razao_sepala <- dados$Sepal.Length / dados$Sepal.Width

head(dados[, c("id_flor", "Species", "area_proxy_petala", "razao_sepala")])
##   id_flor Species area_proxy_petala razao_sepala
## 1       1  setosa              0.28     1.457143
## 2       2  setosa              0.28     1.633333
## 3       3  setosa              0.26     1.468750
## 4       4  setosa              0.30     1.483871
## 5       5  setosa              0.28     1.388889
## 6       6  setosa              0.68     1.384615

Interpretação: area_proxy_petala é o produto das duas medidas, e não uma medição da área real da pétala, que não possui necessariamente forma retangular. Para a primeira flor, o produto é 1,4 × 0,2 = 0,28 cm². Sua razão da sépala é 1,46, indicando comprimento maior que largura. A base passa a ter 8 colunas.

1.4. Filtragem

Selecionam-se flores com comprimento de pétala maior ou igual a 5 cm. O limite é uma escolha didática para explorar pétalas compridas, sem pretensão de representar uma regra de classificação validada.

# Mantém somente as linhas que satisfazem a condição.
filtrados <- dados[dados$Petal.Length >= 5, ]

# Compara o tamanho da base antes e depois do filtro.
data.frame(
  etapa = c("Base completa", "Pétala >= 5 cm"),
  observacoes = c(nrow(dados), nrow(filtrados))
)
##            etapa observacoes
## 1  Base completa         150
## 2 Pétala >= 5 cm          46
table(filtrados$Species)
## 
##     setosa versicolor  virginica 
##          0          2         44

O filtro mantém 46 de 150 flores (30,7%). Permanecem 2 flores versicolor e 44 virginica; nenhuma setosa satisfaz o critério. O fator ainda mantém os três níveis, por isso table() exibe setosa com frequência zero. Os resultados seguintes do subconjunto descrevem apenas as flores selecionadas, e não toda a base.

1.5. Ordenação

Organizam-se as flores selecionadas do maior para o menor indicador de tamanho da pétala. O identificador original resolve eventuais empates de maneira estável.

# O sinal negativo produz ordem decrescente para o indicador de tamanho.
ordenados <- filtrados[
  order(-filtrados$area_proxy_petala, filtrados$id_flor),
]
rownames(ordenados) <- NULL

head(ordenados[, c(
  "id_flor", "Species", "Petal.Length", "Petal.Width", "area_proxy_petala"
)], 10)
##    id_flor   Species Petal.Length Petal.Width area_proxy_petala
## 1      119 virginica          6.9         2.3             15.87
## 2      110 virginica          6.1         2.5             15.25
## 3      101 virginica          6.0         2.5             15.00
## 4      118 virginica          6.7         2.2             14.74
## 5      145 virginica          5.7         2.5             14.25
## 6      136 virginica          6.1         2.3             14.03
## 7      106 virginica          6.6         2.1             13.86
## 8      144 virginica          5.9         2.3             13.57
## 9      137 virginica          5.6         2.4             13.44
## 10     141 virginica          5.6         2.4             13.44

A primeira linha corresponde à flor de identificador 119, da espécie virginica, com indicador de tamanho 15,87 cm². A ordenação muda a posição das linhas, mas não altera os valores nem o número de flores. A aba 2 permite investigar todo esse subconjunto.

1.6. Resumo por espécie e interpretação

Calculam-se médias na base completa, para comparar as três espécies sem o efeito da seleção por comprimento de pétala.

# Médias das medidas e do indicador de tamanho, agrupadas por espécie.
resumo <- aggregate(
  cbind(Petal.Length, Petal.Width, area_proxy_petala) ~ Species,
  data = dados,
  FUN = mean
)

# Contagem de observações em cada grupo.
resumo$n <- as.integer(table(dados$Species)[as.character(resumo$Species)])

knitr::kable(
  resumo[, c("Species", "n", "Petal.Length", "Petal.Width", "area_proxy_petala")],
  digits = 3,
  col.names = c("Espécie", "n", "Compr. pétala (cm)", "Larg. pétala (cm)",
                "Indicador de tamanho (cm²)"),
  caption = "Tabela 1 — Médias por espécie na base completa."
)
Tabela 1 — Médias por espécie na base completa.
Espécie n Compr. pétala (cm) Larg. pétala (cm) Indicador de tamanho (cm²)
setosa 50 1.462 0.246 0.366
versicolor 50 4.260 1.326 5.720
virginica 50 5.552 2.026 11.296

O comprimento médio das pétalas é 1,462 cm em setosa, 4,260 cm em versicolor e 5,552 cm em virginica. Assim, virginica apresenta a maior média dessa medida na amostra. Essas diferenças são descritivas; não demonstram causalidade nem a qualidade de um modelo de previsão. As figuras da aba 4 ajudam a observar a dispersão e a sobreposição entre grupos [4, 5].

2. Tabela interativa

A tabela abaixo usa o pacote DT, uma interface do R para a biblioteca DataTables [2]. Mostra as 46 flores filtradas e as variáveis criadas na aba anterior. A ordenação inicial segue o indicador de tamanho da pétala, em ordem decrescente.

Como explorar: clique no título de uma coluna para ordenar; digite virginica no campo Buscar; use os filtros abaixo dos títulos para restringir uma coluna; escolha 5, 10 ou 20 linhas por página; avance pelas páginas no rodapé. Os filtros da interface alteram a visualização da tabela, sem recalcular as análises das outras abas.

DT::datatable(
  ordenados,
  rownames = FALSE,
  filter = "top",
  class = "stripe hover compact",
  colnames = c(
    "Compr. sépala (cm)", "Larg. sépala (cm)",
    "Compr. pétala (cm)", "Larg. pétala (cm)", "Espécie",
    "ID da flor", "Indicador pétala (cm²)", "Razão sépala"
  ),
  caption = "Tabela 2 — Flores com comprimento de pétala >= 5 cm.",
  options = list(
    pageLength = 10,
    lengthMenu = c(5, 10, 20),
    searching = TRUE,
    ordering = TRUE,
    paging = TRUE,
    scrollX = TRUE,
    # DataTables usa índices a partir de zero: colunas 7 e 6 do R.
    order = list(list(6, "desc"), list(5, "asc")),
    language = list(
      search = "Buscar:",
      lengthMenu = "Mostrar _MENU_ linhas por página",
      info = "Exibindo _START_ a _END_ de _TOTAL_ flores",
      infoEmpty = "Nenhuma flor disponível",
      infoFiltered = "(filtrado de _MAX_ flores)",
      zeroRecords = "Nenhuma flor corresponde à busca",
      emptyTable = "Tabela sem dados",
      paginate = list(first = "Primeira", previous = "Anterior",
                      "next" = "Próxima", last = "Última")
    )
  )
) |>
  DT::formatRound(c("area_proxy_petala", "razao_sepala"), digits = 2)

3. Equações em LaTeX

As cinco equações a seguir representam métodos importantes da ciência de dados [4, 5]. Foram escritas entre delimitadores $$ com sintaxe LaTeX. No HTML, MathJax apresenta a notação matemática. Elas são fundamentos teóricos e não resultados de modelos ajustados neste relatório.

Equação 1 — Regressão ridge

\[ (\widehat{\beta}_0,\widehat{\boldsymbol{\beta}}) =\underset{\beta_0,\boldsymbol{\beta}}{\operatorname{arg\,min}} \left\{\frac{1}{n}\sum_{i=1}^{n} \left(y_i-\beta_0-\sum_{j=1}^{p}x_{ij}\beta_j\right)^2 +\lambda\sum_{j=1}^{p}\beta_j^2\right\}. \]

Significado: encontra coeficientes que equilibram erro de previsão e penalização de sua magnitude. \(n\) é o número de observações, \(p\) o número de preditores, \(y_i\) a resposta e \(x_{ij}\) o preditor \(j\) da observação \(i\). \(\beta_0\) é o intercepto, \(\beta_j\) são os coeficientes e \(\lambda\geq0\) controla a regularização. O intercepto não é penalizado. É usual padronizar os preditores antes desse ajuste. No contexto de iris, poderia prever comprimento de pétala a partir de outras medidas [4, 5].

Equação 2 — Classificação multinomial com softmax

\[ P(Y_i=k\mid\mathbf{x}_i) =\frac{\exp\left(\beta_{k0}+\mathbf{x}_i^{\mathsf T}\boldsymbol{\beta}_k\right)} {\displaystyle\sum_{\ell=1}^{K} \exp\left(\beta_{\ell0}+\mathbf{x}_i^{\mathsf T}\boldsymbol{\beta}_\ell\right)}, \qquad k=1,\ldots,K. \]

Significado: transforma escores lineares em probabilidades de classes, que somam 1. \(\mathbf{x}_i\) é o vetor de medidas, \(K\) o número de classes e \(\beta_{k0},\boldsymbol{\beta}_k\) os parâmetros da classe \(k\). Para identificar os parâmetros, uma classe pode ser adotada como referência, com seus coeficientes iguais a zero. Em iris, \(K=3\) e as classes seriam as três espécies. A classe com maior probabilidade pode ser escolhida como previsão [4, 5].

Equação 3 — Inferência bayesiana para parâmetros

\[ p(\boldsymbol{\theta}\mid\mathcal{D}) =\frac{p(\mathcal{D}\mid\boldsymbol{\theta})\,p(\boldsymbol{\theta})} {\displaystyle\int_{\Theta} p(\mathcal{D}\mid\mathbf{u})\,p(\mathbf{u})\,d\mathbf{u}}. \]

Significado: atualiza a distribuição de um parâmetro após observar dados. \(\mathcal{D}\) representa os dados; \(\boldsymbol{\theta}\) os parâmetros; \(p(\boldsymbol{\theta})\) a distribuição a priori; \(p(\mathcal{D}\mid\boldsymbol{\theta})\) a verossimilhança; e \(p(\boldsymbol{\theta}\mid\mathcal{D})\) a distribuição a posteriori. O denominador integra sobre o espaço de parâmetros \(\Theta\) e normaliza a distribuição, supondo que essa integral seja finita e positiva. Essa formulação permite expressar incerteza sobre parâmetros de um modelo para as flores [5].

Equação 4 — Objetivo do agrupamento k-means

\[ \underset{C_1,\ldots,C_K,\boldsymbol{\mu}_1,\ldots,\boldsymbol{\mu}_K} {\operatorname{min}} \sum_{k=1}^{K}\sum_{i\in C_k} \left\|\mathbf{x}_i-\boldsymbol{\mu}_k\right\|_2^2, \qquad \boldsymbol{\mu}_k=\frac{1}{|C_k|}\sum_{i\in C_k}\mathbf{x}_i. \]

Significado: procura grupos compactos ao minimizar a soma das distâncias quadráticas de cada observação ao centro do seu grupo. \(C_k\) são grupos não vazios que particionam as observações; \(|C_k|\) é a quantidade de elementos; \(\boldsymbol{\mu}_k\) é o centroide; e \(\|\cdot\|_2\) é a norma euclidiana. O algoritmo usual alterna atribuições e centroides, podendo chegar a um mínimo local. As medidas de iris poderiam ser agrupadas sem usar Species, mas os grupos não necessariamente coincidiriam com as espécies. A escala das variáveis afeta as distâncias [4, 5].

Equação 5 — Análise de componentes principais (PCA)

\[ \mathbf{S}=\frac{1}{n-1}\mathbf{X}_c^{\mathsf T}\mathbf{X}_c, \qquad \mathbf{S}\mathbf{v}_j=\lambda_j\mathbf{v}_j, \qquad \mathbf{z}_j=\mathbf{X}_c\mathbf{v}_j, \qquad \operatorname{PVE}_j=\frac{\lambda_j}{\sum_{\ell=1}^{p}\lambda_\ell}. \]

Significado: constrói combinações lineares das variáveis que resumem sua variabilidade. \(\mathbf{X}_c\) é a matriz \(n\times p\) com colunas centradas e \(\mathbf{S}\) sua matriz de covariância. \(\mathbf{v}_j\) é um autovetor unitário, \(\lambda_j\) seu autovalor e \(\mathbf{z}_j\) o vetor de escores do componente \(j\). Os autovalores são ordenados do maior para o menor. \(\operatorname{PVE}_j\) é a proporção de variância explicada, supondo variância total positiva. Caso as colunas também sejam padronizadas, a análise usa a matriz de correlação. PCA poderia reduzir as quatro medidas de iris a duas dimensões para exploração visual [4, 5].

4. Figuras

As duas figuras são produzidas diretamente em R a partir da base completa. São visualizações de análise exploratória, com autoria do aluno a partir dos dados do pacote datasets [1]. Não dependem de imagens externas.

Figura 1 — Dispersão das medidas da pétala

cores <- c(setosa = "#0072B2", versicolor = "#D55E00", virginica = "#009E73")
simbolos <- c(setosa = 16, versicolor = 17, virginica = 15)
especies <- as.character(dados$Species)
par(mar = c(4.5, 4.5, 2, 1))
plot(
  dados$Petal.Length, dados$Petal.Width,
  col = cores[especies], pch = simbolos[especies], cex = 1.15,
  xlab = "Comprimento da pétala (cm)",
  ylab = "Largura da pétala (cm)",
  main = "As medidas das pétalas distinguem grupos de flores",
  bty = "l"
)
grid(col = "#e5e7eb")
points(dados$Petal.Length, dados$Petal.Width,
       col = cores[especies], pch = simbolos[especies], cex = 1.15)
legend("topleft", legend = names(cores), col = cores,
       pch = simbolos, bty = "n", title = "Espécie")
Figura 1 — Comprimento e largura da pétala por espécie (n = 150). Fonte: elaboração em R com datasets::iris.

Figura 1 — Comprimento e largura da pétala por espécie (n = 150). Fonte: elaboração em R com datasets::iris.

Leitura: cada ponto representa uma flor. Comprimento e largura de pétala apresentam associação positiva no conjunto. Setosa concentra medidas menores; versicolor e virginica apresentam alguma sobreposição. Cores e símbolos diferentes ajudam a identificar as espécies. A associação visual não implica causalidade nem substitui a avaliação de um classificador em dados de teste.

Figura 2 — Distribuição do comprimento da pétala

par(mar = c(4.5, 4.5, 2, 1))
boxplot(
  Petal.Length ~ Species, data = dados,
  col = unname(cores[levels(dados$Species)]),
  border = "#263747",
  xlab = "Espécie", ylab = "Comprimento da pétala (cm)",
  main = "Diferenças de posição e dispersão entre espécies",
  bty = "l", outline = TRUE
)
abline(h = 5, lty = 2, col = "#6b7280", lwd = 1.5)
legend("topleft", legend = "Limiar do filtro: 5 cm",
       lty = 2, col = "#6b7280", bty = "n")
Figura 2 — Distribuição do comprimento da pétala por espécie, com 50 flores em cada grupo. Fonte: elaboração em R com datasets::iris.

Figura 2 — Distribuição do comprimento da pétala por espécie, com 50 flores em cada grupo. Fonte: elaboração em R com datasets::iris.

Leitura: a linha dentro de cada caixa indica a mediana; a caixa vai do primeiro ao terceiro quartil. Os bigodes alcançam as observações mais extremas dentro de 1,5 vezes a amplitude interquartil, e pontos além deles aparecem separadamente. Virginica tem mediana maior que as outras espécies. A linha tracejada mostra o limite usado no filtro da aba 1: todas as setosa ficam abaixo dele, enquanto parte das demais espécies pode ser selecionada. Os gráficos apoiam a comparação descritiva dos grupos [4, 5].

5. Referências

Foram consultadas cinco fontes, com links para a documentação oficial, o livro de seus autores ou a página da editora. As referências [1–3] apoiam o uso dos dados e das ferramentas; [4–5] fundamentam os métodos matemáticos e a análise exploratória. Data de acesso: 10 out. 2026.

  1. R CORE TEAM. Edgar Anderson’s Iris Data. Documentação do pacote datasets, s.d. Disponível em: documentação de iris.

  2. POSIT / RSTUDIO. DT: An R interface to the DataTables library. Documentação do pacote, s.d. Disponível em: documentação do DT.

  3. XIE, Yihui; ALLAIRE, J. J.; GROLEMUND, Garrett. R Markdown: The Definitive Guide. Boca Raton: Chapman & Hall/CRC, 2018. Versão online atualizada disponível em: livro dos autores.

  4. JAMES, Gareth; WITTEN, Daniela; HASTIE, Trevor; TIBSHIRANI, Robert. An Introduction to Statistical Learning: with Applications in R.

    1. ed. New York: Springer, 2021. DOI: 10.1007/978-1-0716-1418-1.
  5. HASTIE, Trevor; TIBSHIRANI, Robert; FRIEDMAN, Jerome. The Elements of Statistical Learning: Data Mining, Inference, and Prediction.

    1. ed. New York: Springer, 2009. DOI: 10.1007/978-0-387-84858-7.

Reprodutibilidade

O documento foi organizado conforme os recursos de R Markdown descritos em [3]. Para gerar o HTML, abra este arquivo no RStudio e selecione Knit → Knit to HTML. Instale previamente os pacotes, caso necessário:

install.packages(c("rmarkdown", "knitr", "DT"))
rmarkdown::render("relatorio_ciencia_de_dados.Rmd", encoding = "UTF-8")

O formato HTML mantém as abas, a busca, a paginação e a ordenação da tabela. É necessário permitir JavaScript no navegador; as equações utilizam MathJax e podem precisar de conexão à internet na abertura do HTML.

# Registra a versão do R e dos pacotes usados na geração.
sessionInfo()
## R version 4.6.1 (2026-06-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26300)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Portuguese_Brazil.utf8  LC_CTYPE=Portuguese_Brazil.utf8   
## [3] LC_MONETARY=Portuguese_Brazil.utf8 LC_NUMERIC=C                      
## [5] LC_TIME=Portuguese_Brazil.utf8    
## 
## time zone: America/Fortaleza
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] DT_0.34.0
## 
## loaded via a namespace (and not attached):
##  [1] digest_0.6.39     R6_2.6.1          fastmap_1.2.0     xfun_0.61        
##  [5] magrittr_2.0.5    cachem_1.1.0      knitr_1.52        htmltools_0.5.9  
##  [9] rmarkdown_2.32    lifecycle_1.0.5   cli_3.6.6         sass_0.4.10      
## [13] jquerylib_0.1.4   compiler_4.6.1    tools_4.6.1       evaluate_1.0.5   
## [17] bslib_0.12.0      yaml_2.3.12       otel_0.2.0        htmlwidgets_1.6.4
## [21] rlang_1.3.0       jsonlite_2.0.0    crosstalk_1.2.2