FORM - bd:SCRAP

Importar Base de datos

#file.choose()
scrap <- read.csv("/Users/vanessaelizondo/Desktop/Tec/Semestre 7/FORM/CSV/FORM - Scrap.csv")
summary(scrap)
##     Fecha               Hora             Producto            Cantidad      
##  Length:251         Length:251         Length:251         Min.   :   0.00  
##  Class :character   Class :character   Class :character   1st Qu.:   1.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :   2.00  
##                                                           Mean   :  13.34  
##                                                           3rd Qu.:   7.00  
##                                                           Max.   :1674.00  
##  Ubicación.de.origen Ubicación.de.desecho
##  Length:251          Length:251          
##  Class :character    Class :character    
##  Mode  :character    Mode  :character    
##                                          
##                                          
## 

Observaciones

Se hizo limpieza manual de la base de datos para separar fecha y hora en diferentes columnas y se eliminaron columnas innecesarias.

Cuantas variables y registros hay

str(scrap)
## 'data.frame':    251 obs. of  6 variables:
##  $ Fecha               : chr  "" "31/08/2022" "31/08/2022" "31/08/2022" ...
##  $ Hora                : chr  "" "2:55 PM" "2:49 PM" "1:49 PM" ...
##  $ Producto            : chr  "" "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." ...
##  $ Cantidad            : num  1674 2 1 1 31 ...
##  $ Ubicación.de.origen : chr  "" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" ...
##  $ Ubicación.de.desecho: chr  "" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" "Virtual Locations/Scrapped" ...

Contamos con 6 variables y 251 observaciones.

Técnicas de Limpieza

Técnica 1: eliminar NAs

Se decidió realizar está técnica para asegurarnos de que no se tenga falta de datos y en caso de tenerlos evitar que estas eviten tener un analisis asertivo al no agregar valor a la base de datos.

¿Cuantos NA tengo en la base de datos?

sum(is.na(scrap))
## [1] 0

Cuantos NA tengo por variable?

Sapply: Para contar los NA

sapply(scrap, function(x) sum(is.na(x)))
##                Fecha                 Hora             Producto 
##                    0                    0                    0 
##             Cantidad  Ubicación.de.origen Ubicación.de.desecho 
##                    0                    0                    0

No se encuentran NAs en la base de datos

Técnica 2: eliminar columnas

Se decidó realizar está técnica para deshacernos de información que no es muy relevante para el análisis de nuestra base de datos.

scrap2 <- scrap
scrap2 <- subset (scrap2, select = -c (Hora))
scrap2 <- subset (scrap2, select = -c (Producto))
scrap2 <- subset (scrap2, select = -c (Ubicación.de.desecho))
summary(scrap2)
##     Fecha              Cantidad       Ubicación.de.origen
##  Length:251         Min.   :   0.00   Length:251         
##  Class :character   1st Qu.:   1.00   Class :character   
##  Mode  :character   Median :   2.00   Mode  :character   
##                     Mean   :  13.34                      
##                     3rd Qu.:   7.00                      
##                     Max.   :1674.00

Identificar variables entre cuantitativas o cualitativas y su escala de medición.

Cuantitativa: Discreta, Continua Escala de medición: Intervalo, Razón Cualitativa Escala de medición: Nominales, Ordinales

Variable<-c("`Fecha`","`Cantidad`", "` Ubicación.de.origen`")
Type<-c("Cuantitativa (continua)", "Cuantitativa (discreta)","Cualitativa")
Measurement<-c("Razón","Razón","Nominal")
table<-data.frame(Variable,Type,Measurement)

knitr::kable(table)
Variable Type Measurement
Fecha Cuantitativa (continua) Razón
Cantidad Cuantitativa (discreta) Razón
Ubicación.de.origen Cualitativa Nominal

Análisis Estadístico Descriptivo

summary(scrap2)
##     Fecha              Cantidad       Ubicación.de.origen
##  Length:251         Min.   :   0.00   Length:251         
##  Class :character   1st Qu.:   1.00   Class :character   
##  Mode  :character   Median :   2.00   Mode  :character   
##                     Mean   :  13.34                      
##                     3rd Qu.:   7.00                      
##                     Max.   :1674.00

Tabla de Frecuencia

#install.packages('epiDisplay')
library(epiDisplay)
## Loading required package: foreign
## Loading required package: survival
## Loading required package: MASS
## Loading required package: nnet
tab1(scrap2$Ubicación.de.origen, sort.group = "decreasing", cum.percent = TRUE) 

## scrap2$Ubicación.de.origen : 
##                           Frequency Percent Cum. percent
## SAB/Pre-Production              179    71.3         71.3
## SAB/Calidad/Entrega de PT        58    23.1         94.4
## SAB/Post-Production              13     5.2         99.6
##                                   1     0.4        100.0
##   Total                         251   100.0        100.0

Gráfica cualitativa

#install.packages("plyr")
library(plyr)
pie(table(scrap2$Ubicación.de.origen))

Gráfica cuantitativa

#table(scrap2$Cantidad,scrap2$Fecha)
barplot(table(scrap2$Cantidad,scrap2$Ubicación.de.origen), col="yellow", main = "Kilos de Scrapsegún su origen", xlab = "Origen", ylab = "Kilos" )

Gráficos de Dispersión

boxplots=subset(scrap2,select=-c(Ubicación.de.origen))
boxplot(table (scrap2$Ubicación.de.origen), main = "Ubicación de Origen", xlab = "Origen", ylab = "Cantidad")

FORM - bd: MERMA

#file.choose()
merma <- read.csv("/Users/vanessaelizondo/Desktop/Tec/Semestre 7/FORM/CSV/FORM - Merma.csv")
summary(merma)
##     Fecha               IDMes          Mes               Kilos          
##  Length:60          Min.   :1.00   Length:60          Length:60         
##  Class :character   1st Qu.:3.00   Class :character   Class :character  
##  Mode  :character   Median :5.00   Mode  :character   Mode  :character  
##                     Mean   :5.24                                        
##                     3rd Qu.:8.00                                        
##                     Max.   :9.00                                        
##                     NA's   :10

Cuantas variables y registros hay

str(merma)
## 'data.frame':    60 obs. of  4 variables:
##  $ Fecha: chr  "11/01/22" "11/01/22" "22/01/22" "30/01/22" ...
##  $ IDMes: int  1 1 1 1 NA 2 2 2 2 2 ...
##  $ Mes  : chr  "ENERO" "ENERO" "ENERO" "ENERO" ...
##  $ Kilos: chr  "5080" "3810" "2990" "2680" ...

Contamos con 4 variables y 60 obsrvaciones.

Técnicas de Limpieza

Técnica 1: eliminar NAs

Se decidió realizar está técnica para asegurarnos de que no se tenga falta de datos y en caso de tenerlos evitar que estas eviten tener un analisis asertivo al no agregar valor a la base de datos.

¿Cuantos NA tengo en la base de datos?

sum(is.na(merma))
## [1] 10

Cuantos NA tengo por variable?

Sapply: Para contar los NA

sapply(merma, function(x) sum(is.na(x)))
## Fecha IDMes   Mes Kilos 
##     0    10     0     0

