Caso de estudio: Acuacultura

Equipo 1

22/02/2021

INTRODUCCIÓN

La acuacultura es una actividad que consiste en el cultivo y producción de organismos acuáticos de agua dulce o salada.

También denominada acuicultura, esta práctica convierte las presas, lagos, lagunas en zonas de explotación de recursos naturales marinos. Las especies que incluye se dividen en cuatro categorías algas, moluscos, crustáceos y peces.

A pesar del crecimiento experimentado a lo largo de los últimos años, la industria acuícola sigue sufriendo problemas debidos a la gran complejidad de sus procesos y la alta volatilidad de sus resultados.

ANTECEDENTES

La acuacultura contribuye al crecimiento y estabilidad del sistema alimentario, conservación de especies acuáticas, incremento de niveles de nutrición, disminución de impactos ambientales, manufactura de materias primas de uso industrial y farmacéutico, fomento del autoempleo y erradicación de la pobreza.

En México, el cultivo de camarón consiste en la engorda de crías conocidas como poslarvas de camarón blanco del Pacífico. Esto se hace en estanquería rústica, utilizando alimento balanceado y determinando la densidad de siembra según el tipo de sistema de producción, cuidando la calidad del agua con sus recambios y aireación vía fertilización.

El objetivo de los sistemas de engorda es producir grandes cantidades de camarón en el menor tiempo posible, por lo que las tasas de crecimiento y de supervivencia son los parámetros de producción que deben ser maximizados.

Así, países como Japón, Singapur, India, Chile, Alemania y México, por mencionar algunos, han integrado paulatinamente la tecnología avanzada dentro del sector con el fin de mejorar sus operaciones, aumentar la productividad y ahorrar recursos.

OBJETIVOS

El objetivo principal de este caso de estudio del sector acuicola es análizar 12 estanques en sus primeras 12 semanas y como es el crecimiento de los camarones dentro de los estanques, además de cuantificar su nivel de comida, la cual en su semana 12 deberían llegar a un peso de 12 gramos para poder ser cosechados.

TEORÍA

En primer lugar, los sistemas de inteligencia artificial permiten que los productores tengan una mayor visibilidad y conocimiento de lo que pasa bajo el agua; por ejemplo, el proyecto Tidal, desarrollado por Google, utiliza sistemas de cámara submarinas y herramientas de reconocimiento facial para monitorear a los peces, analizar su comportamiento y detectar posibles enfermedades.

Por otro lado, el machine learning para empresas dedicadas a cultivar salmón, camarón y otro tipo de peces de gran consumo, ha desarrollado soluciones para su alimentación. Estos sistemas aprenden las tendencias y apetitos de cada especie, e identifican cuál es el mejor volumen de alimento que necesitan y en qué momento deben suministrarlo.

Si echamos un vistazo a las cifras de producción para 2018, presentadas por la Organización de las Naciones Unidas para la Agricultura y la Alimentación (FAO), un total del 48 por ciento de la producción total proviene de la acuicultura de agua dulce, lo que significa principalmente el cultivo en tierra.

MÉTODO

Se tienen 12 semanas de datos de 12 estanques en los cuales a partir de la semana número 2 se empiezan la pesar los camarones en crecimiento, también se cuantifica su nivel de comida.

En términos ideales los 12 estanques tendrían que llegar en la semana número 12 a 12 gramos para poder entonces realizar la ‘cosecha’, pero únicamente 3 de los 12 estanques llegaros a este peso.

¿Por qué esto es un problema? dado que se tendrá que invertir una semana (o más) para poder llegar al peso ideal, y esto supone una pérdida de dinero

library(pacman)
p_load("readr","DT","prettydoc","fdth","modeest","ggplot2")
CAMARONES <- read_csv("CAMARONES.csv", 
    col_types = cols(EstanqueN = col_number(), 
        Superficie = col_number(), Dias = col_number(), 
        Semana = col_number(), PesoAnterior = col_number(), 
        PesoActual = col_number(), TamanioAlimento = col_number(), 
        AlimentoSemana = col_number(), AlimentoDiario = col_number()))

Camarones

datatable(CAMARONES)

RESULTADOS

Gráfico de caja y bigote

CB Peso anterior

boxplot(CAMARONES$PesoAnterior, col="deeppink")

