מרתון ניתוח נתוני רכבת ישראל

שלום לכל מתנדבי ופעילי הסדנא.

צוות “רכבת פתוחה” שמח להזמין לארוע הדאטה-תון, מרתון ניתוח נתוני רכבת ישראל לשנת 2013 (ורוב 2014). הארוע יתקיים ביום שלישי, ה-30.9 בין השעות 18:30-21:00 במשרדי הסדנא ברחוב קרליבך 7 (קומה ב’). רוצים לבוא? יאללה, תירשמו.

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

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

למה בכלל אנחנו עושים את זה?
המטרה שלנו היא לנתח את הנתונים ולהוציא מהם תובנות מעניינות. המטרה שלנו כפולה:

  1. להציג סיפורים שמתחבאים בתוך אוסף הנתונים הזה כדי לעודד אותו להמשיך ולשאול שאלות.

  2. לעזור לנו להגדיר טוב יותר מדדים ושאילתות למערכת “רכבת פתוחה” המתקרבת לרגע ההשקה הציבורית שלה. בתחילת הערב נציג בקצרה את המערכת ונדגים כמה חשובה יכולה להיות התרומה של ניתוח הנתונים הקיימים.

רוצים להתאמן בבית?
הנה מחסן הנתונים שלנו בפורמט CSV פשוט:
https://github.com/hasadna/OpenTrainCommunity/blob/master/results/train_data.csv.gz?raw=true

והנה כמה שאלות מעניינות לדוגמא:

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

*** עזרה בניתוח השאלות הנ"ל יכולה לעזור לנו בחשיפה תקשורתית לקראת הדאטה-תון. ***

להרשמה לארוע: http://bit.ly/opentrain-datathon
לפרטים ושאלות: [email protected]

4 לייקים

העלינו אותו גם לאתר ניתוח נתונים חברתי שאפשר לעשות בו SQLים וגרפים על המידע ואז לעשות share לתוצאות:
https://modeanalytics.com/oferb/tables/trainstops3

היי,
התחלתי לשחק קצת עם ה-data, ותהיתי האם ישנם עוד נתונים ב-dataset השלם, כמו למשל:

  • מס’ נוסעים בכל נסיעה (אולי גם מס’ נוסעים עם מקום שמור מתוך כלל הנוסעים)
  • סוג הרכבת (קומה/קומותיים, עם/בלי wifi, …)

בנוסף, מעניין לראות שיש רכבות שעוזבות את התחנה לפני הזמן המתוכנן (אפשר לראות שהשדה departure delay שלילי) - קצת מוזר שהרכבת לא מחכה לפחות עד הזמן המיועד, זה בטוח גורם לאנשים לפספס רכבת. מעניין יהיה לבדוק באילו תרחישים זה קורה יותר (באילו תחנות, שעות וכו’)

מצפה לאירוע,

תום

לצערי אין לנו לא את מספר הנוסעים בכל נסיעה ולא את סוג הרכבת.
לגבי רכבות שיוצאות לפני הזמן, גם בעיני זה די תמוה.
עשיתי בדיקה קצרה, ומסתבר שיש לא מעט נסיעות כאלה, וזה גם מתפלג בצורה לא אחידה בין תחנות. כלומר, יש תחנות שהרכבות בהן כמעט ואף פעם לא יוצאות מוקדם מהמתוכנן ויש כאלה שיותר מ- 50% מהרכבות עושות את זה.

אתה מוזמן להסתכל על השאילתא והתוצאה כאן:

יש לנו נתונים חדשים שיכולים מאוד לתרום לפרוייקט!

  • המרחקים (תודה לערן קידר שביצע את החישובים).
    ניתן לראותם כאן:

http://opentrain.hasadna.org.il/timetable/distance/

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

חג שמח והמשך שבוע מעולה!

Lucy

מי מכם שנרשמו לארוע ביום שלישי הקרוב, ומשום מה לא קיבלו את המייל -

נרשמו הרבה מאוד אנשים. כדי לוודא שלכולנו יהיה מקום לשבת (או כדי לדעת שעלינו לחפש מיקום חלופי ומתאים), נבקש שתאשר/י את השתתפותכם.

אנא בדקו דוא"ל ביום שלפני הארוע לאישור סופי בנוגע למיקום המפגש.

