Este es un modelo ejemplo de hipótesis de mínima del trabajo presentado para aprobar el curso.
Lo ideal sería tener un trabajo tipo artículo científico (paper) en el que emplees algunos de los métodos desarrollados en el curso, pero si no es posible conseguirlo en el tiempo estipulado te pido que lo publiques aquí.
Si me das tu autorización los mejores trabajos puedo subirlos a la biblioteca y otorgarles in DOI. En ese caso la universidad me pide que algún profesor de la UNCuyo aparezca como co-autor (ultimo autor)
Todos los trabajos deberán tener además una copia del código fuente (Rmd) conjunto de datos y versiones anterióres del código en GitHub.
Utiliza el preambulo de Rmd que tiene este trabajo para que aparezca el índice de contenidos.
Crearemos un dataset ficticio utilizando distribuciones de probabilidad que ya tiene R
# Cargar librerías necesarias (instalar si no están)
# install.packages("randomForest")
# install.packages("dplyr")
library(randomForest)
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:randomForest':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Fijar una semilla para reproducibilidad
#set.seed(123)
# Número de observaciones
n <- 200
# Generar datos sintéticos
datos_mantenimiento <- data.frame(
Tiempo_Funcionamiento_Horas = round(rnorm(n, mean = 1500, sd = 500)),
Operario = sample(c("Operario_A", "Operario_B", "Operario_C"), n, replace = TRUE),
Piezas_Producidas = round(rnorm(n, mean = 25000, sd = 10000)),
Pronostico_Fecha_Prox_Mant = as.Date("2026-01-01") + sample(1:100, n, replace = TRUE),
Falla_Presentada = sample(c("Desgaste_natural", "Fallo_electronico", "Fallo_mecanico", "Error_operativo"), n, replace = TRUE),
Costo_Reparacion_USD = round(rnorm(n, mean = 500, sd = 200)),
Vibracion_mm_s = rnorm(n, mean = 3.5, sd = 1.5), # Columna adicional interesante
Temperatura_C = rnorm(n, mean = 65, sd = 10), # Columna adicional interesante
Familia_Equipo = sample(c("Bomba", "Ventilador", "Motor_Electrico", "Compresor"), n, replace = TRUE) # Variable objetivo
)
# Asegurar que las variables categóricas sean factores
datos_mantenimiento$Operario <- as.factor(datos_mantenimiento$Operario)
datos_mantenimiento$Falla_Presentada <- as.factor(datos_mantenimiento$Falla_Presentada)
datos_mantenimiento$Familia_Equipo <- as.factor(datos_mantenimiento$Familia_Equipo)
# Mostrar las primeras filas del dataset
head(datos_mantenimiento)
## Tiempo_Funcionamiento_Horas Operario Piezas_Producidas
## 1 2090 Operario_C 37902
## 2 1652 Operario_A 26709
## 3 1402 Operario_C 37588
## 4 1268 Operario_A 22084
## 5 999 Operario_B 32368
## 6 975 Operario_A 3089
## Pronostico_Fecha_Prox_Mant Falla_Presentada Costo_Reparacion_USD
## 1 2026-03-20 Error_operativo 237
## 2 2026-01-27 Desgaste_natural 638
## 3 2026-02-19 Error_operativo 843
## 4 2026-01-26 Desgaste_natural 174
## 5 2026-02-18 Fallo_electronico 378
## 6 2026-01-06 Error_operativo 763
## Vibracion_mm_s Temperatura_C Familia_Equipo
## 1 2.600083 66.71456 Motor_Electrico
## 2 3.241373 70.71830 Ventilador
## 3 1.064169 63.45398 Bomba
## 4 5.230549 61.50585 Compresor
## 5 3.398048 77.14854 Bomba
## 6 4.748960 71.49551 Motor_Electrico
# División de datos
indices_entrenamiento <- sample(1:nrow(datos_mantenimiento), 0.7 * nrow(datos_mantenimiento))
datos_entrenamiento <- datos_mantenimiento[indices_entrenamiento, ]
datos_prueba <- datos_mantenimiento[-indices_entrenamiento, ]
indices_entrenamiento
## [1] 67 25 184 116 53 140 93 153 43 59 102 190 111 48 191 31 149 178
## [19] 189 108 74 56 45 38 23 6 174 124 135 180 36 141 103 16 152 20
## [37] 8 66 109 1 147 2 134 52 166 117 60 55 61 185 192 32 154 71
## [55] 34 173 62 29 195 49 80 88 183 119 22 28 165 179 86 21 96 70
## [73] 12 57 64 198 40 44 13 157 77 182 105 160 194 42 139 113 69 7
## [91] 81 122 155 132 188 114 129 200 171 19 26 177 150 168 106 95 110 138
## [109] 14 158 118 136 169 82 35 156 54 126 131 72 167 24 148 87 172 170
## [127] 33 159 73 17 91 128 115 199 186 142 11 133 5 4
Se utiliza la función randomForest() del paquete randomForest. Por defecto, construye 500 árboles de decisión. Nota Importante: La columna Pronostico_Fecha_Prox_Mant se excluye del entrenamiento ya que es un valor de fecha que no aporta información de clasificación directa a menos que se extraigan características como el mes, día de la semana, etc.
# Entrenar el modelo
# La sintaxis es Familia_Equipo ~ . (predecir Familia_Equipo usando todas las demás variables)
# Se excluye la columna de fecha por simplicidad en este ejemplo
modelo_rf <- randomForest(Falla_Presentada ~ Tiempo_Funcionamiento_Horas + Operario +
Piezas_Producidas + Familia_Equipo + Costo_Reparacion_USD +
Vibracion_mm_s + Temperatura_C,
data = datos_entrenamiento,
ntree = 500, # Número de árboles
importance = TRUE) # Calcular importancia de variables
# Ver un resumen del modelo
print(modelo_rf)
##
## Call:
## randomForest(formula = Falla_Presentada ~ Tiempo_Funcionamiento_Horas + Operario + Piezas_Producidas + Familia_Equipo + Costo_Reparacion_USD + Vibracion_mm_s + Temperatura_C, data = datos_entrenamiento, ntree = 500, importance = TRUE)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 2
##
## OOB estimate of error rate: 71.43%
## Confusion matrix:
## Desgaste_natural Error_operativo Fallo_electronico
## Desgaste_natural 4 9 4
## Error_operativo 3 13 10
## Fallo_electronico 2 9 5
## Fallo_mecanico 1 13 12
## Fallo_mecanico class.error
## Desgaste_natural 10 0.8518519
## Error_operativo 11 0.6486486
## Fallo_electronico 16 0.8437500
## Fallo_mecanico 18 0.5909091
Se utiliza el modelo entrenado para predecir la familia de equipo en los datos de prueba y se evalúa su rendimiento.
# Realizar predicciones en el conjunto de prueba
predicciones <- predict(modelo_rf, newdata = datos_prueba)
# Crear una matriz de confusión para evaluar la precisión
matriz_confusion <- table(Datos_Reales = datos_prueba$Familia_Equipo, Predicciones = predicciones)
print(matriz_confusion)
## Predicciones
## Datos_Reales Desgaste_natural Error_operativo Fallo_electronico
## Bomba 1 6 4
## Compresor 1 3 1
## Motor_Electrico 0 2 4
## Ventilador 3 0 3
## Predicciones
## Datos_Reales Fallo_mecanico
## Bomba 10
## Compresor 9
## Motor_Electrico 7
## Ventilador 6
# Calcular la precisión general
precision <- sum(diag(matriz_confusion)) / sum(matriz_confusion)
cat("Precisión del modelo:", precision, "\n")
## Precisión del modelo: 0.2333333
Random Forest permite ver qué variables fueron más importantes para tomar las decisiones de clasificación.
# Mostrar la importancia de las variables
importancia <- importance(modelo_rf)
print(importancia)
## Desgaste_natural Error_operativo Fallo_electronico
## Tiempo_Funcionamiento_Horas 2.6374377 -0.5539971 -1.93286919
## Operario 0.2388746 1.6387342 0.02594127
## Piezas_Producidas 2.4078019 -1.2029312 -1.32847188
## Familia_Equipo 0.6453040 2.6076976 -3.05438766
## Costo_Reparacion_USD 4.5535025 0.7634015 0.62503094
## Vibracion_mm_s -0.8482376 1.8281170 0.65169975
## Temperatura_C -5.3697048 -0.1318688 1.64066296
## Fallo_mecanico MeanDecreaseAccuracy
## Tiempo_Funcionamiento_Horas -1.5361375 -1.1376786
## Operario -3.0678862 -0.9531902
## Piezas_Producidas 2.5762136 1.1970604
## Familia_Equipo 3.2760023 2.3084396
## Costo_Reparacion_USD 0.1896795 2.6347503
## Vibracion_mm_s 4.2385872 3.5022211
## Temperatura_C -0.1430643 -1.8089785
## MeanDecreaseGini
## Tiempo_Funcionamiento_Horas 17.540200
## Operario 5.954963
## Piezas_Producidas 17.490875
## Familia_Equipo 9.200833
## Costo_Reparacion_USD 17.920656
## Vibracion_mm_s 17.960408
## Temperatura_C 16.944842
# Visualizar la importancia de las variables
varImpPlot(modelo_rf)
# Instalar si es necesario
# install.packages("ggplot2")
# install.packages("tibble") # útil para convertir la matriz a dataframe fácilmente
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following object is masked from 'package:randomForest':
##
## margin
library(tibble)
library(dplyr)
La función importance() devuelve una matriz. Debemos convertirla en un data.frame manejable y extraer la métrica que nos interesa visualizar (comúnmente %IncMSE para regresión o MeanDecreaseGini para clasificación). En este caso, usaremos MeanDecreaseGini que mide cuánto reduce el Gini la variable en promedio.
# Extraer la importancia y convertirla en un data frame
df_importancia <- as.data.frame(importance(modelo_rf, scale = TRUE)) %>%
rownames_to_column(var = "Variable") %>%
arrange(desc(MeanDecreaseGini)) # Ordenar por importancia descendente
# Mostrar los datos de importancia preparados
print(df_importancia)
## Variable Desgaste_natural Error_operativo
## 1 Vibracion_mm_s -0.8482376 1.8281170
## 2 Costo_Reparacion_USD 4.5535025 0.7634015
## 3 Tiempo_Funcionamiento_Horas 2.6374377 -0.5539971
## 4 Piezas_Producidas 2.4078019 -1.2029312
## 5 Temperatura_C -5.3697048 -0.1318688
## 6 Familia_Equipo 0.6453040 2.6076976
## 7 Operario 0.2388746 1.6387342
## Fallo_electronico Fallo_mecanico MeanDecreaseAccuracy MeanDecreaseGini
## 1 0.65169975 4.2385872 3.5022211 17.960408
## 2 0.62503094 0.1896795 2.6347503 17.920656
## 3 -1.93286919 -1.5361375 -1.1376786 17.540200
## 4 -1.32847188 2.5762136 1.1970604 17.490875
## 5 1.64066296 -0.1430643 -1.8089785 16.944842
## 6 -3.05438766 3.2760023 2.3084396 9.200833
## 7 0.02594127 -3.0678862 -0.9531902 5.954963
Usaremos un gráfico de barras (geom_bar) ordenado para mostrar claramente qué variables tienen el mayor impacto.
# Graficar la importancia de las variables con ggplot2
ggplot(df_importancia, aes(x = reorder(Variable, MeanDecreaseGini), y = MeanDecreaseGini, fill = MeanDecreaseGini)) +
geom_bar(stat = "identity") +
coord_flip() + # Voltear las coordenadas para una mejor lectura de las etiquetas largas
labs(
title = "Importancia de las Variables en el Modelo Random Forest",
subtitle = "Medida por Mean Decrease Gini",
x = "Variable",
y = "Mean Decrease Gini (Importancia Relativa)",
fill = "Importancia"
) +
theme_minimal() +
scale_fill_viridis_c(option = "plasma") + # Usar una paleta de colores moderna
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5),
axis.text.y = element_text(size = 10)
)
reorder(Variable, MeanDecreaseGini): Ordena automáticamente las barras de menor a mayor importancia, haciendo que el gráfico sea mucho más fácil de interpretar de un vistazo.
coord_flip(): Convierte el gráfico de barras vertical tradicional en uno horizontal, lo cual es ideal para etiquetas de variables largas como las que tenemos.
theme_minimal(): Aplica un tema limpio y minimalista que es estéticamente superior al gráfico base de R.
scale_fill_viridis_c(option = “plasma”): Aplica una paleta de colores perceptualmente uniforme y apta para daltónicos (del paquete viridis, que ggplot2 puede usar por defecto).
Este gráfico proporciona una visualización clara y profesional de cuáles son los factores más críticos para determinar la familia de equipo que requiere mantenimiento, según tu modelo de Random Forest.
Para crear un gráfico de Gantt cronológicamente ordenado utilizando la columna Pronostico_Fecha_Prox_Mant y ggplot2, primero debemos decidir qué representa el “rango de tiempo” para cada elemento, ya que un gráfico de Gantt requiere una fecha de inicio y una fecha de finalización. En este ejemplo, asumiremos que el punto de inicio de la tarea de mantenimiento es la fecha del pronóstico (Pronostico_Fecha_Prox_Mant), y definiremos una duración fija para la tarea de mantenimiento (por ejemplo, 2 días) para simular el rango. Agruparemos las tareas por Familia_Equipo o por Operario para visualizarlas.
library(ggplot2)
library(dplyr)
library(lubridate) # Para manejar fechas fácilmente
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
# Asumimos que 'datos_mantenimiento' del ejemplo anterior está disponible.
# 1. Preparar los datos para el Gantt
# Creamos una fecha de inicio (la fecha pronosticada) y una fecha de fin (inicio + 2 días de duración)
datos_gantt <- datos_mantenimiento %>%
mutate(
Fecha_Inicio = Pronostico_Fecha_Prox_Mant,
Fecha_Fin = Fecha_Inicio + days(2), # Asumimos 2 días para el mantenimiento
# Crear una etiqueta única para cada tarea para el eje Y
Tarea_Equipo = paste(Familia_Equipo, Operario, row_number())
) %>%
# Ordenar cronológicamente por fecha de inicio para asegurar el orden
arrange(Fecha_Inicio) %>%
# Convertir Tarea_Equipo a factor con el orden actual para que ggplot lo respete
mutate(Tarea_Equipo = factor(Tarea_Equipo, levels = unique(Tarea_Equipo)))
# 2. Crear el gráfico de Gantt con ggplot2
ggplot(datos_gantt, aes(x = Fecha_Inicio, xend = Fecha_Fin, y = Tarea_Equipo, yend = Tarea_Equipo, color = Familia_Equipo)) +
geom_segment(size = 5) + # geom_segment crea las barras del Gantt
labs(
title = "Cronograma de Próximos Mantenimientos (Gantt)",
subtitle = "Tareas ordenadas cronológicamente",
x = "Fecha de Mantenimiento",
y = "Tarea / Equipo Individual",
color = "Familia de Equipo"
) +
scale_x_date(date_labels = "%Y-%m-%d", date_breaks = "week") + # Formatear el eje X para fechas legibles
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1), # Rotar etiquetas X para evitar solapamiento
axis.text.y = element_blank(), # Ocultar etiquetas del eje Y si hay muchas tareas individuales
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank() # Eliminar líneas de cuadrícula Y para un aspecto más limpio
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Este gráfico es semejante al anterior, pero tocando el color del tipo de equipo nos permite filtrar las fechas.
library(ggplot2)
library(dplyr)
library(lubridate)
library(plotly) # Cargar la librería plotly
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
# Asumimos que 'datos_mantenimiento' está disponible.
# Si no lo está, asegúrate de ejecutar el código de creación del dataset original.
# 1. Preparar los datos para el Gantt (con adición de texto para tooltip)
datos_gantt_interactivo <- datos_mantenimiento %>%
mutate(
Fecha_Inicio = Pronostico_Fecha_Prox_Mant,
Fecha_Fin = Fecha_Inicio + days(2), # Asumimos 2 días para el mantenimiento
# Crear una etiqueta única para cada tarea para el eje Y
Tarea_Equipo = paste(Familia_Equipo, Operario, row_number()),
# >>>>>>>> AÑADIMOS EL TEXTO DEL TOOLTIP AQUÍ <<<<<<<<<
tooltip_text = paste(
"Equipo:", Familia_Equipo,
"| Fecha:", as.character(Fecha_Inicio)
)
) %>%
# Ordenar cronológicamente por fecha de inicio para asegurar el orden
arrange(Fecha_Inicio) %>%
# Convertir Tarea_Equipo a factor con el orden actual para que ggplot lo respete
mutate(Tarea_Equipo = factor(Tarea_Equipo, levels = unique(Tarea_Equipo)))
# 2. Crear el gráfico de Gantt con ggplot2
# Mapeamos la variable 'tooltip_text' a la estética 'text'
gantt_plot_base <- ggplot(datos_gantt_interactivo,
aes(x = Fecha_Inicio, xend = Fecha_Fin, y = Tarea_Equipo, yend = Tarea_Equipo,
color = Familia_Equipo,
text = tooltip_text)) + # <--- Añadimos 'text' aquí
geom_segment(size = 5) +
labs(
title = "Cronograma de Próximos Mantenimientos (Gantt Interactivo)",
subtitle = "Tareas ordenadas cronológicamente",
x = "Fecha de Mantenimiento",
y = "Tarea / Equipo Individual",
color = "Familia de Equipo"
) +
scale_x_date(date_labels = "%Y-%m-%d", date_breaks = "week") +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 45, hjust = 1),
axis.text.y = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major.y = element_blank()
)
# 3. Convertir el gráfico ggplot en un gráfico interactivo con plotly
# Usamos tooltip = "text" para que solo se muestre nuestro texto personalizado al pasar el ratón.
gantt_interactivo <- ggplotly(gantt_plot_base, tooltip = "text")
# 4. Mostrar el gráfico interactivo
gantt_interactivo
““,”Tecnologia”,“Normas”,“Capital”,“Equipo”,“Empresa” “1”,5.1,3.5,1.4,0.2,“CNB-Cerveza” “2”,4.9,3,1.4,0.2,“CNB-Cerveza” “3”,4.7,3.2,1.3,0.2,“CNB-Cerveza” “4”,4.6,3.1,1.5,0.2,“CNB-Cerveza” “5”,5,3.6,1.4,0.2,“CNB-Cerveza” “6”,5.4,3.9,1.7,0.4,“CNB-Cerveza” “7”,4.6,3.4,1.4,0.3,“CNB-Cerveza” “8”,5,3.4,1.5,0.2,“CNB-Cerveza” “9”,4.4,2.9,1.4,0.2,“CNB-Cerveza” “10”,4.9,3.1,1.5,0.1,“CNB-Cerveza” “11”,5.4,3.7,1.5,0.2,“CNB-Cerveza” “12”,4.8,3.4,1.6,0.2,“CNB-Cerveza” “13”,4.8,3,1.4,0.1,“CNB-Cerveza” “14”,4.3,3,1.1,0.1,“CNB-Cerveza” “15”,5.8,4,1.2,0.2,“CNB-Cerveza” “16”,5.7,4.4,1.5,0.4,“CNB-Cerveza” “17”,5.4,3.9,1.3,0.4,“CNB-Cerveza” “18”,5.1,3.5,1.4,0.3,“CNB-Cerveza” “19”,5.7,3.8,1.7,0.3,“CNB-Cerveza” “20”,5.1,3.8,1.5,0.3,“CNB-Cerveza” “21”,5.4,3.4,1.7,0.2,“CNB-Cerveza” “22”,5.1,3.7,1.5,0.4,“CNB-Cerveza” “23”,4.6,3.6,1,0.2,“CNB-Cerveza” “24”,5.1,3.3,1.7,0.5,“CNB-Cerveza” “25”,4.8,3.4,1.9,0.2,“CNB-Cerveza” “26”,5,3,1.6,0.2,“CNB-Cerveza” “27”,5,3.4,1.6,0.4,“CNB-Cerveza” “28”,5.2,3.5,1.5,0.2,“CNB-Cerveza” “29”,5.2,3.4,1.4,0.2,“CNB-Cerveza” “30”,4.7,3.2,1.6,0.2,“CNB-Cerveza” “31”,4.8,3.1,1.6,0.2,“CNB-Cerveza” “32”,5.4,3.4,1.5,0.4,“CNB-Cerveza” “33”,5.2,4.1,1.5,0.1,“CNB-Cerveza” “34”,5.5,4.2,1.4,0.2,“CNB-Cerveza” “35”,4.9,3.1,1.5,0.2,“CNB-Cerveza” “36”,5,3.2,1.2,0.2,“CNB-Cerveza” “37”,5.5,3.5,1.3,0.2,“CNB-Cerveza” “38”,4.9,3.6,1.4,0.1,“CNB-Cerveza” “39”,4.4,3,1.3,0.2,“CNB-Cerveza” “40”,5.1,3.4,1.5,0.2,“CNB-Cerveza” “41”,5,3.5,1.3,0.3,“CNB-Cerveza” “42”,4.5,2.3,1.3,0.3,“CNB-Cerveza” “43”,4.4,3.2,1.3,0.2,“CNB-Cerveza” “44”,5,3.5,1.6,0.6,“CNB-Cerveza” “45”,5.1,3.8,1.9,0.4,“CNB-Cerveza” “46”,4.8,3,1.4,0.3,“CNB-Cerveza” “47”,5.1,3.8,1.6,0.2,“CNB-Cerveza” “48”,4.6,3.2,1.4,0.2,“CNB-Cerveza” “49”,5.3,3.7,1.5,0.2,“CNB-Cerveza” “50”,5,3.3,1.4,0.2,“CNB-Cerveza” “51”,7,3.2,4.7,1.4,“FARMACORP” “52”,6.4,3.2,4.5,1.5,“FARMACORP” “53”,6.9,3.1,4.9,1.5,“FARMACORP” “54”,5.5,2.3,4,1.3,“FARMACORP” “55”,6.5,2.8,4.6,1.5,“FARMACORP” “56”,5.7,2.8,4.5,1.3,“FARMACORP” “57”,6.3,3.3,4.7,1.6,“FARMACORP” “58”,4.9,2.4,3.3,1,“FARMACORP” “59”,6.6,2.9,4.6,1.3,“FARMACORP” “60”,5.2,2.7,3.9,1.4,“FARMACORP” “61”,5,2,3.5,1,“FARMACORP” “62”,5.9,3,4.2,1.5,“FARMACORP” “63”,6,2.2,4,1,“FARMACORP” “64”,6.1,2.9,4.7,1.4,“FARMACORP” “65”,5.6,2.9,3.6,1.3,“FARMACORP” “66”,6.7,3.1,4.4,1.4,“FARMACORP” “67”,5.6,3,4.5,1.5,“FARMACORP” “68”,5.8,2.7,4.1,1,“FARMACORP” “69”,6.2,2.2,4.5,1.5,“FARMACORP” “70”,5.6,2.5,3.9,1.1,“FARMACORP” “71”,5.9,3.2,4.8,1.8,“FARMACORP” “72”,6.1,2.8,4,1.3,“FARMACORP” “73”,6.3,2.5,4.9,1.5,“FARMACORP” “74”,6.1,2.8,4.7,1.2,“FARMACORP” “75”,6.4,2.9,4.3,1.3,“FARMACORP” “76”,6.6,3,4.4,1.4,“FARMACORP” “77”,6.8,2.8,4.8,1.4,“FARMACORP” “78”,6.7,3,5,1.7,“FARMACORP” “79”,6,2.9,4.5,1.5,“FARMACORP” “80”,5.7,2.6,3.5,1,“FARMACORP” “81”,5.5,2.4,3.8,1.1,“FARMACORP” “82”,5.5,2.4,3.7,1,“FARMACORP” “83”,5.8,2.7,3.9,1.2,“FARMACORP” “84”,6,2.7,5.1,1.6,“FARMACORP” “85”,5.4,3,4.5,1.5,“FARMACORP” “86”,6,3.4,4.5,1.6,“FARMACORP” “87”,6.7,3.1,4.7,1.5,“FARMACORP” “88”,6.3,2.3,4.4,1.3,“FARMACORP” “89”,5.6,3,4.1,1.3,“FARMACORP” “90”,5.5,2.5,4,1.3,“FARMACORP” “91”,5.5,2.6,4.4,1.2,“FARMACORP” “92”,6.1,3,4.6,1.4,“FARMACORP” “93”,5.8,2.6,4,1.2,“FARMACORP” “94”,5,2.3,3.3,1,“FARMACORP” “95”,5.6,2.7,4.2,1.3,“FARMACORP” “96”,5.7,3,4.2,1.2,“FARMACORP” “97”,5.7,2.9,4.2,1.3,“FARMACORP” “98”,6.2,2.9,4.3,1.3,“FARMACORP” “99”,5.1,2.5,3,1.1,“FARMACORP” “100”,5.7,2.8,4.1,1.3,“FARMACORP” “101”,6.3,3.3,6,2.5,“SOFIA-Avicola” “102”,5.8,2.7,5.1,1.9,“SOFIA-Avicola” “103”,7.1,3,5.9,2.1,“SOFIA-Avicola” “104”,6.3,2.9,5.6,1.8,“SOFIA-Avicola” “105”,6.5,3,5.8,2.2,“SOFIA-Avicola” “106”,7.6,3,6.6,2.1,“SOFIA-Avicola” “107”,4.9,2.5,4.5,1.7,“SOFIA-Avicola” “108”,7.3,2.9,6.3,1.8,“SOFIA-Avicola” “109”,6.7,2.5,5.8,1.8,“SOFIA-Avicola” “110”,7.2,3.6,6.1,2.5,“SOFIA-Avicola” “111”,6.5,3.2,5.1,2,“SOFIA-Avicola” “112”,6.4,2.7,5.3,1.9,“SOFIA-Avicola” “113”,6.8,3,5.5,2.1,“SOFIA-Avicola” “114”,5.7,2.5,5,2,“SOFIA-Avicola” “115”,5.8,2.8,5.1,2.4,“SOFIA-Avicola” “116”,6.4,3.2,5.3,2.3,“SOFIA-Avicola” “117”,6.5,3,5.5,1.8,“SOFIA-Avicola” “118”,7.7,3.8,6.7,2.2,“SOFIA-Avicola” “119”,7.7,2.6,6.9,2.3,“SOFIA-Avicola” “120”,6,2.2,5,1.5,“SOFIA-Avicola” “121”,6.9,3.2,5.7,2.3,“SOFIA-Avicola” “122”,5.6,2.8,4.9,2,“SOFIA-Avicola” “123”,7.7,2.8,6.7,2,“SOFIA-Avicola” “124”,6.3,2.7,4.9,1.8,“SOFIA-Avicola” “125”,6.7,3.3,5.7,2.1,“SOFIA-Avicola” “126”,7.2,3.2,6,1.8,“SOFIA-Avicola” “127”,6.2,2.8,4.8,1.8,“SOFIA-Avicola” “128”,6.1,3,4.9,1.8,“SOFIA-Avicola” “129”,6.4,2.8,5.6,2.1,“SOFIA-Avicola” “130”,7.2,3,5.8,1.6,“SOFIA-Avicola” “131”,7.4,2.8,6.1,1.9,“SOFIA-Avicola” “132”,7.9,3.8,6.4,2,“SOFIA-Avicola” “133”,6.4,2.8,5.6,2.2,“SOFIA-Avicola” “134”,6.3,2.8,5.1,1.5,“SOFIA-Avicola” “135”,6.1,2.6,5.6,1.4,“SOFIA-Avicola” “136”,7.7,3,6.1,2.3,“SOFIA-Avicola” “137”,6.3,3.4,5.6,2.4,“SOFIA-Avicola” “138”,6.4,3.1,5.5,1.8,“SOFIA-Avicola” “139”,6,3,4.8,1.8,“SOFIA-Avicola” “140”,6.9,3.1,5.4,2.1,“SOFIA-Avicola” “141”,6.7,3.1,5.6,2.4,“SOFIA-Avicola” “142”,6.9,3.1,5.1,2.3,“SOFIA-Avicola” “143”,5.8,2.7,5.1,1.9,“SOFIA-Avicola” “144”,6.8,3.2,5.9,2.3,“SOFIA-Avicola” “145”,6.7,3.3,5.7,2.5,“SOFIA-Avicola” “146”,6.7,3,5.2,2.3,“SOFIA-Avicola” “147”,6.3,2.5,5,1.9,“SOFIA-Avicola” “148”,6.5,3,5.2,2,“SOFIA-Avicola” “149”,6.2,3.4,5.4,2.3,“SOFIA-Avicola” “150”,5.9,3,5.1,1.8,“SOFIA-Avicola”