Bagikan melalui


Tutorial: Menggunakan R untuk memprediksi penundaan penerbangan

Tutorial ini menyajikan contoh menyeluruh dari alur kerja Synapse Data Science di Microsoft Fabric. Ini menggunakan nycflights13 data, dan R, untuk memprediksi apakah pesawat terlambat datang lebih dari 30 menit atau tidak. Kemudian menggunakan hasil prediksi untuk membangun dasbor Power BI interaktif.

Dalam tutorial ini, Anda mempelajari cara:

  • Gunakan paket tidymodels ( resep, parsnip, rsample, alur kerja ) untuk memproses data dan melatih model pembelajaran mesin
  • Tuliskan data keluaran ke lakehouse sebagai tabel delta
  • Buat laporan visual Power BI untuk mengakses data secara langsung di lakehouse tersebut

Prasyarat

  • Dapatkan langganan Microsoft Fabric . Atau, daftar untuk uji coba Microsoft Fabric gratis.

  • Masuk ke Microsoft Fabric.

  • Gunakan pengalih pengalaman di sisi kiri bawah halaman beranda Anda untuk beralih ke Fabric.

    Cuplikan layar menu pengalih pengalaman, memperlihatkan tempat untuk memilih Ilmu Data.

  • Buka atau buat buku catatan. Untuk mempelajari caranya, lihat Cara menggunakan notebook Microsoft Fabric.

  • Atur opsi bahasa ke SparkR (R) untuk mengubah bahasa utama.

  • Lampirkan buku catatan Anda ke lakehouse. Di sisi kiri, pilih Tambahkan untuk menambahkan lakehouse yang ada atau untuk membuat lakehouse.

Menginstal paket

Instal paket nycflights13 untuk menggunakan kode dalam tutorial ini.

install.packages("nycflights13")
# Load the packages
library(tidymodels)      # For tidymodels packages
library(nycflights13)    # For flight data

Menjelajahi data

Data nycflights13 memiliki informasi tentang 325.819 penerbangan yang tiba di dekat New York City pada tahun 2013. Pertama, lihat distribusi keterlambatan penerbangan. Grafik ini menunjukkan bahwa distribusi penundaan kedatangan condong ke kanan. Ini memiliki ekor panjang pada nilai-nilai tinggi.

ggplot(flights, aes(arr_delay)) + geom_histogram(color="blue", bins = 300)

Cuplikan layar yang menunjukkan grafik keterlambatan penerbangan.

Muat data, dan buat beberapa perubahan pada variabel:

set.seed(123)

flight_data <- 
  flights %>% 
  mutate(
    # Convert the arrival delay to a factor
    arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),
    arr_delay = factor(arr_delay),
    # You'll use the date (not date-time) for the recipe that you'll create
    date = lubridate::as_date(time_hour)
  ) %>% 
  # Include weather data
  inner_join(weather, by = c("origin", "time_hour")) %>% 
  # Retain only the specific columns that you'll use
  select(dep_time, flight, origin, dest, air_time, distance, 
         carrier, date, arr_delay, time_hour) %>% 
  # Exclude missing data
  na.omit() %>% 
  # For creating models, it's better to have qualitative columns
  # encoded as factors (instead of character strings)
  mutate_if(is.character, as.factor)

Sebelum kita membangun model, pertimbangkan beberapa variabel tertentu yang penting untuk praproscesing dan pemodelan.

Variabel arr_delay adalah variabel faktor. Untuk pelatihan model regresi logistik, penting bahwa variabel hasil adalah variabel faktor.

glimpse(flight_data)

Sekitar 16% penerbangan dalam himpunan data ini terlambat datang lebih dari 30 menit.

flight_data %>% 
  count(arr_delay) %>% 
  mutate(prop = n/sum(n))

Fitur dest memiliki 104 tujuan penerbangan.

unique(flight_data$dest)

Ada 16 operator berbeda.

unique(flight_data$carrier)

Memisahkan data

