PROYECTO FINAL¶


Moscas de las flores: descubriendo su distribución con la ayuda de la ciencia ciudadana¶

Estudiantes:

  • Rosa María Estrada Hernández
  • Luis Andrés Arévalo Rodríguez

Descripción del proyecto y justificación.

Las moscas de las flores (Syrphidae) son un grupo de insectos diversos, ecológicamente importantes, que proveen numerosos servicios ecosistémicos como polinizadores, controladores biológicos y descomponedores. Actualmente la distribución geográfica en América no está bien documentada. La falta de información sobre la distribución de estas moscas dificulta la toma de decisiones informadas sobre su conservación y manejo. Este proyecto pretende utilizar datos de ciencia ciudadana de la plataforma de iNaturalist para comprender la distribución en Centro América de la familia Syrphidae teniendo representación de géneros y especies en todo el continente Americano

Antecedentes

Biología de Syrphidae

Los Syrphidae comúnmente llamados moscas de las flores (flower flies), pueden observarse alrededor o posados en las flores en búsqueda de alimento (néctar o polen), machos en búsqueda de hembras para reproducirse, hembras explorando sitios adecuados para la ovoposición. Las larvas pueden encontrarse en ambientes acuáticos (por ejemplo, Eristalis sp.) o terrestres. En cuanto sus hábitos alimenticios, son muy diversos, algunas especies son saprófagas especializadas en material vegetal o depredadoras de grupos de Formicidae (Hymenoptera) o Sternorrhyncha (Hemiptera) (Thompson et al., 2010; Rodríguez-Gasol et. al., 2020). Debido a esta gran diversidad en su biología, estas moscas son consideradas de gran importancia por los servicios ecosistémicos que ofrecen. Algunas especies son utilizadas en invernaderos para la polinización de flores, otras son empleadas como controladores biológicos de plagas en plantaciones de cultivos agrícolas (Sommaggio, 1999; Thompson et al., 2010; Rodríguez-Gasol et. al., 2020).

Morfología de Syrphidae

Los Sírfidos tienen un rango de tamaño entre 4-35mm, son fácilmente distinguibles de otros dípteros por **la presencia de la “vena espuria” ** en sus alas. Su apariencia suele ser llamativa y agradable a la vista, usualmente con marcas de colores vibrantes en el abdomen. De hecho, algunas especies presentan mimetismo batesiano, imitando color y forma de abejas (Apidae) y avispas (Vespidae) para confundir a sus depredadores (Sommaggio, 1999)

Taxonomía de Syrphidae

La familia Syrphidae se caracteriza por su gran diversidad de especies, cuenta con más de 6,000 especies descritas en todo el mundo. Está constituida por tres subfamilias: Eristalinae, Microdontinae y Syrphinae (Sommaggio, 1999; Rodríguez-Gasol et al., 2020). La subfamilia Eristalinae está conformada por 160 géneros y 4,260 especies. La subfamilia Syrphinae es la segunda subfamilia con mayor representación, está conformada por 87 géneros y 2049 especies. La subfamilia Microdontinae está conformada por 41 géneros y 512 especies (Vockeroth, 1969; Thompson et al., 2010). En la region Neotropical se registran 1600 especies agrupadas en 60 géneros(Thompson, 1999)

La entomología y la ciencia de datos

Con el incremento de información disponible en diversos medios digitales, la forma de recopilar información se ha transformado y renovado. En la actualidad, Big Data se ha convertido en una parte integral de la sociedad moderna. Haciendo uso de estas nuevas herramientas la entomología ha intentado responder algunas preguntas importantes ¿Están disminuyendo las poblaciones de insectos?, ¿Con cuánta rapidez está disminuyendo la diversidad de insectos?, ¿Cómo responden los insectos al cambio climático? ¿Cuáles son los patrones de dispersión de las plagas agrícolas o insectos vectores de enfermedades? (Lee, 2024)

Actualmente la digitalización de colecciones entomológicas, ha llevado a resolver cómo alojar una gran cantidad de información importante ya contenida en una ficha para cada especie a ser de conocimiento público y que pueda ser utilizada por los investigadores. Sin embargo, esta no es una tarea sencilla debido al volumen de datos, por ejemplo, el National Museum of Natural History, del Instituto Smithsonian se estima que contiene alrededor de 34 millones de insectos, de los cuales solo 421,698 registros se encuentran disponibles a través de plataformas como GBIF (Short et. al., 2018).

El camino sigue siendo extenso hacia la completa digitalización, de la cantidad, la calidad y la disponibilidad de datos. En la última década se ha logrado un aumento importante de los datos de las colecciones, lo que ha permitido utilizar herramientas de modelado de nichos ecológicos, capaces de analizar esa gran cantidad de datos de distribución de los especímenes, detectando cambios y logrando predecir tendencias futuras en el rango de insectos (Short et. al. 2018). Un ejemplo de ello serían las abejas, los esfuerzos en digitalizar los datos de un taxón han permitido aportar información valiosa sobre la distribución de las especies, efectos del cambio climático y evolución (Short et. al., 2018)

Por otra parte, tenemos la ciencia ciudadana, una herramienta invaluable para el estudio de la biodiversidad y la biogeografía. Específicamente se puede notar el impacto de plataformas como iNaturalist donde converge la colaboración entre naturalistas (científicos profesionales y ciudadanos), con este nuevo enfoque los ciudadanos ya son parte activa de un proceso científico. Es de tomar en cuenta que plataformas como esta cuentan con algunos sesgos propios de la toma de datos, siendo conscientes de las limitaciones y alcances de los datos (Lee, 2024).

Es probable que en el caso de la entomología se presenten más registros de aquellos insectos que sean más grandes, llamativos tanto en su color o forma y que por la misma dinámica estos sean fotografiados para reconocer su origen o la curiosidad de si representan un posible peligro. Otro de los aspectos a considerar es la distribución de observaciones, que regularmente suceden en lugares con altas densidades poblacionales, con personas que tienen un mayor conocimiento sobre estas herramientas, a diferencia de aquellos lugares menos concurridos o accesibles que presentan una menor cantidad de registros o ausencia de estos (Lee, 2024).

Se puede observar cómo los esfuerzos de digitalización de un taxón pueden aportar información valiosa sobre la distribución de las especies y el cambio climático. En Dinamarca Olsen et. al., (2020) realizó un estudio explorando la respuesta fenológica de los sírfidos daneses (Syrphidae) al continuo aumento de las temperaturas anuales, para ello utilizaron datos digitalizados del Natural History Museum Aarhus (NHMA) y del Natural History Museum of Denmark (NHMD), registros de datos de ciencia ciudadana provenientes del Atlas of Danish Hoverflies que forma parte del Naturbasen, que es el proyecto de ciencia ciudadana más grande de Dinamarca, utilizado desde el 2001.

Los desafíos presentes son igualados por las oportunidades que la liberación y recopilación de datos pueden desbloquear, las preguntas de investigación que se pueden abordar son incontables (Short et. al., 2018).

Descripción del problema y objetivos

En la sociedad humana los insectos son observados como plagas y vectores de enfermedades, pero estos representan un papel muy importante y esencial dentro de nuestros ecosistemas, como polinizadores, descomponedores, controladores biológicos y otros aspectos que son propios de las dinámicas del ecosistema. El estudio de la distribución de las especies es fundamental para comprender la biodiversidad y los servicios ecosistémicos que ofrecen. Sin embargo, la obtención de datos de distribución precisos y completos puede ser un desafío, especialmente para grupos de organismos diversos y ampliamente distribuidos como las moscas de las flores (Syrphidae).

Las moscas de las flores son un grupo de insectos con una gran diversidad de especies, sin embargo, su distribución geográfica aún no está bien documentada, en la mayoría de países de América. La falta de información sobre la distribución de las moscas de las flores dificulta la toma de decisiones informadas sobre su conservación y manejo; sería difícil saber si una especie está en peligro de extinción o si necesita protección especial.

La ciencia ciudadana puede ser una herramienta valiosa para recopilar datos de distribución de insectos. Sin embargo, también tienen limitaciones, como estar sesgados hacia áreas con mayor actividad de observadores o hacia especies que son más fáciles de observar. Este estudio tiene como objetivo utilizar datos de ciencia ciudadana de iNaturalist para estimar la distribución de las especies de la familia Syrphidae en Centro América.

Objetivos

General:

  • Comprender la distribución de las especies de la familia Syrphidae en Centro América utilizando datos de ciencia ciudadana de iNaturalist.

Específicos:

  • Determinar la cantidad de especies reportadas en Centro América y el número de registros para cada una de ellas.
  • Analizar la distribución de las especies por país en Centro América.
  • Determinar la cantidad de especies de acuerdo con sus hábitos alimenticios.
  • Crear mapa de distribución geográfica para las especies con la mayor cantidad de registros.

Descripción del conjunto de datos a utilizar con referencia formal a la fuente

Se utilizó como fuente de datos la página de iNaturalist(2024, mayo 24). En primera instancia se realizó una búsqueda en la página sobre la cantidad de observaciones, que sean grado de investigación, para Syrphidae en Centro América. Aplicados los filtros se obtuvo un total de 507 registros con grado de investigación, procedimos a descargarlos de la página y se aplicaron nuevamente las opciones de la información que deseábamos utilizar en el archivo csv a descargar.

Referencias bibliográficas

Lee, L. (2024, febrero 26). How can we use big data from iNaturalist to address important questions in Entomology? [Berkeley D-Lab]. Retrieved from https://dlab.berkeley.edu/

iNaturalist. (2024, mayo 24). Conjunto de observaciones de Syrphidae en Centro América, iNaturalist. https://www.inaturalist.org/.

Olsen, K., Holm, T. E., Pape, T., & Simonsen, T. J. (2020). Natural history museum collection and citizen science data show advancing phenology of Danish hoverflies (Insecta: Diptera, Syrphidae) with increasing annual temperature. PloS one, 15(5).

Rodríguez-Gasol, N., Alins, G., Veronesi, E. R., & Wratten, S. (2020). The ecology of predatory hoverflies as ecosystem-service providers in agricultural systems. Biological Control, 151, 104405.

Short, A. E. Z., Dikow, T., & Moreau, C. S. (2018). Entomological collections in the age of big data. Annual Review of Entomology, 63, 513-530.

Sommaggio, D. (1999). Syrphidae: can they be used as environmental bioindicators?. Agriculture, ecosystems & environment, 74(1-3), 343-356.

Thompson, FC. (1999). A key to the genera of the flower flies (Diptera: Syrphidae) of the Neotropical Region including descriptions of new genera and species and a glossary of taxonomic terms used. Contributions on Entomology International, 3, 321-378.

Thompson, F. C., Rotheray, G. E., & Zumbado, M. A. (2010). Syrphidae (flower flies) en B.V. Brown (Ed.), Manual of Central American Diptera(Vol. 2, pp. 763-792). NRC Research Press.

Vockeroth, J. R. (1969). A revision of the genera of the Syrphini (Diptera: Syrphidae). The Memoirs of the Entomological Society of Canada, 101(S62), 5-176.

Importación de Datos y Análisis Exploratorio de Datos (EDA) inicial¶

In [ ]:
#importamos las bibliotecas necesarias
!pip install geodatasets
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import geopandas as gpd
import geodatasets
Collecting geodatasets
  Downloading geodatasets-2023.12.0-py3-none-any.whl (19 kB)
