(c) Igor Kleiner igkleiner@gmail

🎯 מה נתרגל בעבודה הזאת?

💾 הנתונים: טיסות מסחריות

בעבודה זו נשתמש במאגר נתונים קלאסי ופתוח הנקרא AirPassengers.

המאגר מכיל את מספר הנוסעים החודשי (באלפים) בטיסות מסחריות בינלאומיות בין השנים 1949 ל-1960. קל מאוד לזהות בו גם כיוון כללי של מגמה (Trend) וגם תבנית שחוזרת על עצמה המייצגת עונתיות (Seasonality).

🔗 קישור ישיר לקובץ:
https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv

כך נטען את הנתונים ב-Python:

import pandas as pd

url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
df = pd.read_csv(url, index_col='Month', parse_dates=True)

print(df.head())
🧠 תזכורת קצרה מהשיעור (לחץ לפתיחה)
  • סדרה עיתית (Time Series): אוסף של תצפיות שנאספו בסדר כרונולוגי לאורך זמן.
  • מגמה (Trend): הכיוון הכללי של הנתונים לאורך זמן - למשל מגמת עלייה הדרגתית או ירידה מתמשכת.
  • החלקה (Smoothing): שיטה להפחתת "רעש" ותנודות קצרות טווח בנתונים, על מנת לראות את המגמה הכללית בבירור. נפוץ להשתמש ב"ממוצע נע" למטרה זו.
  • תרשים השהיה (Lag Plot): תרשים המציג קשר בין תצפית בנקודת זמן נוכחית לבין תצפית בנקודת זמן קודמת (בהשהיה מסוימת). כלי זה מסייע לבחון את מידת התלות של הנתונים בעברם.
  • אוטוקורלציה (ACF): מדד סטטיסטי המכמת עד כמה הנתונים הנוכחיים מתואמים עם הנתונים בעבר (בפיגורים שונים).
  • הסרת מגמה (Detrending): פעולה מתמטית (כגון חישוב ההפרש בין כל חודש לחודש הקודם לו) המסייעת לייצב את הסדרה סביב ממוצע קבוע ולנטרל את השפעת המגמה.
• • •

💻 משימות תכנות

משימה 1: הכרת הנתונים והצגה גרפית

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

מה צריך לעשות?

  1. השתמשו בספריית pandas כדי לקרוא את קובץ ה-CSV מהקישור שסופק למעלה.
  2. הדפיסו את 5 השורות הראשונות של הטבלה כדי לוודא שהנתונים נטענו נכון.
  3. צרו גרף קו (Line Plot) בעזרת matplotlib. הוסיפו כותרת לגרף ושמות לצירים (תאריך מול מספר נוסעים).
  4. ענו בקצרה: האם אתם מזהים מגמה כללית בגרף? האם יש תבנית עונתית (עליות וירידות קבועות במהלך השנה)?

מה להגיש?

  • את קוד ה-Python שכתבתם.
  • את הגרף שהופק.
  • תשובה מילולית קצרה לשאלות ההבנה.
💡 רמז
אל תשכחו להשתמש בפרמטרים index_col='Month' ו- parse_dates=True בתוך הפונקציה pd.read_csv(). זה יהפוך את ציר ה-X בגרף שלכם לתאריכים אמיתיים במקום למספרים סתמיים!
🎓 תזכורת מהשיעור
הצעד הראשון בכל תהליך ניתוח נתונים הוא בחינה חזותית (Visual Inspection). בסדרות עיתיות, אנו תמיד מחפשים שני מאפיינים עיקריים בעין: מגמה (Trend) (האם הגרף עולה או יורד לאורך זמן?) ו-עונתיות (Seasonality) (האם קיימת תבנית מחזורית קבועה?).
✅ פתרון אפשרי ב-Python
import pandas as pd
import matplotlib.pyplot as plt

# 1. טעינת הנתונים
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
df = pd.read_csv(url, index_col='Month', parse_dates=True)

# 2. הצגת שורות ראשונות
print(df.head())

# 3. ציור הגרף
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['Passengers'], color='blue')
plt.title('Monthly Airline Passengers (1949-1960)')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.grid(True)
plt.show()

משימה 2: החלקה (Smoothing) וחיפוש מגמה

המטרה: להשתמש בממוצע נע כדי להחליק את התנודות המהירות בגרף ולחשוף את המגמה ארוכת הטווח.

מה צריך לעשות?

  1. חשבו ממוצע נע (Rolling Mean) עם חלון של 3 חודשים, ושמרו בעמודה חדשה MA_3.
  2. חשבו ממוצע נע נוסף עם חלון של 12 חודשים (שנה שלמה), ושמרו בעמודה MA_12.
  3. ציירו על גרף אחד 3 קווים: הסדרה המקורית, ממוצע חלון 3, וממוצע חלון 12 (השתמשו בצבעים שונים והוסיפו מקרא - Legend).
  4. ענו בקצרה: איזו מבין ההחלקות שביצעתם מציגה קו מתון יותר, המעלים יותר פרטים מהסדרה המקורית? האם ההחלקה באמצעות חלון של 12 חודשים מסייעת בהצגת המגמה באופן נקי יותר מההשפעה העונתית?

מה להגיש?

  • את קוד ה-Python של חישוב ההחלקות.
  • את הגרף המשותף עם שלושת הקווים.
  • תשובה מילולית לשאלות ההבנה.
💡 רמז
כדי לחשב ממוצע נע ב-Pandas, משתמשים בפונקציה .rolling(window=X).mean() על העמודה הרלוונטית.

