Required packages

# This is the R chunk for the required packages
library("tidyr")
library("dplyr")

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library("stringr")
library("lubridate")

Attaching package: ‘lubridate’

The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
library("forecast")
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

Executive Summary

Data

Vicroads road accident statistics 2000 - 2005 accident data https://discover.data.vic.gov.au/dataset/crash-stats-data-extract

ACCIDENT.csv:

# This is the R chunk for the Data Section
file_url <- "https://vicroadsopendatastorehouse.vicroads.vic.gov.au/opendata/Road_Safety/ACCIDENT.zip"
temp <- tempfile()
download.file(file_url, temp)
trying URL 'https://vicroadsopendatastorehouse.vicroads.vic.gov.au/opendata/Road_Safety/ACCIDENT.zip'
Content type 'application/zip' length 45471291 bytes (43.4 MB)
==================================================
downloaded 43.4 MB
data_accident <- unz(temp, "ACCIDENT.csv") %>% read.csv(strip.white=TRUE)
data_atmosphere <- unz(temp, "ATMOSPHERIC_COND.csv") %>% read.csv(strip.white=TRUE)
unlink(temp)

data_accident %>% head()
data_atmosphere %>% head()

Only interested in the atmospheric conditions present for each accident, sequence and id are irrelevant, but since one accident can have multiple conditions present spread was used to separate the conditions out like a dummy variable. the dummy variables were then joined to back to accidents providing additional atmosphere conditions to the accident dataframe id string stripped of white space to make sure they matched between the 2 files

data_atmosphere$ACCIDENT_NO <- data_atmosphere$ACCIDENT_NO %>% str_trim(side="both")
data_accident$ACCIDENT_NO <- data_accident$ACCIDENT_NO %>% str_trim(side="both")
data_atmosphere_COND <- data_atmosphere %>% mutate(i=TRUE) %>% select(-c("ATMOSPH_COND", "ATMOSPH_COND_SEQ")) %>% pivot_wider(names_from=Atmosph.Cond.Desc, values_from=i, values_fill=FALSE, names_prefix="ATMOSPHERE_COND_")

data <- data_accident %>% inner_join(data_atmosphere_COND, by="ACCIDENT_NO")

data %>% head()

Understand

Display summary of dataframe

data %>% summary()
 ACCIDENT_NO        ACCIDENTDATE       ACCIDENTTIME       ACCIDENT_TYPE  
 Length:191649      Length:191649      Length:191649      Min.   :1.000  
 Class :character   Class :character   Class :character   1st Qu.:1.000  
 Mode  :character   Mode  :character   Mode  :character   Median :1.000  
                                                          Mean   :2.277  
                                                          3rd Qu.:4.000  
                                                          Max.   :9.000  
                                                                         
 Accident.Type.Desc  DAY_OF_WEEK    Day.Week.Description    DCA_CODE    
 Length:191649      Min.   :0.000   Length:191649        Min.   :100.0  
 Class :character   1st Qu.:2.000   Class :character     1st Qu.:120.0  
 Mode  :character   Median :4.000   Mode  :character     Median :130.0  
                    Mean   :4.007                        Mean   :139.3  
                    3rd Qu.:6.000                        3rd Qu.:171.0  
                    Max.   :7.000                        Max.   :199.0  
                                                                        
 DCA.Description     DIRECTORY           EDITION              PAGE          
 Length:191649      Length:191649      Length:191649      Length:191649     
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
                                                                            
 GRID_REFERENCE_X   GRID_REFERENCE_Y LIGHT_CONDITION Light.Condition.Desc
 Length:191649      Min.   : 1.000   Min.   :1.000   Length:191649       
 Class :character   1st Qu.: 4.000   1st Qu.:1.000   Class :character    
 Mode  :character   Median : 6.000   Median :1.000   Mode  :character    
                    Mean   : 6.442   Mean   :1.829                       
                    3rd Qu.: 9.000   3rd Qu.:3.000                       
                    Max.   :14.000   Max.   :9.000                       
                    NA's   :6046                                         
    NODE_ID       NO_OF_VEHICLES     NO_PERSONS     NO_PERSONS_INJ_2  NO_PERSONS_INJ_3 
 Min.   :   -10   Min.   : 1.000   Min.   : 1.000   Min.   : 0.0000   Min.   : 0.0000  
 1st Qu.: 43385   1st Qu.: 1.000   1st Qu.: 2.000   1st Qu.: 0.0000   1st Qu.: 0.0000  
 Median :215525   Median : 2.000   Median : 2.000   Median : 0.0000   Median : 1.0000  
 Mean   :177631   Mean   : 1.787   Mean   : 2.413   Mean   : 0.4182   Mean   : 0.8479  
 3rd Qu.:274530   3rd Qu.: 2.000   3rd Qu.: 3.000   3rd Qu.: 1.0000   3rd Qu.: 1.0000  
 Max.   :651582   Max.   :19.000   Max.   :97.000   Max.   :17.0000   Max.   :43.0000  
                                                                                       
 NO_PERSONS_KILLED  NO_PERSONS_NOT_INJ POLICE_ATTEND   ROAD_GEOMETRY   Road.Geometry.Desc
 Min.   : 0.00000   Min.   : 0.000     Min.   :1.000   Min.   :1.000   Length:191649     
 1st Qu.: 0.00000   1st Qu.: 0.000     1st Qu.:1.000   1st Qu.:2.000   Class :character  
 Median : 0.00000   Median : 1.000     Median :1.000   Median :5.000   Mode  :character  
 Mean   : 0.02049   Mean   : 1.126     Mean   :1.274   Mean   :3.349                     
 3rd Qu.: 0.00000   3rd Qu.: 1.000     3rd Qu.:2.000   3rd Qu.:5.000                     
 Max.   :11.00000   Max.   :87.000     Max.   :9.000   Max.   :9.000                     
                                                                                         
    SEVERITY       SPEED_ZONE    ATMOSPHERE_COND_Clear ATMOSPHERE_COND_Not known
 Min.   :1.000   Min.   : 30.0   Mode :logical         Mode :logical            
 1st Qu.:2.000   1st Qu.: 60.0   FALSE:36653           FALSE:178301             
 Median :3.000   Median : 60.0   TRUE :154996          TRUE :13348              
 Mean   :2.611   Mean   :120.1                                                  
 3rd Qu.:3.000   3rd Qu.: 80.0                                                  
 Max.   :4.000   Max.   :999.0                                                  
                                                                                
 ATMOSPHERE_COND_Smoke ATMOSPHERE_COND_Strong winds ATMOSPHERE_COND_Raining
 Mode :logical         Mode :logical                Mode :logical          
 FALSE:191433          FALSE:188739                 FALSE:170806           
 TRUE :216             TRUE :2910                   TRUE :20843            
                                                                           
                                                                           
                                                                           
                                                                           
 ATMOSPHERE_COND_Dust ATMOSPHERE_COND_Fog ATMOSPHERE_COND_Snowing
 Mode :logical        Mode :logical       Mode :logical          
 FALSE:191131         FALSE:189827        FALSE:191566           
 TRUE :518            TRUE :1822          TRUE :83               
                                                                 
                                                                 
                                                                 
                                                                 

Display structure of dataframe many variables aren’t of the correct typing

