Proqnoz: Xarici şirkətləri necə tanıyırsınız?

Aşağıdakı məqalə, burada mövcud olan Təchizat Zəncirinin Proqnozu üçün Məlumat Elmi kitabımdan bir hissədir. Digər məqalələrimi burada tapa bilərsiniz:

  • Çöldən kənarları aşkar edin
  • Təchizat zəncirinin proqnozu üçün maşın öyrənmə
  • Aralıq proqnoz üçün Croston proqnozu
  • Proqnoz KPI: RMSE, MAE, MAPE & Bias
"Bu gün (...) bu tip materialı müəyyənləşdirməyə çalışmaq niyyətində deyiləm və bəlkə də bunu heç vaxt başa düşə bilməzdim. Ancaq görəndə bilirəm. "Potter Stüart

1964-cü ildə Potter Stüart Birləşmiş Ştatlar Ali Məhkəməsində hakim idi. Xaricdə olanları müzakirə etmirdi, amma Aşiqlər filminin ədəbsiz olub-olmaması barədə. Proqnoz üzərində işlədiyiniz zaman qeydinizin daha yaxşı olduğunu görərsiniz. Bunun yeganə praktik tərif olduğunu görəndə bilsəm də, bu satıcılar tədarük zənciri üçün real təhlükə yaradır.Bu yüksək (və ya aşağı) nöqtələr proqnozunuzda və ya təhlükəsizlik ehtiyatlarınızda həddindən artıq çoxluğa səbəb olur və nəticədə (ən yaxşı halda) əl düzəlişləri və ya (ən pis halda) ölü səhmlər, itkilər və pis bir öküz effekti. Bloqlara, kitablara, məqalələrə və ya proqnozlaşdırma proqramlarına baxdıqda, xarici aşkarlama məsələsi çox vaxt cavabsız qalır. Təəssüf doğurur. Xarici aşkarlama ciddi bir işdir. Bu satıcılar müasir tədarük zəncirlərində baş verir. Bunun iki əsas səbəbi var: səhvlər və səhvlər. Bu cür səhvləri və ya kodlaşdırma səhvlərini aşkarlayırsınızsa, onların yenidən baş verməməsi üçün bir proses təkmilləşdirilməsi tələb olunur. İstisna tələb Bəzi tələb müşahidələri real olsa da, bu onların müstəsna olmadığını və təmizlənməməli və hamarlanmaması lazım deyil. Bu cür fövqəladə satışlar, tədarük zəncirlərində nadir deyil. Təqdimatlar, marketinq, qəribə müştəri davranışı və ya lağlağı düşünün. Tipik olaraq, proqnozunuz köhnə, demək olar ki, köhnəlmiş bir inventarın aradan qaldırılması üçün ötən il etdiyiniz müstəsna 80% satışları nəzərə almaq istəməyə bilər. Xarici məhsulu müəyyənləşdirə və hamarlaya bilsəniz, daha yaxşı bir proqnoz alacaqsınız. Proqnoz səhvinin yalnız xarici satıcılar tərəfindən təmizlənməsi sayəsində bir neçə faiz azaldılmış çoxsaylı nümunələr gördüm. Əslində qeyd nə qədər böyükdürsə, bu aşkarlama və təmizlənməni avtomatlaşdırmaq bir o qədər vacibdir. Görək bunu necə edə bilərik. Bu yazıda, bu xarici istehsalçıları müəyyənləşdirmək və onları məqbul səviyyəyə gətirmək üçün üç yarım fikir müzakirə olunur.

Fikir № 1 - Vinsorizasiya

Dediyim kimi, bir satıcı olduqca yüksək və ya aşağı bir dəyərdir. Bu sadə tərifə əsaslanaraq, çöldən kənarlaşdırıcıları müəyyənləşdirmək üçün ilk fikir, məlumat dəstinin ən yüksək və ən aşağı nöqtələrini sadəcə kəsməkdir. Aşağıdakı cədvəllərdəki iki (dummy) verilənlər bazası üçün bunun necə işləyəcəyini nəzərdən keçirək.