לדוגמה:
df['MA_3'] = df['Passengers'].rolling(window=3).mean()
🎓 תזכורת מהשיעור
ככל שגודל החלון (window) בממוצע הנע גדול יותר, כך אנו ממצעים יותר נקודות נתונים ביחד. פעולה זו גורמת לגרף להיות חלק ומתון יותר, אך מנגד אנו עלולים לאבד מידע אודות שינויים מהירים בטווח הקצר. בנתונים חודשיים, שימוש בחלון של 12 חודשים מסייע לרוב "לסנן" את האפקט העונתי השנתי ולחשוף את מגמת הבסיס!
✅ פתרון אפשרי ב-Python
# חישוב ממוצעים נעים
df['MA_3'] = df['Passengers'].rolling(window=3).mean()
df['MA_12'] = df['Passengers'].rolling(window=12).mean()

# ציור הגרפים ביחד
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['Passengers'], label='Original', alpha=0.4, color='gray')
plt.plot(df.index, df['MA_3'], label='Moving Average (3)', color='orange')
plt.plot(df.index, df['MA_12'], label='Moving Average (12)', color='red', linewidth=2)

plt.title('Smoothing with Moving Average')
plt.legend()
plt.grid(True)
plt.show()

משימה 3: הסרת מגמה (Detrending) ובדיקת תלות בזמן

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

מה צריך לעשות?

  1. חשבו תהליך של הפרש מסדר ראשון (ההבדל בין כל חודש לחודש שלפניו) ושמרו בעמודה חדשה.
  2. ציירו את גרף הסדרה החדשה (סדרת ההפרשים).
  3. צרו תרשים השהיה (Lag Plot) (עם שיהוי lag=1) לסדרה המקורית, על מנת לבחון את הקשר בין חודש עוקב למשנהו.
  4. אופציונלי: צרו תרשים אוטוקורלציה (ACF plot) לסדרה המקורית.
  5. ענו בקצרה: מה קרה למגמה העולה לאחר שחישבנו את סדרת ההפרשים? האם הסדרה החדשה נראית יציבה יותר ומתנודדת סביב האפס?

מה להגיש?

  • את קוד ה-Python להפקת ההפרשים והתרשימים.
  • את הגרף של סדרת ההפרשים ואת ה-Lag Plot.
  • תשובה מילולית לשאלת ההבנה על ייצוב המגמה.
💡 רמז
  • כדי לחשב הפרשים ב-Pandas, משתמשים ב- df['Passengers'].diff().
  • עבור Lag Plot, השתמשו ב- pd.plotting.lag_plot(df['Passengers'], lag=1).
  • עבור ACF, ייבאו מ-statsmodels:
    from statsmodels.graphics.tsaplots import plot_acf.
🎓 תזכורת מהשיעור
הסרת מגמה (Detrending) מהווה שלב מקדים וחיוני במודלים רבים של סדרות עיתיות. כאשר אנו מנתחים את התנודות במונחי "שינוי" בין תקופות, ולא בערכים מוחלטים, המגמה ארוכת הטווח מתבטלת, והסדרה שואפת לנוע סביב ציר ה-0. תרשים השהיה (Lag Plot) ופונקציית אוטוקורלציה (ACF) משמשים למדידת העוצמה שבה נתוני העבר מסבירים או מנבאים את העתיד המיידי בסדרה.
✅ פתרון אפשרי ב-Python
from statsmodels.graphics.tsaplots import plot_acf
import pandas.plotting as pd_plotting

# חישוב הפרשים מסדר ראשון (Detrending)
df['Diff'] = df['Passengers'].diff()

# 1. ציור סדרת ההפרשים
plt.figure(figsize=(10, 5))
plt.plot(df.index, df['Diff'], color='green')
plt.title('Differenced Series (Detrended)')
plt.axhline(0, color='red', linestyle='--') # קו האפס
plt.grid(True)
plt.show()

# 2. Lag Plot
plt.figure(figsize=(5, 5))
pd_plotting.lag_plot(df['Passengers'], lag=1)
plt.title('Lag Plot (Lag = 1)')
plt.show()

# 3. תרשים ACF (אופציונלי)
plt.figure(figsize=(10, 4))
plot_acf(df['Passengers'].dropna(), lags=30, ax=plt.gca())
plt.title('Autocorrelation (ACF)')
plt.show()

📝 מה צריך להגיש?

יש להגיש קובץ אחד (מומלץ Jupyter Notebook או קובץ Python + מסמך Word המאגד את התשובות והגרפים):

  1. את קוד ה-Python המלא של כל שלוש המשימות (או קובץ יחיד אם השתמשתם ב-Notebook).
  2. את הגרפים שנוצרו בכל משימה (ניתן לשלב במסמך).
  3. תשובות מילוליות קצרות לשאלות שהופיעו בכל משימה.
  4. סיכום קצר: כתבו 2-3 משפטים המסכמים - מה למדתי מהעבודה הזאת על סדרות עיתיות ועל התנהגות הנתונים שבדקנו?

בהצלחה רבה!

🔒 הערה למורה (Teacher Note)

התאמה לחומר השיעור: עבודה זו מכסה את עקרונות הבסיס בניתוח סדרות עיתיות כפי שנלמדו בהרצאה: טעינת נתונים, זיהוי חזותי של מגמה ועונתיות, יישום החלקה (Smoothing) באמצעות ממוצע נע לסינון רעשים, והבנת הרעיון של הסרת מגמה (Detrending) באמצעות חישוב הפרשים מסדר ראשון (Differencing). כמו כן, ישנה היכרות ראשונית עם תלות בזמן (Lag Plot ואוטוקורלציה).

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

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