והנה הקישור לטופס האישור.

נתראה,

לכל המאשרים את השתתפותם, הארוע יתקיים מחר, כמתוכנן, החל מ-18:30 במשרד בקרליבך 7.

בהצלחה לכולנו.

שימו לב שבתחנת יעד, depart_expected ו- depart_actual הם אפס, ולכן גם depart_delay הוא 0. אותו דבר עם arrive_* בתחנת המוצא. רלוונטי למי שממצע על הנתונים האלה.

מצורף קישור לקובץ עבור מספר חודשים, המכיל נתוני נוסעים ברמת חודש ותחנה.

את הנתונים אספנו ועיבדנו טכנית, מפורום תחבורה ציבורית בתפוז. מקור הנתונים ברכבת ישראל.
פוסט לדוגמה: http://www.tapuz.co.il/forums2008/viewmsg.aspx?forumid=394&messageid=173341226

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

בשורה https://github.com/ofri/OpenTrainCommunity/blob/master/src/manage.py#L165 יש טעות - בודקים שם רק אם השעה שווה לאפס. צריך לבדוק גם את הדקות, כי יש רכבות מתוכננות ל 00:10 למשל, ואז ה delay שלהן נכתב כאפס בטעות.

שימו לב שיש נתונים כפולים בנתונים. למשל הרכבת של ה3 בדצמבר 2013 רכבת 100 מופיעה פעמיים על כל תחנותיה.

בעיות בנתונים

  • התעלמנו מאיחורים שעולים על 60 דקות והתייחסנו לאיחורים שליליים כאל 0 (לעיתים מגיעים לערכים גבוהים מאוד).
  • ישנם ימים ספציפיים לאורך התקופה שבהם היו איחורים חריגים מאוד, אולי כדאי להתעלם מהם (14/12/2013 למשל).
    אפשר לראות ימים יוצאי דופן שכאלה באקסל https://www.dropbox.com/s/6k4blgheq48s5nj/train.xlsx?dl=0, בגיליון שנקרא date.

האם יש קטעים שבהם הרכבת מסוגלת לנסוע מהר יותר מאשר המתוכנן בלו"ז?

באקסל https://www.dropbox.com/s/6k4blgheq48s5nj/train.xlsx?dl=0
בגיליונות recovered_conseuqtive_sections, recovered_trips
מופיעים קטעי נסיעה בודדים שבהם איחור בתחנה מסוימת התקזז בארבע דקות או יותר בתחנה הבאה מייד אחריה (למשל עכו-נהרייה), וכן נסיעות (trains) שלמות שבהן התקזז איחור בתחנה כלשהי לאורך המסע בארבע דקות או יותר בתחנת היעד (למשל רכבת 184 לנהרייה), ומסלולים שבהם קוזז איחור בתחנה מסוימת עד תחנת היעד. (למשל - בין עתלית לנהריה).

כדי לייצר קובץ חדש, ממויין לפי מספר רכבת ואז לפי תאריך, ובניקוי כפילויות, אפשר להשתמש בפקודה הבאה:

cat train_data.csv | sort -n -k 2,3 -t"," | uniq > train_sort_uniq.csv

הקוד הרלוונטי לפוסט

יצירת טבלת עזר לבניית מסלולים:

create table train_data_rnum as
select train_num, stop_name, stop_id, min(rnum) min_rnum from
                        (select train_num, stop_name, stop_id, ROW_NUMBER() OVER (partition by train_num order by arrive_expected) rnum from train_data where arrive_expected NOT LIKE '%00:00:00')b
                group by train_num, stop_name, stop_id
                having min_rnum < 100
                order by train_num, min_rnum;

השאילתא עליה מבוססות התוצאות באקסל:

select 
stop_id, stop_name, second_stop_id, second_stop_name, count(*) cnt, avg(closed_gap) avg_closed_gap, max(closed_gap) max_closed_gap
from 
(
select a.*, b.arrive_expected b_arrive_expected, b.arrive_actual b_arrive_actual, b.arrive_delay b_arrive_delay,
b.stop_id second_stop_id, b.stop_name second_stop_name,c.min_rnum,d.min_rnum b_min_num,
a.depart_delay -  b.arrive_delay closed_gap
from (select*from train_data where depart_delay >= 4) a
join  train_data b on (a.train_num= b.train_num  and a.date = b.date)
join train_data_rnum c on (a.train_num = c.train_num and a.stop_id = c.stop_id)
join train_data_rnum d on (b.train_num = d.train_num and c.min_rnum = d.min_rnum-1 and b.stop_id = d.stop_id)
--where c.min_rnum = d.min_rnum-1 and a.depart_delay -  b.arrive_delay >= 4 and a.arrive_expected < b.arrive_expected and b.arrive_actual not like '% 00%') f
where closed_gap <= 10
group by stop_id, stop_name, second_stop_id, second_stop_name
;
לייק 1

רכבות שיציאתן מוקדמת או מאוחרת הן בעיתיות לנוסעים.
קוד בודק איחורים ומייצר הסטוגרמה ניתן למצוא כאן:
הקוד כתוב ב -R

Read train data

train_data <- read.csv(“D:\DataSets\train_data\output_for_gzip.csv”)

summary(train_data$depart_delay)

trains_2h <- train_data[which(train_data$depart_delay > -30),]
trains_2h <- trains_2h[which(trains_2h$depart_delay < 30),]

hist(trains_2h$depart_delay, main=“Trains Delay Time”, xlab=“Delay Duration” )

`

באותו הקשר - 54% מהרכבות שאיחרו איפשהו במהלך הדרך (ביותר מ2 דקות) הצליחו להגיע ליעדן הסופי בזמן. זה אומר ש46% לא.

איזה תחנות מועדות לאיחורים בשקלול כמות הנוסעים שהגיעו לתחנה?

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

את התוצאות אפשר לראות באקסל (בגליון delay cost AVG):

הקוד לחישוב הציון:

select stop_name, avg(month_on) avg_month_on, avg(avg_arrive_delay) avg_arrive_delay, avg(cost) avg_cost from (
        select a.stop_name, a.month, b.month_on, avg(avg_arrive_delay) avg_arrive_delay, b.month_on * avg(avg_arrive_delay) cost
        from train_data_for_clustering1 a
        join train_passangers b on (a.stop_name = b.station and a.month = b.month)
        group by a.stop_name, a.month, b.month_on) t
group by stop_name        
order by avg_cost desc;

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

create table train_data_lag_lead as
select stop_name, month, month_on, lag(month_on) over (partition by stop_name order by month) month_on_lag, lead(month_on) over (partition by stop_name order by month) month_on_lead, avg_arrive_delay, cost from(
        select a.stop_name, a.month, b.month_on, avg(avg_arrive_delay) avg_arrive_delay, b.month_on * avg(avg_arrive_delay) cost
        from train_data_for_clustering1 a
        join train_passangers b on (a.stop_name = b.station and a.month = b.month)
        group by a.stop_name, a.month, b.month_on ) t
order by stop_name, month asc;        



select a.stop_name, month, month_on, month_on_lead, avg_arrive_delay, cost, (month_on - month_on_lead)/month_on decline_precentage 
from train_data_lag_lead a
where (month_on - month_on_lead)/month_on*100 > 10;


select stop_name, avg(avg_arrive_delay) avg_arrive_delay, avg(decline_precentage) from (
        select a.stop_name, month, month_on, month_on_lead, avg_arrive_delay, cost, (month_on - month_on_lead)/month_on decline_precentage 
        from train_data_lag_lead a )t
group by stop_name;

תוצאות ראשוניות אפשר לראות בגליון delays caused decline באקסל: https://www.dropbox.com/s/mxfm34m31ot01to/train_passangers_2013.csv?dl=0

האם יש דמיון בין קווים מבחינת דפוסי איחורים?

כתבתי קוד python קצר שמבצע clustering. לא הספקתי לבנות פיצ’רים מספיק מעניינים בשביל להגיע לתוצאות מעניינות במיוחד. אתם מוזמנים להשתמש בו בעצמכם.

הסקריפט: https://www.dropbox.com/s/wvftrcsa1802f4r/train_clustering.py?dl=0
הdata עליו הרצתי את הקוד (שמכיל רק 2-3 פיצ’רים): https://www.dropbox.com/s/2fb4rws0hk6gyzp/train_data_for_clustering?dl=0