Classificazione ABC di Pareto

L’analisi ABC di Pareto, da molti rinominata 80/20, rappresenta un importante strumento manageriale volto all’individuazione di fattori denominati critici.

Il famoso economista vissuto nei primi anni del ’900, enunciava che,  da un qualsiasi universo di fattori si può isolare una piccola quantità di essi in grado di determinare evidenti effetti sulle performace generali, distinguendo altresì, un gran numero di fattori, che hanno una scarsa influenza sul complesso delle performace generali.

Questo procedimento, di semplice realizzazione,  viene utilizzato anche in ambito logistico, come strumento volto alla classificazione dello stock; un numero limitato di referenze, infatti, incidono più che abbondantemente sul valore complessivo della giancenza totale. Ecco un esempio di report generato secondo questa classificazione.

Report ABC Pareto

Cod. Valore dello stock – euro % Valore % CUMULATA Valore % Articoli Classificazione
A1 68.000 68,0% 68,0% 10% A
A2 12.000 12,0% 80,0% 20% A
A3 5.000 5,0% 85,0% 30% B
A4 4.000 4,0% 89,0% 40% B
A5 2.000 2,0% 91,0% 50% C
A6 2.000 2,0% 93,0% 60% C
A7 2.000 2,0% 95,0% 70% C
A8 2.000 2,0% 97,0% 80% C
A9 1.500 1,5% 98,5% 90% C
A10 1.500 1,5% 100,0% 100% C

Nella tabella sono state create 3 classificazioni:

  • classificazione A : referenze che rappresentano l’80% del valore complessivo dello stock;
  • classificazione B: referenze che rappresentano il 10 % (dall’ 80% al 90%) del valore complessivo dello stock;
  • classificazione C: referenze che rappresentano il 10% (dal 90% al 100%) del valore complessivo dello stock.

E’ interessante è notare che il 20% percento del numero di referenze (2 referenze su 10) rappresantano l’80% del valore complessivo; ecco cosa deriva il nome classificazione 80-20.

Seppur oggi presenti moltissimi strumenti informatici più evoluti, ho pensato interssante sottoporre all’attenzione un esempio di codice SQL, ottimizzato per Oracle Application Express, che permette di calcolare l’analisi automaticamente. Questo codice, certamente, può essere ottimizzato, ma rappresenta una discreta base di partenza per chi non vuole dedicare l’ 80% del suo tempo a ‘bonificare’ dati e cimintarsi con i soliti ordinamenti e formule di excel a discapito del 20% del tempo utilizzato per riflettere, come accade nella maggior parte dei casi.

Il primo step consiste nel creare una tabella che raccolaga i dati base quali lsta delle refenze e valore complessivo delle quantità in stock.

CREATE TABLE STOCK (
 ARTICLE VARCHAR2(30),
 TOTAL_VALUE NUMBER(9,2)
);

Il secondo step consiste nel popolare di dati la tabella.

INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A1',30000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A2',8000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A3',5000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A4',2500.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A5',1600.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A6',2000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A7',2000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A8',2000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A9',1500.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A10',1500.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A4',1500.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A5',400.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A1',28000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A1',10000.00);
INSERT INTO STOCK_VALUE (ARTICLE, TOTAL_VALUE ) VALUES ('A2',4000.00);

Step 3 effettuare la query di analisi dei dati:

SELECT
 ARTICLE,
 SUM(TOTAL_VALUE),
 COUNT(*) OVER (ORDER BY SUM(TOTAL_VALUE) DESC, ARTICLE DESC ROWS UNBOUNDED PRECEDING) AS "COUNTER",
 TO_CHAR(COUNT(*) OVER (ORDER BY SUM(TOTAL_VALUE) DESC, ARTICLE DESC ROWS UNBOUNDED PRECEDING) / COUNT(*) OVER (),'09.999999') AS "% COUNTER",
 SUM(TOTAL_VALUE) AS QTY,
 TO_CHAR(SUM(TOTAL_VALUE) / (SUM(SUM(TOTAL_VALUE)) OVER()),'09.999999') AS "% QTY",
 SUM(SUM(TOTAL_VALUE)) OVER (ORDER BY SUM(TOTAL_VALUE) DESC, ARTICLE  DESC ROWS UNBOUNDED PRECEDING) AS "CUMULATE QTY",
 TO_CHAR( SUM(SUM(TOTAL_VALUE)) OVER (ORDER BY SUM(TOTAL_VALUE) DESC, ARTICLE  DESC ROWS UNBOUNDED PRECEDING)/ SUM(SUM(TOTAL_VALUE)) OVER(),'09.999999') AS "% CUM QTY",
 DECODE(
  TRUNC(((SUM(SUM(TOTAL_VALUE)) OVER (ORDER BY SUM(TOTAL_VALUE) DESC, ARTICLE  DESC ROWS UNBOUNDED PRECEDING)/ SUM(SUM(TOTAL_VALUE)) OVER())+0.099999999999999)*10),
                                                                                                                                                            9,'B',
                                                                                                                                                           10,'C',
                                                                                                                                                              'A') AS "CLASS"
FROM
( SELECT  ARTICLE, TOTAL_VALUE FROM STOCK_VALUE)
GROUP BY ARTICLE
ORDER BY "COUNTER" ASC

Ecco l’output della nostra query:

ARTICLE                        SUM(TOTAL_VALUE)       COUNTER                % COUNTER  QTY                    % QTY      CUMULATE QTY           % CUM QTY  CLASS
------------------------------ ---------------------- ---------------------- ---------- ---------------------- ---------- ---------------------- ---------- -----
A1                             68000                  1                       00.100000 68000                   00.680000 68000                   00.680000 A
A2                             12000                  2                       00.200000 12000                   00.120000 80000                   00.800000 A
A3                             5000                   3                       00.300000 5000                    00.050000 85000                   00.850000 B
A4                             4000                   4                       00.400000 4000                    00.040000 89000                   00.890000 B
A8                             2000                   5                       00.500000 2000                    00.020000 91000                   00.910000 C
A7                             2000                   6                       00.600000 2000                    00.020000 93000                   00.930000 C
A6                             2000                   7                       00.700000 2000                    00.020000 95000                   00.950000 C
A5                             2000                   8                       00.800000 2000                    00.020000 97000                   00.970000 C
A9                             1500                   9                       00.900000 1500                    00.015000 98500                   00.985000 C
A10                            1500                   10                      01.000000 1500                    00.015000 100000                  01.000000 C     

10 rows selected

Lascia un Commento

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Follow

Get every new post delivered to your Inbox.