La provincia de Córdoba es una de las regiones apícolas del país, inserta en un contexto donde Argentina se ubica entre los mayores productores mundiales de miel.En Córdoba coexisten dos grandes zonas ecológicas: por un lado, las llanuras agrícolas del este y sur con amplia cobertura de cultivos, y por otro, el monte nativo cordobés, concentrado principalmente en el noroeste serrano.
Este informe plantea las siguientes preguntas: ¿Cual es la distribución de la actividad apícola en la provincia ? y ¿Cual es su relación con el monte nativo?. Incluiré en un conjunto de gráficos que tienen como objetivo ampliar la exploración de los datasets desde conceptos brindados en el módulo CDII, en ellos pretendo aproximarme a una comprobación del lugar que ocupa la apicultura de Córdoba en lectura nacional.(Anexo: Prácticas complementarias)
Trabajo con datos abiertos del Ministerio de Agricultura (RENAPA).
1.renapa-apiarios-colmenas-provincia-departamento-2025-junio.csv
2.movimiento-apicola-2013-2018.csv
3.cobertura_2020_2021_dpto_json
library(sf)
library(readr)
library(dplyr)
library(tidyr)
library(lubridate)
library(ggplot2)
library(ggrepel)
library(scales)
library(stringr)
library(stringi)
library(janitor)
library(grid)
library(ggmap)
library(leaflet)
library(osmdata)
normaliza <- function(x) x |> str_squish() |> str_to_lower() |> stringi::stri_trans_general("Latin-ASCII")
fmt_es_num <- scales::label_number(big.mark = ".", decimal.mark = ",")path_renapa_dpto <- "data/renapa-apiarios-colmenas-provincia-departamento-2025-junio.csv"
path_cobertura <- "data/cobertura_2020_2021_dpto.json"
path_mov <- "data/movimiento-apicola-2013-2018 .csv"
renapa_a <- read_csv(path_renapa_dpto, show_col_types = FALSE,
locale = locale(encoding = "latin1")) |>
clean_names()
cba_cov <- st_read(path_cobertura, quiet = TRUE)
mov <- read_csv(path_mov, show_col_types = FALSE,
locale = locale(encoding = "latin1")) |>
clean_names()## Rows: 486
## Columns: 7
## $ fecha_actualizacion <date> 2025-06-25, 2025-06-25, 2025-06-25, 2025-06-25, 2…
## $ provincia_id <chr> "06", "06", "06", "06", "06", "06", "06", "06", "0…
## $ provincia <chr> "Buenos Aires", "Buenos Aires", "Buenos Aires", "B…
## $ departamento_id <chr> "06854", "06588", "06007", "06014", "06021", "6028…
## $ departamento <chr> "25 de Mayo", "9 de Julio", "Adolfo Alsina", "Adol…
## $ apiarios <dbl> 267, 279, 363, 161, 70, 32, 53, 3, 702, 477, 59, 4…
## $ colmenas <dbl> 21469, 23667, 29172, 9496, 8190, 667, 3230, 231, 4…
## [1] 486 7
## [1] "fecha_actualizacion" "provincia_id" "provincia"
## [4] "departamento_id" "departamento" "apiarios"
## [7] "colmenas"
## [1] "sf" "data.frame"
## [1] 26 28
## [1] "id" "fid" "nombre"
## [4] "superficie_dto" "monte" "matorral_arb"
## [7] "pastizal_nat" "arbustal_pastizal" "roca"
## [10] "suelo_des" "salinas" "cuerpos_agua"
## [13] "zona_anegable" "cursos_agua" "urbano_comp_a"
## [16] "urbano_comp_m" "urbano_comp_b" "urbano_comp_mb"
## [19] "infra_vial" "cultivo_ext" "cultivo_irrig"
## [22] "pastura_imp" "pastura_nat" "cultivo_hort"
## [25] "plant_forestal" "veg_lenosa" "mapa"
## [28] "geometry"
## superficie_dto monte geometry
## Min. : 57599 Min. : 1169 MULTIPOLYGON :26
## 1st Qu.: 323076 1st Qu.: 8980 epsg:22174 : 0
## Median : 508992 Median : 33324 +proj=tmer...: 0
## Mean : 633503 Mean : 44126
## 3rd Qu.: 815990 3rd Qu.: 58941
## Max. :1856544 Max. :149244
## Coordinate Reference System:
## User input: POSGAR 98 / Argentina 4
## wkt:
## PROJCRS["POSGAR 98 / Argentina 4",
## BASEGEOGCRS["POSGAR 98",
## DATUM["Posiciones Geodesicas Argentinas 1998",
## ELLIPSOID["GRS 1980",6378137,298.257222101,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4190]],
## CONVERSION["Argentina zone 4",
## METHOD["Transverse Mercator",
## ID["EPSG",9807]],
## PARAMETER["Latitude of natural origin",-90,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8801]],
## PARAMETER["Longitude of natural origin",-63,
## ANGLEUNIT["degree",0.0174532925199433],
## ID["EPSG",8802]],
## PARAMETER["Scale factor at natural origin",1,
## SCALEUNIT["unity",1],
## ID["EPSG",8805]],
## PARAMETER["False easting",4500000,
## LENGTHUNIT["metre",1],
## ID["EPSG",8806]],
## PARAMETER["False northing",0,
## LENGTHUNIT["metre",1],
## ID["EPSG",8807]]],
## CS[Cartesian,2],
## AXIS["northing (X)",north,
## ORDER[1],
## LENGTHUNIT["metre",1]],
## AXIS["easting (Y)",east,
## ORDER[2],
## LENGTHUNIT["metre",1]],
## USAGE[
## SCOPE["Engineering survey, topographic mapping."],
## AREA["Argentina - between 64°30'W and 61°30'W, onshore."],
## BBOX[-54.91,-64.5,-21.99,-61.5]],
## ID["EPSG",22174]]
## Rows: 6,341
## Columns: 16
## $ fecha <chr> "2013-01", "2013-01", "2013-01", "2013-01",…
## $ salido_de <chr> "Establecimiento", "Establecimiento", "Esta…
## $ ingresado_a <chr> "Establecimiento", "Establecimiento", "Esta…
## $ provincia_origen <chr> "Buenos Aires", "Buenos Aires", "Buenos Air…
## $ provincia_origen_id <chr> "06", "06", "06", "06", "06", "06", "06", "…
## $ departamento_origen <chr> "Almirante Brown", "Almirante Brown", "Almi…
## $ departamento_origen_id <chr> "06028", "06028", "06028", "06028", "06056"…
## $ provincia_destino <chr> "Buenos Aires", "Mendoza", "Mendoza", "Mend…
## $ provincia_destino_id <chr> "06", "50", "50", "50", "06", "06", "62", "…
## $ departamento_destino <chr> "General Pueyrredón", "Guaymallén", "Las He…
## $ departamento_destino_id <chr> "06357", "50028", "50049", "50070", "06602"…
## $ colmenas <dbl> 41, 56, 30, 15, 370, 125, 10, 460, 60, 0, 1…
## $ nucleos <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, …
## $ paquetes <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ reinas <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ envio_abeja_reina_ob_acomp <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## [1] 6341 16
## [1] "fecha" "salido_de"
## [3] "ingresado_a" "provincia_origen"
## [5] "provincia_origen_id" "departamento_origen"
## [7] "departamento_origen_id" "provincia_destino"
## [9] "provincia_destino_id" "departamento_destino"
## [11] "departamento_destino_id" "colmenas"
## [13] "nucleos" "paquetes"
## [15] "reinas" "envio_abeja_reina_ob_acomp"
En Cobertura confirmamos columnas
superficie_dto (ha), monte (ha) y
nombre (departamento), CRS = 4326 .
En Movimientos trabajamos con fecha,
provincia_origen, provincia_destino y
colmenas (totales movilizados).
Córdoba por departamento según RENAPA.
renapa_cba <- renapa_a |>
filter(normaliza(provincia) == "cordoba") |>
mutate(apiarios = readr::parse_number(as.character(apiarios)),
colmenas = readr::parse_number(as.character(colmenas))) |>
group_by(departamento) |>
summarise(apiarios = sum(apiarios, na.rm = TRUE),
colmenas = sum(colmenas, na.rm = TRUE), .groups = "drop") |>
mutate(dep_norm = normaliza(departamento))Cobertura: variables y clave normalizada.
cba_cov2 <- cba_cov |>
mutate(dep_norm = normaliza(nombre), superficie_ha = as.numeric(superficie_dto),
monte_ha = as.numeric(monte),
pct_monte = dplyr::if_else(is.finite(monte_ha) & is.finite(superficie_ha) & superficie_ha > 0, 100 * monte_ha / superficie_ha, NA_real_))Resolver sinónimos de departamentos abreviaturas.
syn <- c("gral. san martin" = "general san martin",
"general san martín" = "general san martin",
"pte. roque saenz peña" = "presidente roque saenz peña",
"pte. roque saenz pena" = "presidente roque saenz peña",
"gral san martin" = "general san martin")
renapa_cba <- renapa_cba |>
mutate(dep_norm = recode(dep_norm, !!!syn))Unión.
cba_join <- cba_cov2 |>
left_join(renapa_cba |> select(dep_norm, apiarios, colmenas), by = "dep_norm") |>
mutate(colm_x_1000ha_monte = if_else(is.finite(monte_ha) & monte_ha > 0, colmenas / (monte_ha/1000), NA_real_),
apia_x_1000ha_monte = if_else(is.finite(monte_ha) & monte_ha > 0, apiarios / (monte_ha/1000), NA_real_),
colm_x_1000ha_total = if_else(is.finite(superficie_ha) & superficie_ha > 0, colmenas / (superficie_ha/1000), NA_real_),
apia_x_1000ha_total = if_else(is.finite(superficie_ha) & superficie_ha > 0, apiarios / (superficie_ha/1000), NA_real_))Diag. de correspondencia.
faltan_cov <- anti_join(renapa_cba, cba_cov2, by = "dep_norm") |> pull(departamento)
faltan_ren <- anti_join(cba_cov2, renapa_cba, by = "dep_norm") |> pull(nombre)
list("RENAPA_sin_cobertura" = faltan_cov, "Cobertura_sin_RENAPA" = faltan_ren)## $RENAPA_sin_cobertura
## [1] "General San Martín" "Presidente Roque Sáenz Peña"
##
## $Cobertura_sin_RENAPA
## [1] "Gral. San Martín" "Pte. Roque Saenz Peña"
% de superficie con monte nativo.
p_map_pct <- ggplot(cba_join_4326) +
geom_sf(aes(fill = pct_monte), color = "grey50", size = 0.2) +
scale_fill_viridis_c(option = "C", direction = -1, na.value = "grey90",
labels = label_number(accuracy = 0.1, decimal.mark = ","),
name = "% MONTE") +labs(title = "Córdoba: % de Superficie con Monte Nativo",
subtitle = "Por departamento", caption = "Fuente: Cobertura 2020/2021") +
theme_gray(base_size = 12) + theme(panel.grid.minor = element_blank())Colmenas totales por departamento (RENAPA 2025).
p_map_tot <- ggplot(cba_join_4326) +
geom_sf(aes(fill = colmenas), color = "grey50", size = 0.2) +
scale_fill_viridis_c(option = "C", direction = -1, na.value = "grey90",
labels = label_number(big.mark = ".", decimal.mark = ","),
name = "COLMENAS") + labs(title = "Córdoba: Colmenas por Departamento",
subtitle = "RENAPA jun-2025", caption = "Fuente: RENAPA") +
theme_grey(base_size = 12) + theme(panel.grid.minor = element_blank())Densidad relativa: colmenas / 1000 ha de monte.
p_map_den <- ggplot(cba_join_4326) +
geom_sf(aes(fill = colm_x_1000ha_monte), color = "grey50", size = 0.2) +
scale_fill_viridis_c(option = "C", direction = -1, na.value = "grey90",
labels = label_number(accuracy = 0.1, decimal.mark = ","),
name = "Colmenas / 1000 ha monte") +
labs(title = "Córdoba: Intensidad Apícola Relativa al Monte Nativo",
subtitle = "Colmenas por 1000 ha de Monte",
caption = "Fuente: RENAPA ") +
theme_grey(base_size = 12) + theme(panel.grid.minor = element_blank())
p_map_pct; p_map_tot; p_map_denGráfico de barras: Colmenas por dpto.
ggplot(renapa_cba, aes(x = reorder(departamento, colmenas), y = colmenas)) +
geom_col(aes(fill = colmenas)) +
coord_flip() +scale_fill_viridis_c() +labs(title="Colmenas por Departamento (Córdoba 2025)",
x="Departamento", y="Colmenas", fill="Colmenas") + theme_minimal()Dispersión Apiarios–Colmenas coloreando por cuartiles de % Monte.
base_rel <- cba_join |>
st_drop_geometry() |>
transmute(nombre, apiarios = as.numeric(apiarios),
colmenas = as.numeric(colmenas),
pct_monte = as.numeric(pct_monte)) |>
drop_na(apiarios, colmenas, pct_monte) |>
filter(is.finite(apiarios), is.finite(colmenas))
brks <- quantile(base_rel$pct_monte, probs = seq(0, 1, 0.25), na.rm = TRUE, names = FALSE)
fmt1 <- function(x) format(round(x, 1), big.mark = ".", decimal.mark = ",", trim = TRUE)
labs_q <- paste0("Q", 1:4, ": ", fmt1(brks[-length(brks)]), "–", fmt1(brks[-1]), "%")
base_rel <- base_rel |>
mutate(q_monte = cut(pct_monte, breaks = brks, include.lowest = TRUE, labels = labs_q),
ratio = colmenas / pmax(apiarios, 1))
r_med <- median(base_rel$ratio, na.rm = TRUE)
pal_discr <- setNames(c("#482878", "turquoise3", "#1F9E89", "orange"), labs_q)
ggplot(base_rel, aes(x = apiarios, y = colmenas, color = q_monte)) +
geom_abline(slope = r_med, intercept = 0, linetype = 2, linewidth = 0.7, color = "red") +
geom_point(size = 3, alpha = 0.95) +
ggrepel::geom_text_repel(aes(label = nombre), size = 3, seed = 1,
box.padding = .35, point.padding = .2,
max.overlaps = Inf, show.legend = FALSE) +
geom_smooth(method = "lm", se = FALSE, linewidth = 0.9, linetype = 2, color = "grey35") +
scale_color_manual(name = "% MONTE (cuartiles)", values = pal_discr, drop = FALSE) +
scale_x_continuous(labels = fmt_es_num, expand = expansion(mult = c(.02, .05))) +
scale_y_continuous(labels = fmt_es_num, expand = expansion(mult = c(.02, .05))) +
labs(title = "Relación Apiarios–Colmenas (color por cuartiles de % Monte)",
subtitle = "Línea gris: mediana de colmenas por apiario",
x = "APIARIOS", y = "COLMENAS") +
theme_grey(base_size = 12) +
theme(panel.grid.minor = element_blank(), legend.position = "right")
Facetado por cuartiles de % de Monte.
brks <- quantile(cba_join_4326$pct_monte, probs = seq(0, 1, 0.25),
na.rm = TRUE, names = FALSE)
fmt1 <- function(x) format(round(x, 1), big.mark=".", decimal.mark=",", trim=TRUE)
labs_q <- paste0("Q", 1:4, ": ", fmt1(brks[-length(brks)]), "–", fmt1(brks[-1]), "%")
cba_q <- cba_join_4326 |>
dplyr::mutate(q_monte = cut(pct_monte, breaks = brks,
include.lowest = TRUE, labels = labs_q))
rng <- range(cba_q$colm_x_1000ha_monte, na.rm = TRUE)
ggplot(cba_q) +
geom_sf(aes(fill = colm_x_1000ha_monte), color = "orange", linewidth = 0.2) +
scale_fill_viridis_c(option = "C", direction = -1, na.value = "grey90",
limits = rng,
labels = scales::label_number(accuracy = 0.1, big.mark=".", decimal.mark=","),
name = "Colmenas / 1000 ha de monte") +
facet_wrap(~ q_monte, ncol = 2) +
labs(title = "Intensidad Apícola por cuartiles de % de Monte en Cba.",
caption = "Fuentes: RENAPA y Cobertura 2020/2021") +
theme_gray(base_size = 12) +
theme(panel.grid.minor = element_blank(),
strip.text = element_text(face = "bold")) +
guides(x = guide_axis(n.dodge = 2))Superposición: polígonos (pct_monte) + círculos proporcionales (colmenas)
cba_pts <- cba_join |>
st_transform(3857) |>
st_point_on_surface() |>
st_transform(4326)
centros <- cbind(st_coordinates(cba_pts) |> as.data.frame(),
st_drop_geometry(cba_join)) |>
dplyr::rename(lon = X, lat = Y) |>
dplyr::mutate(colmenas = as.numeric(colmenas),
r_colm = scales::rescale(colmenas, to = c(6, 18),
from = range(colmenas, na.rm=TRUE)))
ggplot() +
geom_sf(data = cba_join_4326, aes(fill = pct_monte), color = "grey40", size = 0.2) +
scale_fill_distiller(palette = "YlGn", direction = 1, name = "% Monte") +
geom_point(data = centros, aes(lon, lat, size = r_colm), shape = 21, stroke = 0.3, fill = "orange") +
scale_size_identity(guide = "legend", name = "Colmenas (relativa)") +
labs(title = "Monte Nativo (relleno) + Colmenas (círculos)",
subtitle = "Córdoba por departamento.",
x = NULL, y = NULL) +
theme_grey()Medición de la relación con el monte (correlación y regresión)
base_dep <- cba_join |>
st_drop_geometry() |>
transmute(dep = nombre,
colmenas = as.numeric(colmenas),
apiarios = as.numeric(apiarios),
monte_ha = as.numeric(monte_ha),
pct_monte = as.numeric(pct_monte),
colm_x_1000ha_monte = as.numeric(colm_x_1000ha_monte)) |>
drop_na(colmenas, monte_ha, pct_monte)Spearman (log-transform sobre totales)
cor_spear <- suppressWarnings(cor.test(log1p(base_dep$colmenas),
log1p(base_dep$monte_ha),
method = "spearman", exact = FALSE))Modelo lineal: intensidad relativa ~ % monte
m1 <- lm(colm_x_1000ha_monte ~ pct_monte, data = base_dep)
m1_sum <- summary(m1)
m1_tidy <- broom::tidy(m1)
list(cor_spearman = cor_spear,
lm_summary = m1_sum,
lm_tidy = m1_tidy)## $cor_spearman
##
## Spearman's rank correlation rho
##
## data: log1p(base_dep$colmenas) and log1p(base_dep$monte_ha)
## S = 1516, p-value = 0.1031
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.3408696
##
##
## $lm_summary
##
## Call:
## lm(formula = colm_x_1000ha_monte ~ pct_monte, data = base_dep)
##
## Residuals:
## Min 1Q Median 3Q Max
## -790.0 -451.1 -259.0 179.6 2061.7
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1051.22 230.35 4.564 0.000152 ***
## pct_monte -46.52 16.72 -2.782 0.010867 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 745.1 on 22 degrees of freedom
## Multiple R-squared: 0.2603, Adjusted R-squared: 0.2266
## F-statistic: 7.74 on 1 and 22 DF, p-value: 0.01087
##
##
## $lm_tidy
## # A tibble: 2 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) 1051. 230. 4.56 0.000152
## 2 pct_monte -46.5 16.7 -2.78 0.0109
ggplot(base_dep, aes(pct_monte, colm_x_1000ha_monte)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE, linetype = 2, color = "turquoise3") +
labs(x = "% de Monte", y = "Colmenas / 1000 ha de monte",
title = "Relación entre Intensidad Apícola y % de Monte") +
theme_light(base_size = 12)
Contexto temporal: movimientos 2013–2018.
mov <- mov |>
mutate(fecha = paste0(fecha, "-01"),
fecha = ymd(fecha),
anio = year(fecha),
prov_origen_norm = normaliza(provincia_origen),
prov_destino_norm = normaliza(provincia_destino)) |>
mutate(colmenas = readr::parse_number(as.character(colmenas)))
mov_nac_anual <- mov |>
group_by(anio) |>
summarise(colmenas_mov = sum(colmenas, na.rm = TRUE), .groups = "drop") |>
mutate(grupo = "Argentina")
mov_cba_anual <- mov |>
filter(prov_origen_norm == "cordoba" | prov_destino_norm == "cordoba") |>
group_by(anio) |>
summarise(colmenas_mov = sum(colmenas, na.rm = TRUE), .groups = "drop") |>
mutate(grupo = "Córdoba")
participacion <- mov_cba_anual |>
rename(cba_colmenas = colmenas_mov) |>
left_join(mov_nac_anual |> rename(nac_colmenas = colmenas_mov), by = "anio") |>
mutate(pct_cba = if_else(nac_colmenas > 0, 100 * cba_colmenas / nac_colmenas, NA_real_))
mov_comb <- bind_rows(mov_nac_anual, mov_cba_anual) |>
left_join(participacion |> select(anio, pct_cba), by = "anio")
mov_cba_labels <- filter(mov_comb, grupo == "Córdoba") |>
mutate(lbl = paste0(round(pct_cba, 1), "%"))
prom_cba <- mean(mov_cba_anual$colmenas_mov, na.rm = TRUE)
ggplot(mov_comb, aes(x = anio, y = colmenas_mov, color = grupo)) +
geom_line(linewidth = 1) +
geom_point(size = 2.5) +
ggrepel::geom_text_repel(data = mov_cba_labels, aes(label = lbl),
seed = 1, box.padding = .25, point.padding = .2,
size = 3, show.legend = FALSE) +
geom_hline(yintercept = prom_cba, linetype = 3, color = "orange") +
scale_color_manual(values = c("Argentina" = "turquoise3", "Córdoba" = "orange")) +
scale_x_continuous(breaks = min(mov_comb$anio):max(mov_comb$anio)) +
scale_y_continuous(labels = label_number(big.mark = ".", decimal.mark = ",")) +
labs(title = "Movimientos de colmenas por año (2013–2018)",
subtitle = "Etiquetas sobre la serie de Córdoba: % del total nacional | Línea naranja: promedio provincial",
x = "Año", y = "Colmenas en movimiento", color = "Grupo") +
theme_minimal(base_size = 12) +
theme(legend.position = "top", plot.title.position = "plot",
plot.title = element_text(face = "bold"))Práctica de subconjunto y exploración de contenido.
## fecha_actualizacion provincia_id provincia departamento_id
## Min. :2025-06-25 Length:26 Length:26 Length:26
## 1st Qu.:2025-06-25 Class :character Class :character Class :character
## Median :2025-06-25 Mode :character Mode :character Mode :character
## Mean :2025-06-25
## 3rd Qu.:2025-06-25
## Max. :2025-06-25
## departamento apiarios colmenas
## Length:26 Min. : 13.0 Min. : 195
## Class :character 1st Qu.: 52.5 1st Qu.: 1853
## Mode :character Median : 108.0 Median : 7206
## Mean : 184.2 Mean : 15387
## 3rd Qu.: 192.5 3rd Qu.: 13608
## Max. :1116.0 Max. :102421
## [1] 26 7
## [1] "fecha_actualizacion" "provincia_id" "provincia"
## [4] "departamento_id" "departamento" "apiarios"
## [7] "colmenas"
Limpieza mínima de tipos (apiarios/colmenas a numéricos) para sumar al panorama nacional.
renapa_nac <- renapa_a %>%
mutate(provincia = str_squish(provincia),
apiarios = parse_number(as.character(apiarios)),
colmenas = parse_number(as.character(colmenas)))Agregado por provincia (nacional).
renapa_nac_sum <- renapa_nac %>%
group_by(provincia) %>%
summarise(
apiarios = sum(apiarios, na.rm = TRUE),
colmenas = sum(colmenas, na.rm = TRUE),
.groups = "drop")Gráfico de barra, apiarios por provincia.
ggplot(renapa_nac_sum, aes(x = reorder(provincia, apiarios), y = apiarios)) +
geom_col(fill = "turquoise") +
coord_flip() +
labs(title = "Apiarios por Provincia (RENAPA 2025)",
x = "PROVINCIAS",
y = "APIARIOS") +
theme_light()Preparación Renapa Colmena por departamento.
renapa_cba <- renapa_a %>%
filter(normaliza(provincia) == "cordoba") %>%
mutate(apiarios = parse_number(as.character(apiarios)),
colmenas = parse_number(as.character(colmenas))) %>%
group_by(departamento) %>%
summarise(apiarios = sum(apiarios, na.rm = TRUE),
colmenas = sum(colmenas, na.rm = TRUE),
.groups = "drop") %>%
mutate(dep_norm = normaliza(departamento))ggplot(top5_apiarios, aes(x = reorder(provincia, apiarios), y = apiarios)) +
geom_col(fill = "orange") +
coord_flip() +
labs(title = "Top 5 Provincias por Cantidad de Apiarios.",
subtitle= " Argentina",
x = "PROVINCIAS",
y = "NÚMERO DE APIARIOS") +
theme_light()Pruebo un nuevo gráfico: Top 5 relación apiarios vs colmenas.
df5 <- top5_apiarios |>
mutate(provincia = reorder(provincia, colmenas))
ggplot(df5) + geom_segment(aes(y = provincia, yend = provincia,
x = apiarios, xend = colmenas), linewidth = 1) +
geom_point(aes(x = apiarios, y = provincia), size = 3) +
geom_point(aes(x = colmenas, y = provincia), size = 3) +
scale_x_log10(labels = scales::label_number(big.mark=".", decimal.mark=",")) +
labs(title = "Top 5 de Provincias Argentinas, relación entre Apiarios Y Colmenas",
subtitle = " APIARIOS (izq.) con COLMENAS (der.) escala log10",
x = "CANTIDAD (log10)", y = "PROVINCIA") + theme_light()Intento mejorar la prueba anterior, uso un Dumbbell gráfico de mancuerna para mostrar la variación o diferencia entre los dos puntos en escala log10. Razón:Colmenas-Apiarios.
df5 <- top5_apiarios |>
dplyr::mutate(provincia = reorder(provincia, colmenas),
ratio = colmenas / pmax(apiarios, 1),
xlab_pos = colmenas * 1.25)
xmin <- min(df5$apiarios, df5$colmenas, na.rm = TRUE)
xmax <- max(df5$apiarios, df5$colmenas, na.rm = TRUE)
ggplot(df5, aes(y = provincia)) +
geom_segment(aes(x = apiarios, xend = colmenas, yend = provincia),
linewidth = 1.2, color = "#9aa0a6") +
geom_point(aes(x = apiarios, color = "Apiarios"), size = 3) +
geom_point(aes(x = colmenas, color = "Colmenas"), size = 3) +
geom_text(aes(x = xlab_pos, label = paste0("x", round(ratio, 1))),
size = 3, hjust = 0, color = "#444") +
scale_x_log10(limits = c(xmin * 0.8, xmax * 1.6),
breaks = scales::breaks_log(n = 6),
labels = scales::label_number(big.mark = ".", decimal.mark = ",")) +
annotation_logticks(sides = "b") +
scale_color_manual( name = NULL,values = c("Apiarios" = "orange", "Colmenas" = "turquoise3")) +
labs( title = "Top 5 Provincias: Apiarios vs. Colmenas",
x = "CANTIDAD (escala log10)", y = "PROVINCIA", caption = "Fuente: RENAPA") +
theme_minimal(base_size = 12) + theme(legend.position = "top",plot.title.position = "plot",
plot.title = element_text(face = "bold"))Gráfico: Intensidad Relativa, Colmenas por Apiarios.
ggplot(df5, aes(x = ratio, y = reorder(provincia, ratio))) +
geom_col(fill = "turquoise3") +
geom_text(aes(label = paste0("x", round(ratio, 1))),
hjust = 1.05, color = "black", size = 3) +
scale_x_continuous(labels = scales::label_number(accuracy = 0.1, decimal.mark = ",")) +
labs( title = "Intensidad Relativa: Colmenas por Apiarios ",
x = "razón (Colmenas - Apiarios)", y = "PROVINCIA") +
theme_minimal(base_size = 12)El análisis comparativo a nivel nacional nos permitió ubicar a Córdoba como una de las cinco provincias líderes en producción apícola, tanto en cantidad de colmenas como de apiarios.
Creo cobertura 2 para explorar los mismos datos en otro subconjunto sin riesgos.
Gráfico:Cobertura de monte por departamentos,provincia de Córdoba.
ggplot()+
geom_sf(data=cobertura2, aes(fill=monte), color="orange")+
scale_fill_viridis_c(breaks=seq(0, 1100, 150))+
labs(title=" Cobertura de monte por departamentos
Provincia de Córdoba",
fill="superficie(km2)")+
theme_test()
Mapa coroplético visualización por departamentos.
ggplot()+
geom_sf(data = cobertura2, aes(fill=nombre), color="white")+
labs(title="Mapa coroplético de la provincia de Córdoba
por departamento. ",
fill="")+
theme_grey()+
theme(legend.key.size = unit(0.3, "cm"),
legend.key.width = unit(0.4,"cm"),
legend.position="bottom",
axis.text = element_blank(),
axis.ticks = element_blank())
Descarga y pruebas desde Stadiamaps.(única línea que no esta visible en
el informe, decisión que resguarda mi Clave API, recomendación de uso de
clase)
mapa_base_a <- get_stadiamap(bbox = c( left = -66.95,
bottom = -35.40,
right = -61.55,
top = -29.35 ),zoom = 9, maptype = "stamen_terrain")
Creo polígono y pruebo incluir mejoras para su visualizacion.
ggmap(mapa_base_a)+
geom_sf(data=polygon_cordoba, fill=NA, color="orange", lwd=0.75, inherit.aes = FALSE)+
labs(title="Córdoba, Argentina",
caption="Fuente: OpenStreetMap")+
theme_void()
Pruebas, ajustando parámetros de manera manual.
cba_join_4326 <- st_transform(cba_join, 4326)
ggmap(mapa_base_a) +geom_sf(data = cba_join_4326, inherit.aes = FALSE,
fill = NA, color = "turquoise3", linewidth = 0.5) +
labs(title = "Provincia de Córdoba-Límites departamentales",
subtitle = "Argentina",
x = "", y = "") +theme_grey(base_size = 8)
Centros de polígonos + radios escalados, creo pts-cba.
pts_cba <- cba_join_4326 |>
sf::st_point_on_surface() |>
sf::st_transform(4326) |>
dplyr::mutate(
radius_colm = scales::rescale(colmenas, to = c(10, 40), from = range(colmenas, na.rm = TRUE)),
radius_apia = scales::rescale(apiarios, to = c(10, 40), from = range(apiarios, na.rm = TRUE)))
stopifnot(exists("pts_cba"))Con leaflet, creo mapa interactivo.
pal_colm <- colorNumeric("OrRd", pts_cba$colmenas, na.color = "#cccccc")
pal_apia <- colorNumeric("Blues", pts_cba$apiarios, na.color = "#cccccc")
lab_es <- function(type = "numeric", cuts, p) { n <- length(cuts)
if (n <= 1) return(format(cuts, big.mark=".", decimal.mark=","))
paste0(format(cuts[-n], big.mark=".", decimal.mark=",")," – ",
format(cuts[-1], big.mark=".", decimal.mark=","))}
leaflet(options = leafletOptions(preferCanvas = TRUE)) |>
addProviderTiles(providers$CartoDB.Positron) |>
addPolygons(data = cba_join_4326, color = "#777", weight = 0.7, fill = FALSE, group = "Departamentos") |>
addCircleMarkers(data = pts_cba, radius = ~radius_colm, stroke = TRUE, weight = 1, color = "#333",
fillColor = ~pal_colm(colmenas), fillOpacity = 0.8,
label = ~paste0(nombre, " — Colmenas: ", format(colmenas, big.mark=".", decimal.mark=",")),
group = "Puntos: Colmenas") |>
addCircleMarkers(data = pts_cba, radius = ~radius_apia, stroke = TRUE, weight = 1, color = "#333",
fillColor = ~pal_apia(apiarios), fillOpacity = 0.8,
label = ~paste0(nombre, " — Apiarios: ", format(apiarios, big.mark=".", decimal.mark=",")),
group = "Puntos: Apiarios") |>
addLayersControl(overlayGroups = c("Departamentos", "Puntos: Colmenas", "Puntos: Apiarios"),
options = layersControlOptions(collapsed = FALSE)) |>
addLegend(pal = pal_colm, values = pts_cba$colmenas, title = "Colmenas (RENAPA)",
position = "bottomright", labFormat = lab_es, opacity = 1, group = "Puntos: Colmenas") |>
addLegend(pal = pal_apia, values = pts_cba$apiarios, title = "Apiarios (RENAPA)",
position = "bottomright", labFormat = lab_es, opacity = 1, group = "Puntos: Apiarios") |>
hideGroup("Departamentos") |>
hideGroup("Puntos: Apiarios")A escala departamental, la distribución de la apicultura en Córdoba muestra una concentración clara (San Justo, General Roca y Cruz del Eje). Al considerar la intensidad relativa al monte (colmenas/1000 ha de monte), los mapas y el modelo lineal evidencian una relación negativa y significativa con el porcentaje de monte a mayor proporción de monte, menor intensidad relativa de colmenas. En contraste, la relación entre totales de colmenas y hectáreas de monte no resulta significativa lo que sugiere que otros factores productivos/logísticos (matriz agrícola, agua, accesibilidad, cercanía a rutas/acopios) son determinantes de la localización efectiva. A nivel nacional, Córdoba integra el top 5 en apiarios y colmenas, y exhibe una razón colmenas/apiario elevada. Temporalmente (2013–2018), su participación en movimientos de colmenas es relevante y creciente hacia 2018, reforzando su peso en el sistema apícola argentino.Próximos posibles pasos que identifico para ampliar mi análisis : incorporar indicadores de floración, calidad ambiental y clima reciente como precipitación/temperatura, para enriquecer el modelo explicativo.
## R version 4.5.1 (2025-06-13)
## Platform: aarch64-apple-darwin20
## Running under: macOS Sequoia 15.6.1
##
## Matrix products: default
## BLAS: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRblas.0.dylib
## LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## time zone: America/Argentina/Cordoba
## tzcode source: internal
##
## attached base packages:
## [1] grid stats graphics grDevices datasets utils methods
## [8] base
##
## other attached packages:
## [1] osmdata_0.3.0 leaflet_2.2.3 ggmap_4.0.2 janitor_2.2.1
## [5] stringi_1.8.7 stringr_1.5.2 scales_1.4.0 ggrepel_0.9.6
## [9] ggplot2_4.0.0 lubridate_1.9.4 tidyr_1.3.1 dplyr_1.1.4
## [13] readr_2.1.5 sf_1.0-21
##
## loaded via a namespace (and not attached):
## [1] gtable_0.3.6 httr2_1.2.1 xfun_0.53
## [4] bslib_0.9.0 htmlwidgets_1.6.4 lattice_0.22-7
## [7] tzdb_0.5.0 leaflet.providers_2.0.0 vctrs_0.6.5
## [10] tools_4.5.1 crosstalk_1.2.2 bitops_1.0-9
## [13] generics_0.1.4 curl_7.0.0 parallel_4.5.1
## [16] tibble_3.3.0 proxy_0.4-27 pkgconfig_2.0.3
## [19] Matrix_1.7-4 KernSmooth_2.23-26 RColorBrewer_1.1-3
## [22] S7_0.2.0 lifecycle_1.0.4 compiler_4.5.1
## [25] farver_2.1.2 snakecase_0.11.1 htmltools_0.5.8.1
## [28] class_7.3-23 sass_0.4.10 yaml_2.3.10
## [31] crayon_1.5.3 pillar_1.11.1 jquerylib_0.1.4
## [34] classInt_0.4-11 cachem_1.1.0 nlme_3.1-168
## [37] tidyselect_1.2.1 digest_0.6.37 purrr_1.1.0
## [40] splines_4.5.1 labeling_0.4.3 fastmap_1.2.0
## [43] cli_3.6.5 magrittr_2.0.4 utf8_1.2.6
## [46] broom_1.0.10 e1071_1.7-16 withr_3.0.2
## [49] rappdirs_0.3.3 backports_1.5.0 bit64_4.6.0-1
## [52] timechange_0.3.0 rmarkdown_2.29 httr_1.4.7
## [55] jpeg_0.1-11 bit_4.6.0 png_0.1-8
## [58] hms_1.1.3 evaluate_1.0.5 knitr_1.50
## [61] viridisLite_0.4.2 mgcv_1.9-3 rlang_1.1.6
## [64] Rcpp_1.1.0 glue_1.8.0 DBI_1.2.3
## [67] renv_1.1.5 rstudioapi_0.17.1 vroom_1.6.6
## [70] jsonlite_2.0.0 R6_2.6.1 plyr_1.8.9
## [73] units_0.8-7