En el gráfico se puede observar en que valor se encuentra la mediana que se obtuvo anteriormente de 4.015, también se observan los cuantiles con una distribución simétrica y además, que no existen valores atípicos.

CB Peso actual

boxplot(CAMARONES$PesoActual, col="violet")

Se observa la mediana como anteriormente se calculó, de 4.73 casi 5 como se puede observar, los cuantiles y tampoco existen valores atípicos.

CB Alimento diario

boxplot(CAMARONES$AlimentoDiario, col="skyblue")

En este caso la mediana esta representada por el valor de 151.4286, se observa que el primer cuantil se encuentra alejado de la media, representando una distribución asimétrica y no se encuentran valores atípicos.

CB Alimento semanal

boxplot(CAMARONES$AlimentoSemana, col="aquamarine2")

La mediana tuvo un valor de 1060, el cual se puede observar en el gráfico. Sin embargo, no se obtuvieron valores atípicos.

¿Que tienen de diferentes los estanques que SI llegaron a 12 gramos en la semana 12 con respecto a los que no?

Haciendo un análisis en la tabla de los datos, se puede observar que en la semana 12, los estanques que si llegaron al peso esperado, fueron también los de mayor peso anterior y mayor alimento. Por otra parte, se revisaron los datos desde la semana 2 en donde se presentó algo muy curioso, los camarones que tenían un peso anterior más bajo, fueron los que comenzaron a pesar más.

semana2 <- read_csv("semana12.csv", 
    col_types = cols(PesoAnterior = col_number(), 
        PesoActual = col_number()))

peso.anterior2 <- semana2$PesoAnterior
peso.actual2 <- semana2$PesoActual
semana2 <- data.frame(peso.anterior2, peso.actual2)
ggplot(data=semana2) +
  geom_point(mapping=aes(x=peso.actual2,y=peso.anterior2), col = "coral") +
  ggtitle("Gráfica del peso de camarones en la 2da semana")

¿Con qué variables se relaciona el aumento de peso de los camarones?

Correlación

peso.anterior <- CAMARONES$PesoAnterior
peso.actual <- CAMARONES$PesoActual
alimento.diario <- CAMARONES$AlimentoDiario
alimento.semanal <- CAMARONES$AlimentoSemana
datos <- data.frame(peso.anterior, peso.actual, alimento.diario, alimento.semanal)

cor(datos)
##                  peso.anterior peso.actual alimento.diario alimento.semanal
## peso.anterior        1.0000000   0.9915841       0.9510608        0.9510608
## peso.actual          0.9915841   1.0000000       0.9514703        0.9514703
## alimento.diario      0.9510608   0.9514703       1.0000000        1.0000000
## alimento.semanal     0.9510608   0.9514703       1.0000000        1.0000000

Con el coeficiente de correlación se puede decir que el peso actual de los camarones se encuentra relacionado con el peso anterior, debido a que su valor fue de 0.9915841. Sin embargo, el alimento también tiene que ver en el crecimiento debido a que su valor fue de 0.9514703.

Diagrama de dispersión

pairs(datos, col = "darkslateblue")

Regresión lineal simple

A continuación se hará la regresión simple con los datos del peso anterior y el peso actual

regresion <- lm (peso.anterior ~ peso.actual, data=datos )
summary(regresion)
## 
## Call:
## lm(formula = peso.anterior ~ peso.actual, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.06410 -0.26143 -0.01954  0.25843  1.16553 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.44278    0.06380   -6.94 1.67e-10 ***
## peso.actual  0.88802    0.01017   87.33  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3945 on 130 degrees of freedom
## Multiple R-squared:  0.9832, Adjusted R-squared:  0.9831 
## F-statistic:  7626 on 1 and 130 DF,  p-value: < 2.2e-16

A continuación se hará la regresión simple con los datos del alimento semanal y el peso actual

regresion2 <- lm (alimento.semanal ~ peso.actual, data=datos )
summary(regresion2)
## 
## Call:
## lm(formula = alimento.semanal ~ peso.actual, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -526.00  -89.86    9.59   90.77  380.46 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  285.864     24.864   11.50   <2e-16 ***
## peso.actual  139.697      3.963   35.25   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 153.7 on 130 degrees of freedom
## Multiple R-squared:  0.9053, Adjusted R-squared:  0.9046 
## F-statistic:  1243 on 1 and 130 DF,  p-value: < 2.2e-16

Recta de minimos cuadrados

