Carga de Datos y Librerías Preparación de la Variable Conclusión

1. CARGA DE DATOS Y LIBRERÍAS

# ==========================================
# Carga de librerías
# ==========================================

library(dplyr)
library(readxl)
library(gt)


# ==========================================
# Carga de la base de datos
# ==========================================

datos <- read_excel(
  
  "datos_deslizamientos.xlsx"

)


# ==========================================
# Visualización inicial de la base de datos
# ==========================================

str(datos)
## tibble [11,033 × 31] (S3: tbl_df/tbl/data.frame)
##  $ source_name              : chr [1:11033] "AGU" "Oregonian" "CBS News" "Reuters" ...
##  $ source_link              : chr [1:11033] "https://blogs.agu.org/landslideblog/2008/10/14/the-lifan-landslide-from-natural-disaster-to-cover-up/" "http://www.oregonlive.com/news/index.ssf/2009/01/landslide_plows_through_lake_o.html" "https://www.cbsnews.com/news/dozens-missing-after-peru-landslides/" "https://in.reuters.com/article/idINIndia-41450420090731" ...
##  $ event_id                 : num [1:11033] 684 956 973 1067 2603 ...
##  $ event_date               : POSIXct[1:11033], format: "2008-08-01" "2008-08-02" ...
##  $ HORA                     : chr [1:11033] "00:00:00" "02:00:00" "00:00:00" "00:00:00" ...
##  $ event_title              : chr [1:11033] "Sigou Village, Loufan County, Shanxi Province" "Lake Oswego, Oregon" "San Ramon district, 195 miles northeast of the capital, Lima," "Dailekh district" ...
##  $ event_description        : chr [1:11033] "occurred early in morning, 11 villagers buried in 7 houses" "Hours of heavy rain are to blame for an overnight mudslide in Lake Oswego." "(CBS/AP) At least 10 people died and as many as 80 were still missing Wednesday in central Peru after torrentia"| __truncated__ "One person was killed in Dailekh district, police said." ...
##  $ location_description     : chr [1:11033] "Sigou Village, Loufan County, Shanxi Province" "Lake Oswego, Oregon" "San Ramon district, 195 miles northeast of the capital, Lima," "Dailekh district" ...
##  $ location_accuracy        : chr [1:11033] "unknown" "5km" "10km" "unknown" ...
##  $ landslide_category       : chr [1:11033] "landslide" "mudslide" "landslide" "landslide" ...
##  $ landslide_trigger        : chr [1:11033] "rain" "downpour" "downpour" "monsoon" ...
##  $ landslide_size           : chr [1:11033] "large" "small" "large" "medium" ...
##  $ landslide_setting        : chr [1:11033] "mine" "unknown" "unknown" "unknown" ...
##  $ fatality_count           : num [1:11033] 11 0 10 1 0 0 0 3 NA 2 ...
##  $ injury_count             : num [1:11033] NA NA NA NA NA NA NA NA NA NA ...
##  $ storm_name               : chr [1:11033] NA NA NA NA ...
##  $ photo_link               : chr [1:11033] NA NA NA NA ...
##  $ notes                    : chr [1:11033] NA NA NA NA ...
##  $ event_import_source      : chr [1:11033] "glc" "glc" "glc" "glc" ...
##  $ event_import_id          : num [1:11033] 684 956 973 1067 2603 ...
##  $ country_name             : chr [1:11033] "China" "United States" "Peru" "Nepal" ...
##  $ country_code             : chr [1:11033] "CN" "US" "PE" "NP" ...
##  $ admin_division_name      : chr [1:11033] "Shaanxi" "Oregon" "Junín" "Mid Western" ...
##  $ admin_division_population: num [1:11033] 0 36619 14708 20908 798634 ...
##  $ gazeteer_closest_point   : chr [1:11033] "Jingyang" "Lake Oswego" "San Ramón" "Dailekh" ...
##  $ gazeteer_distance        : num [1:11033] 41.021 0.603 0.855 0.754 2.022 ...
##  $ submitted_date           : POSIXct[1:11033], format: "2014-04-01 00:00:00" "2014-04-01 00:00:00" ...
##  $ created_date             : POSIXct[1:11033], format: "2017-11-20 15:17:00" "2017-11-20 15:17:00" ...
##  $ last_edited_date         : POSIXct[1:11033], format: "2018-02-15 15:51:00" "2018-02-15 15:51:00" ...
##  $ longitude                : num [1:11033] 107.5 -122.7 -75.4 81.7 123.9 ...
##  $ latitude                 : num [1:11033] 32.6 45.4 -11.1 28.8 10.3 ...
# ==========================================
# Visualización de las primeras filas
# ==========================================

