PENDAHULUAN

Latar Belakang

Gaya hidup masyarakat urban tak lepas dari kemajuan teknologi dan perkembangan pola pikir. Taraf hidup masyarakat dituntut untuk lebih maju dan kebutuhan untuk memenuhi kebutuhan hidup yang semakin hari semakin besar menjadi hal yang tak terhindarkan. Dewasa ini muncul berbagai pusat perbelanjaan yang menjadi bagian dari gerak perkembangan kota metropolitan. Salah satunya brand internasional, BigMart yang telah muncul di berbagai negara. BigMart adalah sebuah perusahaan yang bergerak di bidang retail business franchise dalam bentuk supermarket atau grocery store. Seperti toko-toko pada umumnya, BigMart juga menjual produk-produk untuk memenuhi kebutuhan masyarakat di sekitarnya. Kebutuhan produk pada lingkungan yang satu bisa jadi berbeda di lingkungan lainnya, dimana karakteristik masyarakat juga berbeda. Sebagai contoh, toko yang berada di tipe Kota 1 (Tier 1) akan mempunyai pendapatan penjualan yang lebih tinggi dibandingkan toko di lokasi lainnya karena pendapatan masyarakat di Kota 1 juga lebih tinggi, atau contoh yang lain toko yang mempunyai kapasitas penyimpanan yang lebih besar akan memiliki pendapatan penjualan yang lebih tinggi karena masyarakat lebih memilih toko dengan kapasitas gudang yang besar agar mampu membeli segala jenis barang yang dibutuhkan dalam satu tempat.Sehingga dalam analisis ini akan mendapatkan model guna mengetahu penjualan produk di suato toko tertentu (berdasarkan karakteristik toko tersebut). Sehingga diharapkan dapat meningkatkan penjualan untuk setiap toko.

Data yang digunakan merupakan data yang di peroleh dari analyticsvidhya.com Data terdiri data traning dan data testing yang memiliki missing value

# Load packages
library(readxl)
library(dplyr)
library(reshape2)
library(lubridate)
library(tidyr)
library(stringr)
library(ggplot2)
library(corrplot)
library(dummies)
library(shinyjqui)
library(gridExtra)

Sebelum melakukan analisis lebih lanjut, maka perlu adanya imputasi data. DIkarenakan pada analsiis kali ini ingin memprediksi seberapa cocok model yang akan digunakan, maka dari itu perlu melibatkan kedua data (traning & testing)

# The data consist of Train & Test Data Set
train<-read_excel("train.xlsx")
test<-read_excel("test.xlsx")

RANCANGAN ANALISIS

Langkah-langkah analisis yang akan di lakukan : -1. Statistika Deskriptif -2. Preprocessing Data (Missing value & Transformasi) -3. Melakukan Analsiis Regresi (karena data yang digunakan terdiri dari variabel prediktor kategorik dan numerik dan respon yang numerik ) -4. Mengetahui pemodelan terbaik dalam memprediksi keuntungan yang akan di peroleh()

STATISTIKA DESKRIPTIF

Sebelum melakukan analisis data lebih lanjut. Maka perlu mengetahui karakteristik data yang akan diamati. Oleh karena itu statistika deskrif perlu untuk dilakukan.

Traning

summary(train)
 Item_Identifier     Item_Weight     Item_Fat_Content   Item_Visibility    Item_Type        
 Length:8523        Min.   : 4.555   Length:8523        Min.   :0.00000   Length:8523       
 Class :character   1st Qu.: 8.774   Class :character   1st Qu.:0.02699   Class :character  
 Mode  :character   Median :12.600   Mode  :character   Median :0.05393   Mode  :character  
                    Mean   :12.858                      Mean   :0.06613                     
                    3rd Qu.:16.850                      3rd Qu.:0.09459                     
                    Max.   :21.350                      Max.   :0.32839                     
                    NA's   :1463                                                            
    Item_MRP         Outlet_Identifier  Outlet_Establishment_Year Outlet_Size       
 Min.   :     31.3   Length:8523        Min.   :1985              Length:8523       
 1st Qu.: 452731.0   Class :character   1st Qu.:1987              Class :character  
 Median :1147176.0   Mode  :character   Median :1999              Mode  :character  
 Mean   :1154899.1                      Mean   :1998                                
 3rd Qu.:1750225.0                      3rd Qu.:2004                                
 Max.   :2668884.0                      Max.   :2009                                
                                                                                    
 Outlet_Location_Type Outlet_Type        Item_Outlet_Sales 
 Length:8523          Length:8523        Min.   :   33.29  
 Class :character     Class :character   1st Qu.:  834.25  
 Mode  :character     Mode  :character   Median : 1794.33  
                                         Mean   : 2181.29  
                                         3rd Qu.: 3101.30  
                                         Max.   :13086.97  
                                                           

Testing

summary(test)
 Item_Identifier     Item_Weight     Item_Fat_Content   Item_Visibility    Item_Type        
 Length:5681        Min.   : 4.555   Length:5681        Min.   :0.00000   Length:5681       
 Class :character   1st Qu.: 8.645   Class :character   1st Qu.:0.02705   Class :character  
 Mode  :character   Median :12.500   Mode  :character   Median :0.05415   Mode  :character  
                    Mean   :12.696                      Mean   :0.06568                     
                    3rd Qu.:16.700                      3rd Qu.:0.09346                     
                    Max.   :21.350                      Max.   :0.32364                     
                    NA's   :976                                                             
    Item_MRP      Outlet_Identifier  Outlet_Establishment_Year Outlet_Size       
 Min.   : 31.99   Length:5681        Min.   :1985              Length:5681       
 1st Qu.: 94.41   Class :character   1st Qu.:1987              Class :character  
 Median :141.42   Mode  :character   Median :1999              Mode  :character  
 Mean   :141.02                      Mean   :1998                                
 3rd Qu.:186.03                      3rd Qu.:2004                                
 Max.   :266.59                      Max.   :2009                                
                                                                                 
 Outlet_Location_Type Outlet_Type       
 Length:5681          Length:5681       
 Class :character     Class :character  
 Mode  :character     Mode  :character  
                                        
                                        
                                        
                                        

Dapat diketahui variabel respon tidak normal dan butuh di transformasi. Dan terdapat dua variabel yang terdapat missing value.

VISUALISAI DATA

Dikarenakan data yang digunakan beragam, maka dari itu untuk visualisai dilakukan berdasarkan tipe datanya.

Kategorik

aa

Numerik

aa

PREPROCESSING

Sebelum melakukan analisis lebih lanjut. Maka perlu adanya proses preprocessing guna data yang akan digunakan dapat memberikan interpretasi yang baik

Deteksi Missing

library(VIM)
aggr(train, 
    col=c('navyblue','tomato'), 
    numbers=TRUE, 
    sortVars=TRUE, 
    labels=names(train), 
    cex.axis=.7, 
    gap=3, 
    ylab=c("Histogram of missing data","Pattern"))

 Variables sorted by number of missings: 
                  Variable     Count
               Outlet_Size 0.2827643
               Item_Weight 0.1716532
           Item_Identifier 0.0000000
          Item_Fat_Content 0.0000000
           Item_Visibility 0.0000000
                 Item_Type 0.0000000
                  Item_MRP 0.0000000
         Outlet_Identifier 0.0000000
 Outlet_Establishment_Year 0.0000000
      Outlet_Location_Type 0.0000000
               Outlet_Type 0.0000000
         Item_Outlet_Sales 0.0000000

library(mice)
md.pattern(train)
     Item_Identifier Item_Fat_Content Item_Visibility Item_Type Item_MRP Outlet_Identifier
4650               1                1               1         1        1                 1
2410               1                1               1         1        1                 1
1463               1                1               1         1        1                 1
                   0                0               0         0        0                 0
     Outlet_Establishment_Year Outlet_Location_Type Outlet_Type Item_Outlet_Sales
