🚀 מבצע מיוחד: הצטרפו לקהילת ה-AI שלנו ב-EduManage! לפרטים נוספים
🎓 יחידת לימוד זו היא חלק מקורס מערכות תחבורה מתקדמות להרשמה חינם

🎓 סדרת קורסים: טכנולוגיות תחבורה מתקדמות

📍 קורס 3: ניתוח נתונים עם Python (נוכחי)
סדנה מעשית • רמה 4 • Python Workshop

ניתוח נתוני תחבורה חכמה עם Python

מהנתונים לתובנות: סדנה מעשית מתקדמת

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

🔧 הכנה לסדנה

📋 דרישות קדם

  • השלמת קורס 1: רכבים מחוברים
  • השלמת קורס 2: רכבים אוטונומיים
  • 📚 ידע בסיסי ב-Python
  • 📊 הכרות עם מושגי Data Science

🛠️ התקנת סביבת העבודה

📦 שלב 1: התקנת Python packages נדרשים
install_packages.sh
# התקנת ספריות עיבוד נתונים
pip install pandas numpy matplotlib seaborn

# התקנת ספריות למידת מכונה
pip install scikit-learn

# התקנת ספריות ויזואליזציה אינטראקטיבית
pip install plotly dash

# התקנת Jupyter Notebook
pip install jupyter notebook

# התקנת ספריות גיאוגרפיות (אופציונלי)
pip install folium geopandas
🚀 שלב 2: הרצת Jupyter Notebook
start_jupyter.sh
# הרצת Jupyter Notebook
jupyter notebook

# או הרצת JupyterLab (מומלץ)
pip install jupyterlab
jupyter lab

🎯 מטרות הסדנה המעשית

עיבוד וניתוח נתוני תנועה אמיתיים עם Pandas ו-NumPy.

יצירת ויזואליזציות מתקדמות עם Matplotlib, Seaborn ו-Plotly.

בניית מודלים חיזויים לדפוסי תנועה עם Scikit-learn.

פיתוח דשבורד אינטראקטיבי לניטור תחבורה בזמן אמת.

01 טעינה וחקירה ראשונית של נתוני תחבורה

📊 הכרת מבני הנתונים

נתחיל בטעינת נתוני תחבורה אמיתיים ונבין את המבנה שלהם. הנתונים כוללים מידע על תנועה, חיישנים ומזג אוויר.

setup.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')

# הגדרת עיצוב גרפים בעברית
plt.rcParams['font.family'] = ['Arial Unicode MS', 'Tahoma']
sns.set_style("whitegrid")

# הגדרת גודל ברירת מחדל לגרפים
plt.rcParams['figure.figsize'] = [12, 8]
plt.rcParams['font.size'] = 10
load_data.py
# טעינת נתוני תנועה מקבצי CSV
traffic_data = pd.read_csv('traffic_sensors.csv')
weather_data = pd.read_csv('weather_conditions.csv')
vehicle_data = pd.read_csv('connected_vehicles.csv')

# הצגת מידע בסיסי על הנתונים
print("📈 מבנה נתוני התנועה:")
print(f"מספר שורות: {len(traffic_data):,}")
print(f"מספר עמודות: {len(traffic_data.columns)}")
print("\n🔍 עמודות בנתונים:")
print(traffic_data.columns.tolist())

# הצגת דוגמה מהנתונים
print("\n📋 דוגמה מהנתונים:")
print(traffic_data.head())
📈 מבנה נתוני התנועה: מספר שורות: 125,847 מספר עמודות: 12 🔍 עמודות בנתונים: ['timestamp', 'sensor_id', 'location', 'vehicle_count', 'avg_speed', 'traffic_density', 'weather_condition', 'temperature', 'humidity', 'road_type', 'rush_hour', 'congestion_level']
inspect_data.py
# בדיקה מפורטת של מבנה הנתונים
print("📋 מידע כללי על הנתונים:")
print(traffic_data.info())

print("\n📊 סטטיסטיקות בסיסיות:")
print(traffic_data.describe())

# בדיקת ערכים חסרים
print("\n🔍 בדיקת ערכים חסרים:")
missing_data = traffic_data.isnull().sum()
missing_percentage = (missing_data / len(traffic_data)) * 100

missing_df = pd.DataFrame({
    'עמודה': missing_data.index,
    'ערכים חסרים': missing_data.values,
    'אחוז חסר': missing_percentage.values
})

