# Categorizar una variable continua con el método de cortes naturales Jenks

> El método de cortes naturales de Jenks se usa para categorizar variables contínuas en variables ordinales; es decir, pasar de una variable numérica a la cantidad de categorías discretas que necesitemos. Este método resalta los saltos inherentes a los datos, y por lo tanto los cortes que ofrece suelen tener más sentido que cortes arbitrarios en datos continuos.

- URL: https://bastianolea.rbind.io/blog/2026-08-26/
- Fecha: 2026-08-26
- Autor: Bastián Olea Herrera
- Etiquetas: procesamiento de datos, estadística, limpieza de datos

---

El método de cortes naturales de Jenks se usa para categorizar variables contínuas en variables ordinales; es decir, pasar de una variable numérica a la cantidad de categorías discretas que necesitemos.

El método Jenks busca maximizar varianza entre clases, y minimizar varianza dentro de las clases. La gracia de Jenks es que resalta los saltos inherentes a los datos, y por lo tanto los cortes que ofrece suelen tener más sentido que cortes arbitrarios o regulares en datos continuos.

En R base se implementa con la función `classIntervals(..., style = "jenks")`, pero [el paquete `{BAMMtools}` ofrece](https://github.com/macroevolution/bammtools) una implementación en C mucho más eficiente: `getJenksBreaks()`.

Primero creemos datos de prueba, una distribucion de densidad *beta*:

``` r
library(dplyr)

datos <- tibble(
  valores = rbeta(1000, 5, 2)
  )
```

Ahora mirémoslos en un gráfico simple:

``` r
library(ggplot2)

datos |> 
  ggplot() +
  aes(x = valores) +
  geom_histogram(bins = 200)
```

![](https://bastianolea.rbind.io/blog/2026-08-26/index.markdown_strict_files/figure-markdown_strict/distribucion_beta-1.png)

Ahora usamos `getJenksBreaks()` para crear `n` *cortes* en los datos, a partir de los cuales podremos crear `n-1` grupos o categorías. Probemos, como ejemplo, con 5 cortes:

``` r
library(BAMMtools)

cortes <- getJenksBreaks(datos$valores, 5)

cortes
```

    [1] 0.1726055 0.5182463 0.6863508 0.8269625 0.9948571

Aplicamos los cortes a los datos con la función `cut()`, que *corta* variables numéricas continuas en los puntos indicados; en este caso, los cortes obtenidos con el método Jenks:

``` r
datos_categoricos <- datos |> 
  mutate(
    categoria = cut(
      valores, # variable a cortar
      labels = 1:4, # nombres de los cortes resultantes
      breaks = cortes, # vector con los cortes
      include.lowest = T
    )
  )
```

Ahora visualicemos el resultado:

``` r
datos_categoricos |> 
  ggplot() +
  aes(x = valores, fill = categoria) +
  geom_histogram(bins = 200, alpha = 0.7) +
  scale_fill_discrete(palette = "Dark2")
```

![](https://bastianolea.rbind.io/blog/2026-08-26/index.markdown_strict_files/figure-markdown_strict/metodo_jenks-1.png)

**Publicaciones sobre limpieza-de-datos:**

- [Limpiar planillas de Excel complejas en R con {unpivotr}](https://bastianolea.rbind.io/blog/unpivotr/index.md)
- [{territorial}: un paquete de R para trabajar con datos de comunas y regiones de Chile](https://bastianolea.rbind.io/blog/territorial/index.md)
- [Validar datos para prevenir problemas y errores futuros](https://bastianolea.rbind.io/blog/2026-08-21/index.md)
- [Validación de datos con {testthat} y {pointblank}](https://bastianolea.rbind.io/blog/validacion_datos/index.md)
- [Recodificando variables ordinales cuando vienen sucias y/o desde respuestas abiertas](https://bastianolea.rbind.io/blog/stringr_limpieza_ordinal/index.md)

**Publicaciones sobre procesamiento-de-datos:**

- [Limpiar planillas de Excel complejas en R con {unpivotr}](https://bastianolea.rbind.io/blog/unpivotr/index.md)
- [Validación de datos con {testthat} y {pointblank}](https://bastianolea.rbind.io/blog/validacion_datos/index.md)
- [Limpieza y validación de RUT en R](https://bastianolea.rbind.io/blog/validacion_rut/index.md)
- [Explorar datos del Censo de Población y Vivienda 2024 con R](https://bastianolea.rbind.io/blog/censo_2024/index.md)
- [Transformación de datos entre formato ancho y largo con {tidyr}](https://bastianolea.rbind.io/blog/r_introduccion/tidyr_pivotar/index.md)