4650                         1                    1           1                 1
2410                         1                    1           1                 1
1463                         1                    1           1                 1
                             0                    0           0                 0
     Item_Weight Outlet_Size     
4650           1           1    0
2410           1           0    1
1463           0           1    1
            1463        2410 3873

Imputasi Missing

Terdapat missing value pada variabel numerik dan kategorik. Pada analisis kali ini, pengimputan yang dilakukan yaitu menggunakan imputasi median untuk variabel numerik yang missing. Dan Modus untuk variabel kategorik yang missing.Berikut cara menginputkannya.

# Imputasi untuk Variabel Numerik
combi$Item_Weight[is.na(combi$Item_Weight)] <- median(combi$Item_Weight, na.rm = TRUE)
table(is.na(combi$Item_Weight))

FALSE 
14204 
combi$Item_Visibility <- ifelse(combi$Item_Visibility == 0,
                                median(combi$Item_Visibility), combi$Item_Visibility)
# Imputasi untuk Variabel Kategorik
table(combi$Outlet_Size)

  High Medium  Small 
  1553   4655   3980 
miss<-unique(combi$Outlet_Size[!is.na(combi$Outlet_Size)])
mode<-miss[which.max(tabulate(match(combi$Outlet_Size,miss)))]
miss_imp<-combi$Outlet_Size
combi$Outlet_Size[is.na(miss_imp)]<-mode

Identifikasi

melakukan identifikasi terhadap variable Item Identifier. Hal ini dikarenakan, pada variabel tersebut berupa kode (DR, FD dan NC). Maka variabel dapat di kelompokkan menjadi variabel dengan 3 kelomok.

combi <-
  combi %>%
  mutate(Item_Identifier_Str3 = substr(Item_Identifier,1,3), #First three letter of Item_Identifier.
         Item_Identifier_Str2 = substr(Item_Identifier,1,2), #First second letter of Item_Identifier.
         Item_Identifier_Num=as.numeric(substr(Item_Identifier,4,6)), # Number part of Item_Identifier column.
         Outlet_Age=2013-Outlet_Establishment_Year, #Outlet Age
         PK=row_number())
#table(combi$Item_Identifier_Str3)
table(combi$Item_Identifier_Str2)

   DR    FD    NC 
 1317 10201  2686 

Melakukan Identifikasi terhadap Data (Kembali)

new_train <- combi %>%
  filter(Item_Outlet_Sales != -999)
new_test <- combi %>%
  filter(Item_Outlet_Sales == -999)
new_combi <- rbind(new_train, new_test)
#glimpse(new_combi)
new_combi1<-dummy1
new_combi1<-select(new_combi1, -c(Item_Identifier, Outlet_Identifier, Item_Fat_Content,Outlet_Establishment_Year, Item_Type, Item_Identifier_Str3, PK))
new_combi2<-new_combi1
new_combi2<-within(new_combi2, Outlet_Size <- factor(Outlet_Size, labels = c(1:3)))
#str(new_combi1)
pred_train <- new_combi2 %>%
  filter(Item_Outlet_Sales != -999)
pred_test <- new_combi2 %>%
  filter(Item_Outlet_Sales == -999)
#dim(pred_train)
#dim(pred_test)

Split Data

Hal ini dilakukan untuk memperoleh nilai akurasi data train terhadap testing.

new_train <- select(new_train, -c(Item_Identifier, Item_Identifier_Str3, Outlet_Establishment_Year, PK))
set.seed(1)
n <- nrow(new_train)
shuffled <- new_train[sample(n),]
glimpse(new_train)
Observations: 8,523
Variables: 13
$ Item_Weight          <dbl> 9.300, 5.920, 17.500, 19.200, 8.930, 10.395, 13.650, 12.600...
$ Item_Fat_Content     <chr> "Low Fat", "Regular", "Low Fat", "Regular", "Low Fat", "Reg...
$ Item_Visibility      <dbl> 0.016047301, 0.019278216, 0.016760075, 0.054020536, 0.05402...
$ Item_Type            <chr> "Dairy", "Soft Drinks", "Meat", "Fruits and Vegetables", "H...
$ Item_MRP             <dbl> 2498092, 482692, 141618, 182095, 538614, 514008, 576588, 10...
$ Outlet_Identifier    <chr> "OUT049", "OUT018", "OUT049", "OUT010", "OUT013", "OUT018",...
$ Outlet_Size          <chr> "Medium", "Medium", "Medium", "Medium", "High", "Medium", "...
$ Outlet_Location_Type <chr> "Tier 1", "Tier 3", "Tier 1", "Tier 3", "Tier 3", "Tier 3",...
$ Outlet_Type          <chr> "Supermarket Type1", "Supermarket Type2", "Supermarket Type...
$ Item_Outlet_Sales    <dbl> 3735.1380, 443.4228, 2097.2700, 732.3800, 994.7052, 556.608...
$ Item_Identifier_Str2 <chr> "FD", "DR", "FD", "FD", "NC", "FD", "FD", "FD", "FD", "FD",...
$ Item_Identifier_Num  <dbl> 15, 1, 15, 7, 19, 36, 10, 10, 17, 28, 7, 3, 32, 46, 32, 49,...
$ Outlet_Age           <dbl> 14, 4, 14, 15, 26, 4, 26, 28, 11, 6, 14, 16, 14, 16, 26, 16...
#split train data again:
train_indices <- 1:round(0.7*n)
test_indices <- (round(0.7*n)+1):n
splitted_train_simple <- shuffled[train_indices,]
splitted_test_simple <- shuffled[test_indices,]

REGRESI LINIER (DUMMY)

Model Simpel

linear_model_simple <- lm(Item_Outlet_Sales ~ ., data = splitted_train_simple)
summary(linear_model_simple)

Call:
lm(formula = Item_Outlet_Sales ~ ., data = splitted_train_simple)

Residuals:
    Min      1Q  Median      3Q     Max 
-3472.1  -891.7  -252.7   649.2  8288.7 