Ecuación de la recta

Con los datos que proporcionó el sumario, se puede obtener la ecuación de la recta con el peso anterior y el actual \[ y = -0.44278 + 0.88802 x \]

Con los datos que proporcionó el sumario, se puede obtener la ecuación de la recta con el alimento semanal y el actual \[ y = 285.864 + 139.697 x \]

Ajuste de la recta

Ajuste con el peso anterior y el peso actual

plot(datos$peso.actual, datos$peso.anterior, xlab = "Peso Actual", ylab="Peso Anterior", col = "cyan3")
abline(regresion, col = "darkslateblue")

Se muestran los datos muy cerca de la recta, además no cuentan con mucha dispersión.

Ajuste con el alimento semanal y el peso actual

plot(datos$peso.actual, datos$alimento.semanal, xlab = "Peso Actual", ylab="Alimento Semanal", col = "brown2")
abline(regresion2, col = "brown")

En este caso los datos se encuentran más dispersos entre sí y un poco alejados de la recta. Además se pueden ir comparando los modelos del peso anterior - peso actual y alimento semanal - peso actual.

Predicción

Se pueden predecir valores del peso anterior y el actual con un rango más amplio al original

nuevo.peso.anterior <- data.frame(peso.anterior=seq(0.1,11))
nuevo.peso.actual <- data.frame(peso.actual=seq(0.5,13))
predict(regresion,nuevo.peso.actual)
##            1            2            3            4            5            6 
##  0.001230749  0.889249389  1.777268030  2.665286670  3.553305311  4.441323951 
##            7            8            9           10           11           12 
##  5.329342592  6.217361232  7.105379873  7.993398513  8.881417154  9.769435794 
##           13 
## 10.657454435

Se pueden predecir valores del alimento semanal y el peso actual con un rango más amplio al original

nuevo.alimento.semanal <- data.frame(alimento.semanal=seq(300,2200))
nuevo.peso.actual <- data.frame(peso.actual=seq(0.5,13))
predict(regresion2,nuevo.peso.actual)
##         1         2         3         4         5         6         7         8 
##  355.7128  495.4101  635.1073  774.8045  914.5018 1054.1990 1193.8962 1333.5935 
##         9        10        11        12        13 
## 1473.2907 1612.9879 1752.6852 1892.3824 2032.0796

Intervalos de confianza

Para peso anterior y actual

confint(regresion)
##                  2.5 %     97.5 %
## (Intercept) -0.5690027 -0.3165544
## peso.actual  0.8679009  0.9081364
nuevo.peso.actual <- data.frame(peso.actual=seq(0.5,13))

#Recta ajustada al gráfico de dispersión
plot(datos$peso.actual, datos$peso.anterior, xlab = "Peso Actual", ylab="Peso Anterior")
abline(regresion)

#Intervalos de confianza para la respuesta media 
# ic es una matriz con tres columnas: la primera es la prediccion, las otras dos son los extremos del intervalo
ic <- predict(regresion, nuevo.peso.actual, interval = 'confidence')
lines(nuevo.peso.actual$peso.actual, ic[, 2], lty = 2)
lines(nuevo.peso.actual$peso.actual, ic[, 3], lty = 2)

# Intervalos de predicción
ic <- predict(regresion, nuevo.peso.actual, interval = 'prediction')
lines(nuevo.peso.actual$peso.actual, ic[, 2], lty = 2, col = "red")
lines(nuevo.peso.actual$peso.actual, ic[, 3], lty = 2, col = "red")

Se observa un buen modelo debido a que los valores de confianza están demasiado cercanos a la recta de mínimos cuadrados. Por otra parte, los valores predecidos se encuentran un poco más alejados.

Para alimento semanal y peso actual

confint(regresion2)
##                2.5 %   97.5 %
## (Intercept) 236.6740 335.0544
## peso.actual 131.8572 147.5372
nuevo.peso.actual2 <- data.frame(peso.actual=seq(0.5,13))

#Recta ajustada al gráfico de dispersión
plot(datos$peso.actual, datos$alimento.semanal, xlab = "Peso Actual", ylab="Alimento Semanal")
abline(regresion2)

