---
title: "Análisis de Crecimiento Poblacional en Centros Poblados del Perú"
author: "Paul Efren Santos Andrade"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{centros-poblados-crecimiento}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 7,
  fig.height = 5,
  warning = FALSE,
  message = FALSE
)
```

## Introducción

La función `get_centros_poblados_crecimiento()` del paquete `rsdot` proporciona acceso programático a datos de centros poblados del Perú con información detallada sobre su tasa de crecimiento poblacional del período intercensal 2007-2017. 

Esta viñeta demuestra cómo utilizar la función para realizar análisis demográficos y espaciales, desde la descarga básica de datos hasta visualizaciones avanzadas.

### Fuente de los datos

Los datos provienen de:

- **Censos**: Población y Vivienda 2007 y 2017 (INEI)
- **Nivel**: Centro poblado
- **Variable principal**: Tasa media de crecimiento anual intercensal

## Instalación y carga de paquetes

```{r load-packages}
# Cargar paquetes necesarios
library(rsdot)
library(sf)
library(dplyr)
library(ggplot2)
library(tidyr)
library(stringr)
```

## Uso básico

### Ver departamentos disponibles

Para conocer qué departamentos están disponibles, ejecuta la función sin argumentos:

```{r list-departments}
get_centros_poblados_crecimiento()
```

Esto mostrará una lista de los 25 departamentos del Perú disponibles.

### Cargar datos de un departamento

Carguemos los datos de centros poblados del departamento de Cusco:

```{r load-cusco}
ccpp_cusco <- get_centros_poblados_crecimiento(departamento = "CUSCO")
```

```{r glimpse-data}
# Explorar la estructura de los datos
glimpse(ccpp_cusco)
```

### Estructura de los datos

Los datos incluyen las siguientes variables:

- `nro`: Número de identificación
- `codccpp`: Código del centro poblado
- `ubigeo`: Código UBIGEO del distrito
- `dep`: Departamento
- `prov`: Provincia
- `distrito`: Distrito
- `centro_pob`: Nombre del centro poblado
- `pob_2007`: Población en el censo 2007
- `pob_2017`: Población en el censo 2017
- `tasa`: Tasa media de crecimiento anual (%)
- `capital`: Tipo de capital (Departamental, Provincial, Distrital, No es capital)
- `region`: Región natural (Costa, Sierra, Selva)
- `urb_rural`: Clasificación urbano/rural
- `tc_catg`: Categoría de tasa de crecimiento (POSITIVO, NEGATIVO)
- `geom`: Geometría tipo POINT (coordenadas)

## Filtrado de datos

### Filtrado por provincia

Podemos filtrar los datos por provincia:

```{r filter-provincia}
ccpp_prov_cusco <- get_centros_poblados_crecimiento(
  departamento = "CUSCO",
  provincia = "CUSCO"
)

nrow(ccpp_prov_cusco)
```

### Filtrado por distrito

Para obtener centros poblados de un distrito específico:

```{r filter-distrito}
ccpp_anta <- get_centros_poblados_crecimiento(
  departamento = "CUSCO",
  provincia = "ANTA"
)
```

### Múltiples departamentos

La función permite cargar varios departamentos simultáneamente:

```{r load-multiple}
ccpp_sur <- get_centros_poblados_crecimiento(
  departamento = c("CUSCO", "PUNO", "AREQUIPA")
)

# Ver distribución por departamento y categoría
ccpp_sur |>
  st_drop_geometry() |>
  count(dep, tc_catg)
```

## Análisis descriptivo

### Estadísticas básicas

```{r basic-stats}
# Resumen de tasas de crecimiento
summary(ccpp_cusco$tasa)

# Resumen de población 2017
summary(ccpp_cusco$pob_2017)
```

### Centros poblados con crecimiento negativo

```{r negative-growth}
ccpp_negativo <- ccpp_cusco |>
  filter(tc_catg == "NEGATIVO")

cat("Centros con crecimiento negativo:", nrow(ccpp_negativo), "\n")
cat("Tasa promedio:", round(mean(ccpp_negativo$tasa), 2), "%\n")
```

### Top 10 por crecimiento

```{r top-growth}
# Centros poblados con mayor crecimiento
top_crecimiento <- ccpp_cusco |>
  arrange(desc(tasa)) |>
  head(10) |>
  st_drop_geometry() |>
  select(centro_pob, distrito, pob_2007, pob_2017, tasa)