Coefficients: (9 not defined because of singularities)
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                    -9.838e+02  1.954e+02  -5.035 4.92e-07 ***
Item_Weight                    -4.121e+00  4.086e+00  -1.009  0.31325    
Item_Fat_ContentRegular        -5.726e+00  4.026e+01  -0.142  0.88690    
Item_Visibility                -6.477e+02  3.744e+02  -1.730  0.08366 .  
Item_TypeBreads                 2.448e+01  1.196e+02   0.205  0.83783    
Item_TypeBreakfast              3.227e+02  1.583e+02   2.039  0.04149 *  
Item_TypeCanned                 1.832e+02  9.058e+01   2.022  0.04317 *  
Item_TypeDairy                  1.721e+02  9.365e+01   1.837  0.06623 .  
Item_TypeFrozen Foods           8.363e+01  8.461e+01   0.988  0.32298    
Item_TypeFruits and Vegetables  1.819e+02  7.887e+01   2.306  0.02113 *  
Item_TypeHard Drinks            3.478e+02  2.016e+02   1.725  0.08460 .  
Item_TypeHealth and Hygiene     3.021e+02  1.840e+02   1.642  0.10070    
Item_TypeHousehold              4.438e+02  1.782e+02   2.490  0.01278 *  
Item_TypeMeat                   1.743e+02  1.035e+02   1.683  0.09233 .  
Item_TypeOthers                 5.501e+02  2.095e+02   2.625  0.00868 ** 
Item_TypeSeafood                3.240e+02  2.041e+02   1.587  0.11257    
Item_TypeSnack Foods            1.751e+02  7.878e+01   2.223  0.02627 *  
Item_TypeSoft Drinks            2.639e+02  1.864e+02   1.416  0.15689    
Item_TypeStarchy Foods          1.457e+02  1.502e+02   0.970  0.33196    
Item_MRP                        8.722e-04  2.297e-05  37.976  < 2e-16 ***
Outlet_IdentifierOUT013         1.900e+03  8.753e+01  21.705  < 2e-16 ***
Outlet_IdentifierOUT017         1.940e+03  8.723e+01  22.238  < 2e-16 ***
Outlet_IdentifierOUT018         1.605e+03  8.768e+01  18.302  < 2e-16 ***
Outlet_IdentifierOUT019         3.574e+00  9.832e+01   0.036  0.97100    
Outlet_IdentifierOUT027         3.275e+03  8.750e+01  37.429  < 2e-16 ***
Outlet_IdentifierOUT035         2.038e+03  8.773e+01  23.230  < 2e-16 ***
Outlet_IdentifierOUT045         1.842e+03  8.725e+01  21.105  < 2e-16 ***
Outlet_IdentifierOUT046         1.896e+03  8.714e+01  21.763  < 2e-16 ***
Outlet_IdentifierOUT049         1.932e+03  8.692e+01  22.222  < 2e-16 ***
Outlet_SizeMedium                      NA         NA      NA       NA    
Outlet_SizeSmall                       NA         NA      NA       NA    
Outlet_Location_TypeTier 2             NA         NA      NA       NA    
Outlet_Location_TypeTier 3             NA         NA      NA       NA    
Outlet_TypeSupermarket Type1           NA         NA      NA       NA    
Outlet_TypeSupermarket Type2           NA         NA      NA       NA    
Outlet_TypeSupermarket Type3           NA         NA      NA       NA    
Item_Identifier_Str2FD          2.649e+02  1.590e+02   1.666  0.09585 .  
Item_Identifier_Str2NC                 NA         NA      NA       NA    
Item_Identifier_Num             1.720e+00  1.012e+00   1.699  0.08932 .  
Outlet_Age                             NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1328 on 5935 degrees of freedom
Multiple R-squared:  0.391, Adjusted R-squared:  0.3879 
F-statistic:   127 on 30 and 5935 DF,  p-value: < 2.2e-16

Model Log

linear_model_log1<- lm(log10(Item_Outlet_Sales) ~ ., data = splitted_train_simple)
summary(linear_model_log1)

Call:
lm(formula = log10(Item_Outlet_Sales) ~ ., data = splitted_train_simple)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.17970 -0.16692  0.01604  0.18176  0.92175 

Coefficients: (9 not defined because of singularities)
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                     2.101e+00  4.184e-02  50.205  < 2e-16 ***
Item_Weight                    -6.646e-04  8.750e-04  -0.760  0.44754    
Item_Fat_ContentRegular        -1.775e-03  8.621e-03  -0.206  0.83686    
Item_Visibility                -1.154e-01  8.017e-02  -1.439  0.15016    
Item_TypeBreads                 3.295e-02  2.561e-02   1.286  0.19843    
Item_TypeBreakfast              3.542e-02  3.389e-02   1.045  0.29602    
Item_TypeCanned                 3.657e-02  1.940e-02   1.885  0.05943 .  
Item_TypeDairy                  1.637e-02  2.006e-02   0.816  0.41453    
Item_TypeFrozen Foods          -2.218e-03  1.812e-02  -0.122  0.90257    
Item_TypeFruits and Vegetables  3.029e-02  1.689e-02   1.793  0.07295 .  
Item_TypeHard Drinks            5.434e-02  4.317e-02   1.259  0.20821    
Item_TypeHealth and Hygiene     6.366e-02  3.941e-02   1.615  0.10628    
Item_TypeHousehold              8.807e-02  3.816e-02   2.308  0.02105 *  
Item_TypeMeat                   4.011e-02  2.217e-02   1.809  0.07048 .  
Item_TypeOthers                 1.263e-01  4.487e-02   2.816  0.00488 ** 
Item_TypeSeafood                5.207e-02  4.372e-02   1.191  0.23366    
Item_TypeSnack Foods            4.492e-02  1.687e-02   2.663  0.00778 ** 
Item_TypeSoft Drinks            3.897e-02  3.992e-02   0.976  0.32899    
Item_TypeStarchy Foods          1.480e-02  3.217e-02   0.460  0.64551    
Item_MRP                        2.021e-07  4.918e-09  41.090  < 2e-16 ***
Outlet_IdentifierOUT013         8.485e-01  1.874e-02  45.264  < 2e-16 ***
Outlet_IdentifierOUT017         8.696e-01  1.868e-02  46.552  < 2e-16 ***
Outlet_IdentifierOUT018         7.808e-01  1.878e-02  41.584  < 2e-16 ***
Outlet_IdentifierOUT019         3.133e-02  2.105e-02   1.488  0.13682    
Outlet_IdentifierOUT027         1.078e+00  1.874e-02  57.524  < 2e-16 ***
Outlet_IdentifierOUT035         8.886e-01  1.879e-02  47.297  < 2e-16 ***
Outlet_IdentifierOUT045         8.439e-01  1.869e-02  45.166  < 2e-16 ***
Outlet_IdentifierOUT046         8.565e-01  1.866e-02  45.897  < 2e-16 ***
Outlet_IdentifierOUT049         8.651e-01  1.861e-02  46.477  < 2e-16 ***
Outlet_SizeMedium                      NA         NA      NA       NA    
Outlet_SizeSmall                       NA         NA      NA       NA    
Outlet_Location_TypeTier 2             NA         NA      NA       NA    
Outlet_Location_TypeTier 3             NA         NA      NA       NA    
Outlet_TypeSupermarket Type1           NA         NA      NA       NA    
Outlet_TypeSupermarket Type2           NA         NA      NA       NA    
Outlet_TypeSupermarket Type3           NA         NA      NA       NA    
Item_Identifier_Str2FD          5.155e-02  3.406e-02   1.514  0.13019    
Item_Identifier_Str2NC                 NA         NA      NA       NA    
Item_Identifier_Num             1.592e-04  2.167e-04   0.735  0.46265    
Outlet_Age                             NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2843 on 5935 degrees of freedom
Multiple R-squared:  0.5821,    Adjusted R-squared:  0.5799 
F-statistic: 275.5 on 30 and 5935 DF,  p-value: < 2.2e-16

Model Sqrt

linear_model_sqrt <- lm(sqrt(Item_Outlet_Sales) ~ ., data = splitted_train_simple)
summary(linear_model_sqrt)

Call:
lm(formula = sqrt(Item_Outlet_Sales) ~ ., data = splitted_train_simple)

Residuals:
    Min      1Q  Median      3Q     Max 
-37.720  -8.810  -1.221   7.934  56.025 

