Los movimientos de ladera constituyen uno de los procesos geomorfológicos más diversos y heterogéneos del planeta. El objetivo de esta actividad consiste en evaluar algunas de las características de este tipo de procesos. Esto se abordará desde un análisis exploratorio de datos sobre una base de datos que incluye cierto número de variables, que informan sobre:
o Dónde ocurrieron (país, región) esos movimientos de ladera.
o Cuándo ocurrieron (años y meses).
o Cuál ha sido su magnitud y los daños causados.
o Qué tipo de movimientos son los más frecuentes.
o Cuál es su causa habitual.
Mas información sobre esta base de datos se puede encontrar en el siguiente sitio web. Un ejemplo de este geovisor aparece en la siguiente imagen.
La actividad se divide en dos partes:
En la primera, de la mano del profesor, se utilizará la base de datos completa para conocer los fenómenos citados a escala global.
En la segunda cada alumno realizará un análisis similar al realizado a escala global, pero seleccionando un país o región concreta, incorporando además información de naturaleza geográfica obtenida de un MDT.
En primer lugar, se inactiva la notación científica.
options(scipen = 999)
El fichero con los datos es el siguiente.
df_original <- read.csv2("https://personales.unican.es/rasillad/docencia/g171/Laderas/procesos_ladera.csv")
Su estructura interna es la siguiente:
str(df_original)
## 'data.frame': 6701 obs. of 15 variables:
## $ objectid : int 1 2 3 4 5 6 7 8 9 10 ...
## $ id_otro : int 3177 490 6760 2494 6415 2493 5194 4066 2505 945 ...
## $ lon : num -73.4 113.9 -127.7 -127.5 -132.4 ...
## $ lat : num 41.559 0.112 52.355 50.705 53.332 ...
## $ yy : int 2011 2008 2015 2010 2014 2010 2013 2011 2010 2008 ...
## $ mm : int 3 4 1 9 8 9 7 11 9 12 ...
## $ dd : int 7 1 30 24 31 24 25 25 26 22 ...
## $ pais : chr "United States" "Indonesia" "Canada" "Canada" ...
## $ region : chr "Connecticut" "North Kalimantan" "British Columbia" "British Columbia" ...
## $ magnitud : chr "Mediano" "Mediano" "Mediano" "Mediano" ...
## $ tipo : chr "Colada de barro" "Deslizamiento" "Colada de barro" "Complejo" ...
## $ causa : chr "Aguacero" "Lluvia" "Lluvia" "Aguacero" ...
## $ proceso : chr "Atmosferico" "Atmosferico" "Atmosferico" "Atmosferico" ...
## $ victimas : int 0 0 0 0 0 0 0 0 0 0 ...
## $ categoria: chr "Sin victimas" "Sin victimas" "Sin victimas" "Sin victimas" ...
o objectid: número entero. El ID de cada caso.
o id_otro: número entero.
o lon: longitud en grados centesimales. Variable continua.
o lat: latitud en grados centesimales. Variable continua.
o yy: año del evento. Variable discreta.
o mm: mes del evento. Variable discreta.
o dd: día del evento. Variable discreta.
o pais: país en el que ocurrió el evento. Variable alfanumérica.
o region: región en la que ocurrió el evento. Variable alfanumérica.
o magnitud: magnitud (importancia del evento). Variable alfanumérica.
o tipo: tipo de evento. Variable alfanumérica.
o causa: mecanismo concreto desencadenante. Variable alfanumérica.
o proceso: mecanismo concreto desencadenante. Variable alfanumérica.
o victimas: número de fallecidos a causa del evento. Variable discreta.
o categoría: categoría en función del número de fallecidos. Variable alfanumérica.
Comprobación de las etiquetas de las variables
names(df_original)
## [1] "objectid" "id_otro" "lon" "lat" "yy" "mm"
## [7] "dd" "pais" "region" "magnitud" "tipo" "causa"
## [13] "proceso" "victimas" "categoria"
Todas las variables importadas como alfanuméricas
(character
) deben ser convertidas en factores, por ejemplo
el país y la región en la que ocurrió el movimiento de ladera
df_original$pais <- as.factor(df_original$pais)
df_original$region <- as.factor(df_original$region)
En caso de querer conocer las etiquetas correspondientes a una
variable concreta, se aplicará la función unique()
para
conocerlas.
unique(df_original$causa)
## [1] "Aguacero" "Lluvia" "Fusion nieve"
## [4] "Desconocida" "Terremoto" "Sin mecanismo aparente"
## [7] "Fusion hielo-deshielo" "Lluvia persistente" "Construccion"
## [10] "Monzon" "Ciclon tropical" "Explotacion minera"
## [13] "Rotura de una presa" "Otros" "Inundacion"
df_original$causa <- as.factor(df_original$causa)
La variable causa
ha sido agrupada en un menor número de
categorías para facilitar su análisis
unique(df_original$proceso)
## [1] "Atmosferico" "Fusion" "Desconocido" "Geologico" "Humano"
## [6] "Otros" "Hidrologico"
df_original$proceso <- as.factor(df_original$proceso)
Otras dos variables deben convertirse en factores ordenados,
utilizando también la función unique()
.
magnitud
.unique(df_original$magnitud)
## [1] "Mediano" "Pequeno" "Grande" "Muy grande" "Desconocido"
df_original$magnitud <- ordered(df_original$magnitud,
levels=c("Desconocido","Pequeño", "Mediano", "Grande", "Muy grande"))
categoría
unique(df_original$categoria)
## [1] "Sin victimas" "Serio" "Grave" "Catastrofico" "Muy grave"
df_original$categoria <- ordered(df_original$categoria,
levels=c("Sin victimas","Serio","Grave","Muy grave", "Catastrofico"))
Este análisis consistirá fundamentalmente en la creación de tablas de frecuencia y algunos gráficos explicativos.
En este apartado se analizará la distribución espacial de movimientos de ladera en todo el planeta. Para ello, inicialmente, se cartografiarán todos los movimientos incluidos en la base de datos. La comunicación gráfica de los resultados es un elemento imprescindible en cualquier análisis exploratorio, ya que sus conclusiones pueden carecer de valor si no se muestran ni presentan en un formato adecuado.
Se utilizarán las funciones del paquete ggplot.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(RColorBrewer)
A continuación se crea un mapa del planeta con todos los movimientos de ladera clasificados según su mangitud.
ggplot() + borders("world", fill = "white") + theme_bw() +
geom_point(data = df_original,
aes(x = lon, y = lat, color = magnitud)) +
scale_color_brewer(palette="YlOrRd")
## Warning: Removed 1275 rows containing missing values or values outside the scale range
## (`geom_point()`).
Este gráfico irá acompañado de una tabla en la que aparecerán los países más afectados por este tipo de proceso.
La tabla con las frecuencias absolutas se obtiene con la función
table()
.
pais_ni <- table(df_original$pais)
La tabla de frecuencias relativas se calcula anidando la función
prop.table()
a la tabla calculada previamente.
pais_fi <- prop.table(table(df_original$pais))
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_pais <- cbind(pais_ni,pais_fi)
colnames(tabla_pais) <- c("ni","fi")
tabla_pais <- as.data.frame(tabla_pais)
tabla_pais <- tabla_pais[with(tabla_pais, order(-tabla_pais$ni)), ] # Orden decreciente
Creamos a continuación los valores acumulados, pero ya ordenados
tabla_pais$Ni <- cumsum(tabla_pais$ni)
tabla_pais$Fi <- cumsum(tabla_pais$fi)
Comprobamos todos los datos
View(tabla_pais)
Eliminación de objetos no necesarios
rm(pais_fi, pais_ni)
Por último, el resultado puede grabarse como un fichero excel
library(xlsx)
write.xlsx(tabla_pais, # Data frame a ser exportado
"D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/resultados.xlsx", # Ruta completa
sheetName = "paises", # Nombre de la hoja de Excel
col.names = TRUE, # Incluir los nombres de las columnas (TRUE) o no (FALSE)
row.names = TRUE, # Incluir los nombres de las filas (TRUE) o no (FALSE)
append = TRUE, # En este caso, sí agregar al archivo existente "resultados.xlsx"
showNA = TRUE) # Si TRUE, los NA serán celdas vacías
La tabla con las frecuencias absolutas se obtiene con la función
table()
.
ano_ni <- table(df_original$yy)
La tabla de frecuencias relativas se calcula anidando la función
prop.table()
a la tabla calculada previamente.
ano_fi <- prop.table(table(df_original$yy))*100
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_ano <- cbind(ano_ni,ano_fi)
colnames(tabla_ano) <- c("ni","fi")
Representamos gráficamente la frecuencia de eventos según años
barplot(table(df_original$yy),
main="Frecuencia de movimientos de ladera según años",
ylim=c(0,2000),
xlab="Años",
ylab="Número de eventos")
Para exportar a excel y formatear posteriormente las tablas de datos para su incorporación a un documento de texto, se utilizará el paquete xlsx (requiere instalar previamente JAVA).
# install.packages("xlsx")
library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
La sintaxis para grabar la tabla en un fichero excel es la siguiente:
Eliminamos los componentes y la tabla.
rm(ano_ni,ano_fi, tabla_ano)
La tabla con las frecuencias absolutas se obtiene con la función
table()
.
mes_ni <- table(df_original$mm)
La tabla de frecuencias relativas se calcula anidando la función
prop.table()
a la tabla calculada previamente.
mes_fi <- prop.table(table(df_original$mm))*100
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_mes <- cbind(mes_ni,mes_fi)
colnames(tabla_mes) <- c("ni","fi")
Representamos gráficamente la frecuencia de eventos según meses
barplot(table(df_original$mm),
main="Frecuencia de movimientos de ladera según meses",
ylim=c(0,1000),
xlab="Meses",
ylab="Número de eventos")
La sintaxis para añadir la tabla tabla_mes
al fichero
excel resultados.xlsx
(que debe estar cerrado, no abierto)
como nueva hoja de cálculo, es la siguiente:
Eliminamos los componentes y la tabla.
rm(mes_ni,mes_fi, tabla_mes)
La tabla con las frecuencias absolutas se obtiene con la función
table()
.
magnitud_ni <- table(df_original$magnitud)
La tabla de frecuencias relativas se calcula anidando la función
prop.table()
a la tabla calculada previamente.
magnitud_fi <- prop.table(table(df_original$magnitud))*100
Las frecuencias acumuladas informan de cuántas veces hemos observado un dato menor o igual que el valor en cuestión.
magnitud_Ni <- cumsum(table(df_original$magnitud))
La tabla con las frecuencias relativas acumuladas se calcula anidando
diferentes funciones (cumsum
, prop.table
,
table
).
magnitud_Fi <- cumsum(prop.table(table(df_original$magnitud)))
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_magnitud <- cbind(magnitud_ni,magnitud_fi, magnitud_Ni, magnitud_Fi)
colnames(tabla_magnitud) <- c("ni","fi", "Ni", "Fi")
A continuación, crearemos un gráfico de barras
barplot(table(df_original$magnitud),
main="Frecuencia de movimientos de ladera según magnitud",
ylim=c(0,5000),
xlab="Categorías",
ylab="Número de eventos")
Eliminamos los componentes de la tabla que ya no sirven
rm(magnitud_ni,magnitud_fi, magnitud_Ni, magnitud_Fi)
La sintaxis para añadir la tabla tabla_magnitud
al
fichero excel resultados.xlsx
(que debe estar cerrado, no
abierto) como nueva hoja de cálculo, es la siguiente:
Tabla con las frecuencias absolutas.
categoria_ni <- table(df_original$categoria)
Tabla con las frecuencias relativas.
categoria_fi <- prop.table(table(df_original$categoria))
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_categoria <- cbind(categoria_ni,categoria_fi)
colnames(tabla_categoria) <- c("ni","fi")
tabla_categoria <- as.data.frame(tabla_categoria)
tabla_categoria <- tabla_categoria[with(tabla_categoria, order(-tabla_categoria$ni)), ] # Orden decreciente
Creamos a continuación los valores acumulados, pero ya ordenados
tabla_categoria$Ni <- cumsum(tabla_categoria$ni)
tabla_categoria$Fi <- cumsum(tabla_categoria$fi)
Comprobamos todos los datos
View(tabla_categoria)
A continuación, crearemos un gráfico de barras
barplot(table(df_original$categoria),
main="Frecuencia de movimientos de ladera según categoría",
las = 1,
ylim=c(0,5000),
xlab="Número de eventos",
ylab="Tipología")
rm(categoria_ni,categoria_fi)
La sintaxis para añadir la tabla tabla_tipo
al fichero
excel resultados.xlsx
(que debe estar cerrado, no abierto)
como nueva hoja de cálculo, es la siguiente:
Tabla con las frecuencias absolutas.
proceso_ni <- table(df_original$proceso)
Tabla con las frecuencias relativas.
proceso_fi <- prop.table(table(df_original$proceso))
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_proceso <- cbind(proceso_ni,proceso_fi)
colnames(tabla_proceso) <- c("ni","fi")
tabla_proceso <- as.data.frame(tabla_proceso)
tabla_proceso <- tabla_proceso[with(tabla_proceso, order(-tabla_proceso$ni)), ] # Orden decreciente
Creamos a continuación los valores acumulados, pero ya ordenados
tabla_proceso$Ni <- cumsum(tabla_proceso$ni)
tabla_proceso$Fi <- cumsum(tabla_proceso$fi)
Comprobamos todos los datos
View(tabla_proceso)
rm(proceso_ni, proceso_fi)
La sintaxis para añadir la tabla tabla_tipo
al fichero
excel resultados.xlsx
(que debe estar cerrado, no abierto)
como nueva hoja de cálculo, es la siguiente:
Tabla con las frecuencias absolutas.
tipo_ni <- table(df_original$tipo)
Tabla con las frecuencias relativas.
tipo_fi <- prop.table(table(df_original$tipo))
Debemos crear una única tabla juntando todos los vectores anteriores. Para mejorar la presentación de la tabla, conviene también cambiar los nombres de las variables a otros más legibles, convertirla en un dataframe y ordenar los valores de más a menos.
tabla_tipo <- cbind(tipo_ni,tipo_fi)
colnames(tabla_tipo) <- c("ni","fi")
tabla_tipo <- as.data.frame(tabla_tipo)
tabla_tipo <- tabla_tipo[with(tabla_tipo, order(-tabla_tipo$ni)), ] # Orden decreciente
Creamos a continuación los valores acumulados, pero ya ordenados
tabla_tipo$Ni <- cumsum(tabla_tipo$ni)
tabla_tipo$Fi <- cumsum(tabla_tipo$fi)
Comprobamos todos los datos
View(tabla_tipo)
La sintaxis para añadir la tabla tabla_tipo
al fichero
excel resultados.xlsx
(que debe estar cerrado, no abierto)
como nueva hoja de cálculo, es la siguiente:
rm(tipo_ni, tipo_fi)
ACTIVIDAD INDIVIDUAL
Una vez concluida esta fase, los alumnos deberán realizar una
actividad individual que consistirá en el análisis y comentario de las
características de aquellos movimientos más dañinos en términos de
pérdida de vidas humanas (> 100 muertos, categorías
Muy grave
y Catastrófico
). Los elementos a
analizar será los siguientes:
Los países afectados (incluir cartografía correspondiente).
La magnitud.
Las causas.
La tipología.
El tipo de proceso.
La selección se puede realizar de la misma manera. En primer lugar, seleccionado los movimientos de ladera más dañinos.
movimientos_mas_victimas <- subset(df_original,
victimas > 100)
A continuación, se crean las tablas correspondientes los paises, la magnitud etc…
Como en el resto de las actividades anteriores, los objetivos de esta actividad es estudiar:
Las causas más frecuentes de movimientos de ladera en ese país.
La magnitud de los movimientos de ladera.
La tipología más frecuente.
La estacionalidad (meses).
Dado que los factores atmosféricos explican en gran medida la dinámica de los movimientos de masa recogidos en esta base de datos, las características antes citadas deberán ser puestas en relación con las condiciones climáticas habituales de la región, para lo que aportará en su trabajo un climodiagrama correspondiente a alguna localidad del país o región.
Para llevar a cabo esta actividad, cada alumno seleccionará, o bien todo un país, o bien un estado/provincia de alguno de los países de mayor tamaño -China, USA, Canadá, India, Brasil-. La lista de países de tamaño medio que registraron más de 50 movimientos de ladera aparece a continuación.
Países con más de 50 movimientos de ladera |
---|
Pakistan |
Colombia |
Peru |
Vietnam |
Thailand |
Japan |
Mexico |
Costa Rica |
Italy |
Guatemala |
A continuación, se ofrece un listado de los estados, regiones o provincias de países con gran tamaño que pueden ser utilizadas para el análisis.
País | Estado o región |
---|---|
United States | California |
United States | Washington |
United States | Oregon |
Canada | British Columbia |
India | Uttarakhand |
India | Kashmir |
India | Himachal Pradesh |
Brazil | Rio de Janeiro |
China | Sichuan |
El primer paso consiste en seleccionar la región o país que será objeto de estudio, en este caso el estado de Columbia Británica, en Canadá:
df_region <- subset(df_original,
region == "British Columbia") # pais == Nepal
df_region$ID <- 1:nrow(df_region)
Para su posterior reutilización, este fichero debe grabarse:
write.csv2(df_region,
"D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/df_region.csv",
row.names = FALSE)
El primer paso para el estudio de los movimientos de ladera registrados en un país es ubicarlos geográficamente. Para representarlos gráficamente sobre un mapa, debe convertirse el dataframe en un objeto sf. Para ello, es necesario especificar:
Las columnas que contienen las coordenadas X (oeste-este) e Y (sur- norte).
El Sistema de Proyección de coordenadas, que en este caso estará basado en coordenadas geográficas.
Para realizar esa conversión, se usa la función
sf::st_as_sf()
.
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
sf_region <- st_as_sf(df_region,
coords = c("lon", "lat"),
crs = "+proj=longlat +datum=WGS84")
sf_region <- sf_region[ , 14] # Se deja sólo con el ID y las coordenadas
Conviene que la ventana espacial asociada a este subconjunto de datos sea un poco mayor que el propio ámbito administrativo (recuérdese que el recorte de un objeto ráster recortado por un objeto vectorial deja algunos píxeles fuera).
st_bbox(sf_region)
## xmin ymin xmax ymax
## -132.4149 48.4529 -116.7219 55.6976
bbox_new <- st_bbox(sf_region) # current bounding box
xrange <- bbox_new$xmax - bbox_new$xmin # range of x values
yrange <- bbox_new$ymax - bbox_new$ymin # range of y values
bbox_new[1] <- bbox_new[1] - (0.5 * xrange) # xmin - left
bbox_new[3] <- bbox_new[3] + (0.5 * xrange) # xmax - right
bbox_new[2] <- bbox_new[2] - (0.5 * yrange) # ymin - bottom
bbox_new[4] <- bbox_new[4] + (0.5 * yrange) # ymax - top
bbox_new <- bbox_new %>% # La ventana espacial
st_as_sfc() %>% # ... convertida en un polígono
st_as_sf # ... convertida en un objeto sf
Los siguientes objetos no se van a volver a utilizar, eliminándose
para no acumularse en la ventana del
Global Environment
.
rm(xrange, yrange)
Para proceder a la correcta extracción de los parámetros topográficos, es necesario que todos los objetos espaciales, tanto los raster como los vectoriales, estén proyectados bajo el mismo sistema de proyección, en este caso coordenadas proyectadas UTM. Para conocer a qué uso corresponde el país en cuestión, es conveniente consultar el siguiente sitio web, que muestra la correspondencia entre países/regiones y zona UTM. También se recomienda echar un vistazo a las siguientes páginas web:
Para reproyectar los objetos vectoriales, cuyo crs inicial consistía en coordenadas proyectadas, se debe proceder de la siguiente manera.
sf_region <- st_transform(sf_region,
crs = "EPSG:32610")
bbox_new <- st_transform(bbox_new,
crs = "EPSG:32610")
Finalmente, deberían grabarse los dos ficheros espaciales creados
anteriormente. Los ficheros geojson
st_write(sf_region, "D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/sf_region.geojson", delete_dsn = TRUE)
st_write(bbox_new, "D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/bbox_new.geojson", delete_dsn = TRUE)
A continuación, se eliminarán todos los objetos del Global Environment.
rm(list = ls())
Como se ha señalado en las clases teóricas, los movimientos de ladera son producto habitualmente de la combinación de una serie de procesos ligados al medio natural y de las actividades humanas. Por ello, a continuación se trabajará con una serie de bases de datos reproduciendo estos factores:
Más adelante se realizará un análisis estadístico que deberá estar acompañado de las oportunas reflexiones del alumno