a. FORM – Recursos Humanos

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

En el primer sheet, “Colaboradores”

bd_rh_colaboradores<-read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/RH/colabbb.csv")
summary(bd_rh_colaboradores)
##  No..De.Empleado   APELLIDOS            NOMBRE          AÑO.DE.NACIMIENTO
##  Min.   :  1.00   Length:111         Length:111         Min.   :1955     
##  1st Qu.: 25.25   Class :character   Class :character   1st Qu.:1978     
##  Median : 49.50   Mode  :character   Mode  :character   Median :1989     
##  Mean   : 57.79                                         Mean   :1987     
##  3rd Qu.: 84.00                                         3rd Qu.:1997     
##  Max.   :148.00                                         Max.   :2022     
##  NA's   :21                                             NA's   :3        
##     GENERO              RFC            FECHA.DE.ALTA    Primer.mes  
##  Length:111         Length:111         Min.   :2010   Min.   :2010  
##  Class :character   Class :character   1st Qu.:2020   1st Qu.:2021  
##  Mode  :character   Mode  :character   Median :2022   Median :2022  
##                                        Mean   :2021   Mean   :2021  
##                                        3rd Qu.:2022   3rd Qu.:2022  
##                                        Max.   :2022   Max.   :2022  
##                                        NA's   :1      NA's   :3     
##     X4to.mes         BAJA       PUESTO          DEPARTAMENTO      
##  Min.   :1905   Min.   :3    Length:111         Length:111        
##  1st Qu.:2021   1st Qu.:3    Class :character   Class :character  
##  Median :2022   Median :3    Mode  :character   Mode  :character  
##  Mean   :2020   Mean   :3                                         
##  3rd Qu.:2022   3rd Qu.:3                                         
##  Max.   :2022   Max.   :3                                         
##  NA's   :3      NA's   :98                                        
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:111         Min.   :144.4       Length:111           
##  Class :character   1st Qu.:176.7       Class :character     
##  Mode  :character   Median :180.7       Mode  :character     
##                     Mean   :179.1                            
##                     3rd Qu.:180.7                            
##                     Max.   :337.1                            
##                                                              
##  N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP          
##  Length:111            Length:111          Length:111        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##                                                              
##     CALLE           NUMERO.INTERNO       COLONIA           MUNICIPIO        
##  Length:111         Length:111         Length:111         Length:111        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     ESTADO          CODIGO.POSTAL   ESTADO.CIVIL       TARJETA....CUENTA 
##  Length:111         Min.   :25016   Length:111         Length:111        
##  Class :character   1st Qu.:66642   Class :character   Class :character  
##  Mode  :character   Median :66646   Mode  :character   Mode  :character  
##                     Mean   :63300                                        
##                     3rd Qu.:66649                                        
##                     Max.   :67493                                        
## 

Se tienen 26 variables y 113 registros.

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

str(bd_rh_colaboradores)
## 'data.frame':    111 obs. of  26 variables:
##  $ No..De.Empleado      : int  4 15 7 8 26 24 89 88 86 78 ...
##  $ APELLIDOS            : chr  "CAZARES MORALES" "CAZARES AMAYA" "PERALTA MARTINEZ" "TOVAR PEREZ" ...
##  $ NOMBRE               : chr  "MARIA" "GUADALUPE" "ARACELY" "PEDRO ISAI" ...
##  $ AÑO.DE.NACIMIENTO    : int  1990 1984 1984 1985 1984 1962 1966 1976 1963 1979 ...
##  $ GENERO               : chr  "FEMENINO" "MASCULINO" "FEMENINO" "MASCULINO" ...
##  $ RFC                  : chr  "CAMM9005019S8" "CAAG8207168N6" "PEMA6707017U2" "TOPP961210989" ...
##  $ FECHA.DE.ALTA        : int  2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
##  $ Primer.mes           : int  2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
##  $ X4to.mes             : int  2013 2019 2015 2016 2020 2020 2022 2022 2022 2022 ...
##  $ BAJA                 : int  NA NA NA NA NA NA 3 3 3 3 ...
##  $ PUESTO               : chr  "SUPERVISORA" "MANTENIMIENTO" "COSTURERA" "AYUDANTE GENERAL" ...
##  $ DEPARTAMENTO         : chr  "Produccion Cartón MC" "EHS" "Costura" "Producción Retorn" ...
##  $ NO.SEGURO.SOCIAL     : chr  "4.31E+14" "4.70E+14" "3876700802" "4.31E+13" ...
##  $ SALARIO.DIARIO.IMSS  : num  337 280 260 241 241 ...
##  $ FACTOR.CRED.INFONAVIT: chr  "" "" "" "" ...
##  $ N...CREDITO.INFONAVIT: chr  "" "" "" "" ...
##  $ LUGAR.DE.NACIMIENTO  : chr  "" "" "" "" ...
##  $ CURP                 : chr  "CAMM900501MVZZRR00" "CAAG820716HNLZMD05" "PEMA670701MNLRRR02" "TOPP961210HNLVRD07" ...
##  $ CALLE                : chr  "RIO ACAPONETA" "ESTAMBUL" "ALAMO TEMBLON" "RIO ACAPONETA" ...
##  $ NUMERO.INTERNO       : chr  "" "" "" "" ...
##  $ COLONIA              : chr  "PUEBLO NUEVO" "PASEO DE LAS FLORES" "ALAMOS DEL PARQUE" "PUEBLO NUEVO 5TO SECTOR" ...
##  $ MUNICIPIO            : chr  "APODACA" "APODACA" "APODACA" "APODACA" ...
##  $ ESTADO               : chr  "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
##  $ CODIGO.POSTAL        : int  66649 66643 66633 66649 66646 66646 66643 66643 66670 66646 ...
##  $ ESTADO.CIVIL         : chr  "Casado" "Soltero" "Casado" "Casado" ...
##  $ TARJETA....CUENTA    : chr  "BANORTE" "BANORTE" "BANORTE" "BANORTE" ...
Variable Type
No.De.Empleado Cualitativa (nominal)
Apellidos Cualitativa (nominal)
Nombre Cualitativa (nominal)
FechaNacimiento Cuantitativa (discreta)
Genero Cualitativa (nominal)
RFC Cualitativa (nominal)
FechaAlta Cuantitativa (discreta)
PrimerMes Cuantitativa (discreta)
4toMes Cuantitativa (discreta)
Baja Cuantitativa (discreta)
Puesto Cualitativa (nominal)
Departamento Cualitativa (nominal)
SeguroSocial Cualitativa (nominal)
SalarioDiario Cuantitativa (continuo)
FactorInfonavit Cualitativa (nominal)
N.CreditoInfonavit Cualitativa (nominal)
LugarNacimiento Cualitativa (nominal)
CURP Cualitativa (nominal)
Calle Cualitativa (nominal)
NumeroInterno Cualitativa (nominal)
Colonia Cualitativa (nominal)
Municipio Cualitativa (nominal)
Estado Cualitativa (nominal)
CodigoPostal Cualitativa (nominal)
EstadoCivil Cualitativa (nominal)
Tarjeta Cualitativa (nominal)

3) Elige la escala de medición de cada variable.

Variable Medicion
No.De.Empleado Números
Apellidos No aplica
Nombre No aplica
FechaNacimiento Año
Genero No aplica
RFC No aplica
FechaAlta Año
PrimerMes Año
4toMes Año
Baja Números
Puesto No aplica
Departamento No aplica
SeguroSocial No aplica
SalarioDiario Pesos mexicanos
FactorInfonavit Pesos mexicanos
N.CreditoInfonavit No aplica
LugarNacimiento No aplica
CURP No aplica
Calle No aplica
NumeroInterno No aplica
Colonia No aplica
Municipio No aplica
Estado No aplica
CodigoPostal No aplica
EstadoCivil No aplica
Tarjeta No aplica

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

Técnica 3, ERRORES TIPOGRÁFICOS Y ERRORES SIMILARES

Primeramente, se notó que en el excel algunas fechas estaban con formato día/mes/año y otros mes/día/año. Por lo que para tener la información más real y precisa posible, se extrajeron solo los AÑOS para el análisis.

Técnica 1, REMOVER DATOS IRRELEVANTES

Existen muchas variables en la base de datos, y muchas de estas contienen datos personales de los colaboradores, por lo que es información muy sensible y que no aporta mucho insight al análisis. Por lo tanto, se ha escogido la técnica de remover datos irrelevantes a la información personal de los empleados que no sirvan mucho para el análisis, como lo es su nombre, apellido, RFC, CURP. Sin embargo, otros datos personales se han mantenido para hacer un análisis de diversidad e inclusión (género, fecha de nacimiento, estado civil).

summary(bd_rh_colaboradores)
##  No..De.Empleado   APELLIDOS            NOMBRE          AÑO.DE.NACIMIENTO
##  Min.   :  1.00   Length:111         Length:111         Min.   :1955     
##  1st Qu.: 25.25   Class :character   Class :character   1st Qu.:1978     
##  Median : 49.50   Mode  :character   Mode  :character   Median :1989     
##  Mean   : 57.79                                         Mean   :1987     
##  3rd Qu.: 84.00                                         3rd Qu.:1997     
##  Max.   :148.00                                         Max.   :2022     
##  NA's   :21                                             NA's   :3        
##     GENERO              RFC            FECHA.DE.ALTA    Primer.mes  
##  Length:111         Length:111         Min.   :2010   Min.   :2010  
##  Class :character   Class :character   1st Qu.:2020   1st Qu.:2021  
##  Mode  :character   Mode  :character   Median :2022   Median :2022  
##                                        Mean   :2021   Mean   :2021  
##                                        3rd Qu.:2022   3rd Qu.:2022  
##                                        Max.   :2022   Max.   :2022  
##                                        NA's   :1      NA's   :3     
##     X4to.mes         BAJA       PUESTO          DEPARTAMENTO      
##  Min.   :1905   Min.   :3    Length:111         Length:111        
##  1st Qu.:2021   1st Qu.:3    Class :character   Class :character  
##  Median :2022   Median :3    Mode  :character   Mode  :character  
##  Mean   :2020   Mean   :3                                         
##  3rd Qu.:2022   3rd Qu.:3                                         
##  Max.   :2022   Max.   :3                                         
##  NA's   :3      NA's   :98                                        
##  NO.SEGURO.SOCIAL   SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
##  Length:111         Min.   :144.4       Length:111           
##  Class :character   1st Qu.:176.7       Class :character     
##  Mode  :character   Median :180.7       Mode  :character     
##                     Mean   :179.1                            
##                     3rd Qu.:180.7                            
##                     Max.   :337.1                            
##                                                              
##  N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO     CURP          
##  Length:111            Length:111          Length:111        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##                                                              
##     CALLE           NUMERO.INTERNO       COLONIA           MUNICIPIO        
##  Length:111         Length:111         Length:111         Length:111        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     ESTADO          CODIGO.POSTAL   ESTADO.CIVIL       TARJETA....CUENTA 
##  Length:111         Min.   :25016   Length:111         Length:111        
##  Class :character   1st Qu.:66642   Class :character   Class :character  
##  Mode  :character   Median :66646   Mode  :character   Mode  :character  
##                     Mean   :63300                                        
##                     3rd Qu.:66649                                        
##                     Max.   :67493                                        
## 

Eliminar columnas

Se eliminan las columnas que no aportan mucho al análisis de datos.

  bd_rh_colaboradores2<-bd_rh_colaboradores
  bd_rh_colaboradores2<-subset(bd_rh_colaboradores2,select=-c(No..De.Empleado,TARJETA....CUENTA,CODIGO.POSTAL,COLONIA,NUMERO.INTERNO,CALLE,CURP,FACTOR.CRED.INFONAVIT,NO.SEGURO.SOCIAL,RFC,APELLIDOS,NOMBRE))