Observación: tenemos 10 NAs en la variable de Fecha, podemos ver que los NAs son gracias al acomodo de información en la base de datos.

Decidimos borrar la fila de totales para elimninar los NAs.

Eliminamos NAs

merma2<-merma
delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
delete.na(merma2)
##       Fecha IDMes        Mes Kilos
## 1  11/01/22     1      ENERO  5080
## 2  11/01/22     1      ENERO  3810
## 3  22/01/22     1      ENERO  2990
## 4  30/01/22     1      ENERO  2680
## 6  18/02/22     2    FEBRERO  3650
## 7  18/02/22     2    FEBRERO  4380
## 8  18/02/22     2    FEBRERO  3870
## 9  18/02/22     2    FEBRERO  3590
## 10 18/02/22     2    FEBRERO  3410
## 11 24/02/22     2    FEBRERO  3930
## 13 03/03/22     3      MARZO  4000
## 14 08/03/22     3      MARZO  4190
## 15 11/03/22     3      MARZO  2980
## 16 16/03/22     3      MARZO  3290
## 17 23/03/22     3      MARZO  4200
## 18 30/03/22     3      MARZO  3810
## 20 04/04/22     4      ABRIL  3940
## 21 11/04/22     4      ABRIL  4190
## 22 14/04/22     4      ABRIL  2950
## 23 21/04/22     4      ABRIL  3690
## 24 27/04/22     4      ABRIL  4050
## 26 02/05/22     5       MAYO  4310
## 27 09/05/22     5       MAYO  4770
## 28 14/05/22     5       MAYO  3680
## 29 24/05/22     5       MAYO  6140
## 30 25/05/22     5       MAYO  4510
## 32 07/06/22     6      JUNIO  4680
## 33 15/06/22     6      JUNIO  4330
## 34 20/06/22     6      JUNIO  5010
## 35 27/06/22     6      JUNIO  4260
## 37 04/07/22     7      JULIO  5230
## 38 11/07/22     7      JULIO  2130
## 39 16/07/22     7      JULIO  4130
## 40 21/07/22     7      JULIO  3920
## 41 27/07/22     7      JULIO  3960
## 43 08/08/22     8     AGOSTO  3140
## 44 10/08/22     8     AGOSTO  4210
## 45 11/08/22     8     AGOSTO  3140
## 46 13/08/22     8     AGOSTO  3780
## 47 15/08/22     8     AGOSTO  4240
## 48 22/08/22     8     AGOSTO  4200
## 49 29/08/22     8     AGOSTO  4270
## 50 29/08/22     8     AGOSTO   810
## 51 30/08/22     8     AGOSTO  1040
## 52 31/08/22     8     AGOSTO  2480
## 53 31/08/22     8     AGOSTO   790
## 55 05/09/22     9 SEPTIEMBRE  3050
## 56 07/09/22     9 SEPTIEMBRE  2830
## 57 15/09/22     9 SEPTIEMBRE  3967
## 58 21/09/22     9 SEPTIEMBRE  3739
merma2 <- na.omit(merma2)

summary(merma2)
##     Fecha               IDMes          Mes               Kilos          
##  Length:50          Min.   :1.00   Length:50          Length:50         
##  Class :character   1st Qu.:3.00   Class :character   Class :character  
##  Mode  :character   Median :5.00   Mode  :character   Mode  :character  
##                     Mean   :5.24                                        
##                     3rd Qu.:8.00                                        
##                     Max.   :9.00

Convertir de caracter a fecha

#install.packages("tibble")
library(tibble)
merma2$Fecha<-as.Date(merma2$Fecha, format = "%d/%m/%Y")
tibble(merma2)
## # A tibble: 50 × 4
##    Fecha      IDMes Mes     Kilos
##    <date>     <int> <chr>   <chr>
##  1 0022-01-11     1 ENERO   5080 
##  2 0022-01-11     1 ENERO   3810 
##  3 0022-01-22     1 ENERO   2990 
##  4 0022-01-30     1 ENERO   2680 
##  5 0022-02-18     2 FEBRERO 3650 
##  6 0022-02-18     2 FEBRERO 4380 
##  7 0022-02-18     2 FEBRERO 3870 
##  8 0022-02-18     2 FEBRERO 3590 
##  9 0022-02-18     2 FEBRERO 3410 
## 10 0022-02-24     2 FEBRERO 3930 
## # … with 40 more rows

Identificar variables entre cuantitativas o cualitativas y su escala de medición.

Cuantitativa: Discreta, Continua Escala de medición: Intervalo, Razón Cualitativa Escala de medición: Nominales, Ordinales

Variable<-c("`Fecha`","`IDMes`", "` Mes`", "` Kilos`")
Type<-c("Cuantitativa (continua)", "Cualitativa","Cualitativa","Cuantitativa (discreta)")
Measurement<-c("Razón", "Nominal","Nominal","Razón")
table<-data.frame(Variable,Type,Measurement)

knitr::kable(table)
Variable Type Measurement
Fecha Cuantitativa (continua) Razón
IDMes Cualitativa Nominal
Mes Cualitativa Nominal
Kilos Cuantitativa (discreta) Razón

Gráfica cuantitativa

plot(merma2$Fecha,merma2$Kilos, type="l",col="blue", xlab ="Mes",ylab ="Kilos", main = "Cantidades de kilos por mes")

table(merma2$Mes, merma2$Kilos)
##             
##              1040 2130 2480 2680 2830 2950 2980 2990 3050 3140 3290 3410 3590
##   ABRIL         0    0    0    0    0    1    0    0    0    0    0    0    0
##   AGOSTO        1    0    1    0    0    0    0    0    0    2    0    0    0
##   ENERO         0    0    0    1    0    0    0    1    0    0    0    0    0
##   FEBRERO       0    0    0    0    0    0    0    0    0    0    0    1    1
##   JULIO         0    1    0    0    0    0    0    0    0    0    0    0    0
##   JUNIO         0    0    0    0    0    0    0    0    0    0    0    0    0
##   MARZO         0    0    0    0    0    0    1    0    0    0    1    0    0
##   MAYO          0    0    0    0    0    0    0    0    0    0    0    0    0
##   SEPTIEMBRE    0    0    0    0    1    0    0    0    1    0    0    0    0
##             
##              3650 3680 3690 3739 3780 3810 3870 3920 3930 3940 3960 3967 4000
##   ABRIL         0    0    1    0    0    0    0    0    0    1    0    0    0
##   AGOSTO        0    0    0    0    1    0    0    0    0    0    0    0    0
##   ENERO         0    0    0    0    0    1    0    0    0    0    0    0    0
##   FEBRERO       1    0    0    0    0    0    1    0    1    0    0    0    0
##   JULIO         0    0    0    0    0    0    0    1    0    0    1    0    0
##   JUNIO         0    0    0    0    0    0    0    0    0    0    0    0    0
##   MARZO         0    0    0    0    0    1    0    0    0    0    0    0    1
##   MAYO          0    1    0    0    0    0    0    0    0    0    0    0    0
##   SEPTIEMBRE    0    0    0    1    0    0    0    0    0    0    0    1    0
##             
##              4050 4130 4190 4200 4210 4240 4260 4270 4310 4330 4380 4510 4680
##   ABRIL         1    0    1    0    0    0    0    0    0    0    0    0    0
##   AGOSTO        0    0    0    1    1    1    0    1    0    0    0    0    0
##   ENERO         0    0    0    0    0    0    0    0    0    0    0    0    0
##   FEBRERO       0    0    0    0    0    0    0    0    0    0    1    0    0
##   JULIO         0    1    0    0    0    0    0    0    0    0    0    0    0
##   JUNIO         0    0    0    0    0    0    1    0    0    1    0    0    1
##   MARZO         0    0    1    1    0    0    0    0    0    0    0    0    0
##   MAYO          0    0    0    0    0    0    0    0    1    0    0    1    0
##   SEPTIEMBRE    0    0    0    0    0    0    0    0    0    0    0    0    0
##             
##              4770 5010 5080 5230 6140 790 810
##   ABRIL         0    0    0    0    0   0   0
##   AGOSTO        0    0    0    0    0   1   1
##   ENERO         0    0    1    0    0   0   0
##   FEBRERO       0    0    0    0    0   0   0
##   JULIO         0    0    0    1    0   0   0
##   JUNIO         0    1    0    0    0   0   0
##   MARZO         0    0    0    0    0   0   0
##   MAYO          1    0    0    0    1   0   0
##   SEPTIEMBRE    0    0    0    0    0   0   0
barplot(table(merma2$Kilos, merma2$IDMes), col="purple", main = "Cantidad de Kilos por mes", xlab = "ID Mes", ylab = "Kilos" )

