Análisis ABC de Inventarios

Clasificación de Productos según su Valor Anual de Consumo

Autor/a

Sara Acosta Rosas

Fecha de publicación

12 de noviembre de 2026

0.1 Resumen

El análisis ABC es una técnica de clasificación de inventarios basada en el principio de Pareto, que permite identificar los productos que generan el mayor impacto económico dentro de una organización.

El objetivo de este estudio es clasificar los artículos de inventario en categorías A, B y C para apoyar la toma de decisiones relacionadas con compras, almacenamiento y control de inventarios.

0.2 Introducción

Las organizaciones suelen administrar cientos o miles de artículos de inventario. Sin embargo, no todos tienen la misma importancia económica.

El análisis ABC permite priorizar aquellos productos que representan la mayor proporción del valor monetario total del inventario, facilitando la asignación eficiente de recursos.

0.3 Marco Teórico

0.3.1 Principio de Pareto

El análisis ABC se fundamenta en el principio de Pareto, que establece que aproximadamente:

  • El 20% de los artículos representa el 80% del valor.
  • El 30% de los artículos representa el 15% del valor.
  • El 50% de los artículos representa el 5% del valor.

0.3.2 Clasificación ABC

Categoría Porcentaje acumulado del valor
A 0% - 80%
B 80% - 95%
C 95% - 100%

0.4 Metodología

0.4.1 Paquetes Utilizados

library(dplyr)
library(ggplot2)
library(knitr)
library(kableExtra)
library(scales)

0.4.2 Base de Datos

Se dispone de información de demanda anual y costo unitario de 15 productos.

  Producto = c(
    "Motor", "Rodamiento", "Banda", "Sensor",
    "Tornillo", "Engrane", "Válvula",
    "Interruptor", "Cable", "Filtro",
    "Empaque", "Fusible", "Lubricante",
    "Resorte", "Tuerca"
  )
Demanda = c(
    50, 300, 200, 80,
    5000, 120, 60,
    150, 800, 400,
    1000, 3000, 200,
    1500, 4000
  )
Costo = c(
    1000, 50, 40, 250,
    2, 150, 180,
    30, 10, 25,
    5, 1.5, 50,
    3, 1
  )

inventario <- data.frame(
Producto,
Demanda,
Costo  
)

inventario
      Producto Demanda  Costo
1        Motor      50 1000.0
2   Rodamiento     300   50.0
3        Banda     200   40.0
4       Sensor      80  250.0
5     Tornillo    5000    2.0
6      Engrane     120  150.0
7      Válvula      60  180.0
8  Interruptor     150   30.0
9        Cable     800   10.0
10      Filtro     400   25.0
11     Empaque    1000    5.0
12     Fusible    3000    1.5
13  Lubricante     200   50.0
14     Resorte    1500    3.0
15      Tuerca    4000    1.0

0.5 Cálculo del Valor Anual de Consumo

La fórmula utilizada es:

\[ Valor\ Anual = Demanda \times Costo\ Unitario \]

inventario <- inventario %>%
  mutate(
    Valor_Anual = Demanda * Costo
  )

inventario
      Producto Demanda  Costo Valor_Anual
1        Motor      50 1000.0       50000
2   Rodamiento     300   50.0       15000
3        Banda     200   40.0        8000
4       Sensor      80  250.0       20000
5     Tornillo    5000    2.0       10000
6      Engrane     120  150.0       18000
7      Válvula      60  180.0       10800
8  Interruptor     150   30.0        4500
9        Cable     800   10.0        8000
10      Filtro     400   25.0       10000
11     Empaque    1000    5.0        5000
12     Fusible    3000    1.5        4500
13  Lubricante     200   50.0       10000
14     Resorte    1500    3.0        4500
15      Tuerca    4000    1.0        4000

0.6 Ordenamiento de Productos

inventario_abc <- inventario %>%
  arrange(desc(Valor_Anual))

inventario_abc
      Producto Demanda  Costo Valor_Anual
1        Motor      50 1000.0       50000
2       Sensor      80  250.0       20000
3      Engrane     120  150.0       18000
4   Rodamiento     300   50.0       15000
5      Válvula      60  180.0       10800
6     Tornillo    5000    2.0       10000
7       Filtro     400   25.0       10000
8   Lubricante     200   50.0       10000
9        Banda     200   40.0        8000
10       Cable     800   10.0        8000
11     Empaque    1000    5.0        5000
12 Interruptor     150   30.0        4500
13     Fusible    3000    1.5        4500
14     Resorte    1500    3.0        4500
15      Tuerca    4000    1.0        4000

0.7 Porcentaje Acumulado

inventario_abc <- inventario_abc %>%
  mutate(
    Porcentaje = Valor_Anual /
      sum(Valor_Anual) * 100,
    
    Acumulado = cumsum(Porcentaje)
  )

inventario_abc
      Producto Demanda  Costo Valor_Anual Porcentaje Acumulado
1        Motor      50 1000.0       50000  27.427318  27.42732
2       Sensor      80  250.0       20000  10.970927  38.39824
3      Engrane     120  150.0       18000   9.873834  48.27208
4   Rodamiento     300   50.0       15000   8.228195  56.50027
5      Válvula      60  180.0       10800   5.924301  62.42457
6     Tornillo    5000    2.0       10000   5.485464  67.91004
7       Filtro     400   25.0       10000   5.485464  73.39550
8   Lubricante     200   50.0       10000   5.485464  78.88097
9        Banda     200   40.0        8000   4.388371  83.26934
10       Cable     800   10.0        8000   4.388371  87.65771
11     Empaque    1000    5.0        5000   2.742732  90.40044
12 Interruptor     150   30.0        4500   2.468459  92.86890
13     Fusible    3000    1.5        4500   2.468459  95.33736
14     Resorte    1500    3.0        4500   2.468459  97.80581
15      Tuerca    4000    1.0        4000   2.194185 100.00000

