Estadísticas de la biodiversidad en Cartagena
Esta pagina usa la base de datos libres administrada por la Autoridad Nacional de Licencias Ambientales, la cual consta de dos archivos, uno para fauna y otro para flora.
A continuación generamos el DataFrame principal del archivo de fauna, previamente se seleccionaron los datos geolocalizados en el área de interes (longitud menor a -74,5° W y latitud entre 10.0 y 10.5°N)
Creación y limpieza del DataFrame
import pandas as pd # Importamos el DataFrame (DF) original (df1)
df = pd.read_excel('TB_Final.xlsx', sheet_name='BD', header=0) #Generamos el DataFrame original df
# Limpiamos el DataFrame y creamos el DF de trabajo (df2)
df2 = df.drop(columns=["ID_MUES_PT", "DETERM","ORDEN"])
df2 = df2.drop(columns=["FAMILIA","OBSERV","X_GEO","Y_GEO"])
df2 = df2.drop(columns=["N_COMUN","Invasoras"])
df2 = df2.dropna()
# Imprimimos las caracteristicas del DataFrame de trabajo (df2)
print(df2.info())
print('\n')
print(df2.describe())
print('\n')
<class 'pandas.core.frame.DataFrame'>
Index: 1453 entries, 0 to 1541
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 CLASE 1453 non-null object
1 GENERO 1453 non-null object
2 ESPECIE 1453 non-null object
3 CORREL 1453 non-null float64
4 ABUND_ABS 1453 non-null float64
5 FECHA_MUESTREO 1453 non-null datetime64[ns]
6 Cuenta 1453 non-null int64
7 LibroRojo 1453 non-null object
8 Migracion 1453 non-null object
dtypes: datetime64[ns](1), float64(2), int64(1), object(5)
memory usage: 113.5+ KB
None
CORREL ABUND_ABS FECHA_MUESTREO Cuenta
count 1453.000000 1453.000000 1453 1453.0
mean 93.427908 8.613074 2017-09-29 20:31:52.732278016 1.0
min 45.000000 0.000000 2014-01-25 00:00:00 1.0
25% 89.125000 1.000000 2014-09-30 00:00:00 1.0
50% 100.000000 1.000000 2017-09-13 00:00:00 1.0
75% 100.000000 2.000000 2021-11-01 00:00:00 1.0
max 100.000000 5069.000000 2021-11-01 00:00:00 1.0
std 12.063088 136.843265 NaN 0.0
El DataFrame de trabajo después de la limpieza realizada a los datos finalizó con un tamaño de 1453 registros; y ocho columnas de información por registro. Para estas estadísticas cada registro o linea de información equivale a la información de abundancia recolectada para una especie (vista o identificada) en un momento específico (fecha de muestreo).
Estadísticas de las observaciones anuales
#Agrupamos la información por fecha de muestreo y creamos el Dataframe df3
df3 = df2.groupby("FECHA_MUESTREO")["ABUND_ABS"].sum().reset_index()
df4 = df2.groupby("FECHA_MUESTREO")["Cuenta"].sum().reset_index()
df3['Avistamientos'] = df4['Cuenta']
df3['Muestreos'] = df4['FECHA_MUESTREO']
print(df3.head())
print('\n')
print(df3.info())
FECHA_MUESTREO ABUND_ABS Avistamientos Muestreos 0 2014-01-25 304.000000 304 2014-01-25 1 2014-09-30 6549.000000 63 2014-09-30 2 2014-12-13 1757.000000 215 2014-12-13 3 2015-03-31 2150.000000 25 2015-03-31 4 2015-07-07 17.797186 96 2015-07-07 <class 'pandas.core.frame.DataFrame'> RangeIndex: 33 entries, 0 to 32 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 FECHA_MUESTREO 33 non-null datetime64[ns] 1 ABUND_ABS 33 non-null float64 2 Avistamientos 33 non-null int64 3 Muestreos 33 non-null datetime64[ns] dtypes: datetime64[ns](2), float64(1), int64(1) memory usage: 1.2 KB None
Visualización de la información por años
import plotly.express as px
# visualización de la información en un grafico de lineas interactivo
fig = px.line(df3, x='Muestreos', y=['ABUND_ABS','Avistamientos'],
title='Monitoreos anuales',
color_discrete_sequence=["rgb(255, 100, 0)","rgb(0, 0, 255)"],
markers=True)
fig.update_traces(marker=dict(color='black', size=6))
fig.show()
En la representacion gráfica observamos mayor abundancia de especies en los primeros años 2014-2015, quizas debido a un efecto metodológico por más muestreos y un descenso en las actividades de monitoreo entre 2016-2021.
Especies más representativas segun su tipo
import numpy as np
# Agrupamos los avistamientos por tipo de especie (mamiferos, aves, etc..)
df5 = df2.groupby("CLASE")["Cuenta"].sum().reset_index()
print(df5)
print('\n')
CLASE Cuenta 0 Amphibia 43 1 Aves 1146 2 Mammalia 124 3 Reptilia 132 4 Sauropsida 8
# Visualizacion
import matplotlib.pyplot as plt
fig2 = px.pie(data_frame=df5, names ="CLASE", values ="Cuenta",
title= "Avistamientos por clases de especies")
fig2.show()
Especies más abundantes
# Agrupamos la información por especie (nombre científico)
df6 = df2.groupby(by="ESPECIE")["Cuenta"].sum().reset_index()
df_a = df2.groupby("ESPECIE")["CLASE"].max().reset_index()
df6['Clases'] = df_a['CLASE']
print('\n')
print(df6.head(10))
print('\n')
print(df6.describe())
ESPECIE Cuenta Clases
0 Alouatta seniculus 4 Mammalia
1 Amazilia saucerottei 2 Aves
2 Amazilia saucerrottei 1 Aves
3 Amazilia tzacatl 1 Aves
4 Amazilia tzacatl 2 Aves
5 Amazona ochrocephala 2 Aves
6 Ameiva ameiva 12 Sauropsida
7 Anas discors 3 Aves
8 Anolis auratus 8 Reptilia
9 Anolis gaigei 3 Reptilia
Cuenta
count 394.000000
mean 3.687817
std 4.151888
min 1.000000
25% 1.000000
50% 2.000000
75% 4.000000
max 26.000000
En los monitoreos realizados en el area de Cartagena se han identificado 394 especies de fauna.
Las especies más abundantes
(es decir, las de mayor número de observaciones registradas)import pandas as pd
Cuenta_maxima = np.max(df6['Cuenta'])
print("Abundancia máxima por especie: ", Cuenta_maxima, "individuos")
num_ordenados= sorted(df6['Cuenta'],reverse=True) #Devuelve una serie con los elementos de la columna "Cuenta" del DataFrame df:
# seleccionamos las especies con las 10 abundancias mas altas registradas
aux=[]
for x in range(10):
aux.append(num_ordenados[x])
# creamos un nuevo df7 filtrando con las 10 abundancias mayores del df6
df7=df6[df6["Cuenta"].isin(aux)]
print('\n')
print(df7)
print('\n')
Abundancia máxima por especie: 26 individuos
ESPECIE Cuenta Clases
31 Bubulcus ibis 16 Aves
54 Cathartes aura 18 Aves
80 Columbina talpacoti 26 Aves
83 Coragyps atratus 23 Aves
85 Crotophaga ani 26 Aves
92 Cyanocorax affinis 16 Aves
103 Didelphis marsupialis 16 Mammalia
142 Iguana iguana 22 Reptilia
165 Milvago chimachima 17 Aves
202 Pitangus sulphuratus 19 Aves
282 Zenaida auriculata 16 Aves
328 griseus 19 Aves
349 melancholicus 18 Aves
384 sulphuratus 16 Aves
las 6 Especies más observadas
import matplotlib.pyplot as plt
df8= df7[df7['Cuenta']>=19]
print('\n')
print(df8)
print('\n')
plt.figure(figsize=(14, 7))
plt.bar(df8['ESPECIE'],df8['Cuenta'],label="Avistamientos",color="blue")
plt.title('Avistamientos de especies', size=18)
plt.xlabel('Especie', size=14)
plt.ylabel('# de avistamientos', size=18)
plt.grid(True)
plt.savefig('Barras_especies.png')
plt.show()
ESPECIE Cuenta Clases
80 Columbina talpacoti 26 Aves
83 Coragyps atratus 23 Aves
85 Crotophaga ani 26 Aves
142 Iguana iguana 22 Reptilia
202 Pitangus sulphuratus 19 Aves
328 griseus 19 Aves
Observaciones casuales
Tablero de visualización con Naturalist
Aqui podrá visualizar las especies que son reportadas or investigadores y comunidad en general en su estado natural o capturados.
import plotly.express as px
import pandas as pd
import matplotlib.pyplot as plt
df_nat=pd.read_csv("Naturalist_obser.csv")
df_nat = df_nat.drop(columns=["geoprivacy", "taxon_geoprivacy","private_longitude","private_latitude","uuid"])
df_nat = df_nat.drop(columns=["image_url","private_place_guess","positioning_method","tag_list","description"])
df_nat['Observaciones'] = 1
df_nat = df_nat.dropna()
print(df_nat.info())
df_nat1 = df_nat.groupby(by="scientific_name")["Observaciones"].sum().reset_index()
df_aux = df_nat.groupby("scientific_name")["url"].max().reset_index()
df_nat1['Fotografia'] = df_aux['url']
Cuenta_max = np.max(df_nat1['Observaciones'])
print("Mayor abundancia: ", Cuenta_max, "individuos")
Ordenados= sorted(df_nat1['Observaciones'],reverse=True)
<class 'pandas.core.frame.DataFrame'> Index: 550 entries, 146 to 6578 Data columns (total 25 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 550 non-null int64 1 observed_on_string 550 non-null object 2 observed_on 550 non-null object 3 time_observed_at 550 non-null object 4 user_id 550 non-null int64 5 user_login 550 non-null object 6 updated_at 550 non-null object 7 url 550 non-null object 8 num_identification_agreements 550 non-null int64 9 num_identification_disagreements 550 non-null int64 10 captive_cultivated 550 non-null bool 11 oauth_application_id 550 non-null float64 12 place_guess 550 non-null object 13 latitude 550 non-null float64 14 longitude 550 non-null float64 15 positional_accuracy 550 non-null float64 16 public_positional_accuracy 550 non-null float64 17 coordinates_obscured 550 non-null bool 18 positioning_device 550 non-null object 19 species_guess 550 non-null object 20 scientific_name 550 non-null object 21 common_name 550 non-null object 22 iconic_taxon_name 550 non-null object 23 taxon_id 550 non-null int64 24 Observaciones 550 non-null int64 dtypes: bool(2), float64(5), int64(6), object(12) memory usage: 104.2+ KB None Mayor abundancia: 38 individuos
Click en el enlace del número de registro para conocer su imagen:
# seleccionamos las especies que queremos ver: las más registradas
Mostrar=int(input(" ingrese el Número de especies a verificar: "))
aux=[]
for x in range(Mostrar):
aux.append(Ordenados[x])
df_nat2=df_nat1[df_nat1["Observaciones"].isin(aux)]
print('\n')
print(df_nat2)
print('\n')
scientific_name Observaciones \
0 Abudefduf saxatilis 19
12 Actinopterygii 38
17 Andinoacara latifrons 8
28 Astyanax 10
60 Characiformes 11
76 Cyprinus carpio 11
116 Hoplias malabaricus 8
151 Oncorhynchus mykiss 8
155 Oreochromis niloticus 9
167 Poecilia reticulata 15
218 Synbranchus marmoratus 13
Fotografia
0
12
17
28
60
76
116
151
155
167
218