FORM - bd: PRODUCCION

#file.choose()
produccion <- read.csv("/Users/vanessaelizondo/Desktop/Tec/Semestre 7/FORM/CSV/FORM - ProducciónLimpia.csv")
summary(produccion)
##    CLIENTE            ID.FORM            PRODUCTO         PIEZAS.PROG.      
##  Length:2569        Length:2569        Length:2569        Length:2569       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##   TMO..MIN.           HR..FIN          ESTACION.ARRANQUE  Laminas.procesadas
##  Length:2569        Length:2569        Length:2569        Length:2569       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##  INICIO.SEP.UP      FIN.INICIO.DE.SEP.UP INICIO.de.PROCESO  FIN.de.PROCESO    
##  Length:2569        Length:2569          Length:2569        Length:2569       
##  Class :character   Class :character     Class :character   Class :character  
##  Mode  :character   Mode  :character     Mode  :character   Mode  :character  
##  TIEMPO.CALIDAD    
##  Length:2569       
##  Class :character  
##  Mode  :character

Cuantas variables y registros hay

str(produccion)
## 'data.frame':    2569 obs. of  13 variables:
##  $ CLIENTE             : chr  "VARROC" "VARROC" "VARROC" "DENSO" ...
##  $ ID.FORM             : chr  "VL-017-13938" "VL-017-13936" "VL-017-14729" "" ...
##  $ PRODUCTO            : chr  "763 . KIT. CAJA." "747 KIT. CAJA HSC. ( 2 Partes)" "747 KIT. TAPA." "TOYOTA. MCV. Insterto D 2R. CORTE. 1 Golpe = 12 piezas. ( 9 Pza. / Celda)." ...
##  $ PIEZAS.PROG.        : chr  "199" "57" "68" "192" ...
##  $ TMO..MIN.           : chr  "15" "10" "10" "15" ...
##  $ HR..FIN             : chr  "9:15:00 a. m." "9:25:00 a. m." "9:35:00 a. m." "9:50:00 a. m." ...
##  $ ESTACION.ARRANQUE   : chr  "C1" "C1Y2" "C1Y2" "C1" ...
##  $ Laminas.procesadas  : chr  "201" "116" "69" "49" ...
##  $ INICIO.SEP.UP       : chr  "9:00" "9:26" "10:02" "10:12" ...
##  $ FIN.INICIO.DE.SEP.UP: chr  "9:12" "9:31" "10:09" "10.17" ...
##  $ INICIO.de.PROCESO   : chr  "9:13" "9:32" "10:09" "10:18" ...
##  $ FIN.de.PROCESO      : chr  "9:26" "9:53" "10.12" "10:20" ...
##  $ TIEMPO.CALIDAD      : chr  "1" "1" "1" "1" ...

Contamos con 13 variables y 2569 obsrvaciones.

Técnicas de Limpieza

Observaciones: Fue necesario hacer una limpia manual de la base de datos, se seleccionaron las variables conmayor significancia, nos quedamos con los datos unicamente de producción y se aclaró el formato de las columnas de fecha y tiempo.

Técnica 1: Eliminar columnas

Se decidió eliminar columnas con variables que no agregan valor al análisis de la base de datos.

produccion2 <- produccion
produccion2 <- subset (produccion2, select = -c (ID.FORM))
produccion2 <- subset (produccion2, select = -c (PRODUCTO))
produccion2 <- subset (produccion2, select = -c (HR..FIN))
produccion2 <- subset (produccion2, select = -c (ESTACION.ARRANQUE))
produccion2 <- subset (produccion2, select = -c (INICIO.SEP.UP))
produccion2 <- subset (produccion2, select = -c (FIN.INICIO.DE.SEP.UP))
produccion2 <- subset (produccion2, select = -c (INICIO.de.PROCESO))
produccion2 <- subset (produccion2, select = -c (FIN.de.PROCESO))

summary(produccion2)
##    CLIENTE          PIEZAS.PROG.        TMO..MIN.         Laminas.procesadas
##  Length:2569        Length:2569        Length:2569        Length:2569       
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##  TIEMPO.CALIDAD    
##  Length:2569       
##  Class :character  
##  Mode  :character

Técnica 2: convertir caracter

Convertimos characteres enteros a numéricos.

#install.packages("tibble")
library(tibble)
produccion2$TMO..MIN.<- as.numeric(produccion2$TMO..MIN.)
## Warning: NAs introduced by coercion
produccion2$PIEZAS.PROG.<- as.numeric(produccion2$PIEZAS.PROG.)
## Warning: NAs introduced by coercion
produccion2$TIEMPO.CALIDAD<- as.numeric(produccion2$TIEMPO.CALIDAD)
## Warning: NAs introduced by coercion
produccion2$Laminas.procesadas<- as.numeric(produccion2$Laminas.procesadas)
## Warning: NAs introduced by coercion
produccion2$CLIENTE<- as.character(produccion2$CLIENTE)

tibble(produccion2)
## # A tibble: 2,569 × 5
##    CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas TIEMPO.CALIDAD
##    <chr>          <dbl>     <dbl>              <dbl>          <dbl>
##  1 VARROC           199        15                201              1
##  2 VARROC            57        10                116              1
##  3 VARROC            68        10                 69              1
##  4 DENSO            192        15                 49              1
##  5 DENSO            192        15                 49              1
##  6 YANFENG          400        30                801              1
##  7 YANFENG           80        15                 41              1
##  8 YANFENG          104        15                 53              1
##  9 YANFENG          104        15                 53              1
## 10 YANFENG          160        20                 55              1
## # … with 2,559 more rows

Técnica 3: eliminar NAs

