Zapas Bezpieczeństwa (ZB) 2.0 — audyt i budowa kalkulatorów
Następca metodologii zb 1.x. Wypracowany na realnym projekcie: portfel 907 SKU,
dostawcy z Turcji/Chin/Europy, plik Excel z 56 tys. formuł, sześć iteracji recenzji
profesorskiej. Zawiera nie tylko wzory, ale i katalog błędów, które NAPRAWDĘ
wystąpiły — sprawdzaj je w każdym cudzym pliku.
Filozofia
ZB chroni przed dwoma niepewnościami naraz: zmiennością popytu i zmiennością
czasu dostawy (LT). Zanim policzysz wzór — zrozum dane. Trzy pytania otwierające:
- Ile tygodni niezerowych ma historia? (n_nz < 3 → żadna statystyka nie jest uczciwa)
- Kto generuje ryzyko: popyt czy dostawca? (porównaj składniki LT×σ_D² vs D̄²×σ_LT²)
- Czy ZB kosztuje mniej niż 30% wartości rocznej SKU? (jeśli nie — problem jest
biznesowy: VMI/konsygnacja/eliminacja, nie wzór)
Tryby pracy — rozpoznaj, który dotyczy użytkownika
A. AUDYT istniejącego pliku — użytkownik przesyła Excel z obliczeniami ZB.
B. BUDOWA kalkulatora — użytkownik ma dane (historia tygodniowa + parametry
dostawców) i chce narzędzie dla portfela.
C. POJEDYNCZY SKU / pytanie metodyczne — szybka analiza lub wybór metody.
We wszystkich trybach: jednostki! Ustal na starcie, czy popyt jest dzienny czy
tygodniowy i czy LT jest w dniach czy tygodniach. Mieszanie poziomów czasu to
najczęstsze źródło ZB zawyżonego/zaniżonego o rząd wielkości. Konwencja: historia
i σ_D tygodniowo, LT w dniach → w formułach LT/7.
Tryb A — Audyt: obowiązkowa checklista
Wczytaj plik programowo (openpyxl, data_only=False ORAZ data_only=True — formuły
i wartości osobno). Sprawdź KAŻDY punkt — to realne błędy z praktyki:
- Porównanie tekstu z liczbą w IF — np.
IF(T3>1.32,...) gdzie T3 to litera
klasy XYZ. W Excelu tekst > liczba jest zawsze PRAWDĄ → warunek martwy.
Objaw: jedna gałąź nigdy nie występuje w wynikach (np. 685×SBA, 0×Croston).
- Nieistniejące funkcje —
_xludf.* (artefakt generatorów), POISSON.INV
(nie istnieje w żadnym Excelu, także 365 — używaj CRITBINOM/BINOM.INV).
IFERROR maskuje takie błędy do 0 — po cichu!
- Unarny minus przed potęgą —
EXP(-A1^2/2) liczy EXP(+A1²/2), bo w Excelu
-A1^2 = (-A1)². Zawsze pisz EXP(-(A1^2)/2).
- CV liczony z tygodniami zerowymi — zawyża zmienność, wpycha wszystko do
klasy Z. Klasyfikacja XYZ i kryterium Syntetos-Boylan: CV²_nz TYLKO z okresów
niezerowych. σ_D do wzorów ZB: z pełnej historii (to poprawne).
- Niespójna korekta fill rate — albo wszędzie LT_eff = LT/FR (podejście A,
zalecane), albo nigdzie; ZB/FR (podejście B) nie może współistnieć z A.
ROP też musi używać LT_eff, inaczej pipeline niedoszacowany dla słabych dostawców.
- ISBLANK na kolumnie z formułą — formuła zwracająca 0/"" nigdy nie jest
"blank". Bramy warunkowe buduj na wartościach (n_nz ≥ 8), nie na ISBLANK.
- Błąd propagacji w AND —
AND(ISNUMBER(X), ABS(N-X)>0.1) wybucha #VALUE!
gdy X="" — Excel NIE skraca obliczeń w AND. Używaj zagnieżdżonych IF.
- Filtr-zombie — autofiltr z zapisanym kryterium + wiersze ukryte na poziomie
wiersza; usunięcie filtra NIE odkrywa wierszy. Napraw: wyczyść filterColumn
w XML/openpyxl i ustaw row_dimensions.hidden=False.
- Dane wejściowe-defaulty — σ_LT=0 przy LT>30 dni, identyczne FR dla całego
portfela, LT>180 dni — wyglądają na niewypełnione pola, nie pomiary. Flaguj.
- Newsvendor/DDMRP w złej roli — Newsvendor tylko jednookresowo (sezon/promo);
DDMRP to polityka sterowania (bufory, ADU), nie kolejny wzór na ZB — nigdy
w autoselekcji, zawsze jako flaga "kandydat" do decyzji eksperta.
Wynik audytu podawaj jak recenzent: błędy krytyczne / niespójności metodyczne /
jakość danych / mocne strony — z liczbami (ile SKU dotkniętych, wpływ na kapitał).
Drzewo wyboru metody (AUTO) — serce metodologii
Kolejność sprawdzeń jest istotna (od dyskwalifikujących do domyślnych):
1. n_nz < 3 → MANUAL/MTO (żadna statystyka; krytyczne: ZB≈1 partia ẑ,
niekrytyczne: ZB=0, MTO/VMI)
2. p̂ > 1,32 tyg (przerywany):
a. λ = D̄×LT_eff < 5 ORAZ ẑ ≤ 2 → M8 Poisson (popyt jednostkowy!)
b. klasa Z, n_nz ≥ 8, LT_eff ≤ 13 tyg → M15 kwantyl empiryczny
c. CV²_nz > 0,49 → M13 SBA
d. inaczej → M12 Croston
(M3/M4/M5/M7/M10/M11 ZABRONIONE dla przerywanego)
3. regularny, klasa C:
a. wartość ZB > 30% wartości rocznej → MTO/VMI (koszt)
b. inaczej → M2 (20% popytu w LT_eff)
4. regularny, segment AX/AY/BX/BY:
a. σ_err dostępne i σ_err/σ_D ≤ 0,8 → M16 King z σ_err (prognoza tłumaczy strukturę)
b. inaczej → M5 King's Formula z LT_eff
Progi i uzasadnienia każdej gałęzi + wzory wszystkich 16 metod:
czytaj references/metody_zb_16.md.
Kolumnę AUTO stawiaj OBOK ręcznego wyboru użytkownika, nie zamiast — z alertem,
gdy różnica ZB przekracza 20%. Automat proponuje, człowiek decyduje.
Alerty jakości (zawsze przy portfelu)
- 🔴 n_nz < 3 → decyzja manualna
- ⚠️ metoda normalna przy popycie przerywanym
- ⚠️ M15 przycięty (LT_eff > 13 tyg przy 26 tyg historii)
- 🟡 pokrycie ZB poza 2–20 tygodni
- 🔴 kapitał: wartość ZB > 30% wartości rocznej → VMI/konsygnacja/eliminacja;
🟡 20–30% → obniż SL / prostsza metoda / MTO
- ℹ️ kandydat DDMRP (LT > 30 dni, segment AX/AY)
- ℹ️ FR odbiega od benchmarku kraju > 10 p.p.
- Δ ZB_auto vs wybrane > 20% → przegląd
Tryb B — Budowa kalkulatora
Strukturę arkuszy, układ kolumn A–BE, pasma sekcji, grupowanie, ochronę
i wszystkie pułapki techniczne openpyxl: czytaj references/struktura_v36.md.
Zasady nienegocjowalne:
- Żywe formuły Excel, nie wartości z Pythona (wyjątki: kwantyl empiryczny M15
i σ_err — oznacz jako STATYCZNE z instrukcją przeliczenia).
- Po każdym zapisie: przelicz przez LibreOffice (skrypt recalc) i wymagaj
0 błędów formuł. Ustaw fullCalcOnLoad=True.
- Waliduj liczbowo: przelicz ręcznie w Pythonie King's dla 2–3 SKU i porównaj
co do sztuki; sprawdź rozkład metod AUTO i ogony pokrycia.
- Ochrona arkuszy bez hasła: edytowalne tylko komórki wejściowe; filtrowanie,
sortowanie i formatowanie dozwolone.
- Wersjonuj plik (v3.x) i prowadź arkusz CHANGELOG — także z listą rzeczy
świadomie NIEwdrożonych i dlaczego.
Tryb C — pojedynczy SKU
Workflow jak w zb 1.x: analiza historii (CV z niezerowych!), wybór σ_LT
(PERT gdy tylko min/avg/max; MAD gdy ≥10 obserwacji), metoda z drzewa AUTO,
korekta FR przez LT_eff, ROP = D̄×(LT_eff+T_review)+ZB, walidacja z historią
(czy ZB bywał przekraczany; +20–30% marginesu ponad obserwowane maksimum).
Zasady recenzji profesorskiej (gdy oceniasz decyzje)
- Poprawność proceduralna ≠ poprawność merytoryczna: reguły mogły zadziałać,
a wynik i tak jest szumem (n_nz=1: p̂ to cenzura, nie pomiar; CV²=0 to artefakt).
- Przy popycie grudkowym (partie ~stała wielkość co kilka tygodni) sensowna
polityka to "trzymaj ≈1 partię + odnawiaj" — sprawdź, czy to nie cykliczne
zamówienie jednego klienta → wtedy awizacja/MTO zamiast zapasu.
- DDMRP vs King: DDMRP celowo używa nominalnego DLT (zawodność dostawcy →
Var_Factor, wg Ptak-Smith), King jawnie wycenia σ_LT i FR oraz gwarantuje
mierzalny CSL. Porównania liczbowe traktuj jako sanity-check (±15%), nie test.
- KPI: dla A/B regularnych MAPE/Bias/RMSE; dla klasy Z — fill rate i kapitał,
nie dokładność prognozy. KPI liczone z prognozy naiwnej oznaczaj jako
PRZYKŁADOWE — do podmiany na błędy prognozy z ERP.
- 26 tygodni historii = założenie quasi-stacjonarności; sezonowość wymaga ≥104.
Pliki referencyjne
references/metody_zb_16.md — wzory M1–M16 (Excel + interpretacja), progi
decyzyjne, tablica G(z), bibliografia. Czytaj przy obliczeniach i audycie wzorów.
references/struktura_v36.md — wzorcowa struktura pliku (13 arkuszy, kolumny
A–BE), ustawienia ochrony, pułapki openpyxl/LibreOffice. Czytaj przy budowie
lub naprawie pliku.
1---2name: zb3description: Kompleksowa metodologia Zapasu Bezpieczeństwa (ZB) 2.0 — audyt i budowa kalkulatorów Excel dla portfeli do 500+ SKU, 16 metod ZB (King, DDMRP, Croston/SBA, Fill Rate/ESC, kwantyl empiryczny, King z σ_err), automatyczne drzewo wyboru metody, ROP/S-level, korekta fill rate dostawcy (LT_eff), profile dostawców Turcja/Chiny/Europa. Użyj ZAWSZE gdy użytkownik pyta o zapas bezpieczeństwa, safety stock, ZB, ROP, punkt zamawiania, DDMRP, Croston, SBA, popyt przerywany, King's Formula, fill rate, LT_eff, poziom obsługi CSL, klasyfikację ABC/XYZ dla zapasów — a także gdy przesyła plik Excel z obliczeniami zapasów do sprawdzenia ("przeanalizuj plik", "oceń metodę", "spójrz okiem profesora logistyki"), chce zbudować kalkulator ZB dla wielu produktów, pyta "ile trzymać na magazynie" / "kiedy zamawiać", lub ma dostawców z długim czasem dostawy.4---56# Zapas Bezpieczeństwa (ZB) 2.0 — audyt i budowa kalkulatorów78Następca metodologii `zb` 1.x. Wypracowany na realnym projekcie: portfel 907 SKU,9dostawcy z Turcji/Chin/Europy, plik Excel z 56 tys. formuł, sześć iteracji recenzji10profesorskiej. Zawiera nie tylko wzory, ale i katalog błędów, które NAPRAWDĘ11wystąpiły — sprawdzaj je w każdym cudzym pliku.1213## Filozofia1415ZB chroni przed dwoma niepewnościami naraz: zmiennością popytu i zmiennością16czasu dostawy (LT). Zanim policzysz wzór — zrozum dane. Trzy pytania otwierające:171. Ile tygodni niezerowych ma historia? (n_nz < 3 → żadna statystyka nie jest uczciwa)182. Kto generuje ryzyko: popyt czy dostawca? (porównaj składniki LT×σ_D² vs D̄²×σ_LT²)193. Czy ZB kosztuje mniej niż 30% wartości rocznej SKU? (jeśli nie — problem jest20 biznesowy: VMI/konsygnacja/eliminacja, nie wzór)2122## Tryby pracy — rozpoznaj, który dotyczy użytkownika2324**A. AUDYT istniejącego pliku** — użytkownik przesyła Excel z obliczeniami ZB.25**B. BUDOWA kalkulatora** — użytkownik ma dane (historia tygodniowa + parametry26dostawców) i chce narzędzie dla portfela.27**C. POJEDYNCZY SKU / pytanie metodyczne** — szybka analiza lub wybór metody.2829We wszystkich trybach: jednostki! Ustal na starcie, czy popyt jest dzienny czy30tygodniowy i czy LT jest w dniach czy tygodniach. Mieszanie poziomów czasu to31najczęstsze źródło ZB zawyżonego/zaniżonego o rząd wielkości. Konwencja: historia32i σ_D tygodniowo, LT w dniach → w formułach LT/7.3334## Tryb A — Audyt: obowiązkowa checklista3536Wczytaj plik programowo (openpyxl, data_only=False ORAZ data_only=True — formuły37i wartości osobno). Sprawdź KAŻDY punkt — to realne błędy z praktyki:38391. **Porównanie tekstu z liczbą w IF** — np. `IF(T3>1.32,...)` gdzie T3 to litera40 klasy XYZ. W Excelu tekst > liczba jest zawsze PRAWDĄ → warunek martwy.41 Objaw: jedna gałąź nigdy nie występuje w wynikach (np. 685×SBA, 0×Croston).422. **Nieistniejące funkcje** — `_xludf.*` (artefakt generatorów), POISSON.INV43 (nie istnieje w żadnym Excelu, także 365 — używaj CRITBINOM/BINOM.INV).44 IFERROR maskuje takie błędy do 0 — po cichu!453. **Unarny minus przed potęgą** — `EXP(-A1^2/2)` liczy EXP(+A1²/2), bo w Excelu46 `-A1^2 = (-A1)²`. Zawsze pisz `EXP(-(A1^2)/2)`.474. **CV liczony z tygodniami zerowymi** — zawyża zmienność, wpycha wszystko do48 klasy Z. Klasyfikacja XYZ i kryterium Syntetos-Boylan: CV²_nz TYLKO z okresów49 niezerowych. σ_D do wzorów ZB: z pełnej historii (to poprawne).505. **Niespójna korekta fill rate** — albo wszędzie LT_eff = LT/FR (podejście A,51 zalecane), albo nigdzie; ZB/FR (podejście B) nie może współistnieć z A.52 ROP też musi używać LT_eff, inaczej pipeline niedoszacowany dla słabych dostawców.536. **ISBLANK na kolumnie z formułą** — formuła zwracająca 0/"" nigdy nie jest54 "blank". Bramy warunkowe buduj na wartościach (n_nz ≥ 8), nie na ISBLANK.557. **Błąd propagacji w AND** — `AND(ISNUMBER(X), ABS(N-X)>0.1)` wybucha #VALUE!56 gdy X="" — Excel NIE skraca obliczeń w AND. Używaj zagnieżdżonych IF.578. **Filtr-zombie** — autofiltr z zapisanym kryterium + wiersze ukryte na poziomie58 wiersza; usunięcie filtra NIE odkrywa wierszy. Napraw: wyczyść filterColumn59 w XML/openpyxl i ustaw row_dimensions.hidden=False.609. **Dane wejściowe-defaulty** — σ_LT=0 przy LT>30 dni, identyczne FR dla całego61 portfela, LT>180 dni — wyglądają na niewypełnione pola, nie pomiary. Flaguj.6210. **Newsvendor/DDMRP w złej roli** — Newsvendor tylko jednookresowo (sezon/promo);63 DDMRP to polityka sterowania (bufory, ADU), nie kolejny wzór na ZB — nigdy64 w autoselekcji, zawsze jako flaga "kandydat" do decyzji eksperta.6566Wynik audytu podawaj jak recenzent: błędy krytyczne / niespójności metodyczne /67jakość danych / mocne strony — z liczbami (ile SKU dotkniętych, wpływ na kapitał).6869## Drzewo wyboru metody (AUTO) — serce metodologii7071Kolejność sprawdzeń jest istotna (od dyskwalifikujących do domyślnych):7273```741. n_nz < 3 → MANUAL/MTO (żadna statystyka; krytyczne: ZB≈1 partia ẑ,75 niekrytyczne: ZB=0, MTO/VMI)762. p̂ > 1,32 tyg (przerywany):77 a. λ = D̄×LT_eff < 5 ORAZ ẑ ≤ 2 → M8 Poisson (popyt jednostkowy!)78 b. klasa Z, n_nz ≥ 8, LT_eff ≤ 13 tyg → M15 kwantyl empiryczny79 c. CV²_nz > 0,49 → M13 SBA80 d. inaczej → M12 Croston81 (M3/M4/M5/M7/M10/M11 ZABRONIONE dla przerywanego)823. regularny, klasa C:83 a. wartość ZB > 30% wartości rocznej → MTO/VMI (koszt)84 b. inaczej → M2 (20% popytu w LT_eff)854. regularny, segment AX/AY/BX/BY:86 a. σ_err dostępne i σ_err/σ_D ≤ 0,8 → M16 King z σ_err (prognoza tłumaczy strukturę)87 b. inaczej → M5 King's Formula z LT_eff88```8990Progi i uzasadnienia każdej gałęzi + wzory wszystkich 16 metod:91**czytaj `references/metody_zb_16.md`**.9293Kolumnę AUTO stawiaj OBOK ręcznego wyboru użytkownika, nie zamiast — z alertem,94gdy różnica ZB przekracza 20%. Automat proponuje, człowiek decyduje.9596## Alerty jakości (zawsze przy portfelu)9798- 🔴 n_nz < 3 → decyzja manualna99- ⚠️ metoda normalna przy popycie przerywanym100- ⚠️ M15 przycięty (LT_eff > 13 tyg przy 26 tyg historii)101- 🟡 pokrycie ZB poza 2–20 tygodni102- 🔴 kapitał: wartość ZB > 30% wartości rocznej → VMI/konsygnacja/eliminacja;103 🟡 20–30% → obniż SL / prostsza metoda / MTO104- ℹ️ kandydat DDMRP (LT > 30 dni, segment AX/AY)105- ℹ️ FR odbiega od benchmarku kraju > 10 p.p.106- Δ ZB_auto vs wybrane > 20% → przegląd107108## Tryb B — Budowa kalkulatora109110Strukturę arkuszy, układ kolumn A–BE, pasma sekcji, grupowanie, ochronę111i wszystkie pułapki techniczne openpyxl: **czytaj `references/struktura_v36.md`**.112113Zasady nienegocjowalne:114- Żywe formuły Excel, nie wartości z Pythona (wyjątki: kwantyl empiryczny M15115 i σ_err — oznacz jako STATYCZNE z instrukcją przeliczenia).116- Po każdym zapisie: przelicz przez LibreOffice (skrypt recalc) i wymagaj117 **0 błędów formuł**. Ustaw fullCalcOnLoad=True.118- Waliduj liczbowo: przelicz ręcznie w Pythonie King's dla 2–3 SKU i porównaj119 co do sztuki; sprawdź rozkład metod AUTO i ogony pokrycia.120- Ochrona arkuszy bez hasła: edytowalne tylko komórki wejściowe; filtrowanie,121 sortowanie i formatowanie dozwolone.122- Wersjonuj plik (v3.x) i prowadź arkusz CHANGELOG — także z listą rzeczy123 świadomie NIEwdrożonych i dlaczego.124125## Tryb C — pojedynczy SKU126127Workflow jak w zb 1.x: analiza historii (CV z niezerowych!), wybór σ_LT128(PERT gdy tylko min/avg/max; MAD gdy ≥10 obserwacji), metoda z drzewa AUTO,129korekta FR przez LT_eff, ROP = D̄×(LT_eff+T_review)+ZB, walidacja z historią130(czy ZB bywał przekraczany; +20–30% marginesu ponad obserwowane maksimum).131132## Zasady recenzji profesorskiej (gdy oceniasz decyzje)133134- Poprawność proceduralna ≠ poprawność merytoryczna: reguły mogły zadziałać,135 a wynik i tak jest szumem (n_nz=1: p̂ to cenzura, nie pomiar; CV²=0 to artefakt).136- Przy popycie grudkowym (partie ~stała wielkość co kilka tygodni) sensowna137 polityka to "trzymaj ≈1 partię + odnawiaj" — sprawdź, czy to nie cykliczne138 zamówienie jednego klienta → wtedy awizacja/MTO zamiast zapasu.139- DDMRP vs King: DDMRP celowo używa nominalnego DLT (zawodność dostawcy →140 Var_Factor, wg Ptak-Smith), King jawnie wycenia σ_LT i FR oraz gwarantuje141 mierzalny CSL. Porównania liczbowe traktuj jako sanity-check (±15%), nie test.142- KPI: dla A/B regularnych MAPE/Bias/RMSE; dla klasy Z — fill rate i kapitał,143 nie dokładność prognozy. KPI liczone z prognozy naiwnej oznaczaj jako144 PRZYKŁADOWE — do podmiany na błędy prognozy z ERP.145- 26 tygodni historii = założenie quasi-stacjonarności; sezonowość wymaga ≥104.146147## Pliki referencyjne148149- `references/metody_zb_16.md` — wzory M1–M16 (Excel + interpretacja), progi150 decyzyjne, tablica G(z), bibliografia. Czytaj przy obliczeniach i audycie wzorów.151- `references/struktura_v36.md` — wzorcowa struktura pliku (13 arkuszy, kolumny152 A–BE), ustawienia ochrony, pułapki openpyxl/LibreOffice. Czytaj przy budowie153 lub naprawie pliku.