head(datos)
## # A tibble: 6 × 31
##   source_name         source_link event_id event_date          HORA  event_title
##   <chr>               <chr>          <dbl> <dttm>              <chr> <chr>      
## 1 AGU                 https://bl…      684 2008-08-01 00:00:00 00:0… Sigou Vill…
## 2 Oregonian           http://www…      956 2008-08-02 00:00:00 02:0… Lake Osweg…
## 3 CBS News            https://ww…      973 2008-08-03 00:00:00 00:0… San Ramon …
## 4 Reuters             https://in…     1067 2008-08-04 00:00:00 00:0… Dailekh di…
## 5 The Freeman         http://www…     2603 2008-08-05 00:00:00 12:0… sitio Baki…
## 6 BusinessWorld Onli… http://www…     4203 2008-08-06 00:00:00 00:0… Paguite, A…
## # ℹ 25 more variables: event_description <chr>, location_description <chr>,
## #   location_accuracy <chr>, landslide_category <chr>, landslide_trigger <chr>,
## #   landslide_size <chr>, landslide_setting <chr>, fatality_count <dbl>,
## #   injury_count <dbl>, storm_name <chr>, photo_link <chr>, notes <chr>,
## #   event_import_source <chr>, event_import_id <dbl>, country_name <chr>,
## #   country_code <chr>, admin_division_name <chr>,
## #   admin_division_population <dbl>, gazeteer_closest_point <chr>, …

2. PREPARACIÓN DE LA VARIABLE

2.1 Definición del orden de las categorías

# ==========================================
# Definición del orden ordinal
# ==========================================

orden_size <- c(

  "small",

  "medium",

  "large",

  "very_large"

)


orden_size
## [1] "small"      "medium"     "large"      "very_large"

2.2 Conversión de la variable a factor ordenado

# ==========================================
# Conversión a factor ordinal
# ==========================================

datos <- datos %>%

  mutate(

    landslide_size = factor(

      landslide_size,

      levels = orden_size,

      ordered = TRUE

    )

  )


# Verificación de la estructura ordinal

str(datos$landslide_size)
##  Ord.factor w/ 4 levels "small"<"medium"<..: 3 1 3 2 2 2 1 2 2 2 ...

2.3 Extracción de la variable de análisis

# ==========================================
# Selección de la variable ordinal
# ==========================================

variable_ordinal <- datos$landslide_size


head(variable_ordinal)
## [1] large  small  large  medium medium medium
## Levels: small < medium < large < very_large

2.4 Eliminación de valores faltantes

# ==========================================
# Identificación de valores faltantes
# ==========================================

NA_antes <- sum(is.na(variable_ordinal))


NA_antes
## [1] 863
# ==========================================
# Eliminación de valores NA
# ==========================================

variable_ordinal <- variable_ordinal[
  
  !is.na(variable_ordinal)

]


# ==========================================
# Verificación posterior
# ==========================================

NA_despues <- sum(is.na(variable_ordinal))


NA_despues
## [1] 0

2.5 Tamaño de la muestra

# ==========================================
# Número total de observaciones válidas
# ==========================================

n <- length(variable_ordinal)


n
## [1] 10170

3. DISTRIBUCIÓN DE PROBABILIDAD

3.1 Frecuencia absoluta