summary(bd_rh_colaboradores2)
##  AÑO.DE.NACIMIENTO    GENERO          FECHA.DE.ALTA    Primer.mes  
##  Min.   :1955      Length:111         Min.   :2010   Min.   :2010  
##  1st Qu.:1978      Class :character   1st Qu.:2020   1st Qu.:2021  
##  Median :1989      Mode  :character   Median :2022   Median :2022  
##  Mean   :1987                         Mean   :2021   Mean   :2021  
##  3rd Qu.:1997                         3rd Qu.:2022   3rd Qu.:2022  
##  Max.   :2022                         Max.   :2022   Max.   :2022  
##  NA's   :3                            NA's   :1      NA's   :3     
##     X4to.mes         BAJA       PUESTO          DEPARTAMENTO      
##  Min.   :1905   Min.   :3    Length:111         Length:111        
##  1st Qu.:2021   1st Qu.:3    Class :character   Class :character  
##  Median :2022   Median :3    Mode  :character   Mode  :character  
##  Mean   :2020   Mean   :3                                         
##  3rd Qu.:2022   3rd Qu.:3                                         
##  Max.   :2022   Max.   :3                                         
##  NA's   :3      NA's   :98                                        
##  SALARIO.DIARIO.IMSS N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO
##  Min.   :144.4       Length:111            Length:111         
##  1st Qu.:176.7       Class :character      Class :character   
##  Median :180.7       Mode  :character      Mode  :character   
##  Mean   :179.1                                                
##  3rd Qu.:180.7                                                
##  Max.   :337.1                                                
##                                                               
##   MUNICIPIO            ESTADO          ESTADO.CIVIL      
##  Length:111         Length:111         Length:111        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
##                                                          
## 
Técnica 5, VALORES FALTANTES

Con un rápido vistazo de la base de datos, se podía observar que faltaban ciertos valores en las diferentes variables. Si faltaban muchos datos en una sola variable, se optó por eliminar la columna, mientras que en otros casos donde haya pocos por variables sólo se eliminaron los registros.

¿Cuántos NA tengo en la base de datos?

sum(is.na(bd_rh_colaboradores2))
## [1] 108

¿Cuántos NA tengo por variable?

sapply(bd_rh_colaboradores2,function(x) sum(is.na(x)))
##     AÑO.DE.NACIMIENTO                GENERO         FECHA.DE.ALTA 
##                     3                     0                     1 
##            Primer.mes              X4to.mes                  BAJA 
##                     3                     3                    98 
##                PUESTO          DEPARTAMENTO   SALARIO.DIARIO.IMSS 
##                     0                     0                     0 
## N...CREDITO.INFONAVIT   LUGAR.DE.NACIMIENTO             MUNICIPIO 
##                     0                     0                     0 
##                ESTADO          ESTADO.CIVIL 
##                     0                     0

En la base de datos se tienen los NA en una sola variable: BAJA. Aqui faltan 100 de 113 registros, por lo que resulta mejor ELIMINAR la columna en su totalidad.

bd_rh_colaboradores3<-bd_rh_colaboradores2
  bd_rh_colaboradores3<-subset(bd_rh_colaboradores2,select=-c(BAJA))
summary(bd_rh_colaboradores3)
##  AÑO.DE.NACIMIENTO    GENERO          FECHA.DE.ALTA    Primer.mes  
##  Min.   :1955      Length:111         Min.   :2010   Min.   :2010  
##  1st Qu.:1978      Class :character   1st Qu.:2020   1st Qu.:2021  
##  Median :1989      Mode  :character   Median :2022   Median :2022  
##  Mean   :1987                         Mean   :2021   Mean   :2021  
##  3rd Qu.:1997                         3rd Qu.:2022   3rd Qu.:2022  
##  Max.   :2022                         Max.   :2022   Max.   :2022  
##  NA's   :3                            NA's   :1      NA's   :3     
##     X4to.mes       PUESTO          DEPARTAMENTO       SALARIO.DIARIO.IMSS
##  Min.   :1905   Length:111         Length:111         Min.   :144.4      
##  1st Qu.:2021   Class :character   Class :character   1st Qu.:176.7      
##  Median :2022   Mode  :character   Mode  :character   Median :180.7      
##  Mean   :2020                                         Mean   :179.1      
##  3rd Qu.:2022                                         3rd Qu.:180.7      
##  Max.   :2022                                         Max.   :337.1      
##  NA's   :3                                                               
##  N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO  MUNICIPIO        
##  Length:111            Length:111          Length:111        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##                                                              
##     ESTADO          ESTADO.CIVIL      
##  Length:111         Length:111        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
##                                       
## 

Se vuelve a ver lo de NAs

¿Cuántos NA tengo por variable?

sapply(bd_rh_colaboradores3,function(x) sum(is.na(x)))
##     AÑO.DE.NACIMIENTO                GENERO         FECHA.DE.ALTA 
##                     3                     0                     1 
##            Primer.mes              X4to.mes                PUESTO 
##                     3                     3                     0 
##          DEPARTAMENTO   SALARIO.DIARIO.IMSS N...CREDITO.INFONAVIT 
##                     0                     0                     0 
##   LUGAR.DE.NACIMIENTO             MUNICIPIO                ESTADO 
##                     0                     0                     0 
##          ESTADO.CIVIL 
##                     0

Eliminar renglones de NAs

bd_rh_colaboradores4<-bd_rh_colaboradores3
bd_rh_colaboradores4<-na.omit(bd_rh_colaboradores4)      
summary(bd_rh_colaboradores4)
##  AÑO.DE.NACIMIENTO    GENERO          FECHA.DE.ALTA    Primer.mes  
##  Min.   :1955      Length:106         Min.   :2010   Min.   :2010  
##  1st Qu.:1978      Class :character   1st Qu.:2021   1st Qu.:2020  
##  Median :1990      Mode  :character   Median :2022   Median :2022  
##  Mean   :1987                         Mean   :2021   Mean   :2021  
##  3rd Qu.:1997                         3rd Qu.:2022   3rd Qu.:2022  
##  Max.   :2022                         Max.   :2022   Max.   :2022  
##     X4to.mes       PUESTO          DEPARTAMENTO       SALARIO.DIARIO.IMSS
##  Min.   :2010   Length:106         Length:106         Min.   :144.4      
##  1st Qu.:2021   Class :character   Class :character   1st Qu.:176.7      
##  Median :2022   Mode  :character   Mode  :character   Median :180.7      
##  Mean   :2021                                         Mean   :179.4      
##  3rd Qu.:2022                                         3rd Qu.:180.7      
##  Max.   :2022                                         Max.   :337.1      
##  N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO  MUNICIPIO        
##  Length:106            Length:106          Length:106        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##     ESTADO          ESTADO.CIVIL      
##  Length:106         Length:106        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 
sapply(bd_rh_colaboradores4,function(x) sum(is.na(x)))
##     AÑO.DE.NACIMIENTO                GENERO         FECHA.DE.ALTA 
##                     0                     0                     0 
##            Primer.mes              X4to.mes                PUESTO 
##                     0                     0                     0 
##          DEPARTAMENTO   SALARIO.DIARIO.IMSS N...CREDITO.INFONAVIT 
##                     0                     0                     0 
##   LUGAR.DE.NACIMIENTO             MUNICIPIO                ESTADO 
##                     0                     0                     0 
##          ESTADO.CIVIL 
##                     0

Eliminar error de fecha de nacimiento (existen datos que muestran que alguien nació en el 2022)

  bd_rh_colaboradores5<-bd_rh_colaboradores4
  bd_rh_colaboradores5<-bd_rh_colaboradores5[bd_rh_colaboradores5$AÑO.DE.NACIMIENTO<2004,]
  summary(bd_rh_colaboradores5)
##  AÑO.DE.NACIMIENTO    GENERO          FECHA.DE.ALTA    Primer.mes  
##  Min.   :1955      Length:104         Min.   :2010   Min.   :2010  
##  1st Qu.:1978      Class :character   1st Qu.:2021   1st Qu.:2020  
##  Median :1989      Mode  :character   Median :2022   Median :2022  
##  Mean   :1987                         Mean   :2021   Mean   :2021  
##  3rd Qu.:1996                         3rd Qu.:2022   3rd Qu.:2022  
##  Max.   :2003                         Max.   :2022   Max.   :2022  
##     X4to.mes       PUESTO          DEPARTAMENTO       SALARIO.DIARIO.IMSS
##  Min.   :2010   Length:104         Length:104         Min.   :144.4      
##  1st Qu.:2021   Class :character   Class :character   1st Qu.:176.7      
##  Median :2022   Mode  :character   Mode  :character   Median :180.7      
##  Mean   :2021                                         Mean   :179.3      
##  3rd Qu.:2022                                         3rd Qu.:180.7      
##  Max.   :2022                                         Max.   :337.1      
##  N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO  MUNICIPIO        
##  Length:104            Length:104          Length:104        
##  Class :character      Class :character    Class :character  
##  Mode  :character      Mode  :character    Mode  :character  
##                                                              
##                                                              
##                                                              
##     ESTADO          ESTADO.CIVIL      
##  Length:104         Length:104        
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Queda limpia y lista para analizar la base de datos.

Exportar

rh_limpia <-bd_rh_colaboradores5
write.csv(rh_limpia, file ="rh_limpia5.csv", row.names = FALSE)

5) Incluye una breve reflexión de la actividad.

Esta base de datos fue tomando en cuenta los datos otorgados por Form de su gestión de Recursos Humanos. Obtenemos los datos de los colaboradores, y algunas de sus características que podrían resultar interesantes para proponer estrategias fundamentadas a la organización. Me encontré con diferentes retos al trabajar primeramente con los datos, como lo fueron algunos datos faltantes y errores de dedo (fechas en idioma español y otras en inglés de EUA).

Una importante reflexión de esta actividad fue como R me puede ayudar a preparar una base de datos de manera que tengamos menos errores y hacer el proceso más eficiente. Este proceso realizado será de gran utilidad para las próximas actividades y la resolución del reto.

b. FORM – Delivery Plan

Importar bases de datos

#file.choose()

bd <- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/Delivery Plan/FORM - Delivery Plan.xlsx - DELIVERY PLAN(2) (1)C.csv")
bd3<- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/Delivery Plan/2022.csv")
bd4<- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/Delivery Plan/año.csv")
## Warning in read.table(file = file, header = header, sep = sep, quote = quote, :
## incomplete final line found by readTableHeader on '/Users/georginamartinez/
## Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a
## decisiones/Base de datos FORM/Delivery Plan/año.csv'
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  
##   NOVIEMBRE.22     NOVIEMBRE.22.1     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

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

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)
describeData(bd, head=1, tail=1 )
## n.obs =  231 of which  231   are complete cases.   Number of variables =  26  of which all are numeric  FALSE  
##                 variable # n.obs type                                H1
## CLIENTE.PLANTA*          1   231    3                              STB3
## PROYECTO*                2   231    3                   CANASTILLA GRIS
## ID.ODOO*                 3   231    3                            15.785
## ITEM*                    4   231    3 CABLE SET CAJA BACK UP CANASTILLA
## JUNIO                    5   231    1                                 0
## JULIO                    6   231    1                               140
## AGOSTO                   7   231    1                               530
## SEPTIEMBRE               8   231    1                                 0
## OCTUBRE                  9   231    1                               200
## NOVIEMBRE               10   231    1                                 0
## DICIEMBRE               11   231    1                               150
## ENE.22                  12   231    1                               230
## FEBRERO.22              13   231    1                               500
## MARZO.22                14   231    1                                 0
## ABRIL.22                15   231    1                                 0
## MAYO.22                 16   231    1                                 0
## JUNIO.22                17   231    1                               200
## JULIO.22                18   231    1                               900
## AGOSTO.22               19   231    1                              1000
## SEPTIEMBRE.22           20   231    1                                 0
## NOVIEMBRE.22            21   231    1                                 0
## NOVIEMBRE.22.1          22   231    1                                 0
## DICIEMBRE.22            23   231    1                                 0
## ENERO.23                24   231    1                                 0
## FEBRERO.23              25   231    1                                 0
## MARZO.23                26   231    1                                 0
##                       T1
## CLIENTE.PLANTA*         
## PROYECTO*               
## ID.ODOO*                
## ITEM*           U553 KIT
## JUNIO                  0
## JULIO                  0
## AGOSTO                 0
## SEPTIEMBRE             0
## OCTUBRE               30
## NOVIEMBRE            200
## DICIEMBRE              0
## ENE.22                 0
## FEBRERO.22             0
## MARZO.22               0
## ABRIL.22               0
## MAYO.22                0
## JUNIO.22               0
## JULIO.22               0
## AGOSTO.22              0
## SEPTIEMBRE.22          0
## NOVIEMBRE.22           0
## NOVIEMBRE.22.1         0
## DICIEMBRE.22           0
## ENERO.23               0
## FEBRERO.23             0
## MARZO.23               0
Con la función anterior podemos observar que cuantifica 231 registros completos y 26 variables en nuestra base de datos original.

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Variable<-c("`Cliente.Planta`","`Junio 2021`","`Julio 2021`","`Agosto 2021`","`Septiembre 2021`","`Octubre 2021`","`Noviembre 2021`","`Diciembre 2021`","`Enero 2022`","`Febrero 2022`","`Marzo 2022`","`Abril 2022`","`Mayo 2022`","`Junio 2022`","`Julio 2022`","`Agosto 2022`","`Septiembre 2022`","`Octubre 2022`","`Noviembre 2022`","`Diciembre 2022`","`Enero 2023`","`Febrero 2023`","`Marzo 2023`")
Type<-c("Cualitativa", "Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)","Cuantitativa(discreta)")
table<-data.frame(Variable,Type)
knitr::kable(table) 
Variable Type
Cliente.Planta Cualitativa
Junio 2021 Cuantitativa(discreta)
Julio 2021 Cuantitativa(discreta)
Agosto 2021 Cuantitativa(discreta)
Septiembre 2021 Cuantitativa(discreta)
Octubre 2021 Cuantitativa(discreta)
Noviembre 2021 Cuantitativa(discreta)
Diciembre 2021 Cuantitativa(discreta)
Enero 2022 Cuantitativa(discreta)
Febrero 2022 Cuantitativa(discreta)
Marzo 2022 Cuantitativa(discreta)
Abril 2022 Cuantitativa(discreta)
Mayo 2022 Cuantitativa(discreta)
Junio 2022 Cuantitativa(discreta)
Julio 2022 Cuantitativa(discreta)
Agosto 2022 Cuantitativa(discreta)
Septiembre 2022 Cuantitativa(discreta)
Octubre 2022 Cuantitativa(discreta)
Noviembre 2022 Cuantitativa(discreta)
Diciembre 2022 Cuantitativa(discreta)
Enero 2023 Cuantitativa(discreta)
Febrero 2023 Cuantitativa(discreta)
Marzo 2023 Cuantitativa(discreta)

