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)
| 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)
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)
| 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)
LS0tCnRpdGxlOiA8c3BhbiBzdHlsZSA9ICJjb2xvcjpvcmFuZ2UiPiAiRW50cmVnYWJsZSAyLjEiCmF1dGhvcjogIkVxdWlwbyA0IgpkYXRlOiAiMjAyMi0wOS0yMSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgo8aW1nIHNyYz0gIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rvd25sb2Fkcy9pbWFnZXMtNC5wbmciPgoKIyMjIyBFbWlsaW8gT2x2ZXJhIEEwMTYyNTIwMAojIyMjIE1heXJhIENhbXBveSBSYW1vcyBBMDAyMjY5MTQKIyMjIyBYaW1lbmEgR3V0aWVycmV6IEJyaXNlw7FvIEEwMDgyOTUwNQojIyMjIE1hcmlhbmEgVWxsb2EgRW5jaW5hcyBBMDEyNTMwNzYKIyMjIyBIw6ljdG9yIEphdmllciBWaWxsYXJyZWFsIEEwMTU3MDIyNwoKIyAqKlJlY3Vyc29zIEh1bWFub3MqKiAKCiMjIyMjIEFudGVzIGRlIGltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MsIHNlIG9wdMOzIHBvcjoKIyMjIyMgMS4gQ3JlYXIgdW5hIGNvbHVtbmEgZGUgIkVkYWQiLgojIyMjIyAyLiBBZ3JlZ2FyICIwIiBlbiBsb3MgZXNwYWNpb3MgZW4gYmxhbmNvLgoKIyMjIyBJbXBvcnRhciBsYXMgYmFzZXMgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpyZWN1cnNvc19odW1hbm9zIDwtIHJlYWQuY3N2KCIvVXNlcnMvbWF5cmFjYW1wb3lyYW1vcy9EZXNrdG9wL0FuYWxpc2lzIGRlIERhdG9zIENvbmNlbnRyYWNpb24vUmV0by9GT1JNIC0gUmVjdXJzb3MgSHVtYW5vcyAoMikuY3N2IikKYGBgCgojIyMgKsK/Q3XDoW50YXMgdmFyaWFibGVzIHkgY3VhbnRvcyByZWdpc3Ryb3MgdGllbmUgbGEgYmFzZSBkZSBkYXRvcz8qCgpgYGB7cn0KIyBJbnN0YWxhciBsaWJyZXJpYXMKCiMgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KGRwbHlyKQojIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikKbGlicmFyeShwc3ljaCkKCiNTYWNhciBuw7ptZXJvIGRlIHZhcmlhYmxlczoKZGVzY3JpYmVEYXRhKHJlY3Vyc29zX2h1bWFub3MsaGVhZD0xLHRhaWw9MSkKCiNSOiBFeGlzdGVuIDI5IHZhcmlhYmxlcy4KCiNTYWNhciBuw7ptZXJvIGRlIHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3M6CgojUjogRXhpc3RlbiAxMTMgcmVnaXN0cm9zIHBvciBjb2x1bW5hLCBzaWVuZG8gYXNpIDMsMjc3IHJlZ2lzdHJvcyB0b3RhbGVzIGVuIGxhIGJhc2UgZGUgZGF0b3MuCmBgYAoKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJOby4uRGUuRW1wbGVhZG8iLCJBUEVMTElET1MiLCJOT01CUkUiLCJGRUNIQS5ERS5OQUNJTUlFTlRPIiwgIkVEQUQiLCAiR0VORVJPIiwgIlJGQyIsICJGRUNIQS5ERS5BTFRBIiwgIlByaW1lci5tZXMiLCAiWDR0by5tZXMiLCAiQkFKQSIsICJQVUVTVE8iLCAiREVQQVJUQU1FTlRPIiwgIk5PLlNFR1VSTy5TT0NJQUwiLCAiU0FMQVJJTy5ESUFSSU8uSU1TUyIsICJGQUNUT1IuQ1JFRC5JTkZPTkFWSVQiLCAiTi4uQ1JFRElUTy5JTkZPTkFWSVQiLCAiTFVHQVIuREUuTkFDSU1JRU5UTyIsICJDVVJQIiwgIkNBTExFIiwgIk5VTUVSTy5JTlRFUk5PIiwgIkNPTE9OSUEiLCAiTVVOSUNJUElPIiwgIkVTVEFETyIsICJDT0RJR08uUE9TVEFMIiwgIkVTVEFETy5DSVZJTCIsICJUQVJKRVRBLi4uLkNVRU5UQSIsICJYIiwgIlguMSIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YShkaXNjcmV0YSkiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAgIkN1YWxpdGF0aXZhIiwgIkN1YW5saXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIpCk1lYXN1cmVtZW50IDwtYygiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiQcOxb3MiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTW9uZWRhIE1leGljYW5hIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwgIk5BIiwiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiLCAiTkEiKQp0YWJsZTwtZGF0YS5mcmFtZShWYXJpYWJsZSxUeXBlLCBNZWFzdXJlbWVudCkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcwpgYGB7cn0Kc3VtbWFyeShyZWN1cnNvc19odW1hbm9zKQpgYGAKCiMjIyMgT2JzZXJ2YWNpb25lcwojIyMjIyAxLiBMYXMgdmFyaWFibGVzIGRlICJOVU1FUk8uSU5URVJOTyIgeSAiTk8uU0VHVVJPLlNPQ0lBTCIgc2FsZSBlbiBmb3JtYXRvIGRlIGNhcmFjdGVyLgojIyMjIyAyLiBObyBub3Mgc2lydmVuIFZBUklBUyB2YXJpYWJsZXM6ICJSRkMiLCAiUHJpbWVyLm1lcyIsICJYNHRvLm1lcyIsIGV0Yy4KIyMjIyMgMy4gSGF5IG11Y2hvcyBOQcK0cwojIyMjIyA0LiBIYXkgZG9zIGNvbHVtbmFzIHNpbiBuYWRhOiAiWCIgeSAiWC4xIi4KIyMjIyMgNS4gSGF5IHVuIHNhbGFyaW8gZGUgMSBtaWxsw7NuIHkgZGUgNDAwbWlsLCBsbyBxdWUgc2UgcHVlZGUgcmVlbXBsYXphciBwb3IgbGEgbWVkaWEgZGUgbG9zIHNhbGFyaW9zLgoKIyMjIFTDqWNuaWNhIDE6IEVsaW1pbmFyIGNvbHVtbmFzLgpgYGB7cn0KcmVjdXJzb3NfaHVtYW5vcyA8LSBzdWJzZXQocmVjdXJzb3NfaHVtYW5vcyxzZWxlY3QgPSAtYyAoRkVDSEEuREUuTkFDSU1JRU5UTywgUkZDLCBQcmltZXIubWVzLCBYNHRvLm1lcywgTk8uU0VHVVJPLlNPQ0lBTCwgRkFDVE9SLkNSRUQuSU5GT05BVklULCBOLi5DUkVESVRPLklORk9OQVZJVCwgQ0FMTEUsIE5VTUVSTy5JTlRFUk5PLCBDT0xPTklBLCBUQVJKRVRBLi4uLkNVRU5UQSwgWDAsIFgwLjEpKQoKYGBgCgojIyMgVMOpY25pY2EgMi4gUmVlbXBsYXphciBwb3IgZWwgcHJvbWVkaW8gZGUgbG9zIHNhbGFyaW9zIGxvcyBzYWxhcmlvcyBjb3JyZXNwb25kaWVudGVzIGEgMSBtaWxsw7NuIHkgNDAwbWlsLgpgYGB7cn0KCnJlY3Vyc29zX2h1bWFub3MgPC0gcmVjdXJzb3NfaHVtYW5vc1tvcmRlcihyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MpLF0KdGFpbChyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MsIG49IDIpCnJlY3Vyc29zX2h1bWFub3MgPC0gcmVjdXJzb3NfaHVtYW5vc1tyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1MgPiAwLCBdCgpyZWN1cnNvc19odW1hbm9zJFNBTEFSSU8uRElBUklPLklNU1NbcmVjdXJzb3NfaHVtYW5vcyRTQUxBUklPLkRJQVJJTy5JTVNTID4gNDQxMzc1Nl0gPC0gbWVkaWFuKHJlY3Vyc29zX2h1bWFub3MkU0FMQVJJTy5ESUFSSU8uSU1TUywgbmEucm0gPSBUUlVFKQpzdW1tYXJ5KHJlY3Vyc29zX2h1bWFub3MpCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwp3cml0ZS5jc3YocmVjdXJzb3NfaHVtYW5vcywgZmlsZSA9ICJyZWN1cnNvc19odW1hbm9zX2xpbXBpYV9idWVuYS5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojICoqRGVsaXZlcnkgUGxhbioqCgojIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpiZCA8LSByZWFkLmNzdigiL1VzZXJzL21heXJhY2FtcG95cmFtb3MvRGVza3RvcC9BbmFsaXNpcyBkZSBEYXRvcyBDb25jZW50cmFjaW9uL1JldG8vRk9STSAtIERlbGl2ZXJ5IFBsYW4ueGxzeCAtIERFTElWRVJZIFBMQU4uY3N2IikKCmBgYAoKIyMjICrCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/KgpgYGB7cn0Kc3RyKGJkKQpzdW1tYXJ5KGJkKQoKCiMgMjMxIFJlZ2lzdHJvcyBZIDI2IFZhcmlhYmxlcwpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KdmFyaWFibGUgPC1jKCJDTElFTlRFLlBMQU5UQSwiLCAiUFJPWUVDVE8iLCAiSUQuMEQwMCIsICJJVEVNIiwgIkVORS4yMiIsICJGRUJSRVJPLjIyIiwgIk1BUlpPLjIyIiwgIkFCUklMLjIyIiwgIk1BWU8uMjIiLCAiSlVOSU8uMjIiLCAiSlVMSU8uMjIiLCAiQUdPU1RPLjIyIiwgIlNFUFRJRU1CUkUuMjIiLCAiT0NUVUJSRS4yMiIsICJOT1ZJRU1CUkUuMjIiLCAiRElDSUVNQlJFLjIyIiwgIkVORVJPLjIzIiwgIkZFQlJFUk8uMjMiLCAiTUFSWk8uMjMiKQpNZWFzdXJtZW50IDwtYygiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTElUQVRJVkUiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiLCAiQ1VBTlRJVEFUSVZFIChESVNDUkVURSkiKQpTY2FsZSA8LWMoIk5PTUlOQUwiLCAiTk9NSU5BTCIsICJOT01JTkFMIiwgIk5PTUlOQUwiLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iLCAiUkFaT04iKQoKY2xhc2lmaWNhY2lvbiA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlLCBNZWFzdXJtZW50LCBTY2FsZSkKY2xhc2lmaWNhY2lvbgpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyBUw6ljbmljYSAxOiBFbGltaW5hciBOQQpgYGB7cn0Kc3VtKGlzLm5hKGJkKSkKCnNhcHBseShiZCxmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQoKI0hhbGxhemdvczogTm8gc2UgZW5jb250cmFyb24gZGF0b3MgY29uIGRlbm9taW5hY8OzbiBOQSwgeWEgcXVlIHRvZG9zIGZ1ZXJvbiByZWVtcGxhemFkb3MgY29uIDAgCmBgYAoKIyMjIFTDqWNuaWNhIDI6IEVsaW1pbmFyIGNvbHVtbmFzLgpgYGB7cn0KI0VsaW1pbmFyIDIwMjEKYmQxIDwtIGJkCmJkMSA8LSBzdWJzZXQgKGJkLCBzZWxlY3QgPSAtYyAoSlVOSU8sIEpVTElPLCBBR09TVE8sIFNFUFRJRU1CUkUsIE9DVFVCUkUsIE5PVklFTUJSRSwgRElDSUVNQlJFKSkKCiNFeHBvcnRhciBiYXNlIGRlIGRhdG9zCndyaXRlLmNzdihiZDEsIGZpbGUgPSAiZGVsaXZlcnlfcGxhbi5jc3YiLCByb3cubmFtZXMgPSBGQUxTRSkKYGBgCgojICoqRGVsaXZlcnkgUGVyZm9ybWFuY2UqKgoKIyMjIyBJbXBvcnRhciBiYXNlIGRlIGRhdG9zCmBgYHtyfQojIGZpbGUuY2hvb3NlKCkKYmQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rlc2t0b3AvQW5hbGlzaXMgZGUgRGF0b3MgQ29uY2VudHJhY2lvbi9SZXRvL0ZPUk0gLSBEZWxpdmVyeSBQZXJmb3JtYW5jZS5jc3YiKQpiZCA8LSBuYS5vbWl0KGJkKQpgYGAKCiMjIyAqwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPyoKYGBge3J9CiMgVGllbmUgMTQ0MCBvYnMuIHkgOCB2YXJpYWJsZXMKc3RyKGJkKQpzdW1tYXJ5KGJkKQpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJgVGFyZ2V0YCIsImBDbGllbnRlYCIsImBWdWVsdGFzYCIsImBQbGFuLmFycml2YWxgIiwiYFJlYWwuYXJyaXZhbGAiLCJgUmVhbC5kZXBhcnR1cmVgIiwiYERpZmVyZW5jZWAiLCJgRGF0ZWAiKQpUeXBlPC1jKCJxdWFudGlhdGl2ZSAoZGlzY3JldGUpIiwgInF1YW50aWF0aXZlIChjb250aW5vdXMpIiwgInF1YW50aXRhdGl2ZSAoY29udGlub3VzKSIsICJxdWFudGl0YXRpdmUgKGNvbnRpbm91cykiKQplc2NhbGFzIDwtIGMoImludGVydmFsbyIsICJub21pbmFsIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgInJhem9uIiwgIm9yZGluYWwiKQp0YWJsZSA8LSBkYXRhLmZyYW1lIChWYXJpYWJsZSwgVHlwZSwgZXNjYWxhcykKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyAqQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPyoKCiMjIyBUw6ljbmljYSAxOiBNZXRvZG8gRXN0YWRpc3RpY28KCmBgYHtyfQpiZDI8LWJkCmJveHBsb3QoYmQyJFBsYW4uYXJyaXZhbCwgaG9yaXpvbnRhbD1UUlVFKQpib3hwbG90KGJkMiRSZWFsLmFycml2YWwsIGhvcml6b250YWw9VFJVRSkKYm94cGxvdChiZDIkUmVhbC5kZXBhcnR1cmUsIGhvcml6b250YWw9VFJVRSkKCiMgRWwgdXNvIGRlIGVzdGUgbWV0b2RvIHBvciBxdWUgc2UgcXVlcmlhIG9ic2VydmFyIGdyYWZpY2FtZW50ZSBjb21vIGVzIHF1ZSBsb3MgdGllbXBvcyBkZSBsbGVnYWRhIHNlIHZlbiBhZmVjdGFkbwoKYGBgCgojIyMgVMOpY25pY2EgMjogRWxpbWluYXIgY29sdW1uYXMuCgpgYGB7cn0KYmQyPC1iZApiZDIgPC0gc3Vic2V0KGJkMiwgc2VsZWN0ID0tYyAoVGFyZ2V0KSkKCiMgRWwgdXNvIGRlIGVzdGUgbWV0b2RvICBwb3IgcXVlIGVuIGxhIHBhcnRlIGRlIFRhcmdldCBzb2xvIGFwYXJlY2lhIGVsIG51bWVybyAxIGVuIHRvZGFzIGxhcyBjb2x1bW5hcyBlbnRvbmNlcyBlc2UgZGF0byBtZSBwYXJlY2lhIGlubmVjZXNhcmlvCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwp3cml0ZS5jc3YoYmQyLCBmaWxlID0gImRlbGl2ZXJ5X3BlcmZvcm1hbmNlLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQoKYGBgCgojICoqQmFzZSBkZSBEYXRvcyBFeHRlcm5hKiogCgojIyMjIEltcG9ydGFyIGJhc2UgZGUgZGF0b3MKYGBge3J9CiMgZmlsZS5jaG9vc2UoKQpiZF9leHRlcm5hIDwtcmVhZC5jc3YoIi9Vc2Vycy9tYXlyYWNhbXBveXJhbW9zL0Rlc2t0b3AvQW5hbGlzaXMgZGUgRGF0b3MgQ29uY2VudHJhY2lvbi9SZXRvL1Byb2R1Y2Npb8yBbiBkZSBjYXJ0b8yBbiBlbiBNZcyBeGljbyAxLmNzdiIpCmBgYAoKIyMjICrCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/KgpgYGB7cn0KcmVzdW1lbiA8LSBzdW1tYXJ5KGJkX2V4dGVybmEpCnJlc3VtZW4KCnN0cihiZF9leHRlcm5hKQpgYGAKCiMjIyAqQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YSoKIyMjICpFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuKgpgYGB7cn0KClZhcmlhYmxlPC1jKCJTdGF0ZS5JRCIsIlN0YXRlIiwiUmVnaW9uIiwiSW5kdXN0cnkuR3JvdXAuSUQiLCJJbmR1c3RyeS5Hcm91cCIsICJFY29ub21pYy5Vbml0IikKVHlwZTwtYygicXVhbGl0YXRpdmUiLCAicXVhbGl0YXRpdmUiLCAicXVhbGl0YXRpdmUiLCJxdWFsaXRhdGl2ZSIsICJxdWFsaXRhdGl2ZSIsICJxdWFudGl0YXRpdmUgKGRpc2NyZXRhKSIpCk1lYXN1cmVtZW50PC1jKCJOQSIsIk5BIiwiTkEiLCJOQSIsICJOQSIsImNhcnTDs24gcHJvZHVjaWRvIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSxNZWFzdXJlbWVudCkKa25pdHI6OmthYmxlKHRhYmxlKQoKYGBgCgojIyMgKkFwbGljYSBhbCBtZW5vcyAyIHTDqWNuaWNhcyBkZSBsaW1waWV6YSBkZSBiYXNlcyBkZSBkYXRvcyB5IGV4cGzDrWNhbGFzIGJyZXZlbWVudGUsIMK/cG9yIHF1w6kgcmVhbGl6YXN0ZSBlc2FzIHTDqWNuaWNhcz8qCgojIyMgVMOpY25pY2EgMTogUmVtb3ZlciB2YWxvcmVzIGlycmVsZXZhbnRlcywgY29sdW1uYSBpbmVjZXNhcmlhICJJbmR1c3RyeS5Hcm91cC5JRCIgbm8gbWUgYXBvcnRhIGRhdG9zIGltcG9ydGFudGVzCmBgYHtyfQpiZDEgPC0gYmRfZXh0ZXJuYQpiZDEgPC0gc3Vic2V0IChiZDEsc2VsZWN0ID0gLWMoSW5kdXN0cnkuR3JvdXAuSUQpKQoKc3VtbWFyeShiZDEpCmBgYAoKIyMjIFTDqWNuaWNhIDI6IFJlbW92ZXIgTkEsIGxhIGJhc2UgZGUgZGF0b3MgdmllbmUgY29uIGVzcGFjaW9zIHZhY2lvcwpgYGB7cn0KIz9DdWFudG9zIE5BIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/CnN1bShpcy5uYShiZDEpKQoKIz9DdWFudG9zIE5BIHRlbmdvIHBvciB2YXJpYWJsZT8Kc2FwcGx5KGJkMSwgZnVuY3Rpb24oeCkgc3VtIChpcy5uYSh4KSkpCgojQm9ycmFyIHRvZG9zIGxvcyByZWdpc3Ryb3MgTkEgZGUgdW5hIHRhYmxhCmJkMiA8LSBiZDEKYmQyIDwtIG5hLm9taXQoYmQyKQoKc3VtbWFyeShiZDIpCgojRXhwb3J0YXIgYmFzZSBkZSBkYXRvcwoKYmRfcHJvZHVjY2lvbiA8LWJkMgp3cml0ZS5jc3YoYmRfcHJvZHVjY2lvbiwgZmlsZSA9IlByb2R1Y2Npb24gZGUgY2FydG9uIHBvciBlc3RhZG8uY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpCmBgYAoKIyAqKkluY2x1eWUgdW5hIGJyZXZlIHJlZmxleGnDs24gZGUgbGEgYWN0aXZpZGFkLioqCgpFbiBlc3RhIGFjdGl2aWRhZCBzZSByZWFsaXrDsyB1biBhbsOhbGlzaXMgYSA0IGRpc3RpbnRhcyBiYXNlcyBkZSBkYXRvcyBkZWwgc29jaW8gZm9ybWFkb3IgRk9STSwgYmFzZSBkZSBkYXRvcyBkZSByZWN1cnNvcyBodW1hbm9zLCBkZWxpdmVyeSBwbGFuLCBkZWxpdmVyeSBwZXJmb3JtYW5jZSB5IHVuYSBiYXNlIGRlIGRhdG9zIGV4dGVybmEuICBBbCByZXNvbHZlciBlc3RhIGFjdGl2aWRhZCBwdWRpbW9zIGltcGxlbWVudGFyIGxvcyBjb25vY2ltaWVudG9zIGRlIGxvcyBtw7NkdWxvcyBxdWUgc2UgaGFuIHZpc3RvIGRlIGxhIGNvbmNlbnRyYWNpw7NuLiBFc3RvIHNlIG9ic2VydmEgZGVzZGUgZWwgaW5pY2lvIGRlIGxvcyBkaWZlcmVudGVzIGFuw6FsaXNpcyBjb21vIGxvcyB0aXBvcyBkZSB2YXJpYWJsZXMgeSBzdSBtZWRpY2nDs24gYXByZW5kaWRvcyBlbiBlbCBtw7NkdWxvIDIuIERlIGxhIG1pc21hIG1hbmVyYSwgY29tbyBlbiBlbCBtw7NkdWxvIDMgc2UgYXByZW5kacOzIGEgY8OzbW8gcmVhbGl6YXIgbGEgbGltcGllemEgZGUgbG9zIGRhdG9zLiBUb2RvIGVzdG8gbm9zIGRlasOzIGNyZWFyIHVuIGJ1ZW4gYW7DoWxpc2lzIHBhcmEgbGEgZW1wcmVzYSBGT1JNLgo=