print(top_crecimiento)
```

```{r top-decrease}
# Centros poblados con mayor decrecimiento
top_decrecimiento <- ccpp_cusco |>
  arrange(tasa) |>
  head(10) |>
  st_drop_geometry() |>
  select(centro_pob, distrito, pob_2007, pob_2017, tasa)

print(top_decrecimiento)
```

## Análisis por clasificaciones

### Por tipo de capital

```{r analysis-capital}
ccpp_cusco |>
  st_drop_geometry() |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  group_by(capital) |>
  summarise(
    n_centros = n(),
    pob_total_2017 = sum(pob_2017, na.rm = TRUE),
    tasa_promedio = mean(tasa, na.rm = TRUE),
    tasa_mediana = median(tasa, na.rm = TRUE)
  )
```

### Por clasificación urbano-rural

```{r analysis-urban-rural}
ccpp_cusco |>
  st_drop_geometry() |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  group_by(urb_rural) |>
  summarise(
    n_centros = n(),
    pob_total_2017 = sum(pob_2017, na.rm = TRUE),
    tasa_promedio = mean(tasa, na.rm = TRUE),
    tasa_mediana = median(tasa, na.rm = TRUE)
  )
```

### Por región natural

```{r analysis-region}
ccpp_cusco |>
  st_drop_geometry() |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  group_by(region, tc_catg) |>
  summarise(
    n_centros = n(),
    pob_total_2017 = sum(pob_2017, na.rm = TRUE),
    tasa_promedio = mean(tasa, na.rm = TRUE),
    .groups = "drop"
  )
