1. Introducción¶
Los pingüinos son un grupo de aves no voladoras que pertenecen al Orden Sphenisciformes, en este orden podemos encontrar una sola familia: Spheniscidae. Existen 18 especies de pingüinos en el mundo, y se encuentran distribuidas en el hemisferio Sur, cuatro de estas anidan en el Continente Antártico y sólo una en el área ecuatorial.
Los pingüinos se encuentran específicamente en: Antártica, Nueva Zelanda, al sur de Australia, Sudáfrica, Sur América, Norte del Perú y en las islas Galápagos. Su hábitat es marino, utilizando ecosistemas terrestres solo para los distintos ciclos de reproducción.
Los pingüinos son especies indicadoras, ya que el estado de sus poblaciones refleja el estado de salud de los océanos que habitan. Las condiciones oceánicas están relacionadas al éxito reproductivo del Pingüino de Galápagos.
El estudio de los pingüinos y conservación es fundamental, ya que alrededor de dos tercios de las especies de pingüinos están incluidas en la Lista Roja de la UICN de las Especies Amenazadas. (Banda Cruz, Aura Gabriela. 2017).
Figura 1. Especies de Pinguinos.
La figura 1 nos muestra una imagen de cada una de las 18 diferentes especies que podemos encontrar en el planeta.
Adjunto presentamos una lista de los especies de pinguinos y su nombre cientifico.
- Tipos de Pingüinos
- Pingüino rey, Aptenodytes patagonicus
- Pingüino emperador, Aptenodytes forsteri
- Pingüino papúa, Pygoscelis papua
- Pingüino Adelia, Pygoscelis adeliae
- Pingüino de barbijo, Pygoscelis antarcticus
- Pingüino de penacho amarillo del sur, Eudyptes chrysocome
- Pingüino de penacho amarillo del norte, Eudyptes moseleyi
- Pingüino de Fiordland, Eudyptes pachyrhynchus
- Trampas para pingüinos, Eudyptes robustus
- Pingüino de cresta erecta, Eudyptes sclateri
- Pingüino macarrón, Eudyptes chrysolophus
- Pingüino real, Eudyptes schlegeli
- Pingüino de ojos amarillos, Megadyptes antipodes
- Pingüino pequeño, Eudyptula minor
- Pingüino africano, Spheniscus demersus
- Pingüino de Humboldt, Spheniscus humboldti
- Pingüino de Magallanes, Spheniscus magellanicus
- Pingüino de Galápagos, Spheniscus mendiculus
Sin embargo, para la realización de este trabajo se ha tenido que selecciona una sola especie por problemas de procesamiento. Se selecciono el pingüino de El Cabo tambien conocido como pingüino africano, esta especie es la única especie de pingüino que vive en el continente africano.
Estos pingüinos son del género Spheniscus y se caracterizan principalmente por tener cuadrados en color negro sobre su pecho y líneas blancas y negras en sus cabezas, motivo por el cual también son llamados Ringed Penguins (Pingüinos anillados). Sus rostros presentan manchas rosadas sobre los ojos que los ayudan a disipar el calor solar.
Información tomada de: Wikipedia, Actualizado el 14 de marzo de 2025.
2. Desarrollo¶
En realizar esta investigación de utiliza la biblioteca pygbif, especificamente los datos de occurrences.
Instalación y carga de bibliotecas.
La primera parte del proceso consiste en la instalación y carga de las bibliotecas a utilizar. Para eso se importan las bibliotecas de:
- Pandas
- Ploty
- Folium y
- Matplotlib
!pip install leafmap pygbif --quiet
# Carga
from pygbif import occurrences
import pandas as pd
import plotly.express as px
import folium
import matplotlib.pyplot as plt #Instalación de matplotlib
Se define la especie "Spheniscus demersus" por tener una población suficiente para el análisis de esta actividad. Inicialmente procedemos identificando la ocurrencia de avistamientos de la especie "Spheniscus demersus".
#Para la presente investigación se selecciona la especie Pinguinos.
especie = "Spheniscus demersus"
limite = 300
offset = 0
registros_acumulados = []
while True:
resproy = occurrences.search(
scientificName=especie,
hasCoordinate=True,
hasGeospatialIssue=False,
limit=limite,
offset=offset
)
# Se extraen los resultados
registros = resproy.get("results", [])
# Si ya no hay resultados, se detiene el ciclo
if not registros:
break
# Agregar registros nuevos al acumulado
registros_acumulados.extend(registros)
#Actualizar el offset para la siguiente "página"
offset += limite
#Convertir todo a un DataFrame de pandas
presencia = pd.DataFrame(registros_acumulados)
# Cantidad de registros de presencia recuperados
print(f"Total de registros recuperados {len(presencia)} de presencia")
Total de registros recuperados 11733 de presencia
Identificamos en este proceso que se cuenta con la presencia de 11733 registros de la especie "Spheniscus demersus" que cumplen los requisitos de la selección.
# Para verificar los datos
# presencia[['species', 'basisOfRecord', 'countryCode', 'locality', 'decimalLongitude', 'decimalLatitude', 'eventDate', 'year', 'recordedBy']].sample(5)
Ahora procedemos a identificar la presencia de "Spheniscus demersus" por país, para eso construimos un gráfico de barras de la cantidad de registros identificados por país.
# Contar registros por país
registros_x_pais = presencia['country'].value_counts()
#registros_x_year = presencia['year'].value_counts()
# Generar un gráfico de barras
plt.figure(figsize=(10, 6)) # tamaño del gráfico
registros_x_pais.plot(kind='bar')
# Especificar el título y las etiquetas del gráfico
plt.title('Cantidad de registros por país')
plt.xlabel('País')
plt.ylabel('Cantidad de registros')
# Mostrar el gráfico
plt.show()
Podemos observar de este gráfico que la mayoría de los registros de presencia de la especie "Spheniscus demersus" se ubican en South Africa y solamente un pequeño numero de casos se presentan en Namibia.
registros_x_especie = presencia['country'].value_counts()
# Generar un gráfico de pastel
plt.figure(figsize=(10, 8)) # tamaño del gráfico
registros_x_especie.plot(kind='pie')
# Especificar el título y las etiquetas del gráfico
plt.title('Número de registros por pais')
plt.xlabel('Pais')
plt.ylabel('Número de registros')
# Mostrar el gráfico
plt.show()
# Borrar filas que no tengan año
df_anio_no_nulo = presencia.dropna(subset=['year'])
# Agrupar por año y contar registros
registros_por_anio = df_anio_no_nulo.groupby('year')['key'].count()
# Generar un gráfico de líneas
plt.figure(figsize=(10, 6))
registros_por_anio.plot(marker='o')
# Indicar el título y las etiquetas del gráfico
plt.title('Número de registros a los largo de los años')
plt.xlabel('Año')
plt.ylabel('Número de registros')
plt.grid(True)
# Mostrar el gráfico
plt.show()
El gráfico anterior muestra por año el numero de ocurrencias. Se puede analizar de dicho gráfico que la mayor cantidad de observaciones se han dado a partir del año 2024, eso probablemente favorecido por los proyectos de ciencia ciudadana.
import requests # biblioteca para consultar API
import json # biblioteca para manejar datos JSON
# Nombre científico de la especie que se desea buscar
nombre_cientifico = 'Spheniscus demersus'
# URL
url = 'https://api.gbif.org/v1/species/match'
# Parámetros de la solicitud
parametros = {
'name': nombre_cientifico,
'strict': True # Asegura una coincidencia exacta en la búsqueda
}
# Solicitud (el resultao se almacena en el objeto respuesta)
respuesta = requests.get(url, params=parametros)
# Verificación de la respuesta
if respuesta.status_code == 200:
# La solicitud fue exitosa
# Se cargan en formato JSON los datos retornados
datos_proy = respuesta.json()
# Obtención del taxonKey de la especie
taxon_key = datos_proy.get('usageKey', 'No encontrado')
# Despliegue del taxonKey
print(f'taxonKey de {nombre_cientifico}: {taxon_key}')
# Almacenamiento de datos en un archivo llamado "datos-proy.json"
with open('datos-proy.json', 'w', encoding='utf-8') as archivo:
json.dump(datos_proy, archivo, indent=4, ensure_ascii=False)
else:
# Se produjo un error
print(f"Error {respuesta.status_code}")
taxonKey de Spheniscus demersus: 5229384
Ahora conociendo la taxonKey de la especie, vamos a proceder a graficar en el mapa la presencia de esta especie utilizando la biblioteca de folium.
import folium
# Mapa centrado en la latitud 0 y longitud -80,
# con un zoom inicial de nivel 2
mapa = folium.Map(location=[20, 40], zoom_start=2)
# URL base de los tiles de GBIF para la especie Spheniscidae (taxonKey=5284)
# En este caso, se usa 'bin=square' para mostrar las celdas cuadradas de densidad
tiles_url = (
"https://api.gbif.org/v2/map/occurrence/density/"
"{z}/{x}/{y}@1x.png"
"?taxonKey=5229384&bin=square&style=green.poly"
)
# Se añade la capa de tiles al mapa Folium
folium.TileLayer(
tiles=tiles_url,
attr="© GBIF", # Atribución recomendada
name="Spheniscidae (cuadrículas)",
overlay=True,
control=True,
# max_zoom=14 si se desea limitar el zoom máximo
).add_to(mapa)
# Opcional: se puede añadir otra capa con bin=hex o diferente estilo
tiles_url_hex = (
"https://api.gbif.org/v2/map/occurrence/density/"
"{z}/{x}/{y}@1x.png"
"?taxonKey=5229384&bin=hex&style=green.poly"
)
folium.TileLayer(
tiles=tiles_url_hex,
attr="© GBIF",
name="Spheniscidae (hexágonos)",
overlay=True,
control=True
).add_to(mapa)
# Control de capas
folium.LayerControl().add_to(mapa)
# Despliegue del mapa
mapa
Como comentamos al inicio esta especie de Pingüino se visualiza principalmente el el continente africano como podemos observar en el mapa. Sin embargo, se logran detectar un pequeño numero de observaciones en America del Norte y Europa, es muy problable que estas observaciones correspondan a la presencia de la especie en diferentes zoológicos.
Ahora con el objetivo de observar como se comporta el clima en las regiones donde habita esta especie de pingüino, vamos a proceer a graficar la precipotación anual en el mapa.
# Iniciamos con la instalación y carga de bibliotecas
# Instalación de rasterio
!pip install rasterio --quiet
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.2/22.2 MB 36.9 MB/s eta 0:00:00
# Carga de rasterio
import rasterio
# Carga de rasterio.plot (para graficar datos raster)
import rasterio.plot
Ahora procedemos a cargar los datos de precipitación.
# Carga de datos de precipitacion anual
precipitacion_anual = rasterio.open(
'https://github.com/datos-geoespaciales-biodiversidad/python/raw/refs/heads/main/datos/clima/worldclim/2.1-10m-bio/wc2.1_10m_bio_12.tif'
)
rasterio.plot.show(precipitacion_anual)
<Axes: >
fig, ax = plt.subplots(figsize=(8, 8))
# Mapa de precipitación anual
rasterio.plot.show(
precipitacion_anual,
cmap="coolwarm", # colores
ax=ax,
title="Precipitacion Anual"
)
# Agregar una leyenda
cbar = fig.colorbar(ax.images[0], ax=ax, shrink=0.8)
cbar.set_label('Mm')
# Limitar el rango de los ejes
ax.set_xlim(-100, 100.0)
ax.set_ylim(-90.0, 90.0)
plt.show()
El mapa anterior, nos muestra el nivel de precipitación, se muestra el continente Africano considerando que es aqui donde se han realizado mas avistamientos del Pingüino del Cabo o Pingüino Africano.
Conclusiones#¶
Uno de las principales conclusiones es que tenemos al alcance una serie de herramientas y datos que nos pueden facilitar el desarrollo de muchos trabajos de investigación. Y si bien es cierto, estas herramientas se pueden utilizar con facilidad podemos si requieren de bastante conocimiento de la estructura de la información y el formato de los datos.
También hay que reconocer que si queremos utilizar una fuente de datos mayor, denemos contar con capacidad de procesamiento, ya que la cantidad de información es grande y los tiempos de respuesta de la plataforma que utilizamos no son las deseadas.
Es importante comparar a los diferentes tipos de pingüinos, poder compararlos por su especie, conocer las diferentes ubicaciones por especie, sin embargo, no logre llegar ahí, se me complicó el manejo de los datos.
Bibliografía.
Armijos O., Diego y Aura Banda Cruz (2017). Apoyo a la recolección y toma de fotografías del Pingüino de Galápagos para entender sus ciclos reproductivos, muda, presencia de juveniles e identificación. Recuperado 14 de marzo de 2025, de http://dspace.utpl.edu.ec/handle/20.500.11962/20763.