Librerias Utilizadas
library(data.table)
library(dplyr)
library(plyr)
library(ggplot2)
library(naniar)
library(Hmisc)
library(psych)
library(tidyverse)
library(janitor)
library(knitr)
library(pollster)
library(epiDisplay)
library(descr)
library(tidyr)
library(textclean)
library(lubridate)
Importar Bases de Datos
merma <- read.csv("/Users/anita3/Desktop/FORM/FORM - Merma.csv")
scrap <- read.csv("/Users/anita3/Desktop/FORM/FORM - Scrap.csv")
carton <- read.csv("/Users/anita3/Desktop/FORM/FORM - Produccion Carton Completa.csv")
perf <- read.csv("/Users/anita3/Desktop/FORM/Del Perf.csv")
plan <- read.csv("/Users/anita3/Desktop/FORM/DP_1.csv")
bajas <- read.csv("/Users/anita3/Desktop/FORM/RH.csv")
colaboradores <- read.csv("/Users/anita3/Desktop/FORM/RH2.csv")
Cambiar nombre de variables
merma <- clean_names(merma)
colnames(merma)
## [1] "fecha" "mes" "kilos"
Mantener variables relevantes para el análisis
Para la base de datos de merma se opto por mantener las
tres variables, ya que todas las variables son relevantes para el
analsis.
Eliminar filas que contienen el total de los meses
merma<-merma[- grep("Total", merma$mes),]
Corroborar que las columnas estén en el formato correcto
str(merma)
## 'data.frame': 50 obs. of 3 variables:
## $ fecha: chr "11/01/2022" "11/01/2022" "22/01/2022" "22/01/2022" ...
## $ mes : chr "ENERO" "ENERO" "ENERO" "ENERO" ...
## $ kilos: chr "5080" "3810" "2990" "2680" ...
Cambiar fecha a formato de fecha y kilos como entero
merma$kilos<-as.integer(merma$kilos)
merma$fecha<-as.POSIXct(merma$fecha, format ="%d/%m/%Y")
str(merma)
## 'data.frame': 50 obs. of 3 variables:
## $ fecha: POSIXct, format: "2022-01-11" "2022-01-11" ...
## $ mes : chr "ENERO" "ENERO" "ENERO" "ENERO" ...
## $ kilos: int 5080 3810 2990 2680 3650 4380 3870 3590 3410 3930 ...
Cambiar nombre de variables
scrap<-scrap %>% dplyr::rename(referencia=Referencia,
ubi_origen=Ubicación.de.origen,
ubi_desecho=Ubicación.de.desecho)
scrap<-clean_names(scrap)
colnames(scrap)
## [1] "referencia" "fecha" "producto" "cantidad"
## [5] "unidad_de_medida" "ubi_origen" "ubi_desecho" "estado"
Mantener variables relevantes para el análisis
Para la base de datos de scrap se opto por eliminar las
variables de unidad de medida, estado y ubicación de desecho, ya que
todos los registros tienen el mismo valor en estas variables, es decir
que todos tienen la misma unidad, la misma ubicación y el mismo
estado.
scrap<-dplyr::select(scrap,-c(ubi_desecho, estado, unidad_de_medida))
colnames(scrap)
## [1] "referencia" "fecha" "producto" "cantidad" "ubi_origen"
Eliminar la primer fila que dice agosto
scrap<-scrap[- grep("agosto", scrap$referencia),]
head(scrap,5)
## referencia fecha
## 2 SP/08731 31/08/2022
## 3 SP/08730 31/08/2022
## 4 SP/08729 31/08/2022
## 5 SP/08728 31/08/2022
## 6 SP/08727 31/08/2022
## producto
## 2 [BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado.
## 3 [N61506747 CAJA] N61506747. Kit. Caja.
## 4 [N61506729 SEPARADOR] N61506729. Kit. Separador.
## 5 [341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado.
## 6 [DIVISOR ZIGZAG VW CHATTANOOGA] Chattanooga. St1 y St3. Zig Zag Troquelado.
## cantidad ubi_origen
## 2 2 SAB/Calidad/Entrega de PT
## 3 1 SAB/Calidad/Entrega de PT
## 4 1 SAB/Calidad/Entrega de PT
## 5 31 SAB/Pre-Production
## 6 1 SAB/Pre-Production
Corroborar que las columnas estén en el formato correcto
str(scrap)
## 'data.frame': 250 obs. of 5 variables:
## $ referencia: chr "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
## $ fecha : chr "31/08/2022" "31/08/2022" "31/08/2022" "31/08/2022" ...
## $ producto : chr "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
## $ cantidad : num 2 1 1 31 1 1 1 9 2 1 ...
## $ ubi_origen: chr "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
Cambiar cantidad a entero y fecha con formato de fecha
scrap$cantidad<-as.integer(scrap$cantidad)
scrap$fecha<-as.POSIXct(scrap$fecha, format ="%d/%m/%Y")
str(scrap)
## 'data.frame': 250 obs. of 5 variables:
## $ referencia: chr "SP/08731" "SP/08730" "SP/08729" "SP/08728" ...
## $ fecha : POSIXct, format: "2022-08-31" "2022-08-31" ...
## $ producto : chr "[BACKFRAME 60% CUELLO ARMADO] 18805. 60% Backframe. Cuello Armado." "[N61506747 CAJA] N61506747. Kit. Caja." "[N61506729 SEPARADOR] N61506729. Kit. Separador." "[341332 DIVISOR - U611 & U625] 341332. U611. U625. Divisor Troquelado." ...
## $ cantidad : int 2 1 1 31 1 1 1 9 2 1 ...
## $ ubi_origen: chr "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
Cambiar nombre de variables
carton<-carton %>% dplyr::rename(lam_procesadas=Laminas.procesadas,
fin_sep_up=FIN.INICIO.DE.SEP.UP,
inicio_proceso=INICIO.de.PROCESO,
fin_proceso=FIN.de.PROCESO,
fecha=Fecha)
carton<-clean_names(carton)
colnames(carton)
## [1] "fecha" "cliente" "id_form"
## [4] "producto" "piezas_prog" "tmo_min"
## [7] "hr_fin" "estacion_arranque" "lam_procesadas"
## [10] "inicio_sep_up" "fin_sep_up" "inicio_proceso"
## [13] "fin_proceso" "tiempo_calidad" "tiempo_materiales"
## [16] "x"
Mantener variables relevantes para el análisis
Para la base de datos de producción de cartón se ha
optado por eliminar las columnas de id_form, producto, tiempo_materiales
y estación de arranque; ya que con el resto de las columnas se puede
realizar otros calculos como mediciones de tiempo.
carton<-dplyr::select(carton,-c(id_form, producto, tiempo_materiales, x, estacion_arranque))
colnames(carton)
## [1] "fecha" "cliente" "piezas_prog" "tmo_min"
## [5] "hr_fin" "lam_procesadas" "inicio_sep_up" "fin_sep_up"
## [9] "inicio_proceso" "fin_proceso" "tiempo_calidad"
Corroborar que las columnas estén en el formato correcto
str(carton)
## 'data.frame': 5300 obs. of 11 variables:
## $ fecha : chr "15/07/22" "15/07/22" "15/07/22" "15/07/22" ...
## $ cliente : chr "STABILUS 1" "STABILUS 1" "STABILUS 1" "STABILUS 1" ...
## $ piezas_prog : chr "200" "100" "216" "100" ...
## $ tmo_min : chr "20" "15" "20" "10" ...
## $ hr_fin : chr "9:20" "9:35" "9:55" "10:05" ...
## $ lam_procesadas: chr "402" "134" "110" "100" ...
## $ inicio_sep_up : chr "9:05" "10:05" "9:40" "11.20" ...
## $ fin_sep_up : chr "9.10" "10:16" "9:43" "11:26" ...
## $ inicio_proceso: chr "9:12" "10.17" "9:45" "11:30" ...
## $ fin_proceso : chr "10:04" "11:05" "9.57" "11:49" ...
## $ tiempo_calidad: chr "1" "1" "1" "1" ...
Cambiar la fecha con formato de fecha, piezas programadas y laminas procesadas a entero, y las columnas que son de tiempo al formato de hora también
carton$piezas_prog <-as.integer(carton$piezas_prog)
carton$tmo_min <-as.integer(carton$tmo_min)
carton$hr_fin<-as.POSIXct(carton$hr_fin,format="%H:%M")
carton$hr_fin <- as.ITime(carton$hr_fin)
carton$inicio_sep_up<-as.POSIXct(carton$inicio_sep_up,format="%H:%M")
carton$inicio_sep_up <- as.ITime(carton$inicio_sep_up)
carton$fin_sep_up<-as.POSIXct(carton$fin_sep_up,format="%H:%M")
carton$fin_sep_up <- as.ITime(carton$fin_sep_up)
carton$inicio_proceso<-as.POSIXct(carton$inicio_proceso,format="%H:%M")
carton$inicio_proceso <- as.ITime(carton$inicio_proceso)
carton$fin_proceso<-as.POSIXct(carton$fin_proceso,format="%H:%M")
carton$fin_proceso <- as.ITime(carton$fin_proceso)
str(carton)
## 'data.frame': 5300 obs. of 11 variables:
## $ fecha : chr "15/07/22" "15/07/22" "15/07/22" "15/07/22" ...
## $ cliente : chr "STABILUS 1" "STABILUS 1" "STABILUS 1" "STABILUS 1" ...
## $ piezas_prog : int 200 100 216 100 20 200 100 12 32 500 ...
## $ tmo_min : int 20 15 20 10 10 20 10 10 10 60 ...
## $ hr_fin : 'ITime' int 09:20:00 09:35:00 09:55:00 10:05:00 10:15:00 10:35:00 10:45:00 10:55:00 11:05:00 10:00:00 ...
## $ lam_procesadas: chr "402" "134" "110" "100" ...
## $ inicio_sep_up : 'ITime' int 09:05:00 10:05:00 09:40:00 NA 12:00:00 12:32:00 NA NA 02:44:00 09:00:00 ...
## $ fin_sep_up : 'ITime' int NA 10:16:00 09:43:00 11:26:00 12:05:00 12:34:00 02:16:00 02:29:00 02:47:00 09:11:00 ...
## $ inicio_proceso: 'ITime' int 09:12:00 NA 09:45:00 11:30:00 12:15:00 12:47:00 NA 02:31:00 NA 09:13:00 ...
## $ fin_proceso : 'ITime' int 10:04:00 11:05:00 NA 11:49:00 12:31:00 02:00:00 NA 03:00:00 02:12:00 10:59:00 ...
## $ tiempo_calidad: chr "1" "1" "1" "1" ...
Fecha
No hay valores faltantes en esta comluna, sin embargo hay que cambiar el
formato de la variable a formato de fecha para que despues nos permita
realizar operaciones y encontrar otros datos.
carton$fecha <- as.Date(carton$fecha, format ="%d/%m/%y")
str(carton$fecha)
## Date[1:5300], format: "2022-07-15" "2022-07-15" "2022-07-15" "2022-07-15" "2022-07-15" ...
unique(carton$fecha)
## [1] "2022-07-15" "2022-07-16" "2022-07-18" "2022-07-19" "2022-07-20"
## [6] "2022-07-21" "2022-07-22" "2022-07-23" "2022-07-25" "2022-07-26"
## [11] "2022-07-27" "2022-07-28" "2022-07-29" "2022-07-30" "2022-08-01"
## [16] "2022-08-02" "2022-08-03" "2022-08-04" "2022-08-05" "2022-08-06"
## [21] "2022-08-08" "2022-08-09" "2022-08-10" "2022-08-11" "2022-08-12"
## [26] "2022-08-13" "2022-08-15" "2022-08-16" "2022-08-17" "2022-08-18"
## [31] "2022-08-19" "2022-08-20" "2022-08-22" "2022-08-23" "2022-08-24"
## [36] "2022-08-25" "2022-08-26" "2022-08-27" "2022-08-29" "2022-08-30"
## [41] "2022-08-31" "2022-09-01" "2022-09-02" "2022-09-03" "2022-09-05"
## [46] "2022-09-06" "2022-09-07" "2022-09-08" "2022-09-09" "2022-09-10"
## [51] "2022-09-12" "2022-09-13" "2022-09-14" "2022-09-15" "2022-09-16"
## [56] "2022-09-17" "2022-09-19" "2022-09-20" "2022-09-21"
Cliente
Con los clientes podemos observar que hay clientes con NA´s, otros con
espacios vacíos, y otros que son el mismo pero con error ortográfico,
como es el caso de STABILUS 3 y STABILUS 3. El formato de caracter está
correcto por lo que no hay que hacer modificaciones en el tipo de
variable.
unique(carton$cliente)
## [1] "STABILUS 1" "YANFENG" "TRMX"
## [4] "MERIDIAN LIGHTWEIGHT" "STABILUS 3" "STABILUS 3."
## [7] "HANON SYSTEMS" "VARROC" "VL-017-13939"
## [10] "DENSO" "" "VL-017-14086"
## [13] "HELLA" NA
He optado por, eliminar los registros con clientes con NA y con espacios en blanco, además de cambiar aquellos que tienen de cliente STABILUS 3. a STABILUS 3.
carton <- filter(carton, !is.na(carton$cliente))
carton <- filter(carton,cliente!="")
carton$cliente <- replace(carton$cliente,carton$cliente=="STABILUS 3.","STABILUS 3")
unique(carton$cliente)
## [1] "STABILUS 1" "YANFENG" "TRMX"
## [4] "MERIDIAN LIGHTWEIGHT" "STABILUS 3" "HANON SYSTEMS"
## [7] "VARROC" "VL-017-13939" "DENSO"
## [10] "VL-017-14086" "HELLA"
Inicio de proceso y fin de proceso
Se encontraron registros con NA´s, de opto por eliminar estos registros
para tener un mejor analisis. Así mismo, hay que eliminar los registros
que esten como 00:00 también.
carton <- filter(carton, !is.na(carton$inicio_proceso) & !is.na(carton$fin_proceso))
carton <- filter(carton,!inicio_proceso==00:00:00 & !fin_proceso==00:00:00)
sum(is.na(carton$inicio_proceso))
## [1] 0
sum(is.na(carton$fin_proceso))
## [1] 0
Inicio de sep up y fin de sep up
Para estas columnas también eliminaremos los registros con NA´s o con
00:00 como tiempo.
carton <- filter(carton, !is.na(carton$inicio_sep_up) & !is.na(carton$fin_sep_up))
carton <- filter(carton,!inicio_sep_up==00:00:00 & !fin_sep_up==00:00:00)
sum(is.na(carton$inicio_sep_up))
## [1] 0
sum(is.na(carton$fin_sep_up))
## [1] 0
Piezas Programadas
Se eliminaron los registros con NA´s. Otro cambio a realizar es
convertir el formato a entero.
carton <- filter(carton, !is.na(carton$piezas_prog))
carton$piezas_prog <- as.integer(carton$piezas_prog)
sum(is.na(carton$piezas_prog))
## [1] 0
Laminas procesadas
Para laminas procesadas si bien no tiene NA sus registros no son
consistentes y uniformes en su formato, algunos son numeros enteros,
otros estan divididos por un “/”, otros son alfanúmericos, y otros son 0
o registros vacíos. Se eliminaran aquellos registros menores a 1, los
vaciós y mantendremos el primer número antes del “/”, y los registros
alfanúmericos aquellos que solo tienen una letra, eliminaremos la letra,
pero aquellos que contengan signos como “=”, o más caracteres serán
eliminados. También el formato debe ser de entero por lo que hay que
hacer esta modificación.
carton <- carton %>% separate(lam_procesadas, c("lam_procesadas", "eliminar"), sep="/")
carton <- dplyr::select(carton,-eliminar)
carton <- carton[- grep("=", carton$lam_procesadas),]
carton <- carton[- grep("A 4 B4", carton$lam_procesadas),]
carton$lam_procesadas <- str_replace(carton$lam_procesadas, "[aeiouLAM=NbBsS]", "")
carton$lam_procesadas <- as.integer(carton$lam_procesadas)
carton <- filter(carton,carton$lam_procesadas>0)
sum(is.na(carton$lam_procesadas))
## [1] 0
unique(carton$lam_procesadas)
## [1] 51 402 501 152 3 202 216 407 212 421 454 350 104 204 203
## [16] 2 24 15 20 31 53 27 405 403 303 102 503 45 63 56
## [31] 57 404 37 46 78 101 9 6 232 406 302 103 210 76 26
## [46] 11 601 28 40 61 398 190 400 86 18 74 287 22 10 38
## [61] 34 135 82 30 8 23 25 97 13 243 148 205 300 67 41
## [76] 242 5 29 50 592 253 206 379 200 35 21 245 124 17 226
## [91] 201 121 218 109 12 4 47 70 110 88 323 324 33 184 73
## [106] 49 84 100 228 91 500 310 839 48 255 1262 36 19 1240 32
## [121] 14 234 219 427 1229 502 105 42 39 415 175 412 231 180 7
## [136] 221 126 16 208 145 52 81 602 90 802 134 79 77 439 163
## [151] 789 600 111 58 328 609 347 161 399 64 384 118 378 370 452
## [166] 752 375 171 44 215 391 376 339 252 772 207 139 197 766 390
## [181] 227 773 194 112 209 688 146 358 408 123 286 60 122 62 410
## [196] 130 322 437 229 187 380 199 120 162 354 247 137 240 236 304
## [211] 136 143 1022 519 608 584 298 154 306 211 65 414 505 396 140
## [226] 66 386 174 165 313 43 114 178 356 196 301 377 54 106 164
## [241] 125 401 274 435 235 108 388 80 127 181 244 220 241 151 117
## [256] 98 382 248 617 385 305 71 141 344 93 409 222 465 250 68
## [271] 315 185 416 312 1 107 133 195 198 128
Tmo_min y hr_final
Cambiar el formato de tmo_min a entero.
carton$tmo_min <- as.integer(carton$tmo_min)
Tiempo de calidad
Para tiempo de calidad podemos observar que hay registros que no son
enteros, otors que tienen segundos y otros que están vacíos. Los que no
son enteros los dejaremos vacíos, los vacíos van a permanecer y los que
tienen segundos van a ser redondeados al entero más cercano.
carton$tiempo_calidad <- str_replace(carton$tiempo_calidad, "9:47", "9")
carton <- subset(carton, tiempo_calidad!="|")
carton$tiempo_calidad <- as.integer(carton$tiempo_calidad)
unique(carton$tiempo_calidad)
## [1] 1 2 3 4 9 0 5 10 22 8 11 17 NA 7 25 21 6
Cambiar nombre de variables
perf<-clean_names(perf)
colnames(perf)
## [1] "cliente" "vueltas" "fecha" "plan_arrival"
## [5] "real_arrival" "real_departure" "diference"
Mantener variables relevantes para el análisis
Para delivery performance se opto por mantener todas
las columnas.
Cliente
Como podemos observar en cliente no hay errores ortográficos y el
formato de la columna es el correcto.
unique(perf$cliente)
## [1] "PRINTEL " "MAHLE" "MAGNA" "VARROC"
str(perf$cliente)
## chr [1:2392] "PRINTEL " "MAHLE" "MAHLE" "MAHLE" "MAGNA" "VARROC" "VARROC" ...
sum(is.na(perf$cliente))
## [1] 0
Vueltas
De igual manera en vueltas no hay errores ortográficos o valores
atípicos.
unique(perf$vueltas)
## [1] 1 2 3
str(perf$vueltas)
## int [1:2392] 1 1 2 3 1 1 2 3 1 1 ...
sum(is.na(perf$vueltas))
## [1] 0
Fecha
En esta variable no hay valores faltantes. Sin embargo la columna de
fecha está como caracter, por lo que hay que hacer el cambio de formato
a fecha.
perf$fecha <-as.Date(perf$fecha, format ="%d/%m/%Y")
str(perf$fecha)
## Date[1:2392], format: "2021-07-22" "2021-07-22" "2021-07-22" "2021-07-22" "2021-07-22" ...
sum(is.na(perf$fecha))
## [1] 0
Real Arrival y Real Departure
Para estas columnas podemos encontrar que hay valores con 0. Por lo
tanto vamos a eliminar los registros que tengan 0 en estas columnas. Así
mismo que hay valores en formato de 24 horas y hay que pasarlos a
formato de 12 horas.
perf <- perf %>% mutate(real_arrival=ifelse(real_arrival > 12, real_arrival-12, real_arrival))
perf <- perf %>% mutate(real_departure=ifelse(real_departure > 12, real_departure-12, real_departure))
perf <- filter(perf, perf$real_arrival>0 & perf$real_departure>0)
unique(perf$real_arrival)
## [1] 8.00 9.00 4.30 4.10 4.00 4.50 6.20 5.00 4.20 5.20 4.35 4.05
## [13] 8.18 4.15 8.05 9.30 9.20 9.15 9.10 3.30 6.15 4.25 4.40 3.36
## [25] 9.45 3.40 9.06 9.03 9.27 5.35 9.05 3.00 3.10 3.20 3.16 3.45
## [37] 9.35 10.08 9.08 7.15 8.40 8.15 11.20 11.00 1.00 11.50 2.00 11.15
## [49] 7.45 1.40 11.30 10.40 10.40 11.37 9.15 9.26 6.00 10.42 8.10 7.30
## [61] 9.10 8.52 8.30 7.34 7.35 9.12 10.05 9.17 7.48 8.20 10.00 8.10
## [73] 7.20 9.11 8.45 9.50 9.40 6.35 6.40 6.05 6.10 6.50 7.10 9.25
## [85] 6.30 5.30
unique(perf$real_departure)
## [1] 8.55 10.00 9.10 6.10 8.50 10.10 9.25 5.20 9.00 4.50 5.00 9.15
## [13] 8.51 9.05 6.50 9.45 5.05 5.15 7.55 4.55 9.55 6.20 10.15 5.25
## [25] 10.05 6.00 5.40 5.30 5.45 9.50 5.50 9.40 5.35 10.30 9.20 9.10
## [37] 10.45 11.05 10.58 10.25 9.15 9.35 5.58 7.40 5.55 6.25 10.40 10.06
## [49] 6.31 10.27 7.00 6.30 6.35 10.20 7.30 4.45 3.55 4.00 4.10 4.35
## [61] 4.40 4.30 10.35 10.55 5.38 10.10 8.00 10.50 11.35 11.00 9.40 12.15
## [73] 12.00 11.50 6.08 1.45 12.50 6.40 12.35 2.40 11.15 8.05 0.40 0.05
## [85] 12.45 11.55 10.15 10.12 9.35 8.45 9.30 8.40 8.15 8.30 9.58 8.34
## [97] 8.20 8.40 8.35 8.15 11.30 11.20 7.20 6.40 6.45 7.50 8.10 10.24
## [109] 7.40 7.45 1.10
Al hacerlo, los registros de los clientes de VARROC y MAGNA se eliminaron de la base de datos.
Plan Arrival
Primeramente hay que pasar el formato de 24 horas a 12 horas. Para esto se remplazaron los valores de 20 y 16 a 8 y 4.
perf$plan_arrival <- replace(perf$plan_arrival,perf$plan_arrival==20,8)
perf$plan_arrival <- replace(perf$plan_arrival,perf$plan_arrival==16,4)
unique(perf$plan_arrival)
## [1] 8 9 4 0
Para Plan Arrival es posible observar que hay registros con 0, estos serán remplazados con el promedio o la mediana de plan arrival por cliente por vuelta, esto con el propósito que sea lo más preciso posible.
sum(is.na(perf$plan_arrival))
## [1] 0
Al observar el valor de skewness, podemos observar que el valor es mayor a 1, (aunque sea negativo su valor supera el 1) por lo que su distribución nos sugiere que es mejor remplazar con la mediana.
describe(perf$plan_arrival)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 800 7.82 1.5 8 8.16 0 0 9 9 -1.98 3 0.05
Como queremos remplazar el 0 unicamente en el cliente MAHLE y en la vuelta 3 debemos hacer lo siguiente.
perf <- perf %>% mutate(plan_arrival=ifelse(plan_arrival == 0 | cliente == "MAHLE"| vueltas == 3,8,plan_arrival))
unique(perf$plan_arrival)
## [1] 8 4
En el valor de skewness, podemos observar que el valor es menor a 1 por lo que su distribución nos sugiere que es mejor remplazar con el promedio. Además podemos observar que la mediana es 0 debido a que muchos valores tienen 0 como plan arrival.
describe(perf$plan_arrival)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 800 7.53 1.29 8 7.91 0 4 8 4 -2.35 3.54 0.05
Para remplazar 0 con el promedio vamos a calcular el promedio por cliente por vuelta.
aggregate(plan_arrival ~ cliente + vueltas, data = perf, mean)
## cliente vueltas plan_arrival
## 1 MAHLE 1 8
## 2 PRINTEL 1 4
## 3 MAHLE 2 8
## 4 MAHLE 3 8
Como se quiere remplazar el 0 unicamente en el cliente MAHLE y en la vuelta 3 debemos hacer lo siguiente.
perf <- perf %>% mutate(plan_arrival=ifelse(plan_arrival == 0 | cliente == "MAHLE"| vueltas == 3,20,plan_arrival))
unique(perf$plan_arrival)
## [1] 20 4
Difference
Esta columna se supone es la diferencia que hay entre real arrival y
real departure, sin embargo, como se puede observar no todos los
registros tienen el calculo correcto, e inclusive algunas ni si quiera
tienen el calculo por lo que es necesario modificar esta columna.
perf$plan_arrival <- as.numeric(perf$plan_arrival)
perf$real_arrival <- as.numeric(perf$real_arrival)
perf$real_departure <- as.numeric(perf$real_departure)
perf <- mutate(perf, difference=real_departure-real_arrival)
perf <- dplyr::select(perf,-difference)
head(perf,5)
## cliente vueltas fecha plan_arrival real_arrival real_departure
## 1 MAHLE 1 2021-07-22 20 8.0 8.55
## 2 MAHLE 2 2021-07-22 20 9.0 10.00
## 3 MAHLE 3 2021-07-22 20 8.0 9.10
## 4 PRINTEL 1 2021-07-25 4 4.3 6.10
## 5 MAHLE 1 2021-07-25 20 8.0 8.50
## diference
## 1 0.55
## 2 1.00
## 3 1.10
## 4 1.80
## 5 0.50
Cambiar nombre de variables
plan<-clean_names(plan)
plan<-plan %>% dplyr::rename(cliente=cliente_planta,
jun_21=junio,
jul_21=julio,
ago_21=agosto,
sep_21=septiembre,
oct_21=octubre,
nov_21=noviembre,
dic_21=diciembre,
oct_22=octubre_22)
colnames(plan)
## [1] "cliente" "proyecto" "id_odoo" "item" "jun_21"
## [6] "jul_21" "ago_21" "sep_21" "oct_21" "nov_21"
## [11] "dic_21" "ene_22" "feb_22" "mar_22" "abr_22"
## [16] "may_22" "jun_22" "jul_22" "ago_22" "sep_22"
## [21] "oct_22" "nov_22" "dic_22" "ene_23" "feb_23"
## [26] "mar_23" "total_meses"
Mantener variables relevantes para el análisis
Para delivery plan por fines de estructura y análisis
se ha otado por transformar la base de datos y las columnas de cada mes
convertirlas en datos de una sola columna denominada como Mes y los
valores pasarlos a otra columna llamada Unidades.
plan<-pivot_longer(plan, cols=5:26, names_to = "mes", values_to = "unidades")
Ya que contamos con la base de datos transformada se ha optado por eliminar la columna de total meses ya que podemos calcular el total de todos los meses por productos posteriormente, y la de id_odoo.
plan<-dplyr::select(plan,-c(total_meses,id_odoo))
Cliente Planta
No hay errores ortográficos por lo que no se haran cambios en esta
columna.
unique(plan$cliente)
## [1] "STB3" "STB4" "STB5" "STB6"
## [5] "STB7" "STB8" "STB9" "STB 1"
## [9] "YF RAMOS" "INOAC POLYTEC" "MERIDIAN" "YANFENG sm"
## [13] "YFTO" "YFCF" "YF QRO" "TRMX"
## [17] "DENSO" "SEGROVE" "HANON" "ANTOLIN TOLUCA"
## [21] "ANTOLIN ARTEAGA" "HELLA" "UFI" "ISRI"
## [25] "ABC QUERETARO" "VARROC"
Proyecto
De igual manera para proyecto no se encontramos errores de
inconsistencia.
unique(plan$proyecto)
Item
De igaul manera para item no se realizaron modificaciones.
unique(plan$item)
Mes
Para la columna de mes no se encontraron errores ortográficos por lo que
no se haran modificaciones.
unique(plan$mes)
## [1] "jun_21" "jul_21" "ago_21" "sep_21" "oct_21" "nov_21" "dic_21" "ene_22"
## [9] "feb_22" "mar_22" "abr_22" "may_22" "jun_22" "jul_22" "ago_22" "sep_22"
## [17] "oct_22" "nov_22" "dic_22" "ene_23" "feb_23" "mar_23"
Unidades
Para unidades se opto por eliminar los registros con 0 unidades, ya que
al convertir los meses en una sola columna, todos aquellos meses donde
no había producción planeada tienen 0. También se corraboro que el
formato de la columna sea el correcto, de entero.
plan <- filter(plan, unidades>0)
str(plan$unidades)
## int [1:972] 140 530 200 150 230 500 200 900 1000 184 ...
Cambiar nombre de variables
bajas<-clean_names(bajas)
bajas<-bajas %>% dplyr::rename(apellidos=apellidos,
fecha_nac=fecha_de_nacimiento,
fecha_alta=fecha_de_alta,
mot_baja=motivo_de_baja,
no_ss=no_seguro_social,
sal_diario_imss=salario_diario_imss,
credito_infonavit=n_credito_infonavit,
lugar_nac=lugar_de_nacimiento,
num_interno=numero_interno,
CP=codigo_postal,
permanencia=x)
colnames(bajas)
## [1] "apellidos" "nombre" "fecha_nac"
## [4] "genero" "rfc" "fecha_alta"
## [7] "mot_baja" "permanencia" "baja"
## [10] "puesto" "departamento" "no_ss"
## [13] "sal_diario_imss" "factor_cred_infonavit" "credito_infonavit"
## [16] "lugar_nac" "curp" "calle"
## [19] "num_interno" "colonia" "CP"
## [22] "municipio" "estado" "estado_civil"
## [25] "tarjeta_cuenta"
Mantener variables relevantes para el análisis
Para la base de datos de bajas se opto por hacer una
transformación a la base de datos y unir los apellidos con el nombre,
además de eliminar las columnas de RFC, número de seguro social, factor
de crédito infonavit, crédito infonavit, CURP, lugar de nacimiento,
calle, numero interno, y tarjeta de cuenta.
bajas<-mutate(bajas,nombre_completo = paste(bajas$nombre, bajas$apellidos, sep=" "))
bajas<-dplyr::select(bajas,-c(rfc, no_ss,factor_cred_infonavit,credito_infonavit,curp,tarjeta_cuenta,apellidos,nombre,lugar_nac,calle,num_interno))
bajas<-bajas[,c(15,1,2,3,4,5,6,7,8,9,10,11,12,13,14)]
colnames(bajas)
## [1] "nombre_completo" "fecha_nac" "genero" "fecha_alta"
## [5] "mot_baja" "permanencia" "baja" "puesto"
## [9] "departamento" "sal_diario_imss" "colonia" "CP"
## [13] "municipio" "estado" "estado_civil"
Nombre completo, fecha de nacimiento y fecha de
alta
Convertir a formato de fecha la fecha de alta y la fecha de
nacimiento.
bajas$fecha_nac <- as.Date(bajas$fecha_nac, format ="%d/%m/%Y")
str(bajas$fecha_nac)
## Date[1:238], format: "1990-06-24" "1986-07-11" "1999-01-29" "2001-06-11" "1993-01-28" ...
bajas$fecha_alta <- as.Date(bajas$fecha_alta, format ="%d/%m/%Y")
str(bajas$fecha_alta)
## Date[1:238], format: "2020-03-09" "2021-11-09" "2021-11-10" "2021-11-10" "2021-11-18" ...
Género
En la columna de género solo hay un valor vacío, basados en su nombre
completo vamos a asumir que su género es masculino. Así mismo, hay un
registro con lo que parece ser un RFC en lugar del género, basado en el
nombre de esa persona asumiremos que es femenino.
bajas$genero <- replace(bajas$genero,bajas$genero=="","MASCULINO")
bajas$genero <- replace(bajas$genero,bajas$genero=="CAPJ000926597","FEMENINO")
Código Postal
Para el código postal hay que remplazar los registros que tengan el
municipio en lugar del CP por su respectivo CP.
bajas2 <- bajas
bajas2 <- bajas2 %>% mutate(bajas2, CP2=CP)
bajas2 <- bajas2 %>% mutate(bajas2, municipio2=municipio)
bajas2 <- bajas2 %>% mutate(bajas2, estado2=estado)
#Remplazar el municipio por el CP en la columna de CP, tambien remplazar union libre por el CP
bajas2 <- bajas2 %>% mutate(CP=ifelse(CP == "APODACA" | CP == "JUAREZ" | CP == "MONTERREY" | CP == "GUADALUPE" | CP == "RAMOS ARIZPE"| CP == "SAN PDRO COAH"| CP == "PESQUERIA"| CP == "CADEREYTA"| CP == "SAN NICOLAS DE LOS GARZA"| CP == "SALTILLO"| CP == "ZUAZUA"| CP == "CIENEGA DE FLORES"| CP == "NUEVO LEON", estado , CP))
bajas2 <- bajas2 %>% mutate(CP=ifelse(CP == "UNION LIBRE", municipio , CP))
unique(bajas2$CP)
## [1] "66438" "0" "66646" "66640" "66649" "67254" "67114" "66645" ""
## [10] "66644" "66360" "25297" "66648" "67256" "64750" "66670" "66600" "66643"
## [19] "67267" "64764" "67110" "66633" "25902" "27970" "66655" "66647" "66612"
## [28] "64220" "66650" "67486" "67130" "99999" "66673" "67117" "66473" "25019"
## [37] "66634" "67258" "66477" "67113" "67265" "25904" "65776" "67250" "66444"
## [46] "67176" "65580" "67262"
Municipio
En municipio hay que remplazar los registros que tienen el estado por su
respectivo municipio. Además de estandarizar los registros, por ejemplo,
cambiar “SAN NICOLAS DE LOS G” por “SAN NICOLAS DE LOS GARZA”.
#Remplazar el estado por el municipio
bajas2 <- bajas2 %>% mutate(municipio=ifelse(municipio == "NUEVO LEON" | municipio == "Nuevo León" | municipio == "COAHUILA" | municipio == "Coahuila",CP2 , municipio))
bajas2 <- bajas2 %>% mutate(municipio=ifelse(municipio == 66444 , colonia , municipio))
#Cambias SAN NICOLAS DE LOS G x SAN NICOLAS DE LOS GARZA
bajas2$municipio <- replace(bajas2$municipio,bajas2$municipio=="SAN NICOLAS DE LOS G","SAN NICOLAS DE LOS GARZA")
unique(bajas2$municipio)
## [1] "SAN NICOLAS DE LOS GARZA" "PESQUERIA"
## [3] "APODACA" "JUAREZ"
## [5] "GUADALUPE" "RAMOS ARIZPE"
## [7] "Nuevo León" "SAN PDRO COAH"
## [9] "CADEREYTA" "SALTILLO"
## [11] "" "CIENEGA DE FLORES"
Estado
En estado hay que remplazar los registros que tienen CP por el estado
correcto. Así mismo, estandarizar los registros, por
ejemplo, cambiar “Nuevo León” por “NUEVO LEON”.
#Remplazar el CP por el estado correcto en la columna de estado
bajas2 <- bajas2 %>% mutate(estado=ifelse(municipio == "SAN NICOLAS DE LOS GARZA" | municipio == "PESQUERIA" | municipio == "APODACA" | municipio == "JUAREZ" | municipio == "GUADALUPE"| municipio == "RAMOS ARIZPE"| municipio == "CADEREYTA"| municipio == "ZUAZUA"| municipio == "CIENEGA DE FLORES"| municipio == "MONTERREY", "NUEVO LEON" , municipio))
bajas2$estado <- replace(bajas2$estado,bajas2$estado=="SAN PDRO COAH","COAHUILA")
bajas2$estado <- replace(bajas2$estado,bajas2$estado=="SALTILLO","COAHUILA")
unique(bajas2$estado)
## [1] "NUEVO LEON" "Nuevo León" "COAHUILA" ""
Estado Civil
En estado civil hay que estandarizar los registros, por
ejemplo, cambiar “UNIONLIBRE” por “UNION LIBRE”.
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="UNIONLIBRE","UNION LIBRE")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="Unión libre","UNION LIBRE")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="Soltero","SOLTERO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="Casado","CASADO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="CASADA","CASADO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="SOLTERA","SOLTERO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="DIVORCIADA","DIVORCIADO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="CASADO","CASADO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="DIVORCIADO","DIVORCIADO(A)")
bajas2$estado_civil <- replace(bajas2$estado_civil,bajas2$estado_civil=="SOLTERO","SOLTERO(A)")
unique(bajas2$estado_civil)
## [1] "SOLTERO(A)" "UNION LIBRE" "CASADO(A)" ""
## [5] "DIVORCIADO(A)" "Unión libre"
Puesto
Para puesto vamos a unificar aquellos puestos que son similares y que
tengan errores ortográficos. Por ejemplo, “AY. GENERAL (MATERIALES)” y
“AYUDANTE DE EMBARQUES” pasarlos a “AYUDANTE GENERAL”.
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AY.GENERAL (MATERIALES)","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUDANTE DE EMBARQUES","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AY. GENERAL","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUD.EMBARQUES","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUDANTE DE SOLDADOR","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUDANTE DE MTTO","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUDANTE DE SOLDADOR","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="AYUDANTE GENERAL DE EMBARQUES","AYUDANTE GENERAL")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="COSTURERA","COSTURERO(A)")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="COSTURERO","COSTURERO(A)")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="INSPECTOR DE CALIDAD","INSPECTOR(A) DE CALIDAD")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="INSPECTORA DE CALIDAD","INSPECTOR(A) DE CALIDAD")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="INSPECTOR CALIDAD","INSPECTOR(A) DE CALIDAD")
bajas2$puesto <- replace(bajas2$puesto,bajas2$puesto=="DISEÑO","DISEÑO")
bajas2$puesto <- toupper(bajas2$puesto)
unique(bajas2$puesto)
## [1] "DISEÑO" "AYUDANTE GENERAL"
## [3] "COSTURERO(A)" "RESIDENTE YANFENG"
## [5] "MONTACARGUISTA" "SERVICIO AL CLIENTE"
## [7] "ANALISTA DE NOMINAS /AUX DE R.H." "AUXILIAR DE EMBARQUES"
## [9] "CHOFER" "INSPECTOR(A) DE CALIDAD"
## [11] "MATERIALISTA" "SOLDADOR"
## [13] "FACTURACION" "JEFE DE SEGURIDAD E HIGIENE"
## [15] "MARCADORA" "CORTADOR"
## [17] "LIMPIEZA" "RESIDENTE"
## [19] "GUARDIA DE SEGURIDAD" "ENCARGADA DE CALIDAD"
## [21] "" "PRACTICANTE DE MTTO"
Departamento
Para departamento se realizara lo mismo que en puesto.
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="celdas","CELDAS")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Celdas","CELDAS")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Cedis","CEDIS")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Embarques","EMBARQUES")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Costura","COSTURA")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Paileria","PAILERIA")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Stabilus","STABILUS")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Troquel","TROQUEL")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Mantenimiento FF","MANTENIMIENTO")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="stabilus","STABILUS")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Produccion Cartón MC","PRODUCCION CARTON MC")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Produccion Cartón MDL","PRODUCCION CARTON MDL")
bajas2$departamento <- replace(bajas2$departamento,bajas2$departamento=="Producción Retorn","PRODUCCION RETORNO")
bajas2$departamento <- toupper(bajas2$departamento)
unique(bajas2$departamento)
## [1] "ADMINISTRATIVO" "PRODUCCION CARTÓN MC" "STABILUS"
## [4] "CELDAS" "" "MATERIALES"
## [7] "CEDIS" "PRODUCCION CARTÓN MDL" "PRODUCCIÓN RETORN"
## [10] "TROQUEL" "MANTENIMIENTO" "AY.FLEXO"
## [13] "COSTURA" "MARCADORA" "CAJAS"
## [16] "LAMINADO" "CALIDAD" "EMBARQUES"
## [19] "PAILERIA" "EHS" "CORTADORAS"
Motivo de Baja
Para motivo de baja se realizara algo diferente. Al analizar la base de
datos nos dimos cuenta que muchos de los empleados que tienen muy pocos
días, por ejemplo de 0 días a 10, en lugar de tener como motivo de baja
ABANDONO, tiene FALTAS. Para que el motivo de baja sea las faltas,
debería de existir un periodo establecido sobre el cual se limiten las
faltas. Por ejemplo, cada empleado solo tiene permitidas tanta cantidad
de faltas al mes. Por lo tanto, aquellos empleados que tienen menos de
10 días de permanencia, cambiaremos su motivo de baja de FALTAS a
ABANDONO.
#Remplazamos FALTA POR BAJAS por ABANDONO
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(permanencia < 10, "ABANDONO" , mot_baja))
#Mantenemos los motivos de baja que no eran FALTA POR BAJAS y tenian permanencia menor de 10 días.
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "JOANA NOHEMI COLUNGA ORTIZ", "RENUNCIA VOLUNTARIA" , mot_baja))
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "ERNESTO GONZALEZ CASTILLO", "RENUNCIA VOLUNTARIA" , mot_baja))
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "MOISES LAUREANI JIMENEZ", "RENUNCIA VOLUNTARIA" , mot_baja))
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "ROCIO OCHOA GONZALEZ", "RENUNCIA VOLUNTARIA" , mot_baja))
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "MARGARITA RIVAS GONZALEZ", "RENUNCIA VOLUNTARIA" , mot_baja))
bajas2 <- bajas2 %>% mutate(mot_baja=ifelse(nombre_completo == "GLORIA FACUNDO MONTOYA", "RENUNCIA VOLUNTARIA" , mot_baja))
Salario Diario del IMSS
Para salario diario hay que asegurarnos que este en el formato correcto,
además de remplazar los valores faltantes e identificar valores atípicos
y definir si hay que remplazarlos.
filter(bajas2,is.na(bajas2$sal_diario_imss))
## nombre_completo fecha_nac genero fecha_alta
## 1 POLETT ADRIANA LOPEZ RUIZ 1988-08-24 FEMENINO 2022-04-04
## 2 ANGEL GUILLERMO PALOMO LOPEZ <NA> MASCULINO <NA>
## mot_baja permanencia baja puesto
## 1 RENUNCIA VOLUNTARIA 18 22/04/2022 JEFE DE SEGURIDAD E HIGIENE
## 2 <NA> NA
## departamento sal_diario_imss colonia CP municipio estado estado_civil CP2
## 1 NA
## 2 NA
## municipio2 estado2
## 1
## 2
describe(bajas2$sal_diario_imss)
## vars n mean sd median trimmed mad min max range skew kurtosis
## X1 1 236 177.96 23.26 180.68 179.14 0 144.45 500 355.55 11.05 152.94
## se
## X1 1.51
Como podemos ver hay dos registros faltantes, para el de Ángel remplazaremos con la mediana, ya que su valor de skewness del salario diario es mayor a 1, indicandonos que es mejor usar la mediana que la media.
summary(bajas2$sal_diario_imss)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 144.4 180.7 180.7 178.0 180.7 500.0 2
bajas2 <- bajas2 %>% mutate(sal_diario_imss=ifelse(nombre_completo == "ANGEL GUILLERMO PALOMO LOPEZ", 180.7, sal_diario_imss))
bajas2 <- bajas2 %>% mutate(sal_diario_imss=ifelse(nombre_completo == "POLETT ADRIANA LOPEZ RUIZ", 180.7, sal_diario_imss))
sum(is.na(bajas2$sal_diario_imss))
## [1] 0
Finalmente terminamos de limpiar la base de datos de aquellas columnas que tuvimos que agregar o renombrar.
bajas2 <- dplyr::select(bajas2, -c(CP2,municipio2,estado2))
bajas <- bajas2
colnames(bajas2)
## [1] "nombre_completo" "fecha_nac" "genero" "fecha_alta"
## [5] "mot_baja" "permanencia" "baja" "puesto"
## [9] "departamento" "sal_diario_imss" "colonia" "CP"
## [13] "municipio" "estado" "estado_civil"
Cambiar nombre de variables
colaboradores<-clean_names(colaboradores)
colaboradores<-colaboradores %>% dplyr::rename(no_empleado=no_de_empleado,
fecha_nac=fecha_de_nacimiento,
fecha_alta=fecha_de_alta,
"4to_mes"=x4to_mes,
no_ss=no_seguro_social,
sal_diario_imss=salario_diario_imss,
credito_infonavit=n_credito_infonavit,
lugar_nac=lugar_de_nacimiento,
num_interno=numero_interno,
CP=codigo_postal)
colnames(bajas)
## [1] "nombre_completo" "fecha_nac" "genero" "fecha_alta"
## [5] "mot_baja" "permanencia" "baja" "puesto"
## [9] "departamento" "sal_diario_imss" "colonia" "CP"
## [13] "municipio" "estado" "estado_civil"
Mantener variables relevantes para el análisis
Para la base de datos de colaboradores también se opto
por unir apellidos con el nombre, además de eliminar las columnas de
RFC, número de seguro social, factor de crédito infonavit, crédito
infonavit, CURP, lugar de nacimiento, calle, numero interno, y tarjeta
de cuenta.
colaboradores<-mutate(colaboradores,nombre_completo = paste(colaboradores$nombre, colaboradores$apellidos, sep=" "))
colaboradores<-dplyr::select(colaboradores,-c(rfc, no_ss,factor_cred_infonavit,credito_infonavit,curp,tarjeta_cuenta,apellidos,nombre,baja,calle,num_interno,lugar_nac,"4to_mes",primer_mes,no_empleado))
colaboradores<-colaboradores[,c(12,1,2,3,4,5,6,7,8,9,10,11)]
Nombre Completo
A nombre completo no se le haran cambios en la base de datos.
Fecha de nacimiento y fecha de alta
Para fecha de nacimiento y fecha de alta nos aseguramos que el formato
este en formato de fecha.
colaboradores$fecha_alta <- as.Date(colaboradores$fecha_alta, format = "%d/%m/%Y")
colaboradores$fecha_nac <- as.Date(colaboradores$fecha_nac, format = "%d/%m/%Y")
Género
Para género se identificaron 9 registros totalmente vacíos, por lo que
es necesario eliminar estas filas.
unique(colaboradores$genero)
## [1] "MASCULINO" "FEMENINO"
filter(colaboradores, colaboradores$genero=="")
## [1] nombre_completo fecha_nac genero fecha_alta
## [5] puesto departamento sal_diario_imss colonia
## [9] municipio estado CP estado_civil
## <0 rows> (or 0-length row.names)
colaboradores <- colaboradores[-(114:122),]
Puesto
Para puesto hay que estandarizar los registros,
específicamente aquellos que son el mismo puesto pero están escritos
diferente.
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="Supervisor de Máquin","SUPERVISOR(A)")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="Supervisor de pegado","SUPERVISOR(A)")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="SUPERVISORA","SUPERVISOR(A)")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="AY. GENERAL","AYUDANTE GENERAL")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="AYUDANTE DE MANTENIMIENTO","AYUDANTE GENERAL")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="CHOFER GESTOR","CHOFER")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="INSPECTOR DE CALIDAD","INSPECTOR(A) DE CALIDAD")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="INSPECTORA DE CALIDAD","INSPECTOR(A) DE CALIDAD")
colaboradores$puesto <- replace(colaboradores$puesto,colaboradores$puesto=="Mantenimiento FF","MANTENIMIENTO")
colaboradores$puesto <- toupper(colaboradores$puesto)
unique(colaboradores$puesto)
## [1] "SUPERVISOR DE MÁQUIN" "SUPERVISOR(A)"
## [3] "EXTERNO" "CUSTOMER SERVICE INF"
## [5] "COSTURERA" "AYUDANTE GENERAL"
## [7] "GESTOR" "CHOFER"
## [9] "LIDER" "MANTENIMIENTO"
## [11] "RESIDENTE" "LIMPIEZA"
## [13] "INSPECTOR(A) DE CALIDAD" "PINTOR"
## [15] "SOLDADOR" "RECIBO"
## [17] "ENFERMERA" "OP. FLEXO-RANURADORA-REFILADORA"
## [19] "GUARDIA DE SEGURIDAD" "MOZO"
## [21] "OPERADOR SIERRA" "MONTACARGUISTA"
Departamento
Para departamento hay que estandarizar los registros
que son el mismo pero escritos diferentes.
unique(colaboradores$departamento)
## [1] "Produccion Cartón MDL" "Externo" "Produccion Cartón MC"
## [4] "Costura" "Cedis" "Producción Retorn"
## [7] "Costura T2" "Embarques" "EHS"
## [10] "Limpieza" "Calidad" "Paileria"
## [13] "Materiales" "COSTURA" ""
## [16] "Rotativa" "Stabilus" "Troquel"
## [19] "Celdas" "Ay.flexo" "CEDIS"
## [22] "CORTADORAS"
colaboradores$departamento <- replace(colaboradores$departamento,colaboradores$departamento=="Produccion Cartón MDL","PRODUCCIÓN CARTON MDL")
colaboradores$departamento <- replace(colaboradores$departamento,colaboradores$departamento=="Produccion Cartón MC","PRODUCCION CARTON MC")
colaboradores$departamento <- replace(colaboradores$departamento,colaboradores$departamento=="Producción Retorn","PRODUCCION RETORNO")
colaboradores$departamento <- replace(colaboradores$departamento,colaboradores$departamento=="Costura T2","COSTURA")
colaboradores$departamento <- toupper(colaboradores$departamento)
Salario diario del IMSS
Para salario diario del IMSS hay que asegurarnos que el formato esté
correcto. Así mismo, hay que corregir los valores
atípicos.
options(scipen = 999)
colaboradores$sal_diario_imss <- as.numeric(colaboradores$sal_diario_imss)
unique(colaboradores$sal_diario_imss)
## [1] 176.72 337.05 4413757.00 260.01 240.75
## [6] 152.86 175.79 144.45 279.61 151.67
## [11] 208.65 240.71 1516728571.00 151.61 180.68
## [16] 181.68 184.68 185.68
str(colaboradores$sal_diario_imss)
## num [1:113] 177 177 177 337 4413757 ...
Para corregir los valores atípicos primero hay que identificarlos. Para remplazar su salario, nos basaremos en puestos similares para asignarles uno similar.
filter(colaboradores, colaboradores$sal_diario_imss > 4413750)
## nombre_completo fecha_nac genero fecha_alta
## 1 YOLANDA LOPEZ RAMOS 1965-09-06 FEMENINO 2014-05-05
## 2 JAIME ERNESTO AGUILERA RODRIGUEZ 1969-02-21 MASCULINO 2020-08-08
## puesto departamento sal_diario_imss colonia
## 1 SUPERVISOR(A) COSTURA 4413757 RINCON DE GALICIA
## 2 AYUDANTE GENERAL PRODUCCIÓN RETORN 1516728571 LOS PUERTOS 2° SECTOR
## municipio estado CP estado_civil
## 1 APODACA Nuevo León 66620 Soltero
## 2 JUAREZ Nuevo León 67267 Casado
Podemos observar que el puesto de Jaime Ernesto es Ayudante general y que está en el departamento de Producción Retorno. Al observar registros con el mismo puesto y departamento, podemos observar que tres colaboradores tienen un salario de 151.61, y el salario equivocado es de 1516728571.00, por lo que podríamos asumir ha sido un error de dedo y el salario correcto es 151.61, por lo que optamos por remplazarlo por este valor.
colaboradores$sal_diario_imss[colaboradores$nombre_completo == "JAIME ERNESTO AGUILERA RODRIGUEZ"] <- 151.61
El segundo salario equivocado es de 4413757.00. y de YOLANDA LOPEZ RAMOS. Ahora hay que identificar puestos similares en el mismo departamento.
filter(colaboradores, departamento == "COSTURA")
## nombre_completo fecha_nac genero fecha_alta
## 1 YOLANDA LOPEZ RAMOS 1965-09-06 FEMENINO 2014-05-05
## 2 ARACELY PERALTA MARTINEZ 1967-07-01 FEMENINO 2015-08-06
## 3 YOLANDA JUDITH LUNA LOPEZ 1985-08-18 FEMENINO 2017-02-20
## 4 MA DEL CARMEN GARCIA CARRIZALES 1978-02-03 FEMENINO 2020-04-07
## 5 ADELAIDA MENDOZA NAVARRO 1979-12-16 FEMENINO 2020-08-26
## 6 BLANCA OLIVIA BARRON RAMOS 1969-06-29 FEMENINO 2020-08-28
## 7 SOLEDAD ENCARNACION CARDENAS OLMOS 1972-01-22 FEMENINO 2021-04-24
## 8 JOSE ALFREDO VAZQUEZ CEPEDA 1963-08-28 MASCULINO 2021-08-12
## 9 MARCIANA NATIVIDAD MARTINEZ 1967-01-04 FEMENINO 2021-12-06
## puesto departamento sal_diario_imss colonia
## 1 SUPERVISOR(A) COSTURA 4413757.00 RINCON DE GALICIA
## 2 COSTURERA COSTURA 260.01 ALAMOS DEL PARQUE
## 3 COSTURERA COSTURA 152.86 C. H. BLAS CHUMACERO C.T.M
## 4 COSTURERA COSTURA 240.71 PUEBLO NUEVO
## 5 COSTURERA COSTURA 176.72 LOS CANDILES
## 6 COSTURERA COSTURA 176.72 PUEBLO NUEVO
## 7 AYUDANTE GENERAL COSTURA 151.61 PORTAL DE VALLE
## 8 COSTURERA COSTURA 176.72 LA ALIANZA SECTOR C
## 9 COSTURERA COSTURA 176.72 LA JOYA
## municipio estado CP estado_civil
## 1 APODACA Nuevo León 66620 Soltero
## 2 APODACA Nuevo León 66633 Casado
## 3 SAN NICOLAS DE LOS G Nuevo León 66473 Casado
## 4 APODACA Nuevo León 66646 Union Libre
## 5 APODACA Nuevo León 66647 CASADA
## 6 APODACA Nuevo León 66646 Casado
## 7 APODACA NUEVO LEON 66643 CASADA
## 8 MONTERREY NUEVO LEON 64103 DIVORCIADO
## 9 GUADALUPE NUEVO LEON 67160 CASADA
En este caso, es el único registro con ese puesto en el departamento, por lo tanto identificaremos puestos similares pero en diversos departamentos.
filter(colaboradores, puesto == "SUPERVISOR(A)")
## nombre_completo fecha_nac genero fecha_alta puesto
## 1 MARIANA DE LEON MORENO 1979-05-14 FEMENINO 2011-07-01 SUPERVISOR(A)
## 2 MARIA CAZARES MORALES 1990-05-01 FEMENINO 2013-01-30 SUPERVISOR(A)
## 3 YOLANDA LOPEZ RAMOS 1965-09-06 FEMENINO 2014-05-05 SUPERVISOR(A)
## departamento sal_diario_imss colonia municipio estado
## 1 PRODUCCION CARTÓN MDL 176.72 SANTA TERESITA APODACA Nuevo León
## 2 PRODUCCION CARTÓN MC 337.05 PUEBLO NUEVO APODACA Nuevo León
## 3 COSTURA 4413757.00 RINCON DE GALICIA APODACA Nuevo León
## CP estado_civil
## 1 66605 Soltero
## 2 66649 Casado
## 3 66620 Soltero
Se identifico solo un registro más con el mismo puesto, por lo que optaremos por asignar el mismo salario al registro con el salario elevado.
colaboradores$sal_diario_imss[colaboradores$nombre_completo == "YOLANDA LOPEZ RAMOS"] <- 337.05
unique(colaboradores$sal_diario_imss)
## [1] 176.72 337.05 260.01 240.75 152.86 175.79 144.45 279.61 151.67 208.65
## [11] 240.71 151.61 180.68 181.68 184.68 185.68
Municipio
En municipio hay que estandarizar los registros, por
ejemplo, cambiar “SAN NICOLAS DE LOS G” por “SAN NICOLAS DE LOS
GARZA”.
unique(colaboradores$municipio)
## [1] "SAN NICOLAS DE LOS G" "APODACA" "SALTILLO"
## [4] "PESQUERIA" "MONTERREY" "GUADALUPE"
## [7] "JUAREZ" "RAMOS ARIZPE" "CAÑADA BLANCA"
colaboradores$municipio <- replace(colaboradores$municipio,colaboradores$municipio=="SAN NICOLAS DE LOS G","SAN NICOLAS DE LOS GARZA")
colaboradores$municipio <- replace(colaboradores$municipio,colaboradores$municipio=="CAÑADA BLANCA","GUADALUPE")
Estado
En estado hay que estandarizar los registros, por
ejemplo, cambiar “Nuevo León” por “NUEVO LEON”.
colaboradores$estado <- replace(colaboradores$estado,colaboradores$estado=="Nuevo León","NUEVO LEON")
colaboradores$estado <- replace(colaboradores$estado,colaboradores$estado=="GUADALUPE N.L.","NUEVO LEON")
colaboradores$estado <- toupper(colaboradores$estado)
unique(colaboradores$estado)
## [1] "NUEVO LEÓN" "COAHUILA" "NUEVO LEON"
Estado Civil
Para estado civil también hay que estandarizar los
registros.
unique(colaboradores$estado_civil)
## [1] "Soltero" "Casado" "Unión libre" "Union Libre" "CASADA"
## [6] "UNION LIBRE" "CASADO" "SOLTERA" "DIVORCIADO" "SOLTERO"
## [11] "DIVORCIADA"
colaboradores$estado_civil <- toupper(colaboradores$estado_civil)
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="UNIóN LIBRE","UNION LIBRE")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="SOLTERO","SOLTERO(A)")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="CASADO","CASADO(A)")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="CASADA","CASADO(A)")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="SOLTERA","SOLTERO(A)")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="DIVORCIADA","DIVORCIADO(A)")
colaboradores$estado_civil <- replace(colaboradores$estado_civil,colaboradores$estado_civil=="DIVORCIADO","DIVORCIADO(A)")
La base de datos Merma tiene 3 variables y 50 registros.
describe(merma)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max range skew
## fecha 1 50 NaN NA NA NaN NA Inf -Inf -Inf NA
## mes* 2 50 4.60 2.60 4 4.53 2.97 1 9 8 0.21
## kilos 3 50 3708.52 1023.99 3925 3798.65 541.15 790 6140 5350 -0.94
## kurtosis se
## fecha NA NA
## mes* -1.35 0.37
## kilos 1.65 144.81
dim(merma)
## [1] 50 3
La base de datos Scrap tiene 5 variables y 250 registros.
describe(scrap)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max range skew
## referencia* 1 250 125.50 72.31 125.5 125.50 92.66 1 250 249 0.00
## fecha 2 250 NaN NA NA NaN NA Inf -Inf -Inf NA
## producto* 3 250 44.38 24.72 45.0 44.12 25.95 1 95 94 0.01
## cantidad 4 250 6.69 11.85 2.0 3.88 1.48 0 96 96 4.12
## ubi_origen* 5 250 2.48 0.85 3.0 2.60 0.00 1 3 2 -1.10
## kurtosis se
## referencia* -1.21 4.57
## fecha NA NA
## producto* -0.79 1.56
## cantidad 21.13 0.75
## ubi_origen* -0.70 0.05
dim(scrap)
## [1] 250 5
La base de datos Producción de Carton tiene 11 variables y 1486 registros.
describe(carton)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max
## fecha 1 1486 NaN NA NA NaN NA Inf -Inf
## cliente* 2 1486 6.03 2.39 6.0 5.95 1.48 1 11
## piezas_prog 3 1486 169.96 127.90 184.0 153.67 124.54 1 1500
## tmo_min 4 1477 22.39 13.78 20.0 20.03 7.41 10 120
## hr_fin 5 1469 32241.73 11925.66 36000.0 33834.65 6226.92 3600 46500
## lam_procesadas 6 1486 153.70 141.65 105.5 131.81 130.47 1 1262
## inicio_sep_up 7 1486 30172.53 12770.81 34200.0 31263.53 10007.55 2280 46560
## fin_sep_up 8 1486 30107.00 13005.13 34380.0 31125.18 10585.76 3600 69300
## inicio_proceso 9 1486 29999.27 13061.85 34350.0 31016.22 10585.76 2100 57840
## fin_proceso 10 1486 29503.16 13563.70 34800.0 30462.55 11653.24 2100 57360
## tiempo_calidad 11 1431 1.29 1.50 1.0 1.00 0.00 0 25
## range skew kurtosis se
## fecha -Inf NA NA NA
## cliente* 10 0.34 0.48 0.06
## piezas_prog 1499 1.97 9.97 3.32
## tmo_min 110 2.68 11.01 0.36
## hr_fin 42900 -1.18 0.08 311.15
## lam_procesadas 1261 2.24 9.66 3.67
## inicio_sep_up 44280 -0.75 -0.85 331.29
## fin_sep_up 65700 -0.68 -0.91 337.37
## inicio_proceso 55740 -0.68 -0.97 338.84
## fin_proceso 55260 -0.59 -1.17 351.86
## tiempo_calidad 25 9.21 107.84 0.04
dim(carton)
## [1] 1486 11
La base de datos Delivery Performance tiene 7 variables y 800 registros.
describe(perf)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max range skew
## cliente* 1 800 1.12 0.32 1 1.02 0.00 1.00 2.0 1.00 2.35
## vueltas 2 800 1.91 0.83 2 1.89 1.48 1.00 3.0 2.00 0.16
## fecha 3 800 NaN NA NA NaN NA Inf -Inf -Inf NA
## plan_arrival 4 800 18.10 5.18 20 19.62 0.00 4.00 20.0 16.00 -2.35
## real_arrival 5 800 7.82 1.65 8 8.12 0.30 1.00 11.5 10.50 -1.63
## real_departure 6 800 8.85 1.63 9 9.11 0.84 0.05 12.5 12.45 -1.72
## diference 7 800 1.02 0.84 1 1.02 0.04 -14.35 4.4 18.75 -12.19
## kurtosis se
## cliente* 3.54 0.01
## vueltas -1.53 0.03
## fecha NA NA
## plan_arrival 3.54 0.18
## real_arrival 2.48 0.06
## real_departure 3.89 0.06
## diference 214.85 0.03
dim(perf)
## [1] 800 7
La base de datos Delivery Plan tiene 5 variables y 972 registros.
describe(plan)
## vars n mean sd median trimmed mad min max range skew
## cliente* 1 972 17.71 6.87 21.0 18.52 2.97 1 26 25 -1.15
## proyecto* 2 972 46.04 26.24 58.0 46.51 14.83 1 103 102 -0.47
## item* 3 972 100.68 54.76 108.0 101.17 59.30 1 201 200 -0.20
## mes* 4 972 10.05 5.66 10.0 10.01 5.93 1 20 19 -0.03
## unidades 5 972 548.07 2016.47 90.5 176.34 116.38 1 29379 29378 8.56
## kurtosis se
## cliente* -0.19 0.22
## proyecto* -0.49 0.84
## item* -1.12 1.76
## mes* -1.10 0.18
## unidades 89.82 64.68
dim(plan)
## [1] 972 5
La base de datos Bajas tiene 15 variables y 238 registros.
describe(bajas)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min max
## nombre_completo* 1 238 117.54 67.76 116.50 117.43 86.73 1.00 235
## fecha_nac 2 237 NaN NA NA NaN NA Inf -Inf
## genero* 3 238 1.41 0.49 1.00 1.39 0.00 1.00 2
## fecha_alta 4 237 NaN NA NA NaN NA Inf -Inf
## mot_baja* 5 213 2.50 1.28 2.00 2.46 1.48 1.00 5
## permanencia 6 213 79.71 224.98 19.00 31.18 19.27 0.00 1966
## baja* 7 238 46.84 28.59 49.00 47.07 35.58 1.00 96
## puesto* 8 238 6.03 4.93 4.00 4.66 0.00 1.00 22
## departamento* 9 238 10.11 8.11 9.00 9.97 11.86 1.00 21
## sal_diario_imss 10 238 177.99 23.16 180.68 179.16 0.00 144.45 500
## colonia* 11 238 58.43 27.09 73.00 60.30 25.20 1.00 99
## CP* 12 238 26.08 8.66 26.00 26.52 2.97 1.00 48
## municipio* 13 238 3.82 2.74 2.00 3.41 0.00 1.00 12
## estado* 14 238 3.00 0.27 3.00 3.00 0.00 1.00 4
## estado_civil* 15 238 3.67 1.17 4.00 3.72 1.48 1.00 6
## range skew kurtosis se
## nombre_completo* 234.00 0.01 -1.21 4.39
## fecha_nac -Inf NA NA NA
## genero* 1.00 0.36 -1.88 0.03
## fecha_alta -Inf NA NA NA
## mot_baja* 4.00 0.33 -1.39 0.09
## permanencia 1966.00 5.65 35.86 15.42
## baja* 95.00 -0.04 -1.24 1.85
## puesto* 21.00 2.33 4.09 0.32
## departamento* 20.00 0.08 -1.72 0.53
## sal_diario_imss 355.55 11.09 154.20 1.50
## colonia* 98.00 -0.63 -0.88 1.76
## CP* 47.00 -0.52 1.75 0.56
## municipio* 11.00 1.06 -0.37 0.18
## estado* 3.00 -2.45 30.65 0.02
## estado_civil* 5.00 -0.53 -1.04 0.08
dim(bajas)
## [1] 238 15
La base de datos Colaboradores tiene 12 variables y 113 registros.
describe(colaboradores)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
## vars n mean sd median trimmed mad min
## nombre_completo* 1 113 57.00 32.76 57.00 57.00 41.51 1.00
## fecha_nac 2 112 NaN NA NA NaN NA Inf
## genero* 3 113 1.46 0.50 1.00 1.45 0.00 1.00
## fecha_alta 4 112 NaN NA NA NaN NA Inf
## puesto* 5 113 4.88 6.71 1.00 3.46 0.00 1.00
## departamento* 6 113 7.73 6.53 7.00 7.25 8.90 1.00
## sal_diario_imss 7 113 180.25 28.60 180.68 176.77 0.00 144.45
## colonia* 8 113 39.42 19.75 47.00 40.07 19.27 1.00
## municipio* 9 113 2.58 2.39 1.00 2.14 0.00 1.00
## estado* 10 113 2.17 0.55 2.00 2.19 0.00 1.00
## CP 11 113 63364.74 11201.89 66646.00 66622.84 4.45 25016.00
## estado_civil* 12 113 2.38 1.19 3.00 2.34 1.48 1.00
## max range skew kurtosis se
## nombre_completo* 113.00 112.0 0.00 -1.23 3.08
## fecha_nac -Inf -Inf NA NA NA
## genero* 2.00 1.0 0.16 -1.99 0.05
## fecha_alta -Inf -Inf NA NA NA
## puesto* 22.00 21.0 1.53 0.74 0.63
## departamento* 19.00 18.0 0.36 -1.47 0.61
## sal_diario_imss 337.05 192.6 3.45 15.39 2.69
## colonia* 73.00 72.0 -0.38 -0.99 1.86
## municipio* 9.00 8.0 1.19 0.02 0.22
## estado* 3.00 2.0 0.08 -0.06 0.05
## CP 67493.00 42477.0 -3.06 7.42 1053.79
## estado_civil* 5.00 4.0 -0.03 -1.48 0.11
dim(colaboradores)
## [1] 113 12
Merma
Variable<-c("Fecha","Mes","Kilos")
Tipo<-c("Qualitative (nominal)", "Qualitative (nominal)", "Quantitative (discrete)")
Escala <- c("Fecha (y/m/d)","N/A", "Kilogramos")
table<-data.frame(Variable,Tipo,Escala)
knitr::kable(table)
| Variable | Tipo | Escala |
|---|---|---|
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Mes | Qualitative (nominal) | N/A |
| Kilos | Quantitative (discrete) | Kilogramos |
Scrap
Variable2<-c("Referencia","Fecha","Producto","Cantidad", "Ubicación de origen")
Tipo2<-c("Qualitative (nominal)", "Qualitative (nominal)", "Qualitative (nominal)","Quantitative (discrete)", "Qualitative (nominal)")
Escala2 <- c("N/A","Fecha (y/m/d)", "N/A","Unidades","N/A")
table2<-data.frame(Variable2,Tipo2,Escala2)
knitr::kable(table2)
| Variable2 | Tipo2 | Escala2 |
|---|---|---|
| Referencia | Qualitative (nominal) | N/A |
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Producto | Qualitative (nominal) | N/A |
| Cantidad | Quantitative (discrete) | Unidades |
| Ubicación de origen | Qualitative (nominal) | N/A |
Producción de Carton
Variable3<-c("Fecha","Cliente","Piezas programadas", "Tiempo minutos", "Hora fin", "Laminas procesadas", "Inicio sep up", "Fin inicio sep up", "Inicio de proceso", "Fin de proceso", "Tiempo calidad")
Tipo3<-c("Qualitative (nominal)","Qualitative (nominal)","Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (discrete)","Quantitative (discrete)" )
Escala3 <- c("Fecha (y/m/d)","N/A","Piezas (unidades) ","Tiempo (M)","Tiempo (H:M)","Laminas (unidades)","Tiempo (H:M)","Tiempo (H:M)","Tiempo (H:M)","Tiempo (H:M)","Tiempo (M)")
table3<-data.frame(Variable3,Tipo3,Escala3)
knitr::kable(table3)
| Variable3 | Tipo3 | Escala3 |
|---|---|---|
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Cliente | Qualitative (nominal) | N/A |
| Piezas programadas | Quantitative (discrete) | Piezas (unidades) |
| Tiempo minutos | Quantitative (discrete) | Tiempo (M) |
| Hora fin | Quantitative (discrete) | Tiempo (H:M) |
| Laminas procesadas | Quantitative (discrete) | Laminas (unidades) |
| Inicio sep up | Quantitative (discrete) | Tiempo (H:M) |
| Fin inicio sep up | Quantitative (discrete) | Tiempo (H:M) |
| Inicio de proceso | Quantitative (discrete) | Tiempo (H:M) |
| Fin de proceso | Quantitative (discrete) | Tiempo (H:M) |
| Tiempo calidad | Quantitative (discrete) | Tiempo (M) |
Delivery Performance
Variable4<-c("Cliente","Vuelta","Fecha", "Plan Arrival", "Real Arrival", "Real Departure", "Difference")
Tipo4<-c("Qualitative (nominal)","Qualitative (nominal)","Quantitative (discrete)", "Quantitative (discrete)", "Quantitative (continuous)", "Quantitative (continuous)", "Quantitative (continuous)")
Escala4 <- c("N/A","Vueltas","Fecha (y/m/d)","Tiempo (H)","Tiempo (H:M)","Tiempo (H:M)","Tiempo (H:M)")
table4<-data.frame(Variable4,Tipo4,Escala4)
knitr::kable(table4)
| Variable4 | Tipo4 | Escala4 |
|---|---|---|
| Cliente | Qualitative (nominal) | N/A |
| Vuelta | Qualitative (nominal) | Vueltas |
| Fecha | Quantitative (discrete) | Fecha (y/m/d) |
| Plan Arrival | Quantitative (discrete) | Tiempo (H) |
| Real Arrival | Quantitative (continuous) | Tiempo (H:M) |
| Real Departure | Quantitative (continuous) | Tiempo (H:M) |
| Difference | Quantitative (continuous) | Tiempo (H:M) |
Delivery Plan
Variable5<-c("Cliente","Proyecto", "Item", "Mes","Unidades")
Tipo5<-c("Cualitative (nominal)", "Cualitative (nominal)", "Cualitative (nominal)", "Quantiative (discrete)", "Quantiative (discrete)")
Escala5 <- c("N/A","N/A","N/A","Tiempo (Y/M)","Unidades")
table5<-data.frame(Variable5,Tipo5,Escala5)
knitr::kable(table)
| Variable | Tipo | Escala |
|---|---|---|
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Mes | Qualitative (nominal) | N/A |
| Kilos | Quantitative (discrete) | Kilogramos |
Bajas
Variable6<-c("Nombre Completo","Fecha Nacimiento", "Genero", "Fecha Alta","Motivo Renuncia","Permanencia","Fecha de Baja","Puesto","Departamento","Salario Diario IMSS","Colonia","CP","Municipio","Estado","Estado Civil")
Tipo6<-c("Cualitative (nominal)","Quantiative (discrete)", "Cualitative (nominal)", "Quantiative (discrete)","Cualitative (nominal)","Quantiative (discrete)","Quantiative (discrete)","Cualitative (nominal)","Cualitative (nominal)","Quantiative (continuous)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)")
Escala6<-c("N/A","Fecha (Y/M/D)", "N/A", "Fecha (Y/M/D)","N/A","Dias","Fecha (Y/M/D)","N/A","N/A","Pesos Mexicanos","N/A","N/A","N/A","N/A","N/A")
table6<-data.frame(Variable6,Tipo6,Escala6)
knitr::kable(table)
| Variable | Tipo | Escala |
|---|---|---|
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Mes | Qualitative (nominal) | N/A |
| Kilos | Quantitative (discrete) | Kilogramos |
Colaboradores
Variable7<-c("Nombre Completo","Fecha Nacimiento", "Genero", "Fecha Alta","Puesto","Departamento","Salario Diario IMSS","Colonia","Municipio","Estado","CP","Estado Civil")
Tipo7<-c("Cualitative (nominal)","Quantiative (discrete)", "Cualitative (nominal)", "Quantiative (discrete)","Cualitative (nominal)","Cualitative (nominal)","Quantiative (continuous)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)","Cualitative (nominal)")
Escala7<-c("N/A","Fecha (Y/M/D)", "N/A", "Fecha (Y/M/D)","N/A","N/A","Pesos Mexicanos","N/A","N/A","N/A","CP","N/A")
table7<-data.frame(Variable7,Tipo7,Escala7)
knitr::kable(table)
| Variable | Tipo | Escala |
|---|---|---|
| Fecha | Qualitative (nominal) | Fecha (y/m/d) |
| Mes | Qualitative (nominal) | N/A |
| Kilos | Quantitative (discrete) | Kilogramos |
mes <- merma %>% group_by(mes) %>% tally()
mes
## # A tibble: 9 × 2
## mes n
## <chr> <int>
## 1 ABRIL 5
## 2 AGOSTO 11
## 3 ENERO 4
## 4 FEBRERO 6
## 5 JULIO 5
## 6 JUNIO 4
## 7 MARZO 6
## 8 MAYO 5
## 9 SEPTIEMBRE 4
Agosto es el mes en donde la empresa produce mayor merma, con esto podemos inferir que agosto es el mes con mayor producción en la empresa. De la misma manera, podemos inferir que en los meses de enero, junio y septiembre es donde la empresa tiene menor demanda, ya que son los meses en donde la empresa produce menos merma.
ggplot(merma, aes(x = mes, y = kilos)) +
geom_boxplot(color="red",fill="orange",alpha=0.2)
ubicacion_origen <- scrap %>% group_by(ubi_origen) %>% tally()
ubicacion_origen
## # A tibble: 3 × 2
## ubi_origen n
## <chr> <int>
## 1 SAB/Calidad/Entrega de PT 58
## 2 SAB/Post-Production 13
## 3 SAB/Pre-Production 179
Esta tabla nos muestra los desechos y/o residuos derivados del proceso en las diferentes areas de trabajo. Como podemos observar en pre-producción es el lugar donde mas se generan estos residuos.
ggplot(scrap, aes(x = ubi_origen, y = cantidad)) +
geom_boxplot(color="red",fill="orange",alpha=0.2)
cliente <- carton %>% group_by(cliente) %>% tally()
cliente
## # A tibble: 11 × 2
## cliente n
## <chr> <int>
## 1 DENSO 92
## 2 HANON SYSTEMS 8
## 3 HELLA 45
## 4 MERIDIAN LIGHTWEIGHT 47
## 5 STABILUS 1 549
## 6 STABILUS 3 244
## 7 TRMX 180
## 8 VARROC 154
## 9 VL-017-13939 3
## 10 VL-017-14086 1
## 11 YANFENG 163
Los clientes con mayor demanda son:
- Stabilus 1
- Stabilus 3
- TRMX
- VARROC
- DENSO
ggplot(carton, aes(x = cliente, y = piezas_prog)) +
geom_boxplot(color="red",fill="orange",alpha=0.2)+theme(axis.text.x = element_text(angle=90, hjust=1))
Hacer que la empresa FORM utilice la metodologia de Business Analytics, ayudara a la empresa a analizar la situación actual en la que se encuntran y por ende predecir eventos, tendencias y comportamientos a futuro que ayuden a determinar la toma de decisiones, reduciendo los riesgos de equivocaciones futuras.
La segunda propuesta va encaminada a indicadores de calidad, los cual permite a la emprsa visualizar y medir los cambios y progresos que está haciendo hacia el logro de un resultado específico. En este caso buscamos reducir la merma por lo que algunos de los indicadores que pueden utilizar son:
Defectos por unidad
Este indicador nos da el número de defectos que hay en una muestra sobre
el número de unidades que se tomaron en la muestra.
DPU = # numero de defectos / tamaño de muestra
Defectos por oportunidad
Es el número de defectos que hay en una muestra sobre la cantidad de
oportunidades, tomándose las oportunidades como los posibles defectos
que puede tener cada unidad.
DPO = # numero de defectos / # de oportunidades
Defecto por millon de opotunidades
En este se toma el número de defectos en una muestra dividido entre el
número total de oportunidades y multiplicado por 1,000,000, esto ayuda a
estandarizar el nivel de oportunidad y además permite comparar con otros
processo.
DPO = (# numero de defectos / # de oportunidades) x
1,000,000
Esto nos ayudara a evalar la rentabilidad de los procesos que se llevan a cabo.
Importar Base de Datos
reg <- read.csv("/Users/anita3/Downloads/registrations.csv")
car_prod <- read.csv("/Users/anita3/Downloads/car_production.csv")
ggplot(data=car_prod, aes(x=year, y=us_car_production), color='orange') +
geom_line() +
labs(x="Año", y="Produccion")
En esta grafica podemos observar que la producción de los carros en EUA
disminuye, esto puede ser a casusa de la insuficiencia de
semiconductores en el mercado, la cual es una pieza escencial para su
producción. Ademas de la escasez de chips que tienen las empresas
tecnológicas que fabrican desde electrodomésticos, computadores y
celulares hasta consolas de videojuegos.
ggplot(data=car_prod, aes(x=year, y=retail_price_gasoline), color='red') +
geom_line() +
labs(x="Año", y="Precio de Gasolina")
Una de las causas del incremento de gasolina se debe a la fuerza que ha
tomado el dólar frente a otras monedas, por lo que productores prefieren
recibir más divisas en otros países.
ggplot(data=car_prod, aes(x=year, y=poblacion), color='red') +
geom_line() +
labs(x="Año", y="Población Desocupada")
Esta grafica corresponde a la población desocupada, es decir, las
personas cesantes que son desocupados que han tenido un trabajo
previamente como las que buscan trabajo por primera vez, con respecto a
la población económicamente activa.
No se puede realizar la tabla de freciencia debido a que la naturaleza de los datos no nos lo permite. (No se cuentan con datos repetitivos)
ggplot(data=car_prod, aes(x=year, y=poblacion), color='orange') +
geom_point() +
labs(x="Año", y="Poblacion")
ggplot(data=car_prod, aes(x=year, y=retail_price_gasoline), color='orange') +
geom_point() +
labs(x="Año", y="Precio de Gasolina")
write.csv(bajas,file = "bajas_limpia.csv", row.names = FALSE)
write.csv(colaboradores,file = "colaboradores_limpia.csv", row.names = FALSE)
write.csv(perf, file= "del_perf_limpia.csv", row.names = FALSE)
write.csv(plan,file = "plan_limpia.csv", row.names = FALSE)
write.csv(merma,file = "merma_limpia.csv", row.names = FALSE)
write.csv(scrap,file = "scrap_limpia.csv", row.names = FALSE)
write.csv(carton,file = "carton_limpia.csv", row.names = FALSE)