Número de especies clasificadas con categoría de conservación en el sistema nacional
Este indicador nacional cuantifica el número acumulado de taxa (especies, subespecies o variedades) de flora, fauna y funga nativa que han sido evaluados oficialmente y a los cuales se les ha asignado una categoría de riesgo bajo la normativa del Estado. Su objetivo es monitorear el progreso hacia la Meta Nacional I.4, la cual establece que para el año 2030 el país debe aumentar en al menos un 30% el número de especies clasificadas respecto a la línea base del año 2023. Incrementar este número es fundamental, ya que la clasificación oficial (Reglamento de Clasificación de Especies, RCE) es la herramienta jurídica habilitante para priorizar planes de recuperación, restringir la extracción y evaluar impactos ambientales.
El acceso a la planilla de datos del indicador se encuentra disponible aquí.
El cálculo corresponde a la sumatoria simple del número total histórico de taxa que han finalizado exitosamente los distintos Procesos de Clasificación de Especies Silvestres liderados por el Estado. Para evaluar el avance hacia la meta, se establece como línea base el universo total de especies clasificadas acumuladas hasta el año 2023. La meta a 2030 requiere sumar una cantidad equivalente al 30% de esa línea base. El progreso anual se calcula como la proporción de nuevas especies incorporadas frente a la brecha total requerida.
Los datos provienen directamente del Inventario Nacional de Especies y del registro oficial del Reglamento de Clasificación de Especies (RCE), administrado por el Ministerio del Medio Ambiente (MMA), cuyos resultados públicos y expedientes se encuentran disponibles en la plataforma institucional (https://clasificacionespecies.mma.gob.cl/).
import pandas as pd
# URL del archivo Excel en línea
url = (
"https://clasificacionespecies.mma.gob.cl/wp-content/uploads/2025/06/"
"NominaDeEspecies_SegunEstadoConservacion-Chile_actualizado_19noProcesoRCE_rev30junio2025.xlsx"
)
# Leer la hoja "Especies" directamente desde la URL
df = pd.read_excel(
url,
sheet_name="Especies"
)
# Verificación rápida
print(df.shape)
print(df.columns)
(1568, 43)
Index(['NOMBRE CIENTÍFICO', 'NOMBRE COMÚN', 'SINONIMIA incompleta',
'HÁBITO \n(sólo plantas y fungi)', 'REINO', 'PHYLLUM /\nDIVISIÓN',
'CLASE', 'ORDEN', 'FAMILIA',
'ENDÉMICA\nrespecto de Chile\n \n-- = No presente en Chile\n\n? = dudoso',
'DISTRIBUCIÓN REGIONES:\nANT= ANTARTICA\nDV= DESVENTURADAS\nIP= ISLA DE PASCUA\nJF= Arch. JUAN FERNÁNDEZ\nSG= SALAS Y GOMEZ\n? = Sin datos o de presencia dudosa o requiere confirmación',
'Arica y Parinacota', 'Tarapacá', 'Antofagasta', 'Atacama', 'Coquimbo',
'Valparaíso continental', 'Metropolitana', 'O'higgins', 'Maule',
'Ñuble', 'Bío-Bío', 'Araucanía', 'De Los Ríos', 'De Los Lagos', 'Aysén',
'Magallanes continental e insular', 'Antártica', 'Isla Pascua',
'Salas y Gómez', 'Juan Fernandez', 'Desventuradas',
'CATEGORÍA VIGENTE:\nCR = En peligro crítico\nDD = Datos insuficientes\nEN = En Peligro\nEW= Extinta en estado silvestre\nEX = Extinta\nLC = Preocupación menor\nNT = Casi amenazada\nR = Rara\nVU = Vulnerable',
'FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.',
'Criterio clasificación para especies RCE Vigentes',
'NÚMERO PROCESO RCE \nse clasificó categoría Vigente',
'REFERENCIA o DECRETO\nCategoría Vigente',
'Categoría ANTERIOR a RCE actual\n(NO VIGENTE)\nBol_47 = Boletín 47 MNHN\nCAZA = Reglamento Ley de CAZA\nL_Rojo_Flora = Libro Rojo de flora\nL_Rojo_Vert = Libro Rojo de vertebrados\nNúñez et al. 1997 = Reunión de herpetólogos\nYáñez et al. 1997 = Reunión especialistas mamíferos acuáticos\nRCE = Reglamento de Clasificación Especies.',
'Fuente Categoría ANTERIOR a RCE actual \n(NO VIGENTE)\n(Ver valores en columna adyacente)',
'Categoría ANTE ANTERIOR a RCE actual \n(NO VIGENTE)\nBol_47 = Boletín 47 MNHN\nCAZA = Reglamento Ley de CAZA\nL_Rojo_Flora = Libro Rojo de flora\nL_Rojo_Vert = Libro Rojo de vertebrados\nNúñez et al. 1997 = Reunión de herpetólogos\nYáñez et al. 1997 = Reunión especialistas mamíferos acuáticos\nRCE = Reglamento de Clasificación Especies.',
'Fuente Categoría ANTE ANTERIOR a RCE actual \n(NO VIGENTE)\n(Ver valores en columna adyacente)',
'Es vertebrado, INvertebrado, Planta u Hongo ',
'ID\nInven\ntario\nNa\ncio\nnal'],
dtype='object')
# ver valores de 'FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.'
print(df['FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.'].value_counts())
FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.
RCE 1542
Name: count, dtype: int64
#filtrar df por 'FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.' == 'RCE'
df = df[df['FUENTE DE CATEGORÍA VIGENTE:\nCAZA = Reglamento Ley de CAZA\nRCE = Reglamento de Clasificación Especies.'] == 'RCE']
#imprimir dimensiones del df
print(df.shape)
(1542, 43)
# Crear columna de año de resolución desde la referencia/decreto vigente
df["anio_resolucion"] = (
df["REFERENCIA o DECRETO\nCategoría Vigente"]
.astype(str)
.str.extract(r"(\d{4})", expand=False)
.astype("Int64") # permite NA
)
# Verificación rápida
df[[
"REFERENCIA o DECRETO\nCategoría Vigente",
"anio_resolucion"
]].head(10)
Loading...
import re
import numpy as np
col_fuente_anteprev = "Fuente Categoría ANTE ANTERIOR a RCE actual \n(NO VIGENTE)\n(Ver valores en columna adyacente)"
def extraer_anio_previo(texto):
if pd.isna(texto):
return np.nan
t = str(texto)
# 1️⃣ Buscar patrón RCE con decreto (ej: DS 51/2008)
match = re.search(r"DS\s*\d+\/(\d{4})", t)
if match:
return int(match.group(1))
# 2️⃣ Asignar año según fuente histórica
t_upper = t.upper()
if "BOL_47" in t_upper:
return 1998
if "CAZA" in t_upper:
return 1998
if "L_ROJO_FLORA" in t_upper:
return 1989
if "L_ROJO_VERT" in t_upper:
return 1988
if "NÚÑEZ ET AL. 1997" in t_upper or "NUNEZ ET AL. 1997" in t_upper:
return 1997
if "YÁÑEZ ET AL. 1997" in t_upper or "YANEZ ET AL. 1997" in t_upper:
return 1997
return np.nan
df["anio_clasificacion_previa"] = df[col_fuente_anteprev].apply(extraer_anio_previo)
# Verificación rápida
df[[
col_fuente_anteprev,
"anio_clasificacion_previa"
]].head(20)
# Conteo de número de especies por año de resolución
conteo_por_anio = (
df
.dropna(subset=["anio_resolucion", "NOMBRE CIENTÍFICO"])
.groupby("anio_resolucion")["NOMBRE CIENTÍFICO"]
.nunique()
.reset_index(name="n_especies")
.sort_values("anio_resolucion")
)
# Ver resultado
print(conteo_por_anio)
# Columnas relevantes
col_prev = "Categoría ANTERIOR a RCE actual\n(NO VIGENTE)\nBol_47 = Boletín 47 MNHN\nCAZA = Reglamento Ley de CAZA\nL_Rojo_Flora = Libro Rojo de flora\nL_Rojo_Vert = Libro Rojo de vertebrados\nNúñez et al. 1997 = Reunión de herpetólogos\nYáñez et al. 1997 = Reunión especialistas mamíferos acuáticos\nRCE = Reglamento de Clasificación Especies."
col_anteprev = "Categoría ANTE ANTERIOR a RCE actual \n(NO VIGENTE)\nBol_47 = Boletín 47 MNHN\nCAZA = Reglamento Ley de CAZA\nL_Rojo_Flora = Libro Rojo de flora\nL_Rojo_Vert = Libro Rojo de vertebrados\nNúñez et al. 1997 = Reunión de herpetólogos\nYáñez et al. 1997 = Reunión especialistas mamíferos acuáticos\nRCE = Reglamento de Clasificación Especies."
def vacio(x):
if pd.isna(x):
return True
s = str(x).strip().upper()
return s in ["", "NAN", "NA", "N/A", "--"]
# Es nueva si NO tiene clasificación previa
df["es_nueva"] = (
df[col_prev].apply(vacio) &
df[col_anteprev].apply(vacio)
)
def tiene_clasificacion_previa(x):
if pd.isna(x):
return False
s = str(x).strip().upper()
return s not in ["", "NAN", "NA", "N/A", "--"]
df["tiene_previa"] = (
df[col_prev].apply(tiene_clasificacion_previa) |
df[col_anteprev].apply(tiene_clasificacion_previa)
)
De acuerdo con el instrumento oficial, la evaluación del progreso arroja los siguientes resultados concretos:
Línea Base (2023): El país registró un total acumulado de 1.504 especies con clasificación de categoría de conservación.
Meta (2030): Para lograr el incremento del 30% exigido por la Meta Nacional I.4, Chile requiere incorporar aproximadamente 451 especies adicionales al sistema antes de que finalice la década.
Avance Actual (2024): Como resultado del 19° Proceso de Clasificación de Especies Silvestres, se logró un incremento de 38 taxa, alcanzando un total de 1.542 especies clasificadas.
Nivel de Cumplimiento: La incorporación de estas 38 especies equivale a un aumento aproximado del 2,5% respecto a la línea base, lo que se traduce en el cumplimiento de un 8% del objetivo propuesto (38 de las 451 especies requeridas).
import numpy as np
import pandas as pd
# ---------
# 1) Flag: tiene clasificación previa (reclasificación)
# ---------
def tiene_valor_real(x) -> bool:
if pd.isna(x):
return False
s = str(x).strip().upper()
return s not in ["", "NAN", "NA", "N/A", "--"]
df["tiene_previa"] = (
df[col_prev].apply(tiene_valor_real) |
df[col_anteprev].apply(tiene_valor_real)
)
# ---------
# 2) Construir acumulado de especies (universo histórico) año a año
# Universo_año = especies con (anio_resolucion <= año) OR (anio_resolucion > año AND tiene_previa)
# Interpretación: si tiene_previa, ya existía antes (aunque hoy el decreto vigente sea posterior).
# ---------
# Años presentes en la tabla ancha
tabla_ancha = tabla_ancha.sort_values("anio_resolucion").reset_index(drop=True)
anios = tabla_ancha["anio_resolucion"].astype(int).tolist()
# Universo total (todas las especies únicas)
universo_total = set(df["NOMBRE CIENTÍFICO"].dropna())
acum_especies = []
for y in anios:
especies_hasta_y = set(
df.loc[
(df["anio_resolucion"].notna()) &
(
(df["anio_resolucion"] <= y) |
((df["anio_resolucion"] > y) & (df["tiene_previa"]))
),
"NOMBRE CIENTÍFICO"
].dropna()
)
acum_especies.append(len(especies_hasta_y))
tabla_ancha["especies_acum"] = acum_especies
# ---------
# 3) (Opcional) Delta real anual de especies (solo nuevas reales)
# delta = cambio año a año del acumulado
# ---------
tabla_ancha["nuevas_reales"] = tabla_ancha["especies_acum"].diff().fillna(tabla_ancha["especies_acum"]).astype(int)
# ---------
# 4) Chequeos rápidos (opcionales pero recomendables)
# ---------
print("Total especies únicas (df nunique):", df["NOMBRE CIENTÍFICO"].nunique())
print("Último acumulado (tabla_ancha):", tabla_ancha["especies_acum"].iloc[-1])
# Ver tabla final
print(tabla_ancha[[
"anio_resolucion",
"nueva_clasificacion",
"reclasificacion",
"total",
"nuevas_reales",
"especies_acum"
]])
---------------------------------------------------------------------------NameError Traceback (most recent call last)
CellIn[12], line 24 13 df["tiene_previa"] = (
14 df[col_prev].apply(tiene_valor_real) |
15 df[col_anteprev].apply(tiene_valor_real)
16 )
18# --------- 19# 2) Construir acumulado de especies (universo histórico) año a año 20# Universo_año = especies con (anio_resolucion <= año) OR (anio_resolucion > año AND tiene_previa) 21# Interpretación: si tiene_previa, ya existía antes (aunque hoy el decreto vigente sea posterior). 22# --------- 23# Años presentes en la tabla ancha---> 24 tabla_ancha = tabla_ancha.sort_values("anio_resolucion").reset_index(drop=True)
25 anios = tabla_ancha["anio_resolucion"].astype(int).tolist()
27# Universo total (todas las especies únicas)NameError: name 'tabla_ancha' is not defined
# Definir nombre de archivo
output_path = "especies_clasificadas_por_anio_RCE_2.csv"
# Exportar
tabla_ancha[[
"anio_resolucion",
"nueva_clasificacion",
"reclasificacion",
"total",
"nuevas_reales",
"especies_acum"
]].to_csv(
output_path,
index=False,
encoding="utf-8",
sep=";" # usa "," si lo prefieres estilo internacional
)
print(f"Archivo exportado en: {output_path}")
---------------------------------------------------------------------------NameError Traceback (most recent call last)CellIn[13], line 5 2 output_path = "especies_clasificadas_por_anio_RCE_2.csv" 4# Exportar----> 5tabla_ancha[[
6"anio_resolucion",
7"nueva_clasificacion",
8"reclasificacion",
9"total",
10"nuevas_reales",
11"especies_acum" 12 ]].to_csv(
13 output_path,
14 index=False,
15 encoding="utf-8",
16 sep=";"# usa "," si lo prefieres estilo internacional 17 )
19print(f"Archivo exportado en: {output_path}")
NameError: name 'tabla_ancha' is not defined
import pandas as pd
import matplotlib.pyplot as plt
# Conteo anual por año y reino
anio_reino = (
df
.dropna(subset=["anio_resolucion", "NOMBRE CIENTÍFICO", "REINO"])
.groupby(["anio_resolucion", "REINO"])["NOMBRE CIENTÍFICO"]
.nunique()
.reset_index(name="n_especies")
.sort_values("anio_resolucion")
)
# Acumulado por reino
anio_reino["n_especies_acumuladas"] = (
anio_reino
.groupby("REINO")["n_especies"]
.cumsum()
)
#vamos a crear una tabla del acumulado por año y reino
tabla_acumulado_reino = (
anio_reino
.pivot(index="anio_resolucion", columns="REINO", values="n_especies_acumuladas")
.fillna(0)
.astype(int)
)
print(tabla_acumulado_reino)
plt.figure(figsize=(8, 5))
for reino, df_reino in anio_reino.groupby("REINO"):
plt.plot(
df_reino["anio_resolucion"],
df_reino["n_especies_acumuladas"],
marker="o",
label=reino
)
plt.xlabel("Año de resolución")
plt.ylabel("Número acumulado de especies clasificadas")
plt.title("Evolución acumulada de especies clasificadas por reino en Chile")
plt.legend(title="Reino")
plt.grid(True)
plt.tight_layout()
plt.savefig("especies_clasificadas_por_reino.png", dpi=300, bbox_inches="tight")
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
# Filtrar solo Plantae y Animalia
df_pa = (
df
.query("REINO in ['Plantae', 'Animalia']")
.dropna(subset=["anio_resolucion", "NOMBRE CIENTÍFICO", "REINO", "CLASE"])
)
# Conteo anual por reino y clase
anio_reino_clase = (
df_pa
.groupby(["anio_resolucion", "REINO", "CLASE"])["NOMBRE CIENTÍFICO"]
.nunique()
.reset_index(name="n_especies")
.sort_values("anio_resolucion")
)
# Acumulado por reino y clase
anio_reino_clase["n_especies_acumuladas"] = (
anio_reino_clase
.groupby(["REINO", "CLASE"])["n_especies"]
.cumsum()
)
for reino in ["Plantae", "Animalia"]:
plt.figure(figsize=(8, 5))
df_reino = anio_reino_clase[anio_reino_clase["REINO"] == reino]
for clase, df_clase in df_reino.groupby("CLASE"):
plt.plot(
df_clase["anio_resolucion"],
df_clase["n_especies_acumuladas"],
marker="o",
label=clase
)
plt.xlabel("Año de resolución")
plt.ylabel("Número acumulado de especies clasificadas")
plt.title(f"Evolución acumulada de especies clasificadas por clase – {reino}")
plt.legend(title="Clase", fontsize=8)
plt.grid(True)
plt.tight_layout()
plt.savefig(f"especies_clasificadas_por_clase_{reino}.png", dpi=300, bbox_inches="tight")
plt.show()
El seguimiento de este indicador demuestra contar con una línea base robusta y un mecanismo de actualización formal y continuo (los procesos anuales del RCE). La métrica refleja el resultado administrativo del esfuerzo estatal, cumpliendo su función de medir el progreso cuantitativo de ingresos al sistema. Sin embargo, como se detalla a continuación, el valor numérico global por sí solo no permite visibilizar la representatividad ecológica de lo que se está midiendo.
El análisis técnico de este indicador y sus fuentes de información revela importantes desafíos estructurales que deben subsanarse para agilizar el cumplimiento de la meta:
El análisis técnico de este indicador y de la base de datos que lo sustenta revela limitaciones metodológicas que condicionan la interpretación de la cifra final:
Sesgo de representatividad en el valor numérico: El indicador contabiliza el total de “taxa”, sin embargo, al analizar la evolución de la métrica por reinos, se evidencia que grupos como los invertebrados y el reino Fungi están subrepresentados. En consecuencia, el aumento numérico del indicador refleja en gran medida la disponibilidad histórica de datos sesgada hacia vertebrados y plantas.
Limitaciones de trazabilidad en la base de datos: La herramienta subyacente a este indicador (la planilla de registro del MMA) presenta una arquitectura de datos plana. Esto dificulta realizar un seguimiento relacional a los cambios de estado de una misma especie a lo largo de los años (p. ej., cuando una especie es reevaluada y cambia de categoría). Por lo tanto, el indicador es útil para arrojar un “conteo total acumulado”, pero pierde eficacia técnica cuando se intenta extraer de él tendencias de mejora o deterioro temporal de las especies.
Incertidumbre por falta de estandarización taxonómica: La taxonomía es una disciplina dinámica donde las especies pueden cambiar de nomenclatura o se agrupan según nuevos estudios filogenéticos. Actualmente, el registro del RCE carece de un mecanismo automatizado de sincronización con las actualizaciones del Catálogo Nacional de Especies.