다음을 통해 공유


튜토리얼: R을 사용하여 항공편 지연을 예측하는 방법

이 튜토리얼은 Microsoft Fabric에서 Synapse 데이터 과학 워크플로우의 종단 간 예제를 제공합니다. nycflights13 데이터 리소스와 R을 모두 사용하여 비행기가 30분 이상 늦게 도착하는지 여부를 예측합니다. 그런 다음 예측 결과를 사용하여 대화형 Power BI 대시보드를 구축합니다.

이 튜토리얼에서는 다음을 배우게 됩니다:

  • tidymodels 패키지 사용

  • 출력 데이터를 레이크하우스에 델타 테이블로 기록하세요.

  • 그 레이크하우스의 데이터를 직접 액세스하기 위해 Power BI 시각 보고서를 작성하세요.

Prerequisites

  • 노트북을 열거나 새로 만드세요. 방법을 배우려면 How to use Microsoft Fabric notebooks를 참조하세요.

  • 언어 옵션을 SparkR(R) 로 설정하여 기본 언어를 변경합니다.

  • 노트북을 레이크하우스에 연결합니다. 왼쪽에서 추가 를 선택하여 기존 레이크하우스를 추가하거나 레이크하우스를 만듭니다.

패키지 설치

이 튜토리얼의 코드를 사용하려면 nycflights13 패키지를 설치하세요.

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

데이터를 탐색하다

nycflights13 데이터에는 2013년에 뉴욕 근처에 도착한 325,819편의 항공편에 대한 정보가 포함되어 있습니다. 먼저 비행 지연의 분포를 조사하십시오. 다음 코드 셀은 도착 지연 분포가 오른쪽으로 치우쳐져 있음을 보여주는 그래프를 생성합니다.

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

다음 이미지와 같이 높은 값에 긴 꼬리가 있습니다.

비행 지연 그래프를 보여 주는 스크린샷.

데이터를 불러오고, 변수에 몇 가지 변경을 가하십시오.

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)

모델을 빌드하기 전에 전처리 및 모델링 모두에 중요한 몇 가지 특정 변수를 고려합니다.

arr_delay 변수는 요소 변수입니다. 로지스틱 회귀 모델 훈련을 위해 결과 변수는 요인 변수여야 합니다.

glimpse(flight_data)

이 데이터셋에서 약 16%의 항공편이 30분 이상 지연되어 도착했습니다.

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

dest 기능에는 104개의 항공편 목적지가 있습니다.

unique(flight_data$dest)

16개의 개별 운송업체가 있습니다.

unique(flight_data$carrier)

데이터 분할

단일 데이터 세트를 두 세트로 나누세요: 훈련 세트와 테스트 세트. 학습 데이터 세트의 원래 데이터 세트(임의로 선택된 하위 집합)에 있는 대부분의 행을 유지합니다. 학습 데이터셋을 사용하여 모델을 적합하게 하고, 테스트 데이터셋을 사용하여 모델 성능을 측정하세요.

rsample 패키지를 사용하여 데이터를 분할하는 방법에 대한 정보를 포함하는 객체를 만드세요. 그런 다음, 두 개의 함수를 더 rsample 사용하여 학습 및 테스트 집합에 대한 DataFrame을 만듭니다.

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)

레시피와 역할을 생성하세요.

단순 로지스틱 회귀 모델에 대한 레시피를 작성하세요. 모델을 훈련하기 전에, 레시피를 사용하여 새로운 예측 변수를 만들고, 모델이 필요한 전처리를 수행하십시오.

레시피가 flighttime_hour가 변수임을 알 수 있도록 update_role() 함수와 사용자 지정 역할인 ID을 함께 사용합니다. 역할에는 어떤 문자 값도 가질 수 있습니다. 수식에는 학습 집합의 모든 변수가 예측 변수로 포함됩니다(제외) arr_delay. 레시피는 이 두 개의 ID 변수를 유지하지만, 이를 출력 결과나 예측 변수로 사용하지 않습니다.

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

현재 변수 및 역할 집합을 보려면 다음 함수를 summary() 사용합니다.

summary(flights_rec)

기능 생성

특성 엔지니어링은 모델을 개선할 수 있습니다. 항공편 날짜는 지연 도착 가능성에 합리적인 영향을 미칠 수 있습니다.

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

날짜에서 유래되어 모델에 잠재적인 중요성을 가질 수 있는 모델 용어를 추가하면 도움이 될 수 있습니다. 단일 날짜 변수를 사용하여 다음과 같은 의미 있는 특징을 도출하십시오.

  • 요일
  • 날짜가 공휴일과 일치하는지 여부

세 가지 단계를 레시피에 추가하세요.

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())

레시피로 모델을 맞추기

로지스틱 회귀를 사용하여 비행 데이터를 모델링합니다. 먼저 패키지를 사용하여 모델 사양을 빌드합니다.parsnip

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

workflows 패키지를 사용하여 parsnip 모델(lr_mod)을 flights_rec 레시피와 함께 번들로 묶습니다.

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

flights_wflow

모델을 훈련시키다

이 함수는 레시피를 준비하고, 결과 예측 변수들로부터 모델을 학습시킬 수 있습니다.

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

워크플로우에서 모델 또는 레시피 객체를 추출하려면 도우미 함수 xtract_fit_parsnip()extract_recipe()를 사용하세요. 이 예제에서는 최적화된 모델 객체를 가져온 다음, broom::tidy() 함수를 사용하여 모델 계수의 깔끔한 tibble을 얻습니다.

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

결과 예측

보이지 않는 테스트 데이터에 대한 예측을 하기 위해 학습된 워크플로(flights_fit)를 단일 호출로 predict()을 사용합니다. predict() 메서드는 새 데이터에 레시피를 적용하고, 결과를 학습된 모델에 전달합니다.

predict(flights_fit, test_data)

출력 predict()을 가져와서 예측된 클래스 lateon_time 중 하나를 반환합니다. 각 항공편에 대한 예측된 클래스 확률을 위해, 모델과 테스트 데이터를 결합하여 augment()를 사용하여 함께 저장하십시오.

flights_aug <- 
  augment(flights_fit, test_data)

데이터를 검토하십시오.

glimpse(flights_aug)

모형 평가하기

이제 예측된 클래스 확률을 담고 있는 티블이 있습니다. 처음 몇 줄에서 모델은 다섯 번의 정시 항공편을 정확하게 예측했습니다 (values of .pred_on_time are p > 0.50). 그러나 우리는 총 81,455개의 행에 대한 예측이 필요합니다.

arr_delay 결과 변수의 실제 상태와 비교하여 모델이 늦은 도착을 얼마나 잘 예측했는지를 알려주는 지표가 필요합니다.

곡선하 적분 수신기 작동 특성 (AUC-ROC)을 지표로 사용하십시오. roc_curve() 패키지에서 제공되는 roc_auc()yardstick로 계산하십시오.

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

Power BI 보고서 작성

모델 결과가 좋아 보입니다. 비행 지연 예측 결과를 활용하여 인터랙티브 Power BI 대시보드를 구축하세요. 대시보드는 항공사별 비행 횟수와 목적지별 비행 횟수를 보여줍니다. 대시보드는 지연 예측 결과를 기준으로 필터링할 수 있습니다.

Power BI 보고서에서 항공사별 항공편 수 및 목적지별 항공편 수에 대한 막대 차트를 보여주는 스크린샷입니다.

예측 결과 데이터 세트에 운송 업체 이름과 공항 이름을 포함하십시오.

  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)

데이터를 검토하십시오.

glimpse(flights_clean)

데이터를 Spark 데이터프레임으로 변환하십시오.

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

당신의 레이크하우스에서 데이터를 델타 테이블에 기록하세요.

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

델타 테이블을 사용하여 의미론적 모델을 만드십시오.

  1. 왼쪽 네비게이션에서 작업 공간을 선택한 후, 오른쪽 상단의 텍스트 상자에 메모장에 연결한 레이크하우스의 이름을 입력하세요. 다음 스크린샷은 우리가 My Workspace를 선택했음을 보여줍니다.

    초기 레이크하우스 선택 단계를 보여주는 스크린샷.

  2. 전자 필기장에 첨부한 레이크하우스의 이름을 입력합니다. 우리는 다음 스크린샷에 표시된 대로 test_lakehouse1에 들어갑니다.

    특정 레이크하우스를 선택한 화면 캡처.

  3. 필터링된 결과 영역에서 다음 스크린샷에 표시된 대로 레이크하우스를 선택하십시오.

    선택한 레이크하우스를 보여 주는 스크린샷.

  4. 다음 스크린샷과 같이 새 의미 체계 모델을 선택합니다.

    새로운 의미론적 모델의 생성을 보여주는 스크린샷.

  5. 새 의미 모델 창에서 새 의미 모델의 이름을 입력하고, 작업 공간을 선택한 후 새 모델에 사용할 테이블을 선택합니다. 그런 다음, 다음 스크린샷에 표시된 대로 확인을 선택합니다.

    새로운 의미 모델의 매개변수를 보여주는 스크린샷입니다.

  6. 새 보고서를 작성하려면 아래 스크린샷에 표시된 대로 Create new report을(를) 선택하세요.

    새로운 보고서 생성을 보여주는 스크린샷.

  7. 데이터시각화 창에서 보고서 캔버스로 필드를 선택하거나 끌어 보고서를 작성합니다.

    보고서의 데이터 및 시각화 세부사항을 보여주는 스크린샷.

이 섹션의 시작 부분에 표시된 보고서를 생성하려면, 이러한 시각화 및 데이터를 사용하십시오.

  1. 다음이 포함된 누적 막대 차트:
    1. Y축: carrier_name
    2. X축: flight. 집계를 위해서 개수 선택
    3. 범례: origin_name
  2. 다음이 포함된 누적 막대 차트:
    1. Y축: dest_name
    2. X축: flight. 집계용 개수 선택
    3. 범례: origin_name
  3. 자르기 도구 포함:
    1. 필드: _pred_class
  4. 자르기 도구 포함:
    1. 필드: _pred_late