# הצגת רק עמודות עם ערכים חסרים
missing_df_filtered = missing_df[missing_df['ערכים חסרים'] > 0]
if len(missing_df_filtered) > 0:
    print(missing_df_filtered)
else:
    print("✅ אין ערכים חסרים בנתונים!")

# בדיקת ערכים כפולים
duplicates = traffic_data.duplicated().sum()
print(f"\n🔄 מספר שורות כפולות: {duplicates}")

💡 טיפ מעשי:

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

🧹 ניקוי ועיבוד ראשוני

preprocessing.py
# המרת עמודת הזמן לפורמט datetime
traffic_data['timestamp'] = pd.to_datetime(traffic_data['timestamp'])

# יצירת עמודות זמן נוספות לניתוח מתקדם
traffic_data['hour'] = traffic_data['timestamp'].dt.hour
traffic_data['day_of_week'] = traffic_data['timestamp'].dt.dayofweek
traffic_data['month'] = traffic_data['timestamp'].dt.month
traffic_data['day_name'] = traffic_data['timestamp'].dt.day_name()

# יצירת עמודת שעות שיא (בוליאנית)
rush_hours = [7, 8, 9, 17, 18, 19]
traffic_data['is_rush_hour'] = traffic_data['hour'].isin(rush_hours)

print("✅ עמודות זמן נוצרו בהצלחה!")
print(f"📅 טווח תאריכים: {traffic_data['timestamp'].min()} עד {traffic_data['timestamp'].max()}")
cleaning.py
# טיפול בערכים חסרים - שיטות שונות לעמודות שונות
traffic_data['avg_speed'].fillna(traffic_data['avg_speed'].median(), inplace=True)
traffic_data['temperature'].fillna(traffic_data['temperature'].mean(), inplace=True)
traffic_data['humidity'].fillna(traffic_data['humidity'].mean(), inplace=True)

def remove_outliers(df, column, method='IQR'):
    """
    הסרת ערכים חריגים באמצעות שיטת IQR (Interquartile Range)
    """
    if method == 'IQR':
        Q1 = df[column].quantile(0.25)
        Q3 = df[column].quantile(0.75)
        IQR = Q3 - Q1
        lower_bound = Q1 - 1.5 * IQR
        upper_bound = Q3 + 1.5 * IQR
        
        return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
    
    elif method == 'zscore':
        from scipy import stats
        z_scores = np.abs(stats.zscore(df[column]))
        return df[z_scores < 3]

# הסרת ערכים חריגים במהירות ובצפיפות
original_size = len(traffic_data)
clean_data = remove_outliers(traffic_data, 'avg_speed')
clean_data = remove_outliers(clean_data, 'traffic_density')
clean_data = remove_outliers(clean_data, 'vehicle_count')

removed_rows = original_size - len(clean_data)
removal_percentage = (removed_rows / original_size) * 100

print(f"📊 נתונים לפני ניקוי: {original_size:,} שורות")
print(f"📊 נתונים אחרי ניקוי: {len(clean_data):,} שורות")
print(f"🗑️ הוסרו: {removed_rows:,} שורות ({removal_percentage:.1f}%)")

02 ויזואליזציה מתקדמת של נתוני תחבורה

📈 גרפים בסיסיים לחקירת נתונים

plotting.py
# יצירת figure עם מספר subplots
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
fig.suptitle('ניתוח ראשוני של נתוני תחבורה', fontsize=16, fontweight='bold')

# 1. התפלגות מהירות ממוצעת
axes[0,0].hist(clean_data['avg_speed'], bins=50, alpha=0.7, color='skyblue', edgecolor='black')
axes[0,0].set_title('התפלגות מהירות ממוצעת')
axes[0,0].set_xlabel('מהירות (קמ"ש)')
axes[0,0].set_ylabel('תדירות')
axes[0,0].grid(True, alpha=0.3)

# 2. צפיפות תנועה לפי שעות היום
hourly_density = clean_data.groupby('hour')['traffic_density'].mean()
axes[0,1].plot(hourly_density.index, hourly_density.values, marker='o', linewidth=3, color='red', markersize=8)
axes[0,1].set_title('צפיפות תנועה ממוצעת לפי שעה')
axes[0,1].set_xlabel('שעה ביום')
axes[0,1].set_ylabel('צפיפות תנועה')
axes[0,1].grid(True, alpha=0.3)