# ==========================================
# Frecuencia absoluta de cada categoría
# ==========================================

frecuencia_absoluta <- table(

  variable_ordinal

)


frecuencia_absoluta
## variable_ordinal
##      small     medium      large very_large 
##       2767       6551        750        102

3.2 Probabilidad simple

# ==========================================
# Probabilidad simple
# ==========================================

probabilidad_simple <- prop.table(

  frecuencia_absoluta

)


probabilidad_simple
## variable_ordinal
##      small     medium      large very_large 
## 0.27207473 0.64414946 0.07374631 0.01002950
# ==========================================
# Probabilidad porcentual
# ==========================================

probabilidad_porcentaje <- probabilidad_simple * 100


probabilidad_porcentaje
## variable_ordinal
##      small     medium      large very_large 
##  27.207473  64.414946   7.374631   1.002950

3.3 Construcción de la distribución de probabilidad

# ==========================================
# Tabla de distribución de probabilidad
# ==========================================

tabla_distribucion <- data.frame(

  Categoria = names(frecuencia_absoluta),

  ni = as.numeric(frecuencia_absoluta),

  hi = as.numeric(probabilidad_simple),

  P = as.numeric(probabilidad_porcentaje)

)


tabla_distribucion
##    Categoria   ni         hi         P
## 1      small 2767 0.27207473 27.207473
## 2     medium 6551 0.64414946 64.414946
## 3      large  750 0.07374631  7.374631
## 4 very_large  102 0.01002950  1.002950

3.4 Probabilidad acumulada

# ==========================================
# Frecuencia acumulada
# ==========================================

tabla_distribucion$Ni <- cumsum(

  tabla_distribucion$ni

)


# ==========================================
# Probabilidad acumulada
# ==========================================

tabla_distribucion$Hi <- cumsum(

  tabla_distribucion$hi

)


# ==========================================
# Probabilidad acumulada porcentual
# ==========================================

tabla_distribucion$P_acumulada <- tabla_distribucion$Hi * 100



tabla_distribucion
##    Categoria   ni         hi         P    Ni        Hi P_acumulada
## 1      small 2767 0.27207473 27.207473  2767 0.2720747    27.20747
## 2     medium 6551 0.64414946 64.414946  9318 0.9162242    91.62242
## 3      large  750 0.07374631  7.374631 10068 0.9899705    98.99705
## 4 very_large  102 0.01002950  1.002950 10170 1.0000000   100.00000

4. TABLA DE DISTRIBUCIÓN DE PROBABILIDAD

4.1 Tabla simple de distribución

# ==========================================
# Creación de la fila total
# ==========================================

fila_total <- data.frame(

  Categoria = "TOTAL",

  ni = sum(tabla_distribucion$ni),

  hi = sum(tabla_distribucion$hi),

  P = sum(tabla_distribucion$P),

  Ni = NA,

  Hi = NA,

  P_acumulada = NA

)



# ==========================================
# Tabla completa con total incluido
# ==========================================

tabla_distribucion_total <- rbind(

  tabla_distribucion,

  fila_total

)



tabla_distribucion_total
##    Categoria    ni         hi          P    Ni        Hi P_acumulada
## 1      small  2767 0.27207473  27.207473  2767 0.2720747    27.20747
## 2     medium  6551 0.64414946  64.414946  9318 0.9162242    91.62242
## 3      large   750 0.07374631   7.374631 10068 0.9899705    98.99705
## 4 very_large   102 0.01002950   1.002950 10170 1.0000000   100.00000
## 5      TOTAL 10170 1.00000000 100.000000    NA        NA          NA

4.2 Tabla de presentación

# ==========================================
# Diseño de la tabla final
# ==========================================

