Proje: kış tarifesinde tampon nereye?
Kanat Havayolları operasyon müdürü soruyor: "Eylülden beri geç kalkışlar artıyor. Kış tarifesinde bazı seferlerin planına 15 dakika tampon koyabilirim ama hepsine koyamam, uçağı boşa bekletmek pahalı. Nereye koyalım?" Bu proje bir analistin gerçek işini baştan sona yaptırır: veriyi oku, sorunlarını anla, temizle, analiz et, grafiği çiz, kararı yaz.
| Adım | Soru | Çıktı |
|---|---|---|
| 1. Oku ve denetle | Elimde ne var? | denetle |
| 2. Temizle | Hangi satırlar ve tanımlar? | temizle |
| 3. Analiz | Sorun nerede yoğun? | grup_ozeti, neden_ozeti |
| 4. Grafik | Nasıl gösteririm? | grafik |
| 5. Senaryo | Tampon ne kazandırır? | tampon_etkisi |
| 6. Karar | Ne öneririm? | karar, rapor |
Önce veriyi tanı
Her analiz aynı soruyla başlar: bu tablo ne anlatıyor, nerede eksik? Burada boş değerlerin bir anlamı var: iptal seferde gerçek zaman olmaz, yön değiştiren seferde varış zamanı boştur.
import pandas as pd
import veri
TARIHLER = ["sched_dep", "sched_arr", "actual_dep", "actual_arr"]
def oku():
ucus = veri.oku("kanat_havayollari", "hv_flights", parse_dates=TARIHLER)
rotar = veri.oku("kanat_havayollari", "hv_delays")
rota = veri.oku("kanat_havayollari", "hv_routes")
return ucus, rotar, rota
ucus, rotar, rota = oku()
print(len(ucus), "sefer", ucus["status"].value_counts().to_dict())
print(ucus[["actual_dep", "actual_arr"]].isna().sum().to_dict())
print(len(rotar), "rötar satırı,", rotar["flight_id"].nunique(), "sefer")
Son satır bir tuzağı gösteriyor: 1.350 rötar satırı 1.228 seferi anlatıyor, çünkü bir seferin birden çok nedeni olabilir.
Tanımları yaz
Analizde en çok tartışma tanımlardan çıkar. Bu projenin tanımları: geç kalkış, planlanandan 15 dakikayı aşan kalkıştır; iptaller gecikme hesabına girmez, ayrı sayılır; dilimler sabah (12'den önce), öğle (12-18), akşam (18 ve sonrası). Tanımı değiştirirsen sonuç değişir, bu yüzden raporda da yazılır.
Sonuç nereye işaret ediyor?
İptaller çıkınca 3.111 sefer kalıyor ve %37,9 geç kalkış var. Dilimlere ayırınca fark görünür:
| Dilim | Sefer | Geç oranı | Medyan gecikme |
|---|---|---|---|
| akşam | 1.096 | %47,4 | 14,0 dk |
| sabah | 1.260 | %33,0 | 5,0 dk |
| öğle | 755 | %32,2 | 5,0 dk |
Aylara bakınca oran Eylül'de %29,8 iken Aralık'ta %51,0. Neden tarafında en çok dakikayı hava kaybettiriyor (%32,6). Bu önemli bir uyarıdır: tampon hava koşulunu çözmez, yalnız yolcunun gördüğü gecikmeyi azaltır. Rapora bunu yazmak senin işin.
Grafik karar için çizilir
import matplotlib.pyplot as plt
import pandas as pd
ozet = pd.DataFrame({'dilim': ['akşam', 'sabah', 'öğle'], 'gec_orani': [47.4, 33.0, 32.2]})
fig, ax = plt.subplots(figsize=(6, 3.5))
ax.bar(ozet["dilim"], ozet["gec_orani"], color="#3b6ea8")
ax.set_title("Zaman dilimine göre geç kalkış oranı")
ax.set_ylabel("Geç kalkış oranı (%)")
ax.set_ylim(0, None)
plt.show()
Başlık ne gösterdiğini söyler, eksen birimini yazar, sütun ekseni sıfırdan başlar. Tek bir renk yeter; karar sütunların yüksekliğindedir.
Kararı yaz
Hesabın sonunda elinde bir öneri olmalı. Akşam dilimine 15 dakika tampon, tüm seferlerde geç kalkış oranını %37,9 seviyesinden %27,9 seviyesine indirirdi; 310 sefer geç sayılmaktan çıkardı. Bu varsayımlı bir hesaptır, ölçüm değildir: rötarın kendisi değişmez varsayıldı. İyi bir karar notu bunu saklamaz, küçük bir deneme önerir.
Projeyi portföye taşı
Aynı akışı kendi bilgisayarında bir defterde yap ve sonucu tek sayfalık nota dök. Rotaları ekle (en az 50 sefer eşiğiyle), hv_bookings ile geciken yolcu sayısını bağla, tamponun maliyetine bir varsayım koy. Görüşmede en çok şunu sorarlar: "Bu sonuca neden güveniyorsun, ne yanlış olabilir?" Cevabın burada: tanımlar, çıkarılan satırlar, bire çok tuzağı, senaryo varsayımı.