# 3. מספר רכבים לפי יום בשבוע
daily_vehicles = clean_data.groupby('day_of_week')['vehicle_count'].mean()
days = ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת']
bars = axes[1,0].bar(range(7), daily_vehicles.values, color='lightgreen', alpha=0.8, edgecolor='darkgreen')
axes[1,0].set_title('מספר רכבים ממוצע לפי יום בשבוע')
axes[1,0].set_xlabel('יום בשבוע')
axes[1,0].set_ylabel('מספר רכבים')
axes[1,0].set_xticks(range(7))
axes[1,0].set_xticklabels(days, rotation=45)

# 4. קשר בין טמפרטורה לצפיפות תנועה
scatter = axes[1,1].scatter(clean_data['temperature'], clean_data['traffic_density'], alpha=0.5, color='orange', s=10)
axes[1,1].set_title('קשר בין טמפרטורה לצפיפות תנועה')
axes[1,1].set_xlabel('טמפרטורה (°C)')
axes[1,1].set_ylabel('צפיפות תנועה')

plt.tight_layout()
plt.show()

# הדפסת סטטיסטיקות מעניינות
print("📊 תובנות מהגרפים:")
print(f"🚗 מהירות ממוצעת: {clean_data['avg_speed'].mean():.1f} קמ\"ש")
print(f"⏰ שעת השיא: {hourly_density.idxmax()}:00")
print(f"📅 יום העמוס ביותר: {days[daily_vehicles.idxmax()]}")

🎨 ויזואליזציות מתקדמות עם Seaborn

correlation_analysis.py
# יצירת heatmap של מתאמים
plt.figure(figsize=(12, 8))

# בחירת עמודות נומריות למתאם
numeric_columns = ['vehicle_count', 'avg_speed', 'traffic_density', 
                  'temperature', 'humidity', 'hour', 'day_of_week']

correlation_matrix = clean_data[numeric_columns].corr()

# יצירת heatmap מתקדמת
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))
heatmap = sns.heatmap(correlation_matrix, mask=mask, annot=True, 
                    cmap='RdYlBu_r', center=0, square=True, fmt='.2f',
                    cbar_kws={'label': 'מקדם מתאם'}, linewidths=0.5)

plt.title('מטריצת מתאמים - נתוני תחבורה', fontsize=14, fontweight='bold', pad=20)
plt.tight_layout()
plt.show()

# הדפסת המתאמים החזקים ביותר
corr_pairs = correlation_matrix.unstack().sort_values(ascending=False)
strong_correlations = corr_pairs[(abs(corr_pairs) > 0.5) & (abs(corr_pairs) < 1.0)]

print("🔗 המתאמים החזקים ביותר:")
for pair, corr in strong_correlations.head(5).items():
    print(f" {pair[0]} ↔ {pair[1]}: {corr:.3f}")
rush_hour_analysis.py
# ניתוח דפוסי תנועה לפי שעות שיא
fig, axes = plt.subplots(1, 2, figsize=(16, 6))

# יצירת boxplot לצפיפות תנועה בשעות שיא vs רגילות
sns.boxplot(data=clean_data, x='is_rush_hour', y='traffic_density', palette='Set2', ax=axes[0])
axes[0].set_title('השוואת צפיפות תנועה: שעות שיא vs שעות רגילות')
axes[0].set_xlabel('שעות שיא (False=לא, True=כן)')
axes[0].set_ylabel('צפיפות תנועה')

# violin plot למהירות ממוצעת
sns.violinplot(data=clean_data, x='is_rush_hour', y='avg_speed', palette='viridis', ax=axes[1])
axes[1].set_title('התפלגות מהירות בשעות שיא vs רגילות')
axes[1].set_xlabel('שעות שיא (False=לא, True=כן)')
axes[1].set_ylabel('מהירות ממוצעת (קמ\"ש)')

plt.tight_layout()
plt.show()

# הוספת סטטיסטיקות מפורטות
rush_stats = clean_data.groupby('is_rush_hour').agg({
    'traffic_density': ['mean', 'median', 'std', 'min', 'max'],
    'avg_speed': ['mean', 'median', 'std'],
    'vehicle_count': ['mean', 'median']
})