tabla_presentacion <- tabla_distribucion_total %>%

  gt() %>%

  tab_header(

    title = md("**Tabla N° 1**"),

    subtitle = md(
      "Distribución de probabilidad del tamaño de los deslizamientos a nivel mundial"
    )

  ) %>%

  cols_label(

    Categoria = "Tamaño del deslizamiento",

    ni = "Frecuencia absoluta (ni)",

    hi = "Probabilidad (hi)",

    P = "Probabilidad (%)",

    Ni = "Frecuencia acumulada (Ni)",

    Hi = "Probabilidad acumulada (Hi)",

    P_acumulada = "Probabilidad acumulada (%)"

  ) %>%

  fmt_number(

    columns = c(hi, Hi),

    decimals = 4

  ) %>%

  fmt_number(

    columns = c(P, P_acumulada),

    decimals = 2

  ) %>%

  tab_style(

    style = list(

      cell_fill(color = "#6D213C"),

      cell_text(

        color = "white",

        weight = "bold"

      )

    ),

    locations = cells_column_labels()

  ) %>%

  tab_style(

    style = cell_text(

      weight = "bold"

    ),

    locations = cells_body(

      rows = Categoria == "TOTAL"

    )

  ) %>%

  tab_source_note(

    source_note = md(
      "Autor: Grupo 1 – Carrera de Geología"
    )

  )


tabla_presentacion
Tabla N° 1
Distribución de probabilidad del tamaño de los deslizamientos a nivel mundial
Tamaño del deslizamiento Frecuencia absoluta (ni) Probabilidad (hi) Probabilidad (%) Frecuencia acumulada (Ni) Probabilidad acumulada (Hi) Probabilidad acumulada (%)
small 2767 0.2721 27.21 2767 0.2721 27.21
medium 6551 0.6441 64.41 9318 0.9162 91.62
large 750 0.0737 7.37 10068 0.9900 99.00
very_large 102 0.0100 1.00 10170 1.0000 100.00
TOTAL 10170 1.0000 100.00 NA NA NA
Autor: Grupo 1 – Carrera de Geología

5. GRÁFICAS DE LA DISTRIBUCIÓN DE PROBABILIDAD

5.1 Distribución de probabilidad

# ==========================================
# Preparación del gráfico
# ==========================================

par(

  mar = c(8,5,4,2)

)



pos_x <- barplot(

  tabla_distribucion$P,

  names.arg = tabla_distribucion$Categoria,

  col = "steelblue",

  border = "black",

  space = 0.20,

  ylim = c(0,100),

  las = 1,

  yaxt = "n",

  main = "Gráfica N° 1. Distribución de probabilidad\n del tamaño de los deslizamientos",

  xlab = "Tamaño del deslizamiento",

  ylab = "Probabilidad (%)"

)



# ==========================================
# Escala del eje Y
# ==========================================

ticks_y <- seq(

  0,

  100,

  20

)



axis(

  side = 2,

  at = ticks_y,

  labels = ticks_y,

  las = 1

)



# ==========================================
# Etiquetas de porcentaje
# ==========================================

text(

  x = pos_x,

  y = tabla_distribucion$P,

  labels = round(

    tabla_distribucion$P,

    2

  ),

  pos = 3,

  cex = 0.80,

  font = 2

)


5.2 Distribución acumulada

# ==========================================
# Preparación del gráfico acumulado
# ==========================================

par(

  mar = c(8,5,4,2)

)



pos_x <- barplot(

  tabla_distribucion$P_acumulada,

  names.arg = tabla_distribucion$Categoria,

  col = "skyblue",

  border = "black",

  space = 0.20,

  ylim = c(0,100),

  las = 1,

  yaxt = "n",

  main = "Gráfica N° 2. Distribución acumulada\n del tamaño de los deslizamientos",

  xlab = "Tamaño del deslizamiento",

  ylab = "Probabilidad acumulada (%)"

)



# ==========================================
# Escala del eje Y
# ==========================================

ticks_y <- seq(

  0,

  100,

  20

)



axis(

  side = 2,

  at = ticks_y,

  labels = ticks_y,

  las = 1

)



# ==========================================
# Línea de referencia del 100 %
# ==========================================

abline(

  h = 100,

  col = "red",

  lty = 2,

  lwd = 2

)