Se decidió realizar está técnica para asegurarnos de que no se tenga falta de datos y en caso de tenerlos evitar que estas eviten tener un analisis asertivo al no agregar valor a la base de datos.

¿Cuantos NA tengo en la base de datos?

sum(is.na(produccion2))
## [1] 2161

Cuantos NA tengo por variable?

Sapply: Para contar los NA

sapply(produccion2, function(x) sum(is.na(x)))
##            CLIENTE       PIEZAS.PROG.          TMO..MIN. Laminas.procesadas 
##                  0                164                714                661 
##     TIEMPO.CALIDAD 
##                622

Observación:Contamos con 2161 NAs, 164 en la variable de piezas programadas, 714 en tiempo mínimo, 661 en Laminas Procesadas y 622 Tiempo de Calidad.

Eliminamos NAs

produccion3<-produccion2
delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
#delete.na(produccion3)
produccion3 <- na.omit(produccion3)

summary(produccion3)
##    CLIENTE           PIEZAS.PROG.      TMO..MIN.      Laminas.procesadas
##  Length:1462        Min.   :   1.0   Min.   :  0.00   Min.   :   0.0    
##  Class :character   1st Qu.: 100.0   1st Qu.: 15.00   1st Qu.:  37.0    
##  Mode  :character   Median : 192.0   Median : 20.00   Median : 101.0    
##                     Mean   : 172.7   Mean   : 22.41   Mean   : 134.1    
##                     3rd Qu.: 200.0   3rd Qu.: 25.00   3rd Qu.: 202.0    
##                     Max.   :1200.0   Max.   :120.00   Max.   :1125.0    
##  TIEMPO.CALIDAD  
##  Min.   : 0.000  
##  1st Qu.: 1.000  
##  Median : 1.000  
##  Mean   : 1.063  
##  3rd Qu.: 1.000  
##  Max.   :22.000
sum(is.na(produccion3))
## [1] 0

Identificar variables entre cuantitativas o cualitativas y su escala de medición.

Cuantitativa: Discreta, Continua Escala de medición: Intervalo, Razón Cualitativa Escala de medición: Nominales, Ordinales

Variable<-c("`CLIENTE`","`PIEZAS.PROG.`", "` TMO..MIN.`", "` Laminas.procesadas`", "` TIEMPO.CALIDAD`")
Type<-c("Cualitativa", "Cuantitativa (discreta)","Cuantitativa (discreta)","Cuantitativa (discreta)","Cuantitativa (discreta)")
Measurement<-c("Nominal", "Razón","Razón","Razón","Razón")
table<-data.frame(Variable,Type,Measurement)

knitr::kable(table)
Variable Type Measurement
CLIENTE Cualitativa Nominal
PIEZAS.PROG. Cuantitativa (discreta) Razón
TMO..MIN. Cuantitativa (discreta) Razón
Laminas.procesadas Cuantitativa (discreta) Razón
TIEMPO.CALIDAD Cuantitativa (discreta) Razón

Gráfica cualitativa

#install.packages("plyr")
library(plyr)
pie(table(produccion3$CLIENTE))

Gráficos de Dispersión

boxplots=subset(produccion3,select=-c(CLIENTE))
boxplot(table (produccion3$CLIENTE), main = "Pedidos de Clientes", xlab = "Clientes", ylab = "Cantidad")

Propuesta

  1. Podemos darnos cuenta con la base de datos de Scrap que existe mucho scrap en la etapa de PRE-PRODUCCION. Para ello se necesita realizar una logisitca de proceso para eificente en donde si mida la cantidad exacta que se requiere de material para cada pedido y al igual que tener mejor medidas de recortes y suajes para tener el mayor provecho de los materiales.
  2. En la base de datos de Merma, analizamos como cambian los kilos que se generan por mes, y podemos ver que en Junio es donde mayor merma se genera, esto puede ser debido a que en junio tienen mayor producción, es por ello que deben de contemplar realizar un programa que midan las cantidades de pedidos que se predicen por mes y de ese modo, unicamente pedir los materiales que se requieren y podrían llegar a contratar a empleados extra para agilizar el proceso de materiales y conocer la falla en su logistica de producción por la cual se genera mucha merma.
  3. Con la base de datos de Producción, obtuvimos la información de que Stabilus 1 y DENSO, vienen siendo los clientes más fuertes y que FORM le dedica mayormente tiempo de producción a los dos clientes mencionados anteriormente. También pudimos analizar que los clientes tienen un rango de pedidos entre 50 y 200 pedidos, siendo 150 la moda. Con esta información podemos proponer el implementar KPIs de la cantidad de pedidos que se obtienen y así medir su crecimiento e implementar estrategias de marketing para hacer que ese KPI tengo cierto porcentaje de crecimiento al mes.

CONCLUSION

