Análisis Exploratorio de los anfibios en Panamá de acuerdo a su estado de conservación¶
Integrantes
- Bustamante Eddy
- Cardenas Christofher
- McDonald Lisseth
1. Descripción del proyecto y justificación¶
1. Descripción del proyecto¶
El proyecto tiene como propósito realizar un análisis exhaustivo de las especies de anfibios en Panamá, evaluando su estado de conservación de acuerdo con los datos presentados de iNaturalist y otras entidades que se encargan de conservar estas especies. Panamá por ser uno de los países con mayor diversidad biológica en el mundo, alberga una gran cantidad de especies de anfibios que enfrentan diferentes amenazas como el cambio climático, la pérdida de su hábitat y otros factores que afecten a estas especies. Este análisis se centrará en explorar los datos obtenidos sobre las especies de anfibios presentes en el país, clasificándolo según su estado de conservación y así por medio de este estudio, buscaremos identificar tendencias en la vulnerabilidad de las especies, las principales amenazas que enfrentan y las áreas geográficas de Panamá donde hay mayor concentración de estas especies.
En general, este análisis tiene como principal fin ofrecer la información critica para la toma de decisiones en políticas de conservación y gestión ambiental, con el objetivo de proteger y preservar las especies de anfibios que son vitales para el equilibrio de los ecosistemas en Panamá.
Justificación¶
Los anfibios son considerados como indicadores clave de la salud de los ecosistemas debido a su sensibilidad a cambios ambientales. En Panamá, la rica diversidad de anfibios enfrenta múltiples amenazas que han llevado a muchas especies a estar en peligro de extinción. El proyecto es esencial debido a que, a pesar de la creciente preocupación por la conservación de los anfibios, existe una necesidad urgente de un análisis integral que examine el estado de la conservación de las especies presentes en Panamá. Sin una evaluación sistemática y basada en datos actualizados, los esfuerzos de conservar y restaurar a estas especies podrían estar mal dirigidos o ser insuficiente y no solo eso, si no que muchos de los estudios disponibles están dispersos o no abarcan completamente las particularidades geográficas y ecológicas del país.
2. Antecedentes¶
2. Antecedentes¶
Los anfibios desempeñan funciones esenciales para los ecosistemas: transfieren nutrientes de medios acuáticos a terrestres y controlan las plagas de insectos; sin anfibios, se incrementaría la transmisión de enfermedades como malaria, dengue y fiebre amarilla. (Alonso, 2023)
Es por esto, que el mismo autor nos dice que un anfibio es un animal vertebrado. Su nombre proviene del griego ampi “ambos” y bios “vida”, porque una fase de su existencia transcurre en el agua y otra en la tierra. Estas especies existen desde hace 370 millones de años. Existen varios grupos con diferentes formas de vida, fisiología y rasgos morfológicos como las ranas, sapos, salamandras y cecílidos.
En un estudio realizado por (Aguirre, Edgardo, & Sosa-Batuarno, 2024) nos dicen que actualmente debido al incremento de asentamiento humanos, calentamiento global y fragmentación, las poblaciones de anfibios se ven limitadas, reduciendo la complejidad del hábitat y la existencia microhábitats.
En Panamá existen estudios acerca de las riquezas, abundancia y estado de conservación de los anfibios en el Lago Gatún, para este estudio se utilizó el método de observación directa para el registro de los individuos y el uso de claves taxonómicas para la identificación de especies. En este estudio se registraron 575 individuos en 12 especies y 8 familias. (Contreras, Voitier, Walter-Conrado, & Sosa-Batuarno, 2023)
Los autores nos dicen que el área de estudio representa un sitio interesante para estudios sobre diversidad y conservación de recursos naturales ya que forma parte del corredor interoceánico de Panamá ya que posee una extensión de 357.68 hectáreas y un recurso hídrico representado por el Lago Gatún.
En Panamá se reportan 234 especie de anfibios, distribuidas en 11 Gyomnophiona, 35 Caudata y el grupo de los anuros con 188. (Quiroz, Miranda, & Batista, 2020) Con esto Panamá se destaca por ser un país diverso, después de México y con muchas especies más por percibir.
3. Descripción del problema y el objetivo¶
En las últimas décadas, las poblaciones de anfibios en Panamá han experimentado un alarmante declive debido a múltiples amenazas, lo que ha colocado a muchas especies en riesgo de extinción.
El problema radica en que, sin un diagnóstico claro del estado de conservación de los anfibios, las estrategias de protección no se pueden enfocar adecuadamente en las especies y áreas que más lo necesitan. A medida que los ecosistemas continúan degradándose y las especies siguen desapareciendo, es crucial contar con datos que permitan identificar las especies más vulnerables, comprender las amenazas específicas que enfrentan, y actuar antes de que las poblaciones de anfibios se reduzcan de manera irreversible.
Objetivo¶
- Identificar las especies de anfibios presentes en Panamá y clasificarlas según su estado de conservación, con el fin de determinar las zonas con mayor avistamiento de anfibios y evaluar las áreas críticas para la conservación de las especies en peligro.
4.1. Preprocesamiento¶
# Importar geopandas y geodatasets
!pip install numpy
!pip install pandas
!pip install seaborn
!pip install scikit-learn
!pip install matplotlib
!pip install geodatasets
!pip install ydata-profiling
Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (1.26.4) Requirement already satisfied: pandas in /usr/local/lib/python3.10/dist-packages (2.2.2) Requirement already satisfied: numpy>=1.22.4 in /usr/local/lib/python3.10/dist-packages (from pandas) (1.26.4) Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from pandas) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas) (2024.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0) Requirement already satisfied: seaborn in /usr/local/lib/python3.10/dist-packages (0.13.2) Requirement already satisfied: numpy!=1.24.0,>=1.20 in /usr/local/lib/python3.10/dist-packages (from seaborn) (1.26.4) Requirement already satisfied: pandas>=1.2 in /usr/local/lib/python3.10/dist-packages (from seaborn) (2.2.2) Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /usr/local/lib/python3.10/dist-packages (from seaborn) (3.8.0) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.3.1) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.55.0) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.7) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (24.2) Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (11.0.0) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.0) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.8.2) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2->seaborn) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.2->seaborn) (2024.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.16.0) Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (1.5.2) Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.26.4) Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.13.1) Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (1.4.2) Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn) (3.5.0) Requirement already satisfied: matplotlib in /usr/local/lib/python3.10/dist-packages (3.8.0) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.3.1) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (4.55.0) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.4.7) Requirement already satisfied: numpy<2,>=1.21 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (1.26.4) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (24.2) Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (11.0.0) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (3.2.0) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib) (2.8.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0) Collecting geodatasets Downloading geodatasets-2024.8.0-py3-none-any.whl.metadata (5.4 kB) Requirement already satisfied: pooch in /usr/local/lib/python3.10/dist-packages (from geodatasets) (1.8.2) Requirement already satisfied: platformdirs>=2.5.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (4.3.6) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (24.2) Requirement already satisfied: requests>=2.19.0 in /usr/local/lib/python3.10/dist-packages (from pooch->geodatasets) (2.32.3) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (3.4.0) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (2.2.3) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.19.0->pooch->geodatasets) (2024.8.30) Downloading geodatasets-2024.8.0-py3-none-any.whl (20 kB) Installing collected packages: geodatasets Successfully installed geodatasets-2024.8.0 Collecting ydata-profiling Downloading ydata_profiling-4.12.0-py2.py3-none-any.whl.metadata (20 kB) Requirement already satisfied: scipy<1.14,>=1.4.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.13.1) Requirement already satisfied: pandas!=1.4.0,<3,>1.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.2.2) Requirement already satisfied: matplotlib<3.10,>=3.5 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (3.8.0) Requirement already satisfied: pydantic>=2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.9.2) Requirement already satisfied: PyYAML<6.1,>=5.0.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (6.0.2) Requirement already satisfied: jinja2<3.2,>=2.11.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (3.1.4) Collecting visions<0.7.7,>=0.7.5 (from visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling) Downloading visions-0.7.6-py3-none-any.whl.metadata (11 kB) Requirement already satisfied: numpy<2.2,>=1.16.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.26.4) Collecting htmlmin==0.1.12 (from ydata-profiling) Downloading htmlmin-0.1.12.tar.gz (19 kB) Preparing metadata (setup.py) ... done Collecting phik<0.13,>=0.11.1 (from ydata-profiling) Downloading phik-0.12.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB) Requirement already satisfied: requests<3,>=2.24.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (2.32.3) Requirement already satisfied: tqdm<5,>=4.48.2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (4.66.6) Requirement already satisfied: seaborn<0.14,>=0.10.1 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.13.2) Collecting multimethod<2,>=1.4 (from ydata-profiling) Downloading multimethod-1.12-py3-none-any.whl.metadata (9.6 kB) Requirement already satisfied: statsmodels<1,>=0.13.2 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.14.4) Requirement already satisfied: typeguard<5,>=3 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (4.4.1) Collecting imagehash==4.3.1 (from ydata-profiling) Downloading ImageHash-4.3.1-py2.py3-none-any.whl.metadata (8.0 kB) Requirement already satisfied: wordcloud>=1.9.3 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (1.9.4) Collecting dacite>=1.8 (from ydata-profiling) Downloading dacite-1.8.1-py3-none-any.whl.metadata (15 kB) Requirement already satisfied: numba<1,>=0.56.0 in /usr/local/lib/python3.10/dist-packages (from ydata-profiling) (0.60.0) Collecting PyWavelets (from imagehash==4.3.1->ydata-profiling) Downloading pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (9.0 kB) Requirement already satisfied: pillow in /usr/local/lib/python3.10/dist-packages (from imagehash==4.3.1->ydata-profiling) (11.0.0) Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2<3.2,>=2.11.1->ydata-profiling) (3.0.2) Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (1.3.1) Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (0.12.1) Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (4.55.0) Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (1.4.7) Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (24.2) Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (3.2.0) Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib<3.10,>=3.5->ydata-profiling) (2.8.2) Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.10/dist-packages (from numba<1,>=0.56.0->ydata-profiling) (0.43.0) Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas!=1.4.0,<3,>1.1->ydata-profiling) (2024.2) Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.10/dist-packages (from pandas!=1.4.0,<3,>1.1->ydata-profiling) (2024.2) Requirement already satisfied: joblib>=0.14.1 in /usr/local/lib/python3.10/dist-packages (from phik<0.13,>=0.11.1->ydata-profiling) (1.4.2) Requirement already satisfied: annotated-types>=0.6.0 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (0.7.0) Requirement already satisfied: pydantic-core==2.23.4 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (2.23.4) Requirement already satisfied: typing-extensions>=4.6.1 in /usr/local/lib/python3.10/dist-packages (from pydantic>=2->ydata-profiling) (4.12.2) Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (3.4.0) Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (3.10) Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (2.2.3) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3,>=2.24.0->ydata-profiling) (2024.8.30) Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.10/dist-packages (from statsmodels<1,>=0.13.2->ydata-profiling) (1.0.1) Requirement already satisfied: attrs>=19.3.0 in /usr/local/lib/python3.10/dist-packages (from visions<0.7.7,>=0.7.5->visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling) (24.2.0) Requirement already satisfied: networkx>=2.4 in /usr/local/lib/python3.10/dist-packages (from visions<0.7.7,>=0.7.5->visions[type_image_path]<0.7.7,>=0.7.5->ydata-profiling) (3.4.2) Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib<3.10,>=3.5->ydata-profiling) (1.16.0) Downloading ydata_profiling-4.12.0-py2.py3-none-any.whl (390 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 390.6/390.6 kB 8.0 MB/s eta 0:00:00 Downloading ImageHash-4.3.1-py2.py3-none-any.whl (296 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 296.5/296.5 kB 21.1 MB/s eta 0:00:00 Downloading dacite-1.8.1-py3-none-any.whl (14 kB) Downloading multimethod-1.12-py3-none-any.whl (10 kB) Downloading phik-0.12.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (686 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 686.1/686.1 kB 30.5 MB/s eta 0:00:00 Downloading visions-0.7.6-py3-none-any.whl (104 kB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 104.8/104.8 kB 8.0 MB/s eta 0:00:00 Downloading pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.5 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.5/4.5 MB 84.3 MB/s eta 0:00:00 Building wheels for collected packages: htmlmin Building wheel for htmlmin (setup.py) ... done Created wheel for htmlmin: filename=htmlmin-0.1.12-py3-none-any.whl size=27081 sha256=d8a2f55a447aeae9a5d22301959a1389f7a5a0233e1d2a4e60b969234315c97e Stored in directory: /root/.cache/pip/wheels/dd/91/29/a79cecb328d01739e64017b6fb9a1ab9d8cb1853098ec5966d Successfully built htmlmin Installing collected packages: htmlmin, PyWavelets, multimethod, dacite, imagehash, visions, phik, ydata-profiling Successfully installed PyWavelets-1.7.0 dacite-1.8.1 htmlmin-0.1.12 imagehash-4.3.1 multimethod-1.12 phik-0.12.4 visions-0.7.6 ydata-profiling-4.12.0
# Importan los datos con las herramientas del curso. (Pandas)
import geopandas as gpd
import geodatasets
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from shapely.geometry import Point
import seaborn as sns
from sklearn import datasets
from ydata_profiling import ProfileReport
from sklearn.preprocessing import MinMaxScaler
Se importan dos DataFrames, el primero corresponde a las observaciones obtenidas de iNaturalist y el segundo es la Lista Roja de la UICN del estado de conservación de las especies de anfibios a nivel mundial.
# DataFrame de observaciones
register_filepath1 = "/content/anfibios.csv"
df1 = pd.read_csv(register_filepath1)
# DataFrame de lista de conservacion Obtenida de: https://www.iucnredlist.org/es/search
register_filepath2 = "/content/redlist.csv"
dfred = pd.read_csv(register_filepath2)
--------------------------------------------------------------------------- FileNotFoundError Traceback (most recent call last) <ipython-input-3-4d6aca9e8620> in <cell line: 3>() 1 # DataFrame de observaciones 2 register_filepath1 = "/content/anfibios.csv" ----> 3 df1 = pd.read_csv(register_filepath1) 4 5 # DataFrame de lista de conservacion Obtenida de: https://www.iucnredlist.org/es/search /usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend) 1024 kwds.update(kwds_defaults) 1025 -> 1026 return _read(filepath_or_buffer, kwds) 1027 1028 /usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py in _read(filepath_or_buffer, kwds) 618 619 # Create the parser. --> 620 parser = TextFileReader(filepath_or_buffer, **kwds) 621 622 if chunksize or iterator: /usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py in __init__(self, f, engine, **kwds) 1618 1619 self.handles: IOHandles | None = None -> 1620 self._engine = self._make_engine(f, self.engine) 1621 1622 def close(self) -> None: /usr/local/lib/python3.10/dist-packages/pandas/io/parsers/readers.py in _make_engine(self, f, engine) 1878 if "b" not in mode: 1879 mode += "b" -> 1880 self.handles = get_handle( 1881 f, 1882 mode, /usr/local/lib/python3.10/dist-packages/pandas/io/common.py in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options) 871 if ioargs.encoding and "b" not in ioargs.mode: 872 # Encoding --> 873 handle = open( 874 handle, 875 ioargs.mode, FileNotFoundError: [Errno 2] No such file or directory: '/content/anfibios.csv'
El Dataframe original tiene una gran cantidad de información. Por lo que priorizamos las columnas de interés para este proyecto.
# Creamos un nuevo dataframe (df2) a partir del original (df1)
df2 = df1[['id', 'observed_on_string', 'observed_on', 'time_observed_at', 'time_zone',
'user_id', 'user_login', 'user_name',
'url', 'image_url', 'captive_cultivated',
'place_guess', 'latitude', 'longitude', 'positional_accuracy', 'place_county_name', 'place_state_name', 'place_country_name', 'place_admin1_name', 'place_admin2_name',
'iconic_taxon_name', 'taxon_id', 'taxon_family_name', 'scientific_name', 'common_name', 'species_guess'
]]
# Utilizan herramientas del curso para realizar un análisis exploratorio de datos (Pandas o ydata-profiling).
# Creamos el informe con pandas-profiling
profile2 = ProfileReport(df2, title="Observaciones de Anfibios - iNaturalist", explorative=True)
# Mostrar el informe en un notebook
profile2.to_notebook_iframe()
Merge Dataframes¶
Se realiza un cruce de datos del dataframe original de las observaciones extraídas y la Lista Roja de la UICN. Esto nos permitió categorizar rápidamente las especies presentes en las observaciones de acuerdo a la información más reciente de su nivel de conservación.
# Hacer el merge entre df1 y df2 basado en los nombres científicos
df2 = df2.merge(dfred[['scientificName', 'redlistCategory', 'realm', 'yearPublished']],
left_on='scientific_name',
right_on='scientificName',
how='left')
df2.drop(columns=['scientificName'], inplace=True)
display(df2.shape)
display(df2)
categories = df2['redlistCategory'].value_counts()
# Almacenar en un DF
categories_df = categories.reset_index()
# Renombrar columnas
categories_df.columns = ['redlistCategory', 'count']
display(categories_df)
display(df2[df2['redlistCategory'] == "Critically Endangered"])
Limpieza de datos NaN¶
Se eliminan registros que tienen NaN en Familia (taxon_family_name), luego de validar que estos no tienen la información completa para procesarse.
df_taxon_fam_nan = df2[df2['taxon_family_name'].isna()]
display(df_taxon_fam_nan.head(2))
diferentes = df_taxon_fam_nan['scientific_name'].value_counts()
display(diferentes)
# Se realiza la eliminación y la validación de los tamaños previo y posterior por cualquier error
display(df2.shape)
df2 = df2.dropna(subset=['taxon_family_name'])
display(df2.shape)
# Se realiza la eliminación y la validación de los tamaños previo y posterior por cualquier error
display(df2.shape)
df2 = df2.dropna(subset=['time_observed_at'])
display(df2.shape)
# Limpieza de datos
# Se asigna un valor estandar a la exactitud del punto gps registrado
df2.loc[(df2['positional_accuracy'].isna()), 'positional_accuracy'] = 0
# Se asigna un valor estandar a los registros sin nombre comun, species guess y demás columnas
df2.loc[(df2['place_state_name'].isna()), 'place_state_name'] = 'Desconocido'
df2.loc[(df2['common_name'].isna()), 'common_name'] = 'Desconocido'
df2.loc[(df2['species_guess'].isna()), 'species_guess'] = 'Desconocido'
df2.loc[(df2['user_name'].isna()), 'user_name'] = 'Desconocido'
df2.loc[(df2['place_county_name'].isna()), 'place_county_name'] = 'Desconocido'
df2.loc[(df2['place_admin1_name'].isna()), 'place_admin1_name'] = 'Desconocido'
df2.loc[(df2['place_admin2_name'].isna()), 'place_admin2_name'] = 'Desconocido'
df2.loc[(df2['image_url'].isna()), 'image_url'] = 'https://i.pinimg.com/736x/ab/d7/e5/abd7e5dd501a25bfc1d43b702ea812dc.jpg'
df2.loc[(df2['place_guess'].isna()), 'place_guess'] = 'Desconocido'
# Visualizamos las columnas existentes
print(df2.columns)
# Validar los datos ajustados
nan_count = df2.isna().sum()
print(nan_count)
#Realizamos una revisión de los valores que no se mappearon con las categorías de conservación
redlist = df2[df2['redlistCategory'].isna()]
#display(redlist.head(2))
difred = redlist['scientific_name'].value_counts()
display(difred)
# Se realiza la eliminación y la validación de los tamaños previo y posterior por cualquier error
display(df2.shape)
df2 = df2.dropna(subset=['redlistCategory'])
df2 = df2.dropna(subset=['time_zone'])
display(df2.shape)
Finalmente se obtienen los datos limpios de nulos y datos confiables y categorizados.
# Validar los datos ajustados
nan_count = df2.isna().sum()
print(nan_count)
Visualizacion de la distribucion de los datos por familia¶
# Agrupado por familia el conteo de observaciones
df_observ_family = df2.groupby('taxon_family_name').size().reset_index(name='observaciones')
# Crear una nueva columna 'taxon_family_group' para agrupar los menores a 20 como 'Otros'
df_observ_family['taxon_family_group'] = df_observ_family['taxon_family_name'].where(df_observ_family['observaciones'] >= 20, 'Otros')
display(df_observ_family)
# Crear gráfico de barras
plt.figure(figsize=(8, 8))
# Crear la gráfica de pastel
plt.pie(df_observ_family.observaciones, labels=df_observ_family.taxon_family_name, autopct='%1.1f%%')
# Título del gráfico
plt.title('Distribución de las observaciones por Familia')
plt.show()
4.2. Visualización de Datos¶
Crearemos diversos mapas basados en la distribución geográfica de Panamá por provincias.
Adicionalmente utilizaremos los mapas para graficar puntos de interés.
# Cargamos el archivo .shp
gdf = gpd.read_file('/content/gadm41_PAN_1.shp')
# Agregamos una columna provincia al GeoDataFrame
provincias = ['Bocas del Toro', 'Chiriquí', ' Coclé', 'Colón','Darién', ' Emberá Wounaan', ' Herrera', ' Guna Yala', ' Los Santos',' Ngäbe-Buglé', ' Panamá', 'Panamá Oeste', 'Veraguas' ]
gdf['provincia'] = provincias
gdf
Observaciones de anfibios por provincia¶
# Agregamos la densidad de observaciones de los anfibios por provincia
# Agrupar por año y obtener las observaciones
df2_observ_prov = df2.groupby('place_state_name').size().reset_index(name='observaciones')
df2_observ_prov.sort_values(by='observaciones', ascending=False)
df2_observ_prov
# Crear gráfico de barras
plt.figure(figsize=(6, 6))
df2_observ_prov_ordenado = df2_observ_prov.sort_values(by='observaciones', ascending=True)
df2_observ_prov_ordenado.plot(kind='barh', x='place_state_name', y='observaciones', color='#3CB371', ax=plt.gca())
# Título del gráfico
plt.title('Observaciones de anfibios por provincia')
# Etiquetas de los Ejes
plt.ylabel('Provincias')
plt.xlabel('Número de observaciones')
plt.grid()
plt.show()
display(df2_observ_prov_ordenado)
Densidad de anfibios segun las observaciones por Provincia en Panamá¶
# Agregamos la columna 'Observacion'
gdf['observación'] = ['2360', '1313', ' 1632', '2955','722', '36', ' 149',' 231','305', ' 152', ' 3133', '1553', '1158' ]
gdf['observación'] = gdf['observación'].str.replace(',', '').astype(int)
# Graficamos la densidad de anfibios segun las observaciones
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
gdf.plot(column='observación', ax=ax, legend=True,legend_kwds={"loc": "center right", "bbox_to_anchor": (1.15, 0.5),}, categorical=True, cmap='OrRd', edgecolor="black", linewidth=0.3)
for x, y, label in zip(gdf.geometry.centroid.x, gdf.geometry.centroid.y, gdf['provincia']):
ax.text(x, y, label, fontsize=10, ha='center')
plt.title('Densidad según las observaciones de anfibios por Provincia en Panamá')
plt.show()
gdf
Sitios críticos para la conservación¶
# Sitios críticos para la conservación
# Coordenadas X y Y (latitud y longitud)
puntos_conservacion = [
(8.5, -82.5), # Tierras Altas de Panamá
(8.9, -80.4), # Panamá Central
(7.9, -77.5), # Chocó-Darién
(8.6, -79.9), # Parque Nacional Altos de Campana
(8.5, -80.5), # Valle de Antón
(8.4, -80.2), # Parque Nacional General de División Omar Torrijos Herrera
(8.3, -77.7), # Cerro Sapo
(8.7, -82.6), # Parque Internacional La Amistad
(8.8, -81.6), # Reserva Forestal Fortuna
(7.7, -77.8) # Parque Nacional Darién
]
# Creamos un GeoDataFrame para los puntos
puntos = gpd.GeoDataFrame(geometry=[Point(lon, lat) for lat, lon in puntos_conservacion])
#agregamos dos columnas al GeoDataFrame
provincias = ['Chiriquí', 'Panamá', 'Darién', ' Panamá', 'Coclé', ' Coclé', ' Darién','Chiriquí , Bocas del Toro', 'Chiriquí' ,'Darién' ]
puntos['provincia'] = provincias
lugares = ['Tierras Altas de Panamà', 'Panamá Central' ,'Chocó-Darién' , 'Parque Nacional Altos de Campana', 'El Valle de Antón', 'Parque Nacional de División General Omar Torrijos Herrera', 'Cerro Sapo', 'Parque Internacional La Amistad', 'Reserva Forestal Fortuna','Parque Nacional Darién']
puntos['lugar'] = lugares
# Graficamos los puntos sobre el mapa
n_lug = len(puntos['lugar'].unique())
cmap = plt.get_cmap('tab20b', n_lug)
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
gdf.plot(ax=ax, color='lightgrey', edgecolor="gray")
puntos.plot(column='lugar', ax=ax, legend=True,legend_kwds={"loc": "center right", "bbox_to_anchor": (1.62, 0.68),}, cmap=cmap, markersize=300, marker='*', edgecolor='black', linewidth=0.8)
plt.title('Mapa de Sitios Críticos para la conservación en Panamá')
plt.show()
Análisis por especies y niveles de conservación¶
Especies en Peligro Crítico con una sola observación¶
# Grafico de las observaciones para las especies en peligro de extinsión
dfCE = df2[df2['redlistCategory'] == "Critically Endangered"] # Peligro critico
dfgroup = dfCE.groupby('scientific_name').size().reset_index(name='observaciones')
dfgroup_sorted = dfgroup.sort_values(by='observaciones', ascending=True)
#df_observ_family = df2.groupby('taxon_family_name').size().reset_index(name='observaciones')
display(dfgroup_sorted)
one_observ = dfgroup_sorted[dfgroup_sorted['observaciones'] == 1]['scientific_name']
dfCE_OneObs = dfCE[(dfCE['redlistCategory'] == "Critically Endangered") & (dfCE['scientific_name'].isin(one_observ))]
# Crear el GeoDataFrame para los puntos con las coordenadas y nombres científicos
puntos = gpd.GeoDataFrame(
dfCE_OneObs,
geometry=[Point(lon, lat) for lat, lon in zip(dfCE_OneObs['latitude'], dfCE_OneObs['longitude'])]
)
# Agregar la columna 'scientific_name' como 'nombre' al GeoDataFrame
puntos['nombre'] = dfCE_OneObs['scientific_name']
# Graficamos los puntos sobre el mapa
n_lug = len(puntos['nombre'].unique())
cmap = plt.get_cmap('tab20b', n_lug)
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
gdf.plot(ax=ax, color='lightgrey', edgecolor="gray")
puntos.plot(column='nombre', ax=ax, legend=True,
legend_kwds={"loc": "center right", "bbox_to_anchor": (1.35, 0.68)},
cmap=cmap, markersize=400, marker='.', edgecolor='black', linewidth=0.8)
plt.title('Especies en Peligro Crítico con una sola observación')
plt.show()
# Creamos un nuevo dataframe con columnas especificas
dfnew2 = df2[['scientific_name', 'place_state_name', 'place_admin1_name', 'place_admin2_name', 'redlistCategory', 'observed_on']]
dfnew21 = dfnew2.groupby('redlistCategory').size().reset_index(name='observaciones')
dfnew21.sort_values(by='observaciones', ascending=False)
display(dfnew21)
# Se filtran los datos por categoria de conservacion excluyendo los que no estan en peligro o vulnerables.
dfNotLC_Obs = dfnew2[(dfnew2['redlistCategory'] != "Least Concern")]
# Agrupar por año y obtener las observaciones
dfnew22 = dfNotLC_Obs.groupby('redlistCategory').size().reset_index(name='observaciones')
dfnew22.sort_values(by='observaciones', ascending=False)
# Crear gráfico
plt.figure(figsize=(8, 8))
# Crear la gráfica de pastel
plt.pie(dfnew22.observaciones, labels=dfnew22.redlistCategory, autopct='%1.1f%%')
# Título del gráfico
plt.suptitle('Distribución de las observaciones por Nivel de Conservación')
plt.title('Exceptuando las especies "Least Concern"', fontsize=10)
plt.show()
Principal hallazgo¶
Identificación de Especies y Estado de Conservación: Se identificaron un total de 289 especies de anfibios en Panamá, de las cuales un 54% de las observaciones de especies se identificaron en peligro critico. Este hallazgo subraya la importancia de Panamá como un hotspot de biodiversidad y la urgencia de implementar medidas de conservación para proteger estas especies amenazadas.
Hallazgos complementarios¶
Conclusiones¶
Se identificaron un total de 289 especies de anfibios en Panamá, lo que resalta la rica biodiversidad del país y su importancia como hábitat para estos organismos.
Un 54% de las observaciones de las especies identificadas estan en peligro crítico, lo que indica la necesidad urgente de implementar medidas de conservación efectivas para proteger estas poblaciones amenazadas.
Las áreas con mayor concentración de especies en peligro se localizaron principalmente en las provincias de Chiriquí, Panamá, Darién, Coclé y Bocas del Toro, lo que sugiere que estas zonas requieren atención prioritaria para la conservación y manejo sostenible.
Se determinaron varias zonas con un alto avistamiento de anfibios, las cuales son: Panamá, Colón, Bocas del Toro, Coclé, Panamá Oeste, Chiriquí y Veraguas, lo que puede servir como base para futuros estudios y programas de monitoreo, así como para la educación ambiental.
El proyecto ha proporcionado información valiosa sobre la diversidad y el estado de conservación de los anfibios en Panamá, destacando la necesidad crítica de proteger las áreas identificadas como prioritarias. La integración de datos sobre avistamientos y el estado de conservación permitirá desarrollar estrategias más efectivas para la preservación de estas especies y sus hábitats, contribuyendo así a la sostenibilidad ecológica del país.
Referencias¶
Aguirre, B., Edgardo, G., & Sosa-Batuarno, A. (2024). Riqueza y abundancia de anfibios y reptiles asociada al sendero natural árboles cuadrados del Valle de Antón, Provincia de Coclé. Revista Cientifífica Vida Natural, 34-35.
Alonso, L. A. (Mayo de 2023). Anfibios. (E. A. Zúñiga, Entrevistador)
Contreras, M., Voitier, J., Walter-Conrado, M., & Sosa-Batuarno, A. (2023). Anfibios (Amphibia: Anura) en el Área Recreativa Lago Gatún, Colón,Panamá. Revista Científica Guacamaya, 1-2.
Muñoz, C. G. (2023). Enfermedades emergentes en anfibios. Estudio de prevalencia en humedales del sur de Alicante. Elche: Universidad Miguel Hernández de Elche. Obtenido de Universidad Miguel Hernández .
Quiroz, M., Miranda, M., & Batista, A. (2020). Anfibios en la Unión de las Américas: Ranas como modelo de estudio para desafíos de la conservación en Panamá. Los Naturalistas, 10-12.
"Los datos correctamente analizados siempre cuentan una historia; el reto está en saber escucharla."¶
— Stephen Few