# ==========================================
# Etiquetas de porcentaje acumulado
# ==========================================

text(

  x = pos_x,

  y = tabla_distribucion$P_acumulada,

  labels = round(

    tabla_distribucion$P_acumulada,

    2

  ),

  pos = 3,

  cex = 0.80,

  font = 2

)

6. ESTADÍSTICA INFERENCIAL

6.1 Estimación puntual de la proporción

# ==========================================
# Estimación puntual de las proporciones
# ==========================================

proporcion_muestral <- tabla_distribucion$hi


proporcion_muestral
## [1] 0.27207473 0.64414946 0.07374631 0.01002950
# ==========================================
# Construcción de la tabla
# ==========================================

tabla_inferencia <- data.frame(

  Categoria = tabla_distribucion$Categoria,

  Proporcion = proporcion_muestral

)


tabla_inferencia
##    Categoria Proporcion
## 1      small 0.27207473
## 2     medium 0.64414946
## 3      large 0.07374631
## 4 very_large 0.01002950

6.2 Error estándar de la proporción

# ==========================================
# Error estándar de cada proporción
# ==========================================

error_estandar <- sqrt(

  proporcion_muestral *

  (1 - proporcion_muestral) / n

)


error_estandar
## [1] 0.0044129299 0.0047475185 0.0025916399 0.0009880758
# ==========================================
# Incorporación a la tabla
# ==========================================

tabla_inferencia$Error_estandar <- error_estandar


tabla_inferencia
##    Categoria Proporcion Error_estandar
## 1      small 0.27207473   0.0044129299
## 2     medium 0.64414946   0.0047475185
## 3      large 0.07374631   0.0025916399
## 4 very_large 0.01002950   0.0009880758

6.3 Intervalo de confianza del 95 %

# ==========================================
# Valor crítico para un nivel de confianza
# del 95 %
# ==========================================

z <- qnorm(0.975)


z
## [1] 1.959964
# ==========================================
# Límite inferior
# ==========================================

limite_inferior <- proporcion_muestral -

  z * error_estandar


# ==========================================
# Límite superior
# ==========================================

limite_superior <- proporcion_muestral +

  z * error_estandar


# ==========================================
# Ajuste de límites al intervalo [0,1]
# ==========================================

limite_inferior <- pmax(

  0,

  limite_inferior

)


limite_superior <- pmin(

  1,

  limite_superior

)


# ==========================================
# Incorporación a la tabla
# ==========================================

tabla_inferencia$Limite_inferior <- limite_inferior

tabla_inferencia$Limite_superior <- limite_superior


tabla_inferencia
##    Categoria Proporcion Error_estandar Limite_inferior Limite_superior
## 1      small 0.27207473   0.0044129299     0.263425546      0.28072391
## 2     medium 0.64414946   0.0047475185     0.634844494      0.65345442
## 3      large 0.07374631   0.0025916399     0.068666792      0.07882583
## 4 very_large 0.01002950   0.0009880758     0.008092906      0.01196609

6.4 Presentación de la inferencia estadística

# ==========================================
# Tabla de presentación
# ==========================================

tabla_inferencia %>%

  gt() %>%

  tab_header(

    title = md("**Tabla N° 2**"),

    subtitle = md(

      "Estimación puntual e intervalos de confianza para las proporciones del tamaño de los deslizamientos"

    )

  ) %>%

  cols_label(

    Categoria = "Tamaño del deslizamiento",

    Proporcion = "Proporción",

    Error_estandar = "Error estándar",

    Limite_inferior = "Límite inferior (95 %)",

    Limite_superior = "Límite superior (95 %)"

  ) %>%

  fmt_number(

    columns = c(

      Proporcion,

      Error_estandar,

      Limite_inferior,

      Limite_superior

    ),

    decimals = 4

  ) %>%

  tab_style(

    style = list(

      cell_fill(color = "#6D213C"),

      cell_text(

        color = "white",

        weight = "bold"

      )

    ),

    locations = cells_column_labels()

  ) %>%

  tab_source_note(

    source_note = md(

      "Autor: Grupo 1 – Carrera de Geología"

    )

  )