En esta actividad de logró analizar 3 de las bases de datos de FORM; con ello pudimos extraer información que en la base de datos puede llegar a ser más complejo de analizarlo. En este análisis logramos hacer graficos visuales para tener un mayor entendimiento de lo que la base de datos no puede decir. Extraímos información de las bases de datos, se analizo y se obtuvieron respuestas de problemas y margenes de oportunidad de crecimiento y de mejora.

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmFuZ2UiPioqRW50cmVnYSAyLjQgRk9STSoqCmF1dGhvcjogIlZhbmVzc2EgRWxpem9uZG8gLSBBMDA4Mjc2NzIiCmRhdGU6ICIyMDIyLTA5LTI4IgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogY29zbW8KICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQo8aW1nIHNyYz0gIi9Vc2Vycy92YW5lc3NhZWxpem9uZG8vRGVza3RvcC9UZWMvU2VtZXN0cmUgNy9FbnRyZWdhIDMuMS9mb3Rvcy9Mb2dvIEZPUk0uanBlZyI+IAoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmFuZ2UiPioqRk9STSAtIGJkOlNDUkFQKiogCgojIyBJbXBvcnRhciBCYXNlIGRlIGRhdG9zCmBgYHtyfQojZmlsZS5jaG9vc2UoKQpzY3JhcCA8LSByZWFkLmNzdigiL1VzZXJzL3ZhbmVzc2FlbGl6b25kby9EZXNrdG9wL1RlYy9TZW1lc3RyZSA3L0ZPUk0vQ1NWL0ZPUk0gLSBTY3JhcC5jc3YiKQpzdW1tYXJ5KHNjcmFwKQpgYGAKCiMjIE9ic2VydmFjaW9uZXMKCipTZSBoaXpvIGxpbXBpZXphIG1hbnVhbCBkZSBsYSBiYXNlIGRlIGRhdG9zIHBhcmEgc2VwYXJhciBmZWNoYSB5IGhvcmEgZW4gZGlmZXJlbnRlcyBjb2x1bW5hcyB5IHNlIGVsaW1pbmFyb24gY29sdW1uYXMgaW5uZWNlc2FyaWFzLioKCiMjIEN1YW50YXMgdmFyaWFibGVzIHkgcmVnaXN0cm9zIGhheQpgYGB7cn0Kc3RyKHNjcmFwKQpgYGAKKkNvbnRhbW9zIGNvbiA2IHZhcmlhYmxlcyB5IDI1MSBvYnNlcnZhY2lvbmVzLiogCgojIyBUw6ljbmljYXMgZGUgTGltcGllemEKCiMjIyBUw6ljbmljYSAxOiBlbGltaW5hciBOQXMKCipTZSBkZWNpZGnDsyByZWFsaXphciBlc3TDoSB0w6ljbmljYSBwYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSB0ZW5nYSBmYWx0YSBkZSBkYXRvcyB5IGVuIGNhc28gZGUgdGVuZXJsb3MgZXZpdGFyIHF1ZSBlc3RhcyBldml0ZW4gdGVuZXIgdW4gYW5hbGlzaXMgYXNlcnRpdm8gYWwgbm8gYWdyZWdhciB2YWxvciBhIGxhIGJhc2UgZGUgZGF0b3MuKgoKIyMjIyDCv0N1YW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8KYGBge3J9CnN1bShpcy5uYShzY3JhcCkpCmBgYAoKIyMjIEN1YW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPwoqKipTYXBwbHk6KiogUGFyYSBjb250YXIgbG9zIE5BKgpgYGB7cn0Kc2FwcGx5KHNjcmFwLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKCipObyBzZSBlbmN1ZW50cmFuIE5BcyBlbiBsYSBiYXNlIGRlIGRhdG9zKgoKIyMjIFTDqWNuaWNhIDI6IGVsaW1pbmFyIGNvbHVtbmFzIAoqU2UgZGVjaWTDsyByZWFsaXphciBlc3TDoSB0w6ljbmljYSBwYXJhIGRlc2hhY2Vybm9zIGRlIGluZm9ybWFjacOzbiBxdWUgbm8gZXMgbXV5IHJlbGV2YW50ZSBwYXJhIGVsIGFuw6FsaXNpcyBkZSBudWVzdHJhIGJhc2UgZGUgZGF0b3MuKgpgYGB7cn0Kc2NyYXAyIDwtIHNjcmFwCnNjcmFwMiA8LSBzdWJzZXQgKHNjcmFwMiwgc2VsZWN0ID0gLWMgKEhvcmEpKQpzY3JhcDIgPC0gc3Vic2V0IChzY3JhcDIsIHNlbGVjdCA9IC1jIChQcm9kdWN0bykpCnNjcmFwMiA8LSBzdWJzZXQgKHNjcmFwMiwgc2VsZWN0ID0gLWMgKFViaWNhY2nDs24uZGUuZGVzZWNobykpCnN1bW1hcnkoc2NyYXAyKQpgYGAKCiMjIElkZW50aWZpY2FyIHZhcmlhYmxlcyBlbnRyZSBjdWFudGl0YXRpdmFzIG8gY3VhbGl0YXRpdmFzIHkgc3UgZXNjYWxhIGRlIG1lZGljacOzbi4KCioqQ3VhbnRpdGF0aXZhOioqIERpc2NyZXRhLCBDb250aW51YQoqKkVzY2FsYSBkZSBtZWRpY2nDs246KiogSW50ZXJ2YWxvLCBSYXrDs24gCioqQ3VhbGl0YXRpdmEqKgoqKkVzY2FsYSBkZSBtZWRpY2nDs246KiogTm9taW5hbGVzLCBPcmRpbmFsZXMKYGBge3J9ClZhcmlhYmxlPC1jKCJgRmVjaGFgIiwiYENhbnRpZGFkYCIsICJgIFViaWNhY2nDs24uZGUub3JpZ2VuYCIpClR5cGU8LWMoIkN1YW50aXRhdGl2YSAoY29udGludWEpIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwiQ3VhbGl0YXRpdmEiKQpNZWFzdXJlbWVudDwtYygiUmF6w7NuIiwiUmF6w7NuIiwiTm9taW5hbCIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUsTWVhc3VyZW1lbnQpCgprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyMgQW7DoWxpc2lzIEVzdGFkw61zdGljbyBEZXNjcmlwdGl2bwpgYGB7cn0Kc3VtbWFyeShzY3JhcDIpCmBgYAoKIyMgKipUYWJsYSBkZSBGcmVjdWVuY2lhKioKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCdlcGlEaXNwbGF5JykKbGlicmFyeShlcGlEaXNwbGF5KQoKdGFiMShzY3JhcDIkVWJpY2FjacOzbi5kZS5vcmlnZW4sIHNvcnQuZ3JvdXAgPSAiZGVjcmVhc2luZyIsIGN1bS5wZXJjZW50ID0gVFJVRSkgCmBgYAoKIyMgKipHcsOhZmljYSBjdWFsaXRhdGl2YSoqCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygicGx5ciIpCmxpYnJhcnkocGx5cikKcGllKHRhYmxlKHNjcmFwMiRVYmljYWNpw7NuLmRlLm9yaWdlbikpCmBgYAoKIyMgKipHcsOhZmljYSBjdWFudGl0YXRpdmEqKgpgYGB7cn0KI3RhYmxlKHNjcmFwMiRDYW50aWRhZCxzY3JhcDIkRmVjaGEpCmJhcnBsb3QodGFibGUoc2NyYXAyJENhbnRpZGFkLHNjcmFwMiRVYmljYWNpw7NuLmRlLm9yaWdlbiksIGNvbD0ieWVsbG93IiwgbWFpbiA9ICJLaWxvcyBkZSBTY3JhcHNlZ8O6biBzdSBvcmlnZW4iLCB4bGFiID0gIk9yaWdlbiIsIHlsYWIgPSAiS2lsb3MiICkKYGBgCgojIyAqKkdyw6FmaWNvcyBkZSBEaXNwZXJzacOzbioqCgpgYGB7cn0KYm94cGxvdHM9c3Vic2V0KHNjcmFwMixzZWxlY3Q9LWMoVWJpY2FjacOzbi5kZS5vcmlnZW4pKQpib3hwbG90KHRhYmxlIChzY3JhcDIkVWJpY2FjacOzbi5kZS5vcmlnZW4pLCBtYWluID0gIlViaWNhY2nDs24gZGUgT3JpZ2VuIiwgeGxhYiA9ICJPcmlnZW4iLCB5bGFiID0gIkNhbnRpZGFkIikKYGBgCgoKIyA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmFuZ2UiPioqRk9STSAtIGJkOiBNRVJNQSoqCgpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKbWVybWEgPC0gcmVhZC5jc3YoIi9Vc2Vycy92YW5lc3NhZWxpem9uZG8vRGVza3RvcC9UZWMvU2VtZXN0cmUgNy9GT1JNL0NTVi9GT1JNIC0gTWVybWEuY3N2IikKc3VtbWFyeShtZXJtYSkKYGBgCgojIyBDdWFudGFzIHZhcmlhYmxlcyB5IHJlZ2lzdHJvcyBoYXkKYGBge3J9CnN0cihtZXJtYSkKYGBgCgoqQ29udGFtb3MgY29uIDQgdmFyaWFibGVzIHkgNjAgb2JzcnZhY2lvbmVzLiogCgojIyBUw6ljbmljYXMgZGUgTGltcGllemEKCiMjIyBUw6ljbmljYSAxOiBlbGltaW5hciBOQXMKCipTZSBkZWNpZGnDsyByZWFsaXphciBlc3TDoSB0w6ljbmljYSBwYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSB0ZW5nYSBmYWx0YSBkZSBkYXRvcyB5IGVuIGNhc28gZGUgdGVuZXJsb3MgZXZpdGFyIHF1ZSBlc3RhcyBldml0ZW4gdGVuZXIgdW4gYW5hbGlzaXMgYXNlcnRpdm8gYWwgbm8gYWdyZWdhciB2YWxvciBhIGxhIGJhc2UgZGUgZGF0b3MuKgoKIyMjIyDCv0N1YW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8KYGBge3J9CnN1bShpcy5uYShtZXJtYSkpCmBgYAoKIyMjIEN1YW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPwoqKipTYXBwbHk6KiogUGFyYSBjb250YXIgbG9zIE5BKgpgYGB7cn0Kc2FwcGx5KG1lcm1hLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQpgYGAKCioqT2JzZXJ2YWNpw7NuOioqIHRlbmVtb3MgMTAgTkFzIGVuIGxhIHZhcmlhYmxlIGRlIEZlY2hhLCBwb2RlbW9zIHZlciBxdWUgbG9zIE5BcyBzb24gZ3JhY2lhcyBhbCBhY29tb2RvIGRlIGluZm9ybWFjacOzbiBlbiBsYSBiYXNlIGRlIGRhdG9zLiAKCipEZWNpZGltb3MgYm9ycmFyIGxhIGZpbGEgZGUgdG90YWxlcyBwYXJhIGVsaW1uaW5hciBsb3MgTkFzLiogCgojIyMjIEVsaW1pbmFtb3MgTkFzCmBgYHtyfQptZXJtYTI8LW1lcm1hCmRlbGV0ZS5uYSA8LSBmdW5jdGlvbihkZiwgbj0wKSB7CiAgZGZbcm93U3Vtcyhpcy5uYShkZikpIDw9IG4sXQp9CmRlbGV0ZS5uYShtZXJtYTIpCm1lcm1hMiA8LSBuYS5vbWl0KG1lcm1hMikKCnN1bW1hcnkobWVybWEyKQpgYGAKCiMjIyBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBmZWNoYQpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoInRpYmJsZSIpCmxpYnJhcnkodGliYmxlKQptZXJtYTIkRmVjaGE8LWFzLkRhdGUobWVybWEyJEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQp0aWJibGUobWVybWEyKQpgYGAKCiMjIElkZW50aWZpY2FyIHZhcmlhYmxlcyBlbnRyZSBjdWFudGl0YXRpdmFzIG8gY3VhbGl0YXRpdmFzIHkgc3UgZXNjYWxhIGRlIG1lZGljacOzbi4KCioqQ3VhbnRpdGF0aXZhOioqIERpc2NyZXRhLCBDb250aW51YQoqKkVzY2FsYSBkZSBtZWRpY2nDs246KiogSW50ZXJ2YWxvLCBSYXrDs24gCioqQ3VhbGl0YXRpdmEqKgoqKkVzY2FsYSBkZSBtZWRpY2nDs246KiogTm9taW5hbGVzLCBPcmRpbmFsZXMKYGBge3J9ClZhcmlhYmxlPC1jKCJgRmVjaGFgIiwiYElETWVzYCIsICJgIE1lc2AiLCAiYCBLaWxvc2AiKQpUeXBlPC1jKCJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFsaXRhdGl2YSIsIkN1YWxpdGF0aXZhIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiKQpNZWFzdXJlbWVudDwtYygiUmF6w7NuIiwgIk5vbWluYWwiLCJOb21pbmFsIiwiUmF6w7NuIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxNZWFzdXJlbWVudCkKCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgKipHcsOhZmljYSBjdWFudGl0YXRpdmEqKgpgYGB7cn0KcGxvdChtZXJtYTIkRmVjaGEsbWVybWEyJEtpbG9zLCB0eXBlPSJsIixjb2w9ImJsdWUiLCB4bGFiID0iTWVzIix5bGFiID0iS2lsb3MiLCBtYWluID0gIkNhbnRpZGFkZXMgZGUga2lsb3MgcG9yIG1lcyIpCgp0YWJsZShtZXJtYTIkTWVzLCBtZXJtYTIkS2lsb3MpCmJhcnBsb3QodGFibGUobWVybWEyJEtpbG9zLCBtZXJtYTIkSURNZXMpLCBjb2w9InB1cnBsZSIsIG1haW4gPSAiQ2FudGlkYWQgZGUgS2lsb3MgcG9yIG1lcyIsIHhsYWIgPSAiSUQgTWVzIiwgeWxhYiA9ICJLaWxvcyIgKQpgYGAKCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOm9yYW5nZSI+KipGT1JNIC0gYmQ6IFBST0RVQ0NJT04qKgoKYGBge3J9CiNmaWxlLmNob29zZSgpCnByb2R1Y2Npb24gPC0gcmVhZC5jc3YoIi9Vc2Vycy92YW5lc3NhZWxpem9uZG8vRGVza3RvcC9UZWMvU2VtZXN0cmUgNy9GT1JNL0NTVi9GT1JNIC0gUHJvZHVjY2lvzIFuTGltcGlhLmNzdiIpCnN1bW1hcnkocHJvZHVjY2lvbikKYGBgCgojIyBDdWFudGFzIHZhcmlhYmxlcyB5IHJlZ2lzdHJvcyBoYXkKYGBge3J9CnN0cihwcm9kdWNjaW9uKQpgYGAKCipDb250YW1vcyBjb24gMTMgdmFyaWFibGVzIHkgMjU2OSBvYnNydmFjaW9uZXMuKiAKCiMjIFTDqWNuaWNhcyBkZSBMaW1waWV6YQoKKipPYnNlcnZhY2lvbmVzOioqIEZ1ZSBuZWNlc2FyaW8gaGFjZXIgdW5hIGxpbXBpYSBtYW51YWwgZGUgbGEgYmFzZSBkZSBkYXRvcywgc2Ugc2VsZWNjaW9uYXJvbiBsYXMgdmFyaWFibGVzIGNvbm1heW9yIHNpZ25pZmljYW5jaWEsIG5vcyBxdWVkYW1vcyBjb24gbG9zIGRhdG9zIHVuaWNhbWVudGUgZGUgcHJvZHVjY2nDs24geSBzZSBhY2xhcsOzIGVsIGZvcm1hdG8gZGUgbGFzIGNvbHVtbmFzIGRlIGZlY2hhIHkgdGllbXBvLiAKCiMjIyBUw6ljbmljYSAxOiBFbGltaW5hciBjb2x1bW5hcyAKKlNlIGRlY2lkacOzIGVsaW1pbmFyIGNvbHVtbmFzIGNvbiB2YXJpYWJsZXMgcXVlIG5vIGFncmVnYW4gdmFsb3IgYWwgYW7DoWxpc2lzIGRlIGxhIGJhc2UgZGUgZGF0b3MuKiAKYGBge3J9CnByb2R1Y2Npb24yIDwtIHByb2R1Y2Npb24KcHJvZHVjY2lvbjIgPC0gc3Vic2V0IChwcm9kdWNjaW9uMiwgc2VsZWN0ID0gLWMgKElELkZPUk0pKQpwcm9kdWNjaW9uMiA8LSBzdWJzZXQgKHByb2R1Y2Npb24yLCBzZWxlY3QgPSAtYyAoUFJPRFVDVE8pKQpwcm9kdWNjaW9uMiA8LSBzdWJzZXQgKHByb2R1Y2Npb24yLCBzZWxlY3QgPSAtYyAoSFIuLkZJTikpCnByb2R1Y2Npb24yIDwtIHN1YnNldCAocHJvZHVjY2lvbjIsIHNlbGVjdCA9IC1jIChFU1RBQ0lPTi5BUlJBTlFVRSkpCnByb2R1Y2Npb24yIDwtIHN1YnNldCAocHJvZHVjY2lvbjIsIHNlbGVjdCA9IC1jIChJTklDSU8uU0VQLlVQKSkKcHJvZHVjY2lvbjIgPC0gc3Vic2V0IChwcm9kdWNjaW9uMiwgc2VsZWN0ID0gLWMgKEZJTi5JTklDSU8uREUuU0VQLlVQKSkKcHJvZHVjY2lvbjIgPC0gc3Vic2V0IChwcm9kdWNjaW9uMiwgc2VsZWN0ID0gLWMgKElOSUNJTy5kZS5QUk9DRVNPKSkKcHJvZHVjY2lvbjIgPC0gc3Vic2V0IChwcm9kdWNjaW9uMiwgc2VsZWN0ID0gLWMgKEZJTi5kZS5QUk9DRVNPKSkKCnN1bW1hcnkocHJvZHVjY2lvbjIpCmBgYAoKIyMjIFTDqWNuaWNhIDI6IGNvbnZlcnRpciBjYXJhY3RlcgoKKkNvbnZlcnRpbW9zIGNoYXJhY3RlcmVzIGVudGVyb3MgYSBudW3DqXJpY29zLiogCmBgYHtyfQojaW5zdGFsbC5wYWNrYWdlcygidGliYmxlIikKbGlicmFyeSh0aWJibGUpCnByb2R1Y2Npb24yJFRNTy4uTUlOLjwtIGFzLm51bWVyaWMocHJvZHVjY2lvbjIkVE1PLi5NSU4uKQpwcm9kdWNjaW9uMiRQSUVaQVMuUFJPRy48LSBhcy5udW1lcmljKHByb2R1Y2Npb24yJFBJRVpBUy5QUk9HLikKcHJvZHVjY2lvbjIkVElFTVBPLkNBTElEQUQ8LSBhcy5udW1lcmljKHByb2R1Y2Npb24yJFRJRU1QTy5DQUxJREFEKQpwcm9kdWNjaW9uMiRMYW1pbmFzLnByb2Nlc2FkYXM8LSBhcy5udW1lcmljKHByb2R1Y2Npb24yJExhbWluYXMucHJvY2VzYWRhcykKcHJvZHVjY2lvbjIkQ0xJRU5URTwtIGFzLmNoYXJhY3Rlcihwcm9kdWNjaW9uMiRDTElFTlRFKQoKdGliYmxlKHByb2R1Y2Npb24yKQpgYGAKCiMjIyBUw6ljbmljYSAzOiBlbGltaW5hciBOQXMKCipTZSBkZWNpZGnDsyByZWFsaXphciBlc3TDoSB0w6ljbmljYSBwYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSB0ZW5nYSBmYWx0YSBkZSBkYXRvcyB5IGVuIGNhc28gZGUgdGVuZXJsb3MgZXZpdGFyIHF1ZSBlc3RhcyBldml0ZW4gdGVuZXIgdW4gYW5hbGlzaXMgYXNlcnRpdm8gYWwgbm8gYWdyZWdhciB2YWxvciBhIGxhIGJhc2UgZGUgZGF0b3MuKgoKIyMjIyDCv0N1YW50b3MgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8KYGBge3J9CnN1bShpcy5uYShwcm9kdWNjaW9uMikpCmBgYAoKIyMjIyBDdWFudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8KKipTYXBwbHk6KiogUGFyYSBjb250YXIgbG9zIE5BCmBgYHtyfQpzYXBwbHkocHJvZHVjY2lvbjIsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKKipPYnNlcnZhY2nDs246KipDb250YW1vcyBjb24gMjE2MSBOQXMsIDE2NCBlbiBsYSB2YXJpYWJsZSBkZSBwaWV6YXMgcHJvZ3JhbWFkYXMsIDcxNCBlbiB0aWVtcG8gbcOtbmltbywgNjYxIGVuIExhbWluYXMgUHJvY2VzYWRhcyB5IDYyMiBUaWVtcG8gZGUgQ2FsaWRhZC4gCgojIyMjIEVsaW1pbmFtb3MgTkFzCmBgYHtyfQpwcm9kdWNjaW9uMzwtcHJvZHVjY2lvbjIKZGVsZXRlLm5hIDwtIGZ1bmN0aW9uKGRmLCBuPTApIHsKICBkZltyb3dTdW1zKGlzLm5hKGRmKSkgPD0gbixdCn0KI2RlbGV0ZS5uYShwcm9kdWNjaW9uMykKcHJvZHVjY2lvbjMgPC0gbmEub21pdChwcm9kdWNjaW9uMykKCnN1bW1hcnkocHJvZHVjY2lvbjMpCnN1bShpcy5uYShwcm9kdWNjaW9uMykpCmBgYAoKIyMgSWRlbnRpZmljYXIgdmFyaWFibGVzIGVudHJlIGN1YW50aXRhdGl2YXMgbyBjdWFsaXRhdGl2YXMgeSBzdSBlc2NhbGEgZGUgbWVkaWNpw7NuLgoqKkN1YW50aXRhdGl2YToqKiBEaXNjcmV0YSwgQ29udGludWEKKipFc2NhbGEgZGUgbWVkaWNpw7NuOioqIEludGVydmFsbywgUmF6w7NuIAoqKkN1YWxpdGF0aXZhKioKKipFc2NhbGEgZGUgbWVkaWNpw7NuOioqIE5vbWluYWxlcywgT3JkaW5hbGVzCmBgYHtyfQpWYXJpYWJsZTwtYygiYENMSUVOVEVgIiwiYFBJRVpBUy5QUk9HLmAiLCAiYCBUTU8uLk1JTi5gIiwgImAgTGFtaW5hcy5wcm9jZXNhZGFzYCIsICJgIFRJRU1QTy5DQUxJREFEYCIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIikKTWVhc3VyZW1lbnQ8LWMoIk5vbWluYWwiLCAiUmF6w7NuIiwiUmF6w7NuIiwiUmF6w7NuIiwiUmF6w7NuIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxNZWFzdXJlbWVudCkKCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyAqKkdyw6FmaWNhIGN1YWxpdGF0aXZhKioKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJwbHlyIikKbGlicmFyeShwbHlyKQpwaWUodGFibGUocHJvZHVjY2lvbjMkQ0xJRU5URSkpCmBgYAoKIyMgKipHcsOhZmljb3MgZGUgRGlzcGVyc2nDs24qKgpgYGB7cn0KYm94cGxvdHM9c3Vic2V0KHByb2R1Y2Npb24zLHNlbGVjdD0tYyhDTElFTlRFKSkKYm94cGxvdCh0YWJsZSAocHJvZHVjY2lvbjMkQ0xJRU5URSksIG1haW4gPSAiUGVkaWRvcyBkZSBDbGllbnRlcyIsIHhsYWIgPSAiQ2xpZW50ZXMiLCB5bGFiID0gIkNhbnRpZGFkIikKYGBgCgojIDxzcGFuIHN0eWxlID0gImNvbG9yOnJlZCI+KipQcm9wdWVzdGEqKgoxLiBQb2RlbW9zIGRhcm5vcyBjdWVudGEgY29uIGxhIGJhc2UgZGUgZGF0b3MgZGUgKipTY3JhcCoqIHF1ZSBleGlzdGUgbXVjaG8gc2NyYXAgZW4gbGEgZXRhcGEgZGUgKipQUkUtUFJPRFVDQ0lPTioqLiBQYXJhIGVsbG8gc2UgbmVjZXNpdGEgcmVhbGl6YXIgdW5hIGxvZ2lzaXRjYSBkZSBwcm9jZXNvIHBhcmEgZWlmaWNlbnRlIGVuIGRvbmRlIHNpIG1pZGEgbGEgY2FudGlkYWQgZXhhY3RhIHF1ZSBzZSByZXF1aWVyZSBkZSBtYXRlcmlhbCBwYXJhIGNhZGEgcGVkaWRvIHkgYWwgaWd1YWwgcXVlIHRlbmVyIG1lam9yIG1lZGlkYXMgZGUgcmVjb3J0ZXMgeSBzdWFqZXMgcGFyYSB0ZW5lciBlbCBtYXlvciBwcm92ZWNobyBkZSBsb3MgbWF0ZXJpYWxlcy4gCjIuIEVuIGxhIGJhc2UgZGUgZGF0b3MgZGUgKipNZXJtYSoqLCBhbmFsaXphbW9zIGNvbW8gY2FtYmlhbiBsb3Mga2lsb3MgcXVlIHNlIGdlbmVyYW4gcG9yIG1lcywgeSBwb2RlbW9zIHZlciBxdWUgZW4gKipKdW5pbyoqIGVzIGRvbmRlIG1heW9yIG1lcm1hIHNlIGdlbmVyYSwgZXN0byBwdWVkZSBzZXIgZGViaWRvIGEgcXVlIGVuIGp1bmlvIHRpZW5lbiBtYXlvciBwcm9kdWNjacOzbiwgZXMgcG9yIGVsbG8gcXVlIGRlYmVuIGRlIGNvbnRlbXBsYXIgcmVhbGl6YXIgdW4gcHJvZ3JhbWEgcXVlIG1pZGFuIGxhcyBjYW50aWRhZGVzIGRlIHBlZGlkb3MgcXVlIHNlIHByZWRpY2VuIHBvciBtZXMgeSBkZSBlc2UgbW9kbywgdW5pY2FtZW50ZSBwZWRpciBsb3MgbWF0ZXJpYWxlcyBxdWUgc2UgcmVxdWllcmVuIHkgcG9kcsOtYW4gbGxlZ2FyIGEgY29udHJhdGFyIGEgZW1wbGVhZG9zIGV4dHJhIHBhcmEgYWdpbGl6YXIgZWwgcHJvY2VzbyBkZSBtYXRlcmlhbGVzIHkgY29ub2NlciBsYSBmYWxsYSBlbiBzdSBsb2dpc3RpY2EgZGUgcHJvZHVjY2nDs24gcG9yIGxhIGN1YWwgc2UgZ2VuZXJhIG11Y2hhIG1lcm1hLiAKMy4gQ29uIGxhIGJhc2UgZGUgZGF0b3MgZGUgKipQcm9kdWNjacOzbioqLCBvYnR1dmltb3MgbGEgaW5mb3JtYWNpw7NuIGRlIHF1ZSBTdGFiaWx1cyAxIHkgREVOU08sIHZpZW5lbiBzaWVuZG8gbG9zIGNsaWVudGVzIG3DoXMgZnVlcnRlcyB5IHF1ZSBGT1JNIGxlIGRlZGljYSBtYXlvcm1lbnRlIHRpZW1wbyBkZSBwcm9kdWNjacOzbiBhIGxvcyBkb3MgY2xpZW50ZXMgbWVuY2lvbmFkb3MgYW50ZXJpb3JtZW50ZS4gVGFtYmnDqW4gcHVkaW1vcyBhbmFsaXphciBxdWUgbG9zIGNsaWVudGVzIHRpZW5lbiB1biByYW5nbyBkZSBwZWRpZG9zIGVudHJlIDUwIHkgMjAwIHBlZGlkb3MsIHNpZW5kbyAxNTAgbGEgbW9kYS4gQ29uIGVzdGEgaW5mb3JtYWNpw7NuIHBvZGVtb3MgcHJvcG9uZXIgZWwgKippbXBsZW1lbnRhciBLUElzKiogZGUgbGEgY2FudGlkYWQgZGUgcGVkaWRvcyBxdWUgc2Ugb2J0aWVuZW4geSBhc8OtIG1lZGlyIHN1IGNyZWNpbWllbnRvIGUgaW1wbGVtZW50YXIgZXN0cmF0ZWdpYXMgZGUgbWFya2V0aW5nIHBhcmEgaGFjZXIgcXVlIGVzZSBLUEkgdGVuZ28gY2llcnRvIHBvcmNlbnRhamUgZGUgY3JlY2ltaWVudG8gYWwgbWVzLiAKCiMgIDxzcGFuIHN0eWxlID0gImNvbG9yOnJlZCI+KipDT05DTFVTSU9OKioKRW4gZXN0YSBhY3RpdmlkYWQgZGUgbG9ncsOzIGFuYWxpemFyIDMgZGUgbGFzIGJhc2VzIGRlIGRhdG9zIGRlIEZPUk07IGNvbiBlbGxvIHB1ZGltb3MgZXh0cmFlciBpbmZvcm1hY2nDs24gcXVlIGVuIGxhIGJhc2UgZGUgZGF0b3MgcHVlZGUgbGxlZ2FyIGEgc2VyIG3DoXMgY29tcGxlam8gZGUgYW5hbGl6YXJsby4gRW4gZXN0ZSBhbsOhbGlzaXMgbG9ncmFtb3MgaGFjZXIgZ3JhZmljb3MgdmlzdWFsZXMgcGFyYSB0ZW5lciB1biBtYXlvciBlbnRlbmRpbWllbnRvIGRlIGxvIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIG5vIHB1ZWRlIGRlY2lyLiBFeHRyYcOtbW9zIGluZm9ybWFjacOzbiBkZSBsYXMgYmFzZXMgZGUgZGF0b3MsIHNlIGFuYWxpem8geSBzZSBvYnR1dmllcm9uIHJlc3B1ZXN0YXMgZGUgcHJvYmxlbWFzIHkgbWFyZ2VuZXMgZGUgb3BvcnR1bmlkYWQgZGUgY3JlY2ltaWVudG8geSBkZSBtZWpvcmEuIAoKCg==