Required packages

library(readr)
library(tidyr)
library(lubridate)
library(dplyr)
library(outliers)
library(forecast)

Executive Summary

RPubs link information: RPubs Link

Data

The data consist the information on number of on-time / delayed / cancelled / diverted flights based on travel consumer report of 2015 marked by BUREAU OF Transportation statistics, Department of Transportation, US. The data is split across three different csv files (airlines, airports and flights). A large data set with the name flightdata is created by merging the other available and related data.

setwd("C:/Users/Harri/OneDrive/Masters of Analytics/S1_MATH2349 Data Preprocessing")
The working directory was changed to C:/Users/Harri/OneDrive/Masters of Analytics/S1_MATH2349 Data Preprocessing inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
airports <- read_csv("airports.csv")
Parsed with column specification:
cols(
  IATA_CODE = col_character(),
  AIRPORT = col_character(),
  CITY = col_character(),
  STATE = col_character(),
  COUNTRY = col_character(),
  LATITUDE = col_double(),
  LONGITUDE = col_double()
)
airports <- data.frame(airports, stringsAsFactors = TRUE)
head(airports)
flights <- read_csv("flights.csv")
Parsed with column specification:
cols(
  .default = col_double(),
  AIRLINE = col_character(),
  TAIL_NUMBER = col_character(),
  ORIGIN_AIRPORT = col_character(),
  DESTINATION_AIRPORT = col_character(),
  SCHEDULED_DEPARTURE = col_character(),
  DEPARTURE_TIME = col_character(),
  WHEELS_OFF = col_character(),
  WHEELS_ON = col_character(),
  SCHEDULED_ARRIVAL = col_character(),
  ARRIVAL_TIME = col_character(),
  CANCELLATION_REASON = col_character()
)
See spec(...) for full column specifications.
flights <- data.frame(flights, stringsAsFactors = TRUE)
head(flights)
# CREATING UNIQUE AIRPORT LOCATIONS FOR STARTING AND ENDING POSITIONS OF THE FLIGHT 
ORIGIN_AIRPORT <- airports[,1:4]
colnames(ORIGIN_AIRPORT) <- c("IATA_CODE", "Orgin_Airport_Name", "Orgin_City", "Orgin_State")
DEST_AIRPORT <- airports[,1:4]
colnames(DEST_AIRPORT) <- c("IATA_CODE", "Dest_Airport_Name", "Dest_City", "Dest_State")
flightdata <- flights %>% left_join(ORIGIN_AIRPORT, c("ORIGIN_AIRPORT"="IATA_CODE"))
flightdata <- flightdata %>% left_join(DEST_AIRPORT, c("DESTINATION_AIRPORT"="IATA_CODE"))

Understand

Below is the summary of variables of the dataset. They are about 37 different variables in the dataset with few of them being numeric and characters.

Summary of the types of variables

flightdata %>% str()
'data.frame':   5819079 obs. of  37 variables:
 $ YEAR               : num  2015 2015 2015 2015 2015 ...
 $ MONTH              : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY                : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY_OF_WEEK        : num  4 4 4 4 4 4 4 4 4 4 ...
 $ AIRLINE            : chr  "AS" "AA" "US" "AA" ...
 $ FLIGHT_NUMBER      : num  98 2336 840 258 135 ...
 $ TAIL_NUMBER        : chr  "N407AS" "N3KUAA" "N171US" "N3HYAA" ...
 $ ORIGIN_AIRPORT     : chr  "ANC" "LAX" "SFO" "LAX" ...
 $ DESTINATION_AIRPORT: chr  "SEA" "PBI" "CLT" "MIA" ...
 $ SCHEDULED_DEPARTURE: chr  "0005" "0010" "0020" "0020" ...
 $ DEPARTURE_TIME     : chr  "2354" "0002" "0018" "0015" ...
 $ DEPARTURE_DELAY    : num  -11 -8 -2 -5 -1 -5 -6 14 -11 3 ...
 $ TAXI_OUT           : num  21 12 16 15 11 18 11 13 17 12 ...
 $ WHEELS_OFF         : chr  "0015" "0014" "0034" "0030" ...
 $ SCHEDULED_TIME     : num  205 280 286 285 235 217 181 273 195 221 ...
 $ ELAPSED_TIME       : num  194 279 293 281 215 230 170 249 193 203 ...
 $ AIR_TIME           : num  169 263 266 258 199 206 154 228 173 186 ...
 $ DISTANCE           : num  1448 2330 2296 2342 1448 ...
 $ WHEELS_ON          : chr  "0404" "0737" "0800" "0748" ...
 $ TAXI_IN            : num  4 4 11 8 5 6 5 8 3 5 ...
 $ SCHEDULED_ARRIVAL  : chr  "0430" "0750" "0806" "0805" ...
 $ ARRIVAL_TIME       : chr  "0408" "0741" "0811" "0756" ...
 $ ARRIVAL_DELAY      : num  -22 -9 5 -9 -21 8 -17 -10 -13 -15 ...
 $ DIVERTED           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLED          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLATION_REASON: chr  NA NA NA NA ...
 $ AIR_SYSTEM_DELAY   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ SECURITY_DELAY     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ AIRLINE_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ LATE_AIRCRAFT_DELAY: num  NA NA NA NA NA NA NA NA NA NA ...
 $ WEATHER_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Orgin_Airport_Name : chr  "Ted Stevens Anchorage International Airport" "Los Angeles International Airport" "San Francisco International Airport" "Los Angeles International Airport" ...
 $ Orgin_City         : chr  "Anchorage" "Los Angeles" "San Francisco" "Los Angeles" ...
 $ Orgin_State        : chr  "AK" "CA" "CA" "CA" ...
 $ Dest_Airport_Name  : chr  "Seattle-Tacoma International Airport" "Palm Beach International Airport" "Charlotte Douglas International Airport" "Miami International Airport" ...
 $ Dest_City          : chr  "Seattle" "West Palm Beach" "Charlotte" "Miami" ...
 $ Dest_State         : chr  "WA" "FL" "NC" "FL" ...

Applying Data Type Conversions

# CHAR -> FACT CONVERSIONS 
flightdata <- flightdata %>% mutate_if(is.character, as.factor)
# FACT -> DATE CONVERSIONS
flightdata[,c(10,11,14,19,21,22)] <- flightdata[,c(10,11,14,19,21,22)] %>% as.character.Date()

Final types of variables

