האם מחירי הטיסות הולכים לעלות? פרויקט של דאטה אנליסט – חלק ב' – תחקור נתונים ראשוני

בחלק הקודם של המאמר ראינו איך ליצור בסיס נתונים של נתוני לוח הטיסות.
כעת, יש לנו בסיס נתונים של כל הטיסות פעמיים ביום (או אפילו יותר), ולכאורה אז אנחנו מוכנים לבצע תחקור נתונים.

האמנם?…

שלב ראשון בניתוח אנליטי – תחקור נתונים ראשוני

אז עוד לפני שנתחיל לטחון את הנתונים – חייבים קודם כל לוודא שהם נכונים ומדויקים.

השלב הראשון בכל ניתוח נתונים הוא בדיקה ראשונית של הנתונים – להבין מה בכלל הם כוללים ומה המשמעות שלהם.

אז קודם כל – חשוב להבין מה הנתונים בכלל מייצגים, והאם הם הגיוניים.
במקרה הזה אין תיעוד מעמיק של משמעות כל שדה – ולכן נדרש לעבור על הקובץ ולהבין משם.
איך עושים את זה? לעיתים שם השדה מעיד על התוכן, ולעיתים נדרש להבין זאת מתוך ערכי השדה.

וכאן חשוב להדגיש היבט קריטי לגבי נתונים – חשוב מאוד להבין בעולם התוכן העסקי של הנתונים.
אם אין לנו ידע עסקי כזה – יהיה קשה מאוד להבין את המשמעות של הנתונים ולזהות בהם דפוסים ותובנות.
זו גם אחת הסיבות העיקריות שחשוב להתייעץ ולהיעזר במומחי תוכן עסקיים.

אילו כיווני תחקור כדאי לכלול כאן? הנה כמה רעיונות:

  • האם כל הטיסות אכן רלוונטיות? האם כולן המריאו/נחתו בפועל?
  • האם יכול להיות מצב שתהיינה כמה טיסות בדיוק באותו הזמן ולאותו היעד?
  • מהם היעדים הכי נפוצים ומיהן חברות התעופה עם הכי הרבה טיסות?

השאלות הללו יכולות לעזור לנו לתקף את הנתונים – לוודא שהם הגיוניים ואין בהם הטיות.
לדוג': כמה טיסות קיימות בנתב"ג בממוצע ברמה היומית.

חשוב להכיר – טכניקת 'Guesstimate'

אז דבר ראשון, נדרש להעריך מהו המספר האמיתי ה'סביר' של טיסות ברמה היומית.

איך ניתן לעשות זאת?

קיימת טכניקה בשם 'Guesstimate'. מדובר בשילוב של ניחוש עם הערכה. בעוד שהיא משמשת בצורה מאוד תכופה בעיקר כלכלנים ואנשי ייעוץ אסטרטגי – היא חיונית לעיתים גם עבורנו כאנליסטים.
מדוע? כי היא מאפשרת לנו לבצע בדיות שפיות לנתונים – כאשר אין לנו מומחה תוכן עסקי שיעזור לנו בכך.
הנה דוגמה מאוד פשוטה ליישום השיטה – בהערכת היקף הטיסות היומי.

חיפוש זריז בגוגל על היקפי הנוסעים בנתב"ג יחזיר כ-20 מיליון בשנה. זה כולל גם המראות וגם נחיתות.
אם נחלק את המספר הזה ב-365 – נקבל כ-55 א' נוסעים בממוצע ביום.
ואם נניח שבמטוס ממוצע ישנם 150-200 נוסעים – אנחנו אמורים לקבל ביום ממוצע סדר גודל של כ-250-400 טיסות, או כ-125-200 המראות.
כמובן שהמספר הזה לא ממש מדויק – אבל הוא נותן לנו לפחות 'עוגן' לסדר הגודל של הטיסות שאנחנו אמורים לראות בנתונים.

על מנת לבדוק את כמות הטיסות ברמה יומית – נריץ את השאילתה הבאה:

select min(cast(runDate as date)) as firstFlight
, max(cast(runDate as date)) as lastDate
, count(distinct cast(runDate as date)) as runDays
, count(*) as flights
, count(*) / count(distinct cast(runDate as date)) as flightsPerDay
from flightBoard

 

במקרה הזה, כאשר הרצתי את השאילתה על מספר ימים – קיבלתי במדד של מספר הטיסות בכל יום – סדר גודל של מאות רבות (כמעט 1000) – וזה כמובן לא הגיוני.

מדוע זה יכול לקרות? טיפול בנתונים לא הגיוניים

אז הסיבה הטריוויאלית היא שביצעתי שתי ריצות ללוח הטיסות בכל יום.
לכן – כנראה שכל טיסה מופיעה פעמיים.
על מנת להוציא כל טיסה רק פעם אחת – נדרש לבצע שליפה של טיסה ייחודית (רק עבור הטיסות שכבר המריאו/נחתו) – ואת זה אפשר להוציא באמצעות השליפה הבאה:

select min(cast(scheduledTime as date)) as firstFlight
, max(cast(scheduledTime as date)) as lastDate
, count(distinct cast(scheduledTime as date)) as runDays
, count(*) as flights
, count(*) / count(distinct cast(scheduledTime as date)) as flightsPerDay
from
(
select distinct
[CHOPER] as airlineCode
,[CHOPERD] as airlineName
,[CHSTOL] as scheduledTime
,[CHPTOL] as actualTime
,[CHAORD] as flightType
,[CHLOC1] as otherAirportCode
,[CHLOC1D] as otherAirportName
,[CHLOC1T] as otherAirportCity
,[CHLOCCT] as otherAirportCountry
,[CHTERM] as terminal
,[CHCINT] as checkinCounter
,[CHCKZN] as checkinZone
,[CHRMINE] as flightStatus
from flightBoard
where [CHRMINE] in ('DEPARTED','LANDED')
and len(chfltn)<=4
) uniqueFlts

 

כעת, התוצאה שנקבל היא כ-500 טיסות ביום – יותר הגיוני – אבל עדיין נראה קצת גבוה מדי…

בשביל להבין מה עוד יכול להסביר את היקף הטיסות הגבוה (כמעט כפול ממה שהיינו מצפים), נדרש כבר לצלול קצת יותר לתוך הנתונים.

השאלה הבאה שתעזור לנו בכך היא הסתכלות על רמת חברות התעופה.
אז מיהי לדעתכם חברת התעופה עם הכי הרבה פעילות בנתב"ג?
לא צריך להיות מבין גדול בתעופה בשביל להבין שזו אל-על.
זוהי חברת התעופה הישראלית הגדולה ביותר – ונתב"ג הוא נמל הבית שלה…

אם נקבל תשובה אחרת – נהיה חייבים לבדוק מה קורה כאן ומדוע ישנם פערים או חריגות לעומת ה-Common Sense העסקי.

 

נריץ את השאילתה הבאה בשביל לבדוק אם אכן זה מה שמקבלים (דוגמה עבור יום ספציפי, מומלץ להריץ על כשבוע בשביל תוצאות מהימנות):

select top 10
airlineCode, airlineName, count(*) as totalFlights
from
(
select distinct
[CHOPER] as airlineCode
,[CHOPERD] as airlineName
,[CHSTOL] as scheduledTime
,[CHPTOL] as actualTime
,[CHAORD] as flightType
,[CHLOC1] as otherAirportCode
,[CHLOC1D] as otherAirportName
,[CHLOC1T] as otherAirportCity
,[CHLOCCT] as otherAirportCountry
,[CHTERM] as terminal
,[CHCINT] as checkinCounter
,[CHCKZN] as checkinZone
,[CHRMINE] as flightStatus
from flightBoard
where [CHRMINE] in ('DEPARTED','LANDED')
and len(chfltn)<=4
and cast([CHSTOL] as date) = '2018-05-01'
) uniqueFlts
group by airlineCode, airlineName
order by count(*) desc

והנה התוצאה (עבור יום ספציפי):

דוגמה לתוצאה של תחקור נתונים ראשוני - לוח טיסות
חברות תעופה עיקריות (מתבסס על נתוני מקור של רשות שדות התעופה)

ובכן – אמנם אל על היא אכן החברה עם מספר הטיסות הרב ביותר, אבל כאן פחות או יותר ההיגיון נגמר…

החברה הפורטוגלית (TAP) היא השנייה בתור, מה שמאוד מעניין לאור העובדה שהיא בכלל לא טסה ישירות לישראל…

המקרה הזה נכון גם לגבי American Airlines שהפסיקה לטוס לישראל מזה מספר שנים, ו-Aero Mexico שגם – מעולם לא טסה לארץ.

אז איך יכול להיות שהן מופיעות בלוח הטיסות??

הכיוון לתשובה היא אחד מהמונחים היותר נפוצים בעולם הטיסות – Code Sharing.

המונח מתאר מצב, שבו החברה המפעילה את הטיסה בפועל סוגרת הסכם מול חברות נוספות כך שנוסעים שלהן יוכלו לטוס תחת השם שלהן (ולצבור נקודות במועדון הנוסע המתמיד, לדוגמה).

במקרה הזה – ככל הנראה החברות האלה טסות תחת Code Sharing עם חברה אחרת (יש לכם ניחוש מי?…)

הרצת השאילתה הבאה תיתן את התשובה:

select *
from flightBoard
where [CHSTOL] in
(select [CHSTOL] from flightBoard where [CHOPER] in ('TP','AA','AM'))
order by [CHSTOL],[CHFLTN]

 

השאילתה בודקת את כל הטיסות שהמריאו בדיוק באותו הזמן – שבו המריאו טיסות של 3 החברות ה'סוררות' שכלל לא אמורות לטוס לישראל.

התשובה – ברובן המוחלט (אם לא כולן) בין הטיסות קיימת גם חברת תעופה העונה לשם 'אל-על'…
ככל הנראה – היא המפעילה האמיתית של הטיסה.

לסיכום – לאחר סינון טיסות שנחתו/המריאו בלבד, ושאינן Code Sharing (נניח כלל אצבע שהטיסה עם המספר הנמוך ביותר היא הטיסה האמיתית) – נקבל כ-350-400 טיסות.

ועל זה נאמר: "בול בפוני"!

 

כעת הנתונים מוכנים לניתוח האנליטי האמיתי!

ועל כך – בפוסט הבא…

השארת תגובה