library(readxl)
library(dplyr)
library(gt)
options(scipen = 999)
# 1. CARGA DE DATOS
datos <- read_excel(
"datos_nuevoartes_.xlsx"
)
if(!"event_date" %in% names(datos)){
stop(
"La columna event_date no existe en el dataset."
)
}
dim(datos)
## [1] 11033 35
El modelo de Poisson estudia la cantidad de eventos ocurridos en intervalos iguales de tiempo.
Por ello, no se modelan directamente los valores 1988, 1989 o 1990. Se cuenta cuántos deslizamientos ocurrieron durante cada año:
\[ X=\text{cantidad de deslizamientos registrados por año} \]
fecha <- as.Date(
datos$event_date
)
fechas_faltantes <- sum(
is.na(fecha)
)
fecha <- fecha[
!is.na(fecha)
]
anio_evento <- as.integer(
format(
fecha,
"%Y"
)
)
anios <- min(anio_evento):max(anio_evento)
conteos_anuales <- as.integer(
table(
factor(
anio_evento,
levels = anios
)
)
)
tabla_anual <- data.frame(
Anio = anios,
Cantidad = conteos_anuales
)
n_periodos <- length(
conteos_anuales
)
total_eventos <- sum(
conteos_anuales
)
if(n_periodos < 4){
stop(
"Se necesitan al menos cuatro periodos anuales."
)
}
if(total_eventos == 0){
stop(
"No existen eventos validos para ajustar el modelo."
)
}
resumen_datos <- data.frame(
Indicador = c(
"Registros del dataset",
"Fechas faltantes excluidas",
"Primer anio",
"Ultimo anio",
"Periodos analizados",
"Total de deslizamientos"
),
Resultado = c(
nrow(datos),
fechas_faltantes,
min(anios),
max(anios),
n_periodos,
total_eventos
)
)
resumen_datos %>%
gt() %>%
tab_header(
title = md("**Tabla N. 1**"),
subtitle = md(
"Preparacion del conteo anual de deslizamientos"
)
) %>%
fmt_number(
columns = Resultado,
decimals = 0,
use_seps = FALSE
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 1 | |
| Preparacion del conteo anual de deslizamientos | |
| Indicador | Resultado |
|---|---|
| Registros del dataset | 11033 |
| Fechas faltantes excluidas | 0 |
| Primer anio | 1988 |
| Ultimo anio | 2017 |
| Periodos analizados | 30 |
| Total de deslizamientos | 11033 |
| Elaborado por: Grupo 1 - Carrera de Geologia | |
La siguiente tabla presenta el número de deslizamientos registrado durante cada año. Los años sin eventos también se conservan con cantidad igual a cero.
tabla_anual %>%
gt() %>%
tab_header(
title = md("**Tabla N. 2**"),
subtitle = md(
"Cantidad anual de deslizamientos registrados a nivel mundial"
)
) %>%
cols_label(
Anio = "Anio",
Cantidad = "Cantidad absoluta"
) %>%
fmt_number(
columns = Anio,
decimals = 0,
use_seps = FALSE
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 2 | |
| Cantidad anual de deslizamientos registrados a nivel mundial | |
| Anio | Cantidad absoluta |
|---|---|
| 1988 | 1 |
| 1989 | 0 |
| 1990 | 0 |
| 1991 | 0 |
| 1992 | 0 |
| 1993 | 1 |
| 1994 | 0 |
| 1995 | 1 |
| 1996 | 2 |
| 1997 | 10 |
| 1998 | 12 |
| 1999 | 0 |
| 2000 | 0 |
| 2001 | 0 |
| 2002 | 0 |
| 2003 | 2 |
| 2004 | 1 |
| 2005 | 2 |
| 2006 | 13 |
| 2007 | 408 |
| 2008 | 699 |
| 2009 | 379 |
| 2010 | 1528 |
| 2011 | 1304 |
| 2012 | 782 |
| 2013 | 1117 |
| 2014 | 1034 |
| 2015 | 1339 |
| 2016 | 1171 |
| 2017 | 1227 |
| Elaborado por: Grupo 1 - Carrera de Geologia | |
distribucion_observada <- as.data.frame(
table(
conteos_anuales
)
)
names(distribucion_observada) <- c(
"X",
"Cantidad_anios"
)
distribucion_observada$X <- as.integer(
as.character(
distribucion_observada$X
)
)
distribucion_observada$Porcentaje <- (
distribucion_observada$Cantidad_anios /
n_periodos
) * 100
distribucion_observada %>%
gt() %>%
tab_header(
title = md("**Tabla N. 3**"),
subtitle = md(
"Distribucion observada del numero de deslizamientos por anio"
)
) %>%
cols_label(
X = "Deslizamientos por anio",
Cantidad_anios = "Cantidad de anios",
Porcentaje = "Porcentaje relativo (%)"
) %>%
fmt_number(
columns = Porcentaje,
decimals = 2
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 3 | ||
| Distribucion observada del numero de deslizamientos por anio | ||
| Deslizamientos por anio | Cantidad de anios | Porcentaje relativo (%) |
|---|---|---|
| 0 | 9 | 30.00 |
| 1 | 4 | 13.33 |
| 2 | 3 | 10.00 |
| 10 | 1 | 3.33 |
| 12 | 1 | 3.33 |
| 13 | 1 | 3.33 |
| 379 | 1 | 3.33 |
| 408 | 1 | 3.33 |
| 699 | 1 | 3.33 |
| 782 | 1 | 3.33 |
| 1034 | 1 | 3.33 |
| 1117 | 1 | 3.33 |
| 1171 | 1 | 3.33 |
| 1227 | 1 | 3.33 |
| 1304 | 1 | 3.33 |
| 1339 | 1 | 3.33 |
| 1528 | 1 | 3.33 |
| Elaborado por: Grupo 1 - Carrera de Geologia | ||
par(
mar = c(8,5,4,2)
)
posiciones <- barplot(
conteos_anuales,
names.arg = anios,
col = "#D8C3CA",
border = "#6D213C",
las = 2,
cex.names = 0.70,
ylim = c(
0,
max(conteos_anuales) * 1.15
),
main = paste0(
"Cantidad anual de deslizamientos\n",
"registrados a nivel mundial"
),
xlab = "",
ylab = "Cantidad absoluta"
)
text(
posiciones,
conteos_anuales,
labels = conteos_anuales,
pos = 3,
cex = 0.60,
font = 2
)
mtext(
"Anio de ocurrencia",
side = 1,
line = 6
)
La distribución de Poisson representa el número de eventos que ocurren durante un intervalo fijo de tiempo o espacio.
Su función de probabilidad es:
\[ P(X=x)= \frac{e^{-\lambda}\lambda^x}{x!} \]
donde:
Se plantea:
\[ X\sim Poisson(\lambda) \]
Las hipótesis son:
\[ H_0: \text{La cantidad anual de deslizamientos sigue una distribucion de Poisson} \]
\[ H_1: \text{La cantidad anual de deslizamientos no sigue una distribucion de Poisson} \]
El modelo supone intervalos de igual duración, independencia entre eventos y una tasa media aproximadamente constante.
Para una distribución de Poisson:
\[ E(X)=\lambda \]
\[ Var(X)=\lambda \]
El parámetro se estima mediante la media de los conteos:
\[ \hat{\lambda}=\bar{x} \]
lambda <- mean(
conteos_anuales
)
varianza_observada <- var(
conteos_anuales
)
desviacion_observada <- sd(
conteos_anuales
)
desviacion_teorica <- sqrt(
lambda
)
indice_dispersion <- (
varianza_observada /
lambda
)
parametros_poisson <- data.frame(
Parametro = c(
"Numero de periodos",
"Total de eventos",
"Lambda estimado",
"Media observada",
"Varianza observada",
"Desviacion observada",
"Varianza teorica",
"Desviacion teorica",
"Indice de dispersion"
),
Resultado = c(
n_periodos,
total_eventos,
lambda,
lambda,
varianza_observada,
desviacion_observada,
lambda,
desviacion_teorica,
indice_dispersion
)
)
parametros_poisson %>%
gt() %>%
tab_header(
title = md("**Tabla N. 4**"),
subtitle = md(
"Parametros estimados del modelo de Poisson"
)
) %>%
fmt_number(
columns = Resultado,
decimals = 4
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 4 | |
| Parametros estimados del modelo de Poisson | |
| Parametro | Resultado |
|---|---|
| Numero de periodos | 30.0000 |
| Total de eventos | 11,033.0000 |
| Lambda estimado | 367.7667 |
| Media observada | 367.7667 |
| Varianza observada | 288,787.0816 |
| Desviacion observada | 537.3891 |
| Varianza teorica | 367.7667 |
| Desviacion teorica | 19.1772 |
| Indice de dispersion | 785.2454 |
| Elaborado por: Grupo 1 - Carrera de Geologia | |
Para comparar la realidad con Poisson se forman cuatro grupos mediante los cuartiles teóricos del modelo. Esto permite obtener cantidades esperadas adecuadas para el contraste chi-cuadrado.
cortes <- as.integer(
qpois(
c(
0.25,
0.50,
0.75
),
lambda = lambda
)
)
if(length(unique(cortes)) < 3){
stop(
"No fue posible formar cuatro grupos diferentes."
)
}
etiquetas <- c(
paste0("0 - ",cortes[1]),
paste0(cortes[1]+1," - ",cortes[2]),
paste0(cortes[2]+1," - ",cortes[3]),
paste0(cortes[3]+1," o mas")
)
grupo_observado <- cut(
conteos_anuales,
breaks = c(
-Inf,
cortes,
Inf
),
labels = etiquetas,
right = TRUE
)
Fo <- as.numeric(
table(
factor(
grupo_observado,
levels = etiquetas
)
)
)
P_teorica <- c(
ppois(
cortes[1],
lambda
),
ppois(
cortes[2],
lambda
) -
ppois(
cortes[1],
lambda
),
ppois(
cortes[3],
lambda
) -
ppois(
cortes[2],
lambda
),
1 -
ppois(
cortes[3],
lambda
)
)
Fe <- n_periodos * P_teorica
porcentaje_observado <- (
Fo / n_periodos
) * 100
porcentaje_poisson <- (
Fe / n_periodos
) * 100
tabla_ajuste <- data.frame(
Intervalo = etiquetas,
Cantidad_observada = Fo,
Cantidad_esperada = Fe,
Porcentaje_observado = porcentaje_observado,
Porcentaje_Poisson = porcentaje_poisson
)
tabla_ajuste %>%
gt() %>%
tab_header(
title = md("**Tabla N. 5**"),
subtitle = md(
"Comparacion entre la realidad y el modelo de Poisson"
)
) %>%
cols_label(
Intervalo = "Deslizamientos por anio",
Cantidad_observada = "Cantidad observada",
Cantidad_esperada = "Cantidad esperada",
Porcentaje_observado = "Porcentaje observado (%)",
Porcentaje_Poisson = "Porcentaje del modelo (%)"
) %>%
fmt_number(
columns = c(
Cantidad_esperada,
Porcentaje_observado,
Porcentaje_Poisson
),
decimals = 4
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 5 | ||||
| Comparacion entre la realidad y el modelo de Poisson | ||||
| Deslizamientos por anio | Cantidad observada | Cantidad esperada | Porcentaje observado (%) | Porcentaje del modelo (%) |
|---|---|---|---|---|
| 0 - 355 | 19 | 7.8862 | 63.3333 | 26.2874 |
| 356 - 368 | 0 | 7.6751 | 0.0000 | 25.5837 |
| 369 - 381 | 1 | 7.3693 | 3.3333 | 24.5643 |
| 382 o mas | 10 | 7.0694 | 33.3333 | 23.5646 |
| Elaborado por: Grupo 1 - Carrera de Geologia | ||||
comparacion <- rbind(
Realidad = porcentaje_observado,
Poisson = porcentaje_poisson
)
par(
mar = c(7,5,4,2)
)
barplot(
comparacion,
beside = TRUE,
names.arg = etiquetas,
col = c(
"#D8C3CA",
"#6D213C"
),
border = "#4A1026",
las = 2,
ylim = c(
0,
max(comparacion) * 1.20
),
main = paste0(
"Distribucion observada y modelo de Poisson\n",
"del numero anual de deslizamientos"
),
xlab = "",
ylab = "Porcentaje relativo"
)
legend(
"topright",
legend = c(
"Realidad",
"Modelo de Poisson"
),
fill = c(
"#D8C3CA",
"#6D213C"
),
border = "#4A1026",
bty = "n"
)
mtext(
"Cantidad de deslizamientos por anio",
side = 1,
line = 5
)
El coeficiente de Pearson se presenta como medida complementaria de semejanza entre las cantidades observadas y esperadas.
if(
sd(Fo) > 0 &&
sd(Fe) > 0
){
correlacion_pearson <- cor(
Fo,
Fe
) * 100
}else{
correlacion_pearson <- NA_real_
}
conteos_ordenados <- sort(
conteos_anuales
)
probabilidades_qq <- (
seq_along(conteos_ordenados) -
0.5
) / n_periodos
cuantiles_poisson <- qpois(
probabilidades_qq,
lambda = lambda
)
plot(
cuantiles_poisson,
conteos_ordenados,
pch = 19,
col = "#6D213C",
main = "Grafico Q-Q del modelo de Poisson",
xlab = "Cuantiles teoricos de Poisson",
ylab = "Conteos anuales observados"
)
abline(
a = 0,
b = 1,
col = "#4A1026",
lwd = 2
)
grid()
Como se estima un parámetro, \(\lambda\), los grados de libertad son:
\[ gl=k-1-1 \]
chi_calculado <- sum(
(
Fo -
Fe
)^2 /
Fe
)
grados_libertad <- (
length(Fo) -
1 -
1
)
chi_critico <- qchisq(
0.95,
df = grados_libertad
)
p_valor_chi <- pchisq(
chi_calculado,
df = grados_libertad,
lower.tail = FALSE
)
decision_chi <- ifelse(
chi_calculado < chi_critico,
"No se rechaza H0: el modelo de Poisson es adecuado",
"Se rechaza H0: el modelo de Poisson no es adecuado"
)
Poisson requiere que la media y la varianza sean aproximadamente iguales.
\[ ID=\frac{s^2}{\bar{x}} \]
estadistico_dispersion <- (
(n_periodos - 1) *
indice_dispersion
)
gl_dispersion <- (
n_periodos -
1
)
p_inferior <- pchisq(
estadistico_dispersion,
df = gl_dispersion
)
p_superior <- pchisq(
estadistico_dispersion,
df = gl_dispersion,
lower.tail = FALSE
)
p_valor_dispersion <- min(
1,
2 * min(
p_inferior,
p_superior
)
)
decision_dispersion <- ifelse(
p_valor_dispersion >= 0.05,
"No se rechaza la equidispersion",
"Se rechaza la equidispersion"
)
resumen_bondad <- data.frame(
Indicador = c(
"Correlacion de Pearson (%)",
"Chi-cuadrado calculado",
"Grados de libertad",
"Chi-cuadrado critico",
"Valor p del chi-cuadrado",
"Decision del chi-cuadrado",
"Indice de dispersion",
"Valor p de dispersion",
"Decision de dispersion"
),
Resultado = c(
ifelse(
is.na(correlacion_pearson),
"No calculable",
round(correlacion_pearson,2)
),
round(chi_calculado,4),
grados_libertad,
round(chi_critico,4),
round(p_valor_chi,6),
decision_chi,
round(indice_dispersion,4),
round(p_valor_dispersion,6),
decision_dispersion
)
)
resumen_bondad %>%
gt() %>%
tab_header(
title = md("**Tabla N. 6**"),
subtitle = md(
"Resultados de la bondad de ajuste del modelo de Poisson"
)
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 6 | |
| Resultados de la bondad de ajuste del modelo de Poisson | |
| Indicador | Resultado |
|---|---|
| Correlacion de Pearson (%) | 30.48 |
| Chi-cuadrado calculado | 30.0573 |
| Grados de libertad | 2 |
| Chi-cuadrado critico | 5.9915 |
| Valor p del chi-cuadrado | 0 |
| Decision del chi-cuadrado | Se rechaza H0: el modelo de Poisson no es adecuado |
| Indice de dispersion | 785.2454 |
| Valor p de dispersion | 0 |
| Decision de dispersion | Se rechaza la equidispersion |
| Elaborado por: Grupo 1 - Carrera de Geologia | |
En Poisson, la desviación estándar teórica es:
\[ \sigma=\sqrt{\lambda} \]
Se calcula la probabilidad de obtener una cantidad anual dentro de una desviación estándar alrededor de la media:
\[ P\left( \lambda-\sqrt{\lambda} \leq X\leq \lambda+\sqrt{\lambda} \right) \]
limite_inferior_prob <- max(
0,
floor(
lambda -
sqrt(lambda)
)
)
limite_superior_prob <- ceiling(
lambda +
sqrt(lambda)
)
probabilidad_central <- ppois(
limite_superior_prob,
lambda
) -
ppois(
limite_inferior_prob - 1,
lambda
)
tabla_probabilidad <- data.frame(
Evento = paste0(
limite_inferior_prob,
" <= X <= ",
limite_superior_prob
),
Probabilidad = probabilidad_central,
Porcentaje = probabilidad_central * 100
)
tabla_probabilidad %>%
gt() %>%
tab_header(
title = md("**Tabla N. 7**"),
subtitle = md(
"Probabilidad calculada mediante el modelo de Poisson"
)
) %>%
fmt_number(
columns = Probabilidad,
decimals = 6
) %>%
fmt_number(
columns = Porcentaje,
decimals = 2
) %>%
cols_label(
Evento = "Cantidad anual",
Probabilidad = "Probabilidad",
Porcentaje = "Porcentaje (%)"
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 7 | ||
| Probabilidad calculada mediante el modelo de Poisson | ||
| Cantidad anual | Probabilidad | Porcentaje (%) |
|---|---|---|
| 348 <= X <= 387 | 0.703134 | 70.31 |
| Elaborado por: Grupo 1 - Carrera de Geologia | ||
x_poisson <- seq(
qpois(
0.001,
lambda
),
qpois(
0.999,
lambda
)
)
prob_poisson <- dpois(
x_poisson,
lambda
) * 100
colores <- ifelse(
x_poisson >= limite_inferior_prob &
x_poisson <= limite_superior_prob,
"#6D213C",
"#D8C3CA"
)
plot(
x_poisson,
prob_poisson,
type = "h",
lwd = 3,
col = colores,
main = paste0(
"Probabilidad central del modelo de Poisson\n",
"para el numero anual de deslizamientos"
),
xlab = "Cantidad de deslizamientos por anio",
ylab = "Porcentaje relativo"
)
abline(
v = lambda,
col = "#4A1026",
lwd = 2,
lty = 2
)
legend(
"topright",
legend = c(
"Rango seleccionado",
"Resto de valores",
"Lambda"
),
col = c(
"#6D213C",
"#D8C3CA",
"#4A1026"
),
lwd = c(
3,
3,
2
),
lty = c(
1,
1,
2
),
bty = "n"
)
grid()
Se construye un intervalo de confianza exacto del 95 % para la tasa media anual de deslizamientos.
prueba_poisson <- poisson.test(
x = total_eventos,
T = n_periodos,
conf.level = 0.95
)
ic_inferior <- unname(
prueba_poisson$conf.int[1]
)
ic_superior <- unname(
prueba_poisson$conf.int[2]
)
tabla_intervalo <- data.frame(
Indicador = c(
"Total de deslizamientos",
"Numero de anios",
"Tasa media anual",
"Limite inferior del 95 %",
"Limite superior del 95 %"
),
Resultado = c(
total_eventos,
n_periodos,
lambda,
ic_inferior,
ic_superior
)
)
tabla_intervalo %>%
gt() %>%
tab_header(
title = md("**Tabla N. 8**"),
subtitle = md(
"Intervalo de confianza para la tasa media anual"
)
) %>%
fmt_number(
columns = Resultado,
decimals = 4
) %>%
tab_options(
table.width = pct(100)
) %>%
tab_source_note(
source_note = md(
"Elaborado por: Grupo 1 - Carrera de Geologia"
)
)
| Tabla N. 8 | |
| Intervalo de confianza para la tasa media anual | |
| Indicador | Resultado |
|---|---|
| Total de deslizamientos | 11,033.0000 |
| Numero de anios | 30.0000 |
| Tasa media anual | 367.7667 |
| Limite inferior del 95 % | 360.9359 |
| Limite superior del 95 % | 374.6942 |
| Elaborado por: Grupo 1 - Carrera de Geologia | |
texto_chi <- ifelse(
chi_calculado < chi_critico,
paste0(
"Como el chi-cuadrado calculado es menor que el valor critico, ",
"**no se rechaza la hipotesis nula**."
),
paste0(
"Como el chi-cuadrado calculado es mayor o igual que el valor critico, ",
"**se rechaza la hipotesis nula**."
)
)
tipo_dispersion <- ifelse(
indice_dispersion > 1.20,
"sobredispersion",
ifelse(
indice_dispersion < 0.80,
"subdispersion",
"equidispersion aproximada"
)
)
cat(
paste0(
"Se analizaron **",
n_periodos,
" periodos anuales**, comprendidos entre **",
min(anios),
" y ",
max(anios),
"**. La tasa media estimada fue de **",
round(lambda,2),
" deslizamientos por anio**.\n\n",
"La varianza observada fue de **",
round(varianza_observada,2),
"** y el indice de dispersion fue de **",
round(indice_dispersion,2),
"**, lo que evidencia ",
tipo_dispersion,
". ",
decision_dispersion,
".\n\n",
texto_chi,
" Por tanto, ",
tolower(decision_chi),
".\n\n",
"La probabilidad teorica de registrar entre **",
limite_inferior_prob,
" y ",
limite_superior_prob,
" deslizamientos durante un anio** es de **",
round(probabilidad_central * 100,2),
" %**.\n\n",
"Con un nivel de confianza del 95 %, la tasa media anual se encuentra entre **",
round(ic_inferior,2),
" y ",
round(ic_superior,2),
" deslizamientos por anio**.\n\n",
"La interpretacion final debe considerar que Poisson exige una tasa aproximadamente ",
"constante. Cuando existe una gran diferencia entre la media y la varianza, el modelo ",
"no representa adecuadamente los cambios temporales observados en el registro de ",
"deslizamientos."
)
)
Se analizaron 30 periodos anuales, comprendidos entre 1988 y 2017. La tasa media estimada fue de 367.77 deslizamientos por anio.
La varianza observada fue de 288787.08 y el indice de dispersion fue de 785.25, lo que evidencia sobredispersion. Se rechaza la equidispersion.
Como el chi-cuadrado calculado es mayor o igual que el valor critico, se rechaza la hipotesis nula. Por tanto, se rechaza h0: el modelo de poisson no es adecuado.
La probabilidad teorica de registrar entre 348 y 387 deslizamientos durante un anio es de 70.31 %.
Con un nivel de confianza del 95 %, la tasa media anual se encuentra entre 360.94 y 374.69 deslizamientos por anio.
La interpretacion final debe considerar que Poisson exige una tasa aproximadamente constante. Cuando existe una gran diferencia entre la media y la varianza, el modelo no representa adecuadamente los cambios temporales observados en el registro de deslizamientos.