Emilio Olvera A01625200

Mayra Campoy Ramos A00226914

Ximena Gutierrez Briseño A00829505

Mariana Ulloa Encinas A01253076

Héctor Javier Villarreal A01570227

Recursos Humanos

Antes de importar la base de datos, se optó por:
1. Crear una columna de “Edad”.
2. Agregar “0” en los espacios en blanco.

Importar las bases de datos

# file.choose()
recursos_humanos <- read.csv("/Users/mayracampoyramos/Desktop/Analisis de Datos Concentracion/Reto/FORM - Recursos Humanos (2).csv")

¿Cuántas variables y cuantos registros tiene la base de datos?

# Instalar librerias

# install.packages("dplyr")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# install.packages("psych")
library(psych)

#Sacar número de variables:
describeData(recursos_humanos,head=1,tail=1)
## n.obs =  113 of which  113   are complete cases.   Number of variables =  29  of which all are numeric  FALSE  
##                        variable # n.obs type                    H1
## No..De.Empleado                 1   113    1                     1
## APELLIDOS*                      2   113    3     MARTINEZ DE LOERA
## NOMBRE*                         3   113    3               NICOLAS
## FECHA.DE.NACIMIENTO*            4   113    3            10/09/1955
## EDAD                            5   113    1                    67
## GENERO*                         6   113    3             MASCULINO
## RFC*                            7   113    3         MALN550910338
## FECHA.DE.ALTA*                  8   113    3            01/07/2010
## Primer.mes*                     9   113    3            31/07/2010
## X4to.mes*                      10   113    3            29/10/2010
## BAJA                           11   113    1                     0
## PUESTO*                        12   113    3  Supervisor de Máquin
## DEPARTAMENTO*                  13   113    3 Produccion Cartón MDL
## NO.SEGURO.SOCIAL*              14   113    3           43745527937
## SALARIO.DIARIO.IMSS            15   113    1                176.72
## FACTOR.CRED.INFONAVIT*         16   113    3                     0
## N..CREDITO.INFONAVIT*          17   113    3                     0
## LUGAR.DE.NACIMIENTO*           18   113    3                     0
## CURP*                          19   113    3    MALN550910HZSRRC09
## CALLE*                         20   113    3           JOSE I LUGO
## NUMERO.INTERNO*                21   113    3                     0
## COLONIA*                       22   113    3        UNIDAD LABORAL
## MUNICIPIO*                     23   113    3  SAN NICOLAS DE LOS G
## ESTADO*                        24   113    3            Nuevo León
## CODIGO.POSTAL                  25   113    1                 66440
## ESTADO.CIVIL*                  26   113    3               Soltero
## TARJETA....CUENTA*             27   113    3               BANORTE
## X0                             28   113    1                     0
## X0.1                           29   113    1                     0
##                                           T1
## No..De.Empleado                            0
## APELLIDOS*                    VAZQUEZ GAYTAN
## NOMBRE*                                SOFIA
## FECHA.DE.NACIMIENTO*              18/09/1972
## EDAD                                      50
## GENERO*                             FEMENINO
## RFC*                           VAGS720918SKA
## FECHA.DE.ALTA*                    23/08/2022
## Primer.mes*                       23/09/2022
## X4to.mes*                         23/12/2022
## BAJA                                       0
## PUESTO*                     AYUDANTE GENERAL
## DEPARTAMENTO*                              0
## NO.SEGURO.SOCIAL*                47907208715
## SALARIO.DIARIO.IMSS                   180.68
## FACTOR.CRED.INFONAVIT*                   N/A
## N..CREDITO.INFONAVIT*                    N/A
## LUGAR.DE.NACIMIENTO*   MONTERREY, NUEVO LEON
## CURP*                     VAGS720918MNLZYF00
## CALLE*                               FRANCIA
## NUMERO.INTERNO*                         1109
## COLONIA*                      VIVIENDA DIGNA
## MUNICIPIO*                           APODACA
## ESTADO*                           NUEVO LEON
## CODIGO.POSTAL                          66647
## ESTADO.CIVIL*                         CASADA
## TARJETA....CUENTA*                   BANORTE
## X0                                         0
## X0.1                                       0
#R: Existen 29 variables.

#Sacar número de registros totales en la base de datos:

#R: Existen 113 registros por columna, siendo asi 3,277 registros totales en la base de datos.

Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Elige la escala de medición de cada variable.