data %>% str()
'data.frame':   191649 obs. of  36 variables:
 $ ACCIDENT_NO                 : chr  "T20060000010" "T20060000018" "T20060000022" "T20060000023" ...
 $ ACCIDENTDATE                : chr  "13/01/2006" "13/01/2006" "14/01/2006" "14/01/2006" ...
 $ ACCIDENTTIME                : chr  "12:42:00                      " "19:10:00                      " "12:10:00                      " "11:49:00                      " ...
 $ ACCIDENT_TYPE               : int  1 1 7 1 1 1 4 4 1 2 ...
 $ Accident.Type.Desc          : chr  "Collision with vehicle" "Collision with vehicle" "Fall from or in moving vehicle" "Collision with vehicle" ...
 $ DAY_OF_WEEK                 : int  6 6 7 7 7 7 1 1 2 2 ...
 $ Day.Week.Description        : chr  "Friday" "Friday" "Saturday" "Saturday" ...
 $ DCA_CODE                    : int  113 113 190 130 121 116 171 171 140 109 ...
 $ DCA.Description             : chr  "RIGHT NEAR (INTERSECTIONS ONLY)               " "RIGHT NEAR (INTERSECTIONS ONLY)               " "FELL IN/FROM VEHICLE                    " "REAR END(VEHICLES IN SAME LANE)               " ...
 $ DIRECTORY                   : chr  "MEL" "MEL" "MEL" "MEL" ...
 $ EDITION                     : chr  "40" "40" "40" "40" ...
 $ PAGE                        : chr  "91A" "91" "169" "88" ...
 $ GRID_REFERENCE_X            : chr  "G" "H" "C" "J" ...
 $ GRID_REFERENCE_Y            : int  7 8 11 8 5 2 4 5 11 3 ...
 $ LIGHT_CONDITION             : int  1 1 1 1 1 1 1 3 1 1 ...
 $ Light.Condition.Desc        : chr  "Day" "Day" "Day" "Day" ...
 $ NODE_ID                     : int  43078 29720 203074 55462 202988 277431 203045 203047 35621 205206 ...
 $ NO_OF_VEHICLES              : int  3 2 1 2 2 2 1 1 3 1 ...
 $ NO_PERSONS                  : int  6 4 2 2 3 2 1 1 5 2 ...
 $ NO_PERSONS_INJ_2            : int  0 0 1 1 0 1 1 1 2 0 ...
 $ NO_PERSONS_INJ_3            : int  1 1 0 0 3 0 0 0 2 1 ...
 $ NO_PERSONS_KILLED           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NO_PERSONS_NOT_INJ          : int  5 3 1 1 0 1 0 0 1 1 ...
 $ POLICE_ATTEND               : int  1 1 1 1 1 1 1 1 1 1 ...
 $ ROAD_GEOMETRY               : int  1 2 5 2 5 1 5 5 2 5 ...
 $ Road.Geometry.Desc          : chr  "Cross intersection" "T intersection" "Not at intersection" "T intersection" ...
 $ SEVERITY                    : int  3 3 2 2 3 2 2 2 2 3 ...
 $ SPEED_ZONE                  : int  60 70 100 80 50 100 100 70 80 60 ...
 $ ATMOSPHERE_COND_Clear       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ ATMOSPHERE_COND_Not known   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Smoke       : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Strong winds: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Raining     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Dust        : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Fog         : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Snowing     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...

coerce variables to the correct typing they should be

data$ACCIDENTDATE <- data$ACCIDENTDATE %>% as.Date('%d/%m/%Y')
data$Accident.Type.Desc <- data$Accident.Type.Desc %>% as.factor()
data$Day.Week.Description <- data$Day.Week.Description %>% as.factor()
data$DCA.Description <- data$DCA.Description %>% as.factor()
data$EDITION <- data$EDITION %>% as.character()
data$GRID_REFERENCE_Y <- data$GRID_REFERENCE_Y %>% as.character()
data$Light.Condition.Desc <- data$Light.Condition.Desc %>% as.factor()
data$NODE_ID <- data$NODE_ID %>% as.character()
data$POLICE_ATTEND <- data$POLICE_ATTEND %>% factor(levels=c(1, 2, 9), labels=c("Yes", "No", "Unknown"))
data$Road.Geometry.Desc <- data$Road.Geometry.Desc %>% as.factor()
data$SEVERITY <- data$SEVERITY %>% as.factor()
data$SPEED_ZONE <- data$SPEED_ZONE %>% as.factor()
data %>% str()
'data.frame':   191649 obs. of  36 variables:
 $ ACCIDENT_NO                 : chr  "T20060000010" "T20060000018" "T20060000022" "T20060000023" ...
 $ ACCIDENTDATE                : Date, format: "2006-01-13" "2006-01-13" ...
 $ ACCIDENTTIME                : chr  "12:42:00                      " "19:10:00                      " "12:10:00                      " "11:49:00                      " ...
 $ ACCIDENT_TYPE               : int  1 1 7 1 1 1 4 4 1 2 ...
 $ Accident.Type.Desc          : Factor w/ 9 levels "Collision with a fixed object",..: 3 3 4 3 3 3 1 1 3 8 ...
 $ DAY_OF_WEEK                 : int  6 6 7 7 7 7 1 1 2 2 ...
 $ Day.Week.Description        : Factor w/ 7 levels "Friday","Monday",..: 1 1 3 3 3 3 4 4 2 2 ...
 $ DCA_CODE                    : int  113 113 190 130 121 116 171 171 140 109 ...
 $ DCA.Description             : Factor w/ 81 levels "ACCIDENT OR BROKEN DOWN                   ",..: 59 59 8 55 62 16 17 17 74 2 ...
 $ DIRECTORY                   : chr  "MEL" "MEL" "MEL" "MEL" ...
 $ EDITION                     : chr  "40" "40" "40" "40" ...
 $ PAGE                        : chr  "91A" "91" "169" "88" ...
 $ GRID_REFERENCE_X            : chr  "G" "H" "C" "J" ...
 $ GRID_REFERENCE_Y            : chr  "7" "8" "11" "8" ...
 $ LIGHT_CONDITION             : int  1 1 1 1 1 1 1 3 1 1 ...
 $ Light.Condition.Desc        : Factor w/ 7 levels "Dark No street lights",..: 5 5 5 5 5 5 5 3 5 5 ...
 $ NODE_ID                     : chr  "43078" "29720" "203074" "55462" ...
 $ NO_OF_VEHICLES              : int  3 2 1 2 2 2 1 1 3 1 ...
 $ NO_PERSONS                  : int  6 4 2 2 3 2 1 1 5 2 ...
 $ NO_PERSONS_INJ_2            : int  0 0 1 1 0 1 1 1 2 0 ...
 $ NO_PERSONS_INJ_3            : int  1 1 0 0 3 0 0 0 2 1 ...
 $ NO_PERSONS_KILLED           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NO_PERSONS_NOT_INJ          : int  5 3 1 1 0 1 0 0 1 1 ...
 $ POLICE_ATTEND               : Factor w/ 3 levels "Yes","No","Unknown": 1 1 1 1 1 1 1 1 1 1 ...
 $ ROAD_GEOMETRY               : int  1 2 5 2 5 1 5 5 2 5 ...
 $ Road.Geometry.Desc          : Factor w/ 9 levels "Cross intersection",..: 1 7 4 7 4 1 4 4 7 4 ...
 $ SEVERITY                    : Factor w/ 4 levels "1","2","3","4": 3 3 2 2 3 2 2 2 2 3 ...
 $ SPEED_ZONE                  : Factor w/ 13 levels "30","40","50",..: 4 5 9 7 3 9 9 5 7 4 ...
 $ ATMOSPHERE_COND_Clear       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ ATMOSPHERE_COND_Not known   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Smoke       : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Strong winds: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Raining     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Dust        : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Fog         : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Snowing     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...

Tidy & Manipulate Data I

data_clean <- data %>% select(
  -c(
    "ACCIDENT_TYPE",
    "DAY_OF_WEEK",
    "DCA_CODE",
    "LIGHT_CONDITION",
    "ROAD_GEOMETRY",
  )
)
data_clean %>% str()
'data.frame':   191649 obs. of  31 variables:
 $ ACCIDENT_NO                 : chr  "T20060000010" "T20060000018" "T20060000022" "T20060000023" ...
 $ ACCIDENTDATE                : Date, format: "2006-01-13" "2006-01-13" ...
 $ ACCIDENTTIME                : chr  "12:42:00                      " "19:10:00                      " "12:10:00                      " "11:49:00                      " ...
 $ Accident.Type.Desc          : Factor w/ 9 levels "Collision with a fixed object",..: 3 3 4 3 3 3 1 1 3 8 ...
 $ Day.Week.Description        : Factor w/ 7 levels "Friday","Monday",..: 1 1 3 3 3 3 4 4 2 2 ...
 $ DCA.Description             : Factor w/ 81 levels "ACCIDENT OR BROKEN DOWN                   ",..: 59 59 8 55 62 16 17 17 74 2 ...
 $ DIRECTORY                   : chr  "MEL" "MEL" "MEL" "MEL" ...
 $ EDITION                     : chr  "40" "40" "40" "40" ...
 $ PAGE                        : chr  "91A" "91" "169" "88" ...
 $ GRID_REFERENCE_X            : chr  "G" "H" "C" "J" ...
 $ GRID_REFERENCE_Y            : chr  "7" "8" "11" "8" ...
 $ Light.Condition.Desc        : Factor w/ 7 levels "Dark No street lights",..: 5 5 5 5 5 5 5 3 5 5 ...
 $ NODE_ID                     : chr  "43078" "29720" "203074" "55462" ...
 $ NO_OF_VEHICLES              : int  3 2 1 2 2 2 1 1 3 1 ...
 $ NO_PERSONS                  : int  6 4 2 2 3 2 1 1 5 2 ...
 $ NO_PERSONS_INJ_2            : int  0 0 1 1 0 1 1 1 2 0 ...
 $ NO_PERSONS_INJ_3            : int  1 1 0 0 3 0 0 0 2 1 ...
 $ NO_PERSONS_KILLED           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NO_PERSONS_NOT_INJ          : int  5 3 1 1 0 1 0 0 1 1 ...
 $ POLICE_ATTEND               : Factor w/ 3 levels "Yes","No","Unknown": 1 1 1 1 1 1 1 1 1 1 ...
 $ Road.Geometry.Desc          : Factor w/ 9 levels "Cross intersection",..: 1 7 4 7 4 1 4 4 7 4 ...
 $ SEVERITY                    : Factor w/ 4 levels "1","2","3","4": 3 3 2 2 3 2 2 2 2 3 ...
 $ SPEED_ZONE                  : Factor w/ 13 levels "30","40","50",..: 4 5 9 7 3 9 9 5 7 4 ...
 $ ATMOSPHERE_COND_Clear       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ ATMOSPHERE_COND_Not known   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Smoke       : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Strong winds: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Raining     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Dust        : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Fog         : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Snowing     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...

Tidy & Manipulate Data II

# This is the R chunk for the Tidy & Manipulate Data II 

data_tidy <- data_clean %>% mutate(
  time_of_day = ifelse(
    ACCIDENTTIME <= '05.00.00', 'late night', ifelse(
      ACCIDENTTIME <= '08.30.00', 'early morning', ifelse(
        ACCIDENTTIME <= '09.30.00', 'morning peak hour', ifelse(
          ACCIDENTTIME <= '12.00.00', 'morning', ifelse(
            ACCIDENTTIME <= '17.00.00', 'afternoon', ifelse(
              ACCIDENTTIME <= '18.00.00', 'afternoon peak hour', ifelse(
                ACCIDENTTIME <= '20.00.00', 'evening', ifelse(
                  ACCIDENTTIME <= '24.00.00', 'night', NA
                )
              )
            )
          )
        )
      )
    )
  )
)
data_tidy$time_of_day <- data_tidy$time_of_day %>% as.factor()
data_tidy <- data_tidy %>% select(-c("ACCIDENTTIME"))
data_tidy %>% str()
'data.frame':   191649 obs. of  31 variables:
 $ ACCIDENT_NO                 : chr  "T20060000010" "T20060000018" "T20060000022" "T20060000023" ...
 $ ACCIDENTDATE                : Date, format: "2006-01-13" "2006-01-13" ...
 $ Accident.Type.Desc          : Factor w/ 9 levels "Collision with a fixed object",..: 3 3 4 3 3 3 1 1 3 8 ...
 $ Day.Week.Description        : Factor w/ 7 levels "Friday","Monday",..: 1 1 3 3 3 3 4 4 2 2 ...
 $ DCA.Description             : Factor w/ 81 levels "ACCIDENT OR BROKEN DOWN                   ",..: 59 59 8 55 62 16 17 17 74 2 ...
 $ DIRECTORY                   : chr  "MEL" "MEL" "MEL" "MEL" ...
 $ EDITION                     : chr  "40" "40" "40" "40" ...
 $ PAGE                        : chr  "91A" "91" "169" "88" ...
 $ GRID_REFERENCE_X            : chr  "G" "H" "C" "J" ...
 $ GRID_REFERENCE_Y            : chr  "7" "8" "11" "8" ...
 $ Light.Condition.Desc        : Factor w/ 7 levels "Dark No street lights",..: 5 5 5 5 5 5 5 3 5 5 ...
 $ NODE_ID                     : chr  "43078" "29720" "203074" "55462" ...
 $ NO_OF_VEHICLES              : int  3 2 1 2 2 2 1 1 3 1 ...
 $ NO_PERSONS                  : int  6 4 2 2 3 2 1 1 5 2 ...
 $ NO_PERSONS_INJ_2            : int  0 0 1 1 0 1 1 1 2 0 ...
 $ NO_PERSONS_INJ_3            : int  1 1 0 0 3 0 0 0 2 1 ...
 $ NO_PERSONS_KILLED           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NO_PERSONS_NOT_INJ          : int  5 3 1 1 0 1 0 0 1 1 ...
 $ POLICE_ATTEND               : Factor w/ 3 levels "Yes","No","Unknown": 1 1 1 1 1 1 1 1 1 1 ...
 $ Road.Geometry.Desc          : Factor w/ 9 levels "Cross intersection",..: 1 7 4 7 4 1 4 4 7 4 ...
 $ SEVERITY                    : Factor w/ 4 levels "1","2","3","4": 3 3 2 2 3 2 2 2 2 3 ...
 $ SPEED_ZONE                  : Factor w/ 13 levels "30","40","50",..: 4 5 9 7 3 9 9 5 7 4 ...
 $ ATMOSPHERE_COND_Clear       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ ATMOSPHERE_COND_Not known   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Smoke       : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Strong winds: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Raining     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Dust        : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Fog         : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Snowing     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ time_of_day                 : Factor w/ 8 levels "afternoon","afternoon peak hour",..: 6 4 6 6 6 1 6 8 3 6 ...

Scan I

# This is the R chunk for the Scan I
colnames(data_tidy)[colSums(is.na(data_tidy)) > 0]
[1] "GRID_REFERENCE_Y"

Looks better

data_tidy[is.na(data_tidy)] = "UNKNOWN"
length(data_tidy[is.na(data_tidy)])
[1] 0
data_tidy <- data_tidy %>% unite(
  DIRECTORY_REFERENCE,
  DIRECTORY,
  EDITION,
  PAGE,
  GRID_REFERENCE_X,
  GRID_REFERENCE_Y,
  sep="."
)

str(data_tidy)
'data.frame':   191649 obs. of  27 variables:
 $ ACCIDENT_NO                 : chr  "T20060000010" "T20060000018" "T20060000022" "T20060000023" ...
 $ ACCIDENTDATE                : Date, format: "2006-01-13" "2006-01-13" ...
 $ Accident.Type.Desc          : Factor w/ 9 levels "Collision with a fixed object",..: 3 3 4 3 3 3 1 1 3 8 ...
 $ Day.Week.Description        : Factor w/ 7 levels "Friday","Monday",..: 1 1 3 3 3 3 4 4 2 2 ...
 $ DCA.Description             : Factor w/ 81 levels "ACCIDENT OR BROKEN DOWN                   ",..: 59 59 8 55 62 16 17 17 74 2 ...
 $ DIRECTORY_REFERENCE         : chr  "MEL.40.91A.G.7" "MEL.40.91.H.8" "MEL.40.169.C.11" "MEL.40.88.J.8" ...
 $ Light.Condition.Desc        : Factor w/ 7 levels "Dark No street lights",..: 5 5 5 5 5 5 5 3 5 5 ...
 $ NODE_ID                     : chr  "43078" "29720" "203074" "55462" ...
 $ NO_OF_VEHICLES              : int  3 2 1 2 2 2 1 1 3 1 ...
 $ NO_PERSONS                  : int  6 4 2 2 3 2 1 1 5 2 ...
 $ NO_PERSONS_INJ_2            : int  0 0 1 1 0 1 1 1 2 0 ...
 $ NO_PERSONS_INJ_3            : int  1 1 0 0 3 0 0 0 2 1 ...
 $ NO_PERSONS_KILLED           : int  0 0 0 0 0 0 0 0 0 0 ...
 $ NO_PERSONS_NOT_INJ          : int  5 3 1 1 0 1 0 0 1 1 ...
 $ POLICE_ATTEND               : Factor w/ 3 levels "Yes","No","Unknown": 1 1 1 1 1 1 1 1 1 1 ...
 $ Road.Geometry.Desc          : Factor w/ 9 levels "Cross intersection",..: 1 7 4 7 4 1 4 4 7 4 ...
 $ SEVERITY                    : Factor w/ 4 levels "1","2","3","4": 3 3 2 2 3 2 2 2 2 3 ...
 $ SPEED_ZONE                  : Factor w/ 13 levels "30","40","50",..: 4 5 9 7 3 9 9 5 7 4 ...
 $ ATMOSPHERE_COND_Clear       : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ ATMOSPHERE_COND_Not known   : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Smoke       : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Strong winds: logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Raining     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Dust        : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Fog         : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ ATMOSPHERE_COND_Snowing     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ time_of_day                 : Factor w/ 8 levels "afternoon","afternoon peak hour",..: 6 4 6 6 6 1 6 8 3 6 ...

Display head of tidy dataframe

data_tidy %>% head()

Scan II

Outliers are found in almost all cases, which is good, means most accidents involve very few people.

# This is the R chunk for the Scan II
data_tidy$NO_OF_VEHICLES %>% boxplot(main="No. of vehicles involved")

data_tidy$NO_PERSONS %>% boxplot(main="No. of people involved")

data_tidy$NO_PERSONS_KILLED %>% boxplot(main = "No. of people with fatal injuries")

data_tidy$NO_PERSONS_INJ_2 %>% boxplot(main = "No. of people with critical injuries")

data_tidy$NO_PERSONS_INJ_3 %>% boxplot(main = "No. of people with other injuries")

data_tidy$NO_PERSONS_NOT_INJ %>% boxplot(main = "No. of people with non injuries")

Will try BoxCox transformations to clean it up.

Transform

Rest seems to have outliers but figures are plausible, try to reduce outlier/skewness with BoxCox

multicar collisions still stand out after BoxCox

# This is the R chunk for the Transform Section
data_tidy$NO_OF_VEHICLES <- BoxCox(data_tidy$NO_OF_VEHICLES, lambda = "auto")
data_tidy$NO_OF_VEHICLES %>% boxplot(main = "No. of vehicles BoxCox")

data_tidy$NO_PERSONS <- BoxCox(data_tidy$NO_PERSONS, lambda = "auto")
data_tidy$NO_PERSONS %>% boxplot(main = "No. of people BoxCox")

data_tidy$NO_PERSONS_KILLED <- BoxCox(data_tidy$NO_PERSONS_KILLED, lambda = "auto")
data_tidy$NO_PERSONS_KILLED %>% boxplot(main = "No. of people with fatal injuries BoxCox")

data_tidy$NO_PERSONS_INJ_2 <- BoxCox(data_tidy$NO_PERSONS_INJ_2, lambda = "auto")
data_tidy$NO_PERSONS_INJ_2 %>% boxplot(main = "No. of people with serious injuries BoxCox")

data_tidy$NO_PERSONS_INJ_3 <- BoxCox(data_tidy$NO_PERSONS_INJ_3, lambda = "auto")
data_tidy$NO_PERSONS_INJ_3 %>% boxplot(main = "No. of people with other injuries BoxCox")

data_tidy$NO_PERSONS_NOT_INJ <- BoxCox(data_tidy$NO_PERSONS_NOT_INJ, lambda = "auto")
data_tidy$NO_PERSONS_NOT_INJ %>% boxplot(main = "No. of people with non injuries BoxCox")



LS0tCnRpdGxlOiAiTUFUSDIzNDkgU2VtZXN0ZXIgMSwgMjAyMCIKYXV0aG9yOiAiR2VvcmdlIENoYWkgczM1MzM4MzIiCnN1YnRpdGxlOiBBc3NpZ25tZW50IDIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKIyMgUmVxdWlyZWQgcGFja2FnZXMgCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeSgidGlkeXIiKQpsaWJyYXJ5KCJkcGx5ciIpCmxpYnJhcnkoInN0cmluZ3IiKQpsaWJyYXJ5KCJsdWJyaWRhdGUiKQpsaWJyYXJ5KCJmb3JlY2FzdCIpCmBgYAoKCiMjIEV4ZWN1dGl2ZSBTdW1tYXJ5IAoKKiBGaWxlIGRvd25sb2FkZWQgYW5kIHJlYWQgaW50byAyIGRhdGFmcmFtZXMKKiBkYXRhX2F0bW9zcGhlcmUgd2FzIGdyb3VwZWQgYW5kIHNwcmVhZCB0byBvbmx5IGNvbnRhaW4gMSByb3cgcGVyIGFjY2lkZW50IGlkCiogYXRtb3NwaGVyZSBkYXRhIHdhcyBqb2luZWQgdG8gYWNjaWRlbnQgZGF0YQoqIGluc3BlY3RlZCBzdW1tYXJ5IGFuZCBzdHJ1Y3R1cmUgb2Ygam9pbmVkIGRhdGEsIHNvbWUgZmVhdHVyZXMgd2VyZSBvZiB0aGUgd3JvbmcgdHlwZQoqIGZlYXR1cmVzIGNvZXJjZWQgdG8gY29ycmVjdCB0eXBlcwoqIHJlZHVuZGFudCBpZHMgcmVtb3ZlZCwgb3B0aW5nIHRvIGtlZXAgZGVzY3JpcHRpdmUgZmVhdHVyZSBpbnN0ZWFkCiogdGltZSBvZiBhY2NpZGVudCBiaW5uZWQgdXAgaW50byBwZXJpb2RzIG9mIGludGVyZXN0Ciogd2FudCB0byBjb21iaW5lIHJvYWQgZGlyZWN0b3J5IGRldGFpbHMgaW50byBzaW5nbGUgY29sdW1uIGJ1dCB1cG9uIGluc3BlY3Rpb24gb2YgZGF0YWZyYW1lIGZvciBtaXNzaW5nIHZhbHVlcyBmb3VuZCB0aGVyZSB3ZXJlIHNvbWUgY29udGFpbmVkIGhlcmUKKiByZXBsYWNlZCBtaXNzaW5nIHZhbHVlcyB3aXRoICJ1bmtub3duIiBzbyBpdCB3aWxsIGJlIG9idmlvdXMgd2hlbiB0aGUgY29sdW1ucyBhcmUgdW5pdGVkCiogbmV3IGNvbHVtbiBjcmVhdGVkIHRvIGNhcHR1cmUgYWxsIG9mIHRoZSBkaXJlY3RvcnkgZGV0YWlscwoqIGluc3BlY3QgcmVtYWluaW5nIG51bWVyaWMgY29sdW1ucyBmb3Igb3V0bGllcnMvZXJyb3JzIHVzaW5nIGJveHBsb3RzCiogb3V0bGllcnMgYXJlIGV2ZXJ5d2hlcmUgYnV0IHRoZXkgZG9uJ3QgbG9vayBsaWtlIGVycm9ycywgdGhleSBhbGwgbG9vayBwbGF1c2libGUsIG1ham9yaXR5IG9mIHJvYWQgYWNjaWRlbnRzIGRvbid0IGludm9sdmUgbWFueSBwZW9wbGUKCiMjIERhdGEgCgpWaWNyb2FkcyByb2FkIGFjY2lkZW50IHN0YXRpc3RpY3MKMjAwMCAtIDIwMDUgYWNjaWRlbnQgZGF0YQpodHRwczovL2Rpc2NvdmVyLmRhdGEudmljLmdvdi5hdS9kYXRhc2V0L2NyYXNoLXN0YXRzLWRhdGEtZXh0cmFjdAoKQUNDSURFTlQuY3N2OgoKKiBBQ0NJREVOVF9OTzogaWQKKiBBQ0NJREVOVERBVEU6IGRhdGUgb2YKKiBBQ0NJREVOVFRJTUU6IHRpbWUgb2YKKiBBQ0NJREVOVF9UWVBFOiB0eXBlIGlkCiogQWNjaWRlbnQuVHlwZS5EZXNjOiB0eXBlIGluIHdvcmRzCiogREFZX09GX1dFRUs6IHdlZWtkYXkgaWQKKiBEYXkuV2Vlay5EZXNjcmlwdGlvbjogd2Vla2RheQoqIERDQV9DT0RFOiBEZWZpbml0aW9ucyBmb3IgQ2xhc3NpZnlpbmcgQWNjaWRlbnQgSUQKKiBEQ0EuRGVzY3JpcHRpb246IEFjY2lkZW50IENsYXNzaWZpY2F0aW9uCiogRElSRUNUT1JZOiBSb2FkIGRpcmVjdG9yeQoqIEVESVRJT046IEVkaXRpb24gb2YgZGlyZWN0b3J5CiogUEFHRTogUGFnZSBpbiBkaXJlY3RvcnkKKiBHUklEX1JFRkVSRU5DRV9YOiB4LWdyaWQgcmVmZXJlbmNlIG9uIHBhZ2UgaW4gZGlyZWN0b3J5CiogR1JJRF9SRUZFUkVOQ0VfWTogeS1ncmlkIHJlZmVyZW5jZSBvbiBwYWdlIGluIGRpcmVjdG9yeQoqIExJR0hUX0NPTkRJVElPTjogTGlnaHQgY29uZGl0aW9uIGlkCiogTGlnaHQuQ29uZGl0aW9uLkRlc2M6IExpZ2h0IGNvbmRpdGlvbiBpbiB3b3JkcwoqIE5PREVfSUQ6IFVuaXF1ZSBpbnRlZ2VyIGlkZW50aWZpZXIgZm9yIHRoZSBleGFjdCBhY2NpZGVudCBsb2NhdGlvbiBvbgpWaWNSb2FkcyBkaWdpdGFsIG1hcCBvZiBWaWN0b3JpYSAodGhlIFJOREIpLgoqIE5PX09GX1ZFSElDTEVTOiBudW1iZXIgb2YgdmVoaWNsZXMKKiBOT19QRVJTT05TOiBudW1iZXIgb2YgcGVyc29ucwoqIE5PX1BFUlNPTlNfSU5KXzI6IG51bWJlciBvZiBwZXJzb25zIHdpdGggc2VyaW91cyBpbmp1cnkKKiBOT19QRVJTT05TX0lOSl8zOiBudW1iZXIgb2YgcGVyc29ucyB3aXRoIG90aGVyIGluanVyeQoqIE5PX1BFUlNPTlNfS0lMTEVEOiBudW1iZXIgb2YgcGVyc29ucyB3aXRoIGZhdGFsIGluanVyeQoqIE5PX1BFUlNPTlNfTk9UX0lOSjogbnVtYmVyIG9mIHBlcnNvbnMgd2l0aCBub24gaW5qdXJ5CiogUE9MSUNFX0FUVEVORDogV2hldGhlciBvciBub3QgdGhlIHBvbGljZSBhdHRlbmRlZCB0aGUgc2NlbmUgb2YgdGhlIGFjY2lkZW50LiAxOlllcywgMjpObywgOTogTm90IGtub3duCiogUk9BRF9HRU9NRVRSWTogcm9hZCBnZW9tZXRyeSBpZAoqIFJvYWQuR2VvbWV0cnkuRGVzYzogcm9hZCBnZW9tZXRyeSBpbiB3b3JkcwoqIFNFVkVSSVRZOiBTZXZlcml0eSBvZiBhY2NpZGVudCAxOiBGYXRhbCwgMjogU2VyaW91cywgMzogT3RoZXIsIDQ6IE5vbiBpbmp1cnkKKiBTUEVFRF9aT05FOiBzcGVlZCB6b25lIGluIGttL2hyIHdpdGggc3BlY2lhbCB2YWx1ZXMgYXNzaWduZWQgdG86CiAgKiA3Nzc6IE90aGVyIHNwZWVkIGxpbWl0CiAgKiA4ODg6IENhbXBpbmcgZ3JvdW5kcywgb2ZmIHJvYWQKICAqIDk5OTogTm90IGtub3duCgoqIHRlbXAgZmlsZSBpcyBjcmVhdGVkCiogemlwIGZpbGUgZG93bmxvYWRlZCBhbmQgd3JpdHRlbiB0byB0aGUgdGVtcGZpbGUKKiAyIGNzdiBmcm9tIHdpdGhpbiB0aGUgemlwIGZpbGUgd2VyZSB1bnppcHBlZCBhbmQgc3RvcmVkIGFzIGRhdGFmcmFtZXMgdmlhIHJlYWQuY3N2IHdpdGggd2hpdGVzcGFjZXMgdHJpbW1lZAoqIHRlbXAgZmlsZSBpcyByZW1vdmVkCiogaGVhZCBpcyBzaG93bgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgRGF0YSBTZWN0aW9uCmZpbGVfdXJsIDwtICJodHRwczovL3ZpY3JvYWRzb3BlbmRhdGFzdG9yZWhvdXNlLnZpY3JvYWRzLnZpYy5nb3YuYXUvb3BlbmRhdGEvUm9hZF9TYWZldHkvQUNDSURFTlQuemlwIgp0ZW1wIDwtIHRlbXBmaWxlKCkKZG93bmxvYWQuZmlsZShmaWxlX3VybCwgdGVtcCkKCmRhdGFfYWNjaWRlbnQgPC0gdW56KHRlbXAsICJBQ0NJREVOVC5jc3YiKSAlPiUgcmVhZC5jc3Yoc3RyaXAud2hpdGU9VFJVRSkKZGF0YV9hdG1vc3BoZXJlIDwtIHVueih0ZW1wLCAiQVRNT1NQSEVSSUNfQ09ORC5jc3YiKSAlPiUgcmVhZC5jc3Yoc3RyaXAud2hpdGU9VFJVRSkKdW5saW5rKHRlbXApCgpkYXRhX2FjY2lkZW50ICU+JSBoZWFkKCkKYGBgCgpgYGB7cn0KZGF0YV9hdG1vc3BoZXJlICU+JSBoZWFkKCkKYGBgCgpPbmx5IGludGVyZXN0ZWQgaW4gdGhlIGF0bW9zcGhlcmljIGNvbmRpdGlvbnMgcHJlc2VudCBmb3IgZWFjaCBhY2NpZGVudCwgc2VxdWVuY2UgYW5kIGlkIGFyZSBpcnJlbGV2YW50LCBidXQgc2luY2Ugb25lIGFjY2lkZW50IGNhbiBoYXZlIG11bHRpcGxlIGNvbmRpdGlvbnMgcHJlc2VudCBzcHJlYWQgd2FzIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGNvbmRpdGlvbnMgb3V0IGxpa2UgYSBkdW1teSB2YXJpYWJsZS4KdGhlIGR1bW15IHZhcmlhYmxlcyB3ZXJlIHRoZW4gam9pbmVkIHRvIGJhY2sgdG8gYWNjaWRlbnRzIHByb3ZpZGluZyBhZGRpdGlvbmFsIGF0bW9zcGhlcmUgY29uZGl0aW9ucyB0byB0aGUgYWNjaWRlbnQgZGF0YWZyYW1lCmlkIHN0cmluZyBzdHJpcHBlZCBvZiB3aGl0ZSBzcGFjZSB0byBtYWtlIHN1cmUgdGhleSBtYXRjaGVkIGJldHdlZW4gdGhlIDIgZmlsZXMKCmBgYHtyfQpkYXRhX2F0bW9zcGhlcmUkQUNDSURFTlRfTk8gPC0gZGF0YV9hdG1vc3BoZXJlJEFDQ0lERU5UX05PICU+JSBzdHJfdHJpbShzaWRlPSJib3RoIikKZGF0YV9hY2NpZGVudCRBQ0NJREVOVF9OTyA8LSBkYXRhX2FjY2lkZW50JEFDQ0lERU5UX05PICU+JSBzdHJfdHJpbShzaWRlPSJib3RoIikKZGF0YV9hdG1vc3BoZXJlX0NPTkQgPC0gZGF0YV9hdG1vc3BoZXJlICU+JSBtdXRhdGUoaT1UUlVFKSAlPiUgc2VsZWN0KC1jKCJBVE1PU1BIX0NPTkQiLCAiQVRNT1NQSF9DT05EX1NFUSIpKSAlPiUgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbT1BdG1vc3BoLkNvbmQuRGVzYywgdmFsdWVzX2Zyb209aSwgdmFsdWVzX2ZpbGw9RkFMU0UsIG5hbWVzX3ByZWZpeD0iQVRNT1NQSEVSRV9DT05EXyIpCgpkYXRhIDwtIGRhdGFfYWNjaWRlbnQgJT4lIGlubmVyX2pvaW4oZGF0YV9hdG1vc3BoZXJlX0NPTkQsIGJ5PSJBQ0NJREVOVF9OTyIpCgpkYXRhICU+JSBoZWFkKCkKYGBgCgojIyBVbmRlcnN0YW5kIAoKRGlzcGxheSBzdW1tYXJ5IG9mIGRhdGFmcmFtZQpgYGB7cn0KZGF0YSAlPiUgc3VtbWFyeSgpCmBgYAoKRGlzcGxheSBzdHJ1Y3R1cmUgb2YgZGF0YWZyYW1lCm1hbnkgdmFyaWFibGVzIGFyZW4ndCBvZiB0aGUgY29ycmVjdCB0eXBpbmcKYGBge3J9CmRhdGEgJT4lIHN0cigpCmBgYAoKY29lcmNlIHZhcmlhYmxlcyB0byB0aGUgY29ycmVjdCB0eXBpbmcgdGhleSBzaG91bGQgYmUKYGBge3J9CmRhdGEkQUNDSURFTlREQVRFIDwtIGRhdGEkQUNDSURFTlREQVRFICU+JSBhcy5EYXRlKCclZC8lbS8lWScpCmRhdGEkQWNjaWRlbnQuVHlwZS5EZXNjIDwtIGRhdGEkQWNjaWRlbnQuVHlwZS5EZXNjICU+JSBhcy5mYWN0b3IoKQpkYXRhJERheS5XZWVrLkRlc2NyaXB0aW9uIDwtIGRhdGEkRGF5LldlZWsuRGVzY3JpcHRpb24gJT4lIGFzLmZhY3RvcigpCmRhdGEkRENBLkRlc2NyaXB0aW9uIDwtIGRhdGEkRENBLkRlc2NyaXB0aW9uICU+JSBhcy5mYWN0b3IoKQpkYXRhJEVESVRJT04gPC0gZGF0YSRFRElUSU9OICU+JSBhcy5jaGFyYWN0ZXIoKQpkYXRhJEdSSURfUkVGRVJFTkNFX1kgPC0gZGF0YSRHUklEX1JFRkVSRU5DRV9ZICU+JSBhcy5jaGFyYWN0ZXIoKQpkYXRhJExpZ2h0LkNvbmRpdGlvbi5EZXNjIDwtIGRhdGEkTGlnaHQuQ29uZGl0aW9uLkRlc2MgJT4lIGFzLmZhY3RvcigpCmRhdGEkTk9ERV9JRCA8LSBkYXRhJE5PREVfSUQgJT4lIGFzLmNoYXJhY3RlcigpCmRhdGEkUE9MSUNFX0FUVEVORCA8LSBkYXRhJFBPTElDRV9BVFRFTkQgJT4lIGZhY3RvcihsZXZlbHM9YygxLCAyLCA5KSwgbGFiZWxzPWMoIlllcyIsICJObyIsICJVbmtub3duIikpCmRhdGEkUm9hZC5HZW9tZXRyeS5EZXNjIDwtIGRhdGEkUm9hZC5HZW9tZXRyeS5EZXNjICU+JSBhcy5mYWN0b3IoKQpkYXRhJFNFVkVSSVRZIDwtIGRhdGEkU0VWRVJJVFkgJT4lIGFzLmZhY3RvcigpCmRhdGEkU1BFRURfWk9ORSA8LSBkYXRhJFNQRUVEX1pPTkUgJT4lIGFzLmZhY3RvcigpCmRhdGEgJT4lIHN0cigpCmBgYAoKIyMgIFRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSSAKCiogYGRhdGFfYXRtb3NwaGVyZWAgZGlkIG5vdCBjb250YWluIG9uZSBhY2NpZGVudCBvYnNlcnZhdGlvbiBwZXIgcm93LCB0aGlzIHdhcyBoYW5kbGVkIHdpdGggYGdyb3VwX2J5YCBhbmQgYHNwcmVhZGAgZWFybGllciBiZWZvcmUgYmVpbmcgam9pbmVkIHRvIGBkYXRhX2FjY2lkZW50YAoqIHJlZHVuZGFudCBjb2x1bW5zIHByZXNlbnQ6IGluZm9ybWF0aW9uIHN0b3JlZCBhcyBpZCBhbG9uZyB3aXRoIGRlc2NyaXB0aW9uLCBjb2x1bW5zIHJlbW92ZWQgd2l0aCBgLXNlbGVjdGAKKiBtYW55IGNvbHVtbnMgZm9ybSB1cCBhIGRpcmVjdG9yeSByZWZlcmVuY2UsIGNvbmNhdGVuYXRlZCBpbnRvIG5ldyBjb2x1bW4gdXNpbmcgdHJhbnNtdXRlCgpgYGB7cn0KZGF0YV9jbGVhbiA8LSBkYXRhICU+JSBzZWxlY3QoCiAgLWMoCiAgICAiQUNDSURFTlRfVFlQRSIsCiAgICAiREFZX09GX1dFRUsiLAogICAgIkRDQV9DT0RFIiwKICAgICJMSUdIVF9DT05ESVRJT04iLAogICAgIlJPQURfR0VPTUVUUlkiLAogICkKKQpkYXRhX2NsZWFuICU+JSBzdHIoKQpgYGAKCiMjICBUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIAoKKiBleGFjdCB0aW1lIG9mIGFjY2lkZW50IG5vdCB0aGUgbW9zdCB1c2VmdWwgb2YgaW5mb3JtYXRpb24sIG1vcmUgaW50ZXJlc3RpbmcgdG8gbG9vayBhdCBwZXJpb2RzIG9mIHRpbWUgZHVyaW5nIHRoZSBkYXkgc3VjaCBhcyBhZnRlcm5vb24gcGVhayBob3VyCiogYXMgc3VjaCwgYEFDQ0lERU5UVElNRWAgd2FzIGJpbm5lZCBpbnRvIGB0aW1lX29mX2RheWAgdXNpbmcgYG11dGF0ZWAgdGhlbiByZW1vdmVkCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSSAKCmRhdGFfdGlkeSA8LSBkYXRhX2NsZWFuICU+JSBtdXRhdGUoCiAgdGltZV9vZl9kYXkgPSBpZmVsc2UoCiAgICBBQ0NJREVOVFRJTUUgPD0gJzA1LjAwLjAwJywgJ2xhdGUgbmlnaHQnLCBpZmVsc2UoCiAgICAgIEFDQ0lERU5UVElNRSA8PSAnMDguMzAuMDAnLCAnZWFybHkgbW9ybmluZycsIGlmZWxzZSgKICAgICAgICBBQ0NJREVOVFRJTUUgPD0gJzA5LjMwLjAwJywgJ21vcm5pbmcgcGVhayBob3VyJywgaWZlbHNlKAogICAgICAgICAgQUNDSURFTlRUSU1FIDw9ICcxMi4wMC4wMCcsICdtb3JuaW5nJywgaWZlbHNlKAogICAgICAgICAgICBBQ0NJREVOVFRJTUUgPD0gJzE3LjAwLjAwJywgJ2FmdGVybm9vbicsIGlmZWxzZSgKICAgICAgICAgICAgICBBQ0NJREVOVFRJTUUgPD0gJzE4LjAwLjAwJywgJ2FmdGVybm9vbiBwZWFrIGhvdXInLCBpZmVsc2UoCiAgICAgICAgICAgICAgICBBQ0NJREVOVFRJTUUgPD0gJzIwLjAwLjAwJywgJ2V2ZW5pbmcnLCBpZmVsc2UoCiAgICAgICAgICAgICAgICAgIEFDQ0lERU5UVElNRSA8PSAnMjQuMDAuMDAnLCAnbmlnaHQnLCBOQQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgICAgKQogICAgICAgICkKICAgICAgKQogICAgKQogICkKKQpkYXRhX3RpZHkkdGltZV9vZl9kYXkgPC0gZGF0YV90aWR5JHRpbWVfb2ZfZGF5ICU+JSBhcy5mYWN0b3IoKQpkYXRhX3RpZHkgPC0gZGF0YV90aWR5ICU+JSBzZWxlY3QoLWMoIkFDQ0lERU5UVElNRSIpKQpkYXRhX3RpZHkgJT4lIHN0cigpCmBgYAoKIyMgIFNjYW4gSSAKCiogbW9zdCBhcmUgZmFjdG9ycyB3aXRoIG5vIG91dCBvZiBwbGFjZSB2YWx1ZXMgYXMgbGV2ZWxzCiogYE5BYCBmb3VuZCBpbiBjb21wb25lbnRzIHRoYXQgd291bGQgbWFrZSB1cCBgZGlyZWN0b3J5X3JlZmVyZW5jZWAsIHBhZCBpdCBvdXQgd2l0aCAiVU5LTk9XTiIgdG8gaW5kaWNhdGUgdGhpcyB3YXMgbWlzc2luZwoKYGBge3J9CiMgVGhpcyBpcyB0aGUgUiBjaHVuayBmb3IgdGhlIFNjYW4gSQpjb2xuYW1lcyhkYXRhX3RpZHkpW2NvbFN1bXMoaXMubmEoZGF0YV90aWR5KSkgPiAwXQpgYGAKCkxvb2tzIGJldHRlcgpgYGB7cn0KZGF0YV90aWR5W2lzLm5hKGRhdGFfdGlkeSldID0gIlVOS05PV04iCmxlbmd0aChkYXRhX3RpZHlbaXMubmEoZGF0YV90aWR5KV0pCmBgYAoKKiBEaXJlY3RvcnkgcmVmZXJlbmNlIHNwcmVhZCBvdXQgb3ZlciBhIG51bWJlciBvZiBjb2x1bW5zLCBzbW9vc2ggdGhlbSB0b2dldGhlciB1c2luZyBgdW5pdGVgCmBgYHtyfQpkYXRhX3RpZHkgPC0gZGF0YV90aWR5ICU+JSB1bml0ZSgKICBESVJFQ1RPUllfUkVGRVJFTkNFLAogIERJUkVDVE9SWSwKICBFRElUSU9OLAogIFBBR0UsCiAgR1JJRF9SRUZFUkVOQ0VfWCwKICBHUklEX1JFRkVSRU5DRV9ZLAogIHNlcD0iLiIKKQoKc3RyKGRhdGFfdGlkeSkKYGBgCgpEaXNwbGF5IGhlYWQgb2YgdGlkeSBkYXRhZnJhbWUKYGBge3J9CmRhdGFfdGlkeSAlPiUgaGVhZCgpCmBgYAoKIyMgIFNjYW4gSUkKT3V0bGllcnMgYXJlIGZvdW5kIGluIGFsbW9zdCBhbGwgY2FzZXMsIHdoaWNoIGlzIGdvb2QsIG1lYW5zIG1vc3QgYWNjaWRlbnRzIGludm9sdmUgdmVyeSBmZXcgcGVvcGxlLgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgU2NhbiBJSQpkYXRhX3RpZHkkTk9fT0ZfVkVISUNMRVMgJT4lIGJveHBsb3QobWFpbj0iTm8uIG9mIHZlaGljbGVzIGludm9sdmVkIikKYGBgCgpgYGB7cn0KZGF0YV90aWR5JE5PX1BFUlNPTlMgJT4lIGJveHBsb3QobWFpbj0iTm8uIG9mIHBlb3BsZSBpbnZvbHZlZCIpCmBgYAoKYGBge3J9CmRhdGFfdGlkeSROT19QRVJTT05TX0tJTExFRCAlPiUgYm94cGxvdChtYWluID0gIk5vLiBvZiBwZW9wbGUgd2l0aCBmYXRhbCBpbmp1cmllcyIpCmBgYAoKYGBge3J9CmRhdGFfdGlkeSROT19QRVJTT05TX0lOSl8yICU+JSBib3hwbG90KG1haW4gPSAiTm8uIG9mIHBlb3BsZSB3aXRoIGNyaXRpY2FsIGluanVyaWVzIikKYGBgCgpgYGB7cn0KZGF0YV90aWR5JE5PX1BFUlNPTlNfSU5KXzMgJT4lIGJveHBsb3QobWFpbiA9ICJOby4gb2YgcGVvcGxlIHdpdGggb3RoZXIgaW5qdXJpZXMiKQpgYGAKCmBgYHtyfQpkYXRhX3RpZHkkTk9fUEVSU09OU19OT1RfSU5KICU+JSBib3hwbG90KG1haW4gPSAiTm8uIG9mIHBlb3BsZSB3aXRoIG5vbiBpbmp1cmllcyIpCmBgYApXaWxsIHRyeSBCb3hDb3ggdHJhbnNmb3JtYXRpb25zIHRvIGNsZWFuIGl0IHVwLgoKIyMgIFRyYW5zZm9ybSAKUmVzdCBzZWVtcyB0byBoYXZlIG91dGxpZXJzIGJ1dCBmaWd1cmVzIGFyZSBwbGF1c2libGUsIHRyeSB0byByZWR1Y2Ugb3V0bGllci9za2V3bmVzcyB3aXRoIEJveENveAoKbXVsdGljYXIgY29sbGlzaW9ucyBzdGlsbCBzdGFuZCBvdXQgYWZ0ZXIgQm94Q294CmBgYHtyfQojIFRoaXMgaXMgdGhlIFIgY2h1bmsgZm9yIHRoZSBUcmFuc2Zvcm0gU2VjdGlvbgpkYXRhX3RpZHkkTk9fT0ZfVkVISUNMRVMgPC0gQm94Q294KGRhdGFfdGlkeSROT19PRl9WRUhJQ0xFUywgbGFtYmRhID0gImF1dG8iKQpkYXRhX3RpZHkkTk9fT0ZfVkVISUNMRVMgJT4lIGJveHBsb3QobWFpbiA9ICJOby4gb2YgdmVoaWNsZXMgQm94Q294IikKYGBgCgpgYGB7cn0KZGF0YV90aWR5JE5PX1BFUlNPTlMgPC0gQm94Q294KGRhdGFfdGlkeSROT19QRVJTT05TLCBsYW1iZGEgPSAiYXV0byIpCmRhdGFfdGlkeSROT19QRVJTT05TICU+JSBib3hwbG90KG1haW4gPSAiTm8uIG9mIHBlb3BsZSBCb3hDb3giKQpgYGAKCmBgYHtyfQpkYXRhX3RpZHkkTk9fUEVSU09OU19LSUxMRUQgPC0gQm94Q294KGRhdGFfdGlkeSROT19QRVJTT05TX0tJTExFRCwgbGFtYmRhID0gImF1dG8iKQpkYXRhX3RpZHkkTk9fUEVSU09OU19LSUxMRUQgJT4lIGJveHBsb3QobWFpbiA9ICJOby4gb2YgcGVvcGxlIHdpdGggZmF0YWwgaW5qdXJpZXMgQm94Q294IikKYGBgCgpgYGB7cn0KZGF0YV90aWR5JE5PX1BFUlNPTlNfSU5KXzIgPC0gQm94Q294KGRhdGFfdGlkeSROT19QRVJTT05TX0lOSl8yLCBsYW1iZGEgPSAiYXV0byIpCmRhdGFfdGlkeSROT19QRVJTT05TX0lOSl8yICU+JSBib3hwbG90KG1haW4gPSAiTm8uIG9mIHBlb3BsZSB3aXRoIHNlcmlvdXMgaW5qdXJpZXMgQm94Q294IikKYGBgCgpgYGB7cn0KZGF0YV90aWR5JE5PX1BFUlNPTlNfSU5KXzMgPC0gQm94Q294KGRhdGFfdGlkeSROT19QRVJTT05TX0lOSl8zLCBsYW1iZGEgPSAiYXV0byIpCmRhdGFfdGlkeSROT19QRVJTT05TX0lOSl8zICU+JSBib3hwbG90KG1haW4gPSAiTm8uIG9mIHBlb3BsZSB3aXRoIG90aGVyIGluanVyaWVzIEJveENveCIpCmBgYAoKYGBge3J9CmRhdGFfdGlkeSROT19QRVJTT05TX05PVF9JTkogPC0gQm94Q294KGRhdGFfdGlkeSROT19QRVJTT05TX05PVF9JTkosIGxhbWJkYSA9ICJhdXRvIikKZGF0YV90aWR5JE5PX1BFUlNPTlNfTk9UX0lOSiAlPiUgYm94cGxvdChtYWluID0gIk5vLiBvZiBwZW9wbGUgd2l0aCBub24gaW5qdXJpZXMgQm94Q294IikKYGBgCgo8YnI+Cjxicj4K