print("📊 סטטיסטיקות מפורטות לפי שעות שיא:")
print(rush_stats.round(2))

# חישוב אחוזי השינוי
normal_density = clean_data[clean_data['is_rush_hour'] == False]['traffic_density'].mean()
rush_density = clean_data[clean_data['is_rush_hour'] == True]['traffic_density'].mean()
density_increase = ((rush_density - normal_density) / normal_density) * 100

print(f"\n📈 עלייה בצפיפות תנועה בשעות שיא: {density_increase:.1f}%")

🔍 תובנות מהנתונים:

03 בניית מודלים חיזויים למידת מכונה

🤖 חיזוי צפיפות תנועה

ml_training.py
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
from sklearn.preprocessing import StandardScaler, LabelEncoder

# הכנת הנתונים למודל
# בחירת features (משתנים מסבירים)
features = ['hour', 'day_of_week', 'temperature', 'humidity', 'vehicle_count', 'avg_speed', 'rush_hour']

# קידוד משתנים קטגוריאליים
le_road_type = LabelEncoder()
clean_data['road_type_encoded'] = le_road_type.fit_transform(clean_data['road_type'])
features.append('road_type_encoded')

le_weather = LabelEncoder()
clean_data['weather_encoded'] = le_weather.fit_transform(clean_data['weather_condition'])
features.append('weather_encoded')

# הגדרת X (features) ו-y (target)
X = clean_data[features]
y = clean_data['traffic_density']

# חלוקה לסטי אימון ובדיקה
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(f"📊 גודל סט אימון: {len(X_train):,} דוגמאות")
print(f"📊 גודל סט בדיקה: {len(X_test):,} דוגמאות")

# נרמול הנתונים
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# בניית מודלים
models = {
    'Linear Regression': LinearRegression(),
    'Random Forest': RandomForestRegressor(n_estimators=100, random_state=42)
}

results = {}

for name, model in models.items():
    print(f"\n🔄 אימון מודל: {name}")
    
    # אימון המודל
    if name == 'Linear Regression':
        model.fit(X_train_scaled, y_train)
        y_pred = model.predict(X_test_scaled)
    else:
        model.fit(X_train, y_train)
        y_pred = model.predict(X_test)

    # הערכת ביצועים
    mse = mean_squared_error(y_test, y_pred)
    rmse = np.sqrt(mse)
    mae = mean_absolute_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)

    results[name] = {
        'RMSE': rmse,
        'MAE': mae,
        'R²': r2,
        'predictions': y_pred
    }

    print(f"📈 RMSE: {rmse:.3f}")
    print(f"📈 MAE: {mae:.3f}")
    print(f"📈 R² Score: {r2:.3f}")
📊 גודל סט אימון: 80,541 דוגמאות 📊 גודל סט בדיקה: 20,136 דוגמאות 🔄 אימון מודל: Linear Regression 📈 RMSE: 0.234 📈 MAE: 0.187 📈 R² Score: 0.756 🔄 אימון מודל: Random Forest 📈 RMSE: 0.198 📈 MAE: 0.152 📈 R² Score: 0.823
model_evaluation.py
# ויזואליזציה של תוצאות המודלים
fig, axes = plt.subplots(1, 2, figsize=(15, 6))

for i, (name, result) in enumerate(results.items()):
    # גרף actual vs predicted
    axes[i].scatter(y_test, result['predictions'], alpha=0.5, s=10)
    axes[i].plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
    axes[i].set_xlabel('צפיפות תנועה אמיתית')
    axes[i].set_ylabel('צפיפות תנועה חזויה')
    axes[i].set_title(f'{name}\nR² = {result["R²"]:.3f}')
    axes[i].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# ניתוח חשיבות features ב-Random Forest
if 'Random Forest' in models:
    rf_model = models['Random Forest']
    feature_importance = pd.DataFrame({
        'feature': features,
        'importance': rf_model.feature_importances_
    }).sort_values('importance', ascending=False)

    plt.figure(figsize=(10, 6))
    sns.barplot(data=feature_importance, x='importance', y='feature', palette='viridis')
    plt.title('חשיבות משתנים במודל Random Forest')
    plt.xlabel('חשיבות')
    plt.ylabel('משתנה')
    plt.tight_layout()
    plt.show()

    print("🎯 חשיבות משתנים:")
    print(feature_importance)

