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


In [2]:
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


In [5]:
#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


In [8]:
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


In [10]:
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


In [13]:
# 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


In [16]:
# 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)
In [19]:
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


In [22]:
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


No description has been provided for this image

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.


In [25]:
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:


In [32]:
# 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    


In [ ]: