Datamineo de onicofóros americanos, busqueda y patrones de distribución¶
Integrantes:
- Daniel Sánchez González
- Joshua Ramsés Rodríguez Rodríguez
- Rebeca Quesada Céspedes
Descripción del proyecto Los onicóforos, conocidos por su alto endemismo, habitan en ambientes con elevados índices de humedad, lo que los hace particularmente vulnerables. Se realizó un análisis exploratorio de una base de datos utilizando el lenguaje de programación Python para determinar el estado del arte de los onicóforos en América.
Justificación Al iniciar el estudio de un grupo de organismos determinado, es necesario conocer sus áreas de distribución y las características de estos hábitats. Lo anterior, facilita identificar sitios con condiciones similares, con el objetivo de localizar nuevas poblaciones del grupo de interés. Contar con información base para el trabajo de este grupo zoológico, facilitará definir los posibles lugares de distribución.
Antecedentes El grupo de los onicóforos, también llamados gusanos aterciopelados, tienen una cubierta de quitina que los cubre (Johnson et al., 1969) y se caracterizan por ser de hábitos nocturnos debido al fototropismo negativo (Monge-Nájera, 1996).
Tienen además una baja densidad poblacional, lo que dificulta su observación (Jerez-Jaimes & Bernal-Pérez, 2009) y actualmente solo se encuentran en hábitats terrestres (Barquero-González, Cabrera, Valle-Cubero, Monge-Nájera & Morera-Brenes, 2016).
Debido a que no pueden controlar la pérdida de agua, suelen habitar en ambientes húmedos como bajo la hojarasca, dentro de troncos en descomposición, cerca de fuentes de agua o bajo rocas (Monge-Nájera y Hou, 1999).
Inicialmente en la literatura se reconocían dos familias: Peripatopsidae que se encuentran en Chile, Australia y el sur de África y Peripatidae que se ubican en América central, norte y sur, Antillas, África ecuatorial y el sureste de Asia (Bouvier, 1905, 1907; Ruhberg, 1985 y Monge-Nájera, 1995). A la fecha se conocen 6 familias: Hallucigeniidae, Helenodoridae, Luolishaniidae, Peripatidae, Peripatopsidae y Tertiapatidae.
En Costa Rica, según estudios recientes, los onicóforos se han encontrado en un rango altitudinal que varía desde los 85 hasta los 2000 msnm (Barquero-González et al., 2016). Este hallazgo resalta la diversidad de hábitats que estos organismos pueden ocupar en el país, lo cual hace indispensable la recopilación continua de datos sobre su distribución y ecología (Morera-Brenes & Monge-Nájera, 1990).
Afortunadamente, la tecnología ha facilitado el acceso a información científica a través de diversas plataformas globales de datos abiertos, las cuales permiten el registro y la consulta de información de manera gratuita (Arriagada-Benitez, 2020). Estas herramientas resultan cruciales para monitorear especies poco estudiadas como los onicóforos y para fomentar la investigación colaborativa (Lemuz-Delgado y Pérez, 2020). De esta forma, se crea una relación entre los onicóforos y la importancia de las plataformas de datos abiertos para su estudio(Álvarez y Coll-Serrano, 2018).
Descripción del problema Se requería conocer el estado del arte de onicóforos en el continente Americano, con especial atención para Costa Rica
Objetivo Determinar la distribución y diversidad de familias de onicóforos por país para el continente Americano
Descripción de los datos a utilizar Los datos que se utilizaron para este trabajo se descargaron de la base de datos de Global Biodiversity Information Facility (GBIF) para el grupo de onicóforos. Los datos contenían información como: identificador, reino, phylum, familia, género, especie, país, elevación, coordenadas, fecha del evento, entre otros
Preprocesamiento de base de datos¶
Se eliminó de la base de datos original, las columnas que no eran de interés.
Se filtró los datos para mantener infromación de países que pertenecían al continente americano.
Se filtró también los datos que no tuevieran el valor de género para trabajar a ese nivel taxonómico.
Depuración de base de Datos¶
Importar base de datos descargada de GBIF.org (14 septiembre 2024) GBIF Occurrence Download https://doi.org/10.15468/dl.q66sgz
from google.colab import drive
drive.mount('/content/drive')
#importamos pandas
import pandas as pd
# Crear el DataFrame
register_ony = "/content/drive/MyDrive/Phyton /ony.csv"
register_ony = pd.read_csv(register_ony, delimiter=';') #Ajustar separación por ';'
register_ony.head()
Mounted at /content/drive
gbifID | datasetKey | occurrenceID | kingdom | phylum | class | order | family | genus | species | ... | identifiedBy | dateIdentified | license | rightsHolder | recordedBy | typeStatus | establishmentMeans | lastInterpreted | mediaType | issue | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 931028643 | 4bfac3ea-8763-4f4b-a71a-76a6f5f243d3 | MCZ:IZ:43401 | Animalia | Onychophora | NaN | NaN | Peripatidae | Oroperipatus | Oroperipatus peruvianus | ... | Gonzalo Giribet | 2016-10-05T00:00:00 | CC_BY_NC_4_0 | President and Fellows of Harvard College | Luis Espinasa | NaN | NaN | 2024-08-28T04:12:27.262Z | NaN | GEODETIC_DATUM_INVALID |
1 | 911958582 | 828ca1f8-f762-11e1-a439-00145eb45e9a | NaN | Animalia | Onychophora | NaN | NaN | Peripatidae | Heteroperipatus | Heteroperipatus engelhardi | ... | NaN | NaN | CC_BY_4_0 | NaN | NaN | PARATYPE | NaN | 2024-09-11T09:26:42.572Z | NaN | COORDINATE_ROUNDED |
2 | 899600711 | 85b1cfb6-f762-11e1-a439-00145eb45e9a | 4C4C5367-7030-48D9-BD01-42279617EBE8 | Animalia | Onychophora | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | CC_BY_NC_4_0 | NaN | Slapcinsky, John | NaN | NaN | 2024-09-09T04:12:11.298Z | NaN | INSTITUTION_MATCH_FUZZY |
3 | 890192982 | 4bfac3ea-8763-4f4b-a71a-76a6f5f243d3 | MCZ:IZ:29204 | Animalia | Onychophora | NaN | NaN | Peripatopsidae | Peripatoides | Peripatoides aurorbis | ... | Caitlin M. Baker | 2021-01-01T00:00:00 | CC_BY_NC_4_0 | President and Fellows of Harvard College | Scott Bartlam, Rosa Fernández, Gonzalo Giribet | NaN | NaN | 2024-08-28T04:17:11.139Z | StillImage | TYPE_STATUS_INVALID |
4 | 890192973 | 4bfac3ea-8763-4f4b-a71a-76a6f5f243d3 | MCZ:IZ:29205 | Animalia | Onychophora | NaN | NaN | Peripatopsidae | Peripatoides | NaN | ... | Gonzalo Giribet | NaN | CC_BY_NC_4_0 | President and Fellows of Harvard College | Scott Bartlam, Rosa Fernández, Gonzalo Giribet | NaN | NaN | 2024-08-28T04:12:24.508Z | StillImage | TYPE_STATUS_INVALID |
5 rows × 50 columns
Explorar la base de datos y seleccionar aquellos que puender ser útiles para el objetivo de la investigación
# Mostrar todos los nombres de las columnas
print(register_ony.columns)
Index(['gbifID', 'datasetKey', 'occurrenceID', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'species', 'infraspecificEpithet', 'taxonRank', 'scientificName', 'verbatimScientificName', 'verbatimScientificNameAuthorship', 'countryCode', 'locality', 'stateProvince', 'occurrenceStatus', 'individualCount', 'publishingOrgKey', 'decimalLatitude', 'decimalLongitude', 'coordinateUncertaintyInMeters', 'coordinatePrecision', 'elevation', 'elevationAccuracy', 'depth', 'depthAccuracy', 'eventDate', 'day', 'month', 'year', 'taxonKey', 'speciesKey', 'basisOfRecord', 'institutionCode', 'collectionCode', 'catalogNumber', 'recordNumber', 'identifiedBy', 'dateIdentified', 'license', 'rightsHolder', 'recordedBy', 'typeStatus', 'establishmentMeans', 'lastInterpreted', 'mediaType', 'issue'], dtype='object')
Eliminar columnas irrelevantes para el objetivo de estudio
# Eliminar las columnas no deseadas
register_ony = register_ony.drop(columns=["occurrenceID", "kingdom", "phylum","mediaType", "typeStatus", "license", "class", "order", "infraspecificEpithet","depth","depthAccuracy","establishmentMeans", "identifiedBy", "license",
"basisOfRecord", "institutionCode", "collectionCode", "datasetKey", "species", "taxonRank", "scientificName","verbatimScientificName","verbatimScientificNameAuthorship", "occurrenceStatus", "individualCount",
"month", "day", "eventDate","taxonKey","issue", "publishingOrgKey","dateIdentified","rightsHolder","recordedBy","lastInterpreted","catalogNumber","recordNumber"])
# Verificar filtrado
register_ony.head()
gbifID | family | genus | countryCode | locality | stateProvince | decimalLatitude | decimalLongitude | coordinateUncertaintyInMeters | coordinatePrecision | elevation | elevationAccuracy | year | speciesKey | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 931028643 | Peripatidae | Oroperipatus | EC | El Chato, on the surface | Galápagos | -0.672770 | -90.43117 | NaN | 0.00001 | NaN | NaN | 2014.0 | 2235489.0 |
1 | 911958582 | Peripatidae | Heteroperipatus | SV | Ostkegel des Vulkans San Vicente, Finca El Carmen | NaN | 13.612617 | -88.83615 | NaN | NaN | NaN | NaN | 1951.0 | 2235497.0 |
2 | 899600711 | NaN | NaN | ID | Obi Island, slopes along Laiwui River, 6 km SS... | Maluku Utara Province | -1.397110 | 127.64776 | NaN | NaN | NaN | NaN | 2008.0 | NaN |
3 | 890192982 | Peripatopsidae | Peripatoides | NZ | Waikato, Raglan, Te Toto Gorge | NaN | -37.841850 | 174.77342 | NaN | 0.00001 | 144.0 | 0.0 | 2014.0 | 4862402.0 |
4 | 890192973 | Peripatopsidae | Peripatoides | NZ | Waikato, Karapiro, Walsh family farm | NaN | -37.943360 | 175.63790 | NaN | 0.00001 | 173.0 | 0.0 | 2014.0 | NaN |
Filtro paises de América: Dado que la investigación se centro en onicoforos presentes en América se redujo la base de datos para solamente tomar encuenta los registros en paises americanos.
#Seleccionar los datos de paises de America
AmeCoun = ["BR", "CA", "CL", "CO", "CR", "DO", "EC", "GT","GD", "GF", "GY", "HN","HT", "JM",
"MS", "MX", "NI", "PA", "PE", "PR", "SR", "SV", "TT", "US", "VC", "VE", "VI"]
# Filtrar el DataFrame por los valores de la columna "countryCod"
register_ony_filtered = register_ony[register_ony["countryCode"].isin(AmeCoun)]
# Verificar filtrado
register_ony_filtered.head()
gbifID | family | genus | countryCode | locality | stateProvince | decimalLatitude | decimalLongitude | coordinateUncertaintyInMeters | coordinatePrecision | elevation | elevationAccuracy | year | speciesKey | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 931028643 | Peripatidae | Oroperipatus | EC | El Chato, on the surface | Galápagos | -0.672770 | -90.43117 | NaN | 0.00001 | NaN | NaN | 2014.0 | 2235489.0 |
1 | 911958582 | Peripatidae | Heteroperipatus | SV | Ostkegel des Vulkans San Vicente, Finca El Carmen | NaN | 13.612617 | -88.83615 | NaN | NaN | NaN | NaN | 1951.0 | 2235497.0 |
9 | 872993215 | Peripatidae | Epiperipatus | BR | Manaus, Reserva Ducke | Amazonas | -2.929540 | -59.97556 | NaN | 0.00001 | NaN | NaN | 2013.0 | NaN |
11 | 729719797 | Peripatidae | Peripatus | NI | Great Corn Island | NaN | 12.170650 | -83.05437 | 1900.0 | 0.00001 | NaN | NaN | 1966.0 | NaN |
12 | 727587425 | Peripatopsidae | Metaperipatus | CL | forest near Lago Tinquilco (Región IX, Araucanía) | NaN | -39.150000 | -71.70000 | NaN | 0.00001 | 815.0 | 0.0 | 2004.0 | 2235585.0 |
Eliminar los datos con faltantes en la columna "genus"
# Eliminar las filas que tengan NaN en la columna "genus"
register_ony_filtered = register_ony_filtered.dropna(subset=["genus"])
# Mostrar las primeras filas del DataFrame después de eliminar los NaN en "genus"
register_ony_filtered.head()
gbifID | family | genus | countryCode | locality | stateProvince | decimalLatitude | decimalLongitude | coordinateUncertaintyInMeters | coordinatePrecision | elevation | elevationAccuracy | year | speciesKey | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 931028643 | Peripatidae | Oroperipatus | EC | El Chato, on the surface | Galápagos | -0.672770 | -90.43117 | NaN | 0.00001 | NaN | NaN | 2014.0 | 2235489.0 |
1 | 911958582 | Peripatidae | Heteroperipatus | SV | Ostkegel des Vulkans San Vicente, Finca El Carmen | NaN | 13.612617 | -88.83615 | NaN | NaN | NaN | NaN | 1951.0 | 2235497.0 |
9 | 872993215 | Peripatidae | Epiperipatus | BR | Manaus, Reserva Ducke | Amazonas | -2.929540 | -59.97556 | NaN | 0.00001 | NaN | NaN | 2013.0 | NaN |
11 | 729719797 | Peripatidae | Peripatus | NI | Great Corn Island | NaN | 12.170650 | -83.05437 | 1900.0 | 0.00001 | NaN | NaN | 1966.0 | NaN |
12 | 727587425 | Peripatopsidae | Metaperipatus | CL | forest near Lago Tinquilco (Región IX, Araucanía) | NaN | -39.150000 | -71.70000 | NaN | 0.00001 | 815.0 | 0.0 | 2004.0 | 2235585.0 |
Datos estadisticos y visualización¶
Registro de datos durante 155 años en la región de America. Trinidad y Tobago contabilizó 69 registros, seguido de Costa Rica con 46 individuos y México con 42 (Fig. #1). En Estados Unidos se reportaron 39 individuos, mientras que Colombia registró 35 y Ecuador 32. Panamá contó con 22 registros y Jamaica con 21 individuos. Los demás países no superaron los 20 registros de onicóforos.
import matplotlib.pyplot as plt
import seaborn as sns
# Contar el número de registros de onicóforos por país
registro_por_pais = register_ony_filtered.groupby("countryCode").size().reset_index(name="total_registros")
# Encontrar el país con el mayor número de registros
pais_mayor_registros = registro_por_pais.loc[registro_por_pais["total_registros"].idxmax()]
# Crear un gráfico de barras
plt.figure(figsize=(12, 6))
bar_plot = sns.barplot(data=registro_por_pais, x="countryCode", y="total_registros", palette="viridis", hue="countryCode", legend=False)
# Añadir títulos y etiquetas
plt.xlabel("Código de País", fontsize=12)
plt.ylabel("Total de Registros", fontsize=12)
# Añadir los valores encima de las barras
for p in bar_plot.patches:
bar_plot.annotate(format(int(p.get_height())),
(p.get_x() + p.get_width() / 2., p.get_height()),
ha='center', va='center',
fontsize=12, color='black',
xytext=(0, 5), # Desplazamiento hacia arriba
textcoords='offset points')
# Mostrar el gráfico
plt.xticks(rotation=45) # Disposición en el eje x
plt.show()
print(f"El país con mayor cantidad de registros de onicóforos es: {pais_mayor_registros['countryCode']} con {pais_mayor_registros['total_registros']} registros.")
El país con mayor cantidad de registros de onicóforos es: TT con 69 registros.
Fig 1. Barplot de los registros en cada pais desde 1869 hasta 2024 en América. BR = Brasil, CA = Canadá, CL = Chile, CO = Colombia, CR = Costa Rica, DO = República Dominicana, EC = Ecuador, GD = Granada, GF = Guayana Francesa, GT= Guatemala, GY = Guyana, HN= Honduras, HT = Haití, JM = Jamaica, MS = Montserrat, MX = México, NI = Nicaragua, PA = Panamá, PE = Perú, PR = Puerto Rico, SR = Surinam, SV = El Salvador, TT = Trinidad y Tobago, US = Estados Unidos, VC = San Vicente y las Granadinas, VE = Venezuela, VI = Islas Vírgenes
Heatmap para visualizar la comparativa entre Year vs Country
import pandas as pd
import matplotlib.pyplot as plt
# Agrupar los datos por "year" y "countryCode" y contar la cantidad de ocurrencias
data_grouped = register_ony_filtered.groupby(["year", "countryCode"]).size().reset_index(name="count")
# Crear una tabla pivote para organizar los datos en el formato adecuado para el heatmap
heatmap_data = data_grouped.pivot(index="year", columns="countryCode", values="count")
# Definir un nuevo colormap con gris para NaN
cmap = sns.color_palette("YlGnBu", as_cmap=True).reversed() # Invertir la escala de colores
cmap.set_bad('lightgrey') # Establecer gris para NaN
# Crear el heatmap con el colormap modificado
plt.figure(figsize=(12, 8))
sns.heatmap(heatmap_data, cmap=cmap, fmt=".0f", linewidths=.5)
# Añadir títulos y etiquetas
plt.xlabel("Country")
plt.ylabel("Year")
plt.xticks(rotation=45)
# Mostrar el gráfico
plt.show()
Fig 2. Heatmap de los registro por año en cada pais de América con onicoforos reportados en GBIF. BR = Brasil, CA = Canadá, CL = Chile, CO = Colombia, CR = Costa Rica, DO = República Dominicana, EC = Ecuador, GD = Granada, GF = Guayana Francesa, GT= Guatemala, GY = Guyana, HN= Honduras, HT = Haití, JM = Jamaica, MS = Montserrat, MX = México, NI = Nicaragua, PA = Panamá, PE = Perú, PR = Puerto Rico, SR = Surinam, SV = El Salvador, TT = Trinidad y Tobago, US = Estados Unidos, VC = San Vicente y las Granadinas, VE = Venezuela, VI = Islas Vírgenes
Observaciones por género en América¶
Porcentaje de registros por genero en el continente, se observo que Oroperipatus tiene la mayor cantidad de avistamientos, con un 22.9%, seguido de Epiperipatus con un 22.7% y Peripatus con un 14.8%. Macroperipatus representa el 14.4% de los registros, mientras que Acinocricus alcanza el 8.3%. El género Principapillatus tiene un 5.1%, Hallucigenia un 3.7%, y Metaperipatus un 2.8%. Plicatoperipatus cuenta con el 1.6% de los registros y Mongeperipatus con un 1.4%. Finalmente, el 2.3% corresponde a individuos que pertenencen a genéros que representan menos del 1% del total de registros.
# Contar las ocurrencias de cada género y calcular los porcentajes
genus_counts = register_ony_filtered['genus'].value_counts(normalize=True) * 100
# Agrupar los géneros menores al 1% como "Otros"
other_threshold = 1
other_count = genus_counts[genus_counts < other_threshold].sum()
genus_counts = genus_counts[genus_counts >= other_threshold]
genus_counts['Otros'] = other_count
# Paleta de colores
colors = sns.color_palette("YlGnBu", len(genus_counts))
# Crear un gráfico de pastel
plt.figure(figsize=(8, 8))
wedges, texts, autotexts = plt.pie(genus_counts, labels=genus_counts.index, autopct='%1.1f%%', colors=colors)
# Transformar en donut
centre_circle = plt.Circle((0, 0), 0.70, fc='white') # El radio para ajustar centro de la dona
fig = plt.gcf() # Obtiene la figura actual
ax = fig.gca() # Obtiene el eje actual
ax.add_artist(centre_circle) # Añade el círculo al eje actual
# Ajuste del tamaño de los porcentajes
plt.setp(autotexts, size=10)
plt.show()
Fig 3. Porcentaje de cada genero en el registro historico de América
País del continente con mayor numero de géneros reportados
# Contabilizar el número de géneros únicos por país
genus_country = register_ony_filtered.groupby("countryCode")["genus"].nunique().reset_index(name="num_genus")
# Mostrar el resultado
print(genus_country)
countryCode num_genus 0 BR 3 1 CA 2 2 CL 2 3 CO 4 4 CR 4 5 DO 2 6 EC 1 7 GD 1 8 GF 2 9 GT 1 10 GY 2 11 HN 2 12 HT 1 13 JM 4 14 MS 1 15 MX 2 16 NI 2 17 PA 4 18 PE 1 19 PR 1 20 SR 2 21 SV 1 22 TT 3 23 US 2 24 VC 1 25 VE 3 26 VI 1
Colombia, Costa Rica, Jamaica y Panamá son los países que han reportado la mayor variedad de géneros de onicóforos en su territorio, con un total de 4 de los 16 géneros conocidos en el continente.
Genero más frecuente por pais
# Agrupar país x género, y contar los registros
genus_counts = register_ony_filtered.groupby(["countryCode", "genus"]).size().reset_index(name="count")
# Género más frecuente por país
most_frequent_genus = genus_counts.loc[genus_counts.groupby("countryCode")["count"].idxmax()]
print(most_frequent_genus)
countryCode genus count 0 BR Epiperipatus 7 3 CA Hallucigenia 16 5 CL Metaperipatus 12 7 CO Epiperipatus 19 14 CR Principapillatus 22 15 DO Peripatus 4 17 EC Oroperipatus 32 18 GD Epiperipatus 3 19 GF Epiperipatus 5 21 GT Epiperipatus 1 23 GY Peripatus 2 24 HN Epiperipatus 3 26 HT Peripatus 5 28 JM Peripatus 11 31 MS Peripatus 3 32 MX Oroperipatus 41 34 NI Oroperipatus 1 36 PA Epiperipatus 19 40 PE Oroperipatus 18 41 PR Peripatus 16 42 SR Epiperipatus 3 44 SV Heteroperipatus 1 46 TT Macroperipatus 48 48 US Acinocricus 36 50 VC Peripatus 4 53 VE Peripatus 4 54 VI Peripatus 2
Visualización de los registros historicos por genero en cada país de la lista.
# Lista de géneros
genuslist = [
"Acinocricus", "Epiperipatus", "Hallucigenia", "Helenodora",
"Heteroperipatus", "Macroperipatus", "Metaperipatus", "Mongeperipatus",
"Oroperipatus", "Paropisthopatus", "Peripatus", "Plicatoperipatus",
"Principapillatus", "Rushtonites", "Speleoperipatus", "Tertiapatus"
]
# Filtrar por género
register_ony_filtered = register_ony_filtered[register_ony_filtered["genus"].isin(genuslist)]
# Agrupar los datos por genus x countryCode y contar los registro
data_grouped = register_ony_filtered.groupby(["genus", "countryCode"]).size().reset_index(name="count")
# Crear una tabla para organizar los datos para el heatmap
heatmap_data = data_grouped.pivot(index="genus", columns="countryCode", values="count")
# Dimensiones el heatmap
plt.figure(figsize=(12, 8))
# Definir un nuevo colormap con gris para NaN
cmap = sns.color_palette("YlGnBu", as_cmap=True).reversed() # Invertir la escala de colores
cmap.set_bad('lightgrey') # Establecer gris para NaN
# Crear el heatmap
sns.heatmap(heatmap_data, cmap=cmap, fmt=".0f", linewidths=.5, annot=True, cbar=True)
# Añadir títulos y etiquetas
plt.xlabel("País")
plt.ylabel("Género")
plt.xticks(rotation=45)
# Mostrar el gráfico
plt.show()
Fig 4. Heatmap de los registros historicos por género de onicóforo en cada pais de América. BR = Brasil, CA = Canadá, CL = Chile, CO = Colombia, CR = Costa Rica, DO = República Dominicana, EC = Ecuador, GD = Granada, GF = Guayana Francesa, GT= Guatemala, GY = Guyana, HN= Honduras, HT = Haití, JM = Jamaica, MS = Montserrat, MX = México, NI = Nicaragua, PA = Panamá, PE = Perú, PR = Puerto Rico, SR = Surinam, SV = El Salvador, TT = Trinidad y Tobago, US = Estados Unidos, VC = San Vicente y las Granadinas, VE = Venezuela, VI = Islas Vírgenes
Correlación entre elevación y distribución de géneros¶
Para buscar una correlación estadísticamente significativa entre los registros de elevación y género, se evaluó la normalidad de los datos (Shapiro) y se aplicó una prueba de Kruskal-Wallis.
# Cargar paquete para prueba de Shapiro
from scipy.stats import shapiro
# Filtrar para eliminar filas con faltante de información en la columna "elevation"
register_ony_filtered = register_ony_filtered.dropna(subset=["elevation"])
# Extraer los datos de la columna "elevation"
elevation_data = register_ony_filtered['elevation'].dropna()
# Realizar la prueba de Shapiro
stat, p_value = shapiro(elevation_data)
# Mostrar los resultados
print(f'Estadístico de Shapiro-Wilk: {stat}')
print(f'Valor p: {p_value}')
# Interpretación del resultado
if p_value > 0.05:
print("No se rechaza la hipótesis nula: Los datos parecen seguir una distribución normal.")
else:
print("Se rechaza la hipótesis nula: Los datos no siguen una distribución normal.")
#Cargar paquete para prueba de Kruskal
from scipy.stats import kruskal
# Agrupar los datos por género y extraer las elevaciones
groups = [group['elevation'].values for name, group in register_ony_filtered.groupby('genus')]
# Realizar la prueba de Kruskal-Wallis
kruskal_resultado = kruskal(*groups)
# Mostrar el resultado de la prueba
print(f'Estadístico H de Kruskal-Wallis: {kruskal_resultado.statistic}')
print(f'Valor p: {kruskal_resultado.pvalue}')
# Crear un boxplot para visualizar la relación entre género y elevación
plt.figure(figsize=(12, 6))
sns.boxplot(data=register_ony_filtered, x='genus', y='elevation')
plt.xticks(rotation=90)
plt.xlabel('Género')
plt.ylabel('Elevación(msnm)')
plt.grid(True)
plt.show()
Estadístico de Shapiro-Wilk: 0.8092438628390688 Valor p: 3.045179577661006e-09 Se rechaza la hipótesis nula: Los datos no siguen una distribución normal. Estadístico H de Kruskal-Wallis: 15.273870755339363 Valor p: 0.018230294199040525
Fig 5. Boxplot de la distribución de los género según la elevación reportada en América.
# Dimenciones de la figura
plt.figure(figsize=(10, 6))
# Grafico de disperción entre el género y la elevación
plt.scatter(register_ony_filtered['genus'], register_ony_filtered['elevation'], alpha=0.5)
# Añadir etiquetas y título
plt.xlabel('Género')
plt.ylabel('Elevación (msnm)')
# Rotar las etiquetas del eje X
plt.xticks(rotation=90)
# Añadir una cuadrícula al gráfico
plt.grid(True)
# Mostrar el gráfico
plt.show()
Fig 6.Gráfico de dispersión de los rangos de distribución de los género según la elevación reportada en América.
Datos geoespaciales¶
Mapa de la distribución historica de onicóforos en el continente americano¶
Importar datos geoespaciales: La última versión de geopanda no contiene la información de continentes, por lo tanto, se importaron de manera local descargando la base de datos de https://www.naturalearthdata.com/downloads/110m-cultural-vectors/
import matplotlib.pyplot as plt
import geopandas as gpd
# Ruta a los archivos del continente
shapefile_path2 = "/content/drive/MyDrive/Phyton /ne_110m_admin_0_countries.shp"
# Ruta a los archivos de resgistro de onicoforos
shapefile_path1 = "/content/drive/MyDrive/Phyton /oni.shx"
# Importar el shapefile que contine las observaciones
gdf1 = gpd.read_file(shapefile_path1)
# Importar el shapefile countries
world = gpd.read_file(shapefile_path2)
# Filtrar por Norteamérica y Sudamérica
NA = world[world['CONTINENT'] == 'North America']
SA = world[world['CONTINENT'] == 'South America']
# Concatenar ambos DataFrames
america = pd.concat([NA, SA])
# Graficar el mapa
fig, ax = plt.subplots(figsize=(12, 10))
america.plot(ax=ax, color='lightgrey', edgecolor='white')
gdf1.plot(ax=ax, color='red', marker='o', markersize=5)
plt.xlabel("Longitud")
plt.ylabel("Latitud")
plt.legend(["Observaciónes"], loc='lower right')
<matplotlib.legend.Legend at 0x7f2f1a59a080>
Fig 7. Distribución de onicóforos en América registrados entre 1869 y 2024.
A nivel del continente, los onicóforos se distribuyen en gran parte de la región, con una mayor densidad en la zona ecuatorial y disminuyendo su presencia en los extremos de América del Norte y Sur. Además, se evidencian la ausencia de registros en varios países.
Costa Rica¶
Para detallar la distribución de los onicórofos en nuestra país, se hizo una exploración de datos los registros disponibles en GBIF. Además se importó el shapefile de Costa Rica, descargado del link https://gadm.org/download_country.htm, para mejorar la fidelidad visual del polígono. Además, se importó nuevamente la base de datos (ony.csv) para evitar un sesgo en los datos por los filtrados anteriores.
# Importar shapefile de Costa Rica
shapefile_CR = '/content/drive/MyDrive/Phyton /gadm41_CRI_1.shp'
# Cargar el archivo .shp en un GeoDataFrame
gdf_map = gpd.read_file(shapefile_CR)
# Crear el DataFrame
register_CR_path = "/content/drive/MyDrive/Phyton /ony.csv"
register_CR = pd.read_csv(register_CR_path, delimiter=';')
# Filtrar los registros de CR
register_CR2= register_CR[register_CR['countryCode'] == 'CR']
# Convertir el DataFrame filtrado a un GeoDataFrame
gdf_CR = gpd.GeoDataFrame(
register_CR2,
geometry=gpd.points_from_xy(register_CR2['decimalLongitude'], register_CR2['decimalLatitude']),
crs="EPSG:4326" # Sistema de coordenadas WGS 84
)
# Graficar el mapa
fig, ax = plt.subplots(figsize=(12, 10))
gdf_map.plot(ax=ax, color='lightgrey', edgecolor='grey')
# Graficar los registros de onicóforos
gdf_CR.plot(ax=ax, color='red', marker='o', markersize=5, label='Onicóforos registrados')
plt.xlabel("Longitud")
plt.ylabel("Latitud")
plt.legend(loc='center')
# Mostrar el gráfico
plt.show()
Fig 8. Distribución del registro historico total en el territorio nacional desde 1902 hasta 2022.
Para facilitar la visualización de la distribución de los géneros y buscar posibles patrones se elaboró un segundo mapa con identificadores para cada género y para los datos que no contaban con esta descripción.
# Importar shapefile de Costa Rica
shapefile_CR = '/content/drive/MyDrive/Phyton /gadm41_CRI_2.shp'
# Cargar el archivo .shp en un GeoDataFrame
gdf_map = gpd.read_file(shapefile_CR)
# Crear el DataFrame
register_CR_path = "/content/drive/MyDrive/Phyton /ony.csv"
register_CR = pd.read_csv(register_CR_path, delimiter=';')
# Filtrar los registros de CR
register_CR2 = register_CR[register_CR['countryCode'] == 'CR']
# Sustituir los valores faltantes en la columna 'genus' con 'unknown'
register_CR2.loc[:, 'genus'] = register_CR2['genus'].fillna('unknown')
# Convertir register_CR2 a un GeoDataFrame
gdf_CR = gpd.GeoDataFrame(
register_CR2,
geometry=gpd.points_from_xy(register_CR2['decimalLongitude'], register_CR2['decimalLatitude']),
crs="EPSG:4326" # Sistema de coordenadas WGS 84
)
# Lista de géneros y grupo 'unknown'
genera_list = ['Epiperipatus', 'Mongeperipatus', 'Macroperipatus', 'Principapillatus', 'unknown']
# Colores para los puntos de cada género
color_list = ['blue', 'yellow', 'green', 'orange', 'violet']
# Crear un diccionario para mapear cada género y su color
color_dict = dict(zip(genera_list, color_list))
# Graficar el mapa
fig, ax = plt.subplots(figsize=(12, 10))
gdf_map.plot(ax=ax, color='lightgrey', edgecolor='grey')
# Graficar los géneros registrados con colores
for genus in genera_list:
subset = gdf_CR[gdf_CR['genus'] == genus]
if not subset.empty: # Asegurarse de que haya datos para el género
subset.plot(ax=ax, color=color_dict[genus], marker='o', markersize=5, label=genus)
plt.xlabel("Longitud")
plt.ylabel("Latitud")
plt.legend(loc='center left', title='Géneros')
# Mostrar el gráfico
plt.show()
Fig 9. Distribución de los generos en el territorio nacional desde 1902 hasta 2022.
Los onicóforos reportados en el país, se distribuyen por todo el área, sin zonas específicas.
Se observó que, de un total de 106 registros en Costa Rica, 60 carecían de información sobre el género, lo que representa un 56.60% de los registro. El género con mayor cantidad de reportes fue Principapillatus, con 22 registros en el país (todos sin fecha), mientras que Epiperipatus conto con 14 registros, Mongeperipatus con 6 registros y por último Macroperipatus unicamente cuenta 4 registros para el país de Costa Rica (Fig 10).
# Asignar "unknown" a los registros que no tienen género
register_CR2.loc[:, 'genus'] = register_CR2['genus'].fillna('unknown')
# Contar el número de registros por género
registro_por_genero = register_CR2.groupby("genus").size().reset_index(name="total_registros")
# Crear un gráfico de barras
plt.figure(figsize=(10, 6))
bar_plot = sns.barplot(data=registro_por_genero, y="genus", x="total_registros", palette="viridis_r", hue="genus", legend=False)
# Añadir títulos y etiquetas
plt.ylabel("Género", fontsize=12)
plt.xlabel("Total de Registros", fontsize=12)
# Añadir los valores al lado de las barras
for p in bar_plot.patches:
bar_plot.annotate(format(int(p.get_width())),
(p.get_width(), p.get_y() + p.get_height() / 2.),
ha='left', va='center',
fontsize=12, color='black',
xytext=(5, 0),textcoords='offset points')
# Mostrar el gráfico
plt.show()
Fig 10. Total de registros por género para Costa Rica
Descripción de resultados¶
Entre los 4 países que contiene la mayor cantidad de registros, se ubican: Trinidad y Tobago con 69, Costa Rica con 46, México con 42 y Estados Unidos con 39. Por otro lado, los países con menos reportes son: Guatemala y El Salvador con uno cada uno y Nicaragua e Islas Vírgenes con dos cada uno (Fig 1).
Algunos países han sido constantes en el tiempo con el registro de onicóforos como Colombia, Costa Rica, Ecuador, México Puerto Rico y Trinidad y Tobago, mientras que hay países que tienen épocas de registro de datos (Fig 2).
Los géneros Oroperipatus y Epiperatus son los que han presentado la mayor cantidad de registros para el continente de acuerdo con los datos de la Fig 3. Sin embargo, los géneros más representativos para el continente son Peripatus que se encuentra registrado en 17 países y Epiperipatus en 13 países, le siguen Oroperipatus registrado en siete países y Macroperipatus registrado en seis países. Hay 12 países con un solo género registrado (Fig 4).
Cuatro países presentan la mayor cantidad de géneros, cuatro en total cada uno, que son Colombia, Costa Rica, Jamaica y Panamá. Con tres géneros registrados están: Brasil, Trinidad y Tobago y Venezuela.
La mayor cantidad de registros por género la tienen: Trinidad y Tobago para el Género Macroperipatus con 48, en México el género Oroperipatus con 41 y en tercer lugar el género Acinocriscus con 36 registros para Estados Unidos.
Los resultados indican que los datos no tienen una distribución normal (Fig 5).
Los rangos de dsitribución de acuerdo con la elevación, indican que el género Peripatus es el que presenta un mayor rango de distribución que va desde elevaciones de 0 hasta por encima de los 4 mil msnm, seguido de Epiperatpatus que se distribuye desde los 0 hasta por encima de 2500 msnm (Fig 6).
Los onicóforos en el continente americano se distribuyen a lo largo de casi todas las latitudes, lo que sugiere que en muchos países podría haber un vació de información que permita descartar o confirmar la presencia de otros géneros (Fig 7).
La distribución de onicóforos para Costa Rica evidencia la variación de microhábitats en los que se pueden encontrar estos organismos (Fig 8). Únicamente los géneros Principapillatus y Mongeperipatus mostraron una tendencia en su localización, en San José, Zona Protectora Cerros De Escazú (Cedral) y en la vertiente del Caribe respectivamente (Fig 9).
Para Costa Rica se tienen 4 géneros registrados, sin embargo, la mayor parte de los registros, no tienen la información de género (Fig 10).
Conclusiones¶
- Los rangos de distribución de los onicóforos son amplios pues varían desde los 0 hasta los 4500 msnm.
- Costa Rica a pesar de tener un área terrestre pequeña, comparado con otros países de la región y el continente, encabeza las listas en cantidad de registros, así como en cantidad de géneros reportados, además de esto ha sido constante en los registros a través del tiempo.
- La falta de datos en muchos países podría sugerir que Costa Rica ha invertido esfuerzos en el estudio del grupo de onicóforos.
- Algunos países que no tienen datos registrados: Argentina, Bahamas, Belice, Bolivia, Cuba, Paraguay y Uruguay.
- La cantidad de información disponible hace imprescindible que los científicos se actualicen en sus métodos de trabajo, así como en la trazabilidad, descripción y manejo de datos, utilizando herramientas que optimicen el proceso de análisis
Referencias¶
Álvarez, J. yV. Coll-Serrano. (2018). “Cientíifco de datos”, la profesión del presente. Métodos de Información 9 (16). https://doi.org/10.5557/IIMEI9-N16-113129
Arriagada-Benitez, M. (2020). Ciencia de datos: hacia la automatización de las decisiones. Inegniare. Rev. chil. ingen 28 (4): 556-557. 10.4067/S0718-33052020000400556
Barquero-González, J.P., A. Cabrera, S. Valle-Cubero, J. Monge-Nájera & B. Morera-Brenes. (2016). The geographic distribution of Costa Rican velvet worms (Onychophora: Peripatidae). Rev. Biol. Trop. vol. 64 (4): 1401-1414. https://www.scielo.sa.cr/pdf/rbt/v64n4/0034-7744-rbt-64-04-01401.pdf
Bouvier, E.L. (1905). Monographie des Onychophores. Ann. Scien. Nat. Zoologie, 9:1-383.
Bouvier, E.L. (1907). Monographie des Onychophores. II. Peripatopsidae. E.L. Bouvier. Ann. Scien. Nat. Zoologie, 9: 61-318.
GBIF.org (14 septiembre 2024) GBIF Occurrence Download https://doi.org/10.15468/dl.q66sgz
Jerez-Jaimes, J. & M. Bernal-Pérez. (2009). Taxonomía de onicóforos de Santander, Colombia y termogravimetría, calorimetría de barrido diferencial y espectroscopía infrarroja de la secreción adhesiva (Onychophora: Peropatidae). Rev. Biol. Trop. vol. 57 (3): 567-588. https://www.scielo.sa.cr/scielo.php?pid=S0034-77442009000300010&script=sci_arttext
Johnson, W., L. Delanney, E. Williams & T. Cole. (1969). Principles of Zoology. Holt, Rinehart and Winston Inc., Nueva York, EEUU.
Lemus-Delgado, D. & R. Pérez. (2020). Ciencia de datos y estudios globales: aportaciones y desafíos metodológicos. Colombia internacional (102): 41-62. https://doi.org/10.7440/colombiaint102.2020.03
Monge-Nájera, J. (1995). Phylogeny, biogeography and reproductive trends in the Onychophora. Zool. J. Linn. Soc. (London) 114: 21-60.
Monge-Nájera, J., Z. Barrientos & F. Aguilar. (1996). Experimental behavior of tropical invertebrate: Epiperipatus biolleyi (Onychopora: Peripatidae). Mem. Mus. Nac. Hist. Nat. 169: 434-439.
Monge-Nájera, J. & X. Hou. (1999). 500 Millones de años de evolución: onicóforos, los primeros animales que caminaron (Onychophora). Boletín S.E.A. 26: 171-178.
Morera-Brenes, B., & Monge-Nájera, J. (1990). Fpiperipatus hilkae, n. Sp. from Costa Rica (Onychophora: Peripatidae). In Rev. Biol. Trop (Vol. 38, Issue 2B).
Ruhberg, H. (1985). Die Peripatopsidae (Onychopora). Systematic, Okologie, Chrologie and phylogenetische Aspekte. Zoologica, 137:1-184.