#Intervalos de confianza para la respuesta media 
# ic es una matriz con tres columnas: la primera es la prediccion, las otras dos son los extremos del intervalo
ic <- predict(regresion, nuevo.peso.actual2, interval = 'confidence')
lines(nuevo.peso.actual2$peso.actual, ic[, 2], lty = 2)
lines(nuevo.peso.actual2$peso.actual, ic[, 3], lty = 2)

# Intervalos de predicción
ic <- predict(regresion, nuevo.peso.actual2, interval = 'prediction')
lines(nuevo.peso.actual2$peso.actual, ic[, 2], lty = 2, col = "red")
lines(nuevo.peso.actual2$peso.actual, ic[, 3], lty = 2, col = "red")

A diferencia del modelo anterior, los intervalos de confianza en este modelo si se encuentran cercanos a la recta. Sin embargo, los intervalos de predicción o datos predecidos están bastante alejados, puesto que existen datos más dispersos en este modelo.

Análisis de residuales

Análisis ANOVA (Análisis de varianza)

Para peso anterior y peso actual

anova(regresion)
## Analysis of Variance Table
## 
## Response: peso.anterior
##              Df  Sum Sq Mean Sq F value    Pr(>F)    
## peso.actual   1 1186.98 1186.98  7626.1 < 2.2e-16 ***
## Residuals   130   20.23    0.16                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Para alimento semanal y peso actual

anova(regresion2)
## Analysis of Variance Table
## 
## Response: alimento.semanal
##              Df   Sum Sq  Mean Sq F value    Pr(>F)    
## peso.actual   1 29374753 29374753  1242.7 < 2.2e-16 ***
## Residuals   130  3072936    23638                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Diagnóstico del modelo

Para peso anterior y peso actual

residuos <- rstandard(regresion)
valores.ajustados <- fitted(regresion)
plot(valores.ajustados,residuos, col = "deepskyblue4")

Se observa que los datos están un poco dispersos. Sin embargo no se ve una correlación notoria.

Para alimento semanal y peso actual

residuos2 <- rstandard(regresion2)
valores.ajustados2 <- fitted(regresion2)
plot(valores.ajustados2,residuos2, col = "darkmagenta")

Se observa que los datos están un poco dispersos. Sin embargo no se ve una correlación notoria.

Pruebas de normalidad

No se observa ningún patrón especial, por lo que tanto la homocedasticidad como la linealidad resultan hipótesis razonables.

La hipótesis de normalidad se suele comprobar mediante un QQ plot de los residuos. El siguiente código sirve para obtenerlo: Para peso anterior y peso actual

qqnorm(residuos, col = "coral")
qqline(residuos, col = "orange")

Los datos presentan una linealidad, por ello se puede expresar como residuos normales

Para alimento semanal y peso actual

qqnorm(residuos2, col = "violet")
qqline(residuos2, col = "purple")

Los residuos presentan cierta linealidad en el medio pero en los extremos se dispersan mucho.

Shapiro-wilk

Para peso anterior y actual

shapiro.test(residuos)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.99069, p-value = 0.526

los residuos son normales

Para alimento semanal y peso actual

shapiro.test(residuos2)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos2
## W = 0.98704, p-value = 0.2487

Los residuos también se encuentran normales.

Por lo tanto, la hipótesis nula de que las variables peso anterior y alimento semanal se encuentran relacionadas con el peso actual, se aceptan debido a sus residuos normales y la regresión lineal.

¿Los camarones que iniciaron con mayor peso (semana 2) son también los que terminaron en mayor peso? ¿Cómo varía el crecimiento?

ggplot(data = semana2, mapping = aes(x = peso.actual2, y = peso.anterior2)) +
geom_point(color = "firebrick", size = 2) +
geom_smooth(method = "lm", se = TRUE, color = "black") +
labs(title = "Crecimiento de camarones en la semana 2", x = "Peso Actual", y = "Peso Anterior") +
theme_bw() + theme(plot.title = element_text(hjust = 0.5))
## `geom_smooth()` using formula 'y ~ x'

Con esta gráfica se puede decir que los camarones que pesaban más en la semana 2, tuvieron un MENOR peso en la actualidad, mientras que los que tuvieron un menor peso con anterioridad, tuvieron un MAYOR peso actual y fueron los camarones que SI llegaron a los 12. Por lo tanto, su crecimiento en la semana 2 fue inversamente proporcional.