Pisahkan dataset tunggal menjadi dua set: set pelatihan dan set pengujian. Simpan sebagian besar baris dalam himpunan data asli (sebagai subset yang dipilih secara acak) dalam himpunan data pelatihan. Gunakan himpunan data pelatihan agar sesuai dengan model, dan gunakan himpunan data pengujian untuk mengukur performa model.

Gunakan paket rsample untuk membuat objek yang berisi informasi tentang cara membagi data. Kemudian, gunakan dua fungsi rsample lagi untuk membuat DataFrames untuk set pelatihan dan pengujian:

set.seed(123)
# Keep most of the data in the training set 
data_split <- initial_split(flight_data, prop = 0.75)

# Create DataFrames for the two sets:
train_data <- training(data_split)
test_data  <- testing(data_split)

Membuat resep dan peran

Buat resep untuk model regresi logistik sederhana. Sebelum melatih model, gunakan resep untuk membuat prediktor baru, dan lakukan pra-pemrosesan yang diperlukan model.

Gunakan fungsi update_role() sehingga resep tahu bahwa flight dan time_hour adalah variabel, dengan peran kustom yang disebut ID. Peran dapat memiliki nilai karakter apa pun. Rumus mencakup semua variabel dalam set pelatihan, selain arr_delay, sebagai prediktor. Resep menyimpan dua variabel ID ini tetapi tidak menggunakannya sebagai hasil atau prediktor.

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") 

Untuk melihat kumpulan variabel dan peran saat ini, gunakan fungsi summary():

summary(flights_rec)

Membuat fitur

Lakukan beberapa rekayasa fitur untuk meningkatkan model Anda. Tanggal penerbangan mungkin memiliki efek yang wajar pada kemungkinan keterlambatan kedatangan.

flight_data %>% 
  distinct(date) %>% 
  mutate(numeric_date = as.numeric(date)) 

Ini mungkin membantu menambahkan istilah model yang berasal dari tanggal yang berpotensi memiliki kepentingan untuk model. Dapatkan fitur yang bermakna berikut dari variabel tanggal tunggal:

  • Hari dalam seminggu
  • Bulan
  • Apakah tanggal sesuai dengan hari libur atau tidak

Tambahkan tiga langkah ke resep Anda:

flights_rec <- 
  recipe(arr_delay ~ ., data = train_data) %>% 
  update_role(flight, time_hour, new_role = "ID") %>% 
  step_date(date, features = c("dow", "month")) %>%               
  step_holiday(date, 
               holidays = timeDate::listHolidays("US"), 
               keep_original_cols = FALSE) %>% 
  step_dummy(all_nominal_predictors()) %>% 
  step_zv(all_predictors())

Sesuaikan model dengan prosedur

Gunakan regresi logistik untuk memodelkan data penerbangan. Pertama, bangun spesifikasi model dengan paket parsnip:

lr_mod <- 
  logistic_reg() %>% 
  set_engine("glm")

Gunakan paket workflows untuk memaketkan model parsnip Anda (lr_mod) dengan resep Anda (flights_rec):

flights_wflow <- 
  workflow() %>% 
  add_model(lr_mod) %>% 
  add_recipe(flights_rec)

flights_wflow

Melatih model

Fungsi ini dapat menyiapkan resep, dan melatih model dari prediktor yang dihasilkan:

flights_fit <- 
  flights_wflow %>% 
  fit(data = train_data)

Gunakan fungsi pembantu xtract_fit_parsnip() dan extract_recipe() untuk mengekstrak objek model atau resep dari alur kerja. Dalam contoh ini, ambil objek model yang telah dipasang, lalu gunakan fungsi broom::tidy() untuk mendapatkan tibble yang rapi dari koefisien model.

flights_fit %>% 
  extract_fit_parsnip() %>% 
  tidy()

Memprediksi hasil

Satu panggilan ke predict() menggunakan alur kerja terlatih (flights_fit) untuk membuat prediksi dengan data pengujian yang belum terlihat. Metode predict() menerapkan resep ke data baru, lalu meneruskan hasilnya ke model yang pas.

predict(flights_fit, test_data)

Dapatkan output dari predict() untuk mengembalikan kelas yang diprediksi: late versus on_time. Namun, untuk probabilitas kelas yang telah diprediksi untuk setiap penerbangan, gunakan augment() pada model, dikombinasikan dengan data pengujian, agar dapat disimpan bersama.