04 בניית דשבורד אינטראקטיבי

📊 דשבורד עם Plotly ו-Dash

traffic_dashboard.py
import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots
import dash
from dash import dcc, html, Input, Output
import plotly.figure_factory as ff

# יצירת דשבורד אינטראקטיבי
def create_traffic_dashboard():
    """יצירת דשבורד מקיף לניתוח תחבורה"""
    app = dash.Dash(__name__)

    # עיצוב CSS
    app.layout = html.Div([
        html.H1("🚦 דשבורד ניתוח תחבורה חכמה", 
                style={'textAlign': 'center', 'color': '#2c3e50', 'marginBottom': 30}),
        
        # בקרות
        html.Div([
            html.Div([
                html.Label("בחר יום בשבוע:"),
                dcc.Dropdown(
                    id='day-dropdown',
                    options=[
                        {'label': 'ראשון', 'value': 0},
                        {'label': 'שני', 'value': 1},
                        {'label': 'שלישי', 'value': 2},
                        {'label': 'רביעי', 'value': 3},
                        {'label': 'חמישי', 'value': 4},
                        {'label': 'שישי', 'value': 5},
                        {'label': 'שבת', 'value': 6}
                    ],
                    value=0,
                    style={'width': '100%'}
                )
            ], style={'width': '30%', 'display': 'inline-block', 'marginRight': '5%'}),
            
            html.Div([
                html.Label("טווח שעות:"),
                dcc.RangeSlider(
                    id='hour-slider',
                    min=0, max=23, step=1,
                    marks={i: f'{i}:00' for i in range(0, 24, 4)},
                    value=[6, 22]
                )
            ], style={'width': '60%', 'display': 'inline-block'})
        ], style={'marginBottom': 30}),
        
        # גרפים
        html.Div([
            dcc.Graph(id='traffic-timeline'),
            dcc.Graph(id='speed-density-scatter'),
            dcc.Graph(id='weather-impact'),
            dcc.Graph(id='prediction-comparison')
        ])
    ])

    # Callbacks לעדכון גרפים
    @app.callback(
        [Output('traffic-timeline', 'figure'),
         Output('speed-density-scatter', 'figure'),
         Output('weather-impact', 'figure'),
         Output('prediction-comparison', 'figure')],
        [Input('day-dropdown', 'value'),
         Input('hour-slider', 'value')]
    )
    def update_graphs(selected_day, hour_range):
        # סינון נתונים
        filtered_data = clean_data[
            (clean_data['day_of_week'] == selected_day) & 
            (clean_data['hour'] >= hour_range[0]) & 
            (clean_data['hour'] <= hour_range[1])
        ]
        
        # גרף 1: ציר זמן של תנועה
        hourly_traffic = filtered_data.groupby('hour').agg({
            'vehicle_count': 'mean',
            'traffic_density': 'mean',
            'avg_speed': 'mean'
        }).reset_index()
        
        fig1 = make_subplots(specs=[[{"secondary_y": True}]])
        
        fig1.add_trace(
            go.Scatter(x=hourly_traffic['hour'], y=hourly_traffic['vehicle_count'],
                      name='מספר רכבים', line=dict(color='blue')),
            secondary_y=False
        )
        
        fig1.add_trace(
            go.Scatter(x=hourly_traffic['hour'], y=hourly_traffic['avg_speed'],
                      name='מהירות ממוצעת', line=dict(color='red')),
            secondary_y=True
        )
        
        fig1.update_xaxes(title_text="שעה")
        fig1.update_yaxes(title_text="מספר רכבים", secondary_y=False)
        fig1.update_yaxes(title_text="מהירות (קמ\"ש)", secondary_y=True)
        fig1.update_layout(title_text="דפוסי תנועה לאורך היום")
        
        # גרף 2: קשר מהירות-צפיפות
        fig2 = px.scatter(filtered_data, x='avg_speed', y='traffic_density',
                         color='rush_hour', size='vehicle_count',
                         title='קשר בין מהירות לצפיפות תנועה',
                         labels={'avg_speed': 'מהירות ממוצעת (קמ"ש)', 'traffic_density': 'צפיפות תנועה'})
        
        # גרף 3: השפעת מזג האוויר
        weather_impact = filtered_data.groupby('weather_condition')['traffic_density'].mean().reset_index()
        fig3 = px.bar(weather_impact, x='weather_condition', y='traffic_density',
                     title='השפעת מזג האוויר על צפיפות התנועה',
                     labels={'weather_condition': 'מזג אוויר', 'traffic_density': 'צפיפות תנועה ממוצעת'})
        
        # גרף 4: השוואת חיזויים
        sample_data = filtered_data.sample(min(1000, len(filtered_data)))
        if len(sample_data) > 0:
            sample_features = sample_data[features]
            predictions = models['Random Forest'].predict(sample_features)
            
            fig4 = go.Figure()
            fig4.add_trace(go.Scatter(y=sample_data['traffic_density'], mode='markers', name='אמיתי'))
            fig4.add_trace(go.Scatter(y=predictions, mode='markers', name='חזוי'))
            fig4.update_layout(title='השוואת חיזויים (מדגם של 1000 נקודות)')
        else:
            fig4 = go.Figure()
            
        return fig1, fig2, fig3, fig4

    return app