3) Elige la escala de medición de cada variable.

Órdenes o unidades de producción.

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

bd1 <- bd
bd1 <- subset(bd1, select = -c (PROYECTO, ITEM, ID.ODOO ))

La primera técnica de limpieza fue la de eliminar columnas con datos irrelevantes para el análisis de la base de datos. Las columnas eliminadas, realmente no apoyaban para un análisis de datos cualitativo, pues daban información adicional para un análisis más profundo en cuanto a producto y ID pero no en cuanto a cantidad, por lo que sintetizar los datos resultó la mejor opción con esta primera técnica.

Cuantas NA tengo en la base de datos?
sum(is.na(bd1))
## [1] 0
sum(is.na(bd))
## [1] 0

No se detecta ningún NA en la base de datos, dicha técnica se realizó para corroborar que no hubiera datos vacíos y en caso de que hubiera, sustituírlos con los datos pertinentes.

Cuantos NA tengo por variable?
sapply(bd1, function(x) sum(is.na(x)))
## CLIENTE.PLANTA          JUNIO          JULIO         AGOSTO     SEPTIEMBRE 
##              0              0              0              0              0 
##        OCTUBRE      NOVIEMBRE      DICIEMBRE         ENE.22     FEBRERO.22 
##              0              0              0              0              0 
##       MARZO.22       ABRIL.22        MAYO.22       JUNIO.22       JULIO.22 
##              0              0              0              0              0 
##      AGOSTO.22  SEPTIEMBRE.22   NOVIEMBRE.22 NOVIEMBRE.22.1   DICIEMBRE.22 
##              0              0              0              0              0 
##       ENERO.23     FEBRERO.23       MARZO.23 
##              0              0              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 
##   NOVIEMBRE.22 NOVIEMBRE.22.1   DICIEMBRE.22       ENERO.23     FEBRERO.23 
##              0              0              0              0              0 
##       MARZO.23 
##              0

En la primer variable de la base de datos hay algunos datos que aparentan ser faltantes, sin embargo no es que sean datos faltantes, sino que en la base de datos original en excel, dichas celdas estaban combinadas por lo que R no lo identificó como NA´s

#Cambiar el nombre de una columna
#library(dplyr)
#?colnames
#bd1$NOVIEMBRE.22 <- colnames("OCTUBRE.22") 

5) Incluye una breve reflexión de la actividad.

En la base de datos de Delivery Plan se encontraba una cantidad de NA´s muy grande, por lo que fue preferible fusionar los datos y realizar una sumatoria que presentara los datos de manera mensual para tener un concentrado y un análisis de mayor valor. De igual forma, las primeras cuatro variables eran respecto al cliente y los productos o especificaciones de las entregas en unidad de medición de unidades de producción respecto a los deliveries, al ser especificaciones que finalmente terminaban con el cliente inicial, se decidió eliminar dichos rubros para englobar directamente las unidades con el cliente.

Se eliminaron dichas columnas, se verificó que no hubiera NA´S y se cambió el nombre también de una columna que tenía el nombre repetido como limpieza de datos.

En esta primera parte de la actividad se logró limpiar y visualizar la base de datos con la que trabajaremos.

c. FORM – Delivery Performance

bd_delivery_perf <- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/BD Form Delivery Performance.csv")

1) ¿Cuántas variables y cuántos registros tiene la base de datos?

La base de datos cuenta con 3 variables y 104 registros.

2) Clasificación de cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

Variable <-c("Cliente", "Transportista", "Fecha", "Plan Arrival", "Real Arrival", "Real Departure", "Diferencia")
Tipo <-c("Cualitativa (nominal)", "Cualitativa (nominal)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (continua)", "Cuantitativa (continua)")
table<-data.frame(Variable, Tipo)
knitr::kable(table)
Variable Tipo
Cliente Cualitativa (nominal)
Transportista Cualitativa (nominal)
Fecha Cuantitativa (continua)
Plan Arrival Cuantitativa (continua)
Real Arrival Cuantitativa (continua)
Real Departure Cuantitativa (continua)
Diferencia Cuantitativa (continua)

3) Elige la escala de medición de cada variable.

Variable <-c("Cliente", "Transportista", "Fecha", "Plan Arrival", "Real Arrival", "Real Departure", "Diferencia")
Medicion <-c("Nominal", "Nominal", "Intervalo", "Intervalo", "Intervalo", "Intervalo", "Intervalo")
table2<-data.frame(Variable, Medicion)
knitr::kable(table2)
Variable Medicion
Cliente Nominal
Transportista Nominal
Fecha Intervalo
Plan Arrival Intervalo
Real Arrival Intervalo
Real Departure Intervalo
Diferencia Intervalo

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

Se realizó una limpia previa a la base de datos debido a que no se podía manejar en R, ya que el formato en que se encontraba no permitía que R pudiera entender cuales eran las variables de nuestra base de datos, por lo tanto las modificaciones y limpiezas que se realizaron fue la técnica de ‘Remover valores irrelevantes’ en este caso quitamos la conclusión porque no tendría valor en la base de datos, eliminamos target (horas) y tomamos el valor de cada inicio de mes para comparar principio de mes con mes, después en R se trabajo con la técnica de convertir tipos de datos en este caso de caracter a fecha y caracter a hora.

## Técnica 4. Convertir tipos de datos

# Convertir de caracter a fecha
bd_delivery_perf$Fecha <- as.Date(bd_delivery_perf$Fecha, format ="%d/%m/%y")
library(tibble)
tibble(bd_delivery_perf)  
## # A tibble: 104 × 7
##    Cliente    Transportista Fecha      Plan.arrival Real.arrival Real.…¹ Difer…²
##    <chr>      <chr>         <date>            <dbl>        <dbl>   <dbl>   <dbl>
##  1 "PRINTEL " "JUVENCIO"    2020-07-01           16            0    0       0   
##  2 "MAHLE"    "DIONICIO "   2020-07-01            8            8    8.55    0.55
##  3 "MAHLE"    "DIONICIO "   2020-07-01            9            9   10       1   
##  4 "MAHLE"    "DIONICIO "   2020-07-01           20           20   21.1     1.1 
##  5 "MAGNA"    "EZEQUIEL "   2020-07-01            0            0    0       0   
##  6 "VARROC"   "JUVENCIO"    2020-07-01            0            0    0       0   
##  7 "VARROC"   "JUVENCIO"    2020-07-01            0            0    0       0   
##  8 "VARROC"   "JUVENCIO"    2020-07-01            0            0    0       0   
##  9 "PRINTEL " "JUVENCIO"    2020-08-01           16           16   17       1   
## 10 "MAHLE"    "DIONICIO "   2020-08-01            8            8    8.51    0.51
## # … with 94 more rows, and abbreviated variable names ¹​Real.Departure,
## #   ²​Diferencia
# Convertir de caracter a hora
bd_delivery_perf$Real.arrival <- substr(bd_delivery_perf$Real.arrival, start = 1, stop = 2)
tibble(bd_delivery_perf)
## # A tibble: 104 × 7
##    Cliente    Transportista Fecha      Plan.arrival Real.arrival Real.…¹ Difer…²
##    <chr>      <chr>         <date>            <dbl> <chr>          <dbl>   <dbl>
##  1 "PRINTEL " "JUVENCIO"    2020-07-01           16 0               0       0   
##  2 "MAHLE"    "DIONICIO "   2020-07-01            8 8               8.55    0.55
##  3 "MAHLE"    "DIONICIO "   2020-07-01            9 9              10       1   
##  4 "MAHLE"    "DIONICIO "   2020-07-01           20 20             21.1     1.1 
##  5 "MAGNA"    "EZEQUIEL "   2020-07-01            0 0               0       0   
##  6 "VARROC"   "JUVENCIO"    2020-07-01            0 0               0       0   
##  7 "VARROC"   "JUVENCIO"    2020-07-01            0 0               0       0   
##  8 "VARROC"   "JUVENCIO"    2020-07-01            0 0               0       0   
##  9 "PRINTEL " "JUVENCIO"    2020-08-01           16 16             17       1   
## 10 "MAHLE"    "DIONICIO "   2020-08-01            8 8               8.51    0.51
## # … with 94 more rows, and abbreviated variable names ¹​Real.Departure,
## #   ²​Diferencia
bd_delivery_perf$Real.arrival<- as.integer(bd_delivery_perf$Real.arrival)  
str(bd_delivery_perf)
## 'data.frame':    104 obs. of  7 variables:
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ Transportista : chr  "JUVENCIO" "DIONICIO " "DIONICIO " "DIONICIO " ...
##  $ Fecha         : Date, format: "2020-07-01" "2020-07-01" ...
##  $ Plan.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.arrival  : int  0 8 9 20 0 0 0 0 16 8 ...
##  $ Real.Departure: num  0 8.55 10 21.1 0 0 0 0 17 8.51 ...
##  $ Diferencia    : num  0 0.55 1 1.1 0 0 0 0 1 0.51 ...
bd_delivery_perf$Real.Departure <- substr(bd_delivery_perf$Real.Departure, start = 1, stop = 2)
tibble(bd_delivery_perf)
## # A tibble: 104 × 7
##    Cliente    Transportista Fecha      Plan.arrival Real.arrival Real.…¹ Difer…²
##    <chr>      <chr>         <date>            <dbl>        <int> <chr>     <dbl>
##  1 "PRINTEL " "JUVENCIO"    2020-07-01           16            0 0          0   
##  2 "MAHLE"    "DIONICIO "   2020-07-01            8            8 8.         0.55
##  3 "MAHLE"    "DIONICIO "   2020-07-01            9            9 10         1   
##  4 "MAHLE"    "DIONICIO "   2020-07-01           20           20 21         1.1 
##  5 "MAGNA"    "EZEQUIEL "   2020-07-01            0            0 0          0   
##  6 "VARROC"   "JUVENCIO"    2020-07-01            0            0 0          0   
##  7 "VARROC"   "JUVENCIO"    2020-07-01            0            0 0          0   
##  8 "VARROC"   "JUVENCIO"    2020-07-01            0            0 0          0   
##  9 "PRINTEL " "JUVENCIO"    2020-08-01           16           16 17         1   
## 10 "MAHLE"    "DIONICIO "   2020-08-01            8            8 8.         0.51
## # … with 94 more rows, and abbreviated variable names ¹​Real.Departure,
## #   ²​Diferencia
bd_delivery_perf$Real.Departure<- as.integer(bd_delivery_perf$Real.Departure)  
str(bd_delivery_perf)
## 'data.frame':    104 obs. of  7 variables:
##  $ Cliente       : chr  "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
##  $ Transportista : chr  "JUVENCIO" "DIONICIO " "DIONICIO " "DIONICIO " ...
##  $ Fecha         : Date, format: "2020-07-01" "2020-07-01" ...
##  $ Plan.arrival  : num  16 8 9 20 0 0 0 0 16 8 ...
##  $ Real.arrival  : int  0 8 9 20 0 0 0 0 16 8 ...
##  $ Real.Departure: int  0 8 10 21 0 0 0 0 17 8 ...
##  $ Diferencia    : num  0 0.55 1 1.1 0 0 0 0 1 0.51 ...

5) Incluye una breve reflexión de la actividad.

En esta actividad pudimos trabajar lo que es manejar una base de datos y conocer que información contiene, analizar que tipos de variables tenemos y limpiarla para poder realizar análisis que sean acertados y correctos para lograr tomar buenas decisiones.

d. Fuente de Datos Externa

Llamar base de datos.

bd <- read.csv("/Users/georginamartinez/Documents/Tec/Séptimo Semestre/Analítica para negocios, de los datos a decisiones/Base de datos FORM/BD externa/ACTIVIDAD 2.2 (1).csv")

Entender Base de Datos

resumen <- summary(bd)
resumen
##        ID          Unidad._Económica  Clase._de_actividad
##  Min.   :  19590   Length:1436        Length:1436        
##  1st Qu.:3345160   Class :character   Class :character   
##  Median :6711642   Mode  :character   Mode  :character   
##  Mean   :5943914                                         
##  3rd Qu.:8217786                                         
##  Max.   :9386710                                         
##  Descripcion.estrato.personal    Estado          Tipo_establecimiento
##  Length:1436                  Length:1436        Length:1436         
##  Class :character             Class :character   Class :character    
##  Mode  :character             Mode  :character   Mode  :character    
##                                                                      
##                                                                      
## 

1) ¿Cuántas variables y cuántos registros tiene la base de datos?*

####
R= 1436 registros y 6 variables
str(bd)
## 'data.frame':    1436 obs. of  6 variables:
##  $ ID                          : int  6281702 8780043 8195140 6281593 6320508 34353 9275228 6912230 6375633 6733875 ...
##  $ Unidad._Económica           : chr  "AGI SHOREWOOD MEXICO S DE RL DE CV" "BIO PAPPEL" "CAJAS CON CARTON" "CAJAS CORRUGADAS DE AGUASCALIENTES" ...
##  $ Clase._de_actividad         : chr  "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" ...
##  $ Descripcion.estrato.personal: chr  "101 a 250 personas" "0 a 5 personas" "0 a 5 personas" "11 a 30 personas" ...
##  $ Estado                      : chr  "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" ...
##  $ Tipo_establecimiento        : chr  "Fijo" "Fijo" "Fijo" "Fijo" ...
#install.packages("psych")
library(psych)
describe(bd)
##                               vars    n       mean         sd    median
## ID                               1 1436 5943913.83 2732018.76 6711642.0
## Unidad._Económica*               2 1436     592.62     349.32     595.5
## Clase._de_actividad*             3 1436       1.00       0.00       1.0
## Descripcion.estrato.personal*    4 1436       3.36       2.23       3.0
## Estado*                          5 1436      12.47       6.10      13.0
## Tipo_establecimiento*            6 1436       1.00       0.04       1.0
##                                  trimmed        mad   min     max   range  skew
## ID                            6177316.64 2536145.94 19590 9386710 9367120 -0.72
## Unidad._Económica*                590.84     446.26     1    1214    1213  0.03
## Clase._de_actividad*                1.00       0.00     1       1       0   NaN
## Descripcion.estrato.personal*       3.20       2.97     1       8       7  0.47
## Estado*                            12.33       5.93     1      28      27  0.14
## Tipo_establecimiento*               1.00       0.00     1       2       1 26.71
##                               kurtosis       se
## ID                               -0.82 72095.22
## Unidad._Económica*               -1.19     9.22
## Clase._de_actividad*               NaN     0.00
## Descripcion.estrato.personal*    -1.21     0.06
## Estado*                          -0.43     0.16
## Tipo_establecimiento*           712.00     0.00

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.*

Variable<-c("ID","Unidad._Económica","Clase._de_actividad","Descripcion.estrato.personal","Estado", "Tipo_establecimiento")
Type<-c("Cuantitativa(continua)","Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa")
table<-data.frame(Variable,Type)
knitr::kable(table)
Variable Type
ID Cuantitativa(continua)
Unidad._Económica Cualitativa
Clase._de_actividad Cualitativa
Descripcion.estrato.personal Cualitativa
Estado Cualitativa
Tipo_establecimiento Cualitativa

3) Elige la escala de medición de cada variable.*

Variable<-c("ID","Unidad._Económica","Clase._de_actividad","Descripcion.estrato.personal","Estado", "Tipo_establecimiento")
Type<-c("Cuantitativa(continua)","Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa", "Cualitativa")
Escala_de_Medición <- c("Unidades de razon","Empresa","Tipo de fabricante", "Numero de personal","Estado", "Fijo/Semifijo")
table<-data.frame(Variable,Type,Escala_de_Medición)
knitr::kable(table)
Variable Type Escala_de_Medición
ID Cuantitativa(continua) Unidades de razon
Unidad._Económica Cualitativa Empresa
Clase._de_actividad Cualitativa Tipo de fabricante
Descripcion.estrato.personal Cualitativa Numero de personal
Estado Cualitativa Estado
Tipo_establecimiento Cualitativa Fijo/Semifijo

4) Aplica al menos 2 tecnicas de limpieza de base de datos y explicalas brevemente, ¿Porqué realizaste estas tecnicas?*

Tecnica 1. Remover valores irrelevantes

La base de datos contenía el ID de cada una de las empresas, sin embargo, para nuestro analisis que estamos realizando no es importante por lo que utilizamos la funcion de subset para eliminar la columna.
Eliminar columnas
bd1 <- bd
bd1<-subset(bd1,select=-c(ID))
str(bd1)
## 'data.frame':    1436 obs. of  5 variables:
##  $ Unidad._Económica           : chr  "AGI SHOREWOOD MEXICO S DE RL DE CV" "BIO PAPPEL" "CAJAS CON CARTON" "CAJAS CORRUGADAS DE AGUASCALIENTES" ...
##  $ Clase._de_actividad         : chr  "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" ...
##  $ Descripcion.estrato.personal: chr  "101 a 250 personas" "0 a 5 personas" "0 a 5 personas" "11 a 30 personas" ...
##  $ Estado                      : chr  "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" ...
##  $ Tipo_establecimiento        : chr  "Fijo" "Fijo" "Fijo" "Fijo" ...

Técnica 2. Remover valores duplicados

Encontramos que varias empresas estaban registradas mas de una vez por lo que eran valores repetidos en la base de datos, por lo que utilizamos la tecnica de limpieza de eliminar valores duplicados con la función de distinct, se encontraron 42 valores duplicados.

¿Cuántos renglones duplicados tenemos?
bd1 [duplicated(bd1),]
##                                Unidad._Económica
## 37             SOLUCIONES EN EMPAQUE Y LOGISTICA
## 49      CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 63                 EMPAQUES PRECISOS DE MEXICALI
## 89                       SINIL INDUSTRY SA DE CV
## 119                    DANHIL DE MEXICO SA DE CV
## 172                                      DURABOX
## 211                                   BIO PAPPEL
## 251             FABRICACIÓN DE ENVASES DE CARTÓN
## 372                                     CORRUWAX
## 383                                  EMPAQUES 06
## 390                            ENVASES MICROONDA
## 481  PROCESOS ESPECIALIZADOS DE CARTON DE MEXICO
## 670                                   PRAKTICAJA
## 698                                   BIO PAPPEL
## 703                         BIO PAPPEL SAB DE CV
## 728           CAJAS Y EMPAQUES MODERNOS SA DE CV
## 736                                    CARTONERA
## 803               FABRICACION DE CAJAS DE CARTON
## 804               FABRICACION DE CAJAS DE CARTON
## 805               FABRICACION DE CAJAS DE CARTON
## 818                                  GRUPO TENSA
## 919                                    HVM GROUP
## 955                                    BRECEPACK
## 963                      CAJAS DE CARTON SULTANA
## 980                           CARTOLITO SA DE CV
## 1021                         EMPAQUES CONFIABLES
## 1047            FABRICACIÓN DE ENVASES DE CARTÓN
## 1052                                       FECSA
## 1068                         HEXAGONOS MEXICANOS
## 1091                       LITOGRAFICA ROBERTSON
## 1224                               CORRUEMPAQUES
## 1226                   CORRUGADOS ESPECIALIZADOS
## 1241                                         ESK
## 1281                              CAJAS MIL USOS
## 1286                           CARDBOARD & BOXES
## 1302              EMPAQUES Y ENVOLTURAS SA DE CV
## 1338    CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1339    CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1340    CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1341    CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1374                EMPAQUES RIO GRANDE SA DE CV
## 1403                         HEXAGONOS MEXICANOS
##                   Clase._de_actividad Descripcion.estrato.personal
## 37   Fabricación de envases de cartón             11 a 30 personas
## 49   Fabricación de envases de cartón               0 a 5 personas
## 63   Fabricación de envases de cartón               0 a 5 personas
## 89   Fabricación de envases de cartón           251 y más personas
## 119  Fabricación de envases de cartón             31 a 50 personas
## 172  Fabricación de envases de cartón           101 a 250 personas
## 211  Fabricación de envases de cartón             31 a 50 personas
## 251  Fabricación de envases de cartón               0 a 5 personas
## 372  Fabricación de envases de cartón               0 a 5 personas
## 383  Fabricación de envases de cartón              6 a 10 personas
## 390  Fabricación de envases de cartón               0 a 5 personas
## 481  Fabricación de envases de cartón             11 a 30 personas
## 670  Fabricación de envases de cartón             11 a 30 personas
## 698  Fabricación de envases de cartón             31 a 50 personas
## 703  Fabricación de envases de cartón           251 y más personas
## 728  Fabricación de envases de cartón           101 a 250 personas
## 736  Fabricación de envases de cartón               0 a 5 personas
## 803  Fabricación de envases de cartón               0 a 5 personas
## 804  Fabricación de envases de cartón               0 a 5 personas
## 805  Fabricación de envases de cartón               0 a 5 personas
## 818  Fabricación de envases de cartón               0 a 5 personas
## 919  Fabricación de envases de cartón               0 a 5 personas
## 955  Fabricación de envases de cartón             31 a 50 personas
## 963  Fabricación de envases de cartón            51 a 100 personas
## 980  Fabricación de envases de cartón             11 a 30 personas
## 1021 Fabricación de envases de cartón               0 a 5 personas
## 1047 Fabricación de envases de cartón               0 a 5 personas
## 1052 Fabricación de envases de cartón               0 a 5 personas
## 1068 Fabricación de envases de cartón             11 a 30 personas
## 1091 Fabricación de envases de cartón             11 a 30 personas
## 1224 Fabricación de envases de cartón             11 a 30 personas
## 1226 Fabricación de envases de cartón              6 a 10 personas
## 1241 Fabricación de envases de cartón             11 a 30 personas
## 1281 Fabricación de envases de cartón               0 a 5 personas
## 1286 Fabricación de envases de cartón               0 a 5 personas
## 1302 Fabricación de envases de cartón               0 a 5 personas
## 1338 Fabricación de envases de cartón               0 a 5 personas
## 1339 Fabricación de envases de cartón               0 a 5 personas
## 1340 Fabricación de envases de cartón               0 a 5 personas
## 1341 Fabricación de envases de cartón               0 a 5 personas
## 1374 Fabricación de envases de cartón            51 a 100 personas
## 1403 Fabricación de envases de cartón             31 a 50 personas
##                    Estado Tipo_establecimiento
## 37         AGUASCALIENTES                 Fijo
## 49        BAJA CALIFORNIA                 Fijo
## 63        BAJA CALIFORNIA                 Fijo
## 89        BAJA CALIFORNIA                 Fijo
## 119  COAHUILA DE ZARAGOZA                 Fijo
## 172             CHIHUAHUA                 Fijo
## 211      CIUDAD DE MÉXICO                 Fijo
## 251      CIUDAD DE MÉXICO                 Fijo
## 372            GUANAJUATO                 Fijo
## 383            GUANAJUATO                 Fijo
## 390            GUANAJUATO                 Fijo
## 481            GUANAJUATO                 Fijo
## 670               JALISCO                 Fijo
## 698                MÉXICO                 Fijo
## 703                MÉXICO                 Fijo
## 728                MÉXICO                 Fijo
## 736                MÉXICO                 Fijo
## 803                MÉXICO                 Fijo
## 804                MÉXICO                 Fijo
## 805                MÉXICO                 Fijo
## 818                MÉXICO                 Fijo
## 919   MICHOACÁN DE OCAMPO                 Fijo
## 955            NUEVO LEÓN                 Fijo
## 963            NUEVO LEÓN                 Fijo
## 980            NUEVO LEÓN                 Fijo
## 1021           NUEVO LEÓN                 Fijo
## 1047           NUEVO LEÓN                 Fijo
## 1052           NUEVO LEÓN                 Fijo
## 1068           NUEVO LEÓN                 Fijo
## 1091           NUEVO LEÓN                 Fijo
## 1224            QUERÉTARO                 Fijo
## 1226            QUERÉTARO                 Fijo
## 1241            QUERÉTARO                 Fijo
## 1281      SAN LUIS POTOSÍ                 Fijo
## 1286      SAN LUIS POTOSÍ                 Fijo
## 1302      SAN LUIS POTOSÍ                 Fijo
## 1338               SONORA                 Fijo
## 1339               SONORA                 Fijo
## 1340               SONORA                 Fijo
## 1341               SONORA                 Fijo
## 1374           TAMAULIPAS                 Fijo
## 1403             TLAXCALA                 Fijo
sum(duplicated(bd1))
## [1] 42
Eliminar renglones duplicados
bd2 <- bd1
library(dplyr)
bd2 <- distinct (bd2)

5) Reflexion

En conclusion nosotros estuvimos analizando la base de datos que obtuvimos del INEGI, la cual contenía el tamaño de las empresas del sector en el que se encuentra FORM, esto para conocer si son empresas pymes o nacionales, destacamos información que podría ser relavante como conocer cuantas variables y registros tiene la base datos, si son cualitativa o cuantitativa. Tambien realizamos dos técnicas de limpieza que nos podrian ayudar a tener un resultado mas favorable al momento de realizar la estadistica. Eliminamos la columna de ID ya que consideramos no es necesaria para lo que estamos buscando y tambien eliminamos renglones duplicados.

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIDIuMTogQ29ub2NpbWllbnRvIHkgcHJlcGFyYWNpw7NuIGRlIGxhcyBiYXNlcyBkZSBkYXRvcyBwYXJhIGVsIGFuw6FsaXNpcyBkZSBsYXMgdmFyaWFibGVzIHJlbGV2YW50ZXMiCmF1dGhvcjogIkdlb3JnaW5hIE1hcnTDrW5leiwgRWxlbmEgVmVsYSwgU2ViYXN0acOhbiBHYXJ6YSwgSXNhYWMgRMOtYXosIEFuYSBBcnZpenUiCmRhdGU6ICIyMDIyLTA5LTIzIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCjxpbWcgc3JjPSAiL1VzZXJzL2dlb3JnaW5hbWFydGluZXovRG9jdW1lbnRzL1RlYy9TZcyBcHRpbW8gU2VtZXN0cmUvQW5hbGnMgXRpY2EgcGFyYSBuZWdvY2lvcywgZGUgbG9zIGRhdG9zIGEgZGVjaXNpb25lcy9Gb3JtLnBuZyI+CgojIyAgKiphLiBGT1JNIOKAkyBSZWN1cnNvcyBIdW1hbm9zKiogCgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPyAKRW4gZWwgcHJpbWVyICpzaGVldCosICJDb2xhYm9yYWRvcmVzIgpgYGB7cn0KYmRfcmhfY29sYWJvcmFkb3JlczwtcmVhZC5jc3YoIi9Vc2Vycy9nZW9yZ2luYW1hcnRpbmV6L0RvY3VtZW50cy9UZWMvU2XMgXB0aW1vIFNlbWVzdHJlL0FuYWxpzIF0aWNhIHBhcmEgbmVnb2Npb3MsIGRlIGxvcyBkYXRvcyBhIGRlY2lzaW9uZXMvQmFzZSBkZSBkYXRvcyBGT1JNL1JIL2NvbGFiYmIuY3N2IikKc3VtbWFyeShiZF9yaF9jb2xhYm9yYWRvcmVzKQpgYGAKClNlIHRpZW5lbiAyNiB2YXJpYWJsZXMgeSAxMTMgcmVnaXN0cm9zLiAKCiMjIyAyKSBDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhIApgYGB7cn0Kc3RyKGJkX3JoX2NvbGFib3JhZG9yZXMpCmBgYAoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBOby5EZS5FbXBsZWFkb2AiLCJgQXBlbGxpZG9zYCIsImBOb21icmVgIiwiYEZlY2hhTmFjaW1pZW50b2AiLCJgR2VuZXJvYCIsImBSRkNgIiwiYEZlY2hhQWx0YWAiLCJgUHJpbWVyTWVzYCIsImA0dG9NZXNgIiwiYEJhamFgIiwiYFB1ZXN0b2AiLCJgRGVwYXJ0YW1lbnRvYCIsImBTZWd1cm9Tb2NpYWxgIiwiYFNhbGFyaW9EaWFyaW9gIiwiYEZhY3RvckluZm9uYXZpdGAiLCJgTi5DcmVkaXRvSW5mb25hdml0YCIsImBMdWdhck5hY2ltaWVudG9gIiwiYENVUlBgIiwiYENhbGxlYCIsImBOdW1lcm9JbnRlcm5vYCIsImBDb2xvbmlhYCIsImBNdW5pY2lwaW9gIiwiYEVzdGFkb2AiLCJgQ29kaWdvUG9zdGFsYCIsImBFc3RhZG9DaXZpbGAiLCJgVGFyamV0YWAiKQpUeXBlPC1jKCJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsICJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsICJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YW50aXRhdGl2YSAoY29udGludW8pIiwiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCgojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBOby5EZS5FbXBsZWFkb2AiLCJgQXBlbGxpZG9zYCIsImBOb21icmVgIiwiYEZlY2hhTmFjaW1pZW50b2AiLCJgR2VuZXJvYCIsImBSRkNgIiwiYEZlY2hhQWx0YWAiLCJgUHJpbWVyTWVzYCIsImA0dG9NZXNgIiwiYEJhamFgIiwiYFB1ZXN0b2AiLCJgRGVwYXJ0YW1lbnRvYCIsImBTZWd1cm9Tb2NpYWxgIiwiYFNhbGFyaW9EaWFyaW9gIiwiYEZhY3RvckluZm9uYXZpdGAiLCJgTi5DcmVkaXRvSW5mb25hdml0YCIsImBMdWdhck5hY2ltaWVudG9gIiwiYENVUlBgIiwiYENhbGxlYCIsImBOdW1lcm9JbnRlcm5vYCIsImBDb2xvbmlhYCIsImBNdW5pY2lwaW9gIiwiYEVzdGFkb2AiLCJgQ29kaWdvUG9zdGFsYCIsImBFc3RhZG9DaXZpbGAiLCJgVGFyamV0YWAiKQpNZWRpY2lvbjwtYygiTsO6bWVyb3MiLCAiTm8gYXBsaWNhIiwgIk5vIGFwbGljYSIsICJBw7FvIiwiTm8gYXBsaWNhIiwgIk5vIGFwbGljYSIsICJBw7FvIiwgIkHDsW8iLCJBw7FvIiwgIk7Dum1lcm9zIiwgIk5vIGFwbGljYSIsICJObyBhcGxpY2EiLCJObyBhcGxpY2EiLCAiUGVzb3MgbWV4aWNhbm9zIiwiUGVzb3MgbWV4aWNhbm9zIiwgIk5vIGFwbGljYSIsIk5vIGFwbGljYSIsICJObyBhcGxpY2EiLCJObyBhcGxpY2EiLCAiTm8gYXBsaWNhIiwiTm8gYXBsaWNhIiwgIk5vIGFwbGljYSIsIk5vIGFwbGljYSIsICJObyBhcGxpY2EiLCJObyBhcGxpY2EiLCAiTm8gYXBsaWNhIikKdGFibGUyPC1kYXRhLmZyYW1lKFZhcmlhYmxlLE1lZGljaW9uKQprbml0cjo6a2FibGUodGFibGUyKQpgYGAKCgojIyMgNCkgQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyAgCgojIyMjIyAqKlTDqWNuaWNhIDMsICpFUlJPUkVTIFRJUE9HUsOBRklDT1MgWSBFUlJPUkVTIFNJTUlMQVJFUyoqKiAgClByaW1lcmFtZW50ZSwgc2Ugbm90w7MgcXVlIGVuIGVsIGV4Y2VsIGFsZ3VuYXMgZmVjaGFzIGVzdGFiYW4gY29uIGZvcm1hdG8gZMOtYS9tZXMvYcOxbyB5IG90cm9zIG1lcy9kw61hL2HDsW8uIFBvciBsbyBxdWUgcGFyYSB0ZW5lciBsYSBpbmZvcm1hY2nDs24gbcOhcyByZWFsIHkgcHJlY2lzYSBwb3NpYmxlLCBzZSBleHRyYWplcm9uIHNvbG8gbG9zIEHDkU9TIHBhcmEgZWwgYW7DoWxpc2lzLgoKIyMjIyMgKipUw6ljbmljYSAxLCAqUkVNT1ZFUiBEQVRPUyBJUlJFTEVWQU5URVMqKioKRXhpc3RlbiBtdWNoYXMgdmFyaWFibGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MsIHkgbXVjaGFzIGRlIGVzdGFzIGNvbnRpZW5lbiBkYXRvcyBwZXJzb25hbGVzIGRlIGxvcyBjb2xhYm9yYWRvcmVzLCBwb3IgbG8gcXVlIGVzIGluZm9ybWFjacOzbiBtdXkgc2Vuc2libGUgeSBxdWUgbm8gYXBvcnRhIG11Y2hvICppbnNpZ2h0KiBhbCBhbsOhbGlzaXMuIFBvciBsbyB0YW50bywgc2UgaGEgZXNjb2dpZG8gbGEgdMOpY25pY2EgZGUgcmVtb3ZlciBkYXRvcyBpcnJlbGV2YW50ZXMgYSBsYSBpbmZvcm1hY2nDs24gcGVyc29uYWwgZGUgbG9zIGVtcGxlYWRvcyBxdWUgbm8gc2lydmFuIG11Y2hvIHBhcmEgZWwgYW7DoWxpc2lzLCBjb21vIGxvIGVzIHN1IG5vbWJyZSwgYXBlbGxpZG8sIFJGQywgQ1VSUC4gU2luIGVtYmFyZ28sIG90cm9zIGRhdG9zIHBlcnNvbmFsZXMgc2UgaGFuIG1hbnRlbmlkbyBwYXJhIGhhY2VyIHVuIGFuw6FsaXNpcyBkZSBkaXZlcnNpZGFkIGUgaW5jbHVzacOzbiAoZ8OpbmVybywgZmVjaGEgZGUgbmFjaW1pZW50bywgZXN0YWRvIGNpdmlsKS4KCmBgYHtyfQpzdW1tYXJ5KGJkX3JoX2NvbGFib3JhZG9yZXMpCmBgYAoKCiMjIyMgRWxpbWluYXIgY29sdW1uYXMKU2UgZWxpbWluYW4gbGFzIGNvbHVtbmFzIHF1ZSBubyBhcG9ydGFuIG11Y2hvIGFsIGFuw6FsaXNpcyBkZSBkYXRvcy4KYGBge3J9CiAgYmRfcmhfY29sYWJvcmFkb3JlczI8LWJkX3JoX2NvbGFib3JhZG9yZXMKICBiZF9yaF9jb2xhYm9yYWRvcmVzMjwtc3Vic2V0KGJkX3JoX2NvbGFib3JhZG9yZXMyLHNlbGVjdD0tYyhOby4uRGUuRW1wbGVhZG8sVEFSSkVUQS4uLi5DVUVOVEEsQ09ESUdPLlBPU1RBTCxDT0xPTklBLE5VTUVSTy5JTlRFUk5PLENBTExFLENVUlAsRkFDVE9SLkNSRUQuSU5GT05BVklULE5PLlNFR1VSTy5TT0NJQUwsUkZDLEFQRUxMSURPUyxOT01CUkUpKQpzdW1tYXJ5KGJkX3JoX2NvbGFib3JhZG9yZXMyKQpgYGAKCiMjIyMjICoqVMOpY25pY2EgNSwgKlZBTE9SRVMgRkFMVEFOVEVTKioqICAKQ29uIHVuIHLDoXBpZG8gdmlzdGF6byBkZSBsYSBiYXNlIGRlIGRhdG9zLCBzZSBwb2TDrWEgb2JzZXJ2YXIgcXVlIGZhbHRhYmFuIGNpZXJ0b3MgdmFsb3JlcyBlbiBsYXMgZGlmZXJlbnRlcyB2YXJpYWJsZXMuIFNpIGZhbHRhYmFuIG11Y2hvcyBkYXRvcyBlbiB1bmEgc29sYSB2YXJpYWJsZSwgc2Ugb3B0w7MgcG9yIGVsaW1pbmFyIGxhICpjb2x1bW5hKiwgbWllbnRyYXMgcXVlIGVuIG90cm9zIGNhc29zIGRvbmRlIGhheWEgcG9jb3MgcG9yIHZhcmlhYmxlcyBzw7NsbyBzZSBlbGltaW5hcm9uIGxvcyByZWdpc3Ryb3MuICAKCiMjIyMgwr9DdcOhbnRvcyBOQSAgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8gIApgYGB7cn0Kc3VtKGlzLm5hKGJkX3JoX2NvbGFib3JhZG9yZXMyKSkKYGBgCiAgICAgIAojIyMjIMK/Q3XDoW50b3MgTkEgdGVuZ28gcG9yIHZhcmlhYmxlPwpgYGB7cn0Kc2FwcGx5KGJkX3JoX2NvbGFib3JhZG9yZXMyLGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKIyMjIyBFbiBsYSBiYXNlIGRlIGRhdG9zIHNlIHRpZW5lbiBsb3MgTkEgZW4gdW5hIHNvbGEgdmFyaWFibGU6IEJBSkEuIEFxdWkgZmFsdGFuIDEwMCBkZSAxMTMgcmVnaXN0cm9zLCBwb3IgbG8gcXVlIHJlc3VsdGEgbWVqb3IgRUxJTUlOQVIgbGEgY29sdW1uYSBlbiBzdSB0b3RhbGlkYWQuCmBgYHtyfQpiZF9yaF9jb2xhYm9yYWRvcmVzMzwtYmRfcmhfY29sYWJvcmFkb3JlczIKICBiZF9yaF9jb2xhYm9yYWRvcmVzMzwtc3Vic2V0KGJkX3JoX2NvbGFib3JhZG9yZXMyLHNlbGVjdD0tYyhCQUpBKSkKc3VtbWFyeShiZF9yaF9jb2xhYm9yYWRvcmVzMykKYGBgCiMjIyMgKlNlIHZ1ZWx2ZSBhIHZlciBsbyBkZSBOQXMqICAKCiMjIyMgwr9DdcOhbnRvcyBOQSB0ZW5nbyBwb3IgdmFyaWFibGU/CmBgYHtyfQpzYXBwbHkoYmRfcmhfY29sYWJvcmFkb3JlczMsZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKYGBgCgojIyMjIEVsaW1pbmFyIHJlbmdsb25lcyBkZSBOQXMKYGBge3J9CmJkX3JoX2NvbGFib3JhZG9yZXM0PC1iZF9yaF9jb2xhYm9yYWRvcmVzMwpiZF9yaF9jb2xhYm9yYWRvcmVzNDwtbmEub21pdChiZF9yaF9jb2xhYm9yYWRvcmVzNCkgICAgICAKc3VtbWFyeShiZF9yaF9jb2xhYm9yYWRvcmVzNCkKc2FwcGx5KGJkX3JoX2NvbGFib3JhZG9yZXM0LGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCmBgYAoKIyMjIyBFbGltaW5hciBlcnJvciBkZSBmZWNoYSBkZSBuYWNpbWllbnRvIChleGlzdGVuIGRhdG9zIHF1ZSBtdWVzdHJhbiBxdWUgYWxndWllbiBuYWNpw7MgZW4gZWwgMjAyMikKYGBge3J9CiAgYmRfcmhfY29sYWJvcmFkb3JlczU8LWJkX3JoX2NvbGFib3JhZG9yZXM0CiAgYmRfcmhfY29sYWJvcmFkb3JlczU8LWJkX3JoX2NvbGFib3JhZG9yZXM1W2JkX3JoX2NvbGFib3JhZG9yZXM1JEHDkU8uREUuTkFDSU1JRU5UTzwyMDA0LF0KICBzdW1tYXJ5KGJkX3JoX2NvbGFib3JhZG9yZXM1KQpgYGAKClF1ZWRhIGxpbXBpYSB5IGxpc3RhIHBhcmEgYW5hbGl6YXIgbGEgYmFzZSBkZSBkYXRvcy4gCgojIyMjIEV4cG9ydGFyCmBgYHtyfQpyaF9saW1waWEgPC1iZF9yaF9jb2xhYm9yYWRvcmVzNQp3cml0ZS5jc3YocmhfbGltcGlhLCBmaWxlID0icmhfbGltcGlhNS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojIyMgNSkgSW5jbHV5ZSB1bmEgYnJldmUgcmVmbGV4acOzbiBkZSBsYSBhY3RpdmlkYWQuCkVzdGEgYmFzZSBkZSBkYXRvcyBmdWUgdG9tYW5kbyBlbiBjdWVudGEgbG9zIGRhdG9zIG90b3JnYWRvcyAgcG9yIEZvcm0gZGUgIHN1IGdlc3Rpw7NuIGRlIFJlY3Vyc29zIEh1bWFub3MuIE9idGVuZW1vcyBsb3MgZGF0b3MgZGUgbG9zIGNvbGFib3JhZG9yZXMsIHkgYWxndW5hcyBkZSBzdXMgY2FyYWN0ZXLDrXN0aWNhcyAgcXVlIHBvZHLDrWFuIHJlc3VsdGFyIGludGVyZXNhbnRlcyBwYXJhIHByb3BvbmVyIGVzdHJhdGVnaWFzIGZ1bmRhbWVudGFkYXMgYSBsYSBvcmdhbml6YWNpw7NuLiBNZSBlbmNvbnRyw6kgY29uIGRpZmVyZW50ZXMgcmV0b3MgYWwgdHJhYmFqYXIgcHJpbWVyYW1lbnRlIGNvbiBsb3MgZGF0b3MsIGNvbW8gbG8gZnVlcm9uIGFsZ3Vub3MgZGF0b3MgZmFsdGFudGVzIHkgZXJyb3JlcyBkZSBkZWRvIChmZWNoYXMgZW4gaWRpb21hIGVzcGHDsW9sIHkgb3RyYXMgZW4gaW5nbMOpcyBkZSBFVUEpLiAgCgpVbmEgaW1wb3J0YW50ZSAgcmVmbGV4acOzbiBkZSBlc3RhIGFjdGl2aWRhZCBmdWUgY29tbyBSIG1lIHB1ZWRlIGF5dWRhciBhIHByZXBhcmFyIHVuYSBiYXNlIGRlIGRhdG9zIGRlIG1hbmVyYSBxdWUgdGVuZ2Ftb3MgbWVub3MgZXJyb3JlcyB5IGhhY2VyIGVsIHByb2Nlc28gbcOhcyBlZmljaWVudGUuIEVzdGUgcHJvY2VzbyByZWFsaXphZG8gc2Vyw6EgZGUgZ3JhbiB1dGlsaWRhZCBwYXJhIGxhcyBwcsOzeGltYXMgYWN0aXZpZGFkZXMgeSBsYSByZXNvbHVjacOzbiBkZWwgcmV0by4gCgojIyAqKmIuIEZPUk0g4oCTIERlbGl2ZXJ5IFBsYW4qKgoKIyMjIyBJbXBvcnRhciBiYXNlcyBkZSBkYXRvcwpgYGB7cn0KI2ZpbGUuY2hvb3NlKCkKCmJkIDwtIHJlYWQuY3N2KCIvVXNlcnMvZ2VvcmdpbmFtYXJ0aW5lei9Eb2N1bWVudHMvVGVjL1NlzIFwdGltbyBTZW1lc3RyZS9BbmFsacyBdGljYSBwYXJhIG5lZ29jaW9zLCBkZSBsb3MgZGF0b3MgYSBkZWNpc2lvbmVzL0Jhc2UgZGUgZGF0b3MgRk9STS9EZWxpdmVyeSBQbGFuL0ZPUk0gLSBEZWxpdmVyeSBQbGFuLnhsc3ggLSBERUxJVkVSWSBQTEFOKDIpICgxKUMuY3N2IikKYmQzPC0gcmVhZC5jc3YoIi9Vc2Vycy9nZW9yZ2luYW1hcnRpbmV6L0RvY3VtZW50cy9UZWMvU2XMgXB0aW1vIFNlbWVzdHJlL0FuYWxpzIF0aWNhIHBhcmEgbmVnb2Npb3MsIGRlIGxvcyBkYXRvcyBhIGRlY2lzaW9uZXMvQmFzZSBkZSBkYXRvcyBGT1JNL0RlbGl2ZXJ5IFBsYW4vMjAyMi5jc3YiKQpiZDQ8LSByZWFkLmNzdigiL1VzZXJzL2dlb3JnaW5hbWFydGluZXovRG9jdW1lbnRzL1RlYy9TZcyBcHRpbW8gU2VtZXN0cmUvQW5hbGnMgXRpY2EgcGFyYSBuZWdvY2lvcywgZGUgbG9zIGRhdG9zIGEgZGVjaXNpb25lcy9CYXNlIGRlIGRhdG9zIEZPUk0vRGVsaXZlcnkgUGxhbi9hbsyDby5jc3YiKQpzdW1tYXJ5KGJkKQpgYGAKCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/CmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQpkZXNjcmliZURhdGEoYmQsIGhlYWQ9MSwgdGFpbD0xICkKYGBgCjxjZW50ZXI+IDxzcGFuIHN0eWxlPSJjb2xvcjpPcmFuZ2UiPkNvbiBsYSBmdW5jacOzbiBhbnRlcmlvciBwb2RlbW9zIG9ic2VydmFyIHF1ZSBjdWFudGlmaWNhIDIzMSByZWdpc3Ryb3MgY29tcGxldG9zIHkgMjYgdmFyaWFibGVzIGVuIG51ZXN0cmEgYmFzZSBkZSBkYXRvcyBvcmlnaW5hbC48L2NlbnRlcj4KCiMjIyAyKSBDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhCmBgYHtyfQpWYXJpYWJsZTwtYygiYENsaWVudGUuUGxhbnRhYCIsImBKdW5pbyAyMDIxYCIsImBKdWxpbyAyMDIxYCIsImBBZ29zdG8gMjAyMWAiLCJgU2VwdGllbWJyZSAyMDIxYCIsImBPY3R1YnJlIDIwMjFgIiwiYE5vdmllbWJyZSAyMDIxYCIsImBEaWNpZW1icmUgMjAyMWAiLCJgRW5lcm8gMjAyMmAiLCJgRmVicmVybyAyMDIyYCIsImBNYXJ6byAyMDIyYCIsImBBYnJpbCAyMDIyYCIsImBNYXlvIDIwMjJgIiwiYEp1bmlvIDIwMjJgIiwiYEp1bGlvIDIwMjJgIiwiYEFnb3N0byAyMDIyYCIsImBTZXB0aWVtYnJlIDIwMjJgIiwiYE9jdHVicmUgMjAyMmAiLCJgTm92aWVtYnJlIDIwMjJgIiwiYERpY2llbWJyZSAyMDIyYCIsImBFbmVybyAyMDIzYCIsImBGZWJyZXJvIDIwMjNgIiwiYE1hcnpvIDIwMjNgIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIsIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCJDdWFudGl0YXRpdmEoZGlzY3JldGEpIiwiQ3VhbnRpdGF0aXZhKGRpc2NyZXRhKSIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkgCgpgYGAKCiMjIyAzKSBFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuICAKIyMjIyDDk3JkZW5lcyBvIHVuaWRhZGVzIGRlIHByb2R1Y2Npw7NuLiAgCgojIyMgNCkgQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPwpgYGB7cn0KYmQxIDwtIGJkCmJkMSA8LSBzdWJzZXQoYmQxLCBzZWxlY3QgPSAtYyAoUFJPWUVDVE8sIElURU0sIElELk9ET08gKSkKYGBgCgojIyMjIExhIHByaW1lcmEgdMOpY25pY2EgZGUgbGltcGllemEgZnVlIGxhIGRlIGVsaW1pbmFyIGNvbHVtbmFzIGNvbiBkYXRvcyBpcnJlbGV2YW50ZXMgcGFyYSBlbCBhbsOhbGlzaXMgZGUgbGEgYmFzZSBkZSBkYXRvcy4gTGFzIGNvbHVtbmFzIGVsaW1pbmFkYXMsIHJlYWxtZW50ZSBubyBhcG95YWJhbiBwYXJhIHVuIGFuw6FsaXNpcyBkZSBkYXRvcyBjdWFsaXRhdGl2bywgcHVlcyBkYWJhbiBpbmZvcm1hY2nDs24gYWRpY2lvbmFsIHBhcmEgdW4gYW7DoWxpc2lzIG3DoXMgcHJvZnVuZG8gZW4gY3VhbnRvIGEgcHJvZHVjdG8geSBJRCBwZXJvIG5vIGVuIGN1YW50byBhIGNhbnRpZGFkLCBwb3IgbG8gcXVlIHNpbnRldGl6YXIgbG9zIGRhdG9zIHJlc3VsdMOzIGxhIG1lam9yIG9wY2nDs24gY29uIGVzdGEgcHJpbWVyYSB0w6ljbmljYS4gICAKCiMjIyMjIEN1YW50YXMgTkEgdGVuZ28gZW4gbGEgYmFzZSBkZSBkYXRvcz8KYGBge3J9CnN1bShpcy5uYShiZDEpKQpzdW0oaXMubmEoYmQpKQpgYGAKCiMjIyMgTm8gc2UgZGV0ZWN0YSBuaW5nw7puIE5BIGVuIGxhIGJhc2UgZGUgZGF0b3MsIGRpY2hhIHTDqWNuaWNhIHNlIHJlYWxpesOzIHBhcmEgY29ycm9ib3JhciBxdWUgbm8gaHViaWVyYSBkYXRvcyB2YWPDrW9zIHkgZW4gY2FzbyBkZSBxdWUgaHViaWVyYSwgc3VzdGl0dcOtcmxvcyBjb24gbG9zIGRhdG9zIHBlcnRpbmVudGVzLiAgCgojIyMjIyBDdWFudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8KYGBge3J9CnNhcHBseShiZDEsIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpCnNhcHBseShiZCwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKYGBgCgojIyMjIEVuIGxhIHByaW1lciB2YXJpYWJsZSBkZSBsYSBiYXNlIGRlIGRhdG9zIGhheSBhbGd1bm9zIGRhdG9zIHF1ZSBhcGFyZW50YW4gc2VyIGZhbHRhbnRlcywgc2luIGVtYmFyZ28gbm8gZXMgcXVlIHNlYW4gZGF0b3MgZmFsdGFudGVzLCBzaW5vIHF1ZSBlbiBsYSBiYXNlIGRlIGRhdG9zIG9yaWdpbmFsIGVuIGV4Y2VsLCBkaWNoYXMgY2VsZGFzIGVzdGFiYW4gY29tYmluYWRhcyBwb3IgbG8gcXVlIFIgbm8gbG8gaWRlbnRpZmljw7MgY29tbyBOQcK0cwoKYGBge3J9CiNDYW1iaWFyIGVsIG5vbWJyZSBkZSB1bmEgY29sdW1uYQojbGlicmFyeShkcGx5cikKIz9jb2xuYW1lcwojYmQxJE5PVklFTUJSRS4yMiA8LSBjb2xuYW1lcygiT0NUVUJSRS4yMiIpIApgYGAKCiMjIyA1KSBJbmNsdXllIHVuYSBicmV2ZSByZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4KCiMjIyMgRW4gbGEgYmFzZSBkZSBkYXRvcyBkZSBEZWxpdmVyeSBQbGFuIHNlIGVuY29udHJhYmEgdW5hIGNhbnRpZGFkIGRlIE5BwrRzIG11eSBncmFuZGUsIHBvciBsbyBxdWUgZnVlIHByZWZlcmlibGUgZnVzaW9uYXIgbG9zIGRhdG9zIHkgcmVhbGl6YXIgdW5hIHN1bWF0b3JpYSBxdWUgcHJlc2VudGFyYSBsb3MgZGF0b3MgZGUgbWFuZXJhIG1lbnN1YWwgcGFyYSB0ZW5lciB1biBjb25jZW50cmFkbyB5IHVuIGFuw6FsaXNpcyBkZSBtYXlvciB2YWxvci4gRGUgaWd1YWwgZm9ybWEsIGxhcyBwcmltZXJhcyBjdWF0cm8gdmFyaWFibGVzIGVyYW4gcmVzcGVjdG8gYWwgY2xpZW50ZSB5IGxvcyBwcm9kdWN0b3MgbyBlc3BlY2lmaWNhY2lvbmVzIGRlIGxhcyBlbnRyZWdhcyBlbiB1bmlkYWQgZGUgbWVkaWNpw7NuIGRlIHVuaWRhZGVzIGRlIHByb2R1Y2Npw7NuIHJlc3BlY3RvIGEgbG9zIGRlbGl2ZXJpZXMsIGFsIHNlciBlc3BlY2lmaWNhY2lvbmVzIHF1ZSBmaW5hbG1lbnRlIHRlcm1pbmFiYW4gY29uIGVsIGNsaWVudGUgaW5pY2lhbCwgc2UgZGVjaWRpw7MgZWxpbWluYXIgZGljaG9zIHJ1YnJvcyBwYXJhIGVuZ2xvYmFyIGRpcmVjdGFtZW50ZSBsYXMgdW5pZGFkZXMgY29uIGVsIGNsaWVudGUuICAgCgojIyMjIFNlIGVsaW1pbmFyb24gZGljaGFzIGNvbHVtbmFzLCBzZSB2ZXJpZmljw7MgcXVlIG5vIGh1YmllcmEgTkHCtFMgeSBzZSBjYW1iacOzIGVsIG5vbWJyZSB0YW1iacOpbiBkZSB1bmEgY29sdW1uYSBxdWUgdGVuw61hIGVsIG5vbWJyZSByZXBldGlkbyBjb21vIGxpbXBpZXphIGRlIGRhdG9zLiAgIAoKIyMjIyBFbiBlc3RhIHByaW1lcmEgcGFydGUgZGUgbGEgYWN0aXZpZGFkIHNlIGxvZ3LDsyBsaW1waWFyIHkgdmlzdWFsaXphciBsYSBiYXNlIGRlIGRhdG9zIGNvbiBsYSBxdWUgdHJhYmFqYXJlbW9zLiAgCgojIyAqKmMuIEZPUk0g4oCTIERlbGl2ZXJ5IFBlcmZvcm1hbmNlKioKYGBge3J9CmJkX2RlbGl2ZXJ5X3BlcmYgPC0gcmVhZC5jc3YoIi9Vc2Vycy9nZW9yZ2luYW1hcnRpbmV6L0RvY3VtZW50cy9UZWMvU2XMgXB0aW1vIFNlbWVzdHJlL0FuYWxpzIF0aWNhIHBhcmEgbmVnb2Npb3MsIGRlIGxvcyBkYXRvcyBhIGRlY2lzaW9uZXMvQmFzZSBkZSBkYXRvcyBGT1JNL0JEIEZvcm0gRGVsaXZlcnkgUGVyZm9ybWFuY2UuY3N2IikKYGBgCgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdcOhbnRvcyByZWdpc3Ryb3MgdGllbmUgbGEgYmFzZSBkZSBkYXRvcz8gIAoKPGNlbnRlcj4gPHNwYW4gc3R5bGU9ImNvbG9yOk9yYW5nZSI+TGEgYmFzZSBkZSBkYXRvcyBjdWVudGEgY29uIDMgdmFyaWFibGVzIHkgMTA0IHJlZ2lzdHJvcy48L2NlbnRlcj4gIAoKIyMjIDIpIENsYXNpZmljYWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQpgYGB7cn0KVmFyaWFibGUgPC1jKCJDbGllbnRlIiwgIlRyYW5zcG9ydGlzdGEiLCAiRmVjaGEiLCAiUGxhbiBBcnJpdmFsIiwgIlJlYWwgQXJyaXZhbCIsICJSZWFsIERlcGFydHVyZSIsICJEaWZlcmVuY2lhIikKVGlwbyA8LWMoIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiKQp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSwgVGlwbykKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCgojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgpgYGB7cn0KVmFyaWFibGUgPC1jKCJDbGllbnRlIiwgIlRyYW5zcG9ydGlzdGEiLCAiRmVjaGEiLCAiUGxhbiBBcnJpdmFsIiwgIlJlYWwgQXJyaXZhbCIsICJSZWFsIERlcGFydHVyZSIsICJEaWZlcmVuY2lhIikKTWVkaWNpb24gPC1jKCJOb21pbmFsIiwgIk5vbWluYWwiLCAiSW50ZXJ2YWxvIiwgIkludGVydmFsbyIsICJJbnRlcnZhbG8iLCAiSW50ZXJ2YWxvIiwgIkludGVydmFsbyIpCnRhYmxlMjwtZGF0YS5mcmFtZShWYXJpYWJsZSwgTWVkaWNpb24pCmtuaXRyOjprYWJsZSh0YWJsZTIpCmBgYAoKIyMjIDQpIEFwbGljYSBhbCBtZW5vcyAyIHTDqWNuaWNhcyBkZSBsaW1waWV6YSBkZSBiYXNlcyBkZSBkYXRvcyB5IGV4cGzDrWNhbGFzIGJyZXZlbWVudGUsIMK/cG9yIHF1w6kgcmVhbGl6YXN0ZSBlc2FzIHTDqWNuaWNhcz8gIAoKIyMjIyBTZSByZWFsaXrDsyB1bmEgbGltcGlhIHByZXZpYSBhIGxhIGJhc2UgZGUgZGF0b3MgZGViaWRvIGEgcXVlIG5vIHNlIHBvZMOtYSBtYW5lamFyIGVuIFIsIHlhIHF1ZSBlbCBmb3JtYXRvIGVuIHF1ZSBzZSBlbmNvbnRyYWJhICBubyBwZXJtaXTDrWEgcXVlIFIgcHVkaWVyYSBlbnRlbmRlciBjdWFsZXMgZXJhbiBsYXMgdmFyaWFibGVzIGRlIG51ZXN0cmEgYmFzZSBkZSBkYXRvcywgcG9yIGxvIHRhbnRvIGxhcyBtb2RpZmljYWNpb25lcyB5IGxpbXBpZXphcyBxdWUgc2UgcmVhbGl6YXJvbiBmdWUgbGEgdMOpY25pY2EgZGUgJ1JlbW92ZXIgdmFsb3JlcyBpcnJlbGV2YW50ZXMnIGVuIGVzdGUgY2FzbyBxdWl0YW1vcyBsYSBjb25jbHVzacOzbiBwb3JxdWUgbm8gdGVuZHLDrWEgdmFsb3IgZW4gbGEgYmFzZSBkZSBkYXRvcywgZWxpbWluYW1vcyB0YXJnZXQgKGhvcmFzKSB5IHRvbWFtb3MgZWwgdmFsb3IgZGUgY2FkYSBpbmljaW8gZGUgbWVzIHBhcmEgY29tcGFyYXIgcHJpbmNpcGlvIGRlIG1lcyBjb24gbWVzLCBkZXNwdcOpcyBlbiBSIHNlIHRyYWJham8gY29uIGxhICoqdMOpY25pY2EgZGUgY29udmVydGlyIHRpcG9zIGRlIGRhdG9zKiogZW4gZXN0ZSBjYXNvIGRlIGNhcmFjdGVyIGEgZmVjaGEgeSBjYXJhY3RlciBhIGhvcmEuIApgYGB7cn0KIyMgVMOpY25pY2EgNC4gQ29udmVydGlyIHRpcG9zIGRlIGRhdG9zCgojIENvbnZlcnRpciBkZSBjYXJhY3RlciBhIGZlY2hhCmJkX2RlbGl2ZXJ5X3BlcmYkRmVjaGEgPC0gYXMuRGF0ZShiZF9kZWxpdmVyeV9wZXJmJEZlY2hhLCBmb3JtYXQgPSIlZC8lbS8leSIpCmxpYnJhcnkodGliYmxlKQp0aWJibGUoYmRfZGVsaXZlcnlfcGVyZikgIAoKIyBDb252ZXJ0aXIgZGUgY2FyYWN0ZXIgYSBob3JhCmJkX2RlbGl2ZXJ5X3BlcmYkUmVhbC5hcnJpdmFsIDwtIHN1YnN0cihiZF9kZWxpdmVyeV9wZXJmJFJlYWwuYXJyaXZhbCwgc3RhcnQgPSAxLCBzdG9wID0gMikKdGliYmxlKGJkX2RlbGl2ZXJ5X3BlcmYpCmJkX2RlbGl2ZXJ5X3BlcmYkUmVhbC5hcnJpdmFsPC0gYXMuaW50ZWdlcihiZF9kZWxpdmVyeV9wZXJmJFJlYWwuYXJyaXZhbCkgIApzdHIoYmRfZGVsaXZlcnlfcGVyZikKCmJkX2RlbGl2ZXJ5X3BlcmYkUmVhbC5EZXBhcnR1cmUgPC0gc3Vic3RyKGJkX2RlbGl2ZXJ5X3BlcmYkUmVhbC5EZXBhcnR1cmUsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCnRpYmJsZShiZF9kZWxpdmVyeV9wZXJmKQpiZF9kZWxpdmVyeV9wZXJmJFJlYWwuRGVwYXJ0dXJlPC0gYXMuaW50ZWdlcihiZF9kZWxpdmVyeV9wZXJmJFJlYWwuRGVwYXJ0dXJlKSAgCnN0cihiZF9kZWxpdmVyeV9wZXJmKQpgYGAKCiMjIyA1KSBJbmNsdXllIHVuYSBicmV2ZSByZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4gIAoKIyMjIyBFbiBlc3RhIGFjdGl2aWRhZCBwdWRpbW9zIHRyYWJhamFyIGxvIHF1ZSBlcyBtYW5lamFyIHVuYSBiYXNlIGRlIGRhdG9zIHkgY29ub2NlciBxdWUgaW5mb3JtYWNpw7NuIGNvbnRpZW5lLCBhbmFsaXphciBxdWUgdGlwb3MgZGUgdmFyaWFibGVzIHRlbmVtb3MgeSBsaW1waWFybGEgcGFyYSBwb2RlciByZWFsaXphciBhbsOhbGlzaXMgcXVlIHNlYW4gYWNlcnRhZG9zIHkgY29ycmVjdG9zIHBhcmEgbG9ncmFyIHRvbWFyIGJ1ZW5hcyBkZWNpc2lvbmVzLgoKIyMgKipkLiBGdWVudGUgZGUgRGF0b3MgRXh0ZXJuYSoqCgojIyMgTGxhbWFyIGJhc2UgZGUgZGF0b3MuCmBgYHtyfQpiZCA8LSByZWFkLmNzdigiL1VzZXJzL2dlb3JnaW5hbWFydGluZXovRG9jdW1lbnRzL1RlYy9TZcyBcHRpbW8gU2VtZXN0cmUvQW5hbGnMgXRpY2EgcGFyYSBuZWdvY2lvcywgZGUgbG9zIGRhdG9zIGEgZGVjaXNpb25lcy9CYXNlIGRlIGRhdG9zIEZPUk0vQkQgZXh0ZXJuYS9BQ1RJVklEQUQgMi4yICgxKS5jc3YiKQpgYGAKCiMjIyBFbnRlbmRlciBCYXNlIGRlIERhdG9zCmBgYHtyfQpyZXN1bWVuIDwtIHN1bW1hcnkoYmQpCnJlc3VtZW4KYGBgCgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdcOhbnRvcyByZWdpc3Ryb3MgdGllbmUgbGEgYmFzZSBkZSBkYXRvcz8qCiMjIyMgPGNlbnRlcj4gPHNwYW4gc3R5bGU9ImNvbG9yOk9yYW5nZSI+Uj0gMTQzNiByZWdpc3Ryb3MgeSA2IHZhcmlhYmxlczwvY2VudGVyPgpgYGB7cn0Kc3RyKGJkKQojaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQpkZXNjcmliZShiZCkKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YS4qCmBgYHtyfQpWYXJpYWJsZTwtYygiSUQiLCJVbmlkYWQuX0Vjb27Ds21pY2EiLCJDbGFzZS5fZGVfYWN0aXZpZGFkIiwiRGVzY3JpcGNpb24uZXN0cmF0by5wZXJzb25hbCIsIkVzdGFkbyIsICJUaXBvX2VzdGFibGVjaW1pZW50byIpClR5cGU8LWMoIkN1YW50aXRhdGl2YShjb250aW51YSkiLCJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIpCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLiogCmBgYHtyfQpWYXJpYWJsZTwtYygiSUQiLCJVbmlkYWQuX0Vjb27Ds21pY2EiLCJDbGFzZS5fZGVfYWN0aXZpZGFkIiwiRGVzY3JpcGNpb24uZXN0cmF0by5wZXJzb25hbCIsIkVzdGFkbyIsICJUaXBvX2VzdGFibGVjaW1pZW50byIpClR5cGU8LWMoIkN1YW50aXRhdGl2YShjb250aW51YSkiLCJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIpCkVzY2FsYV9kZV9NZWRpY2nDs24gPC0gYygiVW5pZGFkZXMgZGUgcmF6b24iLCJFbXByZXNhIiwiVGlwbyBkZSBmYWJyaWNhbnRlIiwgIk51bWVybyBkZSBwZXJzb25hbCIsIkVzdGFkbyIsICJGaWpvL1NlbWlmaWpvIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxFc2NhbGFfZGVfTWVkaWNpw7NuKQprbml0cjo6a2FibGUodGFibGUpCmBgYAoKIyMjIDQpIEFwbGljYSBhbCBtZW5vcyAyIHRlY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2UgZGUgZGF0b3MgeSBleHBsaWNhbGFzIGJyZXZlbWVudGUsIMK/UG9ycXXDqSByZWFsaXphc3RlIGVzdGFzIHRlY25pY2FzPyoKCiMjIyMgKlRlY25pY2EgMS4qICBSZW1vdmVyIHZhbG9yZXMgaXJyZWxldmFudGVzICAKIyMjIyMgTGEgYmFzZSBkZSBkYXRvcyBjb250ZW7DrWEgZWwgSUQgZGUgY2FkYSB1bmEgZGUgbGFzIGVtcHJlc2FzLCBzaW4gZW1iYXJnbywgcGFyYSBudWVzdHJvIGFuYWxpc2lzIHF1ZSBlc3RhbW9zIHJlYWxpemFuZG8gbm8gZXMgaW1wb3J0YW50ZSBwb3IgbG8gcXVlIHV0aWxpemFtb3MgbGEgZnVuY2lvbiBkZSAqc3Vic2V0KiBwYXJhIGVsaW1pbmFyIGxhIGNvbHVtbmEuCgojIyMjIyBFbGltaW5hciBjb2x1bW5hcwpgYGB7cn0KYmQxIDwtIGJkCmJkMTwtc3Vic2V0KGJkMSxzZWxlY3Q9LWMoSUQpKQpzdHIoYmQxKQpgYGAKCiMjIyMgKlTDqWNuaWNhIDIuKiBSZW1vdmVyIHZhbG9yZXMgZHVwbGljYWRvcyAKRW5jb250cmFtb3MgcXVlIHZhcmlhcyBlbXByZXNhcyBlc3RhYmFuIHJlZ2lzdHJhZGFzIG1hcyBkZSB1bmEgdmV6IHBvciBsbyBxdWUgZXJhbiB2YWxvcmVzIHJlcGV0aWRvcyBlbiBsYSBiYXNlIGRlIGRhdG9zLCBwb3IgbG8gcXVlIHV0aWxpemFtb3MgbGEgdGVjbmljYSBkZSBsaW1waWV6YSBkZSBlbGltaW5hciB2YWxvcmVzIGR1cGxpY2Fkb3MgY29uIGxhIGZ1bmNpw7NuIGRlICpkaXN0aW5jdCosIHNlIGVuY29udHJhcm9uICoqNDIgdmFsb3JlcyBkdXBsaWNhZG9zKiouICAKCiMjIyMjIMK/Q3XDoW50b3MgcmVuZ2xvbmVzIGR1cGxpY2Fkb3MgdGVuZW1vcz8KYGBge3J9CmJkMSBbZHVwbGljYXRlZChiZDEpLF0Kc3VtKGR1cGxpY2F0ZWQoYmQxKSkKYGBgCgojIyMjIyBFbGltaW5hciByZW5nbG9uZXMgZHVwbGljYWRvcwpgYGB7cn0KYmQyIDwtIGJkMQpsaWJyYXJ5KGRwbHlyKQpiZDIgPC0gZGlzdGluY3QgKGJkMikKYGBgCgojIyMgNSkgUmVmbGV4aW9uCiMjIyMgRW4gY29uY2x1c2lvbiBub3NvdHJvcyBlc3R1dmltb3MgYW5hbGl6YW5kbyBsYSBiYXNlIGRlIGRhdG9zIHF1ZSBvYnR1dmltb3MgZGVsIElORUdJLCBsYSBjdWFsIGNvbnRlbsOtYSBlbCB0YW1hw7FvIGRlIGxhcyBlbXByZXNhcyBkZWwgc2VjdG9yIGVuIGVsIHF1ZSBzZSBlbmN1ZW50cmEgKipGT1JNKiosIGVzdG8gcGFyYSBjb25vY2VyIHNpIHNvbiBlbXByZXNhcyBweW1lcyBvIG5hY2lvbmFsZXMsIGRlc3RhY2Ftb3MgaW5mb3JtYWNpw7NuIHF1ZSBwb2Ryw61hIHNlciByZWxhdmFudGUgY29tbyBjb25vY2VyIGN1YW50YXMgdmFyaWFibGVzIHkgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGF0b3MsIHNpIHNvbiBjdWFsaXRhdGl2YSBvIGN1YW50aXRhdGl2YS4gVGFtYmllbiByZWFsaXphbW9zIGRvcyB0w6ljbmljYXMgZGUgbGltcGllemEgcXVlIG5vcyBwb2RyaWFuIGF5dWRhciBhIHRlbmVyIHVuIHJlc3VsdGFkbyBtYXMgZmF2b3JhYmxlIGFsIG1vbWVudG8gZGUgcmVhbGl6YXIgbGEgZXN0YWRpc3RpY2EuIEVsaW1pbmFtb3MgbGEgY29sdW1uYSBkZSBJRCB5YSBxdWUgY29uc2lkZXJhbW9zIG5vIGVzIG5lY2VzYXJpYSBwYXJhIGxvIHF1ZSBlc3RhbW9zIGJ1c2NhbmRvIHkgdGFtYmllbiBlbGltaW5hbW9zIHJlbmdsb25lcyBkdXBsaWNhZG9zLg==