Variable<-c("No..De.Empleado","APELLIDOS","NOMBRE","FECHA.DE.NACIMIENTO", "EDAD", "GENERO", "RFC", "FECHA.DE.ALTA", "Primer.mes", "X4to.mes", "BAJA", "PUESTO", "DEPARTAMENTO", "NO.SEGURO.SOCIAL", "SALARIO.DIARIO.IMSS", "FACTOR.CRED.INFONAVIT", "N..CREDITO.INFONAVIT", "LUGAR.DE.NACIMIENTO", "CURP", "CALLE", "NUMERO.INTERNO", "COLONIA", "MUNICIPIO", "ESTADO", "CODIGO.POSTAL", "ESTADO.CIVIL", "TARJETA....CUENTA", "X", "X.1")
Type<-c("Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa(discreta)", "Cualitativa", "Cualitativa",  "Cualitativa", "Cuanlitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (continua)", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa")
Measurement <-c("NA", "NA", "NA", "NA", "Años", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "Moneda Mexicana", "NA", "NA", "NA", "NA", "NA", "NA","NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA")
table<-data.frame(Variable,Type, Measurement)
knitr::kable(table)
Variable Type Measurement
No..De.Empleado Cualitativa NA
APELLIDOS Cualitativa NA
NOMBRE Cualitativa NA
FECHA.DE.NACIMIENTO Cualitativa NA
EDAD Cuantitativa(discreta) Años
GENERO Cualitativa NA
RFC Cualitativa NA
FECHA.DE.ALTA Cualitativa NA
Primer.mes Cuanlitativa NA
X4to.mes Cualitativa NA
BAJA Cualitativa NA
PUESTO Cualitativa NA
DEPARTAMENTO Cualitativa NA
NO.SEGURO.SOCIAL Cualitativa NA
SALARIO.DIARIO.IMSS Cuantitativa (continua) Moneda Mexicana
FACTOR.CRED.INFONAVIT Cualitativa NA
N..CREDITO.INFONAVIT Cualitativa NA
LUGAR.DE.NACIMIENTO Cualitativa NA
CURP Cualitativa NA
CALLE Cualitativa NA
NUMERO.INTERNO Cualitativa NA
COLONIA Cualitativa NA
MUNICIPIO Cualitativa NA
ESTADO Cualitativa NA
CODIGO.POSTAL Cualitativa NA
ESTADO.CIVIL Cualitativa NA
TARJETA….CUENTA Cualitativa NA
X Cualitativa NA
X.1 Cualitativa NA

Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Entender la base de datos

summary(recursos_humanos)
##  No..De.Empleado   APELLIDOS            NOMBRE          FECHA.DE.NACIMIENTO
##  Min.   :  0.00   Length:113         Length:113         Length:113         
##  1st Qu.:  8.00   Class :character   Class :character   Class :character   
##  Median : 38.00   Mode  :character   Mode  :character   Mode  :character   
##  Mean   : 46.31                                                            
##  3rd Qu.: 72.00                                                            
##  Max.   :148.00                                                            
##       EDAD          GENERO              RFC            FECHA.DE.ALTA     
##  Min.   : 1.00   Length:113         Length:113         Length:113        
##  1st Qu.:26.00   Class :character   Class :character   Class :character  
##  Median :33.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :35.98                                                           
##  3rd Qu.:45.00                                                           
##  Max.   :73.00                                                           
##   Primer.mes          X4to.mes              BAJA           PUESTO         
##  Length:113         Length:113         Min.   :0.0000   Length:113        
##  Class :character   Class :character   1st Qu.:0.0000   Class :character  
##  Mode  :character   Mode  :character   Median :0.0000   Mode  :character  
##                                        Mean   :0.3451                     
##                                        3rd Qu.:0.0000                     
##                                        Max.   :3.0000                     
##  DEPARTAMENTO       NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS
##  Length:113         Length:113         Min.   :1.440e+02  
##  Class :character   Class :character   1st Qu.:1.770e+02  
##  Mode  :character   Mode  :character   Median :1.810e+02  
##                                        Mean   :1.346e+07  
##                                        3rd Qu.:1.810e+02  
##                                        Max.   :1.517e+09  
##  FACTOR.CRED.INFONAVIT N..CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO
##  Length:113            Length:113           Length:113         
##  Class :character      Class :character     Class :character   
##  Mode  :character      Mode  :character     Mode  :character   
##                                                                
##                                                                
##                                                                
##      CURP              CALLE           NUMERO.INTERNO       COLONIA         
##  Length:113         Length:113         Length:113         Length:113        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##   MUNICIPIO            ESTADO          CODIGO.POSTAL   ESTADO.CIVIL      
##  Length:113         Length:113         Min.   :25016   Length:113        
##  Class :character   Class :character   1st Qu.:66640   Class :character  
##  Mode  :character   Mode  :character   Median :66646   Mode  :character  
##                                        Mean   :63365                     
##                                        3rd Qu.:66649                     
##                                        Max.   :67493                     
##  TARJETA....CUENTA        X0         X0.1  
##  Length:113         Min.   :0   Min.   :0  
##  Class :character   1st Qu.:0   1st Qu.:0  
##  Mode  :character   Median :0   Median :0  
##                     Mean   :0   Mean   :0  
##                     3rd Qu.:0   3rd Qu.:0  
##                     Max.   :0   Max.   :0

Observaciones

1. Las variables de “NUMERO.INTERNO” y “NO.SEGURO.SOCIAL” sale en formato de caracter.
2. No nos sirven VARIAS variables: “RFC”, “Primer.mes”, “X4to.mes”, etc.
3. Hay muchos NA´s
4. Hay dos columnas sin nada: “X” y “X.1”.
5. Hay un salario de 1 millón y de 400mil, lo que se puede reemplazar por la media de los salarios.

Técnica 1: Eliminar columnas.

recursos_humanos <- subset(recursos_humanos,select = -c (FECHA.DE.NACIMIENTO, RFC, Primer.mes, X4to.mes, NO.SEGURO.SOCIAL, FACTOR.CRED.INFONAVIT, N..CREDITO.INFONAVIT, CALLE, NUMERO.INTERNO, COLONIA, TARJETA....CUENTA, X0, X0.1))

Técnica 2. Reemplazar por el promedio de los salarios los salarios correspondientes a 1 millón y 400mil.

recursos_humanos <- recursos_humanos[order(recursos_humanos$SALARIO.DIARIO.IMSS),]
tail(recursos_humanos$SALARIO.DIARIO.IMSS, n= 2)
## [1]    4413757 1516728571
recursos_humanos <- recursos_humanos[recursos_humanos$SALARIO.DIARIO.IMSS > 0, ]

recursos_humanos$SALARIO.DIARIO.IMSS[recursos_humanos$SALARIO.DIARIO.IMSS > 4413756] <- median(recursos_humanos$SALARIO.DIARIO.IMSS, na.rm = TRUE)
summary(recursos_humanos)
##  No..De.Empleado   APELLIDOS            NOMBRE               EDAD      
##  Min.   :  0.00   Length:113         Length:113         Min.   : 1.00  
##  1st Qu.:  8.00   Class :character   Class :character   1st Qu.:26.00  
##  Median : 38.00   Mode  :character   Mode  :character   Median :33.00  
##  Mean   : 46.31                                         Mean   :35.98  
##  3rd Qu.: 72.00                                         3rd Qu.:45.00  
##  Max.   :148.00                                         Max.   :73.00  
##     GENERO          FECHA.DE.ALTA           BAJA           PUESTO         
##  Length:113         Length:113         Min.   :0.0000   Length:113        
##  Class :character   Class :character   1st Qu.:0.0000   Class :character  
##  Mode  :character   Mode  :character   Median :0.0000   Mode  :character  
##                                        Mean   :0.3451                     
##                                        3rd Qu.:0.0000                     
##                                        Max.   :3.0000                     
##  DEPARTAMENTO       SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO     CURP          
##  Length:113         Min.   :144.4       Length:113          Length:113        
##  Class :character   1st Qu.:176.7       Class :character    Class :character  
##  Mode  :character   Median :180.7       Mode  :character    Mode  :character  
##                     Mean   :179.1                                             
##                     3rd Qu.:180.7                                             
##                     Max.   :337.1                                             
##   MUNICIPIO            ESTADO          CODIGO.POSTAL   ESTADO.CIVIL      
##  Length:113         Length:113         Min.   :25016   Length:113        
##  Class :character   Class :character   1st Qu.:66640   Class :character  
##  Mode  :character   Mode  :character   Median :66646   Mode  :character  
##                                        Mean   :63365                     
##                                        3rd Qu.:66649                     
##                                        Max.   :67493
#Exportar base de datos
write.csv(recursos_humanos, file = "recursos_humanos_limpia_buena.csv", row.names = FALSE)

Delivery Plan

Importar base de datos

# file.choose()
bd <- read.csv("/Users/mayracampoyramos/Desktop/Analisis de Datos Concentracion/Reto/FORM - Delivery Plan.xlsx - DELIVERY PLAN.csv")

¿Cuántas variables y cuantos registros tiene la base de datos?

str(bd)
## 'data.frame':    231 obs. of  26 variables:
##  $ CLIENTE.PLANTA: chr  "STB3" "STB4" "STB5" "STB6" ...
##  $ PROYECTO      : chr  "CANASTILLA GRIS" "Caja inter chica" "CHAROLA G09" "" ...
##  $ ID.ODOO       : chr  "15.785" "" "19.12" "19.211" ...
##  $ ITEM          : chr  "CABLE SET CAJA BACK UP CANASTILLA" "Caja intercompañía chica" "CHAROLA G09 915898  " "MOTOR GEAR BOX" ...
##  $ JUNIO         : int  0 0 0 0 0 0 0 0 0 192 ...
##  $ JULIO         : int  140 0 0 0 0 300 0 0 0 463 ...
##  $ AGOSTO        : int  530 0 0 0 0 0 0 50 0 226 ...
##  $ SEPTIEMBRE    : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ OCTUBRE       : int  200 0 0 0 0 0 0 0 0 0 ...
##  $ NOVIEMBRE     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DICIEMBRE     : int  150 184 75 1 0 0 9 0 0 0 ...
##  $ ENE.22        : int  230 125 126 0 0 0 0 0 0 0 ...
##  $ FEBRERO.22    : int  500 55 10 1 0 0 0 0 0 0 ...
##  $ MARZO.22      : int  0 55 5 0 0 0 0 0 0 0 ...
##  $ ABRIL.22      : int  0 0 0 1 0 400 0 0 0 0 ...
##  $ MAYO.22       : int  0 0 15 3 0 0 0 0 0 0 ...
##  $ JUNIO.22      : int  200 0 5 2 100 0 0 0 0 0 ...
##  $ JULIO.22      : int  900 0 10 5 100 0 0 0 0 0 ...
##  $ AGOSTO.22     : int  1000 0 0 3 0 0 0 0 0 0 ...
##  $ SEPTIEMBRE.22 : int  0 0 5 4 0 0 0 0 0 0 ...
##  $ OCTUBRE.22    : int  0 0 50 6 0 0 0 0 0 0 ...
##  $ NOVIEMBRE.22  : int  0 0 125 7 0 0 0 0 0 0 ...
##  $ DICIEMBRE.22  : int  0 0 0 7 0 0 0 0 0 0 ...
##  $ ENERO.23      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ FEBRERO.23    : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ MARZO.23      : int  0 0 0 0 0 0 0 0 0 0 ...
summary(bd)
##  CLIENTE.PLANTA       PROYECTO           ID.ODOO              ITEM          
##  Length:231         Length:231         Length:231         Length:231        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##      JUNIO             JULIO             AGOSTO          SEPTIEMBRE  
##  Min.   :   0.00   Min.   :    0.0   Min.   :   0.00   Min.   :   0  
##  1st Qu.:   0.00   1st Qu.:    0.0   1st Qu.:   0.00   1st Qu.:   0  
##  Median :   0.00   Median :    0.0   Median :   0.00   Median :   0  
##  Mean   :  29.06   Mean   :  135.9   Mean   :  77.45   Mean   :  81  
##  3rd Qu.:   0.00   3rd Qu.:    0.0   3rd Qu.:   0.00   3rd Qu.:   0  
##  Max.   :1280.00   Max.   :13120.0   Max.   :3200.00   Max.   :3200  
##     OCTUBRE         NOVIEMBRE         DICIEMBRE          ENE.22       
##  Min.   :   0.0   Min.   :   0.00   Min.   :   0.0   Min.   :   0.00  
##  1st Qu.:   0.0   1st Qu.:   0.00   1st Qu.:   0.0   1st Qu.:   0.00  
##  Median :   0.0   Median :   0.00   Median :   0.0   Median :   0.00  
##  Mean   :  62.0   Mean   :  89.69   Mean   : 100.4   Mean   :  82.37  
##  3rd Qu.:  11.5   3rd Qu.:   4.00   3rd Qu.:   1.5   3rd Qu.:  26.50  
##  Max.   :3200.0   Max.   :6400.00   Max.   :6400.0   Max.   :3200.00  
##    FEBRERO.22        MARZO.22         ABRIL.22          MAYO.22       
##  Min.   :   0.0   Min.   :   0.0   Min.   :    0.0   Min.   :    0.0  
##  1st Qu.:   0.0   1st Qu.:   0.0   1st Qu.:    0.0   1st Qu.:    0.0  
##  Median :   0.0   Median :   0.0   Median :    0.0   Median :    0.0  
##  Mean   : 103.5   Mean   : 153.9   Mean   :  186.5   Mean   :  187.6  
##  3rd Qu.:   0.0   3rd Qu.:  20.0   3rd Qu.:   24.0   3rd Qu.:   22.0  
##  Max.   :9600.0   Max.   :9600.0   Max.   :16354.0   Max.   :17665.0  
##     JUNIO.22          JULIO.22         AGOSTO.22       SEPTIEMBRE.22    
##  Min.   :    0.0   Min.   :    0.0   Min.   :    0.0   Min.   :    0.0  
##  1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0   1st Qu.:    0.0  
##  Median :    0.0   Median :    0.0   Median :    0.0   Median :    0.0  
##  Mean   :  171.2   Mean   :  316.9   Mean   :  131.5   Mean   :  272.3  
##  3rd Qu.:    1.0   3rd Qu.:   15.5   3rd Qu.:    0.0   3rd Qu.:    0.0  
##  Max.   :11050.0   Max.   :25900.0   Max.   :13200.0   Max.   :29379.0  
##    OCTUBRE.22       NOVIEMBRE.22      DICIEMBRE.22        ENERO.23       
##  Min.   :    0.0   Min.   :  0.000   Min.   :  0.000   Min.   :  0.0000  
##  1st Qu.:    0.0   1st Qu.:  0.000   1st Qu.:  0.000   1st Qu.:  0.0000  
##  Median :    0.0   Median :  0.000   Median :  0.000   Median :  0.0000  
##  Mean   :  120.9   Mean   :  2.113   Mean   :  1.225   Mean   :  0.5974  
##  3rd Qu.:    0.0   3rd Qu.:  0.000   3rd Qu.:  0.000   3rd Qu.:  0.0000  
##  Max.   :16421.0   Max.   :324.000   Max.   :276.000   Max.   :138.0000  
##    FEBRERO.23    MARZO.23
##  Min.   :0    Min.   :0  
##  1st Qu.:0    1st Qu.:0  
##  Median :0    Median :0  
##  Mean   :0    Mean   :0  
##  3rd Qu.:0    3rd Qu.:0  
##  Max.   :0    Max.   :0
# 231 Registros Y 26 Variables

Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Elige la escala de medición de cada variable.

variable <-c("CLIENTE.PLANTA,", "PROYECTO", "ID.0D00", "ITEM", "ENE.22", "FEBRERO.22", "MARZO.22", "ABRIL.22", "MAYO.22", "JUNIO.22", "JULIO.22", "AGOSTO.22", "SEPTIEMBRE.22", "OCTUBRE.22", "NOVIEMBRE.22", "DICIEMBRE.22", "ENERO.23", "FEBRERO.23", "MARZO.23")
Measurment <-c("CUALITATIVE", "CUALITATIVE", "CUALITATIVE", "CUALITATIVE", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)", "CUANTITATIVE (DISCRETE)")
Scale <-c("NOMINAL", "NOMINAL", "NOMINAL", "NOMINAL", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON", "RAZON")

clasificacion <- data.frame(variable, Measurment, Scale)
clasificacion
##           variable              Measurment   Scale
## 1  CLIENTE.PLANTA,             CUALITATIVE NOMINAL
## 2         PROYECTO             CUALITATIVE NOMINAL
## 3          ID.0D00             CUALITATIVE NOMINAL
## 4             ITEM             CUALITATIVE NOMINAL
## 5           ENE.22 CUANTITATIVE (DISCRETE)   RAZON
## 6       FEBRERO.22 CUANTITATIVE (DISCRETE)   RAZON
## 7         MARZO.22 CUANTITATIVE (DISCRETE)   RAZON
## 8         ABRIL.22 CUANTITATIVE (DISCRETE)   RAZON
## 9          MAYO.22 CUANTITATIVE (DISCRETE)   RAZON
## 10        JUNIO.22 CUANTITATIVE (DISCRETE)   RAZON
## 11        JULIO.22 CUANTITATIVE (DISCRETE)   RAZON
## 12       AGOSTO.22 CUANTITATIVE (DISCRETE)   RAZON
## 13   SEPTIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 14      OCTUBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 15    NOVIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 16    DICIEMBRE.22 CUANTITATIVE (DISCRETE)   RAZON
## 17        ENERO.23 CUANTITATIVE (DISCRETE)   RAZON
## 18      FEBRERO.23 CUANTITATIVE (DISCRETE)   RAZON
## 19        MARZO.23 CUANTITATIVE (DISCRETE)   RAZON

Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Técnica 1: Eliminar NA

sum(is.na(bd))
## [1] 0
sapply(bd,function(x) sum(is.na(x)))
## CLIENTE.PLANTA       PROYECTO        ID.ODOO           ITEM          JUNIO 
##              0              0              0              0              0 
##          JULIO         AGOSTO     SEPTIEMBRE        OCTUBRE      NOVIEMBRE 
##              0              0              0              0              0 
##      DICIEMBRE         ENE.22     FEBRERO.22       MARZO.22       ABRIL.22 
##              0              0              0              0              0 
##        MAYO.22       JUNIO.22       JULIO.22      AGOSTO.22  SEPTIEMBRE.22 
##              0              0              0              0              0 
##     OCTUBRE.22   NOVIEMBRE.22   DICIEMBRE.22       ENERO.23     FEBRERO.23 
##              0              0              0              0              0 
##       MARZO.23 
##              0
#Hallazgos: No se encontraron datos con denominacón NA, ya que todos fueron reemplazados con 0 

Técnica 2: Eliminar columnas.

#Eliminar 2021
bd1 <- bd
bd1 <- subset (bd, select = -c (JUNIO, JULIO, AGOSTO, SEPTIEMBRE, OCTUBRE, NOVIEMBRE, DICIEMBRE))

#Exportar base de datos
write.csv(bd1, file = "delivery_plan.csv", row.names = FALSE)

Delivery Performance

Importar base de datos

# file.choose()
bd <- read.csv("/Users/mayracampoyramos/Desktop/Analisis de Datos Concentracion/Reto/FORM - Delivery Performance.csv")
bd <- na.omit(bd)

¿Cuántas variables y cuantos registros tiene la base de datos?

# Tiene 1440 obs. y 8 variables
str(bd)
## 'data.frame':    1440 obs. of  8 variables:
##  $ Target        : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ Vueltas       : int  1 1 2 3 1 1 2 3 1 1 ...
##  $ Plan.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.departure: num  19.3 8.55 10 21 0 0 0 0 18.1 9 ...
##  $ Diference     : num  3.3 0.55 1 1 0 0 0 0 2.1 1 ...
##  $ Date          : chr  "02/01/22" "02/01/22" "02/01/22" "02/01/22" ...
summary(bd)
##      Target    Cliente             Vueltas      Plan.arrival   
##  Min.   :1   Length:1440        Min.   :1.00   Min.   : 0.000  
##  1st Qu.:1   Class :character   1st Qu.:1.00   1st Qu.: 0.000  
##  Median :1   Mode  :character   Median :1.50   Median : 4.000  
##  Mean   :1                      Mean   :1.75   Mean   : 6.625  
##  3rd Qu.:1                      3rd Qu.:2.25   3rd Qu.:10.750  
##  Max.   :1                      Max.   :3.00   Max.   :20.000  
##   Real.arrival    Real.departure     Diference            Date          
##  Min.   : 0.000   Min.   : 0.000   Min.   :-14.3500   Length:1440       
##  1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.:  0.0000   Class :character  
##  Median : 0.000   Median : 0.000   Median :  0.0000   Mode  :character  
##  Mean   : 3.823   Mean   : 4.142   Mean   :  0.3155                     
##  3rd Qu.: 8.000   3rd Qu.: 9.000   3rd Qu.:  0.8000                     
##  Max.   :23.500   Max.   :24.500   Max.   : 20.0000

Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Elige la escala de medición de cada variable.

Variable<-c("`Target`","`Cliente`","`Vueltas`","`Plan.arrival`","`Real.arrival`","`Real.departure`","`Diference`","`Date`")
Type<-c("quantiative (discrete)", "quantiative (continous)", "quantitative (continous)", "quantitative (continous)")
escalas <- c("intervalo", "nominal", "razon", "razon", "razon", "razon", "razon", "ordinal")
table <- data.frame (Variable, Type, escalas)
knitr::kable(table)
Variable Type escalas
Target quantiative (discrete) intervalo
Cliente quantiative (continous) nominal
Vueltas quantitative (continous) razon
Plan.arrival quantitative (continous) razon
Real.arrival quantiative (discrete) razon
Real.departure quantiative (continous) razon
Diference quantitative (continous) razon
Date quantitative (continous) ordinal

Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Técnica 1: Metodo Estadistico

bd2<-bd
boxplot(bd2$Plan.arrival, horizontal=TRUE)

boxplot(bd2$Real.arrival, horizontal=TRUE)

boxplot(bd2$Real.departure, horizontal=TRUE)

# El uso de este metodo por que se queria observar graficamente como es que los tiempos de llegada se ven afectado

Técnica 2: Eliminar columnas.

bd2<-bd
bd2 <- subset(bd2, select =-c (Target))

# El uso de este metodo  por que en la parte de Target solo aparecia el numero 1 en todas las columnas entonces ese dato me parecia innecesario

#Exportar base de datos
write.csv(bd2, file = "delivery_performance.csv", row.names = FALSE)

Base de Datos Externa

Importar base de datos

# file.choose()
bd_externa <-read.csv("/Users/mayracampoyramos/Desktop/Analisis de Datos Concentracion/Reto/Producción de cartón en México 1.csv")

¿Cuántas variables y cuantos registros tiene la base de datos?

resumen <- summary(bd_externa)
resumen
##     State.ID        State               Region      Industry.Group.ID
##  Min.   : 1.00   Length:999         Min.   :1.000   Min.   :3221     
##  1st Qu.:10.75   Class :character   1st Qu.:1.000   1st Qu.:3221     
##  Median :18.00   Mode  :character   Median :2.000   Median :3221     
##  Mean   :17.62                      Mean   :2.333   Mean   :3221     
##  3rd Qu.:25.25                      3rd Qu.:3.000   3rd Qu.:3221     
##  Max.   :31.00                      Max.   :4.000   Max.   :3221     
##  NA's   :975                        NA's   :975     NA's   :975      
##  Industry.Group     Economic.Unit   
##  Length:999         Min.   :  1.00  
##  Class :character   1st Qu.:  1.75  
##  Mode  :character   Median :  5.00  
##                     Mean   : 13.17  
##                     3rd Qu.:  8.75  
##                     Max.   :151.00  
##                     NA's   :975
str(bd_externa)
## 'data.frame':    999 obs. of  6 variables:
##  $ State.ID         : int  1 2 5 8 9 10 11 13 14 15 ...
##  $ State            : chr  "Aguascalientes" "Baja California" "Coahuila de Zaragoza" "Chihuahua" ...
##  $ Region           : int  2 1 1 1 3 2 2 3 2 3 ...
##  $ Industry.Group.ID: int  3221 3221 3221 3221 3221 3221 3221 3221 3221 3221 ...
##  $ Industry.Group   : chr  "Fabricacion de Pulpa, Papel y Carton" "Fabricacion de Pulpa, Papel y Carton" "Fabricacion de Pulpa, Papel y Carton" "Fabricacion de Pulpa, Papel y Carton" ...
##  $ Economic.Unit    : int  1 8 1 6 17 2 11 3 13 43 ...

Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Elige la escala de medición de cada variable.

Variable<-c("State.ID","State","Region","Industry.Group.ID","Industry.Group", "Economic.Unit")
Type<-c("qualitative", "qualitative", "qualitative","qualitative", "qualitative", "quantitative (discreta)")
Measurement<-c("NA","NA","NA","NA", "NA","cartón producido")
table<-data.frame(Variable,Type,Measurement)
knitr::kable(table)
Variable Type Measurement
State.ID qualitative NA
State qualitative NA
Region qualitative NA
Industry.Group.ID qualitative NA
Industry.Group qualitative NA
Economic.Unit quantitative (discreta) cartón producido

Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Técnica 1: Remover valores irrelevantes, columna inecesaria “Industry.Group.ID” no me aporta datos importantes

bd1 <- bd_externa
bd1 <- subset (bd1,select = -c(Industry.Group.ID))

summary(bd1)
##     State.ID        State               Region      Industry.Group    
##  Min.   : 1.00   Length:999         Min.   :1.000   Length:999        
##  1st Qu.:10.75   Class :character   1st Qu.:1.000   Class :character  
##  Median :18.00   Mode  :character   Median :2.000   Mode  :character  
##  Mean   :17.62                      Mean   :2.333                     
##  3rd Qu.:25.25                      3rd Qu.:3.000                     
##  Max.   :31.00                      Max.   :4.000                     
##  NA's   :975                        NA's   :975                       
##  Economic.Unit   
##  Min.   :  1.00  
##  1st Qu.:  1.75  
##  Median :  5.00  
##  Mean   : 13.17  
##  3rd Qu.:  8.75  
##  Max.   :151.00  
##  NA's   :975

Técnica 2: Remover NA, la base de datos viene con espacios vacios

#?Cuantos NA tengo en la base de datos?
sum(is.na(bd1))
## [1] 2925
#?Cuantos NA tengo por variable?
sapply(bd1, function(x) sum (is.na(x)))
##       State.ID          State         Region Industry.Group  Economic.Unit 
##            975              0            975              0            975
#Borrar todos los registros NA de una tabla
bd2 <- bd1
bd2 <- na.omit(bd2)

summary(bd2)
##     State.ID        State               Region      Industry.Group    
##  Min.   : 1.00   Length:24          Min.   :1.000   Length:24         
##  1st Qu.:10.75   Class :character   1st Qu.:1.000   Class :character  
##  Median :18.00   Mode  :character   Median :2.000   Mode  :character  
##  Mean   :17.62                      Mean   :2.333                     
##  3rd Qu.:25.25                      3rd Qu.:3.000                     
##  Max.   :31.00                      Max.   :4.000                     
##  Economic.Unit   
##  Min.   :  1.00  
##  1st Qu.:  1.75  
##  Median :  5.00  
##  Mean   : 13.17  
##  3rd Qu.:  8.75  
##  Max.   :151.00
#Exportar base de datos

bd_produccion <-bd2
write.csv(bd_produccion, file ="Produccion de carton por estado.csv", row.names = FALSE)

Incluye una breve reflexión de la actividad.

En esta actividad se realizó un análisis a 4 distintas bases de datos del socio formador FORM, base de datos de recursos humanos, delivery plan, delivery performance y una base de datos externa. Al resolver esta actividad pudimos implementar los conocimientos de los módulos que se han visto de la concentración. Esto se observa desde el inicio de los diferentes análisis como los tipos de variables y su medición aprendidos en el módulo 2. De la misma manera, como en el módulo 3 se aprendió a cómo realizar la limpieza de los datos. Todo esto nos dejó crear un buen análisis para la empresa FORM.

LS0tCnRpdGxlOiA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmFuZ2UiPiAiRW50cmVnYWJsZSAyLjEiCmF1dGhvcjogIkVxdWlwbyA0IgpkYXRlOiAiMjAyMi0wOS0yMSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgo8aW1nIHNyYz0gIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rvd25sb2Fkcy9pbWFnZXMtNC5wbmciPgoKIyMjIyBFbWlsaW8gT2x2ZXJhIEEwMTYyNTIwMAojIyMjIE1heXJhIENhbXBveSBSYW1vcyBBMDAyMjY5MTQKIyMjIyBYaW1lbmEgR3V0aWVycmV6IEJyaXNlw7FvIEEwMDgyOTUwNQojIyMjIE1hcmlhbmEgVWxsb2EgRW5jaW5hcyBBMDEyNTMwNzYKIyMjIyBIw6ljdG9yIEphdmllciBWaWxsYXJyZWFsIEEwMTU3MDIyNwoKIyAqKlJlY3Vyc29zIEh1bWFub3MqKiAKCiMjIyMjIEFudGVzIGRlIGltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MsIHNlIG9wdMOzIHBvcjoKIyMjIyMgMS4gQ3JlYXIgdW5hIGNvbHVtbmEgZGUgIkVkYWQiLgojIyMjIyAyLiBBZ3JlZ2FyICIwIiBlbiBsb3MgZXNwYWNpb3MgZW4gYmxhbmNvLgoKIyMjIyBJbXBvcnRhciBsYXMgYmFzZXMgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpyZWN1cnNvc19odW1hbm9zIDwtIHJlYWQuY3N2KCIvVXNlcnMvbWF5cmFjYW1wb3lyYW1vcy9EZXNrdG9wL0FuYWxpc2lzIGRlIERhdG9zIENvbmNlbnRyYWNpb24vUmV0by9GT1JNIC0gUmVjdXJzb3MgSHVtYW5vcyAoMikuY3N2IikKYGBgCgojIyMgKsK/Q3XDoW50YXMgdmFyaWFibGVzIHkgY3VhbnRvcyByZWdpc3Ryb3MgdGllbmUgbGEgYmFzZSBkZSBkYXRvcz8qCgpgYGB7cn0KIyBJbnN0YWxhciBsaWJyZXJpYXMKCiMgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KGRwbHlyKQojIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikKbGlicmFyeShwc3ljaCkKCiNTYWNhciBuw7ptZXJvIGRlIHZhcmlhYmxlczoKZGVzY3JpYmVEYXRhKHJlY3Vyc29zX2h1bWFub3MsaGVhZD0xLHRhaWw9MSkKCiNSOiBFeGlzdGVuIDI5IHZhcmlhYmxlcy4KCiNTYWNhciBuw7ptZXJvIGRlIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3M6CgojUjogRXhpc3RlbiAxMTMgcmVnaXN0cm9zIHBvciBjb2x1bW5hLCBzaWVuZG8gYXNpIDMsMjc3IHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MuCmBgYAoKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJOby4uRGUuRW1wbGVhZG8iLCJBUEVMTElET1MiLCJOT01CUkUiLCJGRUNIQS5ERS5OQUNJTUlFTlRPIiwgIkVEQUQiLCAiR0VORVJPIiwgIlJGQyIsICJGRUNIQS5ERS5BTFRBIiwgIlByaW1lci5tZXMiLCAiWDR0by5tZXMiLCAiQkFKQSIsICJQVUVTVE8iLCAiREVQQVJUQU1FTlRPIiwgIk5PLlNFR1VSTy5TT0NJQUwiLCAiU0FMQVJJTy5ESUFSSU8uSU1TUyIsICJGQUNUT1IuQ1JFRC5JTkZPTkFWSVQiLCAiTi4uQ1JFRElUTy5JTkZPTkFWSVQiLCAiTFVHQVIuREUuTkFDSU1JRU5UTyIsICJDVVJQIiwgIkNBTExFIiwgIk5VTUVSTy5JTlRFUk5PIiwgIkNPTE9OSUEiLCAiTVVOSUNJUElPIiwgIkVTVEFETyIsICJDT0RJR08uUE9TVEFMIiwgIkVTVEFETy5DSVZJTCIsICJUQVJKRVRBLi4uLkNVRU5UQSIsICJYIiwgIlguMSIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAgIkN1YWxpdGF0aXZhIiwgIkN1YW5saXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIpCk1lYXN1cmVtZW50IDwtYygiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiQcOxb3MiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTW9uZWRhIE1leGljYW5hIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiKQp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSxUeXBlLCBNZWFzdXJlbWVudCkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0Kc3VtbWFyeShyZWN1cnNvc19odW1hbm9zKQpgYGAKCiMjIyMgT2JzZXJ2YWNpb25lcwojIyMjIyAxLiBMYXMgdmFyaWFibGVzIGRlICJOVU1FUk8uSU5URVJOTyIgeSAiTk8uU0VHVVJPLlNPQ0lBTCIgc2FsZSBlbiBmb3JtYXRvIGRlIGNhcmFjdGVyLgojIyMjIyAyLiBObyBub3Mgc2lydmVuIFZBUklBUyB2YXJpYWJsZXM6ICJSRkMiLCAiUHJpbWVyLm1lcyIsICJYNHRvLm1lcyIsIGV0Yy4KIyMjIyMgMy4gSGF5IG11Y2hvcyBOQcK0cwojIyMjIyA0LiBIYXkgZG9zIGNvbHVtbmFzIHNpbiBuYWRhOiAiWCIgeSAiWC4xIi4KIyMjIyMgNS4gSGF5IHVuIHNhbGFyaW8gZGUgMSBtaWxsw7NuIHkgZGUgNDAwbWlsLCBsbyBxdWUgc2UgcHVlZGUgcmVlbXBsYXphciBwb3IgbGEgbWVkaWEgZGUgbG9zIHNhbGFyaW9zLgoKIyMjIFTDqWNuaWNhIDE6IEVsaW1pbmFyIGNvbHVtbmFzLgpgYGB7cn0KcmVjdXJzb3NfaHVtYW5vcyA8LSBzdWJzZXQocmVjdXJzb3NfaHVtYW5vcyxzZWxlY3QgPSAtYyAoRkVDSEEuREUuTkFDSU1JRU5UTywgUkZDLCBQcmltZXIubWVzLCBYNHRvLm1lcywgTk8uU0VHVVJPLlNPQ0lBTCwgRkFDVE9SLkNSRUQuSU5GT05BVklULCBOLi5DUkVESVRPLklORk9OQVZJVCwgQ0FMTEUsIE5VTUVSTy5JTlRFUk5PLCBDT0xPTklBLCBUQVJKRVRBLi4uLkNVRU5UQSwgWDAsIFgwLjEpKQoKYGBgCgojIyMgVMOpY25pY2EgMi4gUmVlbXBsYXphciBwb3IgZWwgcHJvbWVkaW8gZGUgbG9zIHNhbGFyaW9zIGxvcyBzYWxhcmlvcyBjb3JyZXNwb25kaWVudGVzIGEgMSBtaWxsw7NuIHkgNDAwbWlsLgpgYGB7cn0KCnJlY3Vyc29zX2h1bWFub3MgPC0gcmVjdXJzb3NfaHVtYW5vc1tvcmRlcihyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MpLF0KdGFpbChyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MsIG49IDIpCnJlY3Vyc29zX2h1bWFub3MgPC0gcmVjdXJzb3NfaHVtYW5vc1tyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MgPiAwLCBdCgpyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1NbcmVjdXJzb3NfaHVtYW5vcyRTQUxBUklPLkRJQVJJTy5JTVNTID4gNDQxMzc1Nl0gPC0gbWVkaWFuKHJlY3Vyc29zX2h1bWFub3MkU0FMQVJJTy5ESUFSSU8uSU1TUywgbmEucm0gPSBUUlVFKQpzdW1tYXJ5KHJlY3Vyc29zX2h1bWFub3MpCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwp3cml0ZS5jc3YocmVjdXJzb3NfaHVtYW5vcywgZmlsZSA9ICJyZWN1cnNvc19odW1hbm9zX2xpbXBpYV9idWVuYS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojICoqRGVsaXZlcnkgUGxhbioqCgojIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpiZCA8LSByZWFkLmNzdigiL1VzZXJzL21heXJhY2FtcG95cmFtb3MvRGVza3RvcC9BbmFsaXNpcyBkZSBEYXRvcyBDb25jZW50cmFjaW9uL1JldG8vRk9STSAtIERlbGl2ZXJ5IFBsYW4ueGxzeCAtIERFTElWRVJZIFBMQU4uY3N2IikKCmBgYAoKIyMjICrCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/KgpgYGB7cn0Kc3RyKGJkKQpzdW1tYXJ5KGJkKQoKCiMgMjMxIFJlZ2lzdHJvcyBZIDI2IFZhcmlhYmxlcwpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KdmFyaWFibGUgPC1jKCJDTElFTlRFLlBMQU5UQSwiLCAiUFJPWUVDVE8iLCAiSUQuMEQwMCIsICJJVEVNIiwgIkVORS4yMiIsICJGRUJSRVJPLjIyIiwgIk1BUlpPLjIyIiwgIkFCUklMLjIyIiwgIk1BWU8uMjIiLCAiSlVOSU8uMjIiLCAiSlVMSU8uMjIiLCAiQUdPU1RPLjIyIiwgIlNFUFRJRU1CUkUuMjIiLCAiT0NUVUJSRS4yMiIsICJOT1ZJRU1CUkUuMjIiLCAiRElDSUVNQlJFLjIyIiwgIkVORVJPLjIzIiwgIkZFQlJFUk8uMjMiLCAiTUFSWk8uMjMiKQpNZWFzdXJtZW50IDwtYygiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiKQpTY2FsZSA8LWMoIk5PTUlOQUwiLCAiTk9NSU5BTCIsICJOT01JTkFMIiwgIk5PTUlOQUwiLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iKQoKY2xhc2lmaWNhY2lvbiA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlLCBNZWFzdXJtZW50LCBTY2FsZSkKY2xhc2lmaWNhY2lvbgpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyBUw6ljbmljYSAxOiBFbGltaW5hciBOQQpgYGB7cn0Kc3VtKGlzLm5hKGJkKSkKCnNhcHBseShiZCxmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQoKI0hhbGxhemdvczogTm8gc2UgZW5jb250cmFyb24gZGF0b3MgY29uIGRlbm9taW5hY8OzbiBOQSwgeWEgcXVlIHRvZG9zIGZ1ZXJvbiByZWVtcGxhemFkb3MgY29uIDAgCmBgYAoKIyMjIFTDqWNuaWNhIDI6IEVsaW1pbmFyIGNvbHVtbmFzLgpgYGB7cn0KI0VsaW1pbmFyIDIwMjEKYmQxIDwtIGJkCmJkMSA8LSBzdWJzZXQgKGJkLCBzZWxlY3QgPSAtYyAoSlVOSU8sIEpVTElPLCBBR09TVE8sIFNFUFRJRU1CUkUsIE9DVFVCUkUsIE5PVklFTUJSRSwgRElDSUVNQlJFKSkKCiNFeHBvcnRhciBiYXNlIGRlIGRhdG9zCndyaXRlLmNzdihiZDEsIGZpbGUgPSAiZGVsaXZlcnlfcGxhbi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojICoqRGVsaXZlcnkgUGVyZm9ybWFuY2UqKgoKIyMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zCmBgYHtyfQojIGZpbGUuY2hvb3NlKCkKYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rlc2t0b3AvQW5hbGlzaXMgZGUgRGF0b3MgQ29uY2VudHJhY2lvbi9SZXRvL0ZPUk0gLSBEZWxpdmVyeSBQZXJmb3JtYW5jZS5jc3YiKQpiZCA8LSBuYS5vbWl0KGJkKQpgYGAKCiMjIyAqwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPyoKYGBge3J9CiMgVGllbmUgMTQ0MCBvYnMuIHkgOCB2YXJpYWJsZXMKc3RyKGJkKQpzdW1tYXJ5KGJkKQpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJgVGFyZ2V0YCIsImBDbGllbnRlYCIsImBWdWVsdGFzYCIsImBQbGFuLmFycml2YWxgIiwiYFJlYWwuYXJyaXZhbGAiLCJgUmVhbC5kZXBhcnR1cmVgIiwiYERpZmVyZW5jZWAiLCJgRGF0ZWAiKQpUeXBlPC1jKCJxdWFudGlhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aWF0aXZlIChjb250aW5vdXMpIiwgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiKQplc2NhbGFzIDwtIGMoImludGVydmFsbyIsICJub21pbmFsIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgIm9yZGluYWwiKQp0YWJsZSA8LSBkYXRhLmZyYW1lIChWYXJpYWJsZSwgVHlwZSwgZXNjYWxhcykKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyBUw6ljbmljYSAxOiBNZXRvZG8gRXN0YWRpc3RpY28KCmBgYHtyfQpiZDI8LWJkCmJveHBsb3QoYmQyJFBsYW4uYXJyaXZhbCwgaG9yaXpvbnRhbD1UUlVFKQpib3hwbG90KGJkMiRSZWFsLmFycml2YWwsIGhvcml6b250YWw9VFJVRSkKYm94cGxvdChiZDIkUmVhbC5kZXBhcnR1cmUsIGhvcml6b250YWw9VFJVRSkKCiMgRWwgdXNvIGRlIGVzdGUgbWV0b2RvIHBvciBxdWUgc2UgcXVlcmlhIG9ic2VydmFyIGdyYWZpY2FtZW50ZSBjb21vIGVzIHF1ZSBsb3MgdGllbXBvcyBkZSBsbGVnYWRhIHNlIHZlbiBhZmVjdGFkbwoKYGBgCgojIyMgVMOpY25pY2EgMjogRWxpbWluYXIgY29sdW1uYXMuCgpgYGB7cn0KYmQyPC1iZApiZDIgPC0gc3Vic2V0KGJkMiwgc2VsZWN0ID0tYyAoVGFyZ2V0KSkKCiMgRWwgdXNvIGRlIGVzdGUgbWV0b2RvICBwb3IgcXVlIGVuIGxhIHBhcnRlIGRlIFRhcmdldCBzb2xvIGFwYXJlY2lhIGVsIG51bWVybyAxIGVuIHRvZGFzIGxhcyBjb2x1bW5hcyBlbnRvbmNlcyBlc2UgZGF0byBtZSBwYXJlY2lhIGlubmVjZXNhcmlvCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwp3cml0ZS5jc3YoYmQyLCBmaWxlID0gImRlbGl2ZXJ5X3BlcmZvcm1hbmNlLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgojICoqQmFzZSBkZSBEYXRvcyBFeHRlcm5hKiogCgojIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpiZF9leHRlcm5hIDwtcmVhZC5jc3YoIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rlc2t0b3AvQW5hbGlzaXMgZGUgRGF0b3MgQ29uY2VudHJhY2lvbi9SZXRvL1Byb2R1Y2Npb8yBbiBkZSBjYXJ0b8yBbiBlbiBNZcyBeGljbyAxLmNzdiIpCmBgYAoKIyMjICrCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/KgpgYGB7cn0KcmVzdW1lbiA8LSBzdW1tYXJ5KGJkX2V4dGVybmEpCnJlc3VtZW4KCnN0cihiZF9leHRlcm5hKQpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJTdGF0ZS5JRCIsIlN0YXRlIiwiUmVnaW9uIiwiSW5kdXN0cnkuR3JvdXAuSUQiLCJJbmR1c3RyeS5Hcm91cCIsICJFY29ub21pYy5Vbml0IikKVHlwZTwtYygicXVhbGl0YXRpdmUiLCAicXVhbGl0YXRpdmUiLCAicXVhbGl0YXRpdmUiLCJxdWFsaXRhdGl2ZSIsICJxdWFsaXRhdGl2ZSIsICJxdWFudGl0YXRpdmUgKGRpc2NyZXRhKSIpCk1lYXN1cmVtZW50PC1jKCJOQSIsIk5BIiwiTkEiLCJOQSIsICJOQSIsImNhcnTDs24gcHJvZHVjaWRvIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxNZWFzdXJlbWVudCkKa25pdHI6OmthYmxlKHRhYmxlKQoKYGBgCgojIyMgKkFwbGljYSBhbCBtZW5vcyAyIHTDqWNuaWNhcyBkZSBsaW1waWV6YSBkZSBiYXNlcyBkZSBkYXRvcyB5IGV4cGzDrWNhbGFzIGJyZXZlbWVudGUsIMK/cG9yIHF1w6kgcmVhbGl6YXN0ZSBlc2FzIHTDqWNuaWNhcz8qCgojIyMgVMOpY25pY2EgMTogUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlcywgY29sdW1uYSBpbmVjZXNhcmlhICJJbmR1c3RyeS5Hcm91cC5JRCIgbm8gbWUgYXBvcnRhIGRhdG9zIGltcG9ydGFudGVzCmBgYHtyfQpiZDEgPC0gYmRfZXh0ZXJuYQpiZDEgPC0gc3Vic2V0IChiZDEsc2VsZWN0ID0gLWMoSW5kdXN0cnkuR3JvdXAuSUQpKQoKc3VtbWFyeShiZDEpCmBgYAoKIyMjIFTDqWNuaWNhIDI6IFJlbW92ZXIgTkEsIGxhIGJhc2UgZGUgZGF0b3MgdmllbmUgY29uIGVzcGFjaW9zIHZhY2lvcwpgYGB7cn0KIz9DdWFudG9zIE5BIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/CnN1bShpcy5uYShiZDEpKQoKIz9DdWFudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8Kc2FwcGx5KGJkMSwgZnVuY3Rpb24oeCkgc3VtIChpcy5uYSh4KSkpCgojQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgTkEgZGUgdW5hIHRhYmxhCmJkMiA8LSBiZDEKYmQyIDwtIG5hLm9taXQoYmQyKQoKc3VtbWFyeShiZDIpCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwoKYmRfcHJvZHVjY2lvbiA8LWJkMgp3cml0ZS5jc3YoYmRfcHJvZHVjY2lvbiwgZmlsZSA9IlByb2R1Y2Npb24gZGUgY2FydG9uIHBvciBlc3RhZG8uY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyAqKkluY2x1eWUgdW5hIGJyZXZlIHJlZmxleGnDs24gZGUgbGEgYWN0aXZpZGFkLioqCgpFbiBlc3RhIGFjdGl2aWRhZCBzZSByZWFsaXrDsyB1biBhbsOhbGlzaXMgYSA0IGRpc3RpbnRhcyBiYXNlcyBkZSBkYXRvcyBkZWwgc29jaW8gZm9ybWFkb3IgRk9STSwgYmFzZSBkZSBkYXRvcyBkZSByZWN1cnNvcyBodW1hbm9zLCBkZWxpdmVyeSBwbGFuLCBkZWxpdmVyeSBwZXJmb3JtYW5jZSB5IHVuYSBiYXNlIGRlIGRhdG9zIGV4dGVybmEuICBBbCByZXNvbHZlciBlc3RhIGFjdGl2aWRhZCBwdWRpbW9zIGltcGxlbWVudGFyIGxvcyBjb25vY2ltaWVudG9zIGRlIGxvcyBtw7NkdWxvcyBxdWUgc2UgaGFuIHZpc3RvIGRlIGxhIGNvbmNlbnRyYWNpw7NuLiBFc3RvIHNlIG9ic2VydmEgZGVzZGUgZWwgaW5pY2lvIGRlIGxvcyBkaWZlcmVudGVzIGFuw6FsaXNpcyBjb21vIGxvcyB0aXBvcyBkZSB2YXJpYWJsZXMgeSBzdSBtZWRpY2nDs24gYXByZW5kaWRvcyBlbiBlbCBtw7NkdWxvIDIuIERlIGxhIG1pc21hIG1hbmVyYSwgY29tbyBlbiBlbCBtw7NkdWxvIDMgc2UgYXByZW5kacOzIGEgY8OzbW8gcmVhbGl6YXIgbGEgbGltcGllemEgZGUgbG9zIGRhdG9zLiBUb2RvIGVzdG8gbm9zIGRlasOzIGNyZWFyIHVuIGJ1ZW4gYW7DoWxpc2lzIHBhcmEgbGEgZW1wcmVzYSBGT1JNLgo=