flightdata %>% str()
'data.frame':   5819079 obs. of  37 variables:
 $ YEAR               : num  2015 2015 2015 2015 2015 ...
 $ MONTH              : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY                : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY_OF_WEEK        : num  4 4 4 4 4 4 4 4 4 4 ...
 $ AIRLINE            : Factor w/ 14 levels "AA","AS","B6",..: 2 1 12 1 2 4 9 12 1 4 ...
 $ FLIGHT_NUMBER      : num  98 2336 840 258 135 ...
 $ TAIL_NUMBER        : Factor w/ 4897 levels "7819A","7820L",..: 1623 1557 422 1517 2132 1142 2766 2411 1562 3935 ...
 $ ORIGIN_AIRPORT     : Factor w/ 628 levels "10135","10136",..: 324 483 585 483 584 585 481 483 585 481 ...
 $ DESTINATION_AIRPORT: Factor w/ 629 levels "10135","10136",..: 585 543 374 511 325 524 524 374 394 328 ...
 $ SCHEDULED_DEPARTURE: 'AsIs' chr  "0005" "0010" "0020" "0020" ...
 $ DEPARTURE_TIME     : 'AsIs' chr  "2354" "0002" "0018" "0015" ...
 $ DEPARTURE_DELAY    : num  -11 -8 -2 -5 -1 -5 -6 14 -11 3 ...
 $ TAXI_OUT           : num  21 12 16 15 11 18 11 13 17 12 ...
 $ WHEELS_OFF         : 'AsIs' chr  "0015" "0014" "0034" "0030" ...
 $ SCHEDULED_TIME     : num  205 280 286 285 235 217 181 273 195 221 ...
 $ ELAPSED_TIME       : num  194 279 293 281 215 230 170 249 193 203 ...
 $ AIR_TIME           : num  169 263 266 258 199 206 154 228 173 186 ...
 $ DISTANCE           : num  1448 2330 2296 2342 1448 ...
 $ WHEELS_ON          : 'AsIs' chr  "0404" "0737" "0800" "0748" ...
 $ TAXI_IN            : num  4 4 11 8 5 6 5 8 3 5 ...
 $ SCHEDULED_ARRIVAL  : 'AsIs' chr  "0430" "0750" "0806" "0805" ...
 $ ARRIVAL_TIME       : 'AsIs' chr  "0408" "0741" "0811" "0756" ...
 $ ARRIVAL_DELAY      : num  -22 -9 5 -9 -21 8 -17 -10 -13 -15 ...
 $ DIVERTED           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLED          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLATION_REASON: Factor w/ 4 levels "A","B","C","D": NA NA NA NA NA NA NA NA NA NA ...
 $ AIR_SYSTEM_DELAY   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ SECURITY_DELAY     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ AIRLINE_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ LATE_AIRCRAFT_DELAY: num  NA NA NA NA NA NA NA NA NA NA ...
 $ WEATHER_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Orgin_Airport_Name : Factor w/ 322 levels "Aberdeen Regional Airport",..: 287 173 260 173 268 260 185 173 260 185 ...
 $ Orgin_City         : Factor w/ 308 levels "Aberdeen","Abilene",..: 13 174 256 174 267 256 164 174 256 164 ...
 $ Orgin_State        : Factor w/ 54 levels "AK","AL","AR",..: 1 6 6 6 51 6 35 6 6 35 ...
 $ Dest_Airport_Name  : Factor w/ 322 levels "Aberdeen Regional Airport",..: 268 222 50 194 287 196 196 50 68 127 ...
 $ Dest_City          : Factor w/ 308 levels "Aberdeen","Abilene",..: 267 296 54 188 13 191 191 54 72 19 ...
 $ Dest_State         : Factor w/ 54 levels "AK","AL","AR",..: 51 10 29 10 1 25 25 29 46 11 ...

Tidy & Manipulate Data I

Data is already tidy at the moment

Each variable must have its own column. - YES

  • In the above steps, we have excluded variables that duplicate data such as Country, longitude, Latitude, IOTA_CODE. Each observation must have its own row. - YES

  • All observations are unique by flight number

Each value must have its own cell. - YES

  • No two values are shared by its own cells.

Tidy & Manipulate Data II

Create/mutate at least one variable from the existing variables (minimum requirement #6). In addition to the R codes and outputs, explain everything that you do in this step.

# Creating Average Speed 
flightdata$Avg_Speed <- (flightdata$DISTANCE / flightdata$AIR_TIME)
# Taxi time
flightdata$Taxi_Time <- (flightdata$TAXI_OUT + flightdata$TAXI_IN)
# Did the flight Arrive on time? SCHEDULED_TIME VS ELAPSED_TIME
flightdata$On_Time <- ifelse(flightdata$SCHEDULED_TIME - flightdata$ELAPSED_TIME > 0 , 1, 0) 
head(flightdata)

Scan I

Using Summary to identify Missing Values

SUMMARY OF NA VALUES

# SUMMARY OF NA VALUES 
flightdata %>% summary() 
      YEAR          MONTH             DAY        DAY_OF_WEEK       AIRLINE        FLIGHT_NUMBER   TAIL_NUMBER      ORIGIN_AIRPORT    DESTINATION_AIRPORT SCHEDULED_DEPARTURE
 Min.   :2015   Min.   : 1.000   Min.   : 1.0   Min.   :1.000   WN     :1261855   Min.   :   1   N480HA :   3768   ATL    : 346836   ATL    : 346904     Length:5819079     
 1st Qu.:2015   1st Qu.: 4.000   1st Qu.: 8.0   1st Qu.:2.000   DL     : 875881   1st Qu.: 730   N484HA :   3723   ORD    : 285884   ORD    : 285906     Class :AsIs        
 Median :2015   Median : 7.000   Median :16.0   Median :4.000   AA     : 725984   Median :1690   N488HA :   3723   DFW    : 239551   DFW    : 239582     Mode  :character   
 Mean   :2015   Mean   : 6.524   Mean   :15.7   Mean   :3.927   OO     : 588353   Mean   :2173   N493HA :   3585   DEN    : 196055   DEN    : 196010                        
 3rd Qu.:2015   3rd Qu.: 9.000   3rd Qu.:23.0   3rd Qu.:6.000   EV     : 571977   3rd Qu.:3230   N478HA :   3577   LAX    : 194673   LAX    : 194696                        
 Max.   :2015   Max.   :12.000   Max.   :31.0   Max.   :7.000   UA     : 515723   Max.   :9855   (Other):5785982   SFO    : 148008   SFO    : 147966                        
                                                                (Other):1279306                  NA's   :  14721   (Other):4408072   (Other):4408015                        
 DEPARTURE_TIME     DEPARTURE_DELAY      TAXI_OUT       WHEELS_OFF        SCHEDULED_TIME   ELAPSED_TIME       AIR_TIME         DISTANCE       WHEELS_ON        
 Length:5819079     Min.   : -82.00   Min.   :  1.00   Length:5819079     Min.   : 18.0   Min.   : 14      Min.   :  7.0    Min.   :  21.0   Length:5819079    
 Class :AsIs        1st Qu.:  -5.00   1st Qu.: 11.00   Class :AsIs        1st Qu.: 85.0   1st Qu.: 82      1st Qu.: 60.0    1st Qu.: 373.0   Class :AsIs       
 Mode  :character   Median :  -2.00   Median : 14.00   Mode  :character   Median :123.0   Median :118      Median : 94.0    Median : 647.0   Mode  :character  
                    Mean   :   9.37   Mean   : 16.07                      Mean   :141.7   Mean   :137      Mean   :113.5    Mean   : 822.4                     
                    3rd Qu.:   7.00   3rd Qu.: 19.00                      3rd Qu.:173.0   3rd Qu.:168      3rd Qu.:144.0    3rd Qu.:1062.0                     
                    Max.   :1988.00   Max.   :225.00                      Max.   :718.0   Max.   :766      Max.   :690.0    Max.   :4983.0                     
                    NA's   :86153     NA's   :89047                       NA's   :6       NA's   :105071   NA's   :105071                                      
    TAXI_IN       SCHEDULED_ARRIVAL  ARRIVAL_TIME       ARRIVAL_DELAY        DIVERTED         CANCELLED       CANCELLATION_REASON AIR_SYSTEM_DELAY  SECURITY_DELAY   
 Min.   :  1.00   Length:5819079     Length:5819079     Min.   : -87.00   Min.   :0.00000   Min.   :0.00000   A   :  25262        Min.   :   0      Min.   :  0      
 1st Qu.:  4.00   Class :AsIs        Class :AsIs        1st Qu.: -13.00   1st Qu.:0.00000   1st Qu.:0.00000   B   :  48851        1st Qu.:   0      1st Qu.:  0      
 Median :  6.00   Mode  :character   Mode  :character   Median :  -5.00   Median :0.00000   Median :0.00000   C   :  15749        Median :   2      Median :  0      
 Mean   :  7.43                                         Mean   :   4.41   Mean   :0.00261   Mean   :0.01545   D   :     22        Mean   :  13      Mean   :  0      
 3rd Qu.:  9.00                                         3rd Qu.:   8.00   3rd Qu.:0.00000   3rd Qu.:0.00000   NA's:5729195        3rd Qu.:  18      3rd Qu.:  0      
 Max.   :248.00                                         Max.   :1971.00   Max.   :1.00000   Max.   :1.00000                       Max.   :1134      Max.   :573      
 NA's   :92513                                          NA's   :105071                                                            NA's   :4755640   NA's   :4755640  
 AIRLINE_DELAY     LATE_AIRCRAFT_DELAY WEATHER_DELAY                                            Orgin_Airport_Name              Orgin_City       Orgin_State     
 Min.   :   0      Min.   :   0        Min.   :   0      Hartsfield-Jackson Atlanta International Airport: 346836   Chicago          : 366770   CA     : 647911  
 1st Qu.:   0      1st Qu.:   0        1st Qu.:   0      Chicago O'Hare International Airport            : 285884   Atlanta          : 346836   TX     : 631124  
 Median :   2      Median :   3        Median :   0      Dallas/Fort Worth International Airport         : 239551   Dallas-Fort Worth: 239551   FL     : 415586  
 Mean   :  19      Mean   :  23        Mean   :   3      Denver International Airport                    : 196055   Houston          : 198664   IL     : 381644  
 3rd Qu.:  19      3rd Qu.:  29        3rd Qu.:   0      Los Angeles International Airport               : 194673   Denver           : 196055   GA     : 360496  
 Max.   :1971      Max.   :1331        Max.   :1211      (Other)                                         :4069915   (Other)          :3985038   (Other):2896153  
 NA's   :4755640   NA's   :4755640     NA's   :4755640   NA's                                            : 486165   NA's             : 486165   NA's   : 486165  
                                        Dest_Airport_Name               Dest_City         Dest_State        Avg_Speed        Taxi_Time         On_Time      
 Hartsfield-Jackson Atlanta International Airport: 346904   Chicago          : 366790   CA     : 647899   Min.   : 0.54    Min.   :  2.00   Min.   :0.0     
 Chicago O'Hare International Airport            : 285906   Atlanta          : 346904   TX     : 631214   1st Qu.: 6.11    1st Qu.: 17.00   1st Qu.:0.0     
 Dallas/Fort Worth International Airport         : 239582   Dallas-Fort Worth: 239582   FL     : 415554   Median : 6.93    Median : 21.00   Median :1.0     
 Denver International Airport                    : 196010   Houston          : 198724   IL     : 381666   Mean   : 6.81    Mean   : 23.51   Mean   :0.7     
 Los Angeles International Airport               : 194696   Denver           : 196010   GA     : 360563   3rd Qu.: 7.60    3rd Qu.: 27.00   3rd Qu.:1.0     
 (Other)                                         :4069816   (Other)          :3984904   (Other):2896018   Max.   :13.13    Max.   :268.00   Max.   :1.0     
 NA's                                            : 486165   NA's             : 486165   NA's   : 486165   NA's   :105071   NA's   :92513    NA's   :105071  
# DELETING NA VALUES THAT ARE LESS THAN 5% OF THE TOTAL DATA. (5% = 290,953)
flightdata <- flightdata[!(is.na(flightdata$TAIL_NUMBER)),]
flightdata <- flightdata[!(is.na(flightdata$DEPARTURE_DELAY)),]
flightdata <- flightdata[!(is.na(flightdata$TAXI_OUT)), ]
flightdata <- flightdata[!(is.na(flightdata$SCHEDULED_TIME)), ]
flightdata <- flightdata[!(is.na(flightdata$ELAPSED_TIME)), ]
flightdata <- flightdata[!(is.na(flightdata$TAXI_IN)), ]
flightdata %>% str()
'data.frame':   5714008 obs. of  40 variables:
 $ YEAR               : num  2015 2015 2015 2015 2015 ...
 $ MONTH              : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY                : num  1 1 1 1 1 1 1 1 1 1 ...
 $ DAY_OF_WEEK        : num  4 4 4 4 4 4 4 4 4 4 ...
 $ AIRLINE            : Factor w/ 14 levels "AA","AS","B6",..: 2 1 12 1 2 4 9 12 1 4 ...
 $ FLIGHT_NUMBER      : num  98 2336 840 258 135 ...
 $ TAIL_NUMBER        : Factor w/ 4897 levels "7819A","7820L",..: 1623 1557 422 1517 2132 1142 2766 2411 1562 3935 ...
 $ ORIGIN_AIRPORT     : Factor w/ 628 levels "10135","10136",..: 324 483 585 483 584 585 481 483 585 481 ...
 $ DESTINATION_AIRPORT: Factor w/ 629 levels "10135","10136",..: 585 543 374 511 325 524 524 374 394 328 ...
 $ SCHEDULED_DEPARTURE: 'AsIs' chr  "0005" "0010" "0020" "0020" ...
 $ DEPARTURE_TIME     : 'AsIs' chr  "2354" "0002" "0018" "0015" ...
 $ DEPARTURE_DELAY    : num  -11 -8 -2 -5 -1 -5 -6 14 -11 3 ...
 $ TAXI_OUT           : num  21 12 16 15 11 18 11 13 17 12 ...
 $ WHEELS_OFF         : 'AsIs' chr  "0015" "0014" "0034" "0030" ...
 $ SCHEDULED_TIME     : num  205 280 286 285 235 217 181 273 195 221 ...
 $ ELAPSED_TIME       : num  194 279 293 281 215 230 170 249 193 203 ...
 $ AIR_TIME           : num  169 263 266 258 199 206 154 228 173 186 ...
 $ DISTANCE           : num  1448 2330 2296 2342 1448 ...
 $ WHEELS_ON          : 'AsIs' chr  "0404" "0737" "0800" "0748" ...
 $ TAXI_IN            : num  4 4 11 8 5 6 5 8 3 5 ...
 $ SCHEDULED_ARRIVAL  : 'AsIs' chr  "0430" "0750" "0806" "0805" ...
 $ ARRIVAL_TIME       : 'AsIs' chr  "0408" "0741" "0811" "0756" ...
 $ ARRIVAL_DELAY      : num  -22 -9 5 -9 -21 8 -17 -10 -13 -15 ...
 $ DIVERTED           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLED          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CANCELLATION_REASON: Factor w/ 4 levels "A","B","C","D": NA NA NA NA NA NA NA NA NA NA ...
 $ AIR_SYSTEM_DELAY   : num  NA NA NA NA NA NA NA NA NA NA ...
 $ SECURITY_DELAY     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ AIRLINE_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ LATE_AIRCRAFT_DELAY: num  NA NA NA NA NA NA NA NA NA NA ...
 $ WEATHER_DELAY      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Orgin_Airport_Name : Factor w/ 322 levels "Aberdeen Regional Airport",..: 287 173 260 173 268 260 185 173 260 185 ...
 $ Orgin_City         : Factor w/ 308 levels "Aberdeen","Abilene",..: 13 174 256 174 267 256 164 174 256 164 ...
 $ Orgin_State        : Factor w/ 54 levels "AK","AL","AR",..: 1 6 6 6 51 6 35 6 6 35 ...
 $ Dest_Airport_Name  : Factor w/ 322 levels "Aberdeen Regional Airport",..: 268 222 50 194 287 196 196 50 68 127 ...
 $ Dest_City          : Factor w/ 308 levels "Aberdeen","Abilene",..: 267 296 54 188 13 191 191 54 72 19 ...
 $ Dest_State         : Factor w/ 54 levels "AK","AL","AR",..: 51 10 29 10 1 25 25 29 46 11 ...
 $ Avg_Speed          : num  8.57 8.86 8.63 9.08 7.28 ...
 $ Taxi_Time          : num  25 16 27 23 16 24 16 21 20 17 ...
 $ On_Time            : num  1 1 0 1 1 0 1 1 1 1 ...

IMPUTATION

  • For delay options NA means there is no delay hence no imputation needed

  • Airport information such as name, city and state cannnot be imputed based on flight data because certain airports use a numeric ID which had no matching data with the airports.csv . No other variables have a realtionship with this to be imputed.

Scan II

*Process: 1. Find the Outliers by converting the data into z scores. 2. Z scores with a score of greater than 3 are outliers. 3. Filter out the the outliers and check to see that they have been filtered 4. Plot a boxplot of both the variable with and without the outliers to determine any noticeable difference.

## Finding Outliers for only the Numeric Variables
z.scores <- flightdata$DEPARTURE_DELAY %>% scores(type = "z")
length (which(abs(z.scores) >3))
[1] 116262
Depature_DelaynoOutliers <- flightdata$DEPARTURE_DELAY[- (which(abs(z.scores) >3))]
str(Depature_DelaynoOutliers)
 num [1:5597746] -11 -8 -2 -5 -1 -5 -6 14 -11 3 ...
z.scores1 <- flightdata$TAXI_OUT %>% scores(type = "z")
length (which(abs(z.scores1) >3))
[1] 100870
Taxi_outnoOutliers <- flightdata$TAXI_OUT[- (which(abs(z.scores1) >3))]
str(Taxi_outnoOutliers)
 num [1:5613138] 21 12 16 15 11 18 11 13 17 12 ...
z.scores2 <- flightdata$SCHEDULED_TIME %>% scores(type = "z")
length (which(abs(z.scores2) >3))
[1] 76179
Scheduled_timenoOutliers <- flightdata$SCHEDULED_TIME[- (which(abs(z.scores2) >3))]
str(Scheduled_timenoOutliers)
 num [1:5637829] 205 280 286 285 235 217 181 273 195 221 ...
z.scores3 <- flightdata$ELAPSED_TIME %>% scores(type = "z")
length (which(abs(z.scores3) >3))
[1] 73273
Elapsed_timenoOutliers <- flightdata$ELAPSED_TIME[- (which(abs(z.scores3) >3))]
str(Elapsed_timenoOutliers)
 num [1:5640735] 194 279 293 281 215 230 170 249 193 203 ...
z.scores4 <- flightdata$AIR_TIME %>% scores(type = "z")
length (which(abs(z.scores4) >3))
[1] 71632
Air_TimenoOutliers <- flightdata$AIR_TIME[- (which(abs(z.scores4) >3))]
str(Air_TimenoOutliers)
 num [1:5642376] 169 263 266 258 199 206 154 228 173 186 ...
z.scores5 <- flightdata$DISTANCE %>% scores(type = "z")
length (which(abs(z.scores5) >3))
[1] 36805
Distance_noOutliers <- flightdata$DISTANCE[- (which(abs(z.scores5) >3))]
str(Distance_noOutliers)
 num [1:5677203] 1448 2330 2296 2342 1448 ...
z.scores6 <- flightdata$TAXI_IN %>% scores(type = "z")
length (which(abs(z.scores6) >3))
[1] 101405
Taxi_innoOutliers <- flightdata$TAXI_IN[- (which(abs(z.scores6) >3))]
str(Taxi_innoOutliers)
 num [1:5612603] 4 4 11 8 5 6 5 8 3 5 ...
z.scores7 <- flightdata$ARRIVAL_DELAY %>% scores(type = "z")
length (which(abs(z.scores7) >3))
[1] 110956
Arrival_DelaynoOutliers <- flightdata$ARRIVAL_DELAY[- (which(abs(z.scores7) >3))]
str(Arrival_DelaynoOutliers)
 num [1:5603052] -22 -9 5 -9 -21 8 -17 -10 -13 -15 ...
z.scores8 <- flightdata$Avg_Speed %>% scores(type = "z")
length (which(abs(z.scores8) >3))
[1] 26989
Avg_speednoOutliers <- flightdata$Avg_Speed[- (which(abs(z.scores8) >3))]
str(Avg_speednoOutliers)
 num [1:5687019] 8.57 8.86 8.63 9.08 7.28 ...
z.scores9 <- flightdata$Taxi_Time %>% scores(type = "z")
length (which(abs(z.scores9) >3))
[1] 91707
Taxi_TimenoOutliers <- flightdata$Taxi_Time[- (which(abs(z.scores9) >3))]
str(Taxi_TimenoOutliers)
 num [1:5622301] 25 16 27 23 16 24 16 21 20 17 ...
#Boxplots
boxplot(flightdata$DEPARTURE_DELAY,Depature_DelaynoOutliers, flightdata$ARRIVAL_DELAY, Arrival_DelaynoOutliers, names = c("Depature Delay","DD Outliers Filtered","Arrival Delay","AD Outliers Filtered"),main = "Delays", las = 1, cex.axis = 0.5)

boxplot(flightdata$TAXI_OUT,Taxi_outnoOutliers, flightdata$TAXI_IN, Taxi_innoOutliers, flightdata$Taxi_Time, Taxi_TimenoOutliers, names = c("Taxi Out","TO Outliers Filtered","Taxi in", "TI Outliers Filtered","Total Taxi Time","TTT Outliers Filtered"),main = "Taxi Time", las = 1, cex.axis = 0.5)

boxplot(flightdata$SCHEDULED_TIME,Scheduled_timenoOutliers, flightdata$AIR_TIME, Air_TimenoOutliers, flightdata$ELAPSED_TIME, Elapsed_timenoOutliers, names = c("Scheduled Time","ST Outliers Filtered","Air Time","AT Outliers Filtered","Elapsed Time","ET Outliers Filtered"),main = "Travel Time", las = 1, cex.axis = 0.5)

boxplot(flightdata$DISTANCE,Distance_noOutliers, names = c("With outliers","Outliers Filtered"),main = "Distance")

boxplot(flightdata$Avg_Speed,Avg_speednoOutliers, names = c("With outliers","Outliers Filtered"),main = "Average Speed")

Transform

Here, logarathmic function is used to transform the variables. Only few variables could be transformed.

#Taxi_out
hist(flightdata$TAXI_OUT) #original-right skewed

hist(log10(flightdata$TAXI_OUT)) #transformed - normal

#Scheduled_time
hist(flightdata$SCHEDULED_TIME) #original-right skewed

hist(log10(flightdata$SCHEDULED_TIME)) #transformed -normal

#Arrival_Delay
hist(flightdata$ARRIVAL_DELAY) #original

hist(log((flightdata$ARRIVAL_DELAY)))#reduced skewness
NaNs produced

#All other variables couldnt be transformed



LS0tDQp0aXRsZTogIkV4cGxvcmluZyBBaXJwb3J0IERhdGEgfCBNQVRIMjM0OSBTZW1lc3RlciAxLCAyMDE5Ig0KYXV0aG9yOiAiR3JlZ29yeSBCYWhhcmlzIChzMzU0NTY5OCkgSGFycmkgU29tYWthbnRoYW4gKHMzNzc1NjUzKSBTeWVkIFdhamFoYXRoIChzMzc1MDAzOSkiDQpzdWJ0aXRsZTogQXNzaWdubWVudCAzDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KDQojIyBSZXF1aXJlZCBwYWNrYWdlcyANCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkob3V0bGllcnMpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KYGBgDQoNCiMjIEV4ZWN1dGl2ZSBTdW1tYXJ5IA0KDQpSUHVicyBsaW5rIGluZm9ybWF0aW9uOiBbUlB1YnMgTGlua10oaHR0cHM6Ly9ycHVicy5jb20vQ29kZUJ5SGFycmkpDQoNCiogKipSRUFESU5HIERBVEEqKg0KSW4gdGhlIGRhdGEgc2VjdGlvbiB3ZSByZWFkIGFuZCBqb2luZWQgdHdvIGRhdGFzZXRzIHRvZ2V0aGVyIHdpdGggYSBjb21tb24gZmFjdG9yIEFpcnBvcnQgTG9jYXRpb24gY29kZSByZWZlcmVkIHRvIGFzIElBVEFfQ09ERSBpbiB0aGUgZGF0YXNldC4gDQpXZSBhbHNvIGV4Y2x1ZGVkIGlycmVsZXZhbnQgY29sdW1ucyB0aGF0IGFyZSByZXBldGl0aXZlIG9yIGhhdmUgbGl0dGxlIHZhbHVlIGZvciBhbmFseWlzZS4gDQoNCiogKipTVFJVQ1RVUkUqKg0KV2UgdGhlbiBsb29rZWQgYXQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSB0byBsb29rIGZvciBtaXNyZXByZXNlbnRlZCBkYXRhIGFuZCBtdXRhdGVkIHZhcmlhYmxlcyB0aGF0IHdlcmUgd3JvbmdseSBhc3NpZ25lZC4gDQoNCiogKipUSURZICYgTUFOSVBVTEFURSoqDQpIZXJlIHdlIGNvbmZpcm1lZCB0aGF0IHRoZSBkYXRhIHdhcyBpbiBhIHRpZHkgZm9ybWF0LiBTZWNvbmRseSBhZGRlZCBvdGhlciB2YXJpYWJsZXMgdGhhdCB3b3VsZCBiZSBvZiB1c2UgZm9yIGFuYWx5c2lzIHN1Y2ggYXMgYXZlcmFnZSBzcGVlZCwgdG90YWwgdGF4aSB0aW1lICYgYSBiaW5hcnkgdmFyaWFibGUNCnRoYXQgc2hvd3MgaWYgdGhlIHByZWRpY3RlZCB0aW1lIHdhcyBtZXQgb3Igbm90IG1ldC4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYWNoaW5lIGxlYXJuaW5nIHRhc2tzLiANCg0KKiAqKlNDQU4qKiANClNjYW5uZWQgZm9yIE5BIHZhbHVlcywgb3V0bGllcnMgYW5kIGRldGVybWluZWQgd2hpY2ggdmFsdWVzIHNob3VsZCBiZSBpbXB1dGVkLCBvciBleGNsdWRlZC4NClRvIGRlYWwgd2l0aCB0aGUgb3V0bGllcnMsIHdlIHVzZWQgdGhlIHotc2NvcmUgbWV0aG9kLiBTY29yZXMgZ3JlYXRlciB0aGFuIDMgd2VyZSBjb25zaWRlcmVkIHRvIGJlIG91dGxpZXJzLg0KDQoqICoqVFJBTlNGT1JNQVRJT04qKg0KTm9ybWFsaXNlZCB0aGUgZGF0YSBpbiBwcmVwYXJhdGlvbiBmb3IgYWN0aXZpdGllcyBzdWNoIGFzIG1hY2hpbmUgbGVhcm5pbmcgb3IgcGxvdHRpbmcgYXMgZGlzcGxheWVkLiBXZSB0cmllZCB0cmFuc2Zvcm1pbmcgYWxsIHRoZSB2YXJpYWJsZXMuIEJ1dCB3ZSBjb3VsZCBvbmx5IGRlYWwgd2l0aCBmZXcgb2YgdGhlIHZhcmlhYmxlcyAgdXNpbmcgIGxvZ2FyYXRobWljIGZ1bmN0aW9uLiBObyBvdGhlciBtZXRob2QgaGVscGVkIGluIHRyYW5zZm9ybWluZyBpbiB0aGlzIGRhdGFzZXQuDQoNCiMjIERhdGEgDQoNClRoZSBkYXRhIGNvbnNpc3QgdGhlIGluZm9ybWF0aW9uIG9uIG51bWJlciBvZiBvbi10aW1lIC8gZGVsYXllZCAvIGNhbmNlbGxlZCAgLyBkaXZlcnRlZCBmbGlnaHRzIGJhc2VkIG9uIHRyYXZlbCBjb25zdW1lciByZXBvcnQgb2YgMjAxNSBtYXJrZWQgYnkgQlVSRUFVIE9GIFRyYW5zcG9ydGF0aW9uIHN0YXRpc3RpY3MsIERlcGFydG1lbnQgb2YgVHJhbnNwb3J0YXRpb24sIFVTLg0KVGhlIGRhdGEgaXMgc3BsaXQgYWNyb3NzIHRocmVlIGRpZmZlcmVudCBjc3YgZmlsZXMgKGFpcmxpbmVzLCBhaXJwb3J0cyBhbmQgZmxpZ2h0cykuDQpBIGxhcmdlIGRhdGEgc2V0IHdpdGggdGhlIG5hbWUgZmxpZ2h0ZGF0YSBpcyBjcmVhdGVkIGJ5IG1lcmdpbmcgdGhlIG90aGVyIGF2YWlsYWJsZSBhbmQgcmVsYXRlZCBkYXRhLg0KDQpgYGB7cn0NCnNldHdkKCJDOi9Vc2Vycy9IYXJyaS9PbmVEcml2ZS9NYXN0ZXJzIG9mIEFuYWx5dGljcy9TMV9NQVRIMjM0OSBEYXRhIFByZXByb2Nlc3NpbmciKQ0KYWlycG9ydHMgPC0gcmVhZF9jc3YoImFpcnBvcnRzLmNzdiIpDQphaXJwb3J0cyA8LSBkYXRhLmZyYW1lKGFpcnBvcnRzLCBzdHJpbmdzQXNGYWN0b3JzID0gVFJVRSkNCmhlYWQoYWlycG9ydHMpDQpmbGlnaHRzIDwtIHJlYWRfY3N2KCJmbGlnaHRzLmNzdiIpDQpmbGlnaHRzIDwtIGRhdGEuZnJhbWUoZmxpZ2h0cywgc3RyaW5nc0FzRmFjdG9ycyA9IFRSVUUpDQpoZWFkKGZsaWdodHMpDQojIENSRUFUSU5HIFVOSVFVRSBBSVJQT1JUIExPQ0FUSU9OUyBGT1IgU1RBUlRJTkcgQU5EIEVORElORyBQT1NJVElPTlMgT0YgVEhFIEZMSUdIVCANCk9SSUdJTl9BSVJQT1JUIDwtIGFpcnBvcnRzWywxOjRdDQpjb2xuYW1lcyhPUklHSU5fQUlSUE9SVCkgPC0gYygiSUFUQV9DT0RFIiwgIk9yZ2luX0FpcnBvcnRfTmFtZSIsICJPcmdpbl9DaXR5IiwgIk9yZ2luX1N0YXRlIikNCkRFU1RfQUlSUE9SVCA8LSBhaXJwb3J0c1ssMTo0XQ0KY29sbmFtZXMoREVTVF9BSVJQT1JUKSA8LSBjKCJJQVRBX0NPREUiLCAiRGVzdF9BaXJwb3J0X05hbWUiLCAiRGVzdF9DaXR5IiwgIkRlc3RfU3RhdGUiKQ0KZmxpZ2h0ZGF0YSA8LSBmbGlnaHRzICU+JSBsZWZ0X2pvaW4oT1JJR0lOX0FJUlBPUlQsIGMoIk9SSUdJTl9BSVJQT1JUIj0iSUFUQV9DT0RFIikpDQpmbGlnaHRkYXRhIDwtIGZsaWdodGRhdGEgJT4lIGxlZnRfam9pbihERVNUX0FJUlBPUlQsIGMoIkRFU1RJTkFUSU9OX0FJUlBPUlQiPSJJQVRBX0NPREUiKSkNCg0KYGBgDQoNCiMjIFVuZGVyc3RhbmQgDQoNCkJlbG93IGlzIHRoZSBzdW1tYXJ5IG9mIHZhcmlhYmxlcyBvZiB0aGUgZGF0YXNldC4gVGhleSBhcmUgYWJvdXQgMzcgZGlmZmVyZW50IHZhcmlhYmxlcyBpbiB0aGUgZGF0YXNldCB3aXRoIGZldyBvZiB0aGVtIGJlaW5nIG51bWVyaWMgYW5kIGNoYXJhY3RlcnMuDQoNCiMjIyBTdW1tYXJ5IG9mIHRoZSB0eXBlcyBvZiB2YXJpYWJsZXMNCmBgYHtyfQ0KZmxpZ2h0ZGF0YSAlPiUgc3RyKCkNCmBgYA0KDQojIyMgQXBwbHlpbmcgRGF0YSBUeXBlIENvbnZlcnNpb25zIA0KYGBge3J9DQojIENIQVIgLT4gRkFDVCBDT05WRVJTSU9OUyANCmZsaWdodGRhdGEgPC0gZmxpZ2h0ZGF0YSAlPiUgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMuZmFjdG9yKQ0KIyBGQUNUIC0+IERBVEUgQ09OVkVSU0lPTlMNCmZsaWdodGRhdGFbLGMoMTAsMTEsMTQsMTksMjEsMjIpXSA8LSBmbGlnaHRkYXRhWyxjKDEwLDExLDE0LDE5LDIxLDIyKV0gJT4lIGFzLmNoYXJhY3Rlci5EYXRlKCkNCmBgYA0KDQojIyMgRmluYWwgdHlwZXMgb2YgdmFyaWFibGVzDQpgYGB7cn0NCmZsaWdodGRhdGEgJT4lIHN0cigpDQpgYGANCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJIA0KDQojIyMgRGF0YSBpcyBhbHJlYWR5IHRpZHkgYXQgdGhlIG1vbWVudA0KDQoqKkVhY2ggdmFyaWFibGUgbXVzdCBoYXZlIGl0cyBvd24gY29sdW1uLiAtIFlFUyoqIA0KDQoqIEluIHRoZSBhYm92ZSBzdGVwcywgd2UgaGF2ZSBleGNsdWRlZCB2YXJpYWJsZXMgdGhhdCBkdXBsaWNhdGUgZGF0YSBzdWNoIGFzIENvdW50cnksIGxvbmdpdHVkZSwgTGF0aXR1ZGUsIElPVEFfQ09ERS4gDQoqKkVhY2ggb2JzZXJ2YXRpb24gbXVzdCBoYXZlIGl0cyBvd24gcm93LiAtIFlFUyoqIA0KDQoqIEFsbCBvYnNlcnZhdGlvbnMgYXJlIHVuaXF1ZSBieSBmbGlnaHQgbnVtYmVyDQoNCioqRWFjaCB2YWx1ZSBtdXN0IGhhdmUgaXRzIG93biBjZWxsLiAtIFlFUyoqIA0KDQoqIE5vIHR3byB2YWx1ZXMgYXJlIHNoYXJlZCBieSBpdHMgb3duIGNlbGxzLiANCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSANCg0KQ3JlYXRlL211dGF0ZSBhdCBsZWFzdCBvbmUgdmFyaWFibGUgZnJvbSB0aGUgZXhpc3RpbmcgdmFyaWFibGVzIChtaW5pbXVtIHJlcXVpcmVtZW50ICM2KS4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gZXZlcnl0aGluZyB0aGF0IHlvdSBkbyBpbiB0aGlzIHN0ZXAuDQoNCmBgYHtyfQ0KIyBDcmVhdGluZyBBdmVyYWdlIFNwZWVkIA0KZmxpZ2h0ZGF0YSRBdmdfU3BlZWQgPC0gKGZsaWdodGRhdGEkRElTVEFOQ0UgLyBmbGlnaHRkYXRhJEFJUl9USU1FKQ0KIyBUYXhpIHRpbWUNCmZsaWdodGRhdGEkVGF4aV9UaW1lIDwtIChmbGlnaHRkYXRhJFRBWElfT1VUICsgZmxpZ2h0ZGF0YSRUQVhJX0lOKQ0KIyBEaWQgdGhlIGZsaWdodCBBcnJpdmUgb24gdGltZT8gU0NIRURVTEVEX1RJTUUgVlMgRUxBUFNFRF9USU1FDQpmbGlnaHRkYXRhJE9uX1RpbWUgPC0gaWZlbHNlKGZsaWdodGRhdGEkU0NIRURVTEVEX1RJTUUgLSBmbGlnaHRkYXRhJEVMQVBTRURfVElNRSA+IDAgLCAxLCAwKSANCmhlYWQoZmxpZ2h0ZGF0YSkNCmBgYA0KIyMJU2NhbiBJIA0KKipVc2luZyBTdW1tYXJ5IHRvIGlkZW50aWZ5IE1pc3NpbmcgVmFsdWVzKioNCg0KKiBUQUlMX05VTUJFUjogSGFzIDE0NzIxIG1pc3NpbmcgdmFsdWVzLCBob3dldmVyIHRoaXMgY2FuIG5vdCBiZSBpbXB1dGVkIGJlY2F1c2UgdGFpbCBudW1iZXIgaGFzIG5vIGRlcGVuZGFuY3kgb24gb3RoZXIgdmFsdWVzLiANCiogREVQQVJUVVJFX0RFTEFZICA6IEZsaWdodHMgdGhhdCBoYXZlIGJlZW4gY2FuY2VsbGVkIGhhdmUgYW4gTkEgdmFsdWUgaGVuY2UsIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbXB1dGUgdGhpcy4NCiogVEFYSV9PVVQgJiBUQVhJX0lOIDogbWlzc2luZyBWYWx1ZXMgYXJlIGR1ZSB0byBjYW5jZWxsYXRpb25zIA0KKiBTQ0hFRFVMRURfVElNRTogNiBtaXNzaW5nIHZhbHVlcy4gSWYgdGhlIG1pc3NpbmcgZGF0YSBpcyBsZXNzIHRoYW4gNSUgaXQgaXMgZmluZSB0byBleGNsdWRlIGl0LiANCiogRUxBUFNFRF9USU1FLCBBUlJJVkFMX0RFTEFZICYgQUlSX1RJTUUgOiBDYW5jZWxsYXRpb25zIGFuZCBObyByZWNvcmRzLiBIYXJkIHRvIGltcHV0ZSBzdWNoIGEgY29tcGxleCB2YXJpYWJsZSBzdWNoIGFzIEFpcl9UaW1lLg0KKiBDQU5DRUxMQVRJT05fUkVBU09OOiBObyBDYW5jZWxsYXRpb24gPSBOQS4NCiogQUlSX1NZU1RFTV9ERUxBWSwgU0VDVVJJVFlfREVMQVksIEFJUkxJTkVfREVMQVksIExBVEVfQUlSQ1JBRlRfREVMQVkgICYgV0VBVEhFUl9ERUxBWTogTkEgPSBOb3QgZGVsYXllZCBieSB0aGF0IHJlYXNvbiwgb3IgTm8gRGVsYXkuIA0KKiBCT1QgT1JJR0lOIEFORCBERVNUIEFpcnBvcnRfTmFtZSwgQ2l0eSAmIFN0YXRlOiBOQSB2YWx1ZXMgYXJlIGEgY29tYmluYXRpb24gb2YgY2FuY2VsYXRpb25zICYgbWlzc2luZyBkYXRhIGZyb20gdGhlIGFpcnBvcnRzLmNzdiBmb3IgSUFUQV9DT0RFIGpvaW5pbmcgb3JpZ2luIGFuZCBkZXBhcnR1cmUgbG9jYXRpb24uIA0KDQojIyMgU1VNTUFSWSBPRiBOQSBWQUxVRVMgDQpgYGB7cn0NCiMgU1VNTUFSWSBPRiBOQSBWQUxVRVMgDQpmbGlnaHRkYXRhICU+JSBzdW1tYXJ5KCkgDQojIERFTEVUSU5HIE5BIFZBTFVFUyBUSEFUIEFSRSBMRVNTIFRIQU4gNSUgT0YgVEhFIFRPVEFMIERBVEEuICg1JSA9IDI5MCw5NTMpDQpmbGlnaHRkYXRhIDwtIGZsaWdodGRhdGFbIShpcy5uYShmbGlnaHRkYXRhJFRBSUxfTlVNQkVSKSksXQ0KZmxpZ2h0ZGF0YSA8LSBmbGlnaHRkYXRhWyEoaXMubmEoZmxpZ2h0ZGF0YSRERVBBUlRVUkVfREVMQVkpKSxdDQpmbGlnaHRkYXRhIDwtIGZsaWdodGRhdGFbIShpcy5uYShmbGlnaHRkYXRhJFRBWElfT1VUKSksIF0NCmZsaWdodGRhdGEgPC0gZmxpZ2h0ZGF0YVshKGlzLm5hKGZsaWdodGRhdGEkU0NIRURVTEVEX1RJTUUpKSwgXQ0KZmxpZ2h0ZGF0YSA8LSBmbGlnaHRkYXRhWyEoaXMubmEoZmxpZ2h0ZGF0YSRFTEFQU0VEX1RJTUUpKSwgXQ0KZmxpZ2h0ZGF0YSA8LSBmbGlnaHRkYXRhWyEoaXMubmEoZmxpZ2h0ZGF0YSRUQVhJX0lOKSksIF0NCmZsaWdodGRhdGEgJT4lIHN0cigpDQpgYGANCiMjIyBJTVBVVEFUSU9OIA0KDQoqIEZvciBkZWxheSBvcHRpb25zIE5BIG1lYW5zIHRoZXJlIGlzIG5vIGRlbGF5IGhlbmNlIG5vIGltcHV0YXRpb24gbmVlZGVkDQoNCiogQWlycG9ydCBpbmZvcm1hdGlvbiBzdWNoIGFzIG5hbWUsIGNpdHkgYW5kIHN0YXRlIGNhbm5ub3QgYmUgaW1wdXRlZCBiYXNlZCBvbiBmbGlnaHQgZGF0YSBiZWNhdXNlIGNlcnRhaW4gYWlycG9ydHMgdXNlIGEgbnVtZXJpYyBJRCB3aGljaCBoYWQgbm8gbWF0Y2hpbmcgZGF0YSB3aXRoIHRoZSBhaXJwb3J0cy5jc3YgLiBObyBvdGhlciB2YXJpYWJsZXMgaGF2ZSBhIHJlYWx0aW9uc2hpcCB3aXRoIHRoaXMgdG8gYmUgaW1wdXRlZC4gDQoNCiMjCVNjYW4gSUkNCg0KKiBOb3RlIHRoYXQgaXQgaXMgbm90IHBvc3NpYmxlIGluIHRoaXMgZGF0YSBzZXQgdG8gcmVwbGFjZSBhIHZhcmlhYmxlIHdpdGggaXRzZWxmIGV4Y2x1ZGluZyB0aGUgb3V0bGllcnMuIFRoaXMgaXMgYmVjYXVzZSB0aGUgdmFyaWFibGUgd2lsbCBoYXZlIGEgc21hbGxlciBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGNyZWF0aW5nIGZ1cnRoZXIgZGltZW5zaW9uIGVycm9ycywgaG93ZXZlciB3ZSBjYW4gc3RpbGwgY29tcGFyZSBlYWNoIG9mIHRoZSB2YXJpYWJsZXMgaW5kaXZpZHVhbGx5IHRvIGRldGVjdCBhbnkgb3V0bGllciBwcm9kdWNlZCBwYXR0ZXJucy4NCg0KKlByb2Nlc3M6DQogICAxLiBGaW5kIHRoZSBPdXRsaWVycyBieSBjb252ZXJ0aW5nIHRoZSBkYXRhIGludG8geiBzY29yZXMuDQogICAyLiBaIHNjb3JlcyB3aXRoIGEgc2NvcmUgb2YgZ3JlYXRlciB0aGFuIDMgYXJlIG91dGxpZXJzLg0KICAgMy4gRmlsdGVyIG91dCB0aGUgdGhlIG91dGxpZXJzIGFuZCBjaGVjayB0byBzZWUgdGhhdCB0aGV5IGhhdmUgYmVlbiBmaWx0ZXJlZA0KICAgNC4gUGxvdCBhIGJveHBsb3Qgb2YgYm90aCB0aGUgdmFyaWFibGUgd2l0aCBhbmQgd2l0aG91dCB0aGUgb3V0bGllcnMgdG8gZGV0ZXJtaW5lIGFueSBub3RpY2VhYmxlIGRpZmZlcmVuY2UuDQogICANCmBgYHtyfQ0KIyMgRmluZGluZyBPdXRsaWVycyBmb3Igb25seSB0aGUgTnVtZXJpYyBWYXJpYWJsZXMNCnouc2NvcmVzIDwtIGZsaWdodGRhdGEkREVQQVJUVVJFX0RFTEFZICU+JSBzY29yZXModHlwZSA9ICJ6IikNCmxlbmd0aCAod2hpY2goYWJzKHouc2NvcmVzKSA+MykpDQpEZXBhdHVyZV9EZWxheW5vT3V0bGllcnMgPC0gZmxpZ2h0ZGF0YSRERVBBUlRVUkVfREVMQVlbLSAod2hpY2goYWJzKHouc2NvcmVzKSA+MykpXQ0Kc3RyKERlcGF0dXJlX0RlbGF5bm9PdXRsaWVycykNCnouc2NvcmVzMSA8LSBmbGlnaHRkYXRhJFRBWElfT1VUICU+JSBzY29yZXModHlwZSA9ICJ6IikNCmxlbmd0aCAod2hpY2goYWJzKHouc2NvcmVzMSkgPjMpKQ0KVGF4aV9vdXRub091dGxpZXJzIDwtIGZsaWdodGRhdGEkVEFYSV9PVVRbLSAod2hpY2goYWJzKHouc2NvcmVzMSkgPjMpKV0NCnN0cihUYXhpX291dG5vT3V0bGllcnMpDQp6LnNjb3JlczIgPC0gZmxpZ2h0ZGF0YSRTQ0hFRFVMRURfVElNRSAlPiUgc2NvcmVzKHR5cGUgPSAieiIpDQpsZW5ndGggKHdoaWNoKGFicyh6LnNjb3JlczIpID4zKSkNClNjaGVkdWxlZF90aW1lbm9PdXRsaWVycyA8LSBmbGlnaHRkYXRhJFNDSEVEVUxFRF9USU1FWy0gKHdoaWNoKGFicyh6LnNjb3JlczIpID4zKSldDQpzdHIoU2NoZWR1bGVkX3RpbWVub091dGxpZXJzKQ0Kei5zY29yZXMzIDwtIGZsaWdodGRhdGEkRUxBUFNFRF9USU1FICU+JSBzY29yZXModHlwZSA9ICJ6IikNCmxlbmd0aCAod2hpY2goYWJzKHouc2NvcmVzMykgPjMpKQ0KRWxhcHNlZF90aW1lbm9PdXRsaWVycyA8LSBmbGlnaHRkYXRhJEVMQVBTRURfVElNRVstICh3aGljaChhYnMoei5zY29yZXMzKSA+MykpXQ0Kc3RyKEVsYXBzZWRfdGltZW5vT3V0bGllcnMpDQp6LnNjb3JlczQgPC0gZmxpZ2h0ZGF0YSRBSVJfVElNRSAlPiUgc2NvcmVzKHR5cGUgPSAieiIpDQpsZW5ndGggKHdoaWNoKGFicyh6LnNjb3JlczQpID4zKSkNCkFpcl9UaW1lbm9PdXRsaWVycyA8LSBmbGlnaHRkYXRhJEFJUl9USU1FWy0gKHdoaWNoKGFicyh6LnNjb3JlczQpID4zKSldDQpzdHIoQWlyX1RpbWVub091dGxpZXJzKQ0Kei5zY29yZXM1IDwtIGZsaWdodGRhdGEkRElTVEFOQ0UgJT4lIHNjb3Jlcyh0eXBlID0gInoiKQ0KbGVuZ3RoICh3aGljaChhYnMoei5zY29yZXM1KSA+MykpDQpEaXN0YW5jZV9ub091dGxpZXJzIDwtIGZsaWdodGRhdGEkRElTVEFOQ0VbLSAod2hpY2goYWJzKHouc2NvcmVzNSkgPjMpKV0NCnN0cihEaXN0YW5jZV9ub091dGxpZXJzKQ0Kei5zY29yZXM2IDwtIGZsaWdodGRhdGEkVEFYSV9JTiAlPiUgc2NvcmVzKHR5cGUgPSAieiIpDQpsZW5ndGggKHdoaWNoKGFicyh6LnNjb3JlczYpID4zKSkNClRheGlfaW5ub091dGxpZXJzIDwtIGZsaWdodGRhdGEkVEFYSV9JTlstICh3aGljaChhYnMoei5zY29yZXM2KSA+MykpXQ0Kc3RyKFRheGlfaW5ub091dGxpZXJzKQ0Kei5zY29yZXM3IDwtIGZsaWdodGRhdGEkQVJSSVZBTF9ERUxBWSAlPiUgc2NvcmVzKHR5cGUgPSAieiIpDQpsZW5ndGggKHdoaWNoKGFicyh6LnNjb3JlczcpID4zKSkNCkFycml2YWxfRGVsYXlub091dGxpZXJzIDwtIGZsaWdodGRhdGEkQVJSSVZBTF9ERUxBWVstICh3aGljaChhYnMoei5zY29yZXM3KSA+MykpXQ0Kc3RyKEFycml2YWxfRGVsYXlub091dGxpZXJzKQ0Kei5zY29yZXM4IDwtIGZsaWdodGRhdGEkQXZnX1NwZWVkICU+JSBzY29yZXModHlwZSA9ICJ6IikNCmxlbmd0aCAod2hpY2goYWJzKHouc2NvcmVzOCkgPjMpKQ0KQXZnX3NwZWVkbm9PdXRsaWVycyA8LSBmbGlnaHRkYXRhJEF2Z19TcGVlZFstICh3aGljaChhYnMoei5zY29yZXM4KSA+MykpXQ0Kc3RyKEF2Z19zcGVlZG5vT3V0bGllcnMpDQp6LnNjb3JlczkgPC0gZmxpZ2h0ZGF0YSRUYXhpX1RpbWUgJT4lIHNjb3Jlcyh0eXBlID0gInoiKQ0KbGVuZ3RoICh3aGljaChhYnMoei5zY29yZXM5KSA+MykpDQpUYXhpX1RpbWVub091dGxpZXJzIDwtIGZsaWdodGRhdGEkVGF4aV9UaW1lWy0gKHdoaWNoKGFicyh6LnNjb3JlczkpID4zKSldDQpzdHIoVGF4aV9UaW1lbm9PdXRsaWVycykNCiNCb3hwbG90cw0KYm94cGxvdChmbGlnaHRkYXRhJERFUEFSVFVSRV9ERUxBWSxEZXBhdHVyZV9EZWxheW5vT3V0bGllcnMsIGZsaWdodGRhdGEkQVJSSVZBTF9ERUxBWSwgQXJyaXZhbF9EZWxheW5vT3V0bGllcnMsIG5hbWVzID0gYygiRGVwYXR1cmUgRGVsYXkiLCJERCBPdXRsaWVycyBGaWx0ZXJlZCIsIkFycml2YWwgRGVsYXkiLCJBRCBPdXRsaWVycyBGaWx0ZXJlZCIpLG1haW4gPSAiRGVsYXlzIiwgbGFzID0gMSwgY2V4LmF4aXMgPSAwLjUpDQpib3hwbG90KGZsaWdodGRhdGEkVEFYSV9PVVQsVGF4aV9vdXRub091dGxpZXJzLCBmbGlnaHRkYXRhJFRBWElfSU4sIFRheGlfaW5ub091dGxpZXJzLCBmbGlnaHRkYXRhJFRheGlfVGltZSwgVGF4aV9UaW1lbm9PdXRsaWVycywgbmFtZXMgPSBjKCJUYXhpIE91dCIsIlRPIE91dGxpZXJzIEZpbHRlcmVkIiwiVGF4aSBpbiIsICJUSSBPdXRsaWVycyBGaWx0ZXJlZCIsIlRvdGFsIFRheGkgVGltZSIsIlRUVCBPdXRsaWVycyBGaWx0ZXJlZCIpLG1haW4gPSAiVGF4aSBUaW1lIiwgbGFzID0gMSwgY2V4LmF4aXMgPSAwLjUpDQpib3hwbG90KGZsaWdodGRhdGEkU0NIRURVTEVEX1RJTUUsU2NoZWR1bGVkX3RpbWVub091dGxpZXJzLCBmbGlnaHRkYXRhJEFJUl9USU1FLCBBaXJfVGltZW5vT3V0bGllcnMsIGZsaWdodGRhdGEkRUxBUFNFRF9USU1FLCBFbGFwc2VkX3RpbWVub091dGxpZXJzLCBuYW1lcyA9IGMoIlNjaGVkdWxlZCBUaW1lIiwiU1QgT3V0bGllcnMgRmlsdGVyZWQiLCJBaXIgVGltZSIsIkFUIE91dGxpZXJzIEZpbHRlcmVkIiwiRWxhcHNlZCBUaW1lIiwiRVQgT3V0bGllcnMgRmlsdGVyZWQiKSxtYWluID0gIlRyYXZlbCBUaW1lIiwgbGFzID0gMSwgY2V4LmF4aXMgPSAwLjUpDQpib3hwbG90KGZsaWdodGRhdGEkRElTVEFOQ0UsRGlzdGFuY2Vfbm9PdXRsaWVycywgbmFtZXMgPSBjKCJXaXRoIG91dGxpZXJzIiwiT3V0bGllcnMgRmlsdGVyZWQiKSxtYWluID0gIkRpc3RhbmNlIikNCmJveHBsb3QoZmxpZ2h0ZGF0YSRBdmdfU3BlZWQsQXZnX3NwZWVkbm9PdXRsaWVycywgbmFtZXMgPSBjKCJXaXRoIG91dGxpZXJzIiwiT3V0bGllcnMgRmlsdGVyZWQiKSxtYWluID0gIkF2ZXJhZ2UgU3BlZWQiKQ0KYGBgDQoNCg0KIyMJVHJhbnNmb3JtIA0KDQpIZXJlLCBsb2dhcmF0aG1pYyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFyaWFibGVzLiBPbmx5IGZldyB2YXJpYWJsZXMgY291bGQgYmUgdHJhbnNmb3JtZWQuDQoNCmBgYHtyfQ0KI1RheGlfb3V0DQpoaXN0KGZsaWdodGRhdGEkVEFYSV9PVVQpICNvcmlnaW5hbC1yaWdodCBza2V3ZWQNCmhpc3QobG9nMTAoZmxpZ2h0ZGF0YSRUQVhJX09VVCkpICN0cmFuc2Zvcm1lZCAtIG5vcm1hbA0KI1NjaGVkdWxlZF90aW1lDQpoaXN0KGZsaWdodGRhdGEkU0NIRURVTEVEX1RJTUUpICNvcmlnaW5hbC1yaWdodCBza2V3ZWQNCmhpc3QobG9nMTAoZmxpZ2h0ZGF0YSRTQ0hFRFVMRURfVElNRSkpICN0cmFuc2Zvcm1lZCAtbm9ybWFsDQojQXJyaXZhbF9EZWxheQ0KaGlzdChmbGlnaHRkYXRhJEFSUklWQUxfREVMQVkpICNvcmlnaW5hbA0KaGlzdChsb2coKGZsaWdodGRhdGEkQVJSSVZBTF9ERUxBWSkpKSNyZWR1Y2VkIHNrZXduZXNzDQojQWxsIG90aGVyIHZhcmlhYmxlcyBjb3VsZG50IGJlIHRyYW5zZm9ybWVkDQpgYGANCjxicj4NCjxicj4NCg==