מתודולוגיה
איך המדד עובד, מאיפה מגיעים הנתונים, ולמה 37 מוצרים זה לא פשוט כמו שזה נשמע
מקור הנתונים
חוק פרסום מחירי מצרכי מזון (2014) מחייב את רשתות הסופרמרקט הגדולות לפרסם קובץ XML מדי יום עם המחיר הנוכחי של כל מוצר בכל סניף. הקבצים האלה זמינים לציבור, ופרויקט Israeli Supermarkets (Kaggle) מרכז אותם ומפרסם גרסה מאוחדת בפורמט CSV. אנחנו מורידים את הנתונים האלה מדי יום.
כל קובץ CSV מכיל שורה אחת לכל מוצר בכל סניף, כולל שדה PriceUpdateDate — תאריך העדכון האחרון של המחיר. שדה זה הוא הבסיס לשחזור הסדרה ההיסטורית.
ברקודים: מה שאנשים לא יודעים
כשמשווים מחירים בין רשתות, הדבר הכי חשוב הוא לוודא שמשווים את אותו מוצר בדיוק. כאן הברקוד נכנס לתמונה — אבל הסיטואציה מסובכת יותר ממה שנדמה.
14 מוצרים — ברקוד אוניברסלי
מותגים לאומיים (תנובה, אסם, יטבתה, עלית וכו') משתמשים בברקוד GS1 ייחודי המוגדר על ידי היצרן. ברקוד זה זהה בכל הרשתות — 7290004131074 הוא תמיד חלב תנובה 3% קרטון 1 ליטר, לא משנה אם קנינו בשופרסל או בחצי חינם.
דוגמאות: חלב, קוטג', גבינה, חמאה, אורז, סוכר, קולה, קפה, במבה, שוקולד
23 מוצרים — ברקוד לפי רשת
שני מקרים מחייבים מיפוי פרטני לכל רשת: (1) פירות, ירקות ועוף טרי הנמכרים לפי משקל — כל רשת מקצה קוד PLU משלה(ברמי לוי עגבניה היא קוד X, בשופרסל קוד Y); (2) מוצרים ארוזים שהברקוד ה"אוניברסלי" שלהם חסר או ללא מחיר בחלק מהרשתות — אז ממפים כל רשת לפריט המקביל שלה.
דוגמאות: עגבניה, מלפפון, בצל, גזר, תפוח, תפוח אדמה, חזה עוף, לחם, ספגטי, טחינה, חומוס, תה, ביצים, אפונה קפואה
למה זה משנה?
כאשר בונים סל קניות להשוואה בין-רשתית, אי אפשר לחפש "עגבניה" לפי ברקוד אחד בכל הרשתות — צריך לדעת את הקוד הספציפי שכל רשת השתמשה בו. עבור 23 המוצרים האלה, בנינו מיפוי ידני לכל רשת בנפרד. עבור 14 המוצרים הנותרים, ברקוד אחד מספיק.
למה חציון ולא ממוצע?
לרשת אחת יש עשרות ומאות סניפים, ולכל סניף מחיר משלו. כדי להציג מספר אחד לרשת צריך לבחור איך לסכם אותם. אנחנו בוחרים חציון - המחיר שנמצא באמצע, כשמסדרים את כל הסניפים מהזול ליקר.
דוגמה אמיתית מהנתונים שלנו.מלפפון ברמי לוי, 75 סניפים: 39 סניפים ב-5.90 ש"ח, 15 ב-3.90, 9 ב-6.90, 6 ב-4.90, 3 ב-8.90 ו-3 ב-1.90. הממוצע יוצא 5.50 ש"ח - מחיר שלא קיים באף סניף. החציון הוא 5.90 - המחיר שבו באמת קונים ברוב הסניפים.
- מספר שאפשר באמת לשלם. בבדיקה על 826 תאים, החציון היה מחיר שקיים בפועל באיזשהו סניף ב-99% מהמקרים. הממוצע - ב-16% בלבד.
- עמידות למבצעים.סניף בודד שמריץ מבצע לא אמור להזיז את המחיר של רשת שלמה. אם סניף אחד מתוך שישה יורד ל-1.90, הממוצע זז ב-0.67 ש"ח - החציון לא זז בכלל. כדי להזיז חציון צריך שיותר מחצי מהסניפים ישנו מחיר, וזה בדיוק המצב שבו נכון שהמחיר יזוז.
- מינימום 5 סניפים. אם רשת מפרסמת את המוצר בפחות מ-5 סניפים, אנחנו לא מציגים לה מחיר בכלל ומסמנים —. עדיף להראות שאין נתון מאשר להציג מספר שנשען על סניף אחד או שניים ונראה בטוח יותר ממה שהוא.
הערה על מה שהשתנה: עד ה-9 באוגוסט 2026 טבלת המוצרים הציגה מחיר של סניף בודד - זה שעדכן מחיר אחרון - ולא סיכום של הרשת. מכיוון שסניף שמעדכן מחיר הוא לרוב סניף שהתחיל מבצע, המספר שהוצג נטה כלפי מטה וייצר פערים לא סבירים בין רשתות. המעבר לחציון תיקן זאת. שימו לב: המדד עצמו לא הושפע - הוא תמיד חושב מחציון הסניפים.
איך בונים מדד יומי מנתונים מ-8 רשתות?
- 1
תצלום יומי של המחיר בכל סניף
מאז 6 ביוני 2026 אנחנו שומרים כל יום snapshot של המחיר בפועל בכל סניף, לכל מוצר בסל, בכל הרשתות. המחיר היומי של רשת למוצר הוא חציון הסניפים באותו יום. שני סינוני איכות חלים כאן: יום שבו רשת פרסמה רק חלק קטן מהסניפים שלה מדולג (המחיר האחרון הטוב מוחזק), ומחיר של מוצר ברשת נכנס למדד רק אם הוא נצפה ב-5 סניפים לפחות באותו יום — אותו רף בדיוק שחל על טבלת המוצרים.
- 2
ההיסטוריה שלפני יוני 2026 — שחזור קפוא
לימים שלפני תחילת ה-snapshots, הסדרה שוחזרה פעם אחת משדה "תאריך עדכון אחרון" שבקבצים, הוקפאה לקובץ, ומחוברת לסדרת ה-snapshots בשיטת שרשור מדדים סטנדרטית (chain-linking) — כך ששינויים עתידיים בקבצי המקור לעולם לא משכתבים את העבר. צירוף מוצר-רשת שאין לו לא היסטוריה קפואה ולא נתוני snapshot מספקים פשוט אינו משתתף במדד.
- 3
ממוצע גיאומטרי בין הרשתות
לכל תאריך ולכל מוצר, לוקחים ממוצע גיאומטרי של המחירים מכל הרשתות שיש להן נתון. ממוצע גיאומטרי (לעומת חשבוני) מגביל את ההשפעה של מחיר קיצוני אחד על כלל המדד.
- 4
סינון חריגים
חלק מהקבצים מכילים מחירים פגומים — לעתים ממוצרים "במשקל" עם מחיר של עשרות שקלים לקילו שאינו מתעדכן מ-2019. סינון זה מוריד כל מחיר שגבוה מפי 4 מהמחיר השני-בזול לאותו מוצר, ומסיר את ההשפעה שלו מהמדד.
- 5
חישוב ביחס לתאריך בסיס קבוע
תאריך הבסיס הוא 15 ביוני 2025 = 100. כל יום מחושב ביחס לבסיס: אם סל המוצרים עלה 2.5% מאז הבסיס, המדד מציג 102.5. מחירי הבסיס עצמם קפואים — הם חושבו פעם אחת ונשמרו, כך שתנודות בקבצי המקור אינן יכולות להזיז את נקודת הייחוס שכל המדד נמדד ממנה.
למה החודשים הראשונים (יוני–נובמבר 2025) פחות אמינים?
השחזור ההיסטורי עובד טוב רק כשיש הרבה סניפים עם תאריכי עדכון שונים. כאשר 500 סניפים עדכנו את מחיר המלפפון בתאריכים שונים לאורך 6 חודשים — אנחנו "רואים" את תנועת המחיר בין כל עדכון.
הבעיה: בחודשים המוקדמים (יוני–נובמבר 2025), כשהדאטה עדיין היה דליל, מעט מאוד עדכונים שוחזרו לכל מוצר — ולכן הגרף שטוח באופן מלאכותי. זה לא אומר שהמחירים לא השתנו — זה אומר שאנחנו לא יכולים לראות את השינוי.
מה עשינו בשביל העתיד?
מה-30 במאי 2026, אנחנו שומרים snapshot יומי של מחיר 100 מוצרים בכל סניף בכל הרשתות — ומאז 6 ביוני 2026 המדד עצמו מחושב מה-snapshots האלה, לא משחזור. השחזור משמש רק כזנב היסטורי קפוא לימים שלפני כן. ככל שארכיון ה-snapshots מצטבר, החלק המדויק של הסדרה מתארך.
מגבלות ידועות
- •חצי חינם — היסטוריה שטוחה לפני יוני 2026: יש להם 13 סניפים בלבד עם עדכוני תאריך כמעט זהים, כך שהשחזור ההיסטורי ראה אצלם אפס תנועה. מאז המעבר ל-snapshots (יוני 2026) תנועת המחירים שלהם נמדדת כרגיל; החלק שלפני כן נשאר שטוח.
- •רף 5 סניפים גם במדד: צירוף מוצר-רשת שנצפה בפחות מ-5 סניפים אינו נכנס למדד (בדיוק כמו בטבלת המוצרים, שם מוצג —). המשמעות: מוצר עשוי להיות מחושב מ-6 או 7 רשתות במקום 8. עדיף פחות רשתות מאשר מחיר שנשען על סניף בודד.
- •ברקודים מתים / מחירי 2019: לחלק מהרשתות היה ברקוד "בצל במשקל" שמחירו לא עודכן מאז 2019, או ברקוד שכבר לא קיים בנתונים. מיפינו מחדש מוצרים כאלה לקוד הנכון בכל רשת (כך שהבצל, למשל, שוב מוצג בכל הרשתות), וסינון החריגים נשאר כרשת ביטחון.
- •פערים בקובץ המחירים: לעיתים רשת מפרסמת מוצר ללא מחיר בקובץ ה-XML (למשל ספגטי אסם מס' 8 בשופרסל קיים בקטלוג אך ללא מחיר). במקרים כאלה אנחנו ממפים לפריט המקביל הקרוב ביותר שכן מתומחר, או שהמוצר מוצג בפחות רשתות.
- •ירושלים ובני ברק: חלק מהמוצרים (כגון ביצים) חסרים בנתוני הסניפים שם — מחסור בנתוני Kaggle, לא מחסור בנתוני שוק.
- •הפרש גודל מדגם: שופרסל מיוצגת על ידי 421 סניפים, אושר עד רק 23. ממוצע הרשת אינו ממוצע הסניפים.
יומן עדכוני מתודולוגיה
כשאנחנו מתקנים את שיטת החישוב, כל הסדרה מחושבת מחדש לפי השיטה החדשה — ולכן ערכים היסטוריים עשויים להשתנות. כל שינוי כזה מתועד כאן, כדי שקפיצה בגרף שמקורה בשיפור השיטה לא תיקרא בטעות כתנועת מחירים אמיתית.
22 באוגוסט 2026 — עיגון מלא, רף 5 סניפים במדד, והקפאת הבסיס
שלושה תיקונים שנכנסו יחד: (1) כל צירוף מוצר-רשת מעוגן עכשיו לנתוני ה-snapshots או להיסטוריה הקפואה — בוטל לחלוטין מנגנון "שחזור חי" שאיפשר לסניף בודד שנכנס או יצא מקובץ המקור לשכתב רטרואקטיבית חודשים של היסטוריה מפורסמת; (2) רף 5 הסניפים שחל על טבלת המוצרים חל מעכשיו גם על המדד עצמו; (3) מחירי הבסיס הוקפאו. כתוצאה מהתיקון המדד ירד באופן חד-פעמי מ-102.11 ל-100.80 — זו הסרת עיוותים, לא ירידת מחירים (למשל: מחיר עגבניה שנשען על ממוצע גולמי מוטה ירד לחציון האמיתי של 54 סניפים, ומחיר בסיס של מלפפון שזז בגלל שורה בודדת מ-2019 קובע מחדש).
9 באוגוסט 2026 — מעבר לחציון בטבלת המוצרים
טבלת המוצרים הציגה עד אז מחיר של הסניף האחרון שעדכן — שנטה כלפי מטה (מבצעים). מאז מוצג חציון כלל הסניפים, עם רף מינימום של 5 סניפים. המדד עצמו תמיד חושב מחציון ולא הושפע.
19 ביוני 2026 — המדד עבר לנתוני snapshots
כל 8 הרשתות מחושבות מאז מארכיון ה-snapshots היומי (לתאריכים מ-6 ביוני 2026), כשההיסטוריה המשוחזרת שלפני כן הוקפאה וחוברה בשרשור מדדים סטנדרטי — ללא אובדן היסטוריה וללא מדרגה מלאכותית.
שאלות? צרו קשר