Bu ilk texnika sadəcə tarixi ehtiyaclarımızın üst / alt x% -ni xth faiz səviyyəsinə endirir.

X-ci faiz, qrupdakı müşahidələrin x% -inin düşdüyü bir dəyərdir. Məsələn, bir məhsul üçün tələb müşahidələrinin 99% -i 99-cu faizdən aşağıdır.

Tələbi sadəcə müəyyən bir faizə qədər azaltmağın bu üsulu winsorization adlanır. Adı 20-ci əsrin birinci yarısından bir statistik Charles P. Winsor-dan gəlir. Yuxarıdakı iki dummy məlumat dəstimizdə 1-ci və 99-cu faizlərə baxsaq, aşağıdakıları əldə edirik:

Bu cədvəldə hər iki məlumat dəstində bütün aşağı dəyərlərin 4.4-ə qədər artırılacağını görürük. Aşağıdakı şəkildə görə bilərsiniz ki, bu bizim məlumat dəstimizin bir hissəsini kəsdi. Çatdırıcılar olmadan məlumat qeydləri üçün yüksək dəyərlər 16.6-a (bax Şəkil 10.1) və 70.9-a qədər azaldıldı (bax Şəkil 10.2). Winsorization 4 və ya 5 kimi dəyirmi nəticələr vermədiyini gördünüz. Bunun əvəzinə bu 4.4 aldıq. Dəqiqləşdirilmiş məlumatların 99% -ni kəsişdiyi dəqiq bir dəyərimiz olmadığından, xətti yaxınlaşma iki ən yaxın dəyər əsasında aparılır. Beləliklə, yuvarlaq ədədlər əvəzinə bu nömrələri əldə etdik.

Bu texnikadan razıyıq? Xeyr, biz deyilik. - Saxta çöldən yayımlayıcıları olmayan bir məlumat toplusunda tapdıq. - Satışa çıxarılanlarla birlikdə verilən məlumatlarda, satıcını kifayət qədər azaltmadıq (100-dən 70.9-a). Əlbətdə ki, 2 nömrəli məlumat dəstindəki məhsulu daha da azaltmaq üçün qalibiyyətin yuxarı həddinin 99% -dən 95% -ə endirilməsini təklif etmək olar, lakin təəssüf ki, bu da 1 nömrəli məlumat dəstinə təsir edəcəkdir. Bu yaxşı bir həll deyil. Tələbimizi 4.4 səviyyəsinə qaldırmamaq üçün biri də bu mərtəbəni silməyi təklif edə bilər. Bəs tələbi olmayan dövrlər varsa nə etmək olar? Onları da təmizləməməliyik?

Bunu özünüz edin Excel Formulu = PERCENTILE.INC (diapazon, hədiyyə) ilə asanlıqla Excel-də bir hüceyrə aralığının müxtəlif faizlərini axtara bilərsiniz. Əlbəttə ki, yuxarı həddə (0.95 ilə 0.99 arasındakı bir dəyər ilə) bir dəfə və aşağı həddə (0.01 ilə 0.05 arasındakı bir dəyər ilə) bir dəfə bu düsturdan istifadə etməlisiniz. Python NumPy sayəsində Python-da quraşdırılmış məlumatlarımızı asanlıqla genişləndirə bilərik. Np.percentile (massiv, faiz) funksiyası ilə bir sıra müxtəlif faizləri hesablaya bilərik.

np ali_limit = np.percentile şəklində idxal et (Array, 99) aşağı_limit = np.percentile (Array, 1)

Diqqət yetirin ki, faizlə işləyən bir funksiya Excel-də olduğu kimi bir nisbət kimi deyil (0 ilə 1 arasındakı bir dəyər kimi) bir faiz kimi istifadə edir. Np.clip (array, min, max) funksiyası ilə serialı aşağı və yuxarı həddlərə asanlıqla kəsə bilərik:

array = np.clip (sıra, a_min = aşağı_limit, a_max = ali_limit)

Fikir # 2 standart sapma

