NetLogo es un software de programación de agentes y modelado de sistemas complejos. Permite a los usuarios crear modelos de sistemas que involucran diferentes agentes que interactúan entre sí.
Algunos recursos para ayudarte en el uso de NetLogo:
Documentación de NetLogo: https://ccl.northwestern.edu/netlogo/docs/
Decarga de NetLogo: https://ccl.northwestern.edu/netlogo/6.3.0/
Ejemplos de modelos en NetLogo: https://ccl.northwestern.edu/netlogo/models/
Guía de programación en NetLogo: https://ccl.northwestern.edu/netlogo/docs/programming.html
Haz en clase. Probemos a simular un proyecto de NetLogo
Existen muchas simulaciones en NetLogo para diferentes disciplinas del conocimiento. Entra en https://ccl.northwestern.edu/netlogo/models/ y elige uno de los modelos. Cuando elijas un modelo, haz clic sobre Try running in the NetLogo Web:
Una vez que accedas a la simulación, antes de empezar, lee la información del modelo:
Comprende en qué consiste el modelo. Después, pasa a probarlo:
Comenta en clase sobre qué trataba la simulación que has elegido.
¿Qué tema trata la simulación?
¿Qué has podido ver en pantalla?
¿Qué has entendido de lo que ocurría en la simulación?
Los investigadores utilizan simuladores para comprender procesos que no pueden estudiar directamente, por tratarse de procesos muy complejos, o tener una escala muy pequeña o muy grande. Para ello, crean modelos muy simplificados, y realizan pruebas haciendo pequeñas variaciones en los datos.
En ciencias se llama así al método en el que se mantienen constantes todas las variables de una situación, menos aquella cuya influencia se desea estudiar. Esto permite simplificar el análisis, ya que en caso contrario sería muy difícil o imposible dilucidar el efecto de cada variable individual. Si se aplica reiteradamente el método, variando ordenadamente cada una de las variables y solo una variable por vez, es posible llegar a comprender fenómenos muy complejos. El método permite el análisis de fenómenos complejos y facilita su descripción.
Para ver cómo funciona este proceso, vamos a utilizar los siguientes recursos:
En este ejemplo, puede ver un experimento realizado con el simulador. Vamos verlo detenidamente en clase.
¿Cómo experimentar con un simulador?
Siguiendo la plantilla del experimento, elige una variable diferente a la que se ha estudiado en ella. A continuación realiza un experimento planteando varias pruebas (como mínimo 3, aunque puedes hacer más de 3), modificando cada vez el valor de la variable a estudiar. Anota las observaciones realizadas en cada prueba, crea una hoja de cálculo con los resultados y las gráficas obtenidas y finalmente extrae conocimiento del resultado de las pruebas (es decir, una conclusión sobre cómo crees que afecta dicha variable en la simulación).
Actividad 1. Elige una variable diferente a la del ejemplo, en la misma simulación y realiza un experimento.
Antes de realizar el experimento:
Asegúrate de entender sobre qué trata la simulación y qué significan las variables.
Decide tu variables de interés.
Ejecuta al menos un par de veces la simulación para ver qué aspectos de la simulación se pueden observar y recoger en cada simulación. Elige al menos 3 o 4 parámetros observables.
Cuando realices el experimento:
Toma capturas sobre el resultado de cada prueba
Rellena la plantilla con los resultados
Para terminar:
Utiliza las capturas, junto con la información recogida en la plantilla, para crear un documento explicando el experimento, los resultados obtenidos y tu conclusión sobre la variable de tu elección.
Entrega:
El documento de recogida de datos, incluyendo los resultados de los experimentos, las gráficas y las conclusiones extraídas.
Ten en cuenta:
Que el número de pruebas sea al menos de 10.
Que las observaciones realizadas en cada prueba valoren varios aspectos del resultado (en el ejemplo de las abejas, se usó el tiempo requerido, el número de sitios sin revisar, el peso del sitio elegido, etc.)
Que la conclusión tenga relación con las observaciones realizadas, y que explique de qué forma afecta (o no afecta) la variable estudiada al resultado.
Que el lenguaje utilizado sea correcto y legible (evitanto el lenguaje telegráfico o el ahorro excesivo de lenguaje).
Logo empezó siendo un lenguaje de programación orientado a entornos educativos, pero ha ido convirtiéndose en un software empleado por la comunidad científica para crear simulaciones de una manera simple.
Ejemplo de Logo (en la videoconsola Atari, la primera que existió).
Debido a los inicios de Logo, con la tortuga que pintaba, a día de hoy se sigue llamando tortuga a los agentes de una simulación en NetLogo.
Los botones setup y go son importantes:
Setup: prepara la simulación, borrando todos los elementos, creando elementos nuevos, asignando valores iniciales, etc.
Go: ejecuta la simulación del mismo modo en que lo hacía el método draw en Processing. Crear una tortuga que se mueve por pantalla.
to setup
// Aquí inicializamos al pulsar el botón "setup"
end
to go
// Aqué ejecutamos el código el programa al pulsar el botón "go"
end
clear-all
create-turtles 1 // creamos una tortuga
ask turtles [ // pedimos a todas las tortugas lo siguiente
setxy 0 0 // que pongan su posición x,y a 0,0 (centro de la pantalla)
]
ask turtles [ // pedimos a todas las tortugas lo siguiente
rt random 180 // que giren a la derecha un valor aleatorio entre 0 y 180
lt random 180 // que giren a la izquierda un valor aleatorio entre 0 y 180
fd 10 // que avancen 10 pasos
]
Cuaderno de notas sobre NetLogo
Descarga el siguiente documento: notas-netlogo. Echa un vistazo al documento.
Los ejemplos de código que hay ya rellenados se corresponden con cosas explicadas en el paso 1. Continúa completando el resto de ejemplos a lo largo de los ejemplos siguientes.
En el siguiente vídeo vamos a incorporar un control llamado deslizador que nos va a permitir decidir a qué velocidad se va a mover la tortuga. También vamos a incorporar el tiempo a nuestra simulación. El tiempo en NetLogo se controla a través de ticks. Un tick es una unidad que nos permite saber cuantos pasos se han ejecutado hasta el momento. En cada tick se ejecuta el método go una vez. Es lo más parecido a tiempo que tenemos en NetLogo.
reset-ticks // reinicia la variable ticks a 0
fd velocidad // utilizamos la variable "velocidad" definida en el deslizador
tick // añade 1 a la variable ticks, lo que es equivalante al avance del tiempo.
En el siguiente ejemplo añadiremos varias tortugas a la simulación. La cantidad de tortugas vendrá dada por un deslizador.
create-turtles numero-individuos // se crea un número de individuos dado por el deslizador
ask turtles [ // Solicitamos a todas las tortugas
setxy random-xcor random-ycor // asignar una coordenada x,y aleatorias
]
reset-ticks // reiniciamos el valor del tiempo (ticks) a 0
tick // sumar 1 a la variable ticks (el tiempo avanza en 1).
Los patches definen el fondo de la simulación. Son el suelo en NetLogo. La pantalla queda dividida en regiones cuadradas (como en un tablero de ajedrez), y cada patch es una casilla. En la siguiente simulación, las tortugas son vacas, y el suelo es cesped. Las tortugas merodearán, y cuando una tortuga se ponga sobre un patch, comerá cesped, haciendo que el color del patch se oscurezca.
Los colores en NetLogo son números, dados por la siguiente tabla:
ask patches [ // Pedimos a todos los patches
set pcolor green // establecer el color (pcolor) a verde (en la tabla anterior 55)
]
ask turtles [ // Pedimos a todas las tortugas
...
set color blue // establecer su color a azul
]
El siguiente código se ejecuta dentro de una sentencia ask turtles:
ask patch-here [ // pedimos al patch en el que se encuentra la tortuga
if pcolor > 50 [ // si su color es mayor que 50 (ver tabla de colores más arriba)
set pcolor pcolor - 1 // restar uno al color
]
]
De este modo, simulamos que la tortuga (vaca) está comiendo cesped.
En este apartado hablaremos sobre lo siguiente:
Atributos de un agente
Variables globales
Todo agente (o tortuga en NetLogo) tiene varios atributos predefinidos, como xcor, ycor y color. Pero a estos atributos, podemos añadirle otros. Por ejemplo, si queremos saber cuánta habre tiene una vaca, podríamos añadir a cada una un atributo hambre, que sea un número que indique el número de ticks que una vaca lleva sin comer.
Además de añadir atributos a los agentes, se pueden añadir atributos a los patches. Por ejemplo, un patch de nuestro problema podría tener cantidad-vegetación, que contenga un número de 0 a 10, indicando cuánta vegetación le queda. De esta forma, cuando una vaca come en un patch, el valor del atributo cantidad-vegetación baja una cantidad. También podemos hacer que cada cierto número de ticks el valor de cantidad-vegetación se incremente.
Además de atributos, podemos tener variables globales, que se pueden usar en cualquier parte del programa. Son iguales que las variables incluidas mediante deslizadores, pero sólo utilizando código. Por ejemplo, en nuestro problema, podemos definir voracidad-vacas, que indique cada cuanto comen las vacas.
Vamos a añadir a los patches el siguiente atributo:
cantidad-cesped: el atributo vale inicialmente 0 para todos los patches.
En el siguiente ejemplo vamos a definir la siguiente variable global:
tasa-crecimiento-cesped: indica cada cuantos ticks se incrementa la cantidad de cesped. Cada tasa-incremento-cesped ticks, el atributo cantidad-cesped de cada patch se incrementa en 1.
voracidad: indica cada cuantos tics come una vaca. Una vaca sólo come cuando el patch en el que se encuentra contiene una cantidad-cesped mayor que 0. Cuando una vaca come, el atributo "cantidad-cesped" del patch en el que está se decrementa.
globals [
tasa-crecimiento-cesped // variable global que indica cada cuántos ticks crece la hierba
voracidad // variable global que indica cada cuántos ticks comen las vacas
]
patches-own [
cantidad-cesped // variable que tiene cada patch sobre la cantidad de cesped que
// contiene. Se controla su valor en el código (más abajo) para
// que oscile entre 10 y 0.
]
to setup // al pulsar el botón setup
...
set tasa-crecimiento-cesped 50 // se asigna 50 a tasa-crecimiento-cesped
set voracidad 5 // se asigna 5 a voracidad
...
end
to setup // al pulsar el botón setup
...
ask patches [ // pedir a todos los patches
set pcolor 50 // asignar al color del patch (pcolor) el valor 50 (negro)
set cantidad-cesped 0 // asignar el valor 0 a cantidad-cesped
]
...
end
to go
...
ask patches [
if (ticks mod tasa-crecimiento-cesped = 0) and (cantidad-cesped < 10) [
// si crecimiento-cesped es múltiplo de ticks y la cantidad de cesped es < 10
set cantidad-cesped cantidad-cesped + 1 // sumar 1 a cantidad-cesped
set pcolor 50 + cantidad-cesped / 2 // actualizar el color del patch
]
]
...
end
to go
...
ask turtles [ // pedir a todas las tortugas
...
if (ticks mod voracidad) = 0 [ // si ticks es un múltiplo de voracidad (es hora de comer)
ask patch-here [ // pedir a los patches donde está la tortuga
if cantidad-cesped > 0 [ // si la variable cantidad-cesped del patch > 0
set cantidad-cesped cantidad-cesped - 1 // restar 1 a cantidad-cesped
set pcolor 50 + cantidad-cesped / 2 // actualizar el color del patch
]
]
]
]
...
end
Supongamos que cuando una vaca pasa 3 periodos sin comer, muere. Para ello, tenemos que añadir un atributo a las tortugas, llamado periodos-sin-comer. Esta variable se incrementa cada vez que a una vaca le toca comer y no lo hace. Cuando come, el atributo periodos-sin-comer se reinicia a 0. A continuación te dejo el código del proyecto:
globals [
tasa-crecimiento-cesped
voracidad
]
patches-own [
cantidad-cesped
]
turtles-own [
periodos-sin-comer
]
to setup
clear-all
set tasa-crecimiento-cesped 100
set voracidad 5
create-turtles numero-individuos
ask patches [
set pcolor 50
set cantidad-cesped 0
]
ask turtles [
setxy random-xcor random-ycor
set color white
set periodos-sin-comer 0
set shape "cow"
]
reset-ticks
end
to go
ask patches [
if (ticks mod tasa-crecimiento-cesped = 0) and (cantidad-cesped < 10) [
set cantidad-cesped cantidad-cesped + 1
set pcolor 50 + cantidad-cesped / 2
]
]
ask turtles [
rt random 180
lt random 180
fd velocidad
if (ticks mod voracidad) = 0 [
let patch-actual patch-here
ifelse [cantidad-cesped] of patch-actual = 0 [
set periodos-sin-comer periodos-sin-comer + 1
] [
set periodos-sin-comer 0
]
ask patch-here [
if cantidad-cesped > 0 [
set cantidad-cesped cantidad-cesped - 1
set pcolor 50 + cantidad-cesped / 2
]
]
]
if periodos-sin-comer >= 3 [die]
]
tick
end
turtles-own [
periodos-sin-comer // atributo añadido a las tortugas para controlar los periodos sin comer
]
to setup
...
ask turtles [
...
set periodos-sin-comer 0 // asignamos 0 al atributo periodos-sin-comer
...
]
...
end
to go
...
ask turtles [
...
if (ticks mod voracidad) = 0 [ // si ticks es múltiplo de voracidad (es hora de comer)
let patch-actual patch-here // creamos una variable temporal llamada patch-actual
// que contiene el patch en el que está la tortuga (vaca)
ifelse [cantidad-cesped] of patch-actual = 0 [ // si el patch-actual no tiene cesped
set periodos-sin-comer periodos-sin-comer + 1 // incrementar en 1 el atributo periodos-sin-comer
] [ // en caso contrario (el patch-actual sí tiene cesped
set periodos-sin-comer 0 // ponemos el atributo periodos-sin-comer a 0
]
...
]
if periodos-sin-comer >= 3 [die] // si el número de periodos sin comer es 3 o mayor,
// la tortuga (vaca) muere
]
...
end
Puedes descargar el programa desde este enlace: paso6.nlogo
Pregunta: Para una tasa de crecimiento de 50 (el cesped crece 1 unidad cada 50 ticks), y unos agentes que tienen una voracidad con valor 2 (comen 1 unidad de cesped cada 2 ticks), ¿Cuántos agentes deben haber para que no muera ninguno?
turtles-own [
periodos-sin-comer
muerto
]
to setup
...
ask turtles [
...
set muerto 0
]
...
end
to go
...
ask turtles with [muerto = 0] [
...
if periodos-sin-comer >= 3 [
set muerto 1
set color red
]
]
end
Partiendo del código anterior, ahora queremos representar en un gráfico dos cosas:
La masa vegetal total
La cantidad de tortugas (vacas) que hay
Para ello, vamos a tener que añadir controles nuevos y algo de código. En el siguiente vídeo te muestro los controles que son necesarios añadir, y un ejemplo de ejecución del programa:
El código fuente del programa es el siguiente:
globals [
tasa-crecimiento-cesped
voracidad
masa-vegetal
]
patches-own [
cantidad-cesped
]
turtles-own [
periodos-sin-comer
]
to setup
clear-all
set tasa-crecimiento-cesped 50
set voracidad 2
set masa-vegetal 0
create-turtles numero-individuos
ask patches [
set pcolor 55
set cantidad-cesped 10
]
ask turtles [
setxy random-xcor random-ycor
set color white
set periodos-sin-comer 0
set shape "cow"
]
reset-ticks
end
to go
ask patches [
if (ticks mod tasa-crecimiento-cesped = 0) and (cantidad-cesped < 10) [
set cantidad-cesped cantidad-cesped + 1
set pcolor 50 + cantidad-cesped / 2
]
]
ask turtles [
rt random 180
lt random 180
fd velocidad
if (ticks mod voracidad) = 0 [
let patch-actual patch-here
ifelse [cantidad-cesped] of patch-actual = 0 [
set periodos-sin-comer periodos-sin-comer + 1
] [
set periodos-sin-comer 0
]
ask patch-here [
if cantidad-cesped > 0 [
set cantidad-cesped cantidad-cesped - 1
set pcolor 50 + cantidad-cesped / 2
]
]
]
if periodos-sin-comer >= 3 [die]
]
set masa-vegetal sum [masa-vegetal] of patches
tick
end
Puedes descargar el programa sin las gráficas del siguiente archivo: paso7-sin-gráficas.nlogo
globals [
...
masa-vegetal // variable global para almacenar la masa vegetal total
]
to setup
...
set masa-vegetal 0
...
end
to go
ask patches [
if (ticks mod tasa-crecimiento-cesped = 0) and (cantidad-cesped < 10) [
set cantidad-cesped cantidad-cesped + 1
...
]
]
ask turtles [
...
if (ticks mod voracidad) = 0 [
...
ask patch-here [
if cantidad-cesped > 0 [
set cantidad-cesped cantidad-cesped - 1
...
]
]
]
...
]
...
set masa-vegetal sum [cantidad-cesped] of patches
end
Actividad 3. Completa el documento notas-netlogo basándote en el código que hemos escrito hasta ahora.
Podemos pedir a ChatGPT que nos ayude a escribir un código en NetLogo u otro lenguaje. Pero a veces comete errores y escribe cosas que no están bien. Observa las siguientes especificaciones, y pide a ChatGPT que escriba un programa en NetLogo para ellas: especificaciones_vacas_prado.txt
1.1. Antes de empezar, debes pararte a pensar y anotar aquellas piezas de información que necesitarás. Por ejemplo en el caso de la simulación "Las vacas en el prado", podríamos haber empezado así:
Número de vacas
Días que lleva una vaca sin comer
Cada cuántos días come una vaca
Velocidad a la que crece la hierba
Cantidad de hierba que tiene cada zona
Velocidad a la que se mueven las vacas de un lado a otro
NOTA: Puede que te falten por definir algunas piezas de información. Seguramente te darás cuenta más adelante y puedes incorporarlas a las que ya hay definidas.
1.2. Después asigna nombres de variable a cada información. Por ejemplo:
Número de vacas -> numero_vacas
Días que lleva una vaca sin comer -> dias_sin_comer
Cada cuántos días come una vaca -> voracidad
Velocidad a la que crece la hierba -> tasa_crecimiento
Cantidad de hierba que tiene cada zona -> cantidad_hierba
Velocidad a la que se mueven las vacas de un lado a otro -> velocidad
1.3. Finalmente, ten claro el rango de valores que puede tener cada una. Por ejemplo:
numero_vacas ∈ [1, 1000]
dias_sin_comer ∈ [0, 3]
voracidad ∈ [1, 50]
tasa_crecimiento ∈ [1, 500]
cantidad_hierba ∈ [0, 10]
velocidad ∈ [1, 10]
Plantéate para cada pieza de información, si se trata de una información asociada a cada agente (o cada patch) o se trata de una cantidad que vale lo mismo para todos.
Si cada agente puede tener un valor diferente, entonces es un atributo
Por ejemplo, la variable dias_sin_comer es específica de cada vaca. Una vaca puede llevar 2 días, y otra ninguno.
Si todos los agentes tendrán el mismo valor, o es un valor único, entonces es una variable global
Por ejemplo, la variable "numero_agentes" es una variable global, porque ese número es único (no habrán varios valores de "numero_agentes").
Así pues, podemos decir que son variables gloables:
numero_vacas
voracidad
tasa_crecimiento
velocidad
Podemos decir que son atributos:
dias_sin_comer
cantidad_hierba
Los agentes (y los patches) parten de un momento inicial. En ese momento inicial, cada variable debe tener un valor adecuado. Plantéate de qué valores se trata y detállalo. Por ejemplo, para las variables globales, podemos determinar:
La variable "numero-individuos" vale inicialmente 50
La variabe "velocidad" vale inicialmente 5
La variable "tasa-crecimiento" vale inicialmente 50
La variable "voracidad" vale inicialmente 3
Para los atributos podemos determinar:
El atributo "dias-sin-comer" vale inicialmente 0 para cada vaca
El atributo "cantidad-hierba" vale inicialmente 10 para cada patch
El comportamiento de un agente se define a través de la forma en que cambia el valor de sus atributos, y los atributos de los otros. Por ejemplo:
El atributo cantidad-hierba aumenta cada tasa-crecimiento ticks.
Una vaca reduce el atributo cantidad-hierba en 1 en el patch en el que está, suponiendo que el valor de dicha variable es mayor a 0.
Cuando una vaca está en un patch cuyo atributo cantidad-hierba vale 0, se incrementan el atributo dias_sin_comer en 1.
Variables globales
Atributos de los agentes y los patches
Función setup
Inicialización de variables globales
Creación e inicialización de agentes
Inicialización de paches (en caso de ser necesario)
Función Go
Definición del comportamiento de los agentes
Definición del comportamiento de los patches (en caso de ser necesario)
Acciones adicionales (como avanzar en los ticks o modificar el valor de alguna variable global).
Como ejemplo del resultado final, puedes consultar el documento especificaciones_vacas_prado.txt
Actividad 4. Ya hemos visto cómo usar de forma básica el lenguaje y la interfaz de NetLogo. Ahora, crea tú sol@ una simulación que resuelva el siguiente problema:
¿Ayudan las vacunas a contener las enfermedades?
En nuestro mundo virtual hay una enfermedad que tiene un cierto índice de contagiosidad. De cada persona que contrae la enfermedad, hay un cierto índice de mortalidad. Cada persona se mueve aleatoriamente por el espacio de la simulación. Si una persona se encuentra con una infectada, tiene una probabilidad de contagiarse determinada por el índice de contagiosidad. Las personas infectadas se recuperan o mueren tras un periodo de duración de la enfermedad. Hay un cierto índice de vacunación, que determina el número de personas que están vacunadas inicialmente. Estas personas nunca se contagian ni transmiten la enfermedad.
Define unas especificaciones formales para el problema.
Utiliza ChatGPT para obtener un código fuente en NetLogo para resolver el problema.
Corrige el código y añade los elementos necesarios para la visualización del problema (deslizadores, gráficas, etc).
Comprueba que la simulación funciona.
Según tu modelo, ¿Qué influencia tienen las vacunas sobre la evolución de una enfermedad muy contagiosa y mortal sobre una población grande (de más de 100 individuos)?
Entrega la consulta que has hecho a ChatGPT (o similar) así como el código de NetLogo.
Actividad 5. En el ejercicio anterior, te las tuviste que ingeniar para describir las especificaciones de la simulación. Ahora analiza el comportamiento de tu modelo para poder responder a la pregunta ¿Qué influencia tienen las vacunas sobre la evolución de una enfermedad muy contagiosa y mortal sobre una población grande?
Debes fundamentar la respuesta en datos, y en su análisis. Aplica las técnicas que has aprendido en el tema de BigData para poder extraer conocimiento a partir de los datos.
Finalmente, elabora un informe donde expliques tus conclusiones. ¿Coincide la respuesta con lo que esperabas? Si no es así, explica a puede deberse esta discrepancia.
Entrega el informe, donde incluyas todas las evidencias recabadas y las conclusiones que has extraido.
En el ejercicio anterior, te las tuviste que ingeniar para describir las especificaciones de la simulación. Partías de un folio en blanco. Ahora que ya conoces los pasos que deben guiar tus ideas, puedes utilizar el siguiente documento ficha-modelo. Este documento te permitirá mantener mejor el orden del proceso de pensamiento.
Actividad 6. Elige una de las siguientes simulaciones:
Regulación del azúcar en sangre: https://ccl.northwestern.edu/netlogo/models/BloodSugarRegulation
Lee la información que te ofrece el modelo y realiza un experimento.
Antes de realizar el experimento:
Asegúrate de entender sobre qué trata la simulación y qué significan las variables.
Decide tu variables de interés.
Ejecuta múltiples veces la simulación para ver qué aspectos de la simulación se pueden observar y recoger en cada simulación. Elige varios parámetros observables.
Realiza el experimento:
Repite la simulación un número de veces para tener suficiente volumen de datos para extraer conclusiones.
Registra las observaciones realizadas sobre los parámetros decididos.
Aplica las técnicas vistas en BigData para extraer conclusiones en cuanto a:
Tendencias
Correlaciones
Modelos predictivos que se puedan obtener
Cuando realices el experimento:
Toma capturas sobre el resultado de cada prueba
Rellena la plantilla con los resultados
Para terminar:
Utiliza las capturas, junto con la información recogida en la plantilla, para crear una presentación electrónica explicando el experimento, los resultados obtenidos y tu conclusión sobre la variable de tu elección. Aplica lo que has aprendido en el tema de Big Data.
Entrega:
El documento de recogida de datos, incluyendo los resultados de los experimentos, las gráficas y las conclusiones extraídas.
Ten en cuenta:
Que el número de pruebas sea al menos de 3.
Que las observaciones realizadas en cada prueba valoren varios aspectos del resultado (en el ejemplo de las abejas, se usó el tiempo requerido, el número de sitios sin revisar, el peso del sitio elegido, etc.)
Que la conclusión tenga relación con las observaciones realizadas, y que explique de qué forma afecta (o no afecta) la variable estudiada al resultado.
Que el lenguaje utilizado sea correcto y legible (evitanto el lenguaje telegráfico o el ahorro excesivo de lenguaje).