flights_aug <- 
  augment(flights_fit, test_data)

Tinjau data:

glimpse(flights_aug)

Evaluasi model

Kita sekarang memiliki tibble dengan probabilitas kelas yang diprediksi. Dalam beberapa baris pertama, model memprediksi lima penerbangan tepat waktu dengan benar (nilai .pred_on_timep > 0.50). Namun, kita memiliki total 81.455 baris untuk diprediksi.

Kami memerlukan metrik yang memberi tahu seberapa baik model memprediksi keterlambatan kedatangan, dibandingkan dengan status sebenarnya dari variabel hasil Anda, arr_delay.

Gunakan Area di Bawah Karakteristik Operasi Penerima Kurva (AUC-ROC) sebagai metrik. Komputasi dengan roc_curve() dan roc_auc(), dari paket yardstick:

flights_aug %>% 
  roc_curve(truth = arr_delay, .pred_late) %>% 
  autoplot()

Membuat laporan Power BI

Hasil model terlihat bagus. Gunakan hasil prediksi penundaan penerbangan untuk membangun dasbor Power BI interaktif. Dasbor menunjukkan jumlah penerbangan berdasarkan operator, dan jumlah penerbangan berdasarkan tujuan. Dasbor dapat memfilter berdasarkan hasil prediksi penundaan.

Cuplikan layar yang memperlihatkan bagan batang untuk jumlah penerbangan menurut operator dan jumlah penerbangan menurut tujuan dalam laporan Power BI.

Sertakan nama operator dan nama bandara dalam himpunan data hasil prediksi:

  flights_clean <- flights_aug %>% 
  # Include the airline data
  left_join(airlines, c("carrier"="carrier"))%>% 
  rename("carrier_name"="name") %>%
  # Include the airport data for origin
  left_join(airports, c("origin"="faa")) %>%
  rename("origin_name"="name") %>%
  # Include the airport data for destination
  left_join(airports, c("dest"="faa")) %>%
  rename("dest_name"="name") %>%
  # Retain only the specific columns you'll use
  select(flight, origin, origin_name, dest,dest_name, air_time,distance, carrier, carrier_name, date, arr_delay, time_hour, .pred_class, .pred_late, .pred_on_time)

Tinjau data:

glimpse(flights_clean)

Konversikan data ke Spark DataFrame:

sparkdf <- as.DataFrame(flights_clean)
display(sparkdf)

Tulis data ke dalam tabel delta di lakehouse Anda:

# Write data into a delta table
temp_delta<-"Tables/nycflight13"
write.df(sparkdf, temp_delta ,source="delta", mode = "overwrite", header = "true")

Gunakan tabel delta untuk membuat model semantik.

  1. Di sebelah kiri, pilih OneLake

  2. Pilih lakehouse yang Anda lampirkan ke buku catatan Anda

  3. Pilih Buka

    Cuplikan layar yang menunjukkan tombol untuk membuka rumah danau.

  4. Pilih Model semantik baru

  5. Pilih nycflight13 untuk model semantik baru Anda, lalu pilih Konfirmasi

  6. Model semantik Anda dibuat. Pilih Laporan baru

  7. Pilih atau seret bidang dari Data dan visualisasi ke kanvas laporan untuk membuat laporan Anda

    Cuplikan layar yang memperlihatkan detail data dan visualisasi untuk laporan.

Untuk membuat laporan yang diperlihatkan di awal bagian ini, gunakan visualisasi dan data ini:

  1. bagan batang tumpuk dengan:
    1. Sumbu Y: carrier_name
    2. Sumbu X: penerbangan. Pilih Jumlah untuk agregasi
    3. Legenda: origin_name
  2. bagan batang tumpuk dengan:
    1. Sumbu Y: dest_name
    2. Sumbu X: penerbangan. Pilih Jumlah untuk agregasi
    3. Legenda: origin_name
  3. Pemotong dilengkapi dengan:
    1. Bidang: _pred_class
  4. Pengiris dengan:
    1. Bidang: _pred_late