Gördüyümüz kimi, winsorization, xarici görünüşü istisna etmək üçün mükəmməl bir vasitə deyildi, çünki onlar müstəsna görünməsələr də, rekordun yüksək və aşağı dəyərlərini istisna edirdilər. Digər bir yanaşma, tələbatın orta orta ətrafında dəyişməsinə baxmaq və bu orta səviyyədən çox uzaq olan dəyərləri istisna etmək olardı. Standart sapmanı aşağıdakı kimi təyin edək:

Harada n olduqda tələb müşahidələri toplusudur. Verilən məlumatlarımızın tarixi ortalama normal olaraq paylandığını fərz etsək, tələbin iki ərəf arasında olma ehtimalını hesablaya bilərik. İştirak edilən dəqiq riyaziyyat məqalənin əhatəsindədir və təəssüf ki, normallıq fərziyyəsinə çox vaxt ciddi şəkildə əməl olunmur. Bu iki həddi dəyər hər iki istiqamətdə standart sapmadan (σ) x qat səpələnmə ilə tələbat ortalamasına (μ) yönəldilmişdir. Tələbat nə qədər xaotik olsa (yəni böyükdür), eşiklər daha genişdir.

Məsələn, aralığında 98% şansımız var: orta tələb +/- 2.33 dəfə standart sapma (yuxarıdakı şəkildəki kimi). Beləliklə, üst və alt dəyərlərin ən yaxşı 1% -ni çıxarmaq istəyiriksə, ehtiyacı μ +/- 2.33 σ səviyyəsinə endiririk. Qeyd edək ki, bu, 99% ehtimalı ilə μ + 2.33 σ -dən daha az olduğunu göstərir. Və% - 2.33 σ-dən yüksək olma 99% şansı. Bunu nümunə məlumat dəstlərimizə tətbiq etsək (ilk iki cədvələ bax), bu hədləri alırıq:

Bu yeni normal hədlərin qalib gəlmə həddi ilə müqayisədə necə davrandığını görək.

Bu, Winsorization ilə qazandığımız nəticələrdən daha yaxşıdır: - Xarici olmayan məlumatlar qeydində (bax Şəkil 10.4), heç bir ehtiyac monitorinqini dəyişdirmirik (mükəmməldir - istədiyimiz kimi). - Çıxarışçı ilə məlumatların qeydində biz aşağı tələb nöqtələrini dəyişdirmirik, yalnız həqiqi satıcıdır (bax Şəkil 10.5). Xaricçini Winsorization (70.9) ilə müqayisədə daha idarəolunan məbləğə (47.9) endirsək də, bu, kifayət olmaya bilər.

Yəni indi xoşbəxtik? Hələ də yox.

Xatırladığınız kimi, səhvin tarixi orta diapazonda olduğunu güman etdik. Zəif tələbi olan bir məhsul üçün bu yaxşıdır, ancaq meyl və ya mövsümi bir məhsula sahib olduğunuz zaman həqiqi məhdudiyyət gəlir. Məsələn, aşağıda göstərilən mövsüm cədvəlində ən yüksək (və ya ən aşağı) nöqtələr artıq silmək istədiyiniz kənar şirkətlər deyil.

Aşağıdakı şəkil, bu mövsümi ehtiyac üçün winsorization və normallaşmanın necə işlədiyini göstərir.

Bu, sadəcə məna vermir: hər iki üsul mövsümi zirvələri daha yüksək səviyyəli kimi qeyd edir və real istehsalçını, yəni Y2 M11-i atlayırlar.

Bunu növbəti texnikamızla həll edəcəyik.

Özünüzü Excel edin = STDEV.P (sıra) düsturundan istifadə edərək bir hüceyrə aralığının standart sapmasını hesablaya bilərsiniz. Həmişə olduğu kimi, ortalamanı = AVERAGE (diapazon) ilə hesablaya bilərsiniz. Bu ikinizə sahib olduqdan sonra yuxarı və aşağı hədləri = NORM.INV (faizlə, orta, stdev) sayəsində hesablaya bilərsiniz. Tipik olaraq, yüksək faiz 0,99, aşağı faiz isə 0,01 olmalıdır. Python Bir sıra (məsələn, bir siyahı, DataFrame və s.) Və ya birbaşa .std () metodundan istifadə edərək DataFrame üçün np.std (Array) istifadə edərək standart sapma hesablaya bilərsiniz. Bir DataFrame df varsa, sadəcə daxil edə bilərsiniz:

m = df.mean () s = df.std ()

Bundan sonra normal ehtimalları hesablamaq üçün yenidən SciPy kitabxanasından istifadə edəcəyik. Bundan sonra DataFrame-dəki .clip metodunu hədlərimizə itələmək üçün istifadə edəcəyik.

scipy.stats idxal norması ilə # Çapdan hər bir tələbə müşahidə olunma ehtimalları (norm.cdf (df.qiymətlər, m, s). Ətrafında (2))
limit_high = norm.ppf (0.99, m, s) limit_low = norm.ppf (0.01, m, s) df = df.clip (aşağı = limit_low, yuxarı = limit_high)

Fikir # 3 standart sapma xətası

Xarici materialları qeyd etməli olduğumuz ikinci fikir, hər müşahidəni tələbin orta ilə müqayisə etmək idi. Bir müşahidə və tarixi məna arasındakı fərqin əhəmiyyətsiz olduğuna görə bir tendensiya və ya bir mövsümlük olsaq, bunun məna vermədiyini gördük. Bir satıcını təyin etməyə qayıdaq: Satıcı gözləmədiyiniz bir dəyərdir. Monty Python'dakı İspan İnkvizisiyasında olduğu kimi. Yəni, satıcı proqnozunuzdan (yəni proqnozunuzdan) çox olan bir dəyərdir. Xaricləri müəyyən etmək üçün, buna görə proqnoz səhvini təhlil edəcəyik və hansı dövrlərin istisna olmaqla səhv olduğunu müəyyənləşdirəcəyik. Daha əvvəl istifadə olunan standart sapma yanaşmasını istifadə edirik. Yuxarıdakı mövsümi nümunəni götürək. Tarixi tələbi bunun üçün hazırladığımız sadə (lakin mövsümi) proqnozla müqayisə edəcəyik.

Əgər belə bir proqnoza görə səhvimizi hesablasaq (bu sadəcə tarixi ehtiyacların orta hesabla), orta səhv 0.4 və standart 3.2 sapma əldə edərdik (əlbəttə ki bu səhv böyük təsir göstərir bizdə var) Y2 M11). Bu mənada 99% etibarlılıq intervalı alsaydıq, proqnoz səhvlərini -0.4 +/- 2.33 x 3.2 = -8.7-ə endirərdik. Aşağıdakı şəkil bu həddlərin mövsümi tələb proqnoza nə dərəcədə uyğun olduğunu göstərir.

Artıq Y2 M11-dən satıcısını düzəldə bilərik. Tələb 19 idi, ancaq bu müddət üçün proqnoz 5 idi. Maksimum icazə verilən dəyər sonra 5 + 7 = 12. Bu, Y2 M11 (19) istehsalçısını bu yeni dəyər (12) ilə əvəz edə biləcəyimiz deməkdir.

Nəticə Bu ağıllı aşkarlama metodu ilə - ortada olan tələbatdakı sadə dalğalanma əvəzinə proqnoz səhv sapmasının təhlili - xarici maliyyələşdiriciləri daha dəqiq qeyd edə bilərik və onları uyğun bir ölçüdə azalda bilərik. Yuxarıdakı şəkildən göründüyü kimi, normallaşma və uduşlaşma bu mövsümi tələb üçün mənalı nəticələr verə bilmədi. Bu metodu dəqiq tənzimləyin Bir hədd olaraq neçə standart sapma etməlisiniz? əlbəttə ki, sınaqdan keçirmək üçün ...

Bunu özünüz edin Python Bir proqnoz olaraq bir sütunlu bir Pandas DataFrame və digəri bir tələb (eksponent mənbəli hamarlaşdırma modellərimizin tipik çıxışı) varsa bu koddan istifadə edə bilərik:

df ["səhv"] = df ["proqnoz"] - df ["tələb"] m = df ["səhv"]. orta () s = df ["səhv"]. scipy.stats idxal normasından std ()
limit_high = norm.ppf (0.99, m, s) + df ["proqnozlaşdırma"] limit_low = norm.ppf (0.01, m, s) + df ["proqnozlaşdırma"] df ["Yenilənib"] = df ["Tələb"]. clip (aşağı = limit_low, yuxarı = limit_high) çap (df)

Əlavə mil get!

Proqnoz səhvini təhlil etmək və məqbul səhvlər üçün bir hədd təyin etmək fikrimiz barədə düşünsəniz, həqiqətən bir az problemimiz var. Hesablanmış ərəfə xaricdəki məhsullar daxil olmaqla müəyyən edilmiş məlumatlara əsaslanır. Bu satış xətası dəyişikliyini yuxarıya doğru aparır ki, məqbul həddi təhrif və həddən artıq qiymətləndirilir. Bunu düzəltmək üçün, satıcını əsl tələb qeydinə əsasən hesablanmış həddi dəyərinə, lakin bu xüsusi istehsalçı olmadan bir rekord üçün hesablanmış bir həddi qədər azaltmaq olmaz. Budur resept:

  1. Tarixi tələbə qarşı ilkin proqnozu tamamlayın.
  2. Səhv, səhv orta və səhv standart sapma hesablayın
  3. Aşağı və yuxarı icazə verilən hədləri hesablayın (orta səhv və standart sapma əsasında).
  4. Əvvəlcədən təsvir olunduğu kimi çöldü müəyyənləşdirin
  5. Səhvin orta səviyyəsini və xarici sərbəst buraxılmadan standart sapma hesablayın.
  6. Bu yeni dəyərlərə əsaslanaraq aşağı və yuxarı icazə verilən hədləri yeniləyin.
  7. Xarici dəyərləri yeni ərəfəyə əsaslanaraq yeniləyin.

Mövsümi nümunəmizi yuxarıdan götürsək, əvvəlcə 0.4 və standart standart sapma 3.22 nisbətində bir səhv səhvimiz var. Y2 M11 nöqtəsini çıxarırıqsa, səhv səhv ortalama -0.1 və 2.3 standart bir sapma əldə edirik. Bu o deməkdir ki, proqnoza yaxın olan hədlər -5,3,5,2-dir. Y2 M11-dəki xarici aparatımız 10-a (əvvəlki texnikamızla 12 əvəzinə) yenilənəcəkdir.

Bunu özünüz edin Kodumuzu əvvəlki fikirlərimizdən geri alırıq və orta səhv və standart sapma dəyərlərini yeniləmək üçün yeni bir addım əlavə edirik.

df ["səhv"] = df ["proqnoz"] - df ["tələb"] m = df ["səhv"]. orta () s = df ["səhv"]. std ()
scipy.stats-dan idxal norması prob = norm.cdf (df ["error"], m, s) outlier = (prob> 0.99) | (prob <0.01)
m2 = df ["səhv"] [~ çıxarıcı] .mean () s2 = df ["səhv"] [~ çıxışçı] .std ()
limit_high = norm.ppf (0.99, m2, s2) + df ["Proqnoz"] limit_low = norm.ppf (0.01, m2, s2) + df ["Proqnoz"] df ["Yenilənib"] = df [" Tələb "]. clip (aşağı = limit_low, yuxarı = limit_high) çap (df)

Müəllif haqqında

Nicolas Vandeput, tələb proqnozlaşdırılması və inventarizasiyanın optimallaşdırılması sahəsində ixtisaslaşmış bir tədarük zənciri məlumatları alimidir. 2016-cı ildə onun məsləhət şirkəti olan SupChains (www.supchains.com) qurdu; İki il sonra, tədarük zəncirinin idarə edilməsi üçün ağıllı bir onlayn platforma olan SKU Science (www.skuscience.com) qurdu. Proqnozlaşdırma və maşın öyrənmə ilə maraqlanırsınızsa, onun kitab məlumatlarını Təchizat zəncirinin proqnozu üçün əldə edə bilərsiniz