```

## Visualizaciones

### Mapa de centros poblados por categoría de crecimiento

```{r map-basic, fig.cap="Centros poblados del departamento de Cusco coloreados por categoría de crecimiento (positivo/negativo)"}
ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  ggplot() +
  geom_sf(aes(color = tc_catg, size = pob_2017), alpha = 0.6) +
  scale_color_manual(
    values = c("POSITIVO" = "darkgreen", "NEGATIVO" = "darkred"),
    name = "Crecimiento"
  ) +
  scale_size_continuous(
    name = "Población 2017",
    range = c(0.5, 5),
    labels = scales::comma
  ) +
  labs(
    title = "Centros Poblados del Departamento de Cusco",
    subtitle = "Tasa de Crecimiento Poblacional 2007-2017",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal() +
  theme(
    legend.position = "right",
    plot.title = element_text(face = "bold", size = 14),
    plot.subtitle = element_text(size = 11)
  )
```

### Centros poblados urbanos

```{r map-urban, fig.cap="Centros poblados urbanos con gradiente de color según tasa de crecimiento"}
ccpp_urbanos <- ccpp_cusco |> filter(urb_rural == "URBANA")

ccpp_urbanos |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  ggplot() +
  geom_sf(aes(color = tasa, size = pob_2017), alpha = 0.7) +
  scale_color_gradient2(
    low = "red",
    mid = "yellow",
    high = "darkgreen",
    midpoint = 0,
    name = "Tasa (%)"
  ) +
  scale_size_continuous(
    name = "Población 2017",
    range = c(2, 8),
    labels = scales::comma
  ) +
  labs(
    title = "Centros Poblados Urbanos - Cusco",
    subtitle = "Tasa de Crecimiento Poblacional 2007-2017",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

### Top 20 por población

```{r map-top20, fig.cap="Los 20 centros poblados más grandes de Cusco"}
top_poblados <- ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  arrange(desc(pob_2017)) |>
  head(20)

ggplot(top_poblados) +
  geom_sf(aes(size = pob_2017, color = tasa), alpha = 0.7) +
  geom_sf_text(
    aes(label = centro_pob),
    size = 2.5,
    nudge_y = 0.05,
    check_overlap = TRUE
  ) +
  scale_size_continuous(
    name = "Población 2017",
    range = c(3, 15),
    labels = scales::comma
  ) +
  scale_color_gradient2(
    low = "red",
    mid = "yellow",
    high = "darkgreen",
    midpoint = 0,
    name = "Tasa (%)"
  ) +
  labs(
    title = "Top 20 Centros Poblados por Población",
    subtitle = "Departamento de Cusco - Censo 2017",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

### Boxplot por clasificación urbano-rural

```{r boxplot-urban, fig.cap="Distribución de tasas de crecimiento por clasificación urbano/rural"}
ggplot(ccpp_cusco, aes(x = urb_rural, y = tasa, fill = urb_rural)) +
  geom_boxplot(alpha = 0.7, outlier.alpha = 0.3) +
  scale_fill_brewer(palette = "Set2") +
  labs(
    title = "Distribución de Tasas de Crecimiento Poblacional",
    subtitle = "Por clasificación urbano/rural - Departamento de Cusco",
    x = "Clasificación",
    y = "Tasa de Crecimiento (%)",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal() +
  theme(legend.position = "none")
```

### Histograma de tasas

```{r histogram, fig.cap="Distribución de frecuencias de las tasas de crecimiento"}
ggplot(ccpp_cusco, aes(x = tasa, fill = tc_catg)) +
  geom_histogram(bins = 50, alpha = 0.7) +
  scale_fill_manual(
    values = c("POSITIVO" = "darkgreen", "NEGATIVO" = "darkred"),
    name = "Categoría"
  ) +
  labs(
    title = "Distribución de Tasas de Crecimiento Poblacional",
    subtitle = "Departamento de Cusco (2007-2017)",
    x = "Tasa de Crecimiento (%)",
    y = "Número de Centros Poblados",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

### Evolución poblacional 2007-2017

```{r scatter, fig.cap="Relación entre población 2007 y 2017 (escala logarítmica)"}
ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  ggplot(aes(x = pob_2007, y = pob_2017, color = tc_catg)) +
  geom_point(alpha = 0.5, size = 2) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "gray50") +
  scale_x_log10(labels = scales::comma) +
  scale_y_log10(labels = scales::comma) +
  scale_color_manual(
    values = c("POSITIVO" = "darkgreen", "NEGATIVO" = "darkred"),
    name = "Crecimiento"
  ) +
  labs(
    title = "Evolución Poblacional 2007-2017",
    subtitle = "Departamento de Cusco (escala logarítmica)",
    x = "Población 2007",
    y = "Población 2017",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

**Interpretación**: Los puntos por encima de la línea diagonal representan centros poblados que crecieron, mientras que los puntos por debajo perdieron población.

## Integración con otras capas

### Combinar con límites distritales

Una de las ventajas del paquete `rsdot` es que permite integrar fácilmente diferentes capas de información espacial:

```{r integration, fig.cap="Centros poblados sobre límites distritales de Cusco"}
# Obtener límites distritales
distritos_cusco <- get_distritos(departamento = "CUSCO")

# Mapa combinado
ggplot() +
  geom_sf(data = distritos_cusco, fill = NA, color = "gray70", linewidth = 0.3) +
  geom_sf(
    data = ccpp_cusco |>
      mutate(
        pob_2007 = as.numeric(str_remove(pob_2007, ",")),
        pob_2017 = as.numeric(str_remove(pob_2017, ","))
      ),
    aes(color = tc_catg, size = pob_2017),
    alpha = 0.6
  ) +
  scale_color_manual(
    values = c("POSITIVO" = "darkgreen", "NEGATIVO" = "darkred"),
    name = "Crecimiento"
  ) +
  scale_size_continuous(
    name = "Población 2017",
    range = c(0.5, 5),
    labels = scales::comma
  ) +
  labs(
    title = "Centros Poblados y Límites Distritales",
    subtitle = "Departamento de Cusco",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

## Análisis agregado por distrito

### Calcular estadísticas por distrito

```{r district-stats}
ccpp_por_distrito <- ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  st_drop_geometry() |>
  group_by(distrito) |>
  summarise(
    n_centros_poblados = n(),
    pob_total_2017 = sum(pob_2017, na.rm = TRUE),
    pob_total_2007 = sum(pob_2007, na.rm = TRUE),
    tasa_promedio = mean(tasa, na.rm = TRUE),
    n_positivo = sum(tc_catg == "POSITIVO", na.rm = TRUE),
    n_negativo = sum(tc_catg == "NEGATIVO", na.rm = TRUE)
  ) |>
  arrange(desc(pob_total_2017))

head(ccpp_por_distrito, 10)
```

### Mapa coroplético por distrito

```{r choropleth-map, fig.cap="Número de centros poblados por distrito en Cusco"}
# Unir estadísticas con geometrías
distritos_con_datos <- distritos_cusco |>
  left_join(ccpp_por_distrito, by = c("nombdist" = "distrito"))

# Mapa coroplético
ggplot(distritos_con_datos) +
  geom_sf(aes(fill = n_centros_poblados), color = "white", linewidth = 0.2) +
  scale_fill_viridis_c(
    option = "plasma",
    name = "N° Centros\nPoblados"
  ) +
  labs(
    title = "Número de Centros Poblados por Distrito",
    subtitle = "Departamento de Cusco",
    caption = "Fuente: INEI | Visor - SDOT"
  ) +
  theme_minimal()
```

## Casos de uso avanzados

### Identificar áreas de alta concentración poblacional

```{r high-concentration}
# Centros poblados con más de 5,000 habitantes
grandes_centros <- ccpp_cusco |>
  mutate(pob_2017 = as.numeric(str_remove(pob_2017, ","))) |>
  filter(pob_2017 > 5000) |>
  arrange(desc(pob_2017))

cat("Centros poblados con más de 5,000 habitantes:", nrow(grandes_centros), "\n")
```

### Análisis de centros poblados candidatos para creación distrital

Los centros poblados con crecimiento positivo sostenido pueden ser candidatos para análisis de creación distrital:

```{r district-candidates}
candidatos <- ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  filter(
    tc_catg == "POSITIVO",
    tasa > 2,  # Crecimiento mayor a 2% anual
    pob_2017 > 3000  # Población mínima
  ) |>
  st_drop_geometry() |>
  select(centro_pob, distrito, pob_2007, pob_2017, tasa, capital) |>
  arrange(desc(tasa))

head(candidatos, 10)
```

### Comparación entre capitales y no capitales

```{r capital-comparison}
ccpp_cusco |>
  mutate(
    es_capital = ifelse(capital == "No es capital", "No", "Sí"),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  ) |>
  st_drop_geometry() |>
  group_by(es_capital) |>
  summarise(
    n = n(),
    tasa_promedio = mean(tasa, na.rm = TRUE),
    pob_promedio = mean(pob_2017, na.rm = TRUE),
    .groups = "drop"
  )
```

## Consejos y mejores prácticas

### 1. Manejo de datos

Al trabajar con población, es importante convertir las variables numéricas correctamente:

```{r tips-data}
# Convertir población de character a numeric
ccpp_clean <- ccpp_cusco |>
  mutate(
    pob_2007 = as.numeric(str_remove(pob_2007, ",")),
    pob_2017 = as.numeric(str_remove(pob_2017, ","))
  )
```

### 2. Filtrado eficiente

Para análisis por región o tipo:

```{r tips-filtering}
# Filtrar por múltiples condiciones
ccpp_sierra_urbano <- ccpp_cusco |>
  filter(
    region == "Sierra",
    urb_rural == "URBANA"
  )
```

### 3. Exportar resultados

Guardar los datos procesados para uso posterior:

```{r tips-export, eval=FALSE}
# Exportar a GeoPackage
st_write(ccpp_cusco, "centros_poblados_cusco.gpkg", delete_dsn = TRUE)

# Exportar tabla sin geometría
ccpp_cusco |>
  st_drop_geometry() |>
  write.csv("centros_poblados_cusco.csv", row.names = FALSE)
```

### 4. Sistema de caché

La función almacena automáticamente los datos descargados:

```{r tips-cache, eval=FALSE}
# Primera ejecución: descarga desde OSF
ccpp1 <- get_centros_poblados_crecimiento(departamento = "CUSCO")

# Segunda ejecución: usa caché (más rápido)
ccpp2 <- get_centros_poblados_crecimiento(departamento = "CUSCO")

# Forzar nueva descarga si necesitas actualizar datos
ccpp3 <- get_centros_poblados_crecimiento(
  departamento = "CUSCO",
  force_update = TRUE
)
```

## Conclusiones

La función `get_centros_poblados_crecimiento()` facilita el acceso a datos valiosos sobre la dinámica poblacional del Perú a nivel de centros poblados. Los principales hallazgos de este análisis incluyen:

1. **Diversidad de patrones**: Existen centros poblados con crecimiento muy acelerado y otros en decrecimiento

2. **Diferencias urbano-rural**: Las áreas urbanas tienden a mostrar patrones de crecimiento diferentes a las rurales

3. **Utilidad para planificación**: Los datos son fundamentales para análisis de creación distrital y planificación territorial

4. **Integración de datos**: La función se integra perfectamente con otras funciones del paquete para análisis espaciales más complejos


## Referencias

- INEI (2007, 2017). Censos Nacionales de Población y Vivienda.
- Secretaría de Demarcación y Organización Territorial (SDOT) - PCM Perú.

---