Requirement already satisfied: pooch in /usr/local/lib/python3.10/dist-packages (from geodatasets) (1.8.1)
Requirement already satisfied: platformdirs>=2.5.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (4.2.2)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (24.0)
Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (2.31.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (3.7)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (2024.2.2)
Installing collected packages: geodatasets
Successfully installed geodatasets-2023.12.0
In [ ]:
#cargamos la base de datos de interés en un dataframe
df_original = pd.read_csv("syrphidae.csv")

#creamos otro df que será copia del original para ir sobreescribiendo la copia
df= df_original
In [ ]:
#Revisamos que la cantidad de filas y columnas correspondan con las que ya conocemos que contiene el archivo csv.
df.shape
Out[ ]:
(507, 50)

Limpieza y transformación de datos¶

In [ ]:
#Imprimimos el contenido del indice para luego sobreescribir el df
#Sobreescribimos el df para seleccionar la información a trabajar
#Imprimos nuevamente el indice del df para confirmar que ha sido sobreescrito con lo seleccionado.

print("Antes", df.columns)
print('\n')

df= df[["latitude", "longitude", "place_country_name", "place_state_name", "taxon_subfamily_name", "taxon_genus_name", "taxon_species_name", "scientific_name", "common_name"]]
print("Despues", df.columns)
Antes Index(['latitude', 'longitude', 'place_country_name', 'place_state_name',
       'taxon_subfamily_name', 'taxon_genus_name', 'taxon_species_name',
       'scientific_name', 'common_name'],
      dtype='object')


Despues Index(['latitude', 'longitude', 'place_country_name', 'place_state_name',
       'taxon_subfamily_name', 'taxon_genus_name', 'taxon_species_name',
       'scientific_name', 'common_name'],
      dtype='object')
In [ ]:
#revisamos el tipo de datos de cada columna
df_datos= df.dtypes
print(df_datos)
latitude                float64
longitude               float64
place_country_name       object
place_state_name         object
taxon_subfamily_name     object
taxon_genus_name         object
taxon_species_name       object
scientific_name          object
common_name              object
dtype: object
In [ ]:
#Revisamos si existen valores nulos para las columnas
df.isnull().sum()
Out[ ]:
latitude                  0
longitude                 0
place_country_name        1
place_state_name          1
taxon_subfamily_name      0
taxon_genus_name          0
taxon_species_name        6
scientific_name           0
common_name             136
dtype: int64
In [ ]:
#ubicamos la fila especifica del valor nulo para la variable 'place_country_name'
fila_nan= df['place_country_name'].isna()
print(df.loc[fila_nan])
    latitude  longitude place_country_name place_state_name  \
33  7.536764 -90.175779                NaN              NaN   

   taxon_subfamily_name taxon_genus_name taxon_species_name  \
33            Syrphinae        Toxomerus  Toxomerus politus   

      scientific_name     common_name  
33  Toxomerus politus  Mosca del maíz  
In [ ]:
#Verificamos las coordenadas, están en lugar remoto del pacífico de CA
# desplegamos toda la información del df_original para acceder al url del registro
#la persona que registró ha hecho una mala ubicación, el registro real es de USA
print(df_original.iloc[33])
id                                                                           17941595
observed_on_string                            Sun Oct 28 2018 12:00:24 GMT-0500 (CDT)
observed_on                                                                2018-10-28
time_observed_at                                              2018-10-28 17:00:24 UTC
time_zone                                                  Central Time (US & Canada)
user_id                                                                        865665
user_login                                                                  rosew1122
user_name                                                                         NaN
created_at                                                    2018-10-29 19:37:43 UTC
updated_at                                                    2020-08-24 22:19:17 UTC
quality_grade                                                                research
license                                                                           NaN
url                                 https://www.inaturalist.org/observations/17941595
image_url                           https://static.inaturalist.org/photos/27412814...
sound_url                                                                         NaN
tag_list                                                                          NaN
description                                                                       NaN
num_identification_agreements                                                       2
num_identification_disagreements                                                    0
captive_cultivated                                                              False
oauth_application_id                                                              3.0
place_guess                                                 North Pacific Ocean, , , 
latitude                                                                     7.536764
longitude                                                                  -90.175779
positional_accuracy                                                         2931896.0
private_place_guess                                                               NaN
private_latitude                                                                  NaN
private_longitude                                                                 NaN
public_positional_accuracy                                                  2931896.0
geoprivacy                                                                        NaN
taxon_geoprivacy                                                                  NaN
coordinates_obscured                                                            False
positioning_method                                                                NaN
positioning_device                                                                NaN
place_town_name                                                                   NaN
place_county_name                                                                 NaN
place_state_name                                                                  NaN
place_country_name                                                                NaN
place_admin1_name                                                                 NaN
place_admin2_name                                                                 NaN
species_guess                                                      Maize Calligrapher
scientific_name                                                     Toxomerus politus
common_name                                                            Mosca del maíz
iconic_taxon_name                                                             Insecta
taxon_id                                                                       146632
taxon_subfamily_name                                                        Syrphinae
taxon_genus_name                                                            Toxomerus
taxon_genushybrid_name                                                            NaN
taxon_species_name                                                  Toxomerus politus
taxon_subspecies_name                                                             NaN
Name: 33, dtype: object
In [ ]:
#Eliminamos el registro 33
df.drop(33, inplace=True)

#nos da la advertencia que estamos eliminado filas de una copia del df, pero si lo ejecutó.
In [ ]:
#revisamos cuales son las filas con los datos NaN en la columna especies
species_nan= df['taxon_species_name'].isna()
print(df.loc[species_nan])
      latitude  longitude place_country_name place_state_name  \
6    16.763000 -91.146000             Mexico          Chiapas   
38    9.068365 -79.365929             Panama           Panamá   
89   10.324192 -84.816266         Costa Rica       Puntarenas   
103  10.213774 -83.789787         Costa Rica            Limón   
111   8.700151 -83.202426         Costa Rica       Puntarenas   
308   9.119023 -79.713649             Panama            Colón   

    taxon_subfamily_name taxon_genus_name taxon_species_name  \
6              Syrphinae        Toxomerus                NaN   
38           Eristalinae          Palpada                NaN   
89             Syrphinae     Leucopodella                NaN   
103          Eristalinae          Ornidia                NaN   
111            Syrphinae        Toxomerus                NaN   
308          Eristalinae          Palpada                NaN   

       scientific_name         common_name  
6    Toxomerus musicus                 NaN  
38             Palpada     Moscas de felpa  
89        Leucopodella                 NaN  
103            Ornidia  Moscas  joya verde  
111          Toxomerus   Moscas calígrafas  
308            Palpada     Moscas de felpa  
In [ ]:
#revisamos en el df original el url de cada registro para confirmar que no habían datos faltantes a la hora de importar el archivo
#encontramos las id de las especies hasta genero por la calidad de la fotos.
sp_nan= df_original['taxon_species_name'].isna()
sp_filtradas = df_original.loc[sp_nan]
print(sp_filtradas['url'])
6       https://www.inaturalist.org/observations/5951808
38     https://www.inaturalist.org/observations/20765617
89     https://www.inaturalist.org/observations/38408560
103    https://www.inaturalist.org/observations/45579071
111    https://www.inaturalist.org/observations/48561051
308    https://www.inaturalist.org/observations/10516...
Name: url, dtype: object
In [ ]:
#reemplazamos NaN por el valor unknow
df['taxon_species_name'].fillna('unknow', inplace=True)
In [ ]:
#aunque el nombre común no sea un valor tan necesario, solo aspectos descriptivos del documento
#le sustituiremos los NaN por el valor 'flower_fly' que es el nombre común de la familia
df['common_name'].fillna('flower_fly', inplace=True)
In [ ]:
#revisamos si aparecen valores nulos
df.isnull().sum()
Out[ ]:
latitude                0
longitude               0
place_country_name      0
place_state_name        0
taxon_subfamily_name    0
taxon_genus_name        0
taxon_species_name      0
scientific_name         0
common_name             0
dtype: int64
In [ ]:
#confirmamos la cantidad de filas y columnas del df después de la limpieza y transformación de datos
df.shape
Out[ ]:
(506, 9)
In [ ]:
#Filtramos el df por país para aseguranos que solamente analizaremos registros de paises de Centro América
paises = {"Guatemala", "El Salvador", "Honduras", "Nicaragua", "Costa Rica", "Panama"}
df= df[df['place_country_name'].isin(paises)]
paises_listado=(df['place_country_name']).value_counts()

print(paises_listado)
place_country_name
Honduras       175
Costa Rica     120
Nicaragua       68
Guatemala       55
Panama          52
El Salvador     11
Name: count, dtype: int64
In [ ]:
#confirmamos la cantidad de filas y columnas del df después de la limpieza
df.shape
Out[ ]:
(481, 9)

Objetivo¶

Comprender la distribución de las especies de la familia Syrphidae en Centro América utilizando datos de ciencia ciudadana de iNaturalist.¶

Aspectos generales de la distribución de subfamilias¶

In [ ]:
#utilizamos groupby para agrupar el df por la columna subfamila
#contabilizamos las especies con nunique para que solo cuente 1 vez el registro
#reset_index para que el resultado se presente como un nuevo df donde cada subfamilia es una fila
sp_subfamilia= df.groupby('taxon_subfamily_name')['scientific_name'].nunique().reset_index()
print(sp_subfamilia)
  taxon_subfamily_name  scientific_name
0          Eristalinae               34
1        Microdontinae                2
2            Syrphinae               23
In [ ]:
cod_subfamilia= {"Eristalinae": 1, "Microdontinae":2, "Syrphinae":3}

n_subfamilia= sp_subfamilia['taxon_subfamily_name'].replace(cod_subfamilia)
In [ ]:
# Tamaño del gráfico.
plt.figure(figsize=(4, 4))

#formato del grafico
leyenda= ["Microdontinae", "Syrphinae", "Eristalinae"]
colores= ['#9370DB','#FFD700','#9ACD32'] #utilizamos colores de la paleta disponible para HTML
explode = (0.1, 0, 0)
wedgeprops= {'linewidth': 1.5,'edgecolor': 'black'}

# Crear la gráfica de pastel
plt.pie(n_subfamilia, labels= leyenda,  explode= explode, colors= colores, wedgeprops= wedgeprops, autopct='%1.1f%%')

# Título del gráfico
plt.title('Distribucion de especies por subfamilia')

plt.show()
No description has been provided for this image
In [ ]:
#agrupamos el df por pais y filtramos por subfamilia
pais_subfamilia= df.groupby('place_country_name')['taxon_subfamily_name'].nunique().reset_index()
print(pais_subfamilia)
  place_country_name  taxon_subfamily_name
0         Costa Rica                     3
1        El Salvador                     3
2          Guatemala                     2
3           Honduras                     3
4          Nicaragua                     3
5             Panama                     2
In [ ]:
#aca agrupé a la inversa para ver cuantos paises y así saber cual era la subfamilia
pais_subfamilia2= df.groupby('taxon_subfamily_name')['place_country_name'].nunique().reset_index()
print(pais_subfamilia2)
  taxon_subfamily_name  place_country_name
0          Eristalinae                   6
1        Microdontinae                   4
2            Syrphinae                   6
In [ ]:
#se que es facil por deducción sacar donde no está, pero solo así logré ubicar el taxon aunque no de la forma que queria
df_filSubf= df[df['taxon_subfamily_name']== 'Microdontinae']
eri_subfamilia= df_filSubf.groupby('place_country_name')['taxon_subfamily_name'].nunique().reset_index()
print(eri_subfamilia)
  place_country_name  taxon_subfamily_name
0         Costa Rica                     1
1        El Salvador                     1
2           Honduras                     1
3          Nicaragua                     1

Objetivo 1: Determinar la cantidad de especies reportadas en Centro América y el número de registros para cada una de ellas.¶

In [ ]:
#contabilizamos el numero de especies únicas - utilizamos nunique() para evitar que contabilice valores repetidos
sp_ca= df['scientific_name'].nunique()

#Contabilizamos el numero de registros, aca si utilizamos el value_counts ya que si nos interesan las repeticiones de la especie
sp_reg= df['scientific_name'].value_counts()

#imprimimos el valor con el mensaje de respuesta
print(f"El número de especies de moscas de la familia Syrphidae reportadas para Centro América es:\n {sp_ca}\n")
print(f"El número registros para las especies reportadas en Centro América es:\n {sp_reg}")
El número de especies de moscas de la familia Syrphidae reportadas para Centro América es:
 59

El número registros para las especies reportadas en Centro América es:
 scientific_name
Toxomerus politus           127
Ornidia obesa                81
Palpada furcata              35
Palpada mexicana             32
Toxomerus pulchellus         19
Asemosyrphus mexicanus       18
Copestylum tympanitis        15
Toxomerus pictus             14
Dioprosopa clavata           12
Copestylum sexmaculatum      10
Menidon falcatus              9
Palpada vinetorum             8
Meromacrus loewi              5
Allograpta obliqua            5
Eristalis tenax               5
Toxomerus bistrigus           5
Eristalis alleni              5
Toxomerus dispar              4
Palpada pusilla               4
Toxomerus virgulatus          4
Salpingogaster nigra          4
Eristalis gatesi              4
Lycastrirhyncha nitens        4
Toxomerus marginatus          3
Palpada fasciata              3
Toxomerus mutuus              2
Toxomerus floralis            2
Hybobathus phaeopterus        2
Palpada albifrons             2
Meromacrus anna               2
Meromacrus laconicus          2
Eristalis circe               2
Copestylum ornatum            2
Copestylum limbipenne         2
Lycopale woodi                2
Milesia pulchra               2
Palpada                       2
Syrphus opinator              1
Rhinoprosopa nasuta           1
Palpada agrorum               1
Callicera duncani             1
Ocyptamus fuscipennis         1
Ocyptamus gastrostactus       1
Toxomerus                     1
Polybiomyia schnablei         1
Mimocalla willistoni          1
Ornidia major                 1
Mimocalla tristani            1
Fazia micrura                 1
Palpada alhambra              1
Milesia bella                 1
Mallota klepsvikae            1
Eristalinus taeniops          1
Ornidia                       1
Rhinoprosopa zophina          1
Leucopodella                  1
Meromacrus gloriosus          1
Polybiomyia schwarzi          1
Syrphipogon fucatissimus      1
Name: count, dtype: int64
In [ ]:
# Gráfico de barras para mostrar el número de registros por especie de Syrphidae
# Para Centro América

barra = sp_reg.plot(kind = "barh", color = 'white', edgecolor = 'red', figsize = (15,10))

barra.set_title("Total de reportes de especies de Syrphidae\nen Centroamérica", fontsize = 20)

barra.set_ylabel("Especie", fontsize = 14)
barra.set_yticklabels(labels=sp_reg.index, fontdict = {'fontsize': 7.5})
barra.set_xlabel("Número de reportes", fontsize = 14)
barra.grid(axis = 'x', linestyle = '--', color= "black", alpha= 0.5)
No description has been provided for this image

Objetivo 2: Analizar la distribución de las especies por país en Centro América¶

Generar geoposición a partir de coordenadas (longitud y latitud) del dataframe¶

In [ ]:
## Vamos a incluir las geoposiciones al dataframe, para poder generar mapas
geo = gpd.points_from_xy(df.longitude, df.latitude)

df_geo= gpd.GeoDataFrame(df, geometry=geo)

## Aquí es solo para verificar que se agregó la columna de coordenadas
print(df_geo)
      latitude  longitude place_country_name place_state_name  \
0    10.186062 -84.232017         Costa Rica         Alajuela   
1    14.565559 -89.347311          Guatemala       Chiquimula   
2    10.804979 -85.397586         Costa Rica       Guanacaste   
3    11.229722 -85.551120          Nicaragua        Nicaragua   
4     9.393755 -84.151476         Costa Rica       Puntarenas   
..         ...        ...                ...              ...   
502  10.030168 -84.106430         Costa Rica          Heredia   
503   9.989997 -84.345917         Costa Rica         Alajuela   
504   9.612617 -82.704404         Costa Rica            Limón   
505  10.383321 -84.617994         Costa Rica         Alajuela   
506   9.407072 -84.160408         Costa Rica       Puntarenas   

    taxon_subfamily_name taxon_genus_name    taxon_species_name  \
0            Eristalinae        Eristalis      Eristalis alleni   
1              Syrphinae   Salpingogaster  Salpingogaster nigra   
2            Eristalinae          Ornidia         Ornidia obesa   
3            Eristalinae      Polybiomyia  Polybiomyia schwarzi   
4            Eristalinae          Ornidia         Ornidia obesa   
..                   ...              ...                   ...   
502          Eristalinae          Ornidia         Ornidia obesa   
503          Eristalinae          Ornidia         Ornidia obesa   
504          Eristalinae          Ornidia         Ornidia obesa   
505          Eristalinae          Ornidia         Ornidia obesa   
506          Eristalinae          Ornidia         Ornidia obesa   

          scientific_name       common_name                    geometry  
0        Eristalis alleni        flower_fly  POINT (-84.23202 10.18606)  
1    Salpingogaster nigra        flower_fly  POINT (-89.34731 14.56556)  
2           Ornidia obesa  Mosca joya verde  POINT (-85.39759 10.80498)  
3    Polybiomyia schwarzi        flower_fly  POINT (-85.55112 11.22972)  
4           Ornidia obesa  Mosca joya verde   POINT (-84.15148 9.39375)  
..                    ...               ...                         ...  
502         Ornidia obesa  Mosca joya verde  POINT (-84.10643 10.03017)  
503         Ornidia obesa  Mosca joya verde   POINT (-84.34592 9.99000)  
504         Ornidia obesa  Mosca joya verde   POINT (-82.70440 9.61262)  
505         Ornidia obesa  Mosca joya verde  POINT (-84.61799 10.38332)  
506         Ornidia obesa  Mosca joya verde   POINT (-84.16041 9.40707)  

[481 rows x 10 columns]
In [ ]:
# Importamos el dataset naturalearth_lowres de geopandas
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))