if __name__ == '__main__':
    app = create_traffic_dashboard()
    print("🚀 הדשבורד רץ על: http://localhost:8050")
    # app.run_server(debug=True)

🎮 דמו אינטראקטיבי

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

05 פרויקט סיום: מערכת ניטור תחבורה חכמה

🎯 מטלת הפרויקט הסופי

📋 דרישות הפרויקט:

חלק A: ניתוח נתונים
  • ✓ טעינה וניקוי של נתוני תחבורה
  • ✓ ניתוח סטטיסטי מקיף
  • ✓ זיהוי דפוסים ומגמות
  • ✓ טיפול בערכים חסרים וחריגים
חלק B: מודלים חיזויים
  • ✓ בניית 3 מודלים שונים לפחות
  • ✓ השוואת ביצועים
  • ✓ אופטימיזציה של היפר-פרמטרים
  • ✓ הערכת דיוק וביצועים
חלק C: ויזואליזציה
  • ✓ 10 גרפים מתקדמים לפחות
  • ✓ דשבורד אינטראקטיבי
  • ✓ מפות גיאוגרафיות
  • ✓ אנימציות וגרפים דינמיים
חלק D: מסקנות
  • ✓ דוח מקיף עם תובנות
  • ✓ המלצות מעשיות
  • ✓ הצגת מגבלות וחסרונות
  • ✓ הצעות לפיתוח עתידי
smart_traffic_analyzer.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import os
import json