Coefficients: (9 not defined because of singularities)
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                     2.999e+00  1.930e+00   1.554  0.12018    
Item_Weight                    -3.424e-02  4.035e-02  -0.848  0.39619    
Item_Fat_ContentRegular         6.258e-03  3.976e-01   0.016  0.98744    
Item_Visibility                -6.140e+00  3.697e+00  -1.661  0.09685 .  
Item_TypeBreads                 8.429e-01  1.181e+00   0.714  0.47556    
Item_TypeBreakfast              2.648e+00  1.563e+00   1.694  0.09025 .  
Item_TypeCanned                 1.899e+00  8.946e-01   2.123  0.03382 *  
Item_TypeDairy                  1.381e+00  9.249e-01   1.493  0.13540    
Item_TypeFrozen Foods           5.087e-01  8.357e-01   0.609  0.54271    
Item_TypeFruits and Vegetables  1.714e+00  7.790e-01   2.200  0.02785 *  
Item_TypeHard Drinks            3.463e+00  1.991e+00   1.739  0.08208 .  
Item_TypeHealth and Hygiene     3.215e+00  1.817e+00   1.769  0.07699 .  
Item_TypeHousehold              4.608e+00  1.760e+00   2.618  0.00886 ** 
Item_TypeMeat                   1.867e+00  1.022e+00   1.826  0.06791 .  
Item_TypeOthers                 6.126e+00  2.070e+00   2.960  0.00309 ** 
Item_TypeSeafood                3.114e+00  2.016e+00   1.544  0.12252    
Item_TypeSnack Foods            2.022e+00  7.780e-01   2.599  0.00936 ** 
Item_TypeSoft Drinks            2.412e+00  1.841e+00   1.310  0.19024    
Item_TypeStarchy Foods          1.158e+00  1.484e+00   0.780  0.43526    
Item_MRP                        9.298e-06  2.268e-07  40.991  < 2e-16 ***
Outlet_IdentifierOUT013         2.766e+01  8.645e-01  31.993  < 2e-16 ***
Outlet_IdentifierOUT017         2.830e+01  8.615e-01  32.849  < 2e-16 ***
Outlet_IdentifierOUT018         2.446e+01  8.660e-01  28.243  < 2e-16 ***
Outlet_IdentifierOUT019         4.152e-01  9.710e-01   0.428  0.66896    
Outlet_IdentifierOUT027         4.033e+01  8.642e-01  46.672  < 2e-16 ***
Outlet_IdentifierOUT035         2.930e+01  8.665e-01  33.814  < 2e-16 ***
Outlet_IdentifierOUT045         2.714e+01  8.618e-01  31.495  < 2e-16 ***
Outlet_IdentifierOUT046         2.776e+01  8.606e-01  32.254  < 2e-16 ***
Outlet_IdentifierOUT049         2.816e+01  8.585e-01  32.803  < 2e-16 ***
Outlet_SizeMedium                      NA         NA      NA       NA    
Outlet_SizeSmall                       NA         NA      NA       NA    
Outlet_Location_TypeTier 2             NA         NA      NA       NA    
Outlet_Location_TypeTier 3             NA         NA      NA       NA    
Outlet_TypeSupermarket Type1           NA         NA      NA       NA    
Outlet_TypeSupermarket Type2           NA         NA      NA       NA    
Outlet_TypeSupermarket Type3           NA         NA      NA       NA    
Item_Identifier_Str2FD          2.697e+00  1.571e+00   1.717  0.08605 .  
Item_Identifier_Str2NC                 NA         NA      NA       NA    
Item_Identifier_Num             1.477e-02  9.996e-03   1.478  0.13944    
Outlet_Age                             NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 13.11 on 5935 degrees of freedom
Multiple R-squared:  0.4859,    Adjusted R-squared:  0.4833 
F-statistic:   187 on 30 and 5935 DF,  p-value: < 2.2e-16

a

ACCURACY

Untuk melihat akurasi dari setiap model maka perlu dilakukan perhitunagn terhadap MAE dan RMSE. Jika dari kedua nilai tersebut cukup kecil dibandingkan dengan model lainnya, maka dapat dikatakan pemodelan tersebutlah yang paling baik. Untuk perhitungannya sebagai berikut.

MAE <- function(actual, predicted){mean(abs(actual - predicted))}
RMSE <- function(actual, predicted) {sqrt(mean((actual - predicted)^2))}

Model Simpel

# MAE of Simple for test
model1_mae_simple <- MAE(splitted_test_simple$Item_Outlet_Sales, pred_simple_test)
# RMSE of Simple for test dataset
model1_rmse_simple_test <-(RMSE(splitted_test_simple$Item_Outlet_Sales, pred_simple_test))
# RMSE of Simple for train dataset
model1_rmse_simple_train <-(RMSE(splitted_train_simple$Item_Outlet_Sales, pred_simple_train))
# RMSE of Simple for train/test
model1_rmse_ratio <- (RMSE(splitted_train_simple$Item_Outlet_Sales, pred_simple_train))/(RMSE(splitted_test_simple$Item_Outlet_Sales, pred_simple_test))
model1_simple <- data.frame(model1_mae_simple,model1_rmse_simple_test,model1_rmse_simple_train,model1_rmse_ratio) 
model1_simple
  model1_mae_simple model1_rmse_simple_test model1_rmse_simple_train model1_rmse_ratio
1          1008.209                1341.607                 1324.209         0.9870322

Model Log

# MAE of Log for test
model1_mae_log <- (MAE(splitted_test_simple$Item_Outlet_Sales, pred_log_test))
# RMSE of Log for test dataset
model1_rmse_log_test <- (RMSE(splitted_test_simple$Item_Outlet_Sales, pred_log_test))
# RMSE of Log for train dataset
model1_rmse_log_train <- (RMSE(splitted_train_simple$Item_Outlet_Sales, pred_log_train))
# RMSE of Log for train/test
model1_rmse_log_ratio <- (RMSE(splitted_train_simple$Item_Outlet_Sales, pred_log_train))/(RMSE(splitted_test_simple$Item_Outlet_Sales, pred_log_test))
model1_log <- data.frame(model1_mae_log,model1_rmse_log_test,model1_rmse_log_train,model1_rmse_log_ratio)
model1_log
  model1_mae_log model1_rmse_log_test model1_rmse_log_train model1_rmse_log_ratio
1        934.803             1356.827              1323.683             0.9755725

Model Sqrt

# MAE of Sqrt for test
model1_mae_sqrt <- (MAE(splitted_test_simple$Item_Outlet_Sales, pred_sqrt_test))
# RMSE of Sqrt for test dataset
model1_rmse_sqrt_test <- (RMSE(splitted_test_simple$Item_Outlet_Sales, pred_sqrt_test))
# RMSE of Sqrt for train dataset
model1_rmse_sqrt_train <- (RMSE(splitted_train_simple$Item_Outlet_Sales, pred_sqrt_train))
# RMSE of Sqrt for train/test
model1_rmse_sqrt_ratio <-(RMSE(splitted_train_simple$Item_Outlet_Sales, pred_sqrt_train))/(RMSE(splitted_test_simple$Item_Outlet_Sales, pred_log_test))
model1_sqrt <- data.frame(model1_mae_sqrt,model1_rmse_sqrt_test,model1_rmse_sqrt_train,model1_rmse_sqrt_ratio) 
model1_sqrt
  model1_mae_sqrt model1_rmse_sqrt_test model1_rmse_sqrt_train model1_rmse_sqrt_ratio
1        946.3798              1331.887               1307.238              0.9634521

Compare

Dapat dilihat, walaupun ke-tiga model memiliki R-squre yang mirip. Namun dari akurasinya, model dengan menggunakan transformasi Rsq dapat dikatakan lebih baik. Hal ini dikarenakan mayoritas nilai MAE dan RMSE nya lebih kecil jika dibandingkan dengan dua model lainnya.

model1_simple
  model1_mae_simple model1_rmse_simple_test model1_rmse_simple_train model1_rmse_ratio
1          1008.209                1341.607                 1324.209         0.9870322
model1_log
  model1_mae_log model1_rmse_log_test model1_rmse_log_train model1_rmse_log_ratio
1        934.803             1356.827              1323.683             0.9755725
model1_sqrt
  model1_mae_sqrt model1_rmse_sqrt_test model1_rmse_sqrt_train model1_rmse_sqrt_ratio
1        946.3798              1331.887               1307.238              0.9634521

UJI ASUMSI

Model dapat dikatakan telah memenuhi asumsi jika sudah memenuhi ke-empat kriteria berikut (IIDN)

Model Simpel

par(mfrow=c(2,2))
plot(linear_model_simple)

Model Log

Logq

par(mfrow=c(2,2))
plot(linear_model_log1)

Model Sqrt

Sqrt Sqrt

par(mfrow=c(2,2))
plot(linear_model_sqrt)