# Y revisamos el nombre de las columnas que conforman el dataset
world.columns
<ipython-input-2-91a7b2547128>:2: FutureWarning: The geopandas.dataset module is deprecated and will be removed in GeoPandas 1.0. You can get the original 'naturalearth_lowres' data from https://www.naturalearthdata.com/downloads/110m-cultural-vectors/.
  world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
Out[ ]:
Index(['pop_est', 'continent', 'name', 'iso_a3', 'gdp_md_est', 'geometry'], dtype='object')
In [ ]:
# Para extraer la región de Centro América, de nuestro interés
# Utilizamos la lista paises, que construimos antes para delimitar

CA = world[world.name.isin(paises)]

## Estas son dos formas de presentar el área de interés.  Seguro utilizaremos la segunda
## de boundary, porque nos va a dejar plasmar los puntos de las diferentes observaciones

#print(CA.plot())
print(CA.boundary.plot(figsize = (15,9)))
Axes(0.193633,0.11;0.637734x0.77)
No description has been provided for this image

Dividir el mapa de Centro América para extraer cada país y representar los datos por país.¶

In [ ]:
#creamos un nuevo df filtrando para especificamente Guatemala
gt_conteo_sp= df[df['place_country_name'] == "Guatemala"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
gt_genero= gt_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
gt_especies_total= gt_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
gt_especies= gt_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para Guatemala son: {gt_genero}\n")
print(f"El total de especies de sírfidos reportados para Guatemala son: {gt_especies_total}\n")

print(gt_especies)
El total de generos de sírfidos reportados para Guatemala son: 14

El total de especies de sírfidos reportados para Guatemala son: 20

scientific_name
Asemosyrphus mexicanus    15
Toxomerus politus         10
Eristalis tenax            5
Palpada mexicana           4
Ornidia obesa              4
Palpada furcata            2
Dioprosopa clavata         2
Toxomerus bistrigus        1
Syrphus opinator           1
Eristalis circe            1
Rhinoprosopa nasuta        1
Mimocalla willistoni       1
Salpingogaster nigra       1
Toxomerus mutuus           1
Palpada pusilla            1
Copestylum ornatum         1
Milesia bella              1
Meromacrus loewi           1
Allograpta obliqua         1
Toxomerus pictus           1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo Guatemala, para poder representar únicamente las especies reportadas para GT

GT = df_geo[df_geo['place_country_name'] == "Guatemala"]

## Aquí gráfico la distribución de especies

lienzo = CA[CA['name'] == "Guatemala"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

GT.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en Guatemala')

#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 47.7222222222222, 'Longitud')
No description has been provided for this image
In [ ]:
#creamos un nuevo df filtrando para especificamente El Salvador
es_conteo_sp= df[df['place_country_name'] == "El Salvador"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
es_genero= es_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
es_especies_total= es_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
es_especies= es_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para El Salvador son: {es_genero}\n")
print(f"El total de especies de sírfidos reportados para El Salvador son: {es_especies_total}\n")

print(es_especies)
El total de generos de sírfidos reportados para El Salvador son: 7

El total de especies de sírfidos reportados para El Salvador son: 9

scientific_name
Toxomerus politus          3
Allograpta obliqua         1
Palpada mexicana           1
Toxomerus pictus           1
Menidon falcatus           1
Dioprosopa clavata         1
Palpada furcata            1
Copestylum sexmaculatum    1
Asemosyrphus mexicanus     1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo El Salvador, para poder representar únicamente las especies reportadas para GT

ES = df_geo[df_geo['place_country_name'] == "El Salvador"]

## Aquí gráfico la distribución de especies

lienzo = CA[CA['name'] == "El Salvador"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

ES.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en El Salvador')

#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 171.40953976830164, 'Longitud')
No description has been provided for this image
In [ ]:
#creamos un nuevo df filtrando para especificamente Honduras
hn_conteo_sp= df[df['place_country_name'] == "Honduras"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
hn_genero= hn_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
hn_especies_total= hn_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
hn_especies= hn_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para Honduras son: {hn_genero}\n")
print(f"El total de especies de sírfidos reportados para Honduras son: {hn_especies_total}\n")

print(hn_especies)
El total de generos de sírfidos reportados para Honduras son: 13

El total de especies de sírfidos reportados para Honduras son: 26

scientific_name
Toxomerus politus          106
Ornidia obesa               10
Palpada mexicana            10
Palpada furcata              7
Toxomerus pulchellus         7
Copestylum tympanitis        4
Toxomerus marginatus         3
Palpada vinetorum            3
Menidon falcatus             3
Dioprosopa clavata           2
Salpingogaster nigra         2
Copestylum sexmaculatum      2
Toxomerus bistrigus          2
Toxomerus pictus             2
Palpada pusilla              1
Callicera duncani            1
Eristalis circe              1
Palpada fasciata             1
Milesia pulchra              1
Toxomerus dispar             1
Asemosyrphus mexicanus       1
Toxomerus virgulatus         1
Polybiomyia schnablei        1
Copestylum ornatum           1
Palpada alhambra             1
Ocyptamus fuscipennis        1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo Honduras, para poder representar únicamente las especies para HN

HN = df_geo[df_geo['place_country_name'] == "Honduras"]

## Aquí gráfico la distribución de géneros

lienzo = CA[CA['name'] == "Honduras"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

HN.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en Honduras')
#lienzo.axis("off")
#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 185.19576723431214, 'Longitud')
No description has been provided for this image
In [ ]:
#creamos un nuevo df filtrando para especificamente Nicaragua
ni_conteo_sp= df[df['place_country_name'] == "Nicaragua"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
ni_genero= ni_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
ni_especies_total= ni_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
ni_especies= ni_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para Nicaragua son: {ni_genero}\n")
print(f"El total de especies de sírfidos reportados para Nicaragua son: {ni_especies_total}\n")

print(ni_especies)
El total de generos de sírfidos reportados para Nicaragua son: 13

El total de especies de sírfidos reportados para Nicaragua son: 23

scientific_name
Ornidia obesa              23
Palpada mexicana            7
Lycastrirhyncha nitens      4
Toxomerus pictus            4
Toxomerus pulchellus        3
Palpada vinetorum           3
Dioprosopa clavata          2
Meromacrus laconicus        2
Toxomerus politus           2
Copestylum limbipenne       2
Lycopale woodi              2
Palpada furcata             2
Palpada fasciata            2
Asemosyrphus mexicanus      1
Hybobathus phaeopterus      1
Toxomerus dispar            1
Polybiomyia schwarzi        1
Copestylum tympanitis       1
Palpada agrorum             1
Menidon falcatus            1
Salpingogaster nigra        1
Meromacrus gloriosus        1
Copestylum sexmaculatum     1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo NICARAGUA, para poder representar únicamente los géneros para NI

NI = df_geo[df_geo['place_country_name'] == "Nicaragua"]

## Aquí gráfico la distribución de géneros

lienzo = CA[CA['name'] == "Nicaragua"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

NI.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en Nicaragua')
#lienzo.axis("off")
#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 64.41652027474117, 'Longitud')
No description has been provided for this image
In [ ]:
#creamos un nuevo df filtrando para especificamente Costa Rica
cr_conteo_sp= df[df['place_country_name'] == "Costa Rica"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
cr_genero= cr_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
cr_especies_total= cr_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
cr_especies= cr_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para Costa Rica son: {cr_genero}\n")
print(f"El total de especies de sírfidos reportados para Costa Rica son: {cr_especies_total}\n")

print(cr_especies)
El total de generos de sírfidos reportados para Costa Rica son: 19

El total de especies de sírfidos reportados para Costa Rica son: 31

scientific_name
Ornidia obesa               37
Palpada furcata             17
Palpada mexicana             7
Eristalis alleni             5
Toxomerus pulchellus         5
Eristalis gatesi             4
Dioprosopa clavata           4
Toxomerus politus            4
Menidon falcatus             4
Meromacrus loewi             4
Copestylum tympanitis        3
Allograpta obliqua           3
Toxomerus pictus             3
Copestylum sexmaculatum      2
Toxomerus virgulatus         2
Ocyptamus gastrostactus      1
Toxomerus bistrigus          1
Ornidia major                1
Mimocalla tristani           1
Milesia pulchra              1
Fazia micrura                1
Ornidia                      1
Hybobathus phaeopterus       1
Palpada pusilla              1
Toxomerus                    1
Mallota klepsvikae           1
Eristalinus taeniops         1
Rhinoprosopa zophina         1
Leucopodella                 1
Palpada vinetorum            1
Syrphipogon fucatissimus     1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo Costa Rica, para poder representar únicamente los géneros para CR

CR = df_geo[df_geo['place_country_name'] == "Costa Rica"]

## Aquí gráfico la distribución de géneros

lienzo = CA[CA['name'] == "Costa Rica"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

CR.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en Costa Rica')
#lienzo.axis("off")
#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 78.20063983056295, 'Longitud')
No description has been provided for this image
In [ ]:
#creamos un nuevo df filtrando para especificamente Panama
pa_conteo_sp= df[df['place_country_name'] == "Panama"]

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de géneros.
pa_genero= pa_conteo_sp['taxon_genus_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades totales de especies.
pa_especies_total= pa_conteo_sp['scientific_name'].nunique()

#creamos un nuevo df y filtramos para contabilizar las cantidades de los registros de especies.
pa_especies= pa_conteo_sp['scientific_name'].value_counts()

#Imprimimos los resultados de cada operación.
print(f"El total de generos de sírfidos reportados para Panama son: {pa_genero}\n")
print(f"El total de especies de sírfidos reportados para Panama son: {pa_especies_total}\n")

print(pa_especies)
El total de generos de sírfidos reportados para Panama son: 6

El total de especies de sírfidos reportados para Panama son: 19

scientific_name
Copestylum tympanitis      7
Ornidia obesa              7
Palpada furcata            6
Copestylum sexmaculatum    4
Toxomerus pulchellus       4
Toxomerus pictus           3
Palpada mexicana           3
Meromacrus anna            2
Toxomerus politus          2
Palpada albifrons          2
Toxomerus floralis         2
Toxomerus dispar           2
Palpada                    2
Toxomerus bistrigus        1
Palpada vinetorum          1
Toxomerus virgulatus       1
Toxomerus mutuus           1
Dioprosopa clavata         1
Palpada pusilla            1
Name: count, dtype: int64
In [ ]:
## Aquí extraigo Panamá, para poder representar únicamente los géneros para PA

PA = df_geo[df_geo['place_country_name'] == "Panama"]

## Aquí gráfico la distribución de géneros

lienzo = CA[CA['name'] == "Panama"].plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

PA.plot(ax = lienzo, column = 'scientific_name', marker = '*', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5), "fontsize": 6})

# Asignar título
lienzo.set_title('Observaciones de especies de SYRPHIDAE en Panama')
#lienzo.axis("off")
#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 203.8983018964459, 'Longitud')
No description has been provided for this image

Objetivo 3. Analizar la distribución geográfica para la especie con la mayor cantidad de registros en Centro América.¶

aquí estoy modificando para que sea las dos especies con mayor número de registros para Centro América¶
In [ ]:
#designamos la especie que tiene mas registros, obtuvimos ese resultado en el objetivo 1
sp_mayor_registro= 'Toxomerus politus'

#agrupamos datos por pais para contabilizar los registros
pais_especie= df[df['scientific_name']== sp_mayor_registro].groupby('place_country_name')['scientific_name'].count().reset_index()

#identificamos el pais con la mayor cantidad de registros
for index, fila in pais_especie.iterrows():
  pais= fila['place_country_name']
  cantidad= fila['scientific_name']

print(pais_especie, '\n')
print(f'Honduras es el pais que presenta la mayor cantidad de registros con 106 para la especie {sp_mayor_registro}')
  place_country_name  scientific_name
0         Costa Rica                4
1        El Salvador                3
2          Guatemala               10
3           Honduras              106
4          Nicaragua                2
5             Panama                2 

Honduras es el pais que presenta la mayor cantidad de registros con 106 para la especie Toxomerus politus

Mapa de distribución de reportes de Toxomerus politus en Centro América

In [ ]:
Tpolitus = df_geo[df_geo['scientific_name'] == "Toxomerus politus"]

lienzo = CA.plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

Tpolitus.plot(ax = lienzo, marker = '*', column = 'scientific_name', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5)})

# Asignar título
lienzo.set_title('Distribución de reportes de\nToxomerus politus en Centro América')

#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 125.39054831442634, 'Longitud')
No description has been provided for this image

Mapa de distribución de reportes de Ornidia obesa en Centro América

In [ ]:
## Me cuentas que te parece este mapa

Oobesa = df_geo[df_geo['scientific_name'] == "Ornidia obesa"]

lienzo = CA.plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

Oobesa.plot(ax = lienzo, marker = '*', column = 'scientific_name', alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5)})

# Asignar título
lienzo.set_title('Distribución de reportes de\nOrnidia obesa en Centro América')

#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 125.39054831442634, 'Longitud')
No description has been provided for this image

Mapa de distribución de reportes de Toxomerus politus y Ornidia obesa en Centro América

In [ ]:
## Me cuentas que te parece este mapa

mayores_sp = df_geo[df_geo['scientific_name'].isin({"Toxomerus politus", "Ornidia obesa"})]

lienzo = CA.plot(
    figsize = (7,7),
    color="white",
    edgecolor="#556B2F",
    linewidth = 0.6
)

mayores_sp.plot(ax = lienzo, marker = '*', column = 'scientific_name',  alpha = 0.5, legend=True,
    legend_kwds={"loc": "center left", "bbox_to_anchor": (0.7, 0.7), 'fontsize': 7})

# Asignar título
lienzo.set_title('Distribución de reportes de\nToxomerus politus y Ornidia obesa en Centro América')
#lienzo.axis("off")
#Labels
lienzo.set_ylabel("Latitud")
lienzo.set_xlabel("Longitud")
Out[ ]:
Text(0.5, 125.39054831442634, 'Longitud')
No description has been provided for this image

Objetivo 4. Determinar la cantidad de especies de acuerdo con sus hábitos alimenticios.¶

In [ ]:
#asignamos S para saprofago y D para depredador
siglas=["S", "D"]

#creamos un diccionario con las especies de acuerdo a la categoria
saprofagos= {"Copestylum", "Dioprosopa", "Eristalinus", "Eristalis","Mallota", "Meromacrus", "Milesia", "Ornidia", "Palpada"}
depredadores= {'Allograpta', 'Asemosyrphus', 'Callicera', 'Fazia', 'Hybobathus', 'Leucopodella', 'Lycastrirhyncha', 'Lycopale', 'Menidon', 'Mimocalla', 'Ocyptamus', 'Polybiomyia', 'Rhinoprosopa', 'Salpingogaster', 'Syrphipogon', 'Syrphus', 'Toxomerus'}

#Funcion categorizar
#utilizaremos los generos para asignar los valores
def asignar_habito_alimenticio(fila):
   if fila["taxon_genus_name"] in saprofagos:
    return "S"
   elif fila ["taxon_genus_name"] in depredadores:
    return "D"
   else:
    return "No_asignado"

# Aplicar la función a cada fila y agregar una nueva columna
df["habito_alimenticio"] = df.apply(asignar_habito_alimenticio, axis=1)
In [ ]:
#revisamos si existen valores nulos para la nueva columna creada
df.isnull().sum()
Out[ ]:
latitude                0
longitude               0
place_country_name      0
place_state_name        0
taxon_subfamily_name    0
taxon_genus_name        0
taxon_species_name      0
scientific_name         0
common_name             0
habito_alimenticio      0
dtype: int64
In [ ]:
#creamos un df nuevo para filtrar los generos cuya casilla de especie dice 'unknow'
df_filtrado= df[df['taxon_species_name'] != 'unknow']
In [ ]:
#creamos un nuevo df para eliminar los duplicados que aparecen de las especies
df_unica= df_filtrado.drop_duplicates(['taxon_species_name'])

#contabilizamos las especies de acuerdo al habito alimenticio
sp_habito= df_unica['habito_alimenticio'].value_counts()
print(sp_habito)
habito_alimenticio
D    28
S    27
Name: count, dtype: int64
In [ ]:
#revisamos el listado de las especies contadas por habito alimenticio.
#sp_habitos= df_unica.groupby('taxon_species_name')[['habito_alimenticio']].value_counts()
#print(sp_habito)
In [ ]:
# Tamaño del gráfico
plt.figure(figsize=(4, 4))

#asignamos colores
colores= ['#ffd100', '#556B2F']

# Crear gráfico de barras
sp_habito.plot(kind='barh', color=colores)

# Título del gráfico
plt.title("Distribución de especies por habito alimenticio")

# Etiqueta del eje Y
plt.ylabel('Habito alimenticio')

# Etiqueta del eje X
plt.xlabel('Cantidad de especies')
plt.grid(alpha=0.4)
plt.show()
No description has been provided for this image
In [ ]:
# Tamaño del gráfico.
plt.figure(figsize=(4, 4))

#formato del grafico
leyenda= ["Depredador: 28 especies", "Saprofago: 27 especies"]
colores= ['#FFD700', '#D2B48C'] #utilizamos colores de la paleta disponible para HTML
explode = (0, 0.05)
wedgeprops= {'linewidth': 2,'edgecolor': 'black','alpha': 0.9}

# Crear la gráfica de pastel
plt.pie(sp_habito, labels= leyenda,  explode= explode, colors= colores, wedgeprops= wedgeprops, autopct='%1.1f%%')

# Título del gráfico
plt.title('Distribucion de especies por habito alimenticio')

plt.show()
No description has been provided for this image

Conclusiones¶

*La distribución en términos de proporción de subfamilias para Centroamérica, es similar a lo documentado en la literatura

*Los registros de las especies pueden estar influenciados por la uso de la zona y la actividad de las personas

*El uso de la herramienta Python permite analizar conjuntos de datos de diferente tamaño de forma multifuncional.

*El uso de la plataforma Colab permite el uso interactivo y colaborativo entre pequeños y grandes grupos.