0.8 Clasificación ABC

inventario_abc <- inventario_abc %>%
  mutate(
    Clase = case_when(
      Acumulado <= 80 ~ "A",
      Acumulado <= 95 ~ "B",
      TRUE ~ "C"
    )
  )

inventario_abc
      Producto Demanda  Costo Valor_Anual Porcentaje Acumulado Clase
1        Motor      50 1000.0       50000  27.427318  27.42732     A
2       Sensor      80  250.0       20000  10.970927  38.39824     A
3      Engrane     120  150.0       18000   9.873834  48.27208     A
4   Rodamiento     300   50.0       15000   8.228195  56.50027     A
5      Válvula      60  180.0       10800   5.924301  62.42457     A
6     Tornillo    5000    2.0       10000   5.485464  67.91004     A
7       Filtro     400   25.0       10000   5.485464  73.39550     A
8   Lubricante     200   50.0       10000   5.485464  78.88097     A
9        Banda     200   40.0        8000   4.388371  83.26934     B
10       Cable     800   10.0        8000   4.388371  87.65771     B
11     Empaque    1000    5.0        5000   2.742732  90.40044     B
12 Interruptor     150   30.0        4500   2.468459  92.86890     B
13     Fusible    3000    1.5        4500   2.468459  95.33736     C
14     Resorte    1500    3.0        4500   2.468459  97.80581     C
15      Tuerca    4000    1.0        4000   2.194185 100.00000     C

0.9 Tabla Final

inventario_abc %>%
  select(
    Producto,
    Demanda,
    Costo,
    Valor_Anual,
    Porcentaje,
    Acumulado,
    Clase
  ) %>%
  mutate(
    Porcentaje = round(Porcentaje,2),
    Acumulado = round(Acumulado,2)
  ) %>%
  kable(
    caption = "Clasificación ABC de los Inventarios"
  ) %>%
  kable_styling(
    bootstrap_options = c(
      "striped",
      "hover",
      "condensed"
    )
  )
Clasificación ABC de los Inventarios
Producto Demanda Costo Valor_Anual Porcentaje Acumulado Clase
Motor 50 1000.0 50000 27.43 27.43 A
Sensor 80 250.0 20000 10.97 38.40 A
Engrane 120 150.0 18000 9.87 48.27 A
Rodamiento 300 50.0 15000 8.23 56.50 A
Válvula 60 180.0 10800 5.92 62.42 A
Tornillo 5000 2.0 10000 5.49 67.91 A
Filtro 400 25.0 10000 5.49 73.40 A
Lubricante 200 50.0 10000 5.49 78.88 A
Banda 200 40.0 8000 4.39 83.27 B
Cable 800 10.0 8000 4.39 87.66 B
Empaque 1000 5.0 5000 2.74 90.40 B
Interruptor 150 30.0 4500 2.47 92.87 B
Fusible 3000 1.5 4500 2.47 95.34 C
Resorte 1500 3.0 4500 2.47 97.81 C
Tuerca 4000 1.0 4000 2.19 100.00 C

0.10 Resultados

0.10.1 Distribución por Categoría

table(inventario_abc$Clase)

A B C 
8 4 3 

0.10.2 Valor Total por Categoría

inventario_abc %>%
  group_by(Clase) %>%
  summarise(
    Valor_Total = sum(Valor_Anual)
  ) %>%
  kable(
    caption = "Valor Económico por Categoría"
  )
Valor Económico por Categoría
Clase Valor_Total
A 143800
B 25500
C 13000

0.11 Diagrama de Pareto

ggplot(
  inventario_abc,
  aes(
    x = reorder(
      Producto,
      -Valor_Anual
    ),
    y = Valor_Anual
  )
) +
  geom_col(
    fill = "steelblue"
  ) +
  labs(
    title = "Valor Anual por Producto",
    x = "Producto",
    y = "Valor Anual ($)"
  ) +
  theme_minimal() +
  theme(
    axis.text.x =
      element_text(
        angle = 45,
        hjust = 1
      )
  )

0.12 Curva ABC (Pareto)

ggplot(
  inventario_abc,
  aes(
    x = reorder(
      Producto,
      -Valor_Anual
    ),
    y = Acumulado,
    group = 1
  )
) +
  geom_line(
    color = "red",
    linewidth = 1.2
  ) +
  geom_point(
    size = 3,
    color = "blue"
  ) +
  geom_hline(
    yintercept = 80,
    linetype = "dashed",
    color = "darkgreen"
  ) +
  geom_hline(
    yintercept = 95,
    linetype = "dashed",
    color = "orange"
  ) +
  labs(
    title = "Curva ABC de Inventarios",
    x = "Producto",
    y = "Porcentaje Acumulado (%)"
  ) +
  theme_minimal() +
  theme(
    axis.text.x =
      element_text(
        angle = 45,
        hjust = 1
      )
  )

1 Interpretación

Los productos clasificados como categoría A representan la mayor parte del valor económico invertido en inventario.

Estos artículos requieren:

-Control estricto. -Pronósticos precisos. -Revisiones frecuentes. -Políticas de reabastecimiento más rigurosas.

Los productos de categoría B requieren un control intermedio.

Los productos de categoría C representan una baja proporción del valor monetario total y pueden administrarse mediante sistemas de control más simples.

2 Conclusiones

1.El análisis ABC permitió identificar los artículos más importantes económicamente.

2.La categoría A concentra la mayor parte de la inversión.

3.La organización puede enfocar sus esfuerzos de gestión en un número reducido de productos críticos.

4.La metodología facilita la optimización de compras, almacenamiento y control de inventarios.