LS0tDQp0aXRsZTogIkJpZ01hcnQgRGF0YVNldCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KLS0tDQoNCiMjIFBFTkRBSFVMVUFODQoNCiMjIyBMYXRhciBCZWxha2FuZw0KR2F5YSBoaWR1cCBtYXN5YXJha2F0IHVyYmFuIHRhayBsZXBhcyBkYXJpIGtlbWFqdWFuIHRla25vbG9naSBkYW4gcGVya2VtYmFuZ2FuIHBvbGEgcGlraXIuIFRhcmFmIGhpZHVwIG1hc3lhcmFrYXQgZGl0dW50dXQgdW50dWsgbGViaWggbWFqdSBkYW4ga2VidXR1aGFuIHVudHVrIG1lbWVudWhpIGtlYnV0dWhhbiBoaWR1cCB5YW5nIHNlbWFraW4gaGFyaSBzZW1ha2luIGJlc2FyIG1lbmphZGkgaGFsIHlhbmcgdGFrIHRlcmhpbmRhcmthbi4gRGV3YXNhIGluaSBtdW5jdWwgYmVyYmFnYWkgcHVzYXQgcGVyYmVsYW5qYWFuIHlhbmcgbWVuamFkaSBiYWdpYW4gZGFyaSBnZXJhayBwZXJrZW1iYW5nYW4ga290YSBtZXRyb3BvbGl0YW4uIFNhbGFoIHNhdHVueWEgYnJhbmQgaW50ZXJuYXNpb25hbCwgQmlnTWFydCB5YW5nIHRlbGFoIG11bmN1bCBkaSBiZXJiYWdhaSBuZWdhcmEuIEJpZ01hcnQgYWRhbGFoIHNlYnVhaCBwZXJ1c2FoYWFuIHlhbmcgYmVyZ2VyYWsgZGkgYmlkYW5nIHJldGFpbCBidXNpbmVzcyBmcmFuY2hpc2UgZGFsYW0gYmVudHVrIHN1cGVybWFya2V0IGF0YXUgZ3JvY2VyeSBzdG9yZS4gU2VwZXJ0aSB0b2tvLXRva28gcGFkYSB1bXVtbnlhLCBCaWdNYXJ0IGp1Z2EgbWVuanVhbCBwcm9kdWstcHJvZHVrIHVudHVrIG1lbWVudWhpIGtlYnV0dWhhbiBtYXN5YXJha2F0IGRpIHNla2l0YXJueWEuIEtlYnV0dWhhbiBwcm9kdWsgcGFkYSBsaW5na3VuZ2FuIHlhbmcgc2F0dSBiaXNhIGphZGkgYmVyYmVkYSBkaSBsaW5na3VuZ2FuIGxhaW5ueWEsIGRpbWFuYSBrYXJha3RlcmlzdGlrIG1hc3lhcmFrYXQganVnYSBiZXJiZWRhLiBTZWJhZ2FpIGNvbnRvaCwgdG9rbyB5YW5nIGJlcmFkYSBkaSB0aXBlIEtvdGEgMSAoVGllciAxKSBha2FuIG1lbXB1bnlhaSBwZW5kYXBhdGFuIHBlbmp1YWxhbiB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gdG9rbyBkaSBsb2thc2kgbGFpbm55YSBrYXJlbmEgcGVuZGFwYXRhbiBtYXN5YXJha2F0IGRpIEtvdGEgMSBqdWdhIGxlYmloIHRpbmdnaSwgYXRhdSBjb250b2ggeWFuZyBsYWluIHRva28geWFuZyBtZW1wdW55YWkga2FwYXNpdGFzIHBlbnlpbXBhbmFuIHlhbmcgbGViaWggYmVzYXIgYWthbiBtZW1pbGlraSBwZW5kYXBhdGFuIHBlbmp1YWxhbiB5YW5nIGxlYmloIHRpbmdnaSBrYXJlbmEgbWFzeWFyYWthdCBsZWJpaCBtZW1pbGloIHRva28gZGVuZ2FuIGthcGFzaXRhcyBndWRhbmcgeWFuZyBiZXNhciBhZ2FyIG1hbXB1IG1lbWJlbGkgc2VnYWxhIGplbmlzIGJhcmFuZyB5YW5nIGRpYnV0dWhrYW4gZGFsYW0gc2F0dSB0ZW1wYXQuU2VoaW5nZ2EgZGFsYW0gYW5hbGlzaXMgaW5pIGFrYW4gbWVuZGFwYXRrYW4gbW9kZWwgZ3VuYSBtZW5nZXRhaHUgcGVuanVhbGFuIHByb2R1ayBkaSBzdWF0byB0b2tvIHRlcnRlbnR1IChiZXJkYXNhcmthbiBrYXJha3RlcmlzdGlrIHRva28gdGVyc2VidXQpLiBTZWhpbmdnYSBkaWhhcmFwa2FuIGRhcGF0IG1lbmluZ2thdGthbiBwZW5qdWFsYW4gdW50dWsgc2V0aWFwIHRva28uDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gbWVydXBha2FuIGRhdGEgeWFuZyBkaSBwZXJvbGVoIGRhcmkgYW5hbHl0aWNzdmlkaHlhLmNvbQ0KRGF0YSB0ZXJkaXJpIGRhdGEgdHJhbmluZyBkYW4gZGF0YSB0ZXN0aW5nIHlhbmcgbWVtaWxpa2kgbWlzc2luZyB2YWx1ZQ0KDQpgYGB7cn0NCiMgTG9hZCBwYWNrYWdlcw0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KGR1bW1pZXMpDQpsaWJyYXJ5KHNoaW55anF1aSkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KYGBgDQoNClNlYmVsdW0gbWVsYWt1a2FuIGFuYWxpc2lzIGxlYmloIGxhbmp1dCwgbWFrYSBwZXJsdSBhZGFueWEgaW1wdXRhc2kgZGF0YS4gRElrYXJlbmFrYW4gcGFkYSBhbmFsc2lpcyBrYWxpIGluaSBpbmdpbiBtZW1wcmVkaWtzaSBzZWJlcmFwYSBjb2NvayBtb2RlbCB5YW5nIGFrYW4gZGlndW5ha2FuLCBtYWthIGRhcmkgaXR1IHBlcmx1IG1lbGliYXRrYW4ga2VkdWEgZGF0YSAodHJhbmluZyAmIHRlc3RpbmcpDQoNCmBgYHtyIH0NCiMgVGhlIGRhdGEgY29uc2lzdCBvZiBUcmFpbiAmIFRlc3QgRGF0YSBTZXQNCnRyYWluPC1yZWFkX2V4Y2VsKCJ0cmFpbi54bHN4IikNCnRlc3Q8LXJlYWRfZXhjZWwoInRlc3QueGxzeCIpDQpgYGANCg0KIyMjIFJBTkNBTkdBTiBBTkFMSVNJUw0KTGFuZ2thaC1sYW5na2FoIGFuYWxpc2lzIHlhbmcgYWthbiBkaSBsYWt1a2FuIDoNCi0xLiBTdGF0aXN0aWthIERlc2tyaXB0aWYNCi0yLiBQcmVwcm9jZXNzaW5nIERhdGEgKE1pc3NpbmcgdmFsdWUgJiBUcmFuc2Zvcm1hc2kpDQotMy4gTWVsYWt1a2FuIEFuYWxzaWlzIFJlZ3Jlc2kgDQogICAgKGthcmVuYSBkYXRhIHlhbmcgZGlndW5ha2FuIHRlcmRpcmkgZGFyaSB2YXJpYWJlbCBwcmVkaWt0b3Iga2F0ZWdvcmlrIGRhbiBudW1lcmlrIGRhbiByZXNwb24geWFuZyBudW1lcmlrICkNCi00LiBNZW5nZXRhaHVpIHBlbW9kZWxhbiB0ZXJiYWlrIGRhbGFtIG1lbXByZWRpa3NpIGtldW50dW5nYW4geWFuZyBha2FuIGRpIHBlcm9sZWgoKQ0KDQoNCiMjIFNUQVRJU1RJS0EgREVTS1JJUFRJRiB7LnRhYnNldCAudGFic2V0LWZhZGV9DQpTZWJlbHVtIG1lbGFrdWthbiBhbmFsaXNpcyBkYXRhIGxlYmloIGxhbmp1dC4gTWFrYSBwZXJsdSBtZW5nZXRhaHVpIGthcmFrdGVyaXN0aWsgZGF0YSB5YW5nIGFrYW4gZGlhbWF0aS4gT2xlaCBrYXJlbmEgaXR1IHN0YXRpc3Rpa2EgZGVza3JpZiBwZXJsdSB1bnR1ayBkaWxha3VrYW4uDQoNCiMjIyBUcmFuaW5nDQpgYGB7cn0NCnN1bW1hcnkodHJhaW4pDQpgYGANCg0KIyMjIFRlc3RpbmcNCmBgYHtyfQ0Kc3VtbWFyeSh0ZXN0KQ0KYGBgDQpEYXBhdCBkaWtldGFodWkgdmFyaWFiZWwgcmVzcG9uIHRpZGFrIG5vcm1hbCBkYW4gYnV0dWggZGkgdHJhbnNmb3JtYXNpLiBEYW4gdGVyZGFwYXQgZHVhIHZhcmlhYmVsIHlhbmcgdGVyZGFwYXQgbWlzc2luZyB2YWx1ZS4gDQoNCg0KIyMgVklTVUFMSVNBSSBEQVRBIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCkRpa2FyZW5ha2FuIGRhdGEgeWFuZyBkaWd1bmFrYW4gYmVyYWdhbSwgbWFrYSBkYXJpIGl0dSB1bnR1ayB2aXN1YWxpc2FpIGRpbGFrdWthbiBiZXJkYXNhcmthbiB0aXBlIGRhdGFueWEuDQoNCiMjIyBLYXRlZ29yaWsNCmFhDQoNCiMjIyBOdW1lcmlrDQphYQ0KDQoNCiMjIFBSRVBST0NFU1NJTkd7LnRhYnNldCAudGFic2V0LWZhZGV9DQpTZWJlbHVtIG1lbGFrdWthbiBhbmFsaXNpcyBsZWJpaCBsYW5qdXQuIE1ha2EgcGVybHUgYWRhbnlhIHByb3NlcyBwcmVwcm9jZXNzaW5nIGd1bmEgZGF0YSB5YW5nIGFrYW4gZGlndW5ha2FuIGRhcGF0IG1lbWJlcmlrYW4gaW50ZXJwcmV0YXNpIHlhbmcgYmFpaw0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQojIE1lbmdnYWJ1bmdrYW4gU2VsdXJ1aCBEYXRhDQp0ZXN0JEl0ZW1fT3V0bGV0X1NhbGVzIDwtIC05OTkNCmNvbWJpIDwtIHJiaW5kKHRyYWluLCB0ZXN0KQ0KYGBgDQoNCiMjIyBEZXRla3NpIE1pc3NpbmcNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShWSU0pDQphZ2dyKHRyYWluLCANCiAgICBjb2w9YygnbmF2eWJsdWUnLCd0b21hdG8nKSwgDQogICAgbnVtYmVycz1UUlVFLCANCiAgICBzb3J0VmFycz1UUlVFLCANCiAgICBsYWJlbHM9bmFtZXModHJhaW4pLCANCiAgICBjZXguYXhpcz0uNywgDQogICAgZ2FwPTMsIA0KICAgIHlsYWI9YygiSGlzdG9ncmFtIG9mIG1pc3NpbmcgZGF0YSIsIlBhdHRlcm4iKSkNCmxpYnJhcnkobWljZSkNCm1kLnBhdHRlcm4odHJhaW4pDQpgYGANCg0KIyMjIEltcHV0YXNpIE1pc3NpbmcNClRlcmRhcGF0IG1pc3NpbmcgdmFsdWUgcGFkYSB2YXJpYWJlbCBudW1lcmlrIGRhbiBrYXRlZ29yaWsuIFBhZGEgYW5hbGlzaXMga2FsaSBpbmksIHBlbmdpbXB1dGFuIHlhbmcgZGlsYWt1a2FuIHlhaXR1IG1lbmdndW5ha2FuIGltcHV0YXNpIG1lZGlhbiB1bnR1ayB2YXJpYWJlbCBudW1lcmlrIHlhbmcgbWlzc2luZy4gRGFuIE1vZHVzIHVudHVrIHZhcmlhYmVsIGthdGVnb3JpayB5YW5nIG1pc3NpbmcuQmVyaWt1dCBjYXJhIG1lbmdpbnB1dGthbm55YS4NCmBgYHtyIG91dCwgd2FybmluZz1GQUxTRX0NCiMgSW1wdXRhc2kgdW50dWsgVmFyaWFiZWwgTnVtZXJpaw0KY29tYmkkSXRlbV9XZWlnaHRbaXMubmEoY29tYmkkSXRlbV9XZWlnaHQpXSA8LSBtZWRpYW4oY29tYmkkSXRlbV9XZWlnaHQsIG5hLnJtID0gVFJVRSkNCnRhYmxlKGlzLm5hKGNvbWJpJEl0ZW1fV2VpZ2h0KSkNCmNvbWJpJEl0ZW1fVmlzaWJpbGl0eSA8LSBpZmVsc2UoY29tYmkkSXRlbV9WaXNpYmlsaXR5ID09IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbihjb21iaSRJdGVtX1Zpc2liaWxpdHkpLCBjb21iaSRJdGVtX1Zpc2liaWxpdHkpDQpgYGANCmBgYHtyfQ0KIyBJbXB1dGFzaSB1bnR1ayBWYXJpYWJlbCBLYXRlZ29yaWsNCnRhYmxlKGNvbWJpJE91dGxldF9TaXplKQ0KbWlzczwtdW5pcXVlKGNvbWJpJE91dGxldF9TaXplWyFpcy5uYShjb21iaSRPdXRsZXRfU2l6ZSldKQ0KbW9kZTwtbWlzc1t3aGljaC5tYXgodGFidWxhdGUobWF0Y2goY29tYmkkT3V0bGV0X1NpemUsbWlzcykpKV0NCm1pc3NfaW1wPC1jb21iaSRPdXRsZXRfU2l6ZQ0KY29tYmkkT3V0bGV0X1NpemVbaXMubmEobWlzc19pbXApXTwtbW9kZQ0KYGBgDQoNCiMjIyBJZGVudGlmaWthc2kNCm1lbGFrdWthbiBpZGVudGlmaWthc2kgdGVyaGFkYXAgdmFyaWFibGUgSXRlbSBJZGVudGlmaWVyLiBIYWwgaW5pIGRpa2FyZW5ha2FuLCBwYWRhIHZhcmlhYmVsIHRlcnNlYnV0IGJlcnVwYSBrb2RlIChEUiwgRkQgZGFuIE5DKS4gTWFrYSB2YXJpYWJlbCBkYXBhdCBkaSBrZWxvbXBva2thbiBtZW5qYWRpIHZhcmlhYmVsIGRlbmdhbiAzIGtlbG9tb2suIA0KYGBge3J9DQpjb21iaSA8LQ0KICBjb21iaSAlPiUNCiAgbXV0YXRlKEl0ZW1fSWRlbnRpZmllcl9TdHIzID0gc3Vic3RyKEl0ZW1fSWRlbnRpZmllciwxLDMpLCAjRmlyc3QgdGhyZWUgbGV0dGVyIG9mIEl0ZW1fSWRlbnRpZmllci4NCiAgICAgICAgIEl0ZW1fSWRlbnRpZmllcl9TdHIyID0gc3Vic3RyKEl0ZW1fSWRlbnRpZmllciwxLDIpLCAjRmlyc3Qgc2Vjb25kIGxldHRlciBvZiBJdGVtX0lkZW50aWZpZXIuDQogICAgICAgICBJdGVtX0lkZW50aWZpZXJfTnVtPWFzLm51bWVyaWMoc3Vic3RyKEl0ZW1fSWRlbnRpZmllciw0LDYpKSwgIyBOdW1iZXIgcGFydCBvZiBJdGVtX0lkZW50aWZpZXIgY29sdW1uLg0KICAgICAgICAgT3V0bGV0X0FnZT0yMDEzLU91dGxldF9Fc3RhYmxpc2htZW50X1llYXIsICNPdXRsZXQgQWdlDQogICAgICAgICBQSz1yb3dfbnVtYmVyKCkpDQojdGFibGUoY29tYmkkSXRlbV9JZGVudGlmaWVyX1N0cjMpDQp0YWJsZShjb21iaSRJdGVtX0lkZW50aWZpZXJfU3RyMikNCmBgYA0KDQpNZWxha3VrYW4gSWRlbnRpZmlrYXNpIHRlcmhhZGFwIERhdGEgKEtlbWJhbGkpDQpgYGB7ciwgd2FybmluZz1GQUxTRX0NCm5ld190cmFpbiA8LSBjb21iaSAlPiUNCiAgZmlsdGVyKEl0ZW1fT3V0bGV0X1NhbGVzICE9IC05OTkpDQpuZXdfdGVzdCA8LSBjb21iaSAlPiUNCiAgZmlsdGVyKEl0ZW1fT3V0bGV0X1NhbGVzID09IC05OTkpDQpuZXdfY29tYmkgPC0gcmJpbmQobmV3X3RyYWluLCBuZXdfdGVzdCkNCiNnbGltcHNlKG5ld19jb21iaSkNCm5ld19jb21iaTE8LWR1bW15MQ0KbmV3X2NvbWJpMTwtc2VsZWN0KG5ld19jb21iaTEsIC1jKEl0ZW1fSWRlbnRpZmllciwgT3V0bGV0X0lkZW50aWZpZXIsIEl0ZW1fRmF0X0NvbnRlbnQsT3V0bGV0X0VzdGFibGlzaG1lbnRfWWVhciwgSXRlbV9UeXBlLCBJdGVtX0lkZW50aWZpZXJfU3RyMywgUEspKQ0KDQpuZXdfY29tYmkyPC1uZXdfY29tYmkxDQpuZXdfY29tYmkyPC13aXRoaW4obmV3X2NvbWJpMiwgT3V0bGV0X1NpemUgPC0gZmFjdG9yKE91dGxldF9TaXplLCBsYWJlbHMgPSBjKDE6MykpKQ0KDQojc3RyKG5ld19jb21iaTEpDQpwcmVkX3RyYWluIDwtIG5ld19jb21iaTIgJT4lDQogIGZpbHRlcihJdGVtX091dGxldF9TYWxlcyAhPSAtOTk5KQ0KcHJlZF90ZXN0IDwtIG5ld19jb21iaTIgJT4lDQogIGZpbHRlcihJdGVtX091dGxldF9TYWxlcyA9PSAtOTk5KQ0KI2RpbShwcmVkX3RyYWluKQ0KI2RpbShwcmVkX3Rlc3QpDQpgYGANCg0KIyMjIFNwbGl0IERhdGENCkhhbCBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbXBlcm9sZWggbmlsYWkgYWt1cmFzaSBkYXRhIHRyYWluIHRlcmhhZGFwIHRlc3RpbmcuDQpgYGB7ciwgZXJyb3I9RkFMU0V9DQpuZXdfdHJhaW4gPC0gc2VsZWN0KG5ld190cmFpbiwgLWMoSXRlbV9JZGVudGlmaWVyLCBJdGVtX0lkZW50aWZpZXJfU3RyMywgT3V0bGV0X0VzdGFibGlzaG1lbnRfWWVhciwgUEspKQ0Kc2V0LnNlZWQoMSkNCm4gPC0gbnJvdyhuZXdfdHJhaW4pDQpzaHVmZmxlZCA8LSBuZXdfdHJhaW5bc2FtcGxlKG4pLF0NCmdsaW1wc2UobmV3X3RyYWluKQ0KDQojc3BsaXQgdHJhaW4gZGF0YSBhZ2FpbjoNCnRyYWluX2luZGljZXMgPC0gMTpyb3VuZCgwLjcqbikNCnRlc3RfaW5kaWNlcyA8LSAocm91bmQoMC43Km4pKzEpOm4NCnNwbGl0dGVkX3RyYWluX3NpbXBsZSA8LSBzaHVmZmxlZFt0cmFpbl9pbmRpY2VzLF0NCnNwbGl0dGVkX3Rlc3Rfc2ltcGxlIDwtIHNodWZmbGVkW3Rlc3RfaW5kaWNlcyxdDQpgYGANCg0KDQoNCiMjIFJFR1JFU0kgTElOSUVSIChEVU1NWSkgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQojIyMgTW9kZWwgU2ltcGVsDQpgYGB7cn0NCmxpbmVhcl9tb2RlbF9zaW1wbGUgPC0gbG0oSXRlbV9PdXRsZXRfU2FsZXMgfiAuLCBkYXRhID0gc3BsaXR0ZWRfdHJhaW5fc2ltcGxlKQ0Kc3VtbWFyeShsaW5lYXJfbW9kZWxfc2ltcGxlKQ0KYGBgDQoNCiMjIyBNb2RlbCBMb2cNCmBgYHtyfQ0KbGluZWFyX21vZGVsX2xvZzE8LSBsbShsb2cxMChJdGVtX091dGxldF9TYWxlcykgfiAuLCBkYXRhID0gc3BsaXR0ZWRfdHJhaW5fc2ltcGxlKQ0Kc3VtbWFyeShsaW5lYXJfbW9kZWxfbG9nMSkNCmBgYA0KDQojIyMgTW9kZWwgU3FydA0KYGBge3J9DQpsaW5lYXJfbW9kZWxfc3FydCA8LSBsbShzcXJ0KEl0ZW1fT3V0bGV0X1NhbGVzKSB+IC4sIGRhdGEgPSBzcGxpdHRlZF90cmFpbl9zaW1wbGUpDQpzdW1tYXJ5KGxpbmVhcl9tb2RlbF9zcXJ0KQ0KYGBgDQoNCg0KDQphDQoNCg0KDQojIyBBQ0NVUkFDWXsudGFic2V0IC50YWJzZXQtZmFkZX0NClVudHVrIG1lbGloYXQgYWt1cmFzaSBkYXJpIHNldGlhcCBtb2RlbCBtYWthIHBlcmx1IGRpbGFrdWthbiBwZXJoaXR1bmFnbiB0ZXJoYWRhcCBNQUUgZGFuIFJNU0UuIEppa2EgZGFyaSBrZWR1YSBuaWxhaSB0ZXJzZWJ1dCBjdWt1cCBrZWNpbCBkaWJhbmRpbmdrYW4gZGVuZ2FuIG1vZGVsIGxhaW5ueWEsIG1ha2EgZGFwYXQgZGlrYXRha2FuIHBlbW9kZWxhbiB0ZXJzZWJ1dGxhaCB5YW5nIHBhbGluZyBiYWlrLiBVbnR1ayBwZXJoaXR1bmdhbm55YSBzZWJhZ2FpIGJlcmlrdXQuDQpgYGB7cn0NCk1BRSA8LSBmdW5jdGlvbihhY3R1YWwsIHByZWRpY3RlZCl7bWVhbihhYnMoYWN0dWFsIC0gcHJlZGljdGVkKSl9DQpSTVNFIDwtIGZ1bmN0aW9uKGFjdHVhbCwgcHJlZGljdGVkKSB7c3FydChtZWFuKChhY3R1YWwgLSBwcmVkaWN0ZWQpXjIpKX0NCmBgYA0KDQojIyMgTW9kZWwgU2ltcGVsDQpgYGB7cn0NCiMgTUFFIG9mIFNpbXBsZSBmb3IgdGVzdA0KbW9kZWwxX21hZV9zaW1wbGUgPC0gTUFFKHNwbGl0dGVkX3Rlc3Rfc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NpbXBsZV90ZXN0KQ0KIyBSTVNFIG9mIFNpbXBsZSBmb3IgdGVzdCBkYXRhc2V0DQptb2RlbDFfcm1zZV9zaW1wbGVfdGVzdCA8LShSTVNFKHNwbGl0dGVkX3Rlc3Rfc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NpbXBsZV90ZXN0KSkNCiMgUk1TRSBvZiBTaW1wbGUgZm9yIHRyYWluIGRhdGFzZXQNCm1vZGVsMV9ybXNlX3NpbXBsZV90cmFpbiA8LShSTVNFKHNwbGl0dGVkX3RyYWluX3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9zaW1wbGVfdHJhaW4pKQ0KIyBSTVNFIG9mIFNpbXBsZSBmb3IgdHJhaW4vdGVzdA0KbW9kZWwxX3Jtc2VfcmF0aW8gPC0gKFJNU0Uoc3BsaXR0ZWRfdHJhaW5fc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NpbXBsZV90cmFpbikpLyhSTVNFKHNwbGl0dGVkX3Rlc3Rfc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NpbXBsZV90ZXN0KSkNCm1vZGVsMV9zaW1wbGUgPC0gZGF0YS5mcmFtZShtb2RlbDFfbWFlX3NpbXBsZSxtb2RlbDFfcm1zZV9zaW1wbGVfdGVzdCxtb2RlbDFfcm1zZV9zaW1wbGVfdHJhaW4sbW9kZWwxX3Jtc2VfcmF0aW8pIA0KbW9kZWwxX3NpbXBsZQ0KYGBgDQoNCiMjIyBNb2RlbCBMb2cNCmBgYHtyfQ0KIyBNQUUgb2YgTG9nIGZvciB0ZXN0DQptb2RlbDFfbWFlX2xvZyA8LSAoTUFFKHNwbGl0dGVkX3Rlc3Rfc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX2xvZ190ZXN0KSkNCiMgUk1TRSBvZiBMb2cgZm9yIHRlc3QgZGF0YXNldA0KbW9kZWwxX3Jtc2VfbG9nX3Rlc3QgPC0gKFJNU0Uoc3BsaXR0ZWRfdGVzdF9zaW1wbGUkSXRlbV9PdXRsZXRfU2FsZXMsIHByZWRfbG9nX3Rlc3QpKQ0KIyBSTVNFIG9mIExvZyBmb3IgdHJhaW4gZGF0YXNldA0KbW9kZWwxX3Jtc2VfbG9nX3RyYWluIDwtIChSTVNFKHNwbGl0dGVkX3RyYWluX3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9sb2dfdHJhaW4pKQ0KIyBSTVNFIG9mIExvZyBmb3IgdHJhaW4vdGVzdA0KbW9kZWwxX3Jtc2VfbG9nX3JhdGlvIDwtIChSTVNFKHNwbGl0dGVkX3RyYWluX3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9sb2dfdHJhaW4pKS8oUk1TRShzcGxpdHRlZF90ZXN0X3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9sb2dfdGVzdCkpDQoNCm1vZGVsMV9sb2cgPC0gZGF0YS5mcmFtZShtb2RlbDFfbWFlX2xvZyxtb2RlbDFfcm1zZV9sb2dfdGVzdCxtb2RlbDFfcm1zZV9sb2dfdHJhaW4sbW9kZWwxX3Jtc2VfbG9nX3JhdGlvKQ0KbW9kZWwxX2xvZw0KYGBgDQoNCiMjIyBNb2RlbCBTcXJ0DQpgYGB7cn0NCiMgTUFFIG9mIFNxcnQgZm9yIHRlc3QNCm1vZGVsMV9tYWVfc3FydCA8LSAoTUFFKHNwbGl0dGVkX3Rlc3Rfc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NxcnRfdGVzdCkpDQojIFJNU0Ugb2YgU3FydCBmb3IgdGVzdCBkYXRhc2V0DQptb2RlbDFfcm1zZV9zcXJ0X3Rlc3QgPC0gKFJNU0Uoc3BsaXR0ZWRfdGVzdF9zaW1wbGUkSXRlbV9PdXRsZXRfU2FsZXMsIHByZWRfc3FydF90ZXN0KSkNCiMgUk1TRSBvZiBTcXJ0IGZvciB0cmFpbiBkYXRhc2V0DQptb2RlbDFfcm1zZV9zcXJ0X3RyYWluIDwtIChSTVNFKHNwbGl0dGVkX3RyYWluX3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9zcXJ0X3RyYWluKSkNCiMgUk1TRSBvZiBTcXJ0IGZvciB0cmFpbi90ZXN0DQptb2RlbDFfcm1zZV9zcXJ0X3JhdGlvIDwtKFJNU0Uoc3BsaXR0ZWRfdHJhaW5fc2ltcGxlJEl0ZW1fT3V0bGV0X1NhbGVzLCBwcmVkX3NxcnRfdHJhaW4pKS8oUk1TRShzcGxpdHRlZF90ZXN0X3NpbXBsZSRJdGVtX091dGxldF9TYWxlcywgcHJlZF9sb2dfdGVzdCkpDQptb2RlbDFfc3FydCA8LSBkYXRhLmZyYW1lKG1vZGVsMV9tYWVfc3FydCxtb2RlbDFfcm1zZV9zcXJ0X3Rlc3QsbW9kZWwxX3Jtc2Vfc3FydF90cmFpbixtb2RlbDFfcm1zZV9zcXJ0X3JhdGlvKSANCm1vZGVsMV9zcXJ0DQpgYGANCg0KIyMjIENvbXBhcmUNCkRhcGF0IGRpbGloYXQsIHdhbGF1cHVuIGtlLXRpZ2EgbW9kZWwgbWVtaWxpa2kgUi1zcXVyZSB5YW5nIG1pcmlwLiBOYW11biBkYXJpIGFrdXJhc2lueWEsIG1vZGVsIGRlbmdhbiBtZW5nZ3VuYWthbiB0cmFuc2Zvcm1hc2kgUnNxIGRhcGF0IGRpa2F0YWthbiBsZWJpaCBiYWlrLiBIYWwgaW5pIGRpa2FyZW5ha2FuIG1heW9yaXRhcyBuaWxhaSBNQUUgZGFuIFJNU0UgbnlhIGxlYmloIGtlY2lsIGppa2EgZGliYW5kaW5na2FuIGRlbmdhbiBkdWEgbW9kZWwgbGFpbm55YS4NCmBgYHtyfQ0KbW9kZWwxX3NpbXBsZQ0KbW9kZWwxX2xvZw0KbW9kZWwxX3NxcnQNCmBgYA0KDQoNCiMjIFVKSSBBU1VNU0l7LnRhYnNldCAudGFic2V0LWZhZGV9DQpNb2RlbCBkYXBhdCBkaWthdGFrYW4gdGVsYWggbWVtZW51aGkgYXN1bXNpIGppa2Egc3VkYWggbWVtZW51aGkga2UtZW1wYXQga3JpdGVyaWEgYmVyaWt1dCAoSUlETikNCg0KIyMjIE1vZGVsIFNpbXBlbA0KYGBge3J9DQpwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChsaW5lYXJfbW9kZWxfc2ltcGxlKQ0KYGBgDQoNCiMjIyBNb2RlbCBMb2cNCkxvZ3ENCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QobGluZWFyX21vZGVsX2xvZzEpDQpgYGANCg0KIyMjIE1vZGVsIFNxcnQNClNxcnQNClNxcnQNCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwyKSkNCnBsb3QobGluZWFyX21vZGVsX3NxcnQpDQpgYGA=