Sin embargo, a medida que aumentaba el alimento, comenzaba a aumentar el peso de los camarones de los estanques en los que pesaban menos. Además el alimento fue el mismo en todos los estanques, pero fue en la semana 9 que la cantidad de alimento comenzó a ser diferente para cada estanque, variando de manera aleatoria y provocando que variara más el peso de cada estanque.

Análisis de regresión logística para determinar que hace que los camarones llegen a 12 gramos.

Se considera que la causalidad de la llegada de 12 g fue debido al crecimiento que tuvieron los camarones de la semana 2, siendo que los menos pesados fueron aquellos que pesaron más al final, creando una relación inversamente proporcional al inicio con las variables peso anterior y peso actual. Sin embargo, esta relación fue cambiando con el paso del tiempo y la alimentación, creando una relación directamente proporcional de las variables.

Regresión lineal simple

Semana 2

regresion3 <- lm (peso.anterior2 ~ peso.actual2, data=semana2 )
summary(regresion3)
## 
## Call:
## lm(formula = peso.anterior2 ~ peso.actual2, data = semana2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.63931 -0.21255  0.03181  0.14407  0.63012 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    2.4565     2.6633   0.922   0.3781  
## peso.actual2   0.6388     0.2305   2.771   0.0197 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3672 on 10 degrees of freedom
## Multiple R-squared:  0.4344, Adjusted R-squared:  0.3778 
## F-statistic: 7.679 on 1 and 10 DF,  p-value: 0.01975

Recta de minimos cuadrados

Ecuación de la recta

Con los datos que proporcionó el sumario, se puede obtener la ecuación de la recta \[ y = 0.2298 - 0.1040 x \]

Ajuste de la recta

Aquí se puede analizar como están distribuidos los datos con respecto a la recta, los cuales se ven un poco alejados

plot(semana2$peso.actual2, semana2$peso.anterior2, xlab = "Peso actual", ylab="Peso anterior", col = "deeppink4")
abline(regresion3, col = "darkred")

Relación inversamente proporcional, a menor peso anterior, mayor peso actual.

semana12 <- read_csv("semana12.csv", 
    col_types = cols(PesoAnterior = col_number(), 
        PesoActual = col_number()))

peso.anterior3 <- semana12$PesoAnterior
peso.actual3 <- semana12$PesoActual
semana12 <- data.frame(peso.anterior3, peso.actual3)
ggplot(data=semana12) +
  geom_point(mapping=aes(x=peso.actual3,y=peso.anterior3), col = "darkcyan") +
  ggtitle("Gráfica del peso de camarones en la semana 12")

Regresión lineal simple

Semana 12

regresion4 <- lm (peso.anterior3 ~ peso.actual3, data=semana12 )
summary(regresion4)
## 
## Call:
## lm(formula = peso.anterior3 ~ peso.actual3, data = semana12)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.63931 -0.21255  0.03181  0.14407  0.63012 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    2.4565     2.6633   0.922   0.3781  
## peso.actual3   0.6388     0.2305   2.771   0.0197 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3672 on 10 degrees of freedom
## Multiple R-squared:  0.4344, Adjusted R-squared:  0.3778 
## F-statistic: 7.679 on 1 and 10 DF,  p-value: 0.01975

Recta de minimos cuadrados

Ecuación de la recta

Con los datos que proporcionó el sumario, se puede obtener la ecuación de la recta \[ y = 2.4565 + 0.6388 x \]

Ajuste de la recta

Aquí se puede analizar como están distribuidos los datos con respecto a la recta, los cuales se ven un poco alejados

plot(semana12$peso.actual3, semana12$peso.anterior3, xlab = "Peso actual", ylab="Peso anterior", col = "chartreuse2")
abline(regresion4, col = "green")

CONCLUSIÓN

El peso anterior y el actual comenzaron siendo inversamente proporcionales pero solo un poco, debido a que los camarones con menor peso tenían un mayor peso actual, entonces al paso del tiempo y al consumir el alimento que se les proporcionó, dicha relación cambió a ser directamente proporcional debido a que comenzaron a obtener más y más peso con comida que tal vez era mejor que la que consumían anteriormente. Entonces, la causalidad sería el peso anterior y entrarían distintos factores acompañados, como lo es la alimentación.

Finalmente, se necesitaría realizar el experimento de probar con camarones de menor peso para tener un mejor resultado en cuanto al peso deseado y sin tener que gastar dinero extra con el alimento.

BIBLIOGRAFÍA