Instituto Tecnológico de Costa Rica (ITCR) y redbioma.
Curso: Python para Ciencia de Datos
Proyecto de Investigación¶
Análisis de Especies Migratorias y Endémicas en la Reserva Cloudbridge, Sierra de Talamanca, Costa Rica
Estudiante: Johan Steven Vargas Ledezma
Fecha de entrega: 26 de septiembre del 2024
Descripción del Proyecto y Justificación¶
Este proyecto tiene como finalidad analizar la distribución temporal y geográfica de especies de aves migratorias y endémicas en la Reserva Natural Cloudbridge, situada en las montañas de Talamanca, Costa Rica. La reserva está compuesta principalmente de bosque nuboso montano tropical, con una combinación de áreas de bosque primario y secundario en distintas fases de regeneración.
Los datos recopilados en la reserva entre 2016 y 2020 por Jennifer Powell (2022) incluyen observaciones de aves confirmadas, empleando diversos métodos como conteo de puntos, caminatas de observación, reproducción de llamadas (cantos nocturnos de búhos), cámaras trampa y fotografías incidentales. Este proyecto utiliza esa base de datos para realizar un análisis de las observaciones de aves, enfocándose en las diferencias en la distribución de especies migratorias y endémicas tanto en el tiempo como en el espacio.
Justificación del Proyecto¶
Monitoreo de la salud del ecosistema¶
Las aves son bioindicadores clave de la salud ecológica. Al analizar los datos de especies migratorias y endémicas, se podrán detectar cambios en la composición de especies, reflejando posibles alteraciones en el ecosistema relacionadas con la deforestación, la degradación del hábitat y el cambio climático (Arriaga-Ramírez & Cavazos, 2010; Newton, 2013). Las aves migratorias, particularmente sensibles a estos factores, son cruciales para monitorear la estabilidad del hábitat.
Conservación y restauración de hábitats¶
El análisis de los patrones de distribución temporal y geográfica puede proporcionar información vital para el desarrollo de estrategias de conservación efectivas. Las especies endémicas son especialmente vulnerables a la pérdida de hábitat, por lo que su preservación es fundamental para la biodiversidad local (Myers et al., 2000). Esta información podría ser útil para guiar esfuerzos de conservación en la reserva y planificar acciones de restauración.
Contribución al conocimiento científico¶
Este estudio puede contribuir al entendimiento de la distribución ecológica de las aves en una región de alta diversidad biológica, permitiendo una mejor comprensión de los patrones de migración y el comportamiento de especies endémicas. Además, los resultados del análisis podrán ser utilizados para estudios comparativos a nivel regional y global (BirdLife International, 2018).
Gestión de áreas protegidas¶
Este análisis puede apoyar la planificación en la gestión de la Reserva Natural Cloudbridge. Los datos generados podrán utilizarse para planificar rutas turísticas sostenibles, monitorear la biodiversidad y diseñar programas de manejo del área para mitigar los impactos del cambio climático en el largo plazo (Wenny et al., 2011).
Descripción del Problema y Objetivo del Proyecto¶
La Reserva Natural Cloudbridge alberga una gran diversidad de especies de aves, incluidas especies migratorias y endémicas. Sin embargo, no se ha realizado un análisis detallado sobre cómo estas especies se distribuyen a lo largo del tiempo y del espacio dentro de la reserva, ni cómo los cambios ambientales pueden influir en sus patrones de distribución. La falta de esta información limita la capacidad de los gestores de la reserva para implementar estrategias de conservación efectivas y responder adecuadamente a las posibles amenazas ambientales.
Objetivo del Proyecto¶
Analizar la distribución temporal y geográfica de las especies de aves migratorias y endémicas en la Reserva Natural Cloudbridge entre 2016 y 2020, utilizando técnicas de ciencia de datos para identificar patrones y tendencias que puedan apoyar en la conservación de la biodiversidad y el manejo adecuado de la reserva.
Conjunto de Datos¶
El conjunto de datos que se utiliza en este proyecto de análisis de aves en la Reserva Natural Cloudbridge proviene de:
Powell, J. (2022). A dataset of bird inventory records at Cloudbridge Nature Reserve, Talamanca Mountains, Costa Rica, between March 2016 and May 2020. Check List. Occurrence dataset. Enlace accedido vía GBIF.org el 16 de septiembre de 2024.
Este conjunto de datos recopila registros de presencia de aves en la Reserva Natural Cloudbridge, ubicada en la vertiente del Pacífico de las montañas de Talamanca, con altitudes entre los 1500 y 2600 metros sobre el nivel del mar. Es importante destacar que la información se limita a especies confirmadas mediante evidencia fotográfica y abarca un periodo que va desde marzo de 2016 hasta mayo de 2020.
Los datos incluyen observaciones realizadas a través de diferentes métodos, tales como conteo de puntos, caminatas, reproducción de llamadas (cantos nocturnos de búhos), cámaras trampa y fotografías.
Resultados¶
Importar las librerias y cargar el archivo con los datos¶
https://www.gbif.org/dataset/5db6a4f7-d44a-4d34-8bde-6cb63d40644c/project
!pip install contextily
Collecting contextily Downloading contextily-1.6.2-py3-none-any.whl.metadata (2.9 kB) Requirement already satisfied: geopy in /usr/local/lib/python3.10/dist-packages (from contextily) (2.4.1) Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (from contextily) (3.7.1) Collecting mercantile (from contextily) Downloading mercantile-1.2.1-py3-none-any.whl.metadata (4.8 kB) Requirement already satisfied: pillow in /usr/local/lib/python3.10/dist-packages (from contextily) (10.4.0) Collecting rasterio (from contextily) Downloading rasterio-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.0 kB) Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from contextily) (2.32.3) Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from contextily) (1.4.2) Requirement already satisfied: xyzservices in /usr/local/lib/python3.10/dist-packages (from contextily) (2024.9.0) Requirement already satisfied: geographiclib<3,>=1.52 in /usr/local/lib/python3.10/dist-packages (from geopy->contextily) (2.0) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (1.3.0) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (4.53.1) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (1.4.7) Requirement already satisfied: numpy>=1.20 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (1.26.4) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (24.1) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (3.1.4) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib->contextily) (2.8.2) Requirement already satisfied: click>=3.0 in /usr/local/lib/python3.10/dist-packages (from mercantile->contextily) (8.1.7) Collecting affine (from rasterio->contextily) Downloading affine-2.4.0-py3-none-any.whl.metadata (4.0 kB) Requirement already satisfied: attrs in /usr/local/lib/python3.10/dist-packages (from rasterio->contextily) (24.2.0) Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from rasterio->contextily) (2024.8.30) Collecting cligj>=0.5 (from rasterio->contextily) Downloading cligj-0.7.2-py3-none-any.whl.metadata (5.0 kB) Collecting click-plugins (from rasterio->contextily) Downloading click_plugins-1.1.1-py2.py3-none-any.whl.metadata (6.4 kB) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->contextily) (3.3.2) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->contextily) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->contextily) (2.2.3) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib->contextily) (1.16.0) Downloading contextily-1.6.2-py3-none-any.whl (17 kB) Downloading mercantile-1.2.1-py3-none-any.whl (14 kB) Downloading rasterio-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (22.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 22.2/22.2 MB 48.8 MB/s eta 0:00:00 Downloading cligj-0.7.2-py3-none-any.whl (7.1 kB) Downloading affine-2.4.0-py3-none-any.whl (15 kB) Downloading click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB) Installing collected packages: mercantile, cligj, click-plugins, affine, rasterio, contextily Successfully installed affine-2.4.0 click-plugins-1.1.1 cligj-0.7.2 contextily-1.6.2 mercantile-1.2.1 rasterio-1.4.0
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import geopandas as gpd
import contextily as ctx
file = 'occurrence.txt'
df = pd.read_csv(file, sep='\t') # Este argumento indica separacion por tabulaciones (sep='\t')
barra = '\n' + '-' * 80 + '\n'
Inspeccion de datos¶
# Ver las columnas en el df
print(barra)
print('Columnas del DF:\n')
print(df.columns)
print(barra)
# Verificar tipos de datos
print('Tipos de datos:\n')
print(df.dtypes)
# Verificar valores nulos
def verificar_valores_nulos(df):
print(barra)
print('Valores nulos:\n')
print(df.isnull().sum())
print(barra)
verificar_valores_nulos(df)
-------------------------------------------------------------------------------- Columnas del DF: Index(['id', 'language', 'basisOfRecord', 'occurrenceID', 'individualCount', 'organismQuantity', 'organismQuantityType', 'organismID', 'eventDate', 'year', 'month', 'day', 'verbatimEventDate', 'eventRemarks', 'higherGeography', 'continent', 'country', 'countryCode', 'stateProvince', 'municipality', 'locality', 'verbatimLocality', 'minimumElevationInMeters', 'maximumElevationInMeters', 'decimalLatitude', 'decimalLongitude', 'geodeticDatum', 'coordinateUncertaintyInMeters', 'identifiedBy', 'scientificName', 'higherClassification', 'kingdom', 'phylum', 'class', 'order', 'family', 'genus', 'specificEpithet', 'infraspecificEpithet', 'taxonRank'], dtype='object') -------------------------------------------------------------------------------- Tipos de datos: id object language object basisOfRecord object occurrenceID object individualCount int64 organismQuantity int64 organismQuantityType object organismID int64 eventDate object year int64 month int64 day int64 verbatimEventDate object eventRemarks object higherGeography object continent object country object countryCode object stateProvince object municipality object locality object verbatimLocality object minimumElevationInMeters int64 maximumElevationInMeters int64 decimalLatitude float64 decimalLongitude float64 geodeticDatum object coordinateUncertaintyInMeters float64 identifiedBy object scientificName object higherClassification object kingdom object phylum object class object order object family object genus object specificEpithet object infraspecificEpithet object taxonRank object dtype: object -------------------------------------------------------------------------------- Valores nulos: id 0 language 0 basisOfRecord 0 occurrenceID 0 individualCount 0 organismQuantity 0 organismQuantityType 0 organismID 0 eventDate 0 year 0 month 0 day 0 verbatimEventDate 0 eventRemarks 0 higherGeography 0 continent 0 country 0 countryCode 0 stateProvince 0 municipality 0 locality 0 verbatimLocality 0 minimumElevationInMeters 0 maximumElevationInMeters 0 decimalLatitude 0 decimalLongitude 0 geodeticDatum 0 coordinateUncertaintyInMeters 7 identifiedBy 0 scientificName 0 higherClassification 0 kingdom 0 phylum 0 class 0 order 0 family 0 genus 0 specificEpithet 0 infraspecificEpithet 40107 taxonRank 0 dtype: int64 --------------------------------------------------------------------------------
print(df['year'].unique())
print(barra)
# Mostrar la cantidad de valores por año
df['year'].value_counts()
[2016 2017 2018 2019 2020 2007 2014 2015 2021] --------------------------------------------------------------------------------
count | |
---|---|
year | |
2019 | 15672 |
2018 | 10055 |
2017 | 6469 |
2016 | 4046 |
2020 | 3998 |
2015 | 15 |
2014 | 4 |
2007 | 2 |
2021 | 2 |
# Ver los primeros registros sin modificar
df.head()
id | language | basisOfRecord | occurrenceID | individualCount | organismQuantity | organismQuantityType | organismID | eventDate | year | ... | higherClassification | kingdom | phylum | class | order | family | genus | specificEpithet | infraspecificEpithet | taxonRank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | CLBNR:Bird8631:CP:19:2016-03-08:23 | en | HumanObservation | CLBNR:Bird8631:CP:19:2016-03-08:23 | 1 | 1 | individuals | 23 | 2016-03-08 | 2016 | ... | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Ciccaba | virgata | NaN | species |
1 | CLBNR:Bird8631:CP:7:2016-03-11:24 | en | HumanObservation | CLBNR:Bird8631:CP:7:2016-03-11:24 | 1 | 1 | individuals | 24 | 2016-03-11 | 2016 | ... | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Ciccaba | virgata | NaN | species |
2 | CLBNR:Bird8292:CP:9:2016-03-11:25 | en | HumanObservation | CLBNR:Bird8292:CP:9:2016-03-11:25 | 1 | 1 | individuals | 25 | 2016-03-11 | 2016 | ... | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | NaN | species |
3 | CLBNR:Bird8292:CP:9:2016-03-11:26 | en | HumanObservation | CLBNR:Bird8292:CP:9:2016-03-11:26 | 1 | 1 | individuals | 26 | 2016-03-11 | 2016 | ... | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | NaN | species |
4 | CLBNR:Bird8292:CP:12:2016-03-12:27 | en | HumanObservation | CLBNR:Bird8292:CP:12:2016-03-12:27 | 1 | 1 | individuals | 27 | 2016-03-12 | 2016 | ... | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | NaN | species |
5 rows × 40 columns
# Ver los valores unicos del nombre cientifico
df['scientificName'].unique()
array(['Ciccaba virgata', 'Megascops clarkii', 'Empidonax flavescens', 'Myioborus miniatus', 'Zimmerius parvus', 'Basileuterus melanotis', 'Leiothlypis peregrina', 'Melanerpes formicivorus', 'Vermivora chrysoptera', 'Amazilia tzacatl', 'Cardellina pusilla', 'Setophaga fusca', 'Vireo leucophrys', 'Atlapetes tibialis', 'Sittasomus griseicapillus', 'Empidonax flaviventris', 'Chlorophonia callophrys', 'Chlorospingus flavopectus', 'Euphonia elegantissima', 'Ixothraupis guttata', 'Piranga leucoptera', 'Setophaga pitiayumi', 'Vireo philadelphicus', 'Tyrannus melancholicus', 'Lampornis castaneoventris', 'Aulacorhynchus prasinus', 'Pitangus sulphuratus', 'Turdus grayi', 'Eubucco bourcierii', 'Piranga bidentata', 'Myadestes melanops', 'Mniotilta varia', 'Setophaga virens', 'Dacnis venusta', 'Tangara icterocephala', 'Selasphorus scintilla', 'Cranioleuca erythrops', 'Myiodynastes hemichrysus', 'Pyrrhura hoffmanni', 'Pheugopedius rutilus', 'Henicorhina leucophrys', 'Troglodytes ochraceus', 'Basileuterus melanogenys', 'Phaethornis guy', 'Piranga rubra', 'Lepidocolaptes affinis', 'Thripadectes rufobrunneus', 'Dryobates villosus', 'Patagioenas subvinacea', 'Atlapetes albinucha', 'Tiaris olivaceus', 'Mitrephanes phaeocercus', 'Amaurospiza concolor', 'Campylopterus hemileucurus', 'Zentrygon chiriquensis', 'Leptopogon superciliaris', 'Ramphocelus passerinii costaricensis', 'Catharus ustulatus', 'Momotus lessonii', 'Trogon collaris', 'Myioborus torquatus', 'Oreothlypis gutturalis', 'Mionectes olivaceus', 'Eupherusa eximia', 'Elaenia frantzii', 'Chamaepetes unicolor', 'Pheucticus ludovicianus', 'Heliodoxa jacula', 'Selasphorus flammula', 'Vireo carmioli', 'Basileuterus culicivorus', 'Eugenes spectabilis', 'Catharus frantzii', 'Myiarchus tuberculifer', 'Myrmotherula schisticolor', 'Odontophorus guttatus', 'Megarynchus pitangua', 'Saltator maximus', 'Spinus xanthogastrus', 'Arremon brunneinucha', 'Pachyramphus versicolor', 'Thraupis palmarum', 'Vireo flavifrons', 'Cyclarhis gujanensis', 'Tangara gyrola', 'Pachyramphus albogriseus', 'Phyllomyias burmeisteri', 'Pharomachrus mocinno', 'Contopus sordidulus', 'Patagioenas fasciata', 'Diglossa plumbea', 'Columbina talpacoti', 'Piaya cayana', 'Buteo jamaicensis', 'Syndactyla subalaris', 'Premnoplex brunnescens', 'Chlorospingus pileatus', 'Sayornis nigricans', 'Tityra semifasciata', 'Glyphorynchus spirurus', 'Heliothryx barroti', 'Contopus lugubris', 'Empidonax atriceps', 'Elvira chionura', 'Colibri cyanotus', 'Falco rufigularis', 'Zonotrichia capensis', 'Catharus gracilirostris', 'Pachysylvia decurtata', 'Euphonia imitans', 'Troglodytes aedon', 'Rhynchocyclus brevirostris', 'Serpophaga cinerea', 'Colaptes rubiginosus', 'Amazilia edward', 'Catharus aurantiirostris', 'Microcerculus marginatus', 'Stilpnia larvata', 'Turdus plebejus', 'Leptotila verreauxi', 'Pseudocolaptes lawrencii', 'Campylorhamphus pusillus', 'Tangara dowii', 'Ptiliogonys caudatus', 'Contopus cooperi', 'Cathartes aura', 'Streptoprocne zonaris', 'Xenops rutilans', 'Philodice bryantae', 'Melanerpes rubricapillus', 'Psilorhinus morio', 'Scytalopus argentifrons', 'Margarornis rubiginosus', 'Cantorchilus elutus', 'Lophotriccus pileatus', 'Myiozetetes granadensis', 'Doryfera ludovicae', 'Klais guimeti', 'Ortalis cinereiceps', 'Cinclus mexicanus', 'Thraupis episcopus', 'Coragyps atratus', 'Pionus senilis', 'Catharus fuscater', 'Coereba flaveola', 'Spizaetus ornatus', 'Pheucticus tibialis', 'Pygochelidon cyanoleuca', 'Chaetura vauxi', 'Anabacerthia variegaticeps', 'Molothrus aeneus', 'Picumnus olivaceus', 'Sporophila corvina', 'Zentrygon costaricensis', 'Micrastur ruficollis', 'Sclerurus mexicanus', 'Dryobates fumigatus', 'Parkesia motacilla', 'Platyrinchus mystaceus', 'Myiothlypis fulvicauda', 'Fregata magnificens', 'Icterus galbula', 'Myiozetetes similis', 'Buteo brachyurus', 'Buteo platypterus', 'Bolborhynchus lineola', 'Sphyrapicus varius', 'Pyrilia haematotis', 'Morphnarchus princeps', 'Milvago chimachima', 'Spinus psaltria', 'Colibri delphinae', 'Nyctidromus albicollis', 'Odontophorus leucolaemus', 'Stelgidopteryx ruficollis', 'Elaenia flavogaster', 'Elanoides forficatus', 'Cyanolyca argentigula', 'Philydor rufum', 'Grallaria guatimalensis', 'Nothocercus bonapartei', 'Cardellina canadensis', 'Dives dives', 'Tolmomyias sulphurescens', 'Psarocolius wagleri', 'Stelgidopteryx serripennis', 'Streptoprocne rutila', 'Chlorostilbon assimilis', 'Legatus leucophaius', 'Bubulcus ibis', 'Harpagus bidentatus', 'Cyanerpes cyaneus', 'Heliomaster longirostris', 'Aramides cajaneus', 'Tigrisoma fasciatum', 'Buteogallus urubitinga', 'Euphonia hirundinacea', 'Rupornis magnirostris', 'Seiurus aurocapilla', 'Caracara cheriway', 'Arremon crassirostris', 'Accipiter bicolor', 'Geotrygon montana', 'Antrostomus saturatus'], dtype=object)
df.describe()
individualCount | organismQuantity | organismID | year | month | day | minimumElevationInMeters | maximumElevationInMeters | decimalLatitude | decimalLongitude | coordinateUncertaintyInMeters | |
---|---|---|---|---|---|---|---|---|---|---|---|
count | 40263.0 | 40263.0 | 40263.000000 | 40263.000000 | 40263.000000 | 40263.000000 | 40263.000000 | 40263.000000 | 40263.000000 | 40263.000000 | 40256.000000 |
mean | 1.0 | 1.0 | 20132.000000 | 2018.224275 | 5.606984 | 15.206840 | 1710.457492 | 1824.240270 | 9.471271 | -83.571738 | 229.199250 |
std | 0.0 | 0.0 | 11623.071281 | 1.144634 | 3.286159 | 8.618115 | 140.719491 | 164.116359 | 0.003306 | 0.003391 | 262.846472 |
min | 1.0 | 1.0 | 1.000000 | 2007.000000 | 1.000000 | 1.000000 | 1515.000000 | 1549.000000 | 9.464110 | -83.579280 | 10.000000 |
25% | 1.0 | 1.0 | 10066.500000 | 2017.000000 | 3.000000 | 8.000000 | 1620.000000 | 1690.000000 | 9.468910 | -83.574580 | 25.000000 |
50% | 1.0 | 1.0 | 20132.000000 | 2018.000000 | 5.000000 | 15.000000 | 1675.000000 | 1765.000000 | 9.471720 | -83.572050 | 120.000000 |
75% | 1.0 | 1.0 | 30197.500000 | 2019.000000 | 8.000000 | 22.000000 | 1765.000000 | 1956.000000 | 9.473050 | -83.569010 | 400.000000 |
max | 1.0 | 1.0 | 40263.000000 | 2021.000000 | 12.000000 | 31.000000 | 2133.000000 | 2207.000000 | 9.482590 | -83.564880 | 1350.000000 |
df['eventRemarks'].unique()
array(['Call-playback survey', 'Point count survey', 'Walking survey', ..., 'Photograph Fig. 3N', 'Photograph Fig. 12G', 'Photograph Fig. 6K'], dtype=object)
Preprocesamiento de datos¶
# Eliminar la columna con mas valores nulos
df.drop('infraspecificEpithet', axis=1, inplace=True)
# Eliminar las columnas de informacion no necesaria
df.drop('organismQuantityType', axis=1, inplace=True)
df.drop('coordinateUncertaintyInMeters', axis=1, inplace=True)
df.drop('language', axis=1, inplace=True)
df.drop('individualCount', axis=1, inplace=True)
df.drop('organismQuantity', axis=1, inplace=True)
# Ver los primeros registros despues de modificar el df
df.head()
id | basisOfRecord | occurrenceID | organismID | eventDate | year | month | day | verbatimEventDate | eventRemarks | ... | scientificName | higherClassification | kingdom | phylum | class | order | family | genus | specificEpithet | taxonRank | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | CLBNR:Bird8631:CP:19:2016-03-08:23 | HumanObservation | CLBNR:Bird8631:CP:19:2016-03-08:23 | 23 | 2016-03-08 | 2016 | 3 | 8 | 8-Mar-16 | Call-playback survey | ... | Ciccaba virgata | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Ciccaba | virgata | species |
1 | CLBNR:Bird8631:CP:7:2016-03-11:24 | HumanObservation | CLBNR:Bird8631:CP:7:2016-03-11:24 | 24 | 2016-03-11 | 2016 | 3 | 11 | 11-Mar-16 | Call-playback survey | ... | Ciccaba virgata | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Ciccaba | virgata | species |
2 | CLBNR:Bird8292:CP:9:2016-03-11:25 | HumanObservation | CLBNR:Bird8292:CP:9:2016-03-11:25 | 25 | 2016-03-11 | 2016 | 3 | 11 | 11-Mar-16 | Call-playback survey | ... | Megascops clarkii | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | species |
3 | CLBNR:Bird8292:CP:9:2016-03-11:26 | HumanObservation | CLBNR:Bird8292:CP:9:2016-03-11:26 | 26 | 2016-03-11 | 2016 | 3 | 11 | 11-Mar-16 | Call-playback survey | ... | Megascops clarkii | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | species |
4 | CLBNR:Bird8292:CP:12:2016-03-12:27 | HumanObservation | CLBNR:Bird8292:CP:12:2016-03-12:27 | 27 | 2016-03-12 | 2016 | 3 | 12 | 12-Mar-16 | Call-playback survey | ... | Megascops clarkii | Animalia, Chordata, Aves, Strigiformes, Strigi... | Animalia | Chordata | Aves | Strigiformes | Strigidae | Megascops | clarkii | species |
5 rows × 34 columns
# Clasificar las especies con listas
migratory_species = [
'Setophaga fusca',
'Vireo philadelphicus',
'Seiurus aurocapilla',
'Buteo platypterus',
'Sphyrapicus varius',
'Spinus psaltria',
'Stelgidopteryx ruficollis',
'Elanoides forficatus',
'Cardellina canadensis',
'Caracara cheriway',
'Antrostomus saturatus',
'Vermivora chrysoptera',
'Cardellina pusilla',
'Empidonax flaviventris',
'Piranga leucoptera',
'Mniotilta varia',
'Setophaga virens',
'Piranga rubra',
'Catharus ustulatus',
'Pheucticus ludovicianus',
'Contopus cooperi',
'Cathartes aura',
'Parkesia motacilla',
'Icterus galbula',
'Stelgidopteryx serripennis',
'Bubulcus ibis'
]
endemic_species = ['Ciccaba virgata', 'Megascops clarkii', 'Empidonax flavescens', 'Myioborus miniatus', 'Zimmerius parvus', 'Basileuterus melanotis', 'Leiothlypis peregrina', 'Melanerpes formicivorus', 'Amazilia tzacatl', 'Atlapetes tibialis', 'Sittasomus griseicapillus', 'Chlorophonia callophrys', 'Chlorospingus flavopectus', 'Euphonia elegantissima', 'Ixothraupis guttata', 'Tyrannus melancholicus', 'Lampornis castaneoventris', 'Aulacorhynchus prasinus', 'Pitangus sulphuratus', 'Turdus grayi', 'Eubucco bourcierii', 'Myadestes melanops', 'Dacnis venusta', 'Tangara icterocephala', 'Selasphorus scintilla', 'Cranioleuca erythrops', 'Myiodynastes hemichrysus', 'Pyrrhura hoffmanni', 'Pheugopedius rutilus', 'Henicorhina leucophrys', 'Troglodytes ochraceus', 'Basileuterus melanogenys', 'Phaethornis guy', 'Lepidocolaptes affinis', 'Thripadectes rufobrunneus', 'Patagioenas subvinacea', 'Atlapetes albinucha', 'Mitrephanes phaeocercus', 'Amaurospiza concolor', 'Campylopterus hemileucurus', 'Zentrygon chiriquensis', 'Leptopogon superciliaris', 'Ramphocelus passerinii costaricensis', 'Momotus lessonii', 'Trogon collaris', 'Myioborus torquatus', 'Oreothlypis gutturalis', 'Mionectes olivaceus', 'Eupherusa eximia', 'Elaenia frantzii', 'Chamaepetes unicolor', 'Heliodoxa jacula', 'Vireo carmioli', 'Basileuterus culicivorus', 'Eugenes spectabilis', 'Catharus frantzii', 'Myiarchus tuberculifer', 'Myrmotherula schisticolor', 'Odontophorus guttatus', 'Megarynchus pitangua', 'Saltator maximus', 'Spinus xanthogastrus', 'Arremon brunneinucha', 'Pachyramphus versicolor', 'Thraupis palmarum', 'Vireo flavifrons', 'Cyclarhis gujanensis', 'Tangara gyrola', 'Pachyramphus albogriseus', 'Phyllomyias burmeisteri', 'Pharomachrus mocinno', 'Contopus sordidulus', 'Patagioenas fasciata', 'Diglossa plumbea', 'Columbina talpacoti', 'Piaya cayana', 'Buteo jamaicensis', 'Syndactyla subalaris', 'Premnoplex brunnescens', 'Chlorospingus pileatus', 'Sayornis nigricans', 'Tityra semifasciata', 'Glyphorynchus spirurus', 'Heliothryx barroti', 'Contopus lugubris', 'Empidonax atriceps', 'Elvira chionura', 'Colibri cyanotus', 'Falco rufigularis', 'Zonotrichia capensis', 'Catharus gracilirostris', 'Pachysylvia decurtata', 'Euphonia imitans', 'Troglodytes aedon', 'Rhynchocyclus brevirostris', 'Serpophaga cinerea', 'Colaptes rubiginosus', 'Amazilia edward', 'Catharus aurantiirostris', 'Microcerculus marginatus', 'Stilpnia larvata', 'Turdus plebejus', 'Leptotila verreauxi', 'Pseudocolaptes lawrencii', 'Campylorhamphus pusillus', 'Tangara dowii', 'Ptiliogonys caudatus', 'Streptoprocne zonaris', 'Xenops rutilans', 'Melanerpes rubricapillus', 'Psilorhinus morio', 'Scytalopus argentifrons', 'Margarornis rubiginosus', 'Cantorchilus elutus', 'Lophotriccus pileatus', 'Myiozetetes granadensis', 'Doryfera ludovicae', 'Klais guimeti', 'Ortalis cinereiceps', 'Thraupis episcopus', 'Coragyps atratus', 'Pionus senilis', 'Coereba flaveola', 'Pygochelidon cyanoleuca', 'Anabacerthia variegaticeps', 'Molothrus aeneus', 'Picumnus olivaceus', 'Sporophila corvina', 'Zentrygon costaricensis', 'Micrastur ruficollis', 'Sclerurus mexicanus', 'Dryobates fumigatus', 'Platyrinchus mystaceus', 'Myiothlypis fulvicauda', 'Myiozetetes similis', 'Buteo brachyurus', 'Bolborhynchus lineola', 'Pyrilia haematotis', 'Morphnarchus princeps', 'Milvago chimachima', 'Colibri delphinae', 'Nyctidromus albicollis', 'Odontophorus leucolaemus', 'Elaenia flavogaster', 'Cyanolyca argentigula', 'Philydor rufum', 'Grallaria guatimalensis', 'Nothocercus bonapartei', 'Dives dives', 'Tolmomyias sulphurescens', 'Psarocolius wagleri', 'Streptoprocne rutila', 'Chlorostilbon assimilis', 'Legatus leucophaius', 'Harpagus bidentata', 'Cyanerpes cyaneus', 'Heliomaster longirostris', 'Aramides cajaneus', 'Tigrisoma fasciatum', 'Buteogallus urubitinga', 'Euphonia hirundinacea', 'Rupornis magnirostris', 'Arremon crassirostris', 'Geotrygon montana', 'Vireo leucophrys', 'Setophaga pitiayumi', 'Piranga bidentata', 'Tiaris olivaceus', 'Selasphorus flammula', 'Philodice bryantae', 'Cinclus mexicanus', 'Catharus fuscater', 'Spizaetus ornatus', 'Pheucticus tibialis', 'Chaetura vauxi', 'Fregata magnificens', 'Harpagus bidentatus', 'Accipiter bicolor','Dryobates villosus']
# Funcion para clasificar cada especie
def clasificar_especie(fila):
if fila['scientificName'] in migratory_species:
return 'Migratory'
elif fila['scientificName'] in endemic_species:
return 'Endemic'
else:
return 'Other'
# Aplicar la funcion y crear la columna speciesType
df['speciesType'] = df.apply(clasificar_especie, axis=1)
# Mostrar las species con speciesType Other
print(barra)
print('Especies pendientes de clasificar:\n')
print(df[df['speciesType'] == 'Other']['scientificName'].unique())
print(barra)
# Mostrar las species con speciesType Migratory
print('Especies migratorias:\n')
print(df[df['speciesType'] == 'Migratory']['scientificName'].unique())
print(barra)
-------------------------------------------------------------------------------- Especies pendientes de clasificar: [] -------------------------------------------------------------------------------- Especies migratorias: ['Vermivora chrysoptera' 'Cardellina pusilla' 'Setophaga fusca' 'Empidonax flaviventris' 'Piranga leucoptera' 'Vireo philadelphicus' 'Mniotilta varia' 'Setophaga virens' 'Piranga rubra' 'Catharus ustulatus' 'Pheucticus ludovicianus' 'Contopus cooperi' 'Cathartes aura' 'Parkesia motacilla' 'Icterus galbula' 'Buteo platypterus' 'Sphyrapicus varius' 'Spinus psaltria' 'Stelgidopteryx ruficollis' 'Elanoides forficatus' 'Cardellina canadensis' 'Stelgidopteryx serripennis' 'Bubulcus ibis' 'Seiurus aurocapilla' 'Caracara cheriway' 'Antrostomus saturatus'] --------------------------------------------------------------------------------
texto en cursiva## Graficos
# Contar las observaciones por especie
mas_observadas = df['scientificName'].value_counts().sort_values(ascending=False)
# Seleccionar las 10 primeras especies mas observadas
top_10_mas_observadas = mas_observadas.head(10)
# Crear el grafico de barras horizontal
plt.figure(figsize=(10, 6))
sns.barplot(x=top_10_mas_observadas.values,
y=top_10_mas_observadas.index,
palette='summer',
hue=top_10_mas_observadas.index,
legend=False)
# Ajustes del grafico
plt.title('10 Especies de aves más observadas')
plt.xlabel('Número de observaciones')
plt.ylabel('Especie')
plt.grid(axis='x', linestyle='--')
plt.xlim(0, top_10_mas_observadas.values.max() * 1.1) # Ajustar el limite del eje x
plt.show()
top_10_mas_observadas
count | |
---|---|
scientificName | |
Chlorospingus flavopectus | 4410 |
Myioborus miniatus | 3159 |
Pyrrhura hoffmanni | 2854 |
Tangara icterocephala | 2070 |
Aulacorhynchus prasinus | 1156 |
Vireo leucophrys | 999 |
Cardellina pusilla | 926 |
Odontophorus guttatus | 878 |
Leiothlypis peregrina | 844 |
Henicorhina leucophrys | 776 |
# Filtrar el DataFrame para que solo contenga las especies migratorias
migratory_species = df[df['speciesType'] == 'Migratory']
# Contar las observaciones por especie y ordenar de mayor a menor
mas_observadas_migratorias = migratory_species['scientificName'].value_counts().sort_values(ascending=False)
# Seleccionar las 5 primeras especies más observadas (solo migratorias)
top_5_migratory_species = mas_observadas_migratorias.head(5)
# Crear el gráfico (barras horizontales)
plt.figure(figsize=(10, 6))
sns.barplot(x=top_5_migratory_species.values, # Usar los valores de las especies más observadas
y=top_5_migratory_species.index,
palette='summer',
hue=top_5_migratory_species.index)
plt.title('5 Especies de aves migratorias más observadas')
plt.xlabel('Número de observaciones')
plt.ylabel('Especie')
plt.grid(axis='x', linestyle='--')
plt.xlim(0, top_5_migratory_species.values.max() * 1.1)
plt.show()
Comparación del Número de Especies Migratorias vs Endémicas (Gráfico de barras)¶
# Contar la cantidad de especies por tipo
species_count = df['speciesType'].value_counts()
# Crear el grafico de barras
plt.figure(figsize=(10, 6))
ax = species_count.plot(kind='bar', title='Comparación del Número de Especies Migratorias vs Endémicas', color=['blue', 'green' ,'red'])
plt.ylabel('Número de Observaciones')
plt.xlabel('\n\nTipo de especie')
plt.xticks(rotation=0)
# Anotacion destacando el numero de especies endemicas
ax.annotate('Especies endémicas: {}'.format(species_count['Endemic']), xy=(0, species_count['Endemic']), xytext=(0, species_count['Endemic']+10),
arrowprops=dict(facecolor='black'))
# Anotacion destacando el numero de especies migratorias
ax.annotate('Especies migratorias: {}'.format(species_count['Migratory']), xy=(1, species_count['Migratory']), xytext=(1, species_count['Migratory']+10),
arrowprops=dict(facecolor='black'))
plt.show()
Proporción de Especies Migratorias y Endémicas (Gráfico de torta)¶
# Crear el grafico pastel
plt.figure(figsize=(8, 8))
sns.set_palette("pastel")
# Ajustes del grafico
plt.pie(species_count, labels=species_count.index, autopct="%1.1f%%", startangle=90)
# Titulo y leyenda
plt.title('Proporción de Especies Migratorias y Endémicas')
plt.legend(title='Tipo de Especie')
plt.show()
Tendencias Temporales en el Avistamiento de Especies Migratorias (Gráfico de líneas)¶
# Agrupando por mes y contando las observaciones
monthly_counts = df.groupby('month').size()
# Creando el grafico con mejoras
plt.figure(figsize=(10, 6))
ax = monthly_counts.plot(kind='bar', title='Distribución Mensual de Observaciones', rot=0)
plt.ylabel('Número de Observaciones')
plt.xlabel('Mes')
# Añadir una linea horizontal para indicar el promedio
plt.axhline(y=monthly_counts.mean(), color='r', linestyle='--')
plt.annotate('Promedio', xy=(10, monthly_counts.mean()+5), color='r')
plt.show()
Distribución Geográfica de Especies Migratorias y Endémicas en la Reserva Cloudbridge (Mapa geográfico)¶
# Crear un GeoDataFrame utilizando las columnas de latitud y longitud
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['decimalLongitude'], df['decimalLatitude']))
# Definir el sistema de coordenadas (EPSG:4326 - WGS84)
gdf.set_crs(epsg=4326, inplace=True)
# Convertir a un sistema de coordenadas proyectado (EPSG:3857) para añadir el mapa base
gdf = gdf.to_crs(epsg=3857)
# Graficar los puntos y añadir un mapa base de contexto
ax = gdf.plot(figsize=(10, 10),
alpha=0.5,
edgecolor='k')
# Añadir el mapa base de OpenStreetMap
ctx.add_basemap(ax, source=ctx.providers.OpenStreetMap.Mapnik)
# Agregar un titulo
plt.title('Distribución Geográfica de Especies Migratorias y Endémicas en la Reserva Cloudbridge\n')
# Crear un diccionario para mapear los tipos de especies a colores y marcadores
species_colors = {'Endemic': 'blue', 'Migratory': 'red', 'Other': 'green'}
species_markers = {'Endemic': 'o', 'Migratory': '^', 'Other': 's'}
# Graficar luego los otros puntos
for species in ['Endemic', 'Other']:
gdf_species = gdf[gdf['speciesType'] == species]
gdf_species.plot(ax=ax, color=species_colors[species], marker=species_markers[species], label=species, alpha=0.7)
# Graficar primero los puntos "Migratory" para que estén encima
gdf_migratory = gdf[gdf['speciesType'] == 'Migratory']
gdf_migratory.plot(ax=ax, color=species_colors['Migratory'], marker=species_markers['Migratory'], label='Migratory', alpha=0.7)
# Personalizar la leyenda
plt.legend(loc='upper left')
# Mostrar el mapa
plt.show()
<ipython-input-33-01e816287cdd>:28: UserWarning: The GeoDataFrame you are attempting to plot is empty. Nothing has been displayed. gdf_species.plot(ax=ax, color=species_colors[species], marker=species_markers[species], label=species, alpha=0.7)
# Filtrar los datos para las especies migratorias
migratory_df = df[df['speciesType'] == 'Migratory'].copy()
# Agrupar por fecha y contar las observaciones
migratory_df['date'] = pd.to_datetime(migratory_df['eventDate'])
monthly_counts = migratory_df.groupby(migratory_df['date'].dt.to_period('M')).size()
# Crear el grafico
plt.figure(figsize=(12, 6))
sns.set_style("whitegrid")
plt.plot(monthly_counts.index.astype(str), monthly_counts.values, marker='o', color='blue', label='Observaciones Migratorias')
# Ajustes del grafico
plt.title('Tendencias Temporales en el Avistamiento de Especies Migratorias', fontsize=16)
plt.xlabel('Mes', fontsize=14)
plt.ylabel('Número de Observaciones', fontsize=14)
plt.xticks(rotation=45)
plt.legend()
plt.tight_layout() # Ajustar el layout
plt.show()
Análisis de Resultados¶
El análisis de los datos sobre la Reserva Natural Cloudbridge revela una clara disparidad entre las especies de aves migratorias y endémicas. Las especies endémicas, que representan la gran mayoría, suman un total de 36,907 individuos. Esto subraya la alta biodiversidad única de la región, ya que estas especies son exclusivas de la zona y no se encuentran en otros lugares del mundo. En contraste, las especies migratorias son mucho menos numerosas, con 3,356 individuos. Esta menor cantidad podría estar relacionada con barreras geográficas, falta de recursos o condiciones climáticas menos atractivas para la migración.
El gráfico tipo pastel muestra que el 91.7% de las observaciones corresponde a especies endémicas, mientras que solo el 8.3% se refiere a especies migratorias. Esto indica que la Reserva Cloudbridge es un hotspot de biodiversidad, esencial para la conservación de especies locales. La baja proporción de especies migratorias sugiere que factores como la geografía, la disponibilidad de recursos y las condiciones climáticas podrían limitar la migración en esta región.
En cuanto a la distribución geográfica, el mapa revela que tanto las especies migratorias como las endémicas se distribuyen a lo largo de la reserva, compartiendo el mismo espacio. Se observan agrupamientos de puntos que podrían indicar hábitats específicos que atraen a ciertas especies, como áreas con mayor cobertura arbórea para las especies endémicas y zonas más abiertas para las migratorias. La presencia de estos agrupamientos sugiere que algunas áreas pueden ser consideradas hotspots de biodiversidad, lo cual es crucial para la planificación de estrategias de conservación.
El análisis de las tendencias temporales en el avistamiento de especies migratorias muestra una considerable variabilidad en el número de observaciones mensuales, con un pico de avistamiento en diciembre del 2017. Sin embargo, de manera general se identifican picos de avistamientos en los primeros y últimos meses de cada año, que podrían correlacionarse con períodos de migración intensa o condiciones climáticas favorables. La falta de una tendencia general a largo plazo puede deberse a factores ambientales como temperatura, precipitaciones y eventos climáticos extremos, así como cambios en el hábitat o en la metodología de muestreo.
Finalmente, el gráfico de barras de las 10 especies de aves más observadas revela que algunas especies, como el Chlorospingus flavopectus, son mucho más comunes que otras. A pesar de la dominancia de ciertas especies, la presencia de una buena diversidad de familias de aves sugiere un ecosistema saludable y variado. La abundancia de estas especies podría estar influenciada por factores como la disponibilidad de alimento y las características del hábitat.
Conclusiones¶
Dominancia de Especies Endémicas como Indicativo de Alta Biodiversidad Regional: La Reserva Natural Cloudbridge se destaca por una notable dominancia de especies endémicas, las cuales representan más del 90% de las observaciones de aves. Este hallazgo subraya la importancia de la reserva como un hotspot de biodiversidad, revelando un ecosistema con una rica gama de especies que son exclusivas de esta región montañosa de Costa Rica. La alta proporción de especies endémicas indica que la reserva alberga una biodiversidad única y crítica para la conservación global, ya que muchas de estas especies no se encuentran en ningún otro lugar del planeta. Esto enfatiza la necesidad de implementar estrategias de conservación robustas para proteger estos valiosos ecosistemas frente a amenazas ambientales y antropogénicas.
Influencia de Factores Ambientales y Geográficos en la Migración de Aves: La baja proporción de especies migratorias en comparación con las endémicas sugiere que la Reserva Cloudbridge presenta desafíos significativos para las aves migratorias. Las barreras geográficas, como las montañas de Talamanca, junto con la disponibilidad limitada de recursos y las condiciones climáticas específicas, parecen influir en la migración de aves hacia y desde la reserva. Este patrón indica que las aves migratorias pueden preferir rutas alternativas o hábitats más adecuados para sus necesidades durante las migraciones. La comprensión de estos factores es crucial para desarrollar estrategias de manejo que faciliten la conectividad ecológica y el paso seguro de especies migratorias a través de la región.
Importancia de la Conservación de Hotspots Identificados para la Biodiversidad: La distribución espacial de las especies en el mapa revela que ciertas áreas dentro de la reserva actúan como hotspots de biodiversidad, con concentraciones elevadas de avistamientos tanto de especies endémicas como migratorias. Estos hotspots son fundamentales para la conservación, ya que pueden representar hábitats clave que proporcionan recursos esenciales, como alimentación y reproducción. La identificación y protección de estos hotspots son fundamentales para asegurar que los hábitats más importantes sean preservados y gestionados adecuadamente, garantizando así la continuidad de la diversidad biológica en la reserva.
Variabilidad Temporal en los Patrones de Avistamiento y su Relación con Factores Ambientales: La variabilidad significativa en el número de avistamientos de aves migratorias a lo largo del tiempo sugiere que los patrones de migración están fuertemente influenciados por factores ambientales y climáticos. Los picos y valles en el avistamiento pueden estar relacionados con variaciones estacionales, condiciones meteorológicas extremas, y cambios en la disponibilidad de recursos. Esta variabilidad destaca la necesidad de un monitoreo continuo para capturar de manera más precisa las tendencias y patrones a largo plazo, y para adaptar las estrategias de conservación en respuesta a las fluctuaciones ambientales y climáticas que afectan a las aves migratorias.
Referencias¶
Arriaga-Ramírez, S., & Cavazos, T. (2010). Regional trends of daily precipitation indices in northwest Mexico and southwest United States. Journal of Geophysical Research: Atmospheres, 115(D14).
BirdLife International. (2018). State of the world’s birds: Taking the pulse of the planet. BirdLife International.
Myers, N., Mittermeier, R. A., Mittermeier, C. G., Da Fonseca, G. A. B., & Kent, J. (2000). Biodiversity hotspots for conservation priorities. Nature, 403(6772), 853-858.
Newton, I. (2013). Birds and weather: a birdwatcher’s guide. T & AD Poyser.
Powell, J. (2022). A dataset of bird inventory records at Cloudbridge Nature Reserve, Talamanca Mountains, Costa Rica, between March 2016 and May 2020. Check List. Occurrence dataset. Enlace accedido vía GBIF.org el 16 de septiembre de 2024.
Wenny, D. G., DeVault, T. L., Johnson, M. D., Kelly, D., Sekercioglu, C. H., Tomback, D. F., & Whelan, C. J. (2011). The need to quantify ecosystem services provided by birds. The Auk, 128(1), 1-14.