Tabla N° 2
Estimación puntual e intervalos de confianza para las proporciones del tamaño de los deslizamientos
Tamaño del deslizamiento Proporción Error estándar Límite inferior (95 %) Límite superior (95 %)
small 0.2721 0.0044 0.2634 0.2807
medium 0.6441 0.0047 0.6348 0.6535
large 0.0737 0.0026 0.0687 0.0788
very_large 0.0100 0.0010 0.0081 0.0120
Autor: Grupo 1 – Carrera de Geología

7. CÁLCULO DE PROBABILIDADES

7.1 Probabilidad observada

# ==========================================
# Categoría de interés
# ==========================================

categoria_interes <- "medium"


categoria_interes
## [1] "medium"
# ==========================================
# Búsqueda de la categoría
# ==========================================

fila_categoria <- tabla_inferencia %>%

  filter(

    Categoria == categoria_interes

  )


fila_categoria
##   Categoria Proporcion Error_estandar Limite_inferior Limite_superior
## 1    medium  0.6441495    0.004747518       0.6348445       0.6534544
# ==========================================
# Probabilidad observada
# ==========================================

probabilidad <- fila_categoria$Proporcion


probabilidad
## [1] 0.6441495

7.2 Intervalo de confianza de la probabilidad

# ==========================================
# Intervalo de confianza
# ==========================================

limite_inferior <- fila_categoria$Limite_inferior

limite_superior <- fila_categoria$Limite_superior


limite_inferior
## [1] 0.6348445
limite_superior
## [1] 0.6534544

7.3 Interpretación

plot(

  1,

  type = "n",

  axes = FALSE,

  xlab = "",

  ylab = ""

)


texto <- paste0(

  "Estimación del intervalo de confianza\n\n",

  "Para la categoría:\n\n",

  "'",

  categoria_interes,

  "'\n\n",

  "la proporción observada fue de ",

  round(probabilidad * 100, 2),

  "%.\n\n",

  "Con un nivel de confianza del 95 %, se estima\n",

  "que la proporción poblacional se encuentra\n",

  "entre ",

  round(limite_inferior * 100, 2),

  "% y ",

  round(limite_superior * 100, 2),

  "%."

)


text(

  x = 1,

  y = 1,

  labels = texto,

  cex = 1.20,

  font = 2

)

8. CONCLUSIÓN

# ==========================================
# Categoría con mayor probabilidad
# ==========================================

indice_maximo <- which.max(

  tabla_inferencia$Proporcion

)

categoria_mayor <- tabla_inferencia$Categoria[

  indice_maximo

]

probabilidad_mayor <- round(

  tabla_inferencia$Proporcion[indice_maximo] * 100,

  2

)

lim_inf <- round(

  tabla_inferencia$Limite_inferior[indice_maximo] * 100,

  2

)

lim_sup <- round(

  tabla_inferencia$Limite_superior[indice_maximo] * 100,

  2

)

# ==========================================
# Presentación de la conclusión
# ==========================================

plot(

  1,

  type = "n",

  axes = FALSE,

  xlab = "",

  ylab = ""

)


texto <- paste0(

  "Conclusión\n\n",

  "La categoría '",

  categoria_mayor,

  "' presentó la mayor proporción observada\n",

  "de deslizamientos, con un valor de ",

  probabilidad_mayor,

  "%.\n\n",

  "Con un nivel de confianza del 95 %, la\n",

  "proporción poblacional para esta categoría\n",

  "se estima entre ",

  lim_inf,

  "% y ",

  lim_sup,

  "%.\n\n",

  "Estos resultados permiten inferir que esta\n",

  "categoría constituye la más representativa\n",

  "dentro del conjunto de deslizamientos\n",

  "analizados."

)

text(

  x = 1,

  y = 1,

  labels = texto,

  cex = 1.15,

  font = 2

)