class SmartTrafficAnalyzer:
    """מחלקה מקיפה לניתוח נתוני תחבורה חכמה"""

    def __init__(self, data_path):
        """אתחול המערכת"""
        self.data_path = data_path
        self.raw_data = None
        self.clean_data = None
        self.models = {}
        self.results = {}

    def load_and_clean_data(self):
        """טעינה וניקוי נתונים"""
        print("📊 טוען נתונים...")
        try:
            self.raw_data = pd.read_csv(self.data_path)
            print(f"✅ נטענו {len(self.raw_data):,} שורות")
            # ניקוי בסיסי
            self.clean_data = self.raw_data.dropna()
            print(f"🧹 אחרי ניקוי: {len(self.clean_data):,} שורות")
        except Exception as e:
            print(f"❌ שגיאה בטעינת נתונים: {e}")

    def exploratory_analysis(self):
        """ניתוח חקרני מקיף"""
        print("🔍 מבצע ניתוח חקרני...")
        if self.clean_data is None:
            print("❌ אין נתונים לניתוח. הריצו load_and_clean_data() קודם")
            return
        # סטטיסטיקות בסיסיות
        print("\n📈 סטטיסטיקות בסיסיות:")
        print(self.clean_data.describe())

    def build_prediction_models(self):
        """בניית מודלים חיזויים"""
        print("🤖 בונה מודלים חיזויים...")
        if self.clean_data is None:
            print("❌ אין נתונים למודלים. הריצו load_and_clean_data() קודם")
            return

        self.models['Linear Regression'] = LinearRegression()
        self.models['Random Forest'] = RandomForestRegressor(n_estimators=100)
        self.models['Gradient Boosting'] = GradientBoostingRegressor()
        print(f"✅ נבנו {len(self.models)} מודלים")

    def evaluate_models(self):
        """הערכת ביצועי המודלים"""
        print("📈 מעריך ביצועי מודלים...")
        if not self.models:
            print("❌ אין מודלים להערכה. הריצו build_prediction_models() קודם")
            return
        
        # כאן מוסיפים לוגיקת אימון והערכה
        for name, model in self.models.items():
            print(f"🔄 מעריך מודל: {name}")

    def create_dashboard(self):
        """יצירת דשבורד אינטראקטיבי"""
        print("📊 יוצר דשבורד...")
        # כאן מוסיפים לוגיקת דשבורד

    def generate_insights(self):
        """יצירת תובנות ומסקנות"""
        print("💡 מפיק תובנות...")
        insights = {
            'peak_hours': "שעות השיא הן 7-9 ו-17-19",
            'weather_impact': "גשם מקטין מהירות ב-15% בממוצע",
            'best_model': "Random Forest עם R² של 0.823",
            'recommendations': [
                "הוספת נתיבי תחבורה ציבורית בשעות השיא",
                "מערכת התרעה מוקדמת למזג אוויר קשה",
                "אופטימיזציה של רמזורים לפי דפוסי תנועה"
            ]
        }
        return insights

    def export_results(self, output_path='results'):
        """ייצוא תוצאות לקבצים"""
        print(f"💾 מייצא תוצאות ל-{output_path}/")
        os.makedirs(output_path, exist_ok=True)
        if self.clean_data is not None:
            self.clean_data.to_csv(f'{output_path}/clean_data.csv', index=False)
        if self.results:
            with open(f'{output_path}/model_results.json', 'w', encoding='utf-8') as f:
                json.dump(self.results, f, ensure_ascii=False, indent=2)

    def run_full_analysis(self):
        """הרצת ניתוח מלא"""
        print("🚀 מתחיל ניתוח מקיף...")
        self.load_and_clean_data()
        self.exploratory_analysis()
        self.build_prediction_models()
        self.evaluate_models()
        self.create_dashboard()
        insights = self.generate_insights()
        self.export_results()
        print("✅ ניתוח הושלם בהצלחה!")
        return insights

if __name__ == "__main__":
    analyzer = SmartTrafficAnalyzer('traffic_data.csv')
    results = analyzer.run_full_analysis()
    print("\n🎯 תובנות עיקריות:")
    for key, value in results.items():
        print(f" {key}: {value}")

⏰ לוח זמנים מוצע:

שבוע 1: טעינה, ניקוי וחקירה ראשונית

שבוע 2: ויזואליזציות מתקדמות

שבוע 3: בניית מודלים חיזויים

שבוע 4: דשבורד ודוח סופי

💪 תרגילים מעשיים

🎯 תרגיל 1: ניתוח דפוסי תנועה

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

רמז: התמקדו בהבדלים בין ימי השבוע, השפעת מזג האוויר ושעות השיא.

🎯 תרגיל 2: אופטימיזציה של מודל

שפרו את מודל Random Forest באמצעות Grid Search ו-Cross Validation. השיגו R² של 0.85 לפחות.

רמז: נסו פרמטרים שונים כמו n_estimators, max_depth ו-min_samples_split.

🎯 תרגיל 3: מפת חום גיאוגרפית

צרו מפת חום המציגה את צפיפות התנועה במיקומים שונים באמצעות Folium או Plotly.

רמז: השתמשו בקואורדינטות GPS ויצרו אנימציה לאורך זמן.

🎯 תרגיל 4: מערכת התרעה

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

רמז: השתמשו בסטטיסטיקות ובמודלים לזיהוי חריגות (Anomaly Detection).

🧠 בוחן מעשי מתקדם

1. איזה מודל למידת מכונה הכי מתאים לחיזוי צפיפות תנועה?

2. מה הפונקציה הנכונה להסרת ערכים חריגים ב-Pandas?

3. איזה ספרייה הכי מתאימה ליצירת דשבורד אינטראקטיבי?

4. מה המטריקה הטובה ביותר להערכת מודל רגרסיה?

5. מה הדרך הנכונה לטיפול בנתונים קטגוריאליים?

🔗 משאבים נוספים

📚 קורסים מתקדמים

📞 צור קשר

📧 [email protected]

📱 050-123-4567

🌐 https://edu-manage.org

© 2024 EduManage. כל הזכויות שמורות. | מדיניות פרטיות | תנאי שימוש

עוצב ופותח עם ❤️ לקהילת הלומדים הישראלית