Primeira parte Criação do dataset com os dados fornecidos, criação da função moda pois o R não possui função nativa para calcular a moda, após isos foi feito um resumo dos dados

lotes <- data.frame(
  xi1 = c(7.100,7.100,7.120,7.115,7.090,7.110,7.105,7.100,7.065,7.125,
          7.105,7.100,7.115,7.095,7.110,7.070,7.090,7.100,7.080,7.100,
          7.095,7.105,7.100,7.100,7.120),
  xi2 = c(7.095,7.100,7.105,7.120,7.095,7.100,7.095,7.115,7.090,7.130,
          7.100,7.110,7.090,7.090,7.070,7.075,7.130,7.100,7.070,7.110,
          7.105,7.070,7.100,7.105,7.115),
  xi3 = c(7.100,7.095,7.100,7.115,7.110,7.105,7.100,7.095,7.110,7.095,
          7.115,7.085,7.085,7.095,7.095,7.080,7.100,7.090,7.090,7.070,
          7.095,7.110,7.105,7.105,7.110),
  xi4 = c(7.105,7.105,7.120,7.115,7.120,7.100,7.105,7.105,7.105,7.100,
          7.095,7.090,7.090,7.100,7.100,7.100,7.110,7.095,7.110,7.110,
          7.095,7.110,7.110,7.110,7.130)
)


moda <- function(x) {
  freq <- table(x)
  max_freq <- max(freq)
  if (max_freq == 1) return(NA)
  as.numeric(names(freq)[freq == max_freq])
}

resumo <- data.frame(
  Lote        = names(lotes),
  Media       = sapply(lotes, mean),
  Mediana     = sapply(lotes, median),
  Moda        = sapply(lotes, function(x) paste(moda(x), collapse = "; ")),
  Minimo      = sapply(lotes, min),
  Maximo      = sapply(lotes, max),
  Amplitude   = sapply(lotes, function(x) max(x) - min(x)),
  Variancia   = sapply(lotes, var),
  DesvioPad   = sapply(lotes, sd),
  CoefVar_pct = sapply(lotes, function(x) sd(x) / mean(x) * 100)
)
rownames(resumo) <- NULL


print(resumo, row.names = FALSE)
##  Lote  Media Mediana  Moda Minimo Maximo Amplitude    Variancia   DesvioPad
##   xi1 7.1006   7.100   7.1  7.065  7.125     0.060 0.0002048333 0.014312000
##   xi2 7.0994   7.100   7.1  7.070  7.130     0.060 0.0002756667 0.016603213
##   xi3 7.0982   7.100 7.095  7.070  7.115     0.045 0.0001226667 0.011075498
##   xi4 7.1054   7.105  7.11  7.090  7.130     0.040 0.0000915000 0.009565563
##  CoefVar_pct
##    0.2015604
##    0.2338678
##    0.1560325
##    0.1346239

Segunda parte Criação da tabela de frequência utilizando o metodo de sturges para a criação das classes

tabela_frequencia <- function(x, nome_lote) {
  k <- ceiling(1 + 3.322 * log10(length(x)))          
  classes <- cut(x, breaks = k, include.lowest = TRUE, right = TRUE)
  freq_abs <- table(classes)
  freq_rel <- round(prop.table(freq_abs) * 100, 2)
  freq_acum <- cumsum(freq_abs)
  tab <- data.frame(
    Classe          = names(freq_abs),
    Freq_Absoluta   = as.integer(freq_abs),
    Freq_Relativa   = as.numeric(freq_rel),
    Freq_Acumulada  = as.integer(freq_acum)
  )
  cat("\n----- Tabela de frequencias:", nome_lote, "(k =", k, "classes) -----\n")
  print(tab, row.names = FALSE)
  tab
}

tabelas <- lapply(names(lotes), function(nome) tabela_frequencia(lotes[[nome]], nome))
## 
## ----- Tabela de frequencias: xi1 (k = 6 classes) -----
##         Classe Freq_Absoluta Freq_Relativa Freq_Acumulada
##  [7.065,7.075]             2             8              2
##  (7.075,7.085]             1             4              3
##  (7.085,7.095]             4            16              7
##  (7.095,7.105]            11            44             18
##  (7.105,7.115]             4            16             22
##  (7.115,7.125]             3            12             25
## 
## ----- Tabela de frequencias: xi2 (k = 6 classes) -----
##       Classe Freq_Absoluta Freq_Relativa Freq_Acumulada
##  [7.07,7.08]             4            16              4
##  (7.08,7.09]             3            12              7
##   (7.09,7.1]             8            32             15
##   (7.1,7.11]             5            20             20
##  (7.11,7.12]             3            12             23
##  (7.12,7.13]             2             8             25
## 
## ----- Tabela de frequencias: xi3 (k = 6 classes) -----
##         Classe Freq_Absoluta Freq_Relativa Freq_Acumulada
##   [7.07,7.078]             1             4              1
##  (7.078,7.085]             3            12              4
##  (7.085,7.093]             2             8              6
##    (7.093,7.1]            10            40             16
##    (7.1,7.107]             3            12             19
##  (7.107,7.115]             6            24             25
## 
## ----- Tabela de frequencias: xi4 (k = 6 classes) -----
##         Classe Freq_Absoluta Freq_Relativa Freq_Acumulada
##   [7.09,7.097]             5            20              5
##  (7.097,7.103]             5            20             10
##   (7.103,7.11]             5            20             15
##   (7.11,7.117]             7            28             22
##  (7.117,7.123]             2             8             24
##   (7.123,7.13]             1             4             25
names(tabelas) <- names(lotes)

Diagrama de pareto Seção dedicada a criação do diagrama de pareto

diagrama_pareto <- function(tab, nome_lote, arquivo) {
  tab_ord <- tab[order(-tab$Freq_Absoluta), ]
  tab_ord$Perc_Acum <- cumsum(tab_ord$Freq_Absoluta) / sum(tab_ord$Freq_Absoluta) * 100

  png(arquivo, width = 900, height = 650, res = 120)
  par(mar = c(8, 4, 3, 4))
  bp <- barplot(tab_ord$Freq_Absoluta,
                names.arg = tab_ord$Classe,
                las = 2,
                col = "steelblue",
                ylim = c(0, max(tab_ord$Freq_Absoluta) * 1.25),
                ylab = "Frequencia absoluta",
                main = paste("Diagrama de Pareto -", nome_lote))
  par(new = TRUE)
  plot(bp, tab_ord$Perc_Acum, type = "b", pch = 19, col = "firebrick",
       axes = FALSE, xlab = "", ylab = "", ylim = c(0, 110))
  axis(4, at = seq(0, 100, 20))
  mtext("Percentual acumulado (%)", side = 4, line = 2.5)
  abline(h = 80, col = "darkgray", lty = 2)
  dev.off()
}

invisible(mapply(function(tab, nome) {
  arquivo <- paste0("pareto_", nome, ".png")
  diagrama_pareto(tab, nome, arquivo)
  cat("Diagrama de Pareto salvo em:", arquivo, "\n")
}, tabelas, names(tabelas)))
## Diagrama de Pareto salvo em: pareto_xi1.png
## Diagrama de Pareto salvo em: pareto_xi2.png
## Diagrama de Pareto salvo em: pareto_xi3.png
## Diagrama de Pareto salvo em: pareto_xi4.png