IMPORTANT NOTE:

All the instructions to complete this assignment are available on the MATH2349_1910 Assignment_3 Word file. Please read through this document carefully before submitting your report.

Groups

Students are permitted to work individually or in groups of up to 3 people for Assignment 3. Each group must fill out the group registration form before 2/06/2019 to register their group details.

All group members must submit a copy of the report! Group members that are not registered and do not submit a report will not be acknowledged.

You must use the headings and chunks provided in the template, you may add additional sections and R chunks if you require. In the report, all R chunks and outputs needs to be visible. Failure to do so will result in a loss of marks.

This report must be uploaded to Turnitin as a PDF with your code chunks and outputs showing. The easiest way to achieve this is to Preview your notebook in HTML (by clicking Preview) → Open in Browser (Chrome) → Right click on the report in Chrome → Click Print and Select the Destination Option to Save as PDF.

You must also publish your report to RPubs (see here) and and submit this RPubs link to the google form given here. This online version of the report will be used for marking. Failure to submit your link will delay your feedback and risk late penalties.

Feel free to DELETE the instructional text provided in the template. If you have any questions regarding the assignment instructions and the R template, please post it on Slack under the #assignment3 channel.

Required packages

Provide the packages required to reproduce the report. Make sure you fulfilled the minimum requirement #10.

The package dplyr was installed and used

install.packages("dplyr")
Installing package into 㤼㸱C:/Users/spirzada/Documents/R/win-library/3.5㤼㸲
(as 㤼㸱lib㤼㸲 is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/dplyr_0.8.1.zip'
Content type 'application/zip' length 3231480 bytes (3.1 MB)
downloaded 3.1 MB
package ‘dplyr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\spirzada\AppData\Local\Temp\RtmpOUeVAJ\downloaded_packages
library(dplyr)
package 㤼㸱dplyr㤼㸲 was built under R version 3.5.3
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

Executive Summary

In your own words, provide a brief summary of the preprocessing. Explain the steps that you have taken to preprocess your data. Write this section last after you have performed all data preprocessing. (Word count Max: 300 words)

Firstly I took the 2 datasets from Kaggle.com and converted them from csv files to excel files. Then I imported them to excel. I downloaded the required package in excel which in this case was dplyr. The two data frame were train and tube. I combined both of these datasets using an inner join. I inspected the data types and attributes of all the variables. I changed one variable from character to factor with the labels “yes” and “no”. I noticed that the data was tidy because each variable had its own column, each observation had its own separate row and each value had its own cell. Thus no more data manipulation was required at this stage. I mutated the data frame to create a new variable total_price which was a product of cost and quantity. I scanned the data for missing values and inconsistencies and none were found. I think used boxplots to check for outliers. I was only concerned with the box plots which showed a small number of outliers, since they are to be excluded. The ones with a large number of outliers were left alone. Based on the boxplots other has 7 outliers, num_boss has 5 and num_bends has 8 outliers and bend_radius. All the other variables have far too many outliers, and thus those cannot be excluded. We can remove these outliers using the capping method. This removes outliers below the 5th percentile and those above the 95th percentile. Upon observing the boxplots for the variables. I observed some skewness in num_bends and the diameter variable. To confirm this a histogram was created. The histogram shows right skewness in both variables. Thus we perform logarithmic transformation to make the data set more symmetrical in nature.

Data

A clear description of data sets, their sources, and variable descriptions should be provided. In this section, you must also provide the R codes with outputs (head of data sets) that you used to import/read/scrape the data set. You need to fulfil the minimum requirement #1 and merge at least two data sets to create the one you are going to work on. In addition to the R codes and outputs, you need to explain the steps that you have taken.

Two data sets were taken from Kaggle.com(https://www.kaggle.com/arionai/caterpillar-tube-pricing-dataset#tube.csv). Theey were in CSV form and I saved them as an excel workbook then uploaded them to R. An inner join was used to join the data sets. This dataset was used in the Caterpillar Tube Pricing competition that ran between Jun 2015 and September 2015. We are dealing with two files from this relation. The tube file contains information on tube assemblies, which are the primary focus of the competition. This includes dimesnions of the tube, materials used etc.The train file has informaiton the suppliers,pricing quantity etc. The combined dataframe has been named dataset and has 24 variables.

library(readxl)
train <- read_excel("train.xlsx")
library(readxl)
tube <- read_excel("tube.xlsx")
dataset <- train %>% left_join(tube, by = "tube_assembly_id")

Understand

Summarise the types of variables and data structures, check the attributes in the data and apply data type conversions. In addition to the R codes and outputs, explain briefly the steps that you have taken. In this section, show that you have fulfilled minimum requirements 2-4.

Upon inspection of the data many different types of data is present such as characters, numbers and date format. The bracket_pricing was converted to a factor variable with 2 levels “Yes” and “No”.

str(dataset)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30213 obs. of  23 variables:
 $ tube_assembly_id  : chr  "TA-00002" "TA-00002" "TA-00002" "TA-00002" ...
 $ supplier          : chr  "S-0066" "S-0066" "S-0066" "S-0066" ...
 $ quote_date        : POSIXct, format: "2013-07-07" "2013-07-07" "2013-07-07" "2013-07-07" ...
 $ annual_usage      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ min_order_quantity: num  0 0 0 0 0 0 0 0 0 0 ...
 $ bracket_pricing   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
 $ quantity          : num  1 2 5 10 25 50 100 250 1 2 ...
 $ cost              : num  21.91 12.34 6.6 4.69 3.54 ...
 $ material_id       : chr  "SP-0019" "SP-0019" "SP-0019" "SP-0019" ...
 $ diameter          : num  6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 ...
 $ wall              : num  0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 ...
 $ length            : num  137 137 137 137 137 137 137 137 137 137 ...
 $ num_bends         : num  8 8 8 8 8 8 8 8 9 9 ...
 $ bend_radius       : num  19.1 19.1 19.1 19.1 19.1 ...
 $ end_a_1x          : chr  "N" "N" "N" "N" ...
 $ end_a_2x          : chr  "N" "N" "N" "N" ...
 $ end_x_1x          : chr  "N" "N" "N" "N" ...
 $ end_x_2x          : chr  "N" "N" "N" "N" ...
 $ end_a             : chr  "EF-008" "EF-008" "EF-008" "EF-008" ...
 $ end_x             : chr  "EF-008" "EF-008" "EF-008" "EF-008" ...
 $ num_boss          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ num_bracket       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ other             : num  0 0 0 0 0 0 0 0 0 0 ...
dataset$bracket_pricing<-as.factor(dataset$bracket_pricing)
levels(dataset$bracket_pricing)
[1] "No"  "Yes"
attributes(dataset)
$`row.names`
   [1]    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21
  [22]   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42
  [43]   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63
  [64]   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84
  [85]   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105
 [106]  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126
 [127]  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147
 [148]  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  163  164  165  166  167  168
 [169]  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189
 [190]  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210
 [211]  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231
 [232]  232  233  234  235  236  237  238  239  240  241  242  243  244  245  246  247  248  249  250  251  252
 [253]  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273
 [274]  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294
 [295]  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315
 [316]  316  317  318  319  320  321  322  323  324  325  326  327  328  329  330  331  332  333  334  335  336
 [337]  337  338  339  340  341  342  343  344  345  346  347  348  349  350  351  352  353  354  355  356  357
 [358]  358  359  360  361  362  363  364  365  366  367  368  369  370  371  372  373  374  375  376  377  378
 [379]  379  380  381  382  383  384  385  386  387  388  389  390  391  392  393  394  395  396  397  398  399
 [400]  400  401  402  403  404  405  406  407  408  409  410  411  412  413  414  415  416  417  418  419  420
 [421]  421  422  423  424  425  426  427  428  429  430  431  432  433  434  435  436  437  438  439  440  441
 [442]  442  443  444  445  446  447  448  449  450  451  452  453  454  455  456  457  458  459  460  461  462
 [463]  463  464  465  466  467  468  469  470  471  472  473  474  475  476  477  478  479  480  481  482  483
 [484]  484  485  486  487  488  489  490  491  492  493  494  495  496  497  498  499  500  501  502  503  504
 [505]  505  506  507  508  509  510  511  512  513  514  515  516  517  518  519  520  521  522  523  524  525
 [526]  526  527  528  529  530  531  532  533  534  535  536  537  538  539  540  541  542  543  544  545  546
 [547]  547  548  549  550  551  552  553  554  555  556  557  558  559  560  561  562  563  564  565  566  567
 [568]  568  569  570  571  572  573  574  575  576  577  578  579  580  581  582  583  584  585  586  587  588
 [589]  589  590  591  592  593  594  595  596  597  598  599  600  601  602  603  604  605  606  607  608  609
 [610]  610  611  612  613  614  615  616  617  618  619  620  621  622  623  624  625  626  627  628  629  630
 [631]  631  632  633  634  635  636  637  638  639  640  641  642  643  644  645  646  647  648  649  650  651
 [652]  652  653  654  655  656  657  658  659  660  661  662  663  664  665  666  667  668  669  670  671  672
 [673]  673  674  675  676  677  678  679  680  681  682  683  684  685  686  687  688  689  690  691  692  693
 [694]  694  695  696  697  698  699  700  701  702  703  704  705  706  707  708  709  710  711  712  713  714
 [715]  715  716  717  718  719  720  721  722  723  724  725  726  727  728  729  730  731  732  733  734  735
 [736]  736  737  738  739  740  741  742  743  744  745  746  747  748  749  750  751  752  753  754  755  756
 [757]  757  758  759  760  761  762  763  764  765  766  767  768  769  770  771  772  773  774  775  776  777
 [778]  778  779  780  781  782  783  784  785  786  787  788  789  790  791  792  793  794  795  796  797  798
 [799]  799  800  801  802  803  804  805  806  807  808  809  810  811  812  813  814  815  816  817  818  819
 [820]  820  821  822  823  824  825  826  827  828  829  830  831  832  833  834  835  836  837  838  839  840
 [841]  841  842  843  844  845  846  847  848  849  850  851  852  853  854  855  856  857  858  859  860  861
 [862]  862  863  864  865  866  867  868  869  870  871  872  873  874  875  876  877  878  879  880  881  882
 [883]  883  884  885  886  887  888  889  890  891  892  893  894  895  896  897  898  899  900  901  902  903
 [904]  904  905  906  907  908  909  910  911  912  913  914  915  916  917  918  919  920  921  922  923  924
 [925]  925  926  927  928  929  930  931  932  933  934  935  936  937  938  939  940  941  942  943  944  945
 [946]  946  947  948  949  950  951  952  953  954  955  956  957  958  959  960  961  962  963  964  965  966
 [967]  967  968  969  970  971  972  973  974  975  976  977  978  979  980  981  982  983  984  985  986  987
 [988]  988  989  990  991  992  993  994  995  996  997  998  999 1000
 [ reached getOption("max.print") -- omitted 29213 entries ]

$names
 [1] "tube_assembly_id"   "supplier"           "quote_date"         "annual_usage"       "min_order_quantity"
 [6] "bracket_pricing"    "quantity"           "cost"               "material_id"        "diameter"          
[11] "wall"               "length"             "num_bends"          "bend_radius"        "end_a_1x"          
[16] "end_a_2x"           "end_x_1x"           "end_x_2x"           "end_a"              "end_x"             
[21] "num_boss"           "num_bracket"        "other"             

$class
[1] "tbl_df"     "tbl"        "data.frame"

Tidy & Manipulate Data I

Check if the data conforms the tidy data principles. If your data is untidy, reshape your data into a tidy format (minimum requirement #5). In addition to the R codes and outputs, explain everything that you do in this step.

No change needs to be made as the data is already tidy due to 3 main reasons.

Each variable has its its own column Each observation has its own seperate row Each value has its own cell

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.

We mutate the dataset by adding a new variable which I have named total_price. I believe this will be useful as it tells the the total price of all the tubes for each order. This is formed by multiplying quantity and cost.

dataset<-mutate(dataset,
       total_price = quantity*cost)
str(dataset)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   30213 obs. of  24 variables:
 $ tube_assembly_id  : chr  "TA-00002" "TA-00002" "TA-00002" "TA-00002" ...
 $ supplier          : chr  "S-0066" "S-0066" "S-0066" "S-0066" ...
 $ quote_date        : POSIXct, format: "2013-07-07" "2013-07-07" "2013-07-07" "2013-07-07" ...
 $ annual_usage      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ min_order_quantity: num  0 0 0 0 0 0 0 0 0 0 ...
 $ bracket_pricing   : Factor w/ 2 levels "No","Yes": 2 2 2 2 2 2 2 2 2 2 ...
 $ quantity          : num  1 2 5 10 25 50 100 250 1 2 ...
 $ cost              : num  21.91 12.34 6.6 4.69 3.54 ...
 $ material_id       : chr  "SP-0019" "SP-0019" "SP-0019" "SP-0019" ...
 $ diameter          : num  6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 6.35 ...
 $ wall              : num  0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 0.71 ...
 $ length            : num  137 137 137 137 137 137 137 137 137 137 ...
 $ num_bends         : num  8 8 8 8 8 8 8 8 9 9 ...
 $ bend_radius       : num  19.1 19.1 19.1 19.1 19.1 ...
 $ end_a_1x          : chr  "N" "N" "N" "N" ...
 $ end_a_2x          : chr  "N" "N" "N" "N" ...
 $ end_x_1x          : chr  "N" "N" "N" "N" ...
 $ end_x_2x          : chr  "N" "N" "N" "N" ...
 $ end_a             : chr  "EF-008" "EF-008" "EF-008" "EF-008" ...
 $ end_x             : chr  "EF-008" "EF-008" "EF-008" "EF-008" ...
 $ num_boss          : num  0 0 0 0 0 0 0 0 0 0 ...
 $ num_bracket       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ other             : num  0 0 0 0 0 0 0 0 0 0 ...
 $ total_price       : num  21.9 24.7 33 46.9 88.5 ...

Scan I

Scan the data for missing values, inconsistencies and obvious errors. In this step, you should fulfil the minimum requirement #7. In addition to the R codes and outputs, explain how you dealt with these values.

Upon scanning the values we find 0 missing valies. Thus no further steps need to be taken

is.na(dataset)
         tube_assembly_id supplier quote_date annual_usage min_order_quantity bracket_pricing quantity  cost
    [1,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [2,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [3,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [4,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [5,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [6,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [7,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [8,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
    [9,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [10,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [11,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [12,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [13,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [14,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [15,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [16,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [17,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [18,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [19,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [20,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [21,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [22,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [23,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [24,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [25,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [26,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [27,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [28,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [29,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [30,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [31,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [32,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [33,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [34,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [35,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [36,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [37,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [38,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [39,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [40,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
   [41,]            FALSE    FALSE      FALSE        FALSE              FALSE           FALSE    FALSE FALSE
         material_id diameter  wall length num_bends bend_radius end_a_1x end_a_2x end_x_1x end_x_2x end_a
    [1,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [2,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [3,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [4,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [5,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [6,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [7,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [8,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
    [9,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [10,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [11,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [12,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [13,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [14,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [15,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [16,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [17,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [18,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [19,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [20,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [21,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [22,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [23,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [24,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [25,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [26,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [27,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [28,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [29,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [30,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [31,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [32,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [33,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [34,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [35,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [36,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [37,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [38,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [39,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [40,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
   [41,]       FALSE    FALSE FALSE  FALSE     FALSE       FALSE    FALSE    FALSE    FALSE    FALSE FALSE
         end_x num_boss num_bracket other total_price
    [1,] FALSE    FALSE       FALSE FALSE       FALSE
    [2,] FALSE    FALSE       FALSE FALSE       FALSE
    [3,] FALSE    FALSE       FALSE FALSE       FALSE
    [4,] FALSE    FALSE       FALSE FALSE       FALSE
    [5,] FALSE    FALSE       FALSE FALSE       FALSE
    [6,] FALSE    FALSE       FALSE FALSE       FALSE
    [7,] FALSE    FALSE       FALSE FALSE       FALSE
    [8,] FALSE    FALSE       FALSE FALSE       FALSE
    [9,] FALSE    FALSE       FALSE FALSE       FALSE
   [10,] FALSE    FALSE       FALSE FALSE       FALSE
   [11,] FALSE    FALSE       FALSE FALSE       FALSE
   [12,] FALSE    FALSE       FALSE FALSE       FALSE
   [13,] FALSE    FALSE       FALSE FALSE       FALSE
   [14,] FALSE    FALSE       FALSE FALSE       FALSE
   [15,] FALSE    FALSE       FALSE FALSE       FALSE
   [16,] FALSE    FALSE       FALSE FALSE       FALSE
   [17,] FALSE    FALSE       FALSE FALSE       FALSE
   [18,] FALSE    FALSE       FALSE FALSE       FALSE
   [19,] FALSE    FALSE       FALSE FALSE       FALSE
   [20,] FALSE    FALSE       FALSE FALSE       FALSE
   [21,] FALSE    FALSE       FALSE FALSE       FALSE
   [22,] FALSE    FALSE       FALSE FALSE       FALSE
   [23,] FALSE    FALSE       FALSE FALSE       FALSE
   [24,] FALSE    FALSE       FALSE FALSE       FALSE
   [25,] FALSE    FALSE       FALSE FALSE       FALSE
   [26,] FALSE    FALSE       FALSE FALSE       FALSE
   [27,] FALSE    FALSE       FALSE FALSE       FALSE
   [28,] FALSE    FALSE       FALSE FALSE       FALSE
   [29,] FALSE    FALSE       FALSE FALSE       FALSE
   [30,] FALSE    FALSE       FALSE FALSE       FALSE
   [31,] FALSE    FALSE       FALSE FALSE       FALSE
   [32,] FALSE    FALSE       FALSE FALSE       FALSE
   [33,] FALSE    FALSE       FALSE FALSE       FALSE
   [34,] FALSE    FALSE       FALSE FALSE       FALSE
   [35,] FALSE    FALSE       FALSE FALSE       FALSE
   [36,] FALSE    FALSE       FALSE FALSE       FALSE
   [37,] FALSE    FALSE       FALSE FALSE       FALSE
   [38,] FALSE    FALSE       FALSE FALSE       FALSE
   [39,] FALSE    FALSE       FALSE FALSE       FALSE
   [40,] FALSE    FALSE       FALSE FALSE       FALSE
   [41,] FALSE    FALSE       FALSE FALSE       FALSE
 [ reached getOption("max.print") -- omitted 30172 rows ]
colSums(is.na(dataset))
  tube_assembly_id           supplier         quote_date       annual_usage min_order_quantity 
                 0                  0                  0                  0                  0 
   bracket_pricing           quantity               cost        material_id           diameter 
                 0                  0                  0                  0                  0 
              wall             length          num_bends        bend_radius           end_a_1x 
                 0                  0                  0                  0                  0 
          end_a_2x           end_x_1x           end_x_2x              end_a              end_x 
                 0                  0                  0                  0                  0 
          num_boss        num_bracket              other        total_price 
                 0                  0                  0                  0 

Scan II

Scan the numeric data for outliers. In this step, you should fulfil the minimum requirement #8. In addition to the R codes and outputs, explain how you dealt with these values.

First I plotted box plot for all the numeric variables to check for outliers. Some authors recomennd that when there are outliers that are small in numbers then they can be excluded. Based on the boxplots other has 7 outliers, num_boss has 5 and num_bends has 8 outliers and bend_radius. All the other variables have far too many outliers, and thus those cannot be excluded. We can remove these outliers using the capping method. This removes outliers below the 5th percentile and those above the 95th percentile

dataset$annual_usage %>% boxplot()

dataset$min_order_quantity %>% boxplot()

dataset$quantity %>% boxplot()

dataset$cost %>% boxplot()

dataset$diameter %>% boxplot()

dataset$wall %>% boxplot()

dataset$length %>% boxplot()

dataset$num_bends %>% boxplot()

dataset$bend_radius %>% boxplot()

dataset$num_boss %>% boxplot()

dataset$other %>% boxplot()

dataset$total_price %>% boxplot()

ap <- function(x){
  quantiles <- quantile( x, c(.05, 0.25, 0.75, .95 ) )
  x[ x < quantiles[2] - 1.5*IQR(x) ] <- quantiles[1]
  x[ x > quantiles[3] + 1.5*IQR(x) ] <- quantiles[4]
  x
}
dataset$other <- dataset$other %>% cap()
dataset$num_boss <- dataset$num_boss %>% cap()
dataset$num_bends <- dataset$num_bends %>% cap()
dataset$bend_radius <- dataset$bend_radius %>% cap
dataset$other %>% boxplot()

dataset$num_boss %>% boxplot()

dataset$num_bends %>% boxplot()

dataset$bend_radius %>% boxplot()

Transform

Apply an appropriate transformation for at least one of the variables. In addition to the R codes and outputs, explain everything that you do in this step. In this step, you should fulfil the minimum requirement #9.

In the last question we observed the boxplots for the variables. I observed some skewness in num_bends and the diameter variable. To confirm this a histogram was created. The histogram shows right skewness in both variables. Thus we perform logarithmic transformation to make the data set more symettrical in nature.

hist(dataset$diameter)

hist(dataset$num_bends)

dataset$diameter <- log10(dataset$diameter)
dataset$num_bends <- log10(dataset$num_bends)
hist(dataset$diameter)

hist(dataset$num_bends)

NOTE: Follow the order outlined above in the report. Make sure your code is visible (within the margin of the page). Do not use View() to show your data instead give headers (using head() )

Any further or optional pre-processing tasks can be added to the template using an additional section in the R Markdown file. Please also provide the R codes, outputs and brief explanations on why and how you applied these tasks on the data.



LS0tDQp0aXRsZTogIk1BVEgyMzQ5IFNlbWVzdGVyIDEsIDIwMTkiDQphdXRob3I6ICJTYWxhYXIgUGlyemFkYSAxMDY2NTAxIg0Kc3VidGl0bGU6IEFzc2lnbm1lbnQgMw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KDQojIyBJTVBPUlRBTlQgTk9URTogDQoNCkFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoaXMgYXNzaWdubWVudCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBbTUFUSDIzNDlfMTkxMCBBc3NpZ25tZW50XzNdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMXhZNVlKUF90Nk9sU0NVZFFET3FhU1lMN083T3EweTUtUFkyQmh6QS1vakUvZWRpdD91c3A9c2hhcmluZykgV29yZCBmaWxlLiBQbGVhc2UgcmVhZCB0aHJvdWdoIHRoaXMgZG9jdW1lbnQgY2FyZWZ1bGx5IGJlZm9yZSBzdWJtaXR0aW5nIHlvdXIgcmVwb3J0Lg0KDQoqKkdyb3VwcyoqDQoNClN0dWRlbnRzIGFyZSBwZXJtaXR0ZWQgdG8gd29yayBpbmRpdmlkdWFsbHkgb3IgaW4gZ3JvdXBzIG9mIHVwIHRvIDMgcGVvcGxlIGZvciBBc3NpZ25tZW50IDMuICoqRWFjaCBncm91cCBtdXN0IGZpbGwgb3V0IHRoZSBbZ3JvdXAgcmVnaXN0cmF0aW9uIGZvcm1dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2NrU1lFN2tsTXZsal9xUlZ1SGZpSEh1akExem96Tlk2VWNWcDRXVlI1dHlTLUdqZy92aWV3Zm9ybT91c3A9c2ZfbGluaykqKiBiZWZvcmUgMi8wNi8yMDE5IHRvIHJlZ2lzdGVyIHRoZWlyIGdyb3VwIGRldGFpbHMuIA0KDQoNCkFsbCBncm91cCBtZW1iZXJzIG11c3Qgc3VibWl0IGEgY29weSBvZiB0aGUgcmVwb3J0ISBHcm91cCBtZW1iZXJzIHRoYXQgYXJlIG5vdCByZWdpc3RlcmVkIGFuZCBkbyBub3Qgc3VibWl0IGEgcmVwb3J0IHdpbGwgbm90IGJlIGFja25vd2xlZGdlZC4NCg0KDQpZb3UgbXVzdCB1c2UgdGhlIGhlYWRpbmdzIGFuZCBjaHVua3MgcHJvdmlkZWQgaW4gdGhlIHRlbXBsYXRlLCB5b3UgbWF5IGFkZCBhZGRpdGlvbmFsIHNlY3Rpb25zIGFuZCBSIGNodW5rcyBpZiB5b3UgcmVxdWlyZS4gSW4gdGhlIHJlcG9ydCwgYWxsIFIgY2h1bmtzIGFuZCBvdXRwdXRzIG5lZWRzIHRvIGJlIHZpc2libGUuIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYSBsb3NzIG9mIG1hcmtzLiANCg0KDQpUaGlzIHJlcG9ydCBtdXN0IGJlIHVwbG9hZGVkIHRvIFR1cm5pdGluIGFzIGEgUERGIHdpdGggeW91ciBjb2RlIGNodW5rcyBhbmQgb3V0cHV0cyBzaG93aW5nLiBUaGUgZWFzaWVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIFByZXZpZXcgeW91ciBub3RlYm9vayBpbiBIVE1MIChieSBjbGlja2luZyBQcmV2aWV3KSDihpIgT3BlbiBpbiBCcm93c2VyIChDaHJvbWUpIOKGkiBSaWdodCBjbGljayBvbiB0aGUgcmVwb3J0IGluIENocm9tZSDihpIgQ2xpY2sgUHJpbnQgYW5kIFNlbGVjdCB0aGUgRGVzdGluYXRpb24gT3B0aW9uIHRvIFNhdmUgYXMgUERGLg0KDQoNCllvdSBtdXN0IGFsc28gcHVibGlzaCB5b3VyIHJlcG9ydCB0byBSUHVicyAoc2VlIFtoZXJlXShodHRwczovL2FzdHJhbC10aGVvcnktMTU3NTEwLmFwcHNwb3QuY29tL3NlY3VyZWQvUkJvb3RjYW1wX0NvdXJzZV8wNC5odG1sI2NyZWF0aW5nX2FuX3JfbWFya2Rvd25fZG9jdW1lbnRfaW5fcl9zdHVkaW8pKSBhbmQgYW5kIHN1Ym1pdCB0aGlzIFJQdWJzIGxpbmsgdG8gdGhlIFtnb29nbGUgZm9ybSBnaXZlbiBoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkc1RTRnc3VTlNd3NQSTJycFBrbVM2RnRWT3h4eGdydkwxd2k4a3RsSDBibkJ3Z1Evdmlld2Zvcm0/dXNwPXNmX2xpbmspLiBUaGlzIG9ubGluZSB2ZXJzaW9uIG9mIHRoZSByZXBvcnQgd2lsbCBiZSB1c2VkIGZvciBtYXJraW5nLiBGYWlsdXJlIHRvIHN1Ym1pdCB5b3VyIGxpbmsgd2lsbCBkZWxheSB5b3VyIGZlZWRiYWNrIGFuZCByaXNrIGxhdGUgcGVuYWx0aWVzLg0KDQoNCioqRmVlbCBmcmVlIHRvIERFTEVURSB0aGUgaW5zdHJ1Y3Rpb25hbCB0ZXh0IHByb3ZpZGVkIGluIHRoZSB0ZW1wbGF0ZS4qKiBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgYXNzaWdubWVudCBpbnN0cnVjdGlvbnMgYW5kIHRoZSBSIHRlbXBsYXRlLCBwbGVhc2UgcG9zdCBpdCBvbiBbU2xhY2tdKGh0dHBzOi8vbWF0aDIzNDktMTkxMC5zbGFjay5jb20pIHVuZGVyIHRoZSBgI2Fzc2lnbm1lbnQzYCBjaGFubmVsLiANCg0KDQojIyBSZXF1aXJlZCBwYWNrYWdlcyANCg0KDQpQcm92aWRlIHRoZSBwYWNrYWdlcyByZXF1aXJlZCB0byByZXByb2R1Y2UgdGhlIHJlcG9ydC4gTWFrZSBzdXJlIHlvdSBmdWxmaWxsZWQgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzEwLg0KDQpUaGUgcGFja2FnZSBkcGx5ciB3YXMgaW5zdGFsbGVkIGFuZCB1c2VkDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQoNCiMjIEV4ZWN1dGl2ZSBTdW1tYXJ5IA0KDQoNCkluIHlvdXIgb3duIHdvcmRzLCBwcm92aWRlIGEgYnJpZWYgc3VtbWFyeSBvZiB0aGUgcHJlcHJvY2Vzc2luZy4gRXhwbGFpbiB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbiB0byBwcmVwcm9jZXNzIHlvdXIgZGF0YS4gV3JpdGUgdGhpcyBzZWN0aW9uIGxhc3QgYWZ0ZXIgeW91IGhhdmUgcGVyZm9ybWVkIGFsbCBkYXRhIHByZXByb2Nlc3NpbmcuIChXb3JkIGNvdW50IE1heDogMzAwIHdvcmRzKQ0KDQpGaXJzdGx5IEkgdG9vayB0aGUgMiBkYXRhc2V0cyBmcm9tIEthZ2dsZS5jb20gYW5kIGNvbnZlcnRlZCB0aGVtIGZyb20gY3N2IGZpbGVzIHRvIGV4Y2VsIGZpbGVzLiBUaGVuIEkgaW1wb3J0ZWQgdGhlbSB0byBleGNlbC4gSSBkb3dubG9hZGVkIHRoZSByZXF1aXJlZCBwYWNrYWdlIGluIGV4Y2VsIHdoaWNoIGluIHRoaXMgY2FzZSB3YXMgZHBseXIuIFRoZSB0d28gZGF0YSBmcmFtZSB3ZXJlIHRyYWluIGFuZCB0dWJlLiAgSSBjb21iaW5lZCBib3RoIG9mIHRoZXNlIGRhdGFzZXRzIHVzaW5nIGFuIGlubmVyIGpvaW4uIEkgaW5zcGVjdGVkIHRoZSBkYXRhIHR5cGVzIGFuZCBhdHRyaWJ1dGVzIG9mIGFsbCB0aGUgdmFyaWFibGVzLiBJIGNoYW5nZWQgb25lIHZhcmlhYmxlIGZyb20gY2hhcmFjdGVyIHRvIGZhY3RvciB3aXRoIHRoZSBsYWJlbHMgInllcyIgYW5kICJubyIuIEkgbm90aWNlZCB0aGF0IHRoZSBkYXRhIHdhcyB0aWR5IGJlY2F1c2UgZWFjaCB2YXJpYWJsZSBoYWQgaXRzIG93biBjb2x1bW4sIGVhY2ggb2JzZXJ2YXRpb24gaGFkIGl0cyBvd24gc2VwYXJhdGUgcm93IGFuZCBlYWNoIHZhbHVlIGhhZCBpdHMgb3duIGNlbGwuIFRodXMgbm8gbW9yZSBkYXRhIG1hbmlwdWxhdGlvbiB3YXMgcmVxdWlyZWQgYXQgdGhpcyBzdGFnZS4gSSBtdXRhdGVkIHRoZSBkYXRhIGZyYW1lIHRvIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSB0b3RhbF9wcmljZSB3aGljaCB3YXMgYSBwcm9kdWN0IG9mIGNvc3QgYW5kIHF1YW50aXR5LiBJIHNjYW5uZWQgdGhlIGRhdGEgZm9yIG1pc3NpbmcgdmFsdWVzIGFuZCBpbmNvbnNpc3RlbmNpZXMgYW5kIG5vbmUgd2VyZSBmb3VuZC4gSSB0aGluayB1c2VkIGJveHBsb3RzIHRvIGNoZWNrIGZvciBvdXRsaWVycy4gSSB3YXMgb25seSBjb25jZXJuZWQgd2l0aCB0aGUgYm94IHBsb3RzIHdoaWNoIHNob3dlZCBhIHNtYWxsIG51bWJlciBvZiBvdXRsaWVycywgc2luY2UgdGhleSBhcmUgdG8gYmUgZXhjbHVkZWQuIFRoZSBvbmVzIHdpdGggYSBsYXJnZSBudW1iZXIgb2Ygb3V0bGllcnMgd2VyZSBsZWZ0IGFsb25lLiAgQmFzZWQgb24gdGhlIGJveHBsb3RzIG90aGVyIGhhcyA3IG91dGxpZXJzLCBudW1fYm9zcyBoYXMgNSBhbmQgbnVtX2JlbmRzIGhhcyA4IG91dGxpZXJzIGFuZCBiZW5kX3JhZGl1cy4gQWxsIHRoZSBvdGhlciB2YXJpYWJsZXMgaGF2ZSBmYXIgdG9vIG1hbnkgb3V0bGllcnMsIGFuZCB0aHVzIHRob3NlIGNhbm5vdCBiZSBleGNsdWRlZC4gV2UgY2FuIHJlbW92ZSB0aGVzZSBvdXRsaWVycyB1c2luZyB0aGUgY2FwcGluZyBtZXRob2QuIFRoaXMgcmVtb3ZlcyBvdXRsaWVycyBiZWxvdyB0aGUgNXRoIHBlcmNlbnRpbGUgYW5kIHRob3NlIGFib3ZlIHRoZSA5NXRoIHBlcmNlbnRpbGUuIFVwb24gb2JzZXJ2aW5nIHRoZSBib3hwbG90cyBmb3IgdGhlIHZhcmlhYmxlcy4gSSBvYnNlcnZlZCBzb21lIHNrZXduZXNzIGluIG51bV9iZW5kcyBhbmQgdGhlIGRpYW1ldGVyIHZhcmlhYmxlLiBUbyBjb25maXJtIHRoaXMgYSBoaXN0b2dyYW0gd2FzIGNyZWF0ZWQuIFRoZSBoaXN0b2dyYW0gc2hvd3MgcmlnaHQgc2tld25lc3MgaW4gYm90aCB2YXJpYWJsZXMuIFRodXMgd2UgcGVyZm9ybSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiB0byBtYWtlIHRoZSBkYXRhIHNldCBtb3JlIHN5bW1ldHJpY2FsIGluIG5hdHVyZS4NCg0KDQoNCiMjIERhdGEgDQoNCkEgY2xlYXIgZGVzY3JpcHRpb24gb2YgZGF0YSBzZXRzLCB0aGVpciBzb3VyY2VzLCBhbmQgdmFyaWFibGUgZGVzY3JpcHRpb25zIHNob3VsZCBiZSBwcm92aWRlZC4gSW4gdGhpcyBzZWN0aW9uLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIFIgY29kZXMgd2l0aCBvdXRwdXRzIChoZWFkIG9mIGRhdGEgc2V0cykgdGhhdCB5b3UgdXNlZCB0byBpbXBvcnQvcmVhZC9zY3JhcGUgdGhlIGRhdGEgc2V0LiBZb3UgbmVlZCB0byBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzEgYW5kIG1lcmdlIGF0IGxlYXN0IHR3byBkYXRhIHNldHMgdG8gY3JlYXRlIHRoZSBvbmUgeW91IGFyZSBnb2luZyB0byB3b3JrIG9uLiBJbiBhZGRpdGlvbiB0byB0aGUgUiBjb2RlcyBhbmQgb3V0cHV0cywgeW91IG5lZWQgdG8gZXhwbGFpbiB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4NCg0KVHdvIGRhdGEgc2V0cyB3ZXJlIHRha2VuIGZyb20gS2FnZ2xlLmNvbShodHRwczovL3d3dy5rYWdnbGUuY29tL2FyaW9uYWkvY2F0ZXJwaWxsYXItdHViZS1wcmljaW5nLWRhdGFzZXQjdHViZS5jc3YpLiBUaGVleSB3ZXJlIGluIENTViBmb3JtIGFuZCBJIHNhdmVkIHRoZW0gYXMgYW4gZXhjZWwgd29ya2Jvb2sgdGhlbiB1cGxvYWRlZCB0aGVtIHRvIFIuIEFuIGlubmVyIGpvaW4gd2FzIHVzZWQgdG8gam9pbiB0aGUgZGF0YSBzZXRzLiBUaGlzIGRhdGFzZXQgd2FzIHVzZWQgaW4gdGhlIENhdGVycGlsbGFyIFR1YmUgUHJpY2luZyBjb21wZXRpdGlvbiB0aGF0IHJhbiBiZXR3ZWVuIEp1biAyMDE1IGFuZCBTZXB0ZW1iZXIgMjAxNS4gV2UgYXJlIGRlYWxpbmcgd2l0aCB0d28gZmlsZXMgZnJvbSB0aGlzIHJlbGF0aW9uLiBUaGUgdHViZSBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHR1YmUgYXNzZW1ibGllcywgd2hpY2ggYXJlIHRoZSBwcmltYXJ5IGZvY3VzIG9mIHRoZSBjb21wZXRpdGlvbi4gVGhpcyBpbmNsdWRlcyBkaW1lc25pb25zIG9mIHRoZSB0dWJlLCBtYXRlcmlhbHMgdXNlZCBldGMuVGhlIHRyYWluIGZpbGUgaGFzIGluZm9ybWFpdG9uIHRoZSBzdXBwbGllcnMscHJpY2luZyBxdWFudGl0eSBldGMuIFRoZSBjb21iaW5lZCBkYXRhZnJhbWUgaGFzIGJlZW4gbmFtZWQgZGF0YXNldCBhbmQgaGFzIDI0IHZhcmlhYmxlcy4NCg0KDQoNCg0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQp0cmFpbiA8LSByZWFkX2V4Y2VsKCJ0cmFpbi54bHN4IikNCmxpYnJhcnkocmVhZHhsKQ0KdHViZSA8LSByZWFkX2V4Y2VsKCJ0dWJlLnhsc3giKQ0KZGF0YXNldCA8LSB0cmFpbiAlPiUgbGVmdF9qb2luKHR1YmUsIGJ5ID0gInR1YmVfYXNzZW1ibHlfaWQiKQ0KDQpgYGANCg0KIyMgVW5kZXJzdGFuZCANCg0KU3VtbWFyaXNlIHRoZSB0eXBlcyBvZiB2YXJpYWJsZXMgYW5kIGRhdGEgc3RydWN0dXJlcywgY2hlY2sgdGhlIGF0dHJpYnV0ZXMgaW4gdGhlIGRhdGEgYW5kIGFwcGx5IGRhdGEgdHlwZSBjb252ZXJzaW9ucy4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gYnJpZWZseSB0aGUgc3RlcHMgdGhhdCB5b3UgaGF2ZSB0YWtlbi4gSW4gdGhpcyBzZWN0aW9uLCBzaG93IHRoYXQgeW91IGhhdmUgZnVsZmlsbGVkIG1pbmltdW0gcmVxdWlyZW1lbnRzIDItNC4NCg0KVXBvbiBpbnNwZWN0aW9uIG9mIHRoZSBkYXRhIG1hbnkgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgaXMgcHJlc2VudCBzdWNoIGFzIGNoYXJhY3RlcnMsIG51bWJlcnMgYW5kIGRhdGUgZm9ybWF0LiBUaGUgYnJhY2tldF9wcmljaW5nIHdhcyBjb252ZXJ0ZWQgdG8gYSBmYWN0b3IgdmFyaWFibGUgd2l0aCAyIGxldmVscyAiWWVzIiBhbmQgIk5vIi4NCg0KYGBge3J9DQpzdHIoZGF0YXNldCkNCmRhdGFzZXQkYnJhY2tldF9wcmljaW5nPC1hcy5mYWN0b3IoZGF0YXNldCRicmFja2V0X3ByaWNpbmcpDQpsZXZlbHMoZGF0YXNldCRicmFja2V0X3ByaWNpbmcpDQphdHRyaWJ1dGVzKGRhdGFzZXQpDQpgYGANCg0KDQojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIEkgDQoNCkNoZWNrIGlmIHRoZSBkYXRhIGNvbmZvcm1zIHRoZSB0aWR5IGRhdGEgcHJpbmNpcGxlcy4gSWYgeW91ciBkYXRhIGlzIHVudGlkeSwgcmVzaGFwZSB5b3VyIGRhdGEgaW50byBhIHRpZHkgZm9ybWF0IChtaW5pbXVtIHJlcXVpcmVtZW50ICM1KS4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gZXZlcnl0aGluZyB0aGF0IHlvdSBkbyBpbiB0aGlzIHN0ZXAuDQoNCk5vIGNoYW5nZSBuZWVkcyB0byBiZSBtYWRlIGFzIHRoZSBkYXRhIGlzIGFscmVhZHkgdGlkeSBkdWUgdG8gMyBtYWluIHJlYXNvbnMuDQoNCkVhY2ggdmFyaWFibGUgaGFzIGl0cyBpdHMgb3duIGNvbHVtbg0KRWFjaCBvYnNlcnZhdGlvbiBoYXMgaXRzIG93biBzZXBlcmF0ZSByb3cNCkVhY2ggdmFsdWUgaGFzIGl0cyBvd24gY2VsbA0KDQpgYGB7cn0NCg0KYGBgDQoNCiMjCVRpZHkgJiBNYW5pcHVsYXRlIERhdGEgSUkgDQoNCkNyZWF0ZS9tdXRhdGUgYXQgbGVhc3Qgb25lIHZhcmlhYmxlIGZyb20gdGhlIGV4aXN0aW5nIHZhcmlhYmxlcyAobWluaW11bSByZXF1aXJlbWVudCAjNikuIEluIGFkZGl0aW9uIHRvIHRoZSBSIGNvZGVzIGFuZCBvdXRwdXRzLCBleHBsYWluIGV2ZXJ5dGhpbmcgdGhhdCB5b3UgZG8gaW4gdGhpcyBzdGVwLg0KDQpXZSBtdXRhdGUgdGhlIGRhdGFzZXQgYnkgYWRkaW5nIGEgbmV3IHZhcmlhYmxlIHdoaWNoIEkgaGF2ZSBuYW1lZCB0b3RhbF9wcmljZS4gSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSB1c2VmdWwgYXMgaXQgdGVsbHMgdGhlIHRoZSB0b3RhbCBwcmljZSBvZiBhbGwgdGhlIHR1YmVzIGZvciBlYWNoIG9yZGVyLiBUaGlzIGlzIGZvcm1lZCBieSBtdWx0aXBseWluZyBxdWFudGl0eSBhbmQgY29zdC4NCg0KYGBge3J9DQpkYXRhc2V0PC1tdXRhdGUoZGF0YXNldCwNCiAgICAgICB0b3RhbF9wcmljZSA9IHF1YW50aXR5KmNvc3QpDQpzdHIoZGF0YXNldCkNCmBgYA0KDQoNCiMjCVNjYW4gSSANCg0KU2NhbiB0aGUgZGF0YSBmb3IgbWlzc2luZyB2YWx1ZXMsIGluY29uc2lzdGVuY2llcyBhbmQgb2J2aW91cyBlcnJvcnMuIEluIHRoaXMgc3RlcCwgeW91IHNob3VsZCBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzcuIEluIGFkZGl0aW9uIHRvIHRoZSBSIGNvZGVzIGFuZCBvdXRwdXRzLCBleHBsYWluIGhvdyB5b3UgZGVhbHQgd2l0aCB0aGVzZSB2YWx1ZXMuDQoNClVwb24gc2Nhbm5pbmcgdGhlIHZhbHVlcyB3ZSBmaW5kIDAgbWlzc2luZyB2YWxpZXMuIFRodXMgbm8gZnVydGhlciBzdGVwcyBuZWVkIHRvIGJlIHRha2VuDQpgYGB7cn0NCmlzLm5hKGRhdGFzZXQpDQpjb2xTdW1zKGlzLm5hKGRhdGFzZXQpKQ0KDQpgYGANCg0KDQojIwlTY2FuIElJDQoNClNjYW4gdGhlIG51bWVyaWMgZGF0YSBmb3Igb3V0bGllcnMuIEluIHRoaXMgc3RlcCwgeW91IHNob3VsZCBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzguIEluIGFkZGl0aW9uIHRvIHRoZSBSIGNvZGVzIGFuZCBvdXRwdXRzLCBleHBsYWluIGhvdyB5b3UgZGVhbHQgd2l0aCB0aGVzZSB2YWx1ZXMuDQoNCkZpcnN0IEkgcGxvdHRlZCBib3ggcGxvdCBmb3IgYWxsIHRoZSBudW1lcmljIHZhcmlhYmxlcyB0byBjaGVjayBmb3Igb3V0bGllcnMuIFNvbWUgYXV0aG9ycyByZWNvbWVubmQgdGhhdCB3aGVuIHRoZXJlIGFyZSBvdXRsaWVycyB0aGF0IGFyZSBzbWFsbCBpbiBudW1iZXJzIHRoZW4gdGhleSBjYW4gYmUgZXhjbHVkZWQuIEJhc2VkIG9uIHRoZSBib3hwbG90cyBvdGhlciBoYXMgNyBvdXRsaWVycywgbnVtX2Jvc3MgaGFzIDUgYW5kIG51bV9iZW5kcyBoYXMgOCBvdXRsaWVycyBhbmQgYmVuZF9yYWRpdXMuIEFsbCB0aGUgb3RoZXIgdmFyaWFibGVzIGhhdmUgZmFyIHRvbyBtYW55IG91dGxpZXJzLCBhbmQgdGh1cyB0aG9zZSBjYW5ub3QgYmUgZXhjbHVkZWQuIFdlIGNhbiByZW1vdmUgdGhlc2Ugb3V0bGllcnMgdXNpbmcgdGhlIGNhcHBpbmcgbWV0aG9kLiBUaGlzIHJlbW92ZXMgb3V0bGllcnMgYmVsb3cgdGhlIDV0aCBwZXJjZW50aWxlIGFuZCB0aG9zZSBhYm92ZSB0aGUgOTV0aCBwZXJjZW50aWxlDQoNCg0KDQpgYGB7cn0NCmRhdGFzZXQkYW5udWFsX3VzYWdlICU+JSBib3hwbG90KCkNCmRhdGFzZXQkbWluX29yZGVyX3F1YW50aXR5ICU+JSBib3hwbG90KCkNCmRhdGFzZXQkcXVhbnRpdHkgJT4lIGJveHBsb3QoKQ0KZGF0YXNldCRjb3N0ICU+JSBib3hwbG90KCkNCmRhdGFzZXQkZGlhbWV0ZXIgJT4lIGJveHBsb3QoKQ0KZGF0YXNldCR3YWxsICU+JSBib3hwbG90KCkNCmRhdGFzZXQkbGVuZ3RoICU+JSBib3hwbG90KCkNCmRhdGFzZXQkbnVtX2JlbmRzICU+JSBib3hwbG90KCkNCmRhdGFzZXQkYmVuZF9yYWRpdXMgJT4lIGJveHBsb3QoKQ0KZGF0YXNldCRudW1fYm9zcyAlPiUgYm94cGxvdCgpDQpkYXRhc2V0JG90aGVyICU+JSBib3hwbG90KCkNCmRhdGFzZXQkdG90YWxfcHJpY2UgJT4lIGJveHBsb3QoKQ0KYGBgDQpgYGB7cn0NCmFwIDwtIGZ1bmN0aW9uKHgpew0KICBxdWFudGlsZXMgPC0gcXVhbnRpbGUoIHgsIGMoLjA1LCAwLjI1LCAwLjc1LCAuOTUgKSApDQogIHhbIHggPCBxdWFudGlsZXNbMl0gLSAxLjUqSVFSKHgpIF0gPC0gcXVhbnRpbGVzWzFdDQogIHhbIHggPiBxdWFudGlsZXNbM10gKyAxLjUqSVFSKHgpIF0gPC0gcXVhbnRpbGVzWzRdDQogIHgNCn0NCg0KZGF0YXNldCRvdGhlciA8LSBkYXRhc2V0JG90aGVyICU+JSBjYXAoKQ0KZGF0YXNldCRudW1fYm9zcyA8LSBkYXRhc2V0JG51bV9ib3NzICU+JSBjYXAoKQ0KZGF0YXNldCRudW1fYmVuZHMgPC0gZGF0YXNldCRudW1fYmVuZHMgJT4lIGNhcCgpDQpkYXRhc2V0JGJlbmRfcmFkaXVzIDwtIGRhdGFzZXQkYmVuZF9yYWRpdXMgJT4lIGNhcA0KDQpkYXRhc2V0JG90aGVyICU+JSBib3hwbG90KCkNCmRhdGFzZXQkbnVtX2Jvc3MgJT4lIGJveHBsb3QoKQ0KZGF0YXNldCRudW1fYmVuZHMgJT4lIGJveHBsb3QoKQ0KZGF0YXNldCRiZW5kX3JhZGl1cyAlPiUgYm94cGxvdCgpDQoNCg0KDQpgYGANCg0KDQojIwlUcmFuc2Zvcm0gDQoNCkFwcGx5IGFuIGFwcHJvcHJpYXRlIHRyYW5zZm9ybWF0aW9uIGZvciBhdCBsZWFzdCBvbmUgb2YgdGhlIHZhcmlhYmxlcy4gSW4gYWRkaXRpb24gdG8gdGhlIFIgY29kZXMgYW5kIG91dHB1dHMsIGV4cGxhaW4gZXZlcnl0aGluZyB0aGF0IHlvdSBkbyBpbiB0aGlzIHN0ZXAuIEluIHRoaXMgc3RlcCwgeW91IHNob3VsZCBmdWxmaWwgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQgIzkuDQoNCkluIHRoZSBsYXN0IHF1ZXN0aW9uIHdlIG9ic2VydmVkIHRoZSBib3hwbG90cyBmb3IgdGhlIHZhcmlhYmxlcy4gSSBvYnNlcnZlZCBzb21lIHNrZXduZXNzIGluIG51bV9iZW5kcyBhbmQgdGhlIGRpYW1ldGVyIHZhcmlhYmxlLiBUbyBjb25maXJtIHRoaXMgYSBoaXN0b2dyYW0gd2FzIGNyZWF0ZWQuIFRoZSBoaXN0b2dyYW0gc2hvd3MgcmlnaHQgc2tld25lc3MgaW4gYm90aCB2YXJpYWJsZXMuIFRodXMgd2UgcGVyZm9ybSBsb2dhcml0aG1pYyB0cmFuc2Zvcm1hdGlvbiB0byBtYWtlIHRoZSBkYXRhIHNldCBtb3JlIHN5bWV0dHJpY2FsIGluIG5hdHVyZS4NCmBgYHtyfQ0KaGlzdChkYXRhc2V0JGRpYW1ldGVyKQ0KaGlzdChkYXRhc2V0JG51bV9iZW5kcykNCg0KYGBgDQoNCmBgYHtyfQ0KZGF0YXNldCRkaWFtZXRlciA8LSBsb2cxMChkYXRhc2V0JGRpYW1ldGVyKQ0KZGF0YXNldCRudW1fYmVuZHMgPC0gbG9nMTAoZGF0YXNldCRudW1fYmVuZHMpDQpoaXN0KGRhdGFzZXQkZGlhbWV0ZXIpDQpoaXN0KGRhdGFzZXQkbnVtX2JlbmRzKQ0KDQoNCmBgYA0KDQpOT1RFOiBGb2xsb3cgdGhlIG9yZGVyIG91dGxpbmVkIGFib3ZlIGluIHRoZSByZXBvcnQuIE1ha2Ugc3VyZSB5b3VyIGNvZGUgaXMgdmlzaWJsZSAod2l0aGluIHRoZSBtYXJnaW4gb2YgdGhlIHBhZ2UpLiBEbyBub3QgdXNlIFZpZXcoKSB0byBzaG93IHlvdXIgZGF0YSBpbnN0ZWFkIGdpdmUgaGVhZGVycyAodXNpbmcgaGVhZCgpICkNCg0KDQpBbnkgZnVydGhlciBvciBvcHRpb25hbCBwcmUtcHJvY2Vzc2luZyB0YXNrcyBjYW4gYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIHVzaW5nIGFuIGFkZGl0aW9uYWwgc2VjdGlvbiBpbiB0aGUgUiBNYXJrZG93biBmaWxlLiBQbGVhc2UgYWxzbyBwcm92aWRlIHRoZSBSIGNvZGVzLCBvdXRwdXRzIGFuZCBicmllZiBleHBsYW5hdGlvbnMgb24gd2h5IGFuZCBob3cgeW91IGFwcGxpZWQgdGhlc2UgdGFza3Mgb24gdGhlIGRhdGEuDQoNCjxicj4NCjxicj4NCg==