La empresa Form, fundada en el 2011, es una empresa familiar mexicana enfocada en la manufactura de empaques para la industria automotriz. Esta PyMe, liderada por Felipe Flores García, ha logrado crecer durante estos 11 años, y emplear a 130 personas. Form se dedica a desarrollar soluciones de empaque que generen valor agregado en la cadena de suministro de sus clientes, considerando la protección y las necesidades productivas, operativas y de almacenaje. También, consideran de suma importancia tener al ser humano como el centro de todos sus procesos. Debido a que la industria automotriz trabaja y crece constantemente, las empresas no se pueden permitir dejar pasar cualquier oportunidad para demostrar su eficiencia al ser productivos y rentables. Form ofrece esta oportunidad, la oportunidad de generar ahorros, ser más eficientes, productivos y rentables mediante el uso adecuado y efectivo del empaque, desde su inventario y su espacio mínimo en almacén, hasta su gran calidad de diseño y manipulación.
Con poco más de 100 años, la industria automotríz se ha posicionado como una de las ramas de mayor importancia tanto para el cliente final como para aquellos involucrados en que se mantenga a la vaguardia. Comparado con un dispositivo como la computadora o el teléfono celular, un auto puede parecer primitivo pero el ingenio que hay detras de cada parte y cada movimiento es interminable. Sobre todo en las últimas décadas, México se ha posicionado como clave para la manufactura como para la innovación por lo que esta rama de la economía no puede pasar desapercibida. Con ayuda de las herramientas para almacenar datos, se ha vuelto clave para el crecimiento poder interpretar estos datos de la manera apropiada que es el enfoque al que se espera llegar.
Sección 1
Limpieza de bases de datos
Comprensión de las bases de datos
Análisis estadístico descriptivo
Propuestas
Bases de datos externas
Sección 2
Análisis exploratorio de las bases de datos
Predicción del desempeño de la industria automotriz
Sección 3
Sección 4
Identificación de Resultados Relevantes y Sugerencias
Definiciones
Key Performance Indicators (KPIs)
Referencias
Empezamos con “colaboradores”.
Se importa la base de datos y se entienden las variables.
colab<-read.csv("/Users/elenavela/Downloads/colabbb.csv")
summary(colab)## No..De.Empleado APELLIDOS NOMBRE AÑO.DE.NACIMIENTO
## Min. : 1.00 Length:111 Length:111 Min. :1955
## 1st Qu.: 25.25 Class :character Class :character 1st Qu.:1978
## Median : 49.50 Mode :character Mode :character Median :1989
## Mean : 57.79 Mean :1987
## 3rd Qu.: 84.00 3rd Qu.:1997
## Max. :148.00 Max. :2022
## NA's :21 NA's :3
## GENERO RFC FECHA.DE.ALTA Primer.mes
## Length:111 Length:111 Min. :2010 Min. :2010
## Class :character Class :character 1st Qu.:2020 1st Qu.:2021
## Mode :character Mode :character Median :2022 Median :2022
## Mean :2021 Mean :2021
## 3rd Qu.:2022 3rd Qu.:2022
## Max. :2022 Max. :2022
## NA's :1 NA's :3
## X4to.mes BAJA PUESTO DEPARTAMENTO
## Min. :1905 Min. :3 Length:111 Length:111
## 1st Qu.:2021 1st Qu.:3 Class :character Class :character
## Median :2022 Median :3 Mode :character Mode :character
## Mean :2020 Mean :3
## 3rd Qu.:2022 3rd Qu.:3
## Max. :2022 Max. :3
## NA's :3 NA's :98
## NO.SEGURO.SOCIAL SALARIO.DIARIO.IMSS FACTOR.CRED.INFONAVIT
## Length:111 Min. :144.4 Length:111
## Class :character 1st Qu.:176.7 Class :character
## Mode :character Median :180.7 Mode :character
## Mean :179.1
## 3rd Qu.:180.7
## Max. :337.1
##
## N...CREDITO.INFONAVIT LUGAR.DE.NACIMIENTO CURP
## Length:111 Length:111 Length:111
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## CALLE NUMERO.INTERNO COLONIA MUNICIPIO
## Length:111 Length:111 Length:111 Length:111
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## ESTADO CODIGO.POSTAL ESTADO.CIVIL TARJETA....CUENTA
## Length:111 Min. :25016 Length:111 Length:111
## Class :character 1st Qu.:66642 Class :character Class :character
## Mode :character Median :66646 Mode :character Mode :character
## Mean :63300
## 3rd Qu.:66649
## Max. :67493
##
Técnica 3, ERRORES TIPOGRÁFICOS Y ERRORES
SIMILARES
Primeramente, se notó que en el excel algunas fechas estaban con formato
día/mes/año y otros mes/día/año. Por lo que para tener la información
más real y precisa posible, se extrajeron solo los AÑOS
para el análisis.
Técnica 1, REMOVER DATOS IRRELEVANTES
Existen muchas variables en la base de datos, y muchas de estas
contienen datos personales de los colaboradores, por lo que es
información muy sensible y que no aporta mucho insight al
análisis. Por lo tanto, se ha escogido la técnica de remover datos
irrelevantes a la información personal de los empleados que no sirvan
mucho para el análisis, como lo es su nombre, apellido, RFC, CURP. Sin
embargo, otros datos personales se han mantenido para hacer un análisis
de diversidad e inclusión (género, año de nacimiento, estado civil).
Se eliminan las columnas que no aportan mucho al análisis de datos.
colab2<-colab
colab2<-subset(colab2,select=-c(No..De.Empleado,TARJETA....CUENTA,CODIGO.POSTAL,COLONIA,NUMERO.INTERNO,CALLE,CURP,FACTOR.CRED.INFONAVIT,NO.SEGURO.SOCIAL,RFC,APELLIDOS,NOMBRE,N...CREDITO.INFONAVIT,X4to.mes,Primer.mes))
summary(colab2)## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA BAJA
## Min. :1955 Length:111 Min. :2010 Min. :3
## 1st Qu.:1978 Class :character 1st Qu.:2020 1st Qu.:3
## Median :1989 Mode :character Median :2022 Median :3
## Mean :1987 Mean :2021 Mean :3
## 3rd Qu.:1997 3rd Qu.:2022 3rd Qu.:3
## Max. :2022 Max. :2022 Max. :3
## NA's :3 NA's :1 NA's :98
## PUESTO DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO
## Length:111 Length:111 Min. :144.4 Length:111
## Class :character Class :character 1st Qu.:176.7 Class :character
## Mode :character Mode :character Median :180.7 Mode :character
## Mean :179.1
## 3rd Qu.:180.7
## Max. :337.1
##
## MUNICIPIO ESTADO ESTADO.CIVIL
## Length:111 Length:111 Length:111
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
Técnica 5, VALORES FALTANTES
Con un rápido vistazo de la base de datos, se podía observar que
faltaban ciertos valores en las diferentes variables. Si faltaban muchos
datos en una sola variable, se optó por eliminar la columna,
mientras que en otros casos donde haya pocos por variables sólo se
eliminaron los registros.
¿Cuántos NA tengo por variable?
sapply(colab2,function(x) sum(is.na(x)))## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA BAJA
## 3 0 1 98
## PUESTO DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO
## 0 0 0 0
## MUNICIPIO ESTADO ESTADO.CIVIL
## 0 0 0
Se observan muchos NAs en la columna “BAJA”, por lo que se elimina en su totalidad esta variable (columna).
colab3<-colab2
colab3<-subset(colab2,select=-c(BAJA))
summary(colab3)## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA PUESTO
## Min. :1955 Length:111 Min. :2010 Length:111
## 1st Qu.:1978 Class :character 1st Qu.:2020 Class :character
## Median :1989 Mode :character Median :2022 Mode :character
## Mean :1987 Mean :2021
## 3rd Qu.:1997 3rd Qu.:2022
## Max. :2022 Max. :2022
## NA's :3 NA's :1
## DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO MUNICIPIO
## Length:111 Min. :144.4 Length:111 Length:111
## 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
##
## ESTADO ESTADO.CIVIL
## Length:111 Length:111
## Class :character Class :character
## Mode :character Mode :character
##
##
##
##
Se vuelve a ver lo de NAs
¿Cuántos NA tengo por variable?
sapply(colab3,function(x) sum(is.na(x)))## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA PUESTO
## 3 0 1 0
## DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO MUNICIPIO
## 0 0 0 0
## ESTADO ESTADO.CIVIL
## 0 0
Eliminar renglones de NAs
colab4<-colab3
colab4<-na.omit(colab4)
summary(colab4)## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA PUESTO
## Min. :1955 Length:107 Min. :2010 Length:107
## 1st Qu.:1978 Class :character 1st Qu.:2020 Class :character
## Median :1989 Mode :character Median :2022 Mode :character
## Mean :1987 Mean :2021
## 3rd Qu.:1997 3rd Qu.:2022
## Max. :2022 Max. :2022
## DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO MUNICIPIO
## Length:107 Min. :144.4 Length:107 Length:107
## 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
## ESTADO ESTADO.CIVIL
## Length:107 Length:107
## Class :character Class :character
## Mode :character Mode :character
##
##
##
sapply(colab4,function(x) sum(is.na(x)))## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA PUESTO
## 0 0 0 0
## DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO MUNICIPIO
## 0 0 0 0
## ESTADO ESTADO.CIVIL
## 0 0
Eliminar error de fecha de nacimiento (existen datos que muestran que alguien nació en el 2022). Se mantienen solo a los colaboradores que nacieron antes del 2004, los mayores de edad.
colab5<-colab4
colab5<-colab5[colab5$AÑO.DE.NACIMIENTO<2004,]
summary(colab5)## AÑO.DE.NACIMIENTO GENERO FECHA.DE.ALTA PUESTO
## Min. :1955 Length:105 Min. :2010 Length:105
## 1st Qu.:1978 Class :character 1st Qu.:2020 Class :character
## Median :1989 Mode :character Median :2022 Mode :character
## Mean :1987 Mean :2021
## 3rd Qu.:1996 3rd Qu.:2022
## Max. :2003 Max. :2022
## DEPARTAMENTO SALARIO.DIARIO.IMSS LUGAR.DE.NACIMIENTO MUNICIPIO
## Length:105 Min. :144.4 Length:105 Length:105
## 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
## ESTADO ESTADO.CIVIL
## Length:105 Length:105
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Se importa (de nuevo) la base de datos, debido a que se hicieron cambios en el excel: se calculó la edad, en vez de tener el año de nacimiento.
colab6<-read.csv("/Users/elenavela/Desktop/wal/rlimpia.csv")
summary(colab6)## EDAD GENERO FECHA.DE.ALTA Primer.mes
## Min. :19.00 Length:104 Min. :2010 Min. :2010
## 1st Qu.:25.75 Class :character 1st Qu.:2021 1st Qu.:2020
## Median :33.00 Mode :character Median :2022 Median :2022
## Mean :35.48 Mean :2021 Mean :2021
## 3rd Qu.:44.25 3rd Qu.:2022 3rd Qu.:2022
## Max. :67.00 Max. :2022 Max. :2022
## X4to.mes PUESTO DEPARTAMENTO SALARIO.DIARIO.IMSS
## Min. :2010 Length:104 Length:104 Min. :144.4
## 1st Qu.:2021 Class :character Class :character 1st Qu.:176.7
## Median :2022 Mode :character Mode :character Median :180.7
## Mean :2021 Mean :179.3
## 3rd Qu.:2022 3rd Qu.:180.7
## Max. :2022 Max. :337.1
## LUGAR.DE.NACIMIENTO MUNICIPIO ESTADO ESTADO.CIVIL
## Length:104 Length:104 Length:104 Length:104
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Empleado
## Length:104
## Class :character
## Mode :character
##
##
##
Se vuelve a analizar, se eliminan columnas (o variables) que no se consideran relevantes para el análisis de datos.
colab7<-colab6
colab7<-subset(colab6,select=-c(Primer.mes,X4to.mes,DEPARTAMENTO,Empleado))Se cambian los nombres de columnas con el fin de facilitar el análisis que será llevado a continuación.
str(colab7)## 'data.frame': 104 obs. of 9 variables:
## $ EDAD : int 32 38 38 37 38 60 56 46 59 43 ...
## $ GENERO : chr "FEMENINO" "MASCULINO" "FEMENINO" "MASCULINO" ...
## $ FECHA.DE.ALTA : int 2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
## $ PUESTO : chr "SUPERVISORA" "MANTENIMIENTO" "COSTURERA" "AYUDANTE GENERAL" ...
## $ SALARIO.DIARIO.IMSS: num 337 280 260 241 241 ...
## $ LUGAR.DE.NACIMIENTO: chr "" "" "" "" ...
## $ MUNICIPIO : chr "APODACA" "APODACA" "APODACA" "APODACA" ...
## $ ESTADO : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ ESTADO.CIVIL : chr "Casado" "Soltero" "Casado" "Casado" ...
names (colab7) = c("edad", "genero", "alta", "puesto", "salario_diario", "lugar.nacim.","mpio","estado","civil")
names (colab7)## [1] "edad" "genero" "alta" "puesto"
## [5] "salario_diario" "lugar.nacim." "mpio" "estado"
## [9] "civil"
str(colab7)## 'data.frame': 104 obs. of 9 variables:
## $ edad : int 32 38 38 37 38 60 56 46 59 43 ...
## $ genero : chr "FEMENINO" "MASCULINO" "FEMENINO" "MASCULINO" ...
## $ alta : int 2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
## $ puesto : chr "SUPERVISORA" "MANTENIMIENTO" "COSTURERA" "AYUDANTE GENERAL" ...
## $ salario_diario: num 337 280 260 241 241 ...
## $ lugar.nacim. : chr "" "" "" "" ...
## $ mpio : chr "APODACA" "APODACA" "APODACA" "APODACA" ...
## $ estado : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ civil : chr "Casado" "Soltero" "Casado" "Casado" ...
EXPORTAR BASE DE DATOS
colab_bd <- colab7
write.csv(colab_bd, file ="colab_FORM_limpia.csv", row.names = FALSE)Seguimos con “bajas”
bajas<-read.csv("/Users/elenavela/Downloads/bajas.csv")
summary(bajas)## NOMBRE.COMPLETO EDAD GENERO FECHA.DE.ALTA
## Length:233 Min. :18.00 Length:233 Length:233
## Class :character 1st Qu.:23.00 Class :character Class :character
## Mode :character Median :29.00 Mode :character Mode :character
## Mean :30.77
## 3rd Qu.:37.00
## Max. :61.00
##
## MOTIVO.DE.BAJA DÍAS.DE.DURACIÓN BAJA PUESTO
## Length:233 Min. : 0.00 Length:233 Length:233
## Class :character 1st Qu.: 9.00 Class :character Class :character
## Mode :character Median : 20.50 Mode :character Mode :character
## Mean : 78.84
## 3rd Qu.: 48.25
## Max. :1966.00
## NA's :13
## SALARIO.DIARIO.IMSS ESTADO ESTADO.CIVIL
## Min. :144.4 Length:233 Length:233
## 1st Qu.:180.7 Class :character Class :character
## Median :180.7 Mode :character Mode :character
## Mean :177.9
## 3rd Qu.:180.7
## Max. :500.0
##
Técnica 4, CONVERTIR TIPO DE DATOS
Después de notar que ciertas variables cuantitativas no son leídas como tal, es necesario conventirlas de carácter a fecha o a entero, como corresponda.
Convertir de carácter a fecha
bajas2<-bajas
bajas2$FECHA.DE.ALTA<-as.Date(bajas2$FECHA.DE.ALTA,format="%d/%m/%Y")
str(bajas2)## 'data.frame': 233 obs. of 11 variables:
## $ NOMBRE.COMPLETO : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ EDAD : int 32 36 23 21 29 46 29 31 50 19 ...
## $ GENERO : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ FECHA.DE.ALTA : Date, format: "2020-03-09" "2021-11-09" ...
## $ MOTIVO.DE.BAJA : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ DÍAS.DE.DURACIÓN : int 628 60 59 59 51 37 37 31 18 224 ...
## $ BAJA : chr "27/11/21" "08/01/22" "08/01/22" "08/01/22" ...
## $ PUESTO : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ SALARIO.DIARIO.IMSS: num 500 152 152 152 152 ...
## $ ESTADO : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ ESTADO.CIVIL : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
Convertir de carácter a entero
bajas3<-bajas2
bajas3$EDAD<-as.integer(bajas3$EDAD)
str(bajas3)## 'data.frame': 233 obs. of 11 variables:
## $ NOMBRE.COMPLETO : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ EDAD : int 32 36 23 21 29 46 29 31 50 19 ...
## $ GENERO : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ FECHA.DE.ALTA : Date, format: "2020-03-09" "2021-11-09" ...
## $ MOTIVO.DE.BAJA : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ DÍAS.DE.DURACIÓN : int 628 60 59 59 51 37 37 31 18 224 ...
## $ BAJA : chr "27/11/21" "08/01/22" "08/01/22" "08/01/22" ...
## $ PUESTO : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ SALARIO.DIARIO.IMSS: num 500 152 152 152 152 ...
## $ ESTADO : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ ESTADO.CIVIL : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
Técnica 1, REMOVER DATOS IRRELEVANTES
Se nota que existe una columna que no aporta mucho al análisis, la fecha de baja, debido a que ya se tienen los días de duración de la persona. Se opta por remover este dato irrelevante.
Eliminar columnas
bajas4<-bajas3
bajas4<-subset(bajas4,select=-c(BAJA))
summary(bajas4)## NOMBRE.COMPLETO EDAD GENERO FECHA.DE.ALTA
## Length:233 Min. :18.00 Length:233 Min. :0016-10-12
## Class :character 1st Qu.:23.00 Class :character 1st Qu.:0022-02-18
## Mode :character Median :29.00 Mode :character Median :0022-05-18
## Mean :30.77 Mean :0339-09-15
## 3rd Qu.:37.00 3rd Qu.:0022-07-19
## Max. :61.00 Max. :2022-07-11
##
## MOTIVO.DE.BAJA DÍAS.DE.DURACIÓN PUESTO SALARIO.DIARIO.IMSS
## Length:233 Min. : 0.00 Length:233 Min. :144.4
## Class :character 1st Qu.: 9.00 Class :character 1st Qu.:180.7
## Mode :character Median : 20.50 Mode :character Median :180.7
## Mean : 78.84 Mean :177.9
## 3rd Qu.: 48.25 3rd Qu.:180.7
## Max. :1966.00 Max. :500.0
## NA's :13
## ESTADO ESTADO.CIVIL
## Length:233 Length:233
## Class :character Class :character
## Mode :character Mode :character
##
##
##
##
Técnica 5, VALORES FALTANTES
Para obtener un análisis más real, se identifican los valorees faltantes y se toma una decisión dependiendo de los resultados.
¿Cuántos NA tengo por variable?
sapply(bajas4,function(x) sum(is.na(x)))## NOMBRE.COMPLETO EDAD GENERO FECHA.DE.ALTA
## 0 0 0 0
## MOTIVO.DE.BAJA DÍAS.DE.DURACIÓN PUESTO SALARIO.DIARIO.IMSS
## 0 13 0 0
## ESTADO ESTADO.CIVIL
## 0 0
Debido a que 13 es un número importante en esta base de datos, se ha decidido NO borrar los registros; se opta por reemplazar NAs por su mediana.
bajas5<-bajas4
bajas5$DÍAS.DE.DURACIÓN[is.na(bajas5$DÍAS.DE.DURACIÓN)]<- median(bajas5$DÍAS.DE.DURACIÓN, na.rm=TRUE)¿Cuántos NA tengo por variable?
sapply(bajas5,function(x) sum(is.na(x)))## NOMBRE.COMPLETO EDAD GENERO FECHA.DE.ALTA
## 0 0 0 0
## MOTIVO.DE.BAJA DÍAS.DE.DURACIÓN PUESTO SALARIO.DIARIO.IMSS
## 0 0 0 0
## ESTADO ESTADO.CIVIL
## 0 0
Queda limpio.
Se cambian los nombres de las columnas por nombres más adecuados para el análisis:
str(bajas5)## 'data.frame': 233 obs. of 10 variables:
## $ NOMBRE.COMPLETO : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ EDAD : int 32 36 23 21 29 46 29 31 50 19 ...
## $ GENERO : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ FECHA.DE.ALTA : Date, format: "2020-03-09" "2021-11-09" ...
## $ MOTIVO.DE.BAJA : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ DÍAS.DE.DURACIÓN : num 628 60 59 59 51 37 37 31 18 224 ...
## $ PUESTO : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ SALARIO.DIARIO.IMSS: num 500 152 152 152 152 ...
## $ ESTADO : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ ESTADO.CIVIL : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
names (bajas5) = c("nombre", "edad", "genero", "alta", "motivo_baja", "duracion", "puesto","salario_diario","estado","civil")
names (bajas5)## [1] "nombre" "edad" "genero" "alta"
## [5] "motivo_baja" "duracion" "puesto" "salario_diario"
## [9] "estado" "civil"
str(bajas5)## 'data.frame': 233 obs. of 10 variables:
## $ nombre : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ genero : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ alta : Date, format: "2020-03-09" "2021-11-09" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ puesto : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ civil : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
Se elimina también la variable de “nombre” al resultar poco interesante para el análisis.
bajas6<-bajas5
bajas6<-subset(bajas6,select=-c(nombre))
str(bajas6)## 'data.frame': 233 obs. of 9 variables:
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ genero : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ alta : Date, format: "2020-03-09" "2021-11-09" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ puesto : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ civil : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
Cambiar “FEMENINO” por “F”, y “MASCULINO” por “M”. Se ha optado por hacer esto para tener la información más limpia en las gráficas.
colab7$genero[colab7$genero == "FEMENINO"] <- "F"
colab7$genero[colab7$genero == "MASCULINO"] <- "M"
str(colab7)## 'data.frame': 104 obs. of 9 variables:
## $ edad : int 32 38 38 37 38 60 56 46 59 43 ...
## $ genero : chr "F" "M" "F" "M" ...
## $ alta : int 2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
## $ puesto : chr "SUPERVISORA" "MANTENIMIENTO" "COSTURERA" "AYUDANTE GENERAL" ...
## $ salario_diario: num 337 280 260 241 241 ...
## $ lugar.nacim. : chr "" "" "" "" ...
## $ mpio : chr "APODACA" "APODACA" "APODACA" "APODACA" ...
## $ estado : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ civil : chr "Casado" "Soltero" "Casado" "Casado" ...
bajas6$genero[bajas6$genero == "FEMENINO"] <- "F"
bajas6$genero[bajas6$genero == "MASCULINO"] <- "M"
str(bajas6)## 'data.frame': 233 obs. of 9 variables:
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ genero : chr "M" "F" "F" "F" ...
## $ alta : Date, format: "2020-03-09" "2021-11-09" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ puesto : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ civil : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
EXPORTAR BASE DE DATOS
bajas_bd <- bajas6
write.csv(bajas_bd, file ="bajas_FORM_limpia.csv", row.names = FALSE)Se juntaron los datos y la limpia de la base de datos principal desde excel.
La fecha se encontraba en formato de EUA, se ha cambiado a México.
plan<-read.csv("/Users/elenavela/Downloads/DELIVERY PLAN bdf_Prueba (1).csv")
summary(plan)## ID_Fecha Fecha CLIENTE Pedidos
## Min. : 1.00 Length:228 Length:228 Min. : 0.0
## 1st Qu.: 3.75 Class :character Class :character 1st Qu.: 0.0
## Median : 6.50 Mode :character Mode :character Median : 0.0
## Mean : 6.50 Mean : 1703.1
## 3rd Qu.: 9.25 3rd Qu.: 233.8
## Max. :12.00 Max. :52779.0
Se cambian los nombres para tener un formato más limpio y volver el análisis mejor.
names (plan) = c("ID_fecha", "fecha", "cliente", "pedidos")
names (plan)## [1] "ID_fecha" "fecha" "cliente" "pedidos"
str(plan)## 'data.frame': 228 obs. of 4 variables:
## $ ID_fecha: int 1 1 1 1 1 1 1 1 1 1 ...
## $ fecha : chr "31/01/2022" "31/01/2022" "31/01/2022" "31/01/2022" ...
## $ cliente : chr "STB3" "STB 1" "YF RAMOS" "INOAC POLYTEC" ...
## $ pedidos : int 481 0 227 0 400 328 393 0 8975 449 ...
Técnica 4, CONVERTIR TIPO DE DATOS
Se cambia el formato de la fecha= de carácter a fecha.
plan2<-plan
plan2$fecha<-as.Date(plan2$fecha,format="%d/%m/%Y")
str(plan2)## 'data.frame': 228 obs. of 4 variables:
## $ ID_fecha: int 1 1 1 1 1 1 1 1 1 1 ...
## $ fecha : Date, format: "2022-01-31" "2022-01-31" ...
## $ cliente : chr "STB3" "STB 1" "YF RAMOS" "INOAC POLYTEC" ...
## $ pedidos : int 481 0 227 0 400 328 393 0 8975 449 ...
Técnica 5, VALORES FALTANTES
¿Cuántos NA tengo por variable?
sapply(plan2,function(x) sum(is.na(x)))## ID_fecha fecha cliente pedidos
## 0 0 0 0
Exportar base de datos
plan_final <- plan2
write.csv(plan_final, file ="deliveryplan_final2.csv", row.names = FALSE)Importar base de datos
perf<-read.csv("/Users/elenavela/Downloads/deliverperf.csv")
summary(perf)## Cliente Transportista Fecha Plan.arrival
## Length:104 Length:104 Length:104 Min. : 0.000
## Class :character Class :character Class :character 1st Qu.: 0.000
## Mode :character Mode :character Mode :character Median : 4.000
## Mean : 6.625
## 3rd Qu.:10.750
## Max. :20.000
## Real.arrival Real.Departure Diferencia
## Min. : 0.000 Min. : 0.000 Min. :0.000
## 1st Qu.: 0.000 1st Qu.: 0.000 1st Qu.:0.000
## Median : 0.000 Median : 0.000 Median :0.000
## Mean : 3.831 Mean : 4.145 Mean :0.303
## 3rd Qu.: 8.000 3rd Qu.: 8.662 3rd Qu.:0.520
## Max. :20.400 Max. :22.550 Max. :3.300
perf2<-perf
str(perf2)## 'data.frame': 104 obs. of 7 variables:
## $ Cliente : chr "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
## $ Transportista : chr "JUVENCIO" "DIONICIO " "DIONICIO " "DIONICIO " ...
## $ Fecha : chr "jul-21" "jul-21" "jul-21" "jul-21" ...
## $ Plan.arrival : num 16 8 9 20 0 0 0 0 16 8 ...
## $ Real.arrival : num 0 8 9 20 0 0 0 0 16 8 ...
## $ Real.Departure: num 0 8.55 10 21.1 0 0 0 0 17 8.51 ...
## $ Diferencia : num 0 0.55 1 1.1 0 0 0 0 1 0.51 ...
Técnica 5, VALORES FALTANTES
¿Cuántos NA tengo por variable?
sapply(perf2,function(x) sum(is.na(x)))## Cliente Transportista Fecha Plan.arrival Real.arrival
## 0 0 0 0 0
## Real.Departure Diferencia
## 0 0
Técnica 1, REMOVER DATOS IRRELEVANTES
Se cambian diferentes variables de carácter a entero
perf2$Real.arrival <- substr(perf2$Real.arrival, start = 1, stop = 2)
perf2$Real.arrival<- as.integer(perf2$Real.arrival)
perf2$Real.Departure <- substr(perf2$Real.Departure, start = 1, stop = 2)
perf2$Real.Departure<- as.integer(perf2$Real.Departure)
perf2$Plan.arrival <- substr(perf2$Plan.arrival, start = 1, stop = 2)
perf2$Plan.arrival<- as.integer(perf2$Plan.arrival)
str(perf2)## 'data.frame': 104 obs. of 7 variables:
## $ Cliente : chr "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
## $ Transportista : chr "JUVENCIO" "DIONICIO " "DIONICIO " "DIONICIO " ...
## $ Fecha : chr "jul-21" "jul-21" "jul-21" "jul-21" ...
## $ Plan.arrival : int 16 8 9 20 0 0 0 0 16 8 ...
## $ Real.arrival : int 0 8 9 20 0 0 0 0 16 8 ...
## $ Real.Departure: int 0 8 10 21 0 0 0 0 17 8 ...
## $ Diferencia : num 0 0.55 1 1.1 0 0 0 0 1 0.51 ...
Se eliminan columnas que no aportan mucho al análisis
perf3<-perf2
perf3<-subset(perf3,select=-c(Transportista,Plan.arrival,Real.arrival,Real.Departure))
summary(perf3)## Cliente Fecha Diferencia
## Length:104 Length:104 Min. :0.000
## Class :character Class :character 1st Qu.:0.000
## Mode :character Mode :character Median :0.000
## Mean :0.303
## 3rd Qu.:0.520
## Max. :3.300
Se renombran las columnas
names(perf3)=c("cliente","fecha","dif")
str(perf3)## 'data.frame': 104 obs. of 3 variables:
## $ cliente: chr "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
## $ fecha : chr "jul-21" "jul-21" "jul-21" "jul-21" ...
## $ dif : num 0 0.55 1 1.1 0 0 0 0 1 0.51 ...
Exportar base de datos
performance_final <- perf3
write.csv(performance_final, file ="deliveryperformance_finalya.csv", row.names = FALSE)Para esta base de datos, se tiene la información tres meses (casi completos): julio, agosto, septiembre.
Importar base de datos AGOSTO. Único mes completo.
prod<-read.csv("/Users/elenavela/Downloads/produccion.csv")
summary(prod)## CLIENTE ID.FORM PRODUCTO PIEZAS.PROG.
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## TMO..MIN. HR..FIN ESTACION.ARRANQUE Laminas.procesadas
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## INICIO.SEP.UP FIN.INICIO.DE.SEP.UP INICIO.de.PROCESO FIN.de.PROCESO
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## TIEMPO.CALIDAD
## Length:2568
## Class :character
## Mode :character
Técnica 1, REMOVER DATOS IRRELEVANTES
No todas las variables nos interesan, o aportan mucho, al análisis que
se pretende hacer. Se ha definido que las variables con las que se desea
quedar son las siguientes: cliente, piezas programadas, tiempo mínimo,
láminas procesadas y tiempo de calidad.
Se eliminan columnas
prod2<-prod
prod2<-subset(prod2,select=-c(ID.FORM,PRODUCTO,HR..FIN,ESTACION.ARRANQUE,INICIO.SEP.UP,FIN.INICIO.DE.SEP.UP,INICIO.de.PROCESO,FIN.de.PROCESO))
summary(prod2)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:2568 Length:2568 Length:2568 Length:2568
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
## TIEMPO.CALIDAD
## Length:2568
## Class :character
## Mode :character
Técnica 4, CONVERTIR TIPO DE DATOS
Para poder determinar los valores faltantes, es necesario convertir los valores de carácter a enteros/hora/fecha.
Carácter a entero
prod3<-prod2
prod3$PIEZAS.PROG.<-as.integer(prod3$PIEZAS.PROG.)
str(prod3)## 'data.frame': 2568 obs. of 5 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PIEZAS.PROG. : int 199 57 68 192 192 400 80 104 104 160 ...
## $ TMO..MIN. : chr "15" "10" "10" "15" ...
## $ Laminas.procesadas: chr "201" "116" "69" "49" ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
summary(prod3)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:2568 Min. : 1.0 Length:2568 Length:2568
## Class :character 1st Qu.: 100.0 Class :character Class :character
## Mode :character Median : 176.0 Mode :character Mode :character
## Mean : 183.5
## 3rd Qu.: 201.0
## Max. :1280.0
## NA's :164
## TIEMPO.CALIDAD
## Length:2568
## Class :character
## Mode :character
##
##
##
##
Carácter a hora
prod4<-prod3
prod4$TMO..MIN.<-as.integer(prod4$TMO..MIN.)
str(prod4)## 'data.frame': 2568 obs. of 5 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PIEZAS.PROG. : int 199 57 68 192 192 400 80 104 104 160 ...
## $ TMO..MIN. : int 15 10 10 15 15 30 15 15 15 20 ...
## $ Laminas.procesadas: chr "201" "116" "69" "49" ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Carácter a entero
prod5<-prod4
prod5$Laminas.procesadas<-as.integer(prod5$Laminas.procesadas)
str(prod5)## 'data.frame': 2568 obs. of 5 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PIEZAS.PROG. : int 199 57 68 192 192 400 80 104 104 160 ...
## $ TMO..MIN. : int 15 10 10 15 15 30 15 15 15 20 ...
## $ Laminas.procesadas: int 201 116 69 49 49 801 41 53 53 55 ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Carácter a hora
prod6<-prod5
prod6$TIEMPO.CALIDAD<-as.integer(prod6$TIEMPO.CALIDAD)
str(prod6)## 'data.frame': 2568 obs. of 5 variables:
## $ CLIENTE : chr "VARROC" "VARROC" "VARROC" "DENSO" ...
## $ PIEZAS.PROG. : int 199 57 68 192 192 400 80 104 104 160 ...
## $ TMO..MIN. : int 15 10 10 15 15 30 15 15 15 20 ...
## $ Laminas.procesadas: int 201 116 69 49 49 801 41 53 53 55 ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 1 ...
Técnica 5, VALORES FALTANTES
Al haber cambiado ya los valores a su forma correspondiente, observamos que existe una gran cantidad de valores faltantes (aprox. la mitad). Se ha optado por cambiar por mediana o por promedio dependiendo del caso.
¿Cuántos NA tengo por variables?
sapply(prod6,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 164 706 649
## TIEMPO.CALIDAD
## 608
Después de verificar cada variable, se ha optado por cambiar TODOS los valores faltantes de las 4 variables por la mediana de cada uno.
prod7<-prod6
prod7$PIEZAS.PROG.[is.na(prod7$PIEZAS.PROG.)]<- median(prod7$PIEZAS.PROG., na.rm=TRUE)
prod8<-prod7
prod8$TMO..MIN.[is.na(prod8$TMO..MIN.)]<- median(prod8$TMO..MIN., na.rm=TRUE)
prod9<-prod8
prod9$Laminas.procesadas[is.na(prod9$Laminas.procesadas)]<- median(prod9$Laminas.procesadas, na.rm=TRUE)
prod10<-prod9
prod10$TIEMPO.CALIDAD[is.na(prod10$TIEMPO.CALIDAD)]<- median(prod10$TIEMPO.CALIDAD, na.rm=TRUE)¿Cuántos NA tengo por variables?
sapply(prod10,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 0 0 0
## TIEMPO.CALIDAD
## 0
prod_agosto<-prod10
write.csv(prod_agosto, file ="prod_agosto.csv", row.names = FALSE)Base de datos de producción de SEPTIEMBRE
prod_sept<-read.csv("/Users/elenavela/Downloads/produccion_sept.csv")
summary(prod_sept)## CLIENTE ID.FORM PRODUCTO PIEZAS.PROG.
## Length:1617 Length:1617 Length:1617 Length:1617
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## TMO..MIN. HR..FIN ESTACION.ARRANQUE Laminas.procesadas
## Min. : 10.0 Length:1617 Length:1617 Length:1617
## 1st Qu.: 15.0 Class :character Class :character Class :character
## Median : 20.0 Mode :character Mode :character Mode :character
## Mean : 22.9
## 3rd Qu.: 25.0
## Max. :120.0
## NA's :485
## INICIO.SEP.UP fin.de.set.up INICIO.de.PROCESO FIN.de.PROCESO
## Length:1617 Length:1617 Length:1617 Length:1617
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## TIEMPO.CALIDAD X
## Length:1617 Min. : 0.000
## Class :character 1st Qu.: 0.000
## Mode :character Median : 0.000
## Mean : 1.214
## 3rd Qu.: 0.750
## Max. :10.000
## NA's :1603
Técnica 1, REMOVER DATOS IRRELEVANTES
No todas las variables nos interesan, o aportan mucho, al análisis que
se pretende hacer. Se ha definido que las variables con las que se desea
quedar son las siguientes: cliente, piezas programadas, tiempo mínimo,
láminas procesadas y tiempo de calidad.
Se eliminan columnas
prod_s2<-prod_sept
prod_s2<-subset(prod_s2,select=-c(ID.FORM,PRODUCTO,HR..FIN,ESTACION.ARRANQUE,INICIO.SEP.UP,INICIO.de.PROCESO,FIN.de.PROCESO,X,fin.de.set.up))
summary(prod_s2)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1617 Length:1617 Min. : 10.0 Length:1617
## Class :character Class :character 1st Qu.: 15.0 Class :character
## Mode :character Mode :character Median : 20.0 Mode :character
## Mean : 22.9
## 3rd Qu.: 25.0
## Max. :120.0
## NA's :485
## TIEMPO.CALIDAD
## Length:1617
## Class :character
## Mode :character
##
##
##
##
Técnica 4, CONVERTIR TIPO DE DATOS
Para poder determinar los valores faltantes, es necesario convertir los valores de carácter a enteros/hora/fecha.
Carácter a entero
prod_s3<-prod_s2
prod_s3$PIEZAS.PROG.<-as.integer(prod_s3$PIEZAS.PROG.)
str(prod_s3)## 'data.frame': 1617 obs. of 5 variables:
## $ CLIENTE : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ PIEZAS.PROG. : int 240 240 100 98 10 10 200 10 10 60 ...
## $ TMO..MIN. : int 10 10 15 10 10 10 15 10 10 10 ...
## $ Laminas.procesadas: chr "48" "48" "202" "101" ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
summary(prod_s3)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1617 Min. : 1 Min. : 10.0 Length:1617
## Class :character 1st Qu.: 100 1st Qu.: 15.0 Class :character
## Mode :character Median : 120 Median : 20.0 Mode :character
## Mean : 186 Mean : 22.9
## 3rd Qu.: 200 3rd Qu.: 25.0
## Max. :2000 Max. :120.0
## NA's :66 NA's :485
## TIEMPO.CALIDAD
## Length:1617
## Class :character
## Mode :character
##
##
##
##
Carácter a hora
prod_s4<-prod_s3
prod_s4$TMO..MIN.<-as.integer(prod_s4$TMO..MIN.)
str(prod_s4)## 'data.frame': 1617 obs. of 5 variables:
## $ CLIENTE : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ PIEZAS.PROG. : int 240 240 100 98 10 10 200 10 10 60 ...
## $ TMO..MIN. : int 10 10 15 10 10 10 15 10 10 10 ...
## $ Laminas.procesadas: chr "48" "48" "202" "101" ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Carácter a entero
prod_s5<-prod_s4
prod_s5$Laminas.procesadas<-as.integer(prod_s5$Laminas.procesadas)
str(prod_s5)## 'data.frame': 1617 obs. of 5 variables:
## $ CLIENTE : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ PIEZAS.PROG. : int 240 240 100 98 10 10 200 10 10 60 ...
## $ TMO..MIN. : int 10 10 15 10 10 10 15 10 10 10 ...
## $ Laminas.procesadas: int 48 48 202 101 22 11 202 5 NA 25 ...
## $ TIEMPO.CALIDAD : chr "1" "1" "1" "1" ...
Carácter a hora
prod_s6<-prod_s5
prod_s6$TIEMPO.CALIDAD<-as.integer(prod_s6$TIEMPO.CALIDAD)
str(prod_s6)## 'data.frame': 1617 obs. of 5 variables:
## $ CLIENTE : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ PIEZAS.PROG. : int 240 240 100 98 10 10 200 10 10 60 ...
## $ TMO..MIN. : int 10 10 15 10 10 10 15 10 10 10 ...
## $ Laminas.procesadas: int 48 48 202 101 22 11 202 5 NA 25 ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 1 ...
Técnica 5, VALORES FALTANTES
Al haber cambiado ya los valores a su forma correspondiente, observamos que existe una gran cantidad de valores faltantes (aprox. la mitad). Se ha optado por cambiar por mediana o por promedio dependiendo del caso.
¿Cuántos NA tengo por variables?
sapply(prod_s6,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 1 66 485 320
## TIEMPO.CALIDAD
## 522
En este caso, también,se toma ene cuenta la mediana para los valores faltantes.
prod_s7<-prod_s6
prod_s7$PIEZAS.PROG.[is.na(prod_s7$PIEZAS.PROG.)]<- median(prod_s7$PIEZAS.PROG., na.rm=TRUE)
prod_s8<-prod_s7
prod_s8$TMO..MIN.[is.na(prod_s8$TMO..MIN.)]<- median(prod_s8$TMO..MIN., na.rm=TRUE)
prod_s9<-prod_s8
prod_s9$Laminas.procesadas[is.na(prod_s9$Laminas.procesadas)]<- median(prod_s9$Laminas.procesadas, na.rm=TRUE)
prod_s10<-prod_s9
prod_s10$TIEMPO.CALIDAD[is.na(prod_s10$TIEMPO.CALIDAD)]<- median(prod_s10$TIEMPO.CALIDAD, na.rm=TRUE)Ya no se tienen NAs.
prod_s11<-prod_s10
prod_s11<-na.omit(prod_s11)
summary(prod_s11)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1616 Min. : 1.0 Min. : 10.00 Min. : 0.00
## Class :character 1st Qu.: 100.0 1st Qu.: 15.00 1st Qu.: 0.00
## Mode :character Median : 120.0 Median : 20.00 Median : 41.00
## Mean : 183.4 Mean : 22.04 Mean : 78.84
## 3rd Qu.: 200.0 3rd Qu.: 25.00 3rd Qu.:102.00
## Max. :2000.0 Max. :120.00 Max. :803.00
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 1.0000
## Median : 1.0000
## Mean : 0.8874
## 3rd Qu.: 1.0000
## Max. :11.0000
sapply(prod_s11,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 0 0 0
## TIEMPO.CALIDAD
## 0
Se exporta el mes de septiembre
prod_septiembre<-prod_s11
write.csv(prod_septiembre, file ="prod_septiembre.csv", row.names = FALSE)Se continua con la base de datos de JULIO
prod_jul<-read.csv("/Users/elenavela/Downloads/produccion_julio.csv")
summary(prod_jul)## CLIENTE ID.FORM PRODUCTO PIEZAS.PROG.
## Length:1035 Length:1035 Length:1035 Length:1035
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## TMO..MIN. HR..FIN ESTACION.ARRANQUE Laminas.procesadas
## Min. : 10.00 Length:1035 Length:1035 Length:1035
## 1st Qu.: 15.00 Class :character Class :character Class :character
## Median : 20.00 Mode :character Mode :character Mode :character
## Mean : 23.48
## 3rd Qu.: 25.00
## Max. :150.00
## NA's :300
## INICIO.SEP.UP FIN.INICIO.DE.SEP.UP INICIO.de.PROCESO FIN.de.PROCESO
## Length:1035 Length:1035 Length:1035 Length:1035
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 0.0000
## Median : 1.0000
## Mean : 0.9507
## 3rd Qu.: 1.0000
## Max. :10.0000
## NA's :183
Técnica 1, REMOVER DATOS IRRELEVANTES
No todas las variables nos interesan, o aportan mucho, al análisis que
se pretende hacer. Se ha definido que las variables con las que se desea
quedar son las siguientes: cliente, piezas programadas, tiempo mínimo,
láminas procesadas y tiempo de calidad.
Se eliminan columnas
prod_j2<-prod_jul
prod_j2<-subset(prod_j2,select=-c(ID.FORM,PRODUCTO,HR..FIN,ESTACION.ARRANQUE,INICIO.SEP.UP,INICIO.de.PROCESO,FIN.de.PROCESO,FIN.INICIO.DE.SEP.UP))
summary(prod_j2)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1035 Length:1035 Min. : 10.00 Length:1035
## Class :character Class :character 1st Qu.: 15.00 Class :character
## Mode :character Mode :character Median : 20.00 Mode :character
## Mean : 23.48
## 3rd Qu.: 25.00
## Max. :150.00
## NA's :300
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 0.0000
## Median : 1.0000
## Mean : 0.9507
## 3rd Qu.: 1.0000
## Max. :10.0000
## NA's :183
Técnica 4, CONVERTIR TIPO DE DATOS
Para poder determinar los valores faltantes, es necesario convertir los valores de carácter a enteros/hora/fecha.
Carácter a entero
prod_j3<-prod_j2
prod_j3$PIEZAS.PROG.<-as.integer(prod_j3$PIEZAS.PROG.)
str(prod_j3)## 'data.frame': 1035 obs. of 5 variables:
## $ 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 ...
## $ Laminas.procesadas: chr "402" "134" "110" "100" ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 2 ...
summary(prod_j3)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1035 Min. : 1.0 Min. : 10.00 Length:1035
## Class :character 1st Qu.: 84.0 1st Qu.: 15.00 Class :character
## Mode :character Median : 119.5 Median : 20.00 Mode :character
## Mean : 178.5 Mean : 23.48
## 3rd Qu.: 200.0 3rd Qu.: 25.00
## Max. :1000.0 Max. :150.00
## NA's :59 NA's :300
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 0.0000
## Median : 1.0000
## Mean : 0.9507
## 3rd Qu.: 1.0000
## Max. :10.0000
## NA's :183
Carácter a hora
prod_j4<-prod_j3
prod_j4$TMO..MIN.<-as.integer(prod_j4$TMO..MIN.)
str(prod_j4)## 'data.frame': 1035 obs. of 5 variables:
## $ 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 ...
## $ Laminas.procesadas: chr "402" "134" "110" "100" ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 2 ...
Carácter a entero
prod_j5<-prod_j4
prod_j5$Laminas.procesadas<-as.integer(prod_j5$Laminas.procesadas)
str(prod_j5)## 'data.frame': 1035 obs. of 5 variables:
## $ 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 ...
## $ Laminas.procesadas: int 402 134 110 100 51 402 22 13 33 NA ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 2 ...
Carácter a hora
prod_j6<-prod_j5
prod_j6$TIEMPO.CALIDAD<-as.integer(prod_j6$TIEMPO.CALIDAD)
str(prod_j6)## 'data.frame': 1035 obs. of 5 variables:
## $ 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 ...
## $ Laminas.procesadas: int 402 134 110 100 51 402 22 13 33 NA ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 2 ...
Técnica 5, VALORES FALTANTES
Al haber cambiado ya los valores a su forma correspondiente, observamos que existe una gran cantidad de valores faltantes (aprox. la mitad). Se ha optado por cambiar por mediana o por promedio dependiendo del caso.
¿Cuántos NA tengo por variables?
sapply(prod_j6,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 59 300 220
## TIEMPO.CALIDAD
## 183
Se toma el valor de la mediana para cambiar los valores faltantes
prod_j7<-prod_j6
prod_j7$PIEZAS.PROG.[is.na(prod_j7$PIEZAS.PROG.)]<- median(prod_j7$PIEZAS.PROG., na.rm=TRUE)
prod_j8<-prod_s7
prod_j8$TMO..MIN.[is.na(prod_j8$TMO..MIN.)]<- median(prod_j8$TMO..MIN., na.rm=TRUE)
prod_j9<-prod_s8
prod_j9$Laminas.procesadas[is.na(prod_j9$Laminas.procesadas)]<- median(prod_j9$Laminas.procesadas, na.rm=TRUE)
prod_j10<-prod_j9
prod_j10$TIEMPO.CALIDAD[is.na(prod_j10$TIEMPO.CALIDAD)]<- median(prod_j10$TIEMPO.CALIDAD, na.rm=TRUE)Ya no se tienen valores faltantes.
prod_j11<-prod_j10
prod_j11<-na.omit(prod_j11)
summary(prod_j11)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1616 Min. : 1.0 Min. : 10.00 Min. : 0.00
## Class :character 1st Qu.: 100.0 1st Qu.: 15.00 1st Qu.: 0.00
## Mode :character Median : 120.0 Median : 20.00 Median : 41.00
## Mean : 183.4 Mean : 22.04 Mean : 78.84
## 3rd Qu.: 200.0 3rd Qu.: 25.00 3rd Qu.:102.00
## Max. :2000.0 Max. :120.00 Max. :803.00
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 1.0000
## Median : 1.0000
## Mean : 0.8874
## 3rd Qu.: 1.0000
## Max. :11.0000
sapply(prod_j11,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 0 0 0
## TIEMPO.CALIDAD
## 0
Se exporta el último mes: JULIO
prod_julio<-prod_j11
write.csv(prod_julio, file ="prod_julio.csv", row.names = FALSE)JUNTAMOS LAS TRERS BASES DE DATOS (julio, agosto, septiembre).
produccion_f<-read.csv("/Users/elenavela/prod_julio.csv")
summary(produccion_f)## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## Length:1616 Min. : 1.0 Min. : 10.00 Min. : 0.00
## Class :character 1st Qu.: 100.0 1st Qu.: 15.00 1st Qu.: 0.00
## Mode :character Median : 120.0 Median : 20.00 Median : 41.00
## Mean : 183.4 Mean : 22.04 Mean : 78.84
## 3rd Qu.: 200.0 3rd Qu.: 25.00 3rd Qu.:102.00
## Max. :2000.0 Max. :120.00 Max. :803.00
## TIEMPO.CALIDAD
## Min. : 0.0000
## 1st Qu.: 1.0000
## Median : 1.0000
## Mean : 0.8874
## 3rd Qu.: 1.0000
## Max. :11.0000
sapply(produccion_f,function(x) sum(is.na(x)))## CLIENTE PIEZAS.PROG. TMO..MIN. Laminas.procesadas
## 0 0 0 0
## TIEMPO.CALIDAD
## 0
str(produccion_f)## 'data.frame': 1616 obs. of 5 variables:
## $ CLIENTE : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ PIEZAS.PROG. : int 240 240 100 98 10 10 200 10 10 60 ...
## $ TMO..MIN. : int 10 10 15 10 10 10 15 10 10 10 ...
## $ Laminas.procesadas: int 48 48 202 101 22 11 202 5 41 25 ...
## $ TIEMPO.CALIDAD : int 1 1 1 1 1 1 1 1 1 1 ...
Se cambia el nombre de las columnas
names (produccion_f) = c("client", "piezas_prog", "tmpo_min", "laminas_proc", "tiempo_calidad")
names (produccion_f)## [1] "client" "piezas_prog" "tmpo_min" "laminas_proc"
## [5] "tiempo_calidad"
Se exporta la versión final
write.csv(produccion_f, file ="produccion_final.csv", row.names = FALSE)merma<-read.csv("/Users/elenavela/Downloads/merma.csv")
summary(merma)## Fecha Mes Kilos
## Length:50 Length:50 Min. : 790
## Class :character Class :character 1st Qu.:3178
## Mode :character Mode :character Median :3925
## Mean :3709
## 3rd Qu.:4232
## Max. :6140
Técnica 1, REMOVER DATOS IRRELEVANTES
Desde el excel se han eliminado las filas de “total mes”.
Técnica 4, CONVERTIR TIPO DE DATOS
Para poder determinar los valores faltantes, es necesario convertir los valores de carácter a enteros/hora/fecha.
Carácter a entero
merma2<-merma
merma2$Fecha<-as.Date(merma2$Fecha,format="%d/%m/%y")
str(merma2)## 'data.frame': 50 obs. of 3 variables:
## $ Fecha: Date, 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 ...
summary(merma2)## Fecha Mes Kilos
## Min. :2022-01-11 Length:50 Min. : 790
## 1st Qu.:2022-03-12 Class :character 1st Qu.:3178
## Median :2022-05-24 Mode :character Median :3925
## Mean :2022-05-25 Mean :3709
## 3rd Qu.:2022-08-10 3rd Qu.:4232
## Max. :2022-09-21 Max. :6140
¿Cuántos NA tengo por variable?
sapply(merma2,function(x) sum(is.na(x)))## Fecha Mes Kilos
## 0 0 0
No existen valores faltantes por variables.
Exportar nueva base de datos (limpia)
merma_final <-merma2
write.csv(merma_final, file ="mermaa_final2.csv", row.names = FALSE)Importar base de datos
scrap<-read.csv("/Users/elenavela/Downloads/scrap.csv")Técnica 1, REMOVER DATOS IRRELEVANTES
No todas las variables nos interesan, o aportan mucho, al análisis que
se pretende hacer. Se ha definido que las variables con las que se desea
quedar son las siguientes: fecha, cantidad, y ubicación de origen.
Se eliminan columnas
scrap2<-scrap
scrap2<-subset(scrap2,select=-c(Referencia,Hora,Producto,Unidad.de.medida,Ubicación.de.desecho,Estado))
summary(scrap2)## Fecha Cantidad Ubicación.de.origen
## Length:250 Min. : 0.000 Length:250
## Class :character 1st Qu.: 1.000 Class :character
## Mode :character Median : 2.000 Mode :character
## Mean : 6.696
## 3rd Qu.: 7.000
## Max. :96.000
Técnica 4, CONVERTIR TIPO DE DATOS
Para poder determinar los valores faltantes, es necesario convertir los valores de carácter a enteros/hora/fecha.
Carácter a fecha
scrap3<-scrap2
scrap3$Fecha<-as.Date(scrap3$Fecha,format="%d/%m/%Y")
str(scrap3)## 'data.frame': 250 obs. of 3 variables:
## $ Fecha : Date, format: "2022-08-31" "2022-08-31" ...
## $ Cantidad : num 2 1 1 31 1 1 1 9 2 1 ...
## $ Ubicación.de.origen: chr "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Calidad/Entrega de PT" "SAB/Pre-Production" ...
summary(scrap3)## Fecha Cantidad Ubicación.de.origen
## Min. :2022-08-01 Min. : 0.000 Length:250
## 1st Qu.:2022-08-11 1st Qu.: 1.000 Class :character
## Median :2022-08-19 Median : 2.000 Mode :character
## Mean :2022-08-17 Mean : 6.696
## 3rd Qu.:2022-08-25 3rd Qu.: 7.000
## Max. :2022-08-31 Max. :96.000
¿Cuántos NA tengo por variable?
sapply(scrap3,function(x) sum(is.na(x)))## Fecha Cantidad Ubicación.de.origen
## 0 0 0
Se cambian los nombres de las columnas
scrap4<-scrap3
names (scrap4) = c("fecha", "cantidad", "ubi_origen")
names (scrap4)## [1] "fecha" "cantidad" "ubi_origen"
Exportar nueva base de datos (limpia)
scrap_finalya <-scrap4
write.csv(scrap_finalya, file ="scrap_finalya2.csv", row.names = FALSE)¿Cómo te permitió la aplicación de dichas técnicas una mejor comprensión de las bases de datos?
Estas técnicas resultan de utilidad al poder tener datos de calidad y
lo más reales posibles. Debido a que al final se desea poder comprender
las tendencias y lo que está pasando en la organización en diversos
temas, como lo son: sus actuales y pasados colaboradores, su producción,
su delivery performance y plan, su merma y su scrap. Por lo
tanto, lo ideal es trabajar con los datos más reales y ciertos
posibles.
Es por esto que al llevar a cabo esta transformación y limpieza,
podremos llevar a cabo un buen análisis y de buen uso para nuestro socio
formador: FORM.
bd_colab<-read.csv("/Users/elenavela/colab_FORM_limpia.csv")
bd_bajas<-read.csv("/Users/elenavela/bajas_FORM_limpia.csv")str(bd_colab)## 'data.frame': 104 obs. of 9 variables:
## $ edad : int 32 38 38 37 38 60 56 46 59 43 ...
## $ genero : chr "FEMENINO" "MASCULINO" "FEMENINO" "MASCULINO" ...
## $ alta : int 2013 2018 2015 2016 2020 2020 2022 2022 2022 2022 ...
## $ puesto : chr "SUPERVISORA" "MANTENIMIENTO" "COSTURERA" "AYUDANTE GENERAL" ...
## $ salario_diario: num 337 280 260 241 241 ...
## $ lugar.nacim. : chr "" "" "" "" ...
## $ mpio : chr "APODACA" "APODACA" "APODACA" "APODACA" ...
## $ estado : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ civil : chr "Casado" "Soltero" "Casado" "Casado" ...
str(bd_bajas)## 'data.frame': 233 obs. of 9 variables:
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ genero : chr "M" "F" "F" "F" ...
## $ alta : chr "2020-03-09" "2021-11-09" "2021-11-10" "2021-11-10" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ puesto : chr "DISEÑO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
## $ civil : chr "Soltero" "Unión libre" "Matrimonio" "Soltero" ...
Se obtienen 104 registros (u observaciones) en
colaboradores y 9 variables que se consideran como
relevantes.
Se obtienen 232 registros (u observaciones) en bajas y
9 variables que se consideran como relevantes.
De colaboradores
| VariableColab | Type |
|---|---|
Edad |
Cuantitativa discreta |
Género |
Cualitativa |
Año de Alta |
Cuantitativa discreta |
Puesto |
Cualitativa |
Salario diario |
Cuantitativa continua |
Lugar nacimiento |
Cualitativa |
Municipio |
Cualitativa |
Estado |
Cualitativa |
Estado civil |
Cualitativa |
De bajas
| VariableBajas | Type |
|---|---|
Edad |
Cuantitativa discreta |
Género |
Cualitativa |
Año de Alta |
Cuantitativa discreta |
Motivo Baja |
Cualitativa |
Duración |
Cuantitativa discreta |
Puesto |
Cualitativa |
Salario diario |
Cuantitativa continua |
Estado |
Cualitativa |
Estado civil |
Cualitativa |
| VariableColab | Medicion |
|---|---|
Edad |
Años |
Género |
No aplica |
Año de Alta |
Años |
Puesto |
No aplica |
Salario diario |
Pesos mexicanos |
Lugar nacimiento |
No aplica |
Municipio |
No aplica |
Estado |
No aplica |
Estado civil |
No aplica |
| VariableBajas | Medicion |
|---|---|
Edad |
Años |
Género |
No aplica |
Año de Alta |
Años |
Motivo Baja |
No aplica |
Duración |
Días |
Puesto |
No aplica |
Salario diario |
Pesos mexicanos |
Estado |
No aplica |
Estado civil |
No aplica |
bd_delplan<-read.csv("/Users/elenavela/deliveryplan_final2.csv")str(bd_delplan)## 'data.frame': 228 obs. of 4 variables:
## $ ID_fecha: int 1 1 1 1 1 1 1 1 1 1 ...
## $ fecha : chr "2022-01-31" "2022-01-31" "2022-01-31" "2022-01-31" ...
## $ cliente : chr "STB3" "STB 1" "YF RAMOS" "INOAC POLYTEC" ...
## $ pedidos : int 481 0 227 0 400 328 393 0 8975 449 ...
Esta base de datos cuenta con 228 observaciones y 4 variables relevantes.
| VariablePlan | Type |
|---|---|
ID_fecha |
Cuantitativa discreta |
Fecha |
Cuantitativa discreta |
Cliente |
Cualitativa |
Pedidos |
Cuantitativa discreta |
| VariablePlan | Medicion |
|---|---|
ID_fecha |
Número de mes |
Fecha |
Día/Mes/Año |
Cliente |
No aplica |
Pedidos |
Número o cantidad de pedidos |
bd_delperf<-read.csv("/Users/elenavela/deliveryperformance_finalya.csv")str(bd_delperf)## 'data.frame': 104 obs. of 3 variables:
## $ cliente: chr "PRINTEL " "MAHLE" "MAHLE" "MAHLE" ...
## $ fecha : chr "jul-21" "jul-21" "jul-21" "jul-21" ...
## $ dif : num 0 0.55 1 1.1 0 0 0 0 1 0.51 ...
Esta base de datos cuenta con 104 observaciones y 3 variables relevantes.
| VariablePerf | Type |
|---|---|
Cliente |
Cualitativa |
Fecha |
Cuantitativa discreta |
Diferencia |
Cuantitativa continua |
| VariablePerf | Medicion |
|---|---|
Cliente |
No aplica |
Fecha |
Mes-Año |
Diferencia |
Minutos |
bd_prod<-read.csv("/Users/elenavela/produccion_final.csv")str(bd_prod)## 'data.frame': 1616 obs. of 5 variables:
## $ client : chr "DENSO" "DENSO" "VARROC" "VARROC" ...
## $ piezas_prog : int 240 240 100 98 10 10 200 10 10 60 ...
## $ tmpo_min : int 10 10 15 10 10 10 15 10 10 10 ...
## $ laminas_proc : int 48 48 202 101 22 11 202 5 41 25 ...
## $ tiempo_calidad: int 1 1 1 1 1 1 1 1 1 1 ...
Esta base de datos cuenta con 1,616 observaciones y 5 variables relevantes.
| VariableProd | Type |
|---|---|
Cliente |
Cualitativa |
Piezas Programadas |
Cuantitativa discreta |
Tiempo mínimo |
Cuantitativa continua |
Láminas procesadas |
Cuantitativa discreta |
Tiempo de calidad |
Cuantitativa continua |
| VariableProd | Medicion |
|---|---|
Cliente |
No aplica |
Piezas Programadas |
Número o cantidad de piezas programadas |
Tiempo mínimo |
Minutos |
Láminas procesadas |
Número o cantidad de láminas procesadas |
Tiempo de calidad |
Mniutos |
bd_merma_f<-read.csv("/Users/elenavela/mermaa_final2.csv")str(bd_merma_f)## 'data.frame': 50 obs. of 3 variables:
## $ Fecha: chr "2022-01-11" "2022-01-11" "2022-01-22" "2022-01-22" ...
## $ Mes : chr "ENERO" "ENERO" "ENERO" "ENERO" ...
## $ Kilos: int 5080 3810 2990 2680 3650 4380 3870 3590 3410 3930 ...
Esta base de datos cuenta con 50 observaciones y 3 variables relevantes.
| VariableMerma | Type |
|---|---|
Fecha |
Cuantitativa continua |
Mes |
Cualitativa |
Kilos |
Cuantitativa continua |
| VariableMerma | Medicion |
|---|---|
Fecha |
Día/Mes/Año |
Mes |
No aplica |
Kilos |
Kilos/Kgs |
bd_scrapp<-scrap_finalyastr(bd_scrapp)## 'data.frame': 250 obs. of 3 variables:
## $ fecha : Date, format: "2022-08-31" "2022-08-31" ...
## $ 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" ...
summary(scrap3)## Fecha Cantidad Ubicación.de.origen
## Min. :2022-08-01 Min. : 0.000 Length:250
## 1st Qu.:2022-08-11 1st Qu.: 1.000 Class :character
## Median :2022-08-19 Median : 2.000 Mode :character
## Mean :2022-08-17 Mean : 6.696
## 3rd Qu.:2022-08-25 3rd Qu.: 7.000
## Max. :2022-08-31 Max. :96.000
Esta base de datos cuenta con 250 observaciones y 3 variables relevantes.
| VariableScrap | Type |
|---|---|
Fecha |
Cuantitativa continua |
Cantidad |
Cuantitativa discreta |
Ubicación de origen |
Cualitativa |
| VariableScrap | Medicion |
|---|---|
Fecha |
Día/Mes/Año |
Cantidad |
Número o cantidad de merma |
Ubicación de origen |
No aplica |
Librerías requeridas
library(foreign)
library(dplyr) # data manipulation
library(forcats) # to work with categorical variables
library(ggplot2) # data visualization
library(janitor) # data exploration and cleaning
#install.packages("psych")
library(corrplot) # correlation plots
library(lmtest) # diagnostic checks - linear regression analysis
library(car) # diagnostic checks - linear regression analysis
library(dplyr)
library(janitor)Se generan las tablas de frecuencia de las variables CUALITATIVAS.
genero<-table(bd_colab$genero)
knitr::kable(genero)| Var1 | Freq |
|---|---|
| FEMENINO | 59 |
| MASCULINO | 45 |
Observamos que en la base de datos limpia de los colaboradores actuales, existen más mujeres que hombres.
puesto<-table(bd_colab$puesto)
knitr::kable(puesto)| Var1 | Freq |
|---|---|
| AYUDANTE DE MANTENIMIENTO | 1 |
| Ayudante general | 1 |
| AYUDANTE GENERAL | 61 |
| CHOFER | 3 |
| CHOFER GESTOR | 1 |
| COSTURERA | 10 |
| CUSTOMER SERVICE INF | 1 |
| ENFERMERA | 1 |
| GESTOR | 1 |
| GUARDIA DE SEGURIDAD | 1 |
| INSPECTOR DE CALIDAD | 2 |
| LIDER | 1 |
| LIMPIEZA | 1 |
| MANTENIMIENTO | 1 |
| MONTACARGUISTA | 1 |
| MOZO | 1 |
| OP. FLEXO-RANURADORA-REFILADORA | 1 |
| OPERADOR SIERRA | 1 |
| PINTOR | 1 |
| RECIBO | 1 |
| RESIDENTE | 4 |
| SOLDADOR | 5 |
| Supervisor de M√°quin | 1 |
| Supervisor de pegado | 1 |
| SUPERVISORA | 1 |
Lo que más observamos en la base de colaboradores actuales, es el puesto de “Ayudante General”, seguido por “Costureras”.
municipio<-table(bd_colab$mpio)
knitr::kable(municipio)| Var1 | Freq |
|---|---|
| APODACA | 67 |
| CANADA BLANCA | 1 |
| GUADALUPE | 5 |
| JUAREZ | 9 |
| MONTERREY | 3 |
| PESQUERIA | 9 |
| RAMOS ARIZPE | 3 |
| SALTILLO | 5 |
| SAN NICOLAS DE LOS G | 2 |
Observamos que la gran parte de los colaboradores habitan en Apodaca, Nuevo León.
estado<-table(bd_colab$estado)
knitr::kable(estado)| Var1 | Freq |
|---|---|
| Coahuila | 9 |
| Nuevo Leon | 95 |
Así como la gran parte vienen de Nuevo León, y muy poco son foráneos.
civil<-table(bd_colab$civil)
knitr::kable(civil)| Var1 | Freq |
|---|---|
| Casado | 39 |
| Divorciado | 3 |
| Soltero | 42 |
| Union libre | 20 |
Actualmente, existen más personas solteras, siguiendo de casadas, por personas ene unión libre, y muy pocos divorciados.
Tablas cruzadas
Género con estado.
cruzada2<-table(bd_colab$estado,bd_colab$genero)
knitr::kable(cruzada2)| FEMENINO | MASCULINO | |
|---|---|---|
| Coahuila | 1 | 8 |
| Nuevo Leon | 58 | 37 |
Con esta tabla cruzada observamos que la gran mayoría de los foráneos son hombres.
Gráficos de datos cualitativos y cuantitativos
Datos cualitativos
barplot(prop.table(table(bd_colab$civil)),col=c("lightyellow","lightblue","pink","lightgreen"),main="Estado Civil de Colaboradores FORM", ylab ="Frecuencias",las=1)Como fue descrito anteriormente, aquí podemos ver de manera gráfica que casi la mitad son o solteros o casados.
porcentajes <- as.numeric(round(((prop.table(table(bd_colab$genero)))*100),2))
etiquetas <- c("Mujeres", "Hombres")
etiquetas <- paste(etiquetas, porcentajes)
etiquetas <- paste(etiquetas, "%", sep = "")
pie(porcentajes,etiquetas,col=c("pink","lightblue"),main="Género", ylab ="Frecuencias",las=1)En esta gráfica de pastel, podemos notar que más del 50% de los que trabajan en FORM actualmente son mujeres.
Datos cuantitativos
hist((bd_colab$salario_diario),col=c("darkred"),main="Salario Diario de Colaboradores de FORM",xlab="Salario en pesos mx")En cuanto al salario diario que reciben los colaboradores de FORM, la gran mayoría no sobrepasa los 200 pesos, y la gran parte de aquellos que si no sobrepasan los 300; existe un caso que está muy por encima de todos, entre los 400 y 500 diarios.
hist((bd_colab$alta),col=c("lightblue"),main="Fecha de Alta de Colaboradores de FORM",xlab="Año")Siguiendo con el año de alta de los actuales colaboradores, observamos que existe muy poca antigüedad, al haber ingresado la gran mayoría durante los últimos dos años (2020-2022). Igualmente, la persona que más tiempo lleva en FORM, tiene una antigüedad de 12 años, esto tomando en cuenta la limpieza de datos.
Gráficos de dispersión
plot(bd_colab$alta, bd_colab$salario_diario, main = "Fecha de ingreso con salario diario",
xlab = "Fecha de ingreso", ylab = "Salario",col=("darkgreen"),
pch = 19, frame = FALSE)Aquí también observamos lo descrito anteriormente, la mayoría no gana más de $200. Sin embargo, en este caso, vemos que no hay persona que haya ingresado desde el 2019 que gane más de $250. Igualmente, notamos que la persona que más gana no es aquella con mayor antigüedad, sino alguien que entró en el 2013. Las personas que mayor antigüedad ganan lo mismo que muchas de recién ingreso.
plot(bd_colab$edad, bd_colab$salario_diario, main = "Edad",
xlab = "Edad", ylab = "Salario",col=("darkgreen"),
pch = 19, frame = FALSE)En esta gráfica notamos que no existe discriminación de salario por la edad, puesto que la mayoría de las personas, desde los 18 hasta más de los 60, ganan menos de 200 pesos diarios. La persona que más gana parece tener entre 30 y 35 años.
boxplot(bd_colab$edad , vertical = TRUE,col=("darkblue"))Mediante el boxplot conocemos que la media es apróximadamente 32 años de edad, y que existe una notoria dispersión. Igual vemos que el rango de edad va desde los 18 hasta más de los 60.
BAJAS
#install.packages("epiDisplay")
library(epiDisplay)
bd_bajas<-bd_bajasTabla de frecuencia y gráfica de datos CUALITATIVOS: Puesto
puesto<-table(bd_bajas$puesto)
knitr::kable(puesto)| Var1 | Freq |
|---|---|
| ANALISTA DE NOMINAS /AUX DE R.H. | 1 |
| AUXILIAR DE EMBARQUES | 3 |
| AY. GENERAL | 4 |
| AY.GENERAL (MATERIALES) | 1 |
| AYUD.EMBARQUES | 1 |
| AYUDANTE DE EMBARQUES | 3 |
| AYUDANTE DE MTTO | 1 |
| AYUDANTE DE SOLDADOR | 1 |
| AYUDANTE GENERAL | 171 |
| AYUDANTE GENERAL DE EMBARQUES | 1 |
| CHOFER | 1 |
| CORTADOR | 1 |
| COSTURERA | 10 |
| COSTURERO | 1 |
| DISEÑO | 1 |
| ENCARGADA DE CALIDAD | 1 |
| FACTURACION | 1 |
| GUARDIA DE SEGURIDAD | 2 |
| INSPECTOR CALIDAD | 1 |
| INSPECTOR DE CALIDAD | 2 |
| INSPECTORA DE CALIDAD | 1 |
| LIMPIEZA | 1 |
| MARCADORA | 1 |
| MATERIALISTA | 2 |
| MONTACARGUISTA | 5 |
| PRACTICANTE DE MTTO | 1 |
| RESIDENTE | 2 |
| Residente Yanfeng | 1 |
| SERVICIO AL CLIENTE | 1 |
| SOLDADOR | 10 |
En esta observamos que el puesto que más han dejado en FORM es el puesto de ayudante general, por mucho. Esto puede ser debido a que es un puesto muy común y utilizado (aún en los colaboradores actuales es el que más personas tiene).
Tabla de frecuencia y gráfica de datos CUALITATIVOS: Motivo de bajas
motivo<-table(bd_bajas$motivo_baja)
knitr::kable(motivo)| Var1 | Freq |
|---|---|
| ABANDONO | 1 |
| BAJA POR FALTAS | 139 |
| JUBILACION | 1 |
| RENUNCIA VOLUNTARIA | 84 |
| TERMINO DE CONTRATO | 8 |
En el presente análisis notamos cuales son las principales razones, y las que menos, por las que los empleados de Form salen. Principalmente vemos que es por la BAJA POR FALTAS, siguiendo por RENUNCIA VOLUNTARIA. Las que menos vemos son por JUBILACIÓN y ABANDONO.
porcentajes <- as.numeric(round(((prop.table(table(bd_bajas$motivo_baja)))*100),2))
etiquetas <- c("Abandono", "Baja por faltas","Jubilación","Renuncia voluntaria","Termino de contrato")
etiquetas <- paste(etiquetas, porcentajes)
etiquetas <- paste(etiquetas, "%", sep = "")
pie(porcentajes,etiquetas,col=c("orange","lightblue","green","pink","yellow"),main="Motivo de bajas", ylab ="Frecuencias",las=1)Lo mismo que ha sido descrito en la tabla puede ser comprendido a partir de la gráfica superior; sin embargo, esta nos demuesta a través de porcentajes la proporción de cada razón.
civil<-table(bd_bajas$civil)
knitr::kable(civil)| Var1 | Freq |
|---|---|
| 1 | |
| Divorcio | 3 |
| Matrimonio | 63 |
| Soltero | 107 |
| Unión libre | 59 |
tab1(bd_bajas$civil,sort.group = FALSE,graph=TRUE,col=c("orange","lightblue","lightgreen","lightyellow"),main="Distribución de pasados colaboradores de FORM, por estado civil")## bd_bajas$civil :
## Frequency Percent Cum. percent
## 1 0.4 0.4
## Divorcio 3 1.3 1.7
## Matrimonio 63 27.0 28.8
## Soltero 107 45.9 74.7
## Unión libre 59 25.3 100.0
## Total 233 100.0 100.0
Comprendemos que la mayor cantidad de las personas que salen son solteras, y las personas que están en matrimonio o en unión libre tienen casi la misma tendencia a salir.
estado<-table(bd_bajas$estado)
knitr::kable(estado)| Var1 | Freq |
|---|---|
| Coahuila | 8 |
| Nuevo León | 225 |
tab1(bd_bajas$estado,sort.group = FALSE,graph=TRUE,col=c("orange","lightblue"),main="Distribución de pasados colaboradores de FORM, por estado")## bd_bajas$estado :
## Frequency Percent Cum. percent
## Coahuila 8 3.4 3.4
## Nuevo León 225 96.6 100.0
## Total 233 100.0 100.0
La gran parte de los que salen son de Nuevo León.
hist((bd_bajas$edad),col=c("orange"),main="Distribución de pasados colaboradores de FORM, por edad",xlab="Años",ylab="Frecuencia")De las personas que salen de la empresa, la edad lleva un sesgo positivo, la mayoría de los que salen se concentran en las edades más jóvenes, aproximadamente entre los 20 y los 30.
hist((bd_bajas$duracion),col=c("lightyellow"),main="Distribución de pasados colaboradores de FORM, por días de duración",xlab="Días",ylab="Frecuencia")En cuanto a los días que duran las personas que bajan, observemaos que muchos no duran ni siguiera el año, al estar la gran mayoría en menos de los 250 días dentro de Form. La antigüedad es poca.
hist((bd_bajas$salario_diario),col=c("darkblue"),main="Distribución de pasados colaboradores de FORM, por su salario diario",xlab="Pesos",ylab="Frecuencia")El salario no ve muchas diferencias, al estar la gran parte entre los 150 y los 200 pesos diarios.
porcentajes <- as.numeric(round(((prop.table(table(bd_bajas$genero)))*100),2))
etiquetas <- c("Mujeres", "Hombres")
etiquetas <- paste(etiquetas, porcentajes)
etiquetas <- paste(etiquetas, "%", sep = "")
pie(porcentajes,etiquetas,col=c("pink","lightblue"),main="Género de pasados colaboradores de FORM", ylab ="Frecuencias",las=1)Observamos que existe una mayor tendencia en que las personas que salgan sean mujeres.
plot(bd_bajas$edad,bd_bajas$duracion, main = "Días de duración y edad, de antiguos colaboradores", xlab="Edad", ylab="Duración",
pch = 19, frame = FALSE,col=c("orange"))En cuanto a la relación y la dispersión entre los días de duración y la edad, vemos que la edad no influye mucho en los días que duran, puesto que vemos casi la misma frecuencia de duración entre las diferentes edades. Existeen algunos casos que se salen de los “común” al haber durado mucho.
Para esta base de datos no se generan tablas cruzadas por el tipo de variables que se tienen.
Gráficos cualitativos y cuantitativos
library(plyr)## ------------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## ------------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
boxplot(bd_delplan$pedidos, main ="Total Ordenes")Notamos que en el total de ordenes, hay unas cuantas que sobrepasan los 50,000, mientras que muchas se quedan cerca del 0.
hist((bd_delplan$pedidos),col=c("pink"), main="Ordenes", las=1,xlab="Pedidos")Lo descrito anteriormente puede verse en este histograma, al estar la mayoría de los pedidos entre 0 y 5,000 pedidos, con muy poco pasando los 10,000.
Gráficos de dispersión
library(tibble)
tibble(bd_delplan)## # A tibble: 228 × 4
## ID_fecha fecha cliente pedidos
## <int> <chr> <chr> <int>
## 1 1 2022-01-31 STB3 481
## 2 1 2022-01-31 STB 1 0
## 3 1 2022-01-31 YF RAMOS 227
## 4 1 2022-01-31 INOAC POLYTEC 0
## 5 1 2022-01-31 MERIDIAN 400
## 6 1 2022-01-31 YANFENG sm 328
## 7 1 2022-01-31 YFTO 393
## 8 1 2022-01-31 YF QRO 0
## 9 1 2022-01-31 TRMX 8975
## 10 1 2022-01-31 DENSO 449
## # … with 218 more rows
plot(bd_delplan$ID_fecha, bd_delplan$pedidos, main = "Pedidos por fecha",
xlab = "Mes", ylab = "Ordenes", col=("darkred"),
pch = 19, frame = TRUE)Los meses estando por número, podemos ver que el mes que recibió el pedido máss grande fue el octavo (agosto), y el que menos pedidos en total ha recibido es diciembre, siguiendo de noviembre.
Tabla de frecuencia
Se generan las tablas de frecuencias de las variables
CUALITATIVAS.
cliente<-table(bd_delperf$cliente)
knitr::kable(cliente)| Var1 | Freq |
|---|---|
| MAGNA | 13 |
| MAHLE | 39 |
| PRINTEL | 13 |
| VARROC | 39 |
Aqui observamos que a los clientes que más se les entregó fue a Mahle y a Varroc.
Gráfica de dispersión
boxplot(bd_delperf$dif, vertical = TRUE,col=("darkred"))Vemos que la mayoría de los datos se encuentran entre el 0.0 y 0.5 de diferencia (o delay performance), con uno en 1.5, otro en 2.0, y otro sobrepasando los 3.
#install.packages("epiDisplay")
library(epiDisplay)Tabla de frecuencia y gráfica de datos CUANTITATIVOS: Tiempo de Calidad
tiempo_de_calidad<-table(bd_prod$tiempo_calidad)
knitr::kable(tiempo_de_calidad)| Var1 | Freq |
|---|---|
| 0 | 279 |
| 1 | 1310 |
| 2 | 9 |
| 3 | 3 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
| 8 | 2 |
| 9 | 1 |
| 10 | 1 |
| 11 | 1 |
tab1(bd_prod$tiempo_calidad,sort.group = FALSE,graph=TRUE,main="Distribución del tiempo de calidad")## bd_prod$tiempo_calidad :
## Frequency Percent Cum. percent
## 0 279 17.3 17.3
## 1 1310 81.1 98.3
## 2 9 0.6 98.9
## 3 3 0.2 99.1
## 4 3 0.2 99.3
## 5 3 0.2 99.4
## 6 4 0.2 99.7
## 8 2 0.1 99.8
## 9 1 0.1 99.9
## 10 1 0.1 99.9
## 11 1 0.1 100.0
## Total 1616 100.0 100.0
Primeramente, se analiza el tiempo de calidad. A partir de la tabla de frecuencia y de su gráfica, observamos que la gran parte de la producción analizada toma un valor de tiempo de calidad de un minuto, poco siendo inferior a 1, o 0.
Gráfica de datos CUANTITATIVOS: Tiempo Mínimo
hist((bd_prod$tmpo_min),col=c("orange"),main="Distribución del Tiempo Mínimo",xlab="Minutos")Siguientemente, observamos el tiempo mínimo (por minutos) de la producción. La gran parte se encuentrra entre los 0 y los 30 minutos.
Gráfica de datos CUANTITATIVOS: Piezas Programadas
hist((bd_prod$piezas_prog),col=c("yellow"),main="Piezas Programadas",xlab="Unidades")Continuando con las piezas programadas, vemos que la gran parte de las piezas programadas rondan entre 0 y 200 unidades.
Gráfica de datos CUANTITATIVOS: Láminas Procesadas
hist((bd_prod$laminas_proc),col=c("darkgreen"),main="Láminas Procesadas",xlab="Unidades")Con las láminas procesadas, vemos que la mayor frecuencia es está entre el 0 y 100, con un importante número también visto entre 100 y 300.
Gráfica de dispersión: Piezas programadas
boxplot(bd_prod$piezas_prog,col=c("orange"))Tal como lo vimos en el histograma, vemos que la mayor concentración de datos está entre el 100 y 200. No resulta demasiado disperso, sin embargo hay un dato que se sale de lo “normal”, puesto que lo encontramos arriba de los miles.
Tabla de frecuencia y gráfica de datos CUALITATIVOS: Mes
knitr::kable(table(bd_merma_f$Mes))| Var1 | Freq |
|---|---|
| ABRIL | 5 |
| AGOSTO | 11 |
| ENERO | 4 |
| FEBRERO | 6 |
| JULIO | 5 |
| JUNIO | 4 |
| MARZO | 6 |
| MAYO | 5 |
| SEPTIEMBRE | 4 |
tab1(bd_merma_f$Mes,sort.group = FALSE,graph=TRUE,main="Distribución de la merma por mes")## bd_merma_f$Mes :
## Frequency Percent Cum. percent
## ABRIL 5 10 10
## AGOSTO 11 22 32
## ENERO 4 8 40
## FEBRERO 6 12 52
## JULIO 5 10 62
## JUNIO 4 8 70
## MARZO 6 12 82
## MAYO 5 10 92
## SEPTIEMBRE 4 8 100
## Total 50 100 100
Viendo los desperdicios por kilos, por mes, vemos que agosto fue un mes que tuvo una gran cantidad de desperdicios, sobre todo al compararla con los otros meses.
Gráfica de datos CUANTITATIVOS: Kilos
hist((bd_merma_f$Kilos),col=c("lightgreen"),main="Cantidad de merma por kilos",xlab="Kilogramos")Viendo la cantidad de kilos, observamos que la gran cantidad se encuentra entre los 3000 y 5000 kilos.
Gráfica de datos CUALITATIVOS: Mes
porcentajes <- as.numeric(round(((prop.table(table(bd_merma_f$Mes)))*100),2))
etiquetas <- c("Abril","Agosto","Enero","Febrero","Julio","Junio","Marzo","Mayo","Septiembre")
etiquetas <- paste(etiquetas, porcentajes)
etiquetas <- paste(etiquetas, "%", sep = "")
pie(porcentajes,etiquetas,col=c("pink","blue","green","yellow","orange","darkblue","darkgreen","red","lightyellow","lightblue","darkred","lightgreen"),main="Merma en los meses", ylab ="Frecuencias",las=1)En esta diferente presentación de los meses, vemos los porcentajes de merma de cada mes. Aquí notamos como Agosto tiene casi una cuarta parte de todo la merma del año, y Junio, Septiembre, y Enero, la menor parte.
Gráfica de dispersión: Kilos
boxplot(bd_merma_f$Kilos,col=c("yellow"))En este boxplot que describe la dispersión de los kilos por los meses, vemos que no hay muchos datos que se salgan de lo “normal”. Y que la gran parte de los datos se encuentran entre los 3,000, y más de los 4,000 kilos; la media siendo alrededor de los 4,000 kilos.
Tabla de frecuencia y gráfica de datos CUALITATIVOS: Ubicación de origen
knitr::kable(table(scrap_finalya$ubi_origen))| Var1 | Freq |
|---|---|
| SAB/Calidad/Entrega de PT | 58 |
| SAB/Post-Production | 13 |
| SAB/Pre-Production | 179 |
tab1(scrap_finalya$ubi_origen,sort.group = FALSE,graph=TRUE,main="Ubicación de origen del Scrap")## scrap_finalya$ubi_origen :
## Frequency Percent Cum. percent
## SAB/Calidad/Entrega de PT 58 23.2 23.2
## SAB/Post-Production 13 5.2 28.4
## SAB/Pre-Production 179 71.6 100.0
## Total 250 100.0 100.0
En este caso, observamos que la gran parte del scrap se encuentra en pre-producción, siguiendo por la verificación de calidad y la entrega, y muy pocas están en post-producción.
Gráfica de datos CUANTITATIVOS: Cantidad
hist((scrap_finalya$cantidad),col=c("lightgreen"),main="Cantidad del Scrap",xlab="Unidades")Observando la variable cantidad del scrap, vemos que la gran parte está entre las 0 y 10 unidades, sobrepasando solo muy pocas del total.
Gráfica de dispersión: Fecha y cantidad
plot(scrap_finalya$fecha,scrap_finalya$cantidad, main = "Fecha y cantidad del scrap", xlab="Fecha",ylab="Cantidad",
pch = 19, frame = FALSE,col=c("orange"))Continuando con un análisis de dispersión, comparamos la fecha y las unidades. Vemos que la mayoría del scrap de agosto fue trabajado en pocas unidades, con muy pocas siendo altas. Todo el mes presenta trabajo.
Importar base datos
bd_mex <- read.csv("/Users/elenavela/Downloads/ACTIVIDAD 2.2 (1).csv")
bd_mex1 <- bd_mex
bd_mex1<-subset(bd_mex1,select=-c(ID))
str(bd_mex1)## 'data.frame': 1436 obs. of 5 variables:
## $ Unidad._Económica : chr "AGI SHOREWOOD MEXICO S DE RL DE CV" "BIO PAPPEL" "CAJAS CON CARTON" "CAJAS CORRUGADAS DE AGUASCALIENTES" ...
## $ Clase._de_actividad : chr "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" ...
## $ Descripcion.estrato.personal: chr "101 a 250 personas" "0 a 5 personas" "0 a 5 personas" "11 a 30 personas" ...
## $ Estado : chr "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" ...
## $ Tipo_establecimiento : chr "Fijo" "Fijo" "Fijo" "Fijo" ...
bd_mex1 [duplicated(bd_mex1),]## Unidad._Económica
## 37 SOLUCIONES EN EMPAQUE Y LOGISTICA
## 49 CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 63 EMPAQUES PRECISOS DE MEXICALI
## 89 SINIL INDUSTRY SA DE CV
## 119 DANHIL DE MEXICO SA DE CV
## 172 DURABOX
## 211 BIO PAPPEL
## 251 FABRICACIÓN DE ENVASES DE CARTÓN
## 372 CORRUWAX
## 383 EMPAQUES 06
## 390 ENVASES MICROONDA
## 481 PROCESOS ESPECIALIZADOS DE CARTON DE MEXICO
## 670 PRAKTICAJA
## 698 BIO PAPPEL
## 703 BIO PAPPEL SAB DE CV
## 728 CAJAS Y EMPAQUES MODERNOS SA DE CV
## 736 CARTONERA
## 803 FABRICACION DE CAJAS DE CARTON
## 804 FABRICACION DE CAJAS DE CARTON
## 805 FABRICACION DE CAJAS DE CARTON
## 818 GRUPO TENSA
## 919 HVM GROUP
## 955 BRECEPACK
## 963 CAJAS DE CARTON SULTANA
## 980 CARTOLITO SA DE CV
## 1021 EMPAQUES CONFIABLES
## 1047 FABRICACIÓN DE ENVASES DE CARTÓN
## 1052 FECSA
## 1068 HEXAGONOS MEXICANOS
## 1091 LITOGRAFICA ROBERTSON
## 1224 CORRUEMPAQUES
## 1226 CORRUGADOS ESPECIALIZADOS
## 1241 ESK
## 1281 CAJAS MIL USOS
## 1286 CARDBOARD & BOXES
## 1302 EMPAQUES Y ENVOLTURAS SA DE CV
## 1338 CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1339 CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1340 CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1341 CELULOSA Y CORRUGADOS DE SONORA SA DE CV
## 1374 EMPAQUES RIO GRANDE SA DE CV
## 1403 HEXAGONOS MEXICANOS
## Clase._de_actividad Descripcion.estrato.personal
## 37 Fabricación de envases de cartón 11 a 30 personas
## 49 Fabricación de envases de cartón 0 a 5 personas
## 63 Fabricación de envases de cartón 0 a 5 personas
## 89 Fabricación de envases de cartón 251 y más personas
## 119 Fabricación de envases de cartón 31 a 50 personas
## 172 Fabricación de envases de cartón 101 a 250 personas
## 211 Fabricación de envases de cartón 31 a 50 personas
## 251 Fabricación de envases de cartón 0 a 5 personas
## 372 Fabricación de envases de cartón 0 a 5 personas
## 383 Fabricación de envases de cartón 6 a 10 personas
## 390 Fabricación de envases de cartón 0 a 5 personas
## 481 Fabricación de envases de cartón 11 a 30 personas
## 670 Fabricación de envases de cartón 11 a 30 personas
## 698 Fabricación de envases de cartón 31 a 50 personas
## 703 Fabricación de envases de cartón 251 y más personas
## 728 Fabricación de envases de cartón 101 a 250 personas
## 736 Fabricación de envases de cartón 0 a 5 personas
## 803 Fabricación de envases de cartón 0 a 5 personas
## 804 Fabricación de envases de cartón 0 a 5 personas
## 805 Fabricación de envases de cartón 0 a 5 personas
## 818 Fabricación de envases de cartón 0 a 5 personas
## 919 Fabricación de envases de cartón 0 a 5 personas
## 955 Fabricación de envases de cartón 31 a 50 personas
## 963 Fabricación de envases de cartón 51 a 100 personas
## 980 Fabricación de envases de cartón 11 a 30 personas
## 1021 Fabricación de envases de cartón 0 a 5 personas
## 1047 Fabricación de envases de cartón 0 a 5 personas
## 1052 Fabricación de envases de cartón 0 a 5 personas
## 1068 Fabricación de envases de cartón 11 a 30 personas
## 1091 Fabricación de envases de cartón 11 a 30 personas
## 1224 Fabricación de envases de cartón 11 a 30 personas
## 1226 Fabricación de envases de cartón 6 a 10 personas
## 1241 Fabricación de envases de cartón 11 a 30 personas
## 1281 Fabricación de envases de cartón 0 a 5 personas
## 1286 Fabricación de envases de cartón 0 a 5 personas
## 1302 Fabricación de envases de cartón 0 a 5 personas
## 1338 Fabricación de envases de cartón 0 a 5 personas
## 1339 Fabricación de envases de cartón 0 a 5 personas
## 1340 Fabricación de envases de cartón 0 a 5 personas
## 1341 Fabricación de envases de cartón 0 a 5 personas
## 1374 Fabricación de envases de cartón 51 a 100 personas
## 1403 Fabricación de envases de cartón 31 a 50 personas
## Estado Tipo_establecimiento
## 37 AGUASCALIENTES Fijo
## 49 BAJA CALIFORNIA Fijo
## 63 BAJA CALIFORNIA Fijo
## 89 BAJA CALIFORNIA Fijo
## 119 COAHUILA DE ZARAGOZA Fijo
## 172 CHIHUAHUA Fijo
## 211 CIUDAD DE MÉXICO Fijo
## 251 CIUDAD DE MÉXICO Fijo
## 372 GUANAJUATO Fijo
## 383 GUANAJUATO Fijo
## 390 GUANAJUATO Fijo
## 481 GUANAJUATO Fijo
## 670 JALISCO Fijo
## 698 MÉXICO Fijo
## 703 MÉXICO Fijo
## 728 MÉXICO Fijo
## 736 MÉXICO Fijo
## 803 MÉXICO Fijo
## 804 MÉXICO Fijo
## 805 MÉXICO Fijo
## 818 MÉXICO Fijo
## 919 MICHOACÁN DE OCAMPO Fijo
## 955 NUEVO LEÓN Fijo
## 963 NUEVO LEÓN Fijo
## 980 NUEVO LEÓN Fijo
## 1021 NUEVO LEÓN Fijo
## 1047 NUEVO LEÓN Fijo
## 1052 NUEVO LEÓN Fijo
## 1068 NUEVO LEÓN Fijo
## 1091 NUEVO LEÓN Fijo
## 1224 QUERÉTARO Fijo
## 1226 QUERÉTARO Fijo
## 1241 QUERÉTARO Fijo
## 1281 SAN LUIS POTOSÍ Fijo
## 1286 SAN LUIS POTOSÍ Fijo
## 1302 SAN LUIS POTOSÍ Fijo
## 1338 SONORA Fijo
## 1339 SONORA Fijo
## 1340 SONORA Fijo
## 1341 SONORA Fijo
## 1374 TAMAULIPAS Fijo
## 1403 TLAXCALA Fijo
sum(duplicated(bd_mex1))## [1] 42
bd_mex2 <- bd_mex1
library(dplyr)
bd2 <- distinct (bd_mex2)Librerías requeridas
library(foreign)
library(dplyr) # data manipulation
library(forcats) # to work with categorical variables
library(ggplot2) # data visualization
library(janitor) # data exploration and cleaning
#install.packages("psych")
library(corrplot) # correlation plots
library(lmtest) # diagnostic checks - linear regression analysis
library(car) # diagnostic checks - linear regression analysisstr(bd_mex2)## 'data.frame': 1436 obs. of 5 variables:
## $ Unidad._Económica : chr "AGI SHOREWOOD MEXICO S DE RL DE CV" "BIO PAPPEL" "CAJAS CON CARTON" "CAJAS CORRUGADAS DE AGUASCALIENTES" ...
## $ Clase._de_actividad : chr "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" "Fabricación de envases de cartón" ...
## $ Descripcion.estrato.personal: chr "101 a 250 personas" "0 a 5 personas" "0 a 5 personas" "11 a 30 personas" ...
## $ Estado : chr "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" "AGUASCALIENTES" ...
## $ Tipo_establecimiento : chr "Fijo" "Fijo" "Fijo" "Fijo" ...
Gráficos de datos cualitativos y cuantitativos
Datos cualitativos
pie(prop.table(table(bd_mex2$Tipo_establecimiento)),col=c("pink","blue"),main="Tipo de establecimiento", ylab ="Frecuencias",las=1)Observamos que muy pocos establecimientos de producción de cartón manejan los semifijo.
bd_mex_e<-read.csv("/Users/elenavela/Downloads/exports_mx.csv")
summary(bd_mex_e)## PROD_EST COBERTURA ANIO ID_MES
## Length:70421 Length:70421 Min. :2017 Min. : 1.000
## Class :character Class :character 1st Qu.:2019 1st Qu.: 3.000
## Mode :character Mode :character Median :2020 Median : 6.000
## Mean :2020 Mean : 6.359
## 3rd Qu.:2021 3rd Qu.: 9.000
## Max. :2022 Max. :12.000
## MES MARCA MODELO TIPO
## Length:70421 Length:70421 Length:70421 Length:70421
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## SEGMENTO PAIS ID_PAIS_DESTINO UNI_VEH
## Length:70421 Length:70421 Min. : 4.0 Min. : -23.0
## Class :character Class :character 1st Qu.: 46.0 1st Qu.: 0.0
## Mode :character Mode :character Median : 74.0 Median : 0.0
## Mean :121.4 Mean : 242.8
## 3rd Qu.:172.0 3rd Qu.: 8.0
## Max. :999.0 Max. :26454.0
Se eliminan variables que no aporten mucho al análisis
bd_mex_e2<-bd_mex_e
bd_mex_e2<-subset(bd_mex_e2,select=-c(PROD_EST,COBERTURA,ID_MES,MODELO,TIPO,ID_PAIS_DESTINO))
summary(bd_mex_e2)## ANIO MES MARCA SEGMENTO
## Min. :2017 Length:70421 Length:70421 Length:70421
## 1st Qu.:2019 Class :character Class :character Class :character
## Median :2020 Mode :character Mode :character Mode :character
## Mean :2020
## 3rd Qu.:2021
## Max. :2022
## PAIS UNI_VEH
## Length:70421 Min. : -23.0
## Class :character 1st Qu.: 0.0
## Mode :character Median : 0.0
## Mean : 242.8
## 3rd Qu.: 8.0
## Max. :26454.0
¿Cuántos NA tengo por variable?
sapply(bd_mex_e2,function(x) sum(is.na(x)))## ANIO MES MARCA SEGMENTO PAIS UNI_VEH
## 0 0 0 0 0 0
Gráficas
marca<-table(bd_mex_e2$MARCA)
knitr::kable(marca)| Var1 | Freq |
|---|---|
| Audi | 1459 |
| BMW Group | 854 |
| Chrysler | 8359 |
| Fiat | 1051 |
| Ford Motor | 1175 |
| General Motors | 14336 |
| Honda | 387 |
| KIA | 7150 |
| Mazda | 12688 |
| Mercedes Benz_Prod_Expo | 1557 |
| Nissan | 12390 |
| Toyota | 254 |
| Volkswagen | 8761 |
tab1(bd_mex_e2$MARCA,sort.group = FALSE,graph=TRUE,main="Distribución de Exportaciones por Marca")## bd_mex_e2$MARCA :
## Frequency Percent Cum. percent
## Audi 1459 2.1 2.1
## BMW Group 854 1.2 3.3
## Chrysler 8359 11.9 15.2
## Fiat 1051 1.5 16.6
## Ford Motor 1175 1.7 18.3
## General Motors 14336 20.4 38.7
## Honda 387 0.5 39.2
## KIA 7150 10.2 49.4
## Mazda 12688 18.0 67.4
## Mercedes Benz_Prod_Expo 1557 2.2 69.6
## Nissan 12390 17.6 87.2
## Toyota 254 0.4 87.6
## Volkswagen 8761 12.4 100.0
## Total 70421 100.0 100.0
De las exportaciones de vehículos de México, observamos que aquellos que mayor participación tienen son General Motors (EUA), Mazda (Japón), Nissan (Japón), Chrysler (EUA), Volkswagen (Alemania). Y aquellos que menos son Toyota (Japón), Honda (Japón), y BMW (Alemania).
segmento<-table(bd_mex_e2$SEGMENTO)
knitr::kable(segmento)| Var1 | Freq |
|---|---|
| Compactos | 21213 |
| De Lujo | 1293 |
| Minivans | 472 |
| Pick Ups | 8596 |
| Subcompactos | 16844 |
| SUV’s | 22003 |
tab1(bd_mex_e2$SEGMENTO,sort.group = FALSE,graph=TRUE,main="Exportaciones por segmento")## bd_mex_e2$SEGMENTO :
## Frequency Percent Cum. percent
## Compactos 21213 30.1 30.1
## De Lujo 1293 1.8 32.0
## Minivans 472 0.7 32.6
## Pick Ups 8596 12.2 44.8
## Subcompactos 16844 23.9 68.8
## SUV's 22003 31.2 100.0
## Total 70421 100.0 100.0
LA VARIABLE SIN NOMBRE ES SUBCOMPACTOS
De México, se exportan más vehículos Compactos y SUVs. Y las que menos
son las Minivaans y los vehículos De Lujo.
mes<-table(bd_mex_e2$MES)
knitr::kable(mes)| Var1 | Freq |
|---|---|
| Abril | 6109 |
| Agosto | 5090 |
| Diciembre | 5696 |
| Enero | 6052 |
| Febrero | 6115 |
| Julio | 6205 |
| Junio | 6027 |
| Marzo | 6281 |
| Mayo | 6196 |
| Noviembre | 5656 |
| Octubre | 5418 |
| Septiembre | 5576 |
tab1(bd_mex_e2$MES,sort.group = FALSE,graph=TRUE, main="Distribución de Exportaciones por Mes")## bd_mex_e2$MES :
## Frequency Percent Cum. percent
## Abril 6109 8.7 8.7
## Agosto 5090 7.2 15.9
## Diciembre 5696 8.1 24.0
## Enero 6052 8.6 32.6
## Febrero 6115 8.7 41.3
## Julio 6205 8.8 50.1
## Junio 6027 8.6 58.6
## Marzo 6281 8.9 67.6
## Mayo 6196 8.8 76.4
## Noviembre 5656 8.0 84.4
## Octubre 5418 7.7 92.1
## Septiembre 5576 7.9 100.0
## Total 70421 100.0 100.0
No existe mucha diferencia en las exportaciones por mes, sin embargo lo más notorio es que mayo es el mes que más presenta exportaciones, y el que menos es agosto.
hist((bd_mex_e2$UNI_VEH),col=c("lightyellow"),main="Unidades de vehiculos exportados",xlab="Unidades")Las unidades de vehículos exportados, la maaayoría no super las 3,000 unidades.
año<-table(bd_mex_e2$ANIO)
knitr::kable(año)| Var1 | Freq |
|---|---|
| 2017 | 7173 |
| 2018 | 9358 |
| 2019 | 14449 |
| 2020 | 15017 |
| 2021 | 15941 |
| 2022 | 8483 |
tab1(bd_mex_e2$ANIO,sort.group = FALSE,graph=TRUE,main="Distribución de exportaciones por año")## bd_mex_e2$ANIO :
## Frequency Percent Cum. percent
## 2017 7173 10.2 10.2
## 2018 9358 13.3 23.5
## 2019 14449 20.5 44.0
## 2020 15017 21.3 65.3
## 2021 15941 22.6 88.0
## 2022 8483 12.0 100.0
## Total 70421 100.0 100.0
En esta comparativa de las exportaciones de México a través de los años, vemos que durante el 2017 fue la menor cantidad, aún menos que el 2022 (año sin completar). Aquel que ha presentado más exportaciones fue el año pasado, 2021.
bd_eua<-read.csv("/Users/elenavela/Downloads/exports.csv")
summary(bd_eua)## Year APEC ASEAN CAFTA
## Min. :2008 Min. :3.577e+10 Min. :4.969e+08 Min. :278169351
## 1st Qu.:2011 1st Qu.:5.587e+10 1st Qu.:8.402e+08 1st Qu.:352131115
## Median :2014 Median :6.611e+10 Median :1.023e+09 Median :382792580
## Mean :2014 Mean :6.144e+10 Mean :1.015e+09 Mean :398381579
## 3rd Qu.:2018 3rd Qu.:6.955e+10 3rd Qu.:1.232e+09 3rd Qu.:459128093
## Max. :2021 Max. :7.344e+10 Max. :1.502e+09 Max. :520314206
## EU.Without.UK EU28 FTA.COUNTRIES
## Min. :3.032e+09 Min. :3.645e+09 Min. :3.403e+10
## 1st Qu.:4.321e+09 1st Qu.:5.390e+09 1st Qu.:5.040e+10
## Median :5.084e+09 Median :6.282e+09 Median :6.218e+10
## Mean :5.072e+09 Mean :6.330e+09 Mean :5.700e+10
## 3rd Qu.:5.807e+09 3rd Qu.:7.360e+09 3rd Qu.:6.459e+10
## Max. :6.903e+09 Max. :8.900e+09 Max. :6.709e+10
## GCC MERCOSUR USMCA
## Min. :6.503e+08 Min. :1.122e+09 Min. :3.177e+10
## 1st Qu.:8.310e+08 1st Qu.:1.469e+09 1st Qu.:4.707e+10
## Median :9.483e+08 Median :1.645e+09 Median :5.753e+10
## Mean :9.264e+08 Mean :1.730e+09 Mean :5.320e+10
## 3rd Qu.:1.008e+09 3rd Qu.:1.967e+09 3rd Qu.:6.014e+10
## Max. :1.188e+09 Max. :2.555e+09 Max. :6.305e+10
## WORLD
## Min. :4.324e+10
## 1st Qu.:6.725e+10
## Median :7.695e+10
## Mean :7.329e+10
## 3rd Qu.:8.196e+10
## Max. :8.876e+10
GLOSARIO:
APEC= Asia-Pacific Economic Cooperation
ASEAN=Association of South-East Asian Nations
CAFTA=Tratado de Libre Comercio entre Centroamérica y los Estados Unidos
EU.Without.UK=Unión europea sin el Reino Unido
EU28=Unión europea con el Reino Unido
FTA.Countries=The United States has agreements in force with 20 countries: Australia, Bahrain, Canada, Chile, Colombia, Costa Rica, Dominican Republic, El Salvador, Guatemala, Honduras, Israel, Jordan, Mexico, Morocco, Nicaragua, Oman, Panama, Peru, Singapore, and South Korea.
GCC=Gulf Cooperation Council: a group of six countries in the Persian Gulf: Bahrain, Kuwait, Qatar, Oman, Saudi Arabia, and the United Arab Emirates
Mercosur=El Mercado Común del Sur (MERCOSUR) Argentina, Brasil, Paraguay y Uruguay.
USMCA=United States-Mexico-Canada Agreement
World= mundo.
No se hacen tabla de frecuencia debido ya que no existen variables cualitativas.
hist((bd_eua$EU.Without.UK),col=c("lightgreen"),main="Exports for EU (without UK)",xlab="Unidades")De las unidades exportadas de Estados Unidos a la Unión Europea sin el Reino Unido, se tienen desde 3 mil millones hasta 7 mil millones, siendo el mayor rango de 5 mil millones a 6 mil millones. Esto tomando en cuenta los años desde el 2008 hasta el 2021.
hist((bd_eua$EU28),col=c("lightblue"),main="Exports for EU (with UK)",xlab="Unidades")
Tomando en cuenta a la Unión Europa con el Reino Unido, las unidades de
vehículos exportados van desde los 3 mil millones hasta los 9 mil
millones de unidades. Siendo la mayor frecuencia desde los 5 mil
millones hasta los 6 mil millones. Sin embargo, en este caso, se tiene
un importante número de unidades exportadas desde los 6 mil millones
hasta lo 8 mil millones.
plot(bd_eua$Year,bd_eua$WORLD, main = "Año y cantidad de exportaciones", xlab="Año",ylab="Mundo",
pch = 19, frame = FALSE,col=c("orange"))Notamos como el año con mayores exportaciones de parte de EUA es el 2018, y el menor 2009 (posiblemente debido a la crisis). Del 2010 hasta el 2018 vemos un importante crecimiento de los 6 billones de vehículos exportados hasta los 9 billones.
boxplot(bd_eua$CAFTA,col=c("orange"))En cuanto a los vehículos exportados hacia la zona de Centroamérica y los Estados Unidos, vemos que la mayoría de las exportaciones se concentran entre los 350 millones hasta los 450 millones, con un promedio de apróximadamente los 375 millones. Sin embargo, el rango va desde los 300 millones hasta los 550 millones de vehículos exportados a esta zona.
# install.packages("psych")
library(psych)
#describe(bd_colab)
Variables <-c("Edad","Alta","Salario Diario")
Media <-c("35.45","2020.69","179.35")
Mediana <-c("33","2022","180.68")
Moda<-c("32","2022","180.68")
Desviacion_estandar <-c("12.20","2.34","25.17")
Rango<-c("48","12","192.6")
table<-data.frame(Variables,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variables | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Edad | 35.45 | 33 | 32 | 12.20 | 48 |
| Alta | 2020.69 | 2022 | 2022 | 2.34 | 12 |
| Salario Diario | 179.35 | 180.68 | 180.68 | 25.17 | 192.6 |
A partir de estos estadísticos descriptivos de los colaboradores
ACTUALES de FORM, observamos que tenemos solo 3 variables cuantitativas,
por lo tanto solo estas serán descritas.
1. Edad: La media o el promedio es de 35.45 años, la
mediana es de 33 años, y la moda es 32 años. A partir de esto
comprendemos que existen muchos colaboradores que son adultos en sus
treintas (relativamente jóvenes). La desviación es de 12.20, por lo que
comprendemos que la edad se desvía de la media aproximademento por 12
años; la mayoría de los datos están en este rango (+12,-12). Finalmente,
con el máximo y el mínimo de las edades obtenemos el rango de edad: 48
años.
2. Año de alta: Observamos que la media es durante la
última parte del 2020, la mediana y la moda es el 2022. Por otra parte,
vemos que la desviación es de 2.34. Por lo tanto, podemos notar como es
que la mayoría de las personas que están actualmente en FORM no tienen
mucha antigüedad, ya que ingresaron durante los últimos (aprox) 4 años.
Viendo que el rango es de 12 años, no se tiene mucha antigüedad de parte
de la mayoría.
3. Salario Diario: En el salario diario observamos que
la moda y la mediana es de $180.68, por lo que podemos concluir que es
un número altamente repetido en los colaboradores actuales. Mientras que
la mediana es un poco inferior, $179.39, con lo que podemos inferir que
existen más personas por debajo de $180.68 que arriba de. En cuanto a la
desviación, encontramos que es de 25.17 pesos, se asume que los salarios
no están muy dispersos. La diferencia entre el menor y el mayor de
$192.6.
# install.packages("psych")
library(psych)
#describe(bd_bajas)
Variables <-c("Edad","Duracion","Salario Diario")
Media <-c("30.77","75.59","177.93")
Mediana <-c("29","20.50","180.68")
Moda<-c("21","20.5","180.68")
Desviacion_estandar <-c("9.69","215.50","23.41")
Rango<-c("43","1966","355.55")
table<-data.frame(Variables,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variables | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Edad | 30.77 | 29 | 21 | 9.69 | 43 |
| Duracion | 75.59 | 20.50 | 20.5 | 215.50 | 1966 |
| Salario Diario | 177.93 | 180.68 | 180.68 | 23.41 | 355.55 |
A partir de estos estadísticos descriptivos de los colaboradores
PASADOS de FORM, observamos que tenemos solo 3 variables cuantitativas,
por lo tanto solo estas serán descritas.
1. Edad: La media o el promedio es de 30.77 años, la
mediana es de 29 años, y la moda es 21 años. A partir de esto
comprendemos que existen muchos colaboradores que son adultos en sus
veintes y treintas (jóvenes). La desviación es de 9.69, por lo que
comprendemos que la edad se desvía de la media aproximademento por 10
años; la mayoría de los datos están en este rango de 20 a 40 aprox.
Finalmente, con el máximo y el mínimo de las edades obtenemos el rango
de edad: 43 años. Las edades de los que se han dado de baja son menores
a los que siguen en la empresa.
2. Duración: Observamos que la media es de 75.59 días,
la mediana y la moda es 20.5; por lo tanto asumimos que hay personas que
duraron mucho más que la mayoría (debido a la diferencia entre la media
y la mediana y moda). Vemos que la desviación es de 215.5 días, lo cual
puede ser considerado mucho observando la mediana, moda y la media; es
por esto que resulta interesante ver el rango, ya que la diferencia
entre la persona que menos duró y salió, y la que más duró y salió es de
1966 (gran cantidad de días de diferencia).
3. Salario Diario: En el salario diario observamos que
la moda y la mediana es de $180.68, por lo que podemos concluir que es
un número altamente repetido en los colaboradores actuales. Mientras que
la mediana es un poco inferior, $177.93, con lo que podemos inferir que
existen más personas por debajo de $180.68 que arriba de. En cuanto a la
desviación, encontramos que es de 23.41 pesos, se asume que los salarios
no están muy dispersos. La diferencia entre el menor y el mayor de
$355.55; hubieron personas que ganaban mucho más que el promedio.
# install.packages("psych")
library(psych)
#describe(bd_prod)
Variables <-c("Piezas programadas","Tiempo mínimo","Láminas procesadas","Tiempo calidad" )
Media <-c("183.40","22.04","78.84","0.89" )
Mediana <-c("120","20","41","1" )
Moda<-c("200","20","0","1")
Desviacion_estandar <-c("169.45","12.32","103.18","0.70" )
Rango<-c("1999","110","803","11")
table<-data.frame(Variables,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variables | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Piezas programadas | 183.40 | 120 | 200 | 169.45 | 1999 |
| Tiempo mínimo | 22.04 | 20 | 20 | 12.32 | 110 |
| Láminas procesadas | 78.84 | 41 | 0 | 103.18 | 803 |
| Tiempo calidad | 0.89 | 1 | 1 | 0.70 | 11 |
Viendo las variables cuantitativas de la producción de julio, agosto,
y septiembre de FORM, podemos analizar lo siguiente:
1.Piezas programadas: En esta caso resulta interesante
empezar con el rango: 1999. Por lo que asumimos que el valor mayor es de
2000 piezas programadas, y lo menor ha sido 0 en diferentes días. Vemos
que la media es de 183.40 piezas, la mediana es de 120 piezas, y la moda
de 200; asumimos que lo común es que en un día se programen no más de
200 piezas, y que solo en casos “espaciales” llegue a los miles. La
desviación estandar no es muy alta, considerando el rango, esta es de
169.45 piezas programadas; lo “normal” es que las piezas e stén entre
las 0 y las 400 piezas programadas.
2. Tiempo mínimo: Importante recordar que esta variable
se mide en minutos. La media es de 22.05, la mediana y la moda de 20,
por lo que asumimos que muchos datos se encuentran en los veinte (+/-)
minutos de calidad de producción. La desviación estandar es de 12.32, lo
cual no es mucha dispersión considerando que el rango es de 110 minutos.
El tiempo mínimo ha variado dependiendo de la orden, hasta llegar a casi
dos horas.
3. Láminas procesadas: La media de las láminas
procesadas en estos meses es de 78.84, la mediana de 41, y la moda de 0.
Con esto comprendemos que la mayoría de los días no se procesó ninguna
láminas, pero que los otros días no seguían una tendencia clara. La
desviación es de 103.18 láminas procesadas y el rango de 803
láminas.
4. Tiempo calidad: Importante recordar que esta
variable se mide en minutos. La mayoría de los datos se encuentran entre
el 0 y 1 minuto de calidad, de acuerdo al análisis previo, por lo tanto
aquí también observamos que la media es de 0.89 (acercándose más a 1
minuto), la mediana es de 1 y la moda es de 1. Lo más común de ver en
FORM en cuanto a tiempo de calidad de su producción es de un minuto. La
desviación es poca (0.70), considerando que el rango es de 11 minutos.
Los datos no están muy dispersos.
# install.packages("psych")
library(psych)
#describe(scrap_finalya)
Variable <-c("Cantidad")
Media <-c("6.70")
Mediana <-c("2")
Moda<-c("1")
Desviacion_estandar <-c("11.85")
Rango<-c("96")
table<-data.frame(Variable,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variable | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Cantidad | 6.70 | 2 | 1 | 11.85 | 96 |
En esta caso solo encontramos una variable cuantitativa a
analizar:
1. Cantidad de scrap: observamos que el promedio del
scrap es de 6.70, la mediana es de 2 y la moda es de 1; comprendemos que
la mayoría de los valores en este base de datos están entre 1 y 2.
Aunque el rango es de 96, la desviación es de 11.85, por lo que se puede
asumir que lo común es que la cantidad no pase de 20.
# install.packages("psych")
library(psych)
#describe(bd_merma_f)
Variable <-c("Kilos")
Media <-c("3,708.52")
Mediana <-c("3,925")
Moda<-c("3,810")
Desviacion_estandar <-c("1,023.99")
Rango<-c("5,350")
table<-data.frame(Variable,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variable | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Kilos | 3,708.52 | 3,925 | 3,810 | 1,023.99 | 5,350 |
En esta caso solo encontramos una variable cuantitativa a
analizar:
1. Kilos de merma: la media es de 3,708.52 kgs, la
mediana es de 3,925 kgs, y la moda es de 3,810 kgs; se asume que lo
común es encontrar kilos de merma en los 3,000 por vez. El rango es de
5,350 kgs y la desviación es de 1,023.99 kgs; se considera que los datos
están algo dispersos.
# install.packages("psych")
library(psych)
describe(bd_delperf)## vars n mean sd median trimmed mad min max range skew kurtosis
## cliente* 1 104 2.75 1.10 2.5 2.81 1.48 1 4.0 3.0 -0.07 -1.46
## fecha* 2 104 7.00 3.76 7.0 7.00 4.45 1 13.0 12.0 0.00 -1.25
## dif 3 104 0.30 0.56 0.0 0.20 0.00 0 3.3 3.3 2.27 6.81
## se
## cliente* 0.11
## fecha* 0.37
## dif 0.06
Variable <-c("Diferencia (delay performance)")
Media <-c("0.30")
Mediana <-c("0.0")
Moda<-c("0.0")
Desviacion_estandar <-c("0.56")
Rango<-c("3.3")
table<-data.frame(Variable,Media,Mediana,Moda,Desviacion_estandar,Rango)
knitr::kable(table)| Variable | Media | Mediana | Moda | Desviacion_estandar | Rango |
|---|---|---|---|---|---|
| Diferencia (delay performance) | 0.30 | 0.0 | 0.0 | 0.56 | 3.3 |
En esta caso solo encontramos una variable cuantitativa a
analizar:
1. Delay performance: observamos en esta variable como
la media es de 0.3 minutos, la moda y la mediana es de 0. En esto
encontramos que la normal es que no haya un delay en las
entregas, y al observar el rango (3.3) vemos que aún lo más “radical” es
muy poco.
# install.packages("psych")
library(psych)
#describe(bd_delplan)
Variables <-c("Pedidos")
Media <-c("1,703.14")
Mediana <-c("0")
Moda<-c("0")
Desviacion_estandar <-c("6,164.04")
table<-data.frame(Variables,Media,Mediana,Moda,Desviacion_estandar)
knitr::kable(table)| Variables | Media | Mediana | Moda | Desviacion_estandar |
|---|---|---|---|---|
| Pedidos | 1,703.14 | 0 | 0 | 6,164.04 |
En esta caso solo encontramos una variable cuantitativa a
analizar:
1. Pedidos: En los pedidos encontramos que lo común es
tener 0 (debido a la moda y la mediana), pero que a partir de la gran
dispersión de los datos la media (1,703.14 pedidos) crece. O se pueden
tener muchos pedidos o ningún pedido mes con mes.
bd_prodd<-read.csv("/Users/elenavela/produccion_final2.csv")pie((prop.table(table(bd_prodd$client))),col=c("lightgreen","lightyellow","lightblue","pink"),main="Clientes",las=1)En la producción analizamos los principales clientes de FORM, en este mismo, a partir de los porcentajes, comprendemos que Stabilus 1 y Stabilus 3 consiste en el 51.1% de todos los pedidos hechos por los clientes. TRMX también hace un pedido importante a FORM, representando un 20.3% en los últimos tres meses. Hay tres: Hanon Systems, Hella, y Meridian Lightweight que no conforman más del 4%.
porcentajes <- as.numeric(round(((prop.table(table(scrap_finalya$ubi_origen)))*100),2))
etiquetas <- c("Calidad/Entrega de PT","Post-Producción","Pre-Producción")
etiquetas <- paste(etiquetas, porcentajes)
etiquetas <- paste(etiquetas, "%", sep = "")
pie(porcentajes,etiquetas,col=c("pink","lightblue","lightyellow"),main="Ubicación de origen: Scrap", ylab ="Frecuencias",las=1)Como se vió anteriormente, notamos como el scrap se encuentra por lo general (casi tres de cuatro veces) en la pre-producción, y casi nunca en la post-producción.
Con la siguiente función podremos identificar los principales clientes para generar un análisis con la información relevante, pues hay clientes con pocos o sin pedidos por lo que generar un diagnóstico respecto a delivery plan con esos datos no es necesario.
ggplot(bd_delplan, aes(x=reorder(cliente,pedidos), y=pedidos)) +
geom_bar(stat="identity")+
coord_flip()Como siguiente paso eliminaremos todos los clientes que no nos interesan para el análisis y dejaremos el top 6 de clientes para el ejercicio.
bd_delplan2 <- bd_delplan
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="ABC QUERETARO",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="ANTOLIN ARTEAGA",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="ANTOLIN TOLUCA",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="ISRI",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="SEGROVE",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="STB 1",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="UFI",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="YF QRO",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="INOAC POLYTEC",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="HANON",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="MERIDIAN",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="YF RAMOS",]
bd_delplan2<-bd_delplan2[bd_delplan2$cliente!="YANFENG sm",] Se cambian la fecha a un formato que permite ver mejor el análisis en las tablas (se sobreponían).
bd_delplan5<-bd_delplan2
bd_delplan5$fecha[bd_delplan5$fecha == "jan-2022"] <- "jan22"
bd_delplan5$fecha[bd_delplan5$fecha == "feb-2022"] <- "feb22"
bd_delplan5$fecha[bd_delplan5$fecha == "mar-2022"] <- "mar22"
bd_delplan5$fecha[bd_delplan5$fecha == "abr-2022"] <- "abr22"
bd_delplan5$fecha[bd_delplan5$fecha == "may-2022"] <- "may22"
bd_delplan5$fecha[bd_delplan5$fecha == "jun-2022"] <- "jun22"
bd_delplan5$fecha[bd_delplan5$fecha == "jul-2022"] <- "jul22"
bd_delplan5$fecha[bd_delplan5$fecha == "ag-2022"] <- "ag22"
bd_delplan5$fecha[bd_delplan5$fecha == "sep-2022"] <- "sep22"
bd_delplan5$fecha[bd_delplan5$fecha == "oct-2022"] <- "oct22"
bd_delplan5$fecha[bd_delplan5$fecha == "nov-2022"] <- "nov22"
bd_delplan5$fecha[bd_delplan5$fecha == "dic-2022"] <- "dic22"gráfica con 3 variables
ggplot(bd_delplan5,aes(x=fecha, y=pedidos,fill=cliente))+
geom_bar(stat="identity")+
geom_hline(yintercept=33,linetype="dashed",color="black")+
labs(x="Fecha",y="Número de pedidos", color="Legend")+
ggtitle("Pedidos por fecha")En esta gráfica que une tres variables del delivery plan, observamos la cantidad de pedidos, por cliente, por fecha. En esta vemos como en todos los meses (menos oct, nov y dic) Hella ha estado muy presente como cliente, por lo general superando los 10,000, hasta casi 70,000 pedidos. YFTO es el cliente, de este pool que tiene menos pedidos a través de los meses.
#as.data.frame(bd_bajas)
#as.data.frame(bd_colab)bd_colab2<-bd_colab %>% dplyr::select(genero,edad,salario_diario) %>% dplyr::group_by(genero) %>%
dplyr::summarise(across(everything(),mean,na.rm=TRUE)) %>% arrange(desc(edad))
ggplot(bd_colab2, aes(x=reorder(genero,edad), y=edad, fill=(salario_diario))) +
geom_bar(stat="identity",col=c("black"))+
coord_flip()+
guides(fill=guide_legend(reverse=FALSE))La primera gráfica de barras nos da a conocer sobre el salario diario de las personas de Form, segmentado por edad y por género. Lo que nos da a conocer es que en la empresa existe un mayor rango de edad entre las mujeres de Form, llegando a ser casi 40 lo mayor; por otra parte, los hombres presentan un menor rango, con un máximo de (aprox) 33. Igualmente, vemos que en promedio las mujeres ganan 60 centavos más que los hombres.
bd_colab3<-bd_colab
bd_colab3$genero[bd_colab$genero == "FEMENINO"] <- "F"
bd_colab3$genero[bd_colab$genero == "MASCULINO"] <- "M"ggplot(bd_colab3, aes(x=genero, y=salario_diario, fill=genero)) +
geom_bar(stat="identity") +
facet_grid(~civil) + scale_fill_brewer(palette = "Set2")Esta segunda gráfica descriptiva de los actuales colaboradores de Form, nos comunica, principalmente, el estado civil de los colaboradores por género, y su ganancia. Lo que podemos notar es que en general, las mujeres ganan más en cualquier estado civil en el que se encuentren, y en donde se puede ver una mayor variedad de la suma de los salarios es en las mujeres y los hombres que se encuentran en unión libre, ya que las mujeres en unión libre suman casi el doble que los hombres en unión libre.
bd_bajas2<-bd_bajas %>% dplyr::select(motivo_baja,edad,duracion) %>% group_by(motivo_baja) %>%
dplyr::summarise(across(everything(),mean,na.rm=TRUE)) %>% arrange(desc(edad))
ggplot(bd_bajas2, aes(x=reorder(motivo_baja,edad), y=edad, fill=(duracion))) +
geom_bar(stat="identity",col=c("black"))+
coord_flip()+
guides(fill=guide_legend(reverse=FALSE))Viendo ahora los colaboradores que han sido dados de baja en la empresa, vemos que la gran parte de los que se han salido de Form tienen menos de 30 años. Pocos casos han sido de jubilación, llegando a más de 60 en rango. Igualmente, a partir de la gráfica vemos que las razones principales son por abandono y baja por faltas; durando menos de 500 días en su trabajo.
ggplot(bd_bajas, aes(x=genero, y=salario_diario, fill=genero)) +
geom_bar(stat="identity") +
facet_grid(~civil) + scale_fill_brewer(palette = "Set2")Finalmente, observamos la última gráfica descriptiva de los colaboradores que han sido dados de baja de Form. Observamos que la mayor cantidad (se asume por la suma de salario diario) han sido solteros, y una gran cantidad de mujeres casadas. Por lo tanto, podemos asumir a partir de los datos que la mayoría de los que abandonan su trabajo en Form son personas solteras. Por otra parte, vemos que las mujeres en matriminio suman más ganancias que los hombres en matrimonio. Las mujeres, en todas los estados civiles, han ganado más; estto pudiera verse también debido a que más del 50% de las personas en esta base dee datos son mujeres.
ggplot(bd_merma_f, aes(x= Mes, y= Kilos)) + geom_bar(stat="identity", fill="red") + scale_fill_grey() + labs(title = "Kilos de merma", x = "Fecha")En esta gráfica podemos observar los meses que superan el promedio o lo “normal” de los kilos de merma; en este caso vemos que el mes de agoosto destaca como aquel con más kilos, mientras que septiembre es el que demuestra teener menos. Comparamos lo más de 30,000 kilos en agosto con los casi 15,000, por lo que es casi el doble.
hist(scrap_finalya$cantidad, main = "Cantidad de Material Reciclado", xlab = "Cantidad", ylab = "Frecuencia",col = "blue")Este histograma nos muestra que entre 0 a 10 toneladas de “scrap” es lo que mas se frecuenta a reciclar el material. Se observan muy pocos casos que superan los 20.
plot(scrap_finalya$fecha, scrap_finalya$cantidad, main = "Cantidad de Scrap por fecha", xlab = "Fecha", ylab = "Cantidad")Viendo el mes de agosto para el “scrap”, obserevamos que la mayoría de los días manejan menos de 20 unidades de material, sin embargo, existen algunos casos en que se sale de lo “normal” como vemos aproximadamente el día 24 de agosto, en donde la cantidad de scrap superó el número 80.
Pedidos
plot(bd_delplan5$ID_fecha, bd_delplan5$pedidos, main = "Pedidos por número de mes",
xlab = "Mes", ylab = "Pedidos",col=c("orange"),
pch = 1, frame = FALSE)Teniendo los meses como números del año, vemos como la mayoría de los meses cuentan con pedidos de menos de 10,000; sin embargo, algunos meses presentan pedidos “extraordinarios”, como lo fue juno y agosto, que estuvieron entren 40,000 y 50,000.
boxplot(bd_delplan5$pedidos, main = "Pedidos",col=c("orange"))Como primer boxplot vemos los pedidos y la gran dispersión que hay entre pedidos, pues detectamos una frecuencia en donde hay clientes que generan pedidos obviamente diferentes como para tener una mediana o una dispersión positiva. Esto mismo lo pudimos ver anteriormente, como la mayoría de los pedidos no superan los 10,000, y que existen casos “extraordinarios” que van muy por arriba de este número.
Clientes
Después de generar un boxplot de pedidos en general, realizamos un boxplot que nos muestra los pedidos por cliente
bd_delplan4 <- bd_delplan5
bd_delplan4$cliente<-as.factor(bd_delplan4$cliente)
ggplot(bd_delplan4, aes(x=cliente, y=pedidos)) +
geom_boxplot(color="red", fill="orange", alpha=0.2)En el gráfico anterior podemos observar a los 6 clientes con mayor presencia en FORM en cuanto a Delivery Plan en donde el objetivo es ver la dispersión y la distribución entre cada uno y respecto a los pronósticos individuales.
El cliente HELLA es el cliente con una mayor distribución y dispersión. Varroc y TRMX tienen también una distribución mayor al tener la boxplot más grande, mientras que los demás; DENSO, STB3 y YFTO tienen la mayoría de sus pedidos en un mismo rango con pequeños datos fuera del boxplot presentando algunos warnings.
Se puede concluir, que HELLA es el cliente más fuerte en dicha base de datos para la empresa, pero que sus pedidos varçian de cantidad.
dp_data<-read.csv("/Users/elenavela/Downloads/student_dp_form.csv")
summary(dp_data)## fecha cliente delay_performance
## Length:52 Length:52 Min. : 0.00
## Class :character Class :character 1st Qu.: 0.00
## Mode :character Mode :character Median : 0.00
## Mean :16.07
## 3rd Qu.:29.38
## Max. :71.25
str(dp_data)## 'data.frame': 52 obs. of 3 variables:
## $ fecha : chr "7/31/2021" "7/31/2021" "7/31/2021" "7/31/2021" ...
## $ cliente : chr "PRINTEL " "MAHLE" "MAGNA" "VARROC" ...
## $ delay_performance: num 4.9 15.7 0 0 27.7 ...
dp_data$fecha<-as.Date(dp_data$fecha,format="%m/%d/%Y")
str(dp_data)## 'data.frame': 52 obs. of 3 variables:
## $ fecha : Date, format: "2021-07-31" "2021-07-31" ...
## $ cliente : chr "PRINTEL " "MAHLE" "MAGNA" "VARROC" ...
## $ delay_performance: num 4.9 15.7 0 0 27.7 ...
ggplot(dp_data,aes(x=fecha, y=delay_performance,color=cliente))+
geom_line()+
labs(x="Fecha",y="Retraso en Minutos", color="Legend")+
ggtitle("Retrasos en el desempeño, por tiempo")A partir de esta gráfica, comparamos a los clientes, y como ha sido el retraso en minutos en cuantto a las entregas. Vemos como la que se mantiene constante es Varroc, puesto que no ha visto mucho diferencia ni “delay”. Sin embargo, en el caso de Mahle vemos retrasos duranett todo el año, pero que durante los últimos meses ha podido bajar. El caso de Printel, vemos como sus retrasos no exceden la media hora, pero que no han habido inidicios de retrasos desde abril.
dp_data<-dp_data[dp_data$cliente!="Magna",]
dp_data<-dp_data[dp_data$cliente!="Varroc",]
ggplot(dp_data,aes(x=fecha, y=delay_performance,fill=cliente))+
geom_bar(stat="identity")+
geom_hline(yintercept=33,linetype="dashed",color="black")+
labs(x="Fecha",y="Retraso en minutos", color="Legend")+
ggtitle("Retrasos en el desempeño por cliente")A pesar de que esta disminuyendo el retraso con el cliente Mahle seguimos viendo que se encuentra por arriba del promedio, y que es mucho mayor que aquellos retrasos presentados con Printel.
base_eua<-read.csv("/Users/elenavela/Downloads/us_motor_production_and_domestic_sales.csv")
summary(base_eua)## Year Total_Production Production_Passenger_Cars
## Min. :2007 Min. : 5710 Min. :1924
## 1st Qu.:2010 1st Qu.: 8709 1st Qu.:2745
## Median :2014 Median :10823 Median :3382
## Mean :2014 Mean :10077 Mean :3326
## 3rd Qu.:2017 3rd Qu.:11268 3rd Qu.:4061
## Max. :2020 Max. :12179 Max. :4369
## Production_Commercial_Vehicles Domestic_Sales Sales_Passenger_Cars
## Min. :3514 Min. : 7868 Min. :2560
## 1st Qu.:5820 1st Qu.:10474 1st Qu.:3865
## Median :6891 Median :12583 Median :4542
## Mean :6751 Mean :11996 Mean :4491
## 3rd Qu.:8095 3rd Qu.:13669 3rd Qu.:5184
## Max. :8512 Max. :14128 Max. :5610
## Sales_Commercial_Vehicles US_Unemployment US_Consumer_Confidence
## Min. : 4309 Min. :3.680 Min. :63.75
## 1st Qu.: 6088 1st Qu.:4.685 1st Qu.:73.02
## Median : 7634 Median :5.980 Median :82.83
## Mean : 7505 Mean :6.430 Mean :82.29
## 3rd Qu.: 8964 3rd Qu.:8.088 3rd Qu.:92.67
## Max. :10133 Max. :9.610 Max. :98.37
## US_Min_Hour_Wage
## Min. :5.500
## 1st Qu.:7.250
## Median :7.250
## Mean :7.025
## 3rd Qu.:7.250
## Max. :7.250
Se cambian los nombres de las columnas.
names (base_eua) = c("año", "prod_total", "prod_passenger", "prod_veh_comerciales", "ventas_domesticas", "ventas_passenger","ventas_comerciales","desempleo_usa","confianza_cons_usa","salario_hora_min_usa")
names (base_eua)## [1] "año" "prod_total" "prod_passenger"
## [4] "prod_veh_comerciales" "ventas_domesticas" "ventas_passenger"
## [7] "ventas_comerciales" "desempleo_usa" "confianza_cons_usa"
## [10] "salario_hora_min_usa"
str(base_eua)## 'data.frame': 14 obs. of 10 variables:
## $ año : int 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 ...
## $ prod_total : num 10752 8672 5710 7744 8662 ...
## $ prod_passenger : num 3867 3731 2196 2732 2978 ...
## $ prod_veh_comerciales: num 6885 4941 3514 5012 5685 ...
## $ ventas_domesticas : num 12687 10108 7868 9020 10109 ...
## $ ventas_passenger : num 5197 4491 3558 3792 4146 ...
## $ ventas_comerciales : num 7490 5617 4309 5229 5963 ...
## $ desempleo_usa : num 4.62 5.8 9.28 9.61 8.93 8.08 7.36 6.16 5.28 4.88 ...
## $ confianza_cons_usa : num 85.6 63.8 66.3 71.8 67.3 ...
## $ salario_hora_min_usa: num 5.5 6.2 6.9 7.25 7.25 7.25 7.25 7.25 7.25 7.25 ...
En este caso, se escoge como variable dependiente las ventas de los carros passenger, por ello entiéndase los automóviles de uso cotidiano en Estados Unidos. Para esta variable dependiente, se han tomado las siguientes variables independientes, con el fin de notar su efecto en las ventas. Estas son:
1. Desempleo USA: este índice es calculado anualmente con la formula. (Unemployed ÷ Labor Force) x 100. Entre menor mejor. Se mide en porcentaje.
2. Confianza del consumidor de USA: índice que mide, a partir de una encuesta que tan optimistas o pesimistas se encuentran los consumidores sobre su situación financiera. Entre mayor, mejor; se mide por puntos.
3. Salario mínimo por hora: se mide en dólares. Está establecido a nivel federal.
4. Año: los años que se tienen de los datos, 2007-2020.
regresion1 <- lm (ventas_passenger ~ desempleo_usa + confianza_cons_usa + salario_hora_min_usa + año, data=base_eua)
summary (regresion1)##
## Call:
## lm(formula = ventas_passenger ~ desempleo_usa + confianza_cons_usa +
## salario_hora_min_usa + año, data = base_eua)
##
## Residuals:
## Min 1Q Median 3Q Max
## -850.29 -560.86 88.28 446.55 847.47
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 646180.04 197959.50 3.264 0.00977 **
## desempleo_usa -255.04 217.62 -1.172 0.27129
## confianza_cons_usa 46.68 41.57 1.123 0.29062
## salario_hora_min_usa 1394.06 697.08 2.000 0.07657 .
## año -324.65 100.49 -3.231 0.01031 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 712.5 on 9 degrees of freedom
## Multiple R-squared: 0.5831, Adjusted R-squared: 0.3978
## F-statistic: 3.147 on 4 and 9 DF, p-value: 0.0707
Para que una variable tenga significancia en la regresión, se desea que p<0.05
Al correr la regresión las ventas de los autos tipo passenger, observamos que existe una variable con mayor significancia, la cual es “año”. Se ha decidido quitar la variable de “confianza_cons_usa” para ver la nueva significancia del modelo:
regresion1_2 <- lm (ventas_passenger ~ desempleo_usa + salario_hora_min_usa + año, data=base_eua)
summary (regresion1_2)##
## Call:
## lm(formula = ventas_passenger ~ desempleo_usa + salario_hora_min_usa +
## año, data = base_eua)
##
## Residuals:
## Min 1Q Median 3Q Max
## -971.5 -594.0 41.6 556.5 862.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 558612.65 184300.29 3.031 0.0127 *
## desempleo_usa -440.19 143.83 -3.060 0.0120 *
## salario_hora_min_usa 1554.95 691.01 2.250 0.0482 *
## año -279.22 93.18 -2.997 0.0134 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 721.8 on 10 degrees of freedom
## Multiple R-squared: 0.5247, Adjusted R-squared: 0.3821
## F-statistic: 3.68 on 3 and 10 DF, p-value: 0.05096
Ahora, vemos que las tres variables independientes si demuestran significancia pueso que la p es menor que 0.05. Se utilizará mejor este modelo para la predicción de ventas de autos tipo paassenger.
Para la tasa de desempleo se ha decidido tomar el promedio del 2007 al 2020, para poder predecir. Con el salario mínimo por hora, al ser establecido a nivel federal, se toma en cuenta la última cantidad: $7.25 dólares. Se quieren las predicciones para los siguientes cinco años, a partir del último año con datos (2020).
A partir de este modelo de regresión, se conoce lo siguiente a partir
del estimate:
1. Al subir una unidad del índice de desempleo de EUA, se bajan 400.19
de las ventas de los vehículos passenger.
2. Al subir una unidad (dólar) del salario mínimo por hora de EUA, se
incrementan las ventas por 1,554.95.
3. Con el pasar de cada año, se espera que las ventas de este tipo de
auto disminuyan por 279.22.
datos_nuevos1 <- data.frame(desempleo_usa=6.43,salario_hora_min_usa=7.25,año=2021:2025)
predict(regresion1_2,datos_nuevos1)## 1 2 3 4 5
## 2746.480 2467.257 2188.035 1908.812 1629.589
¿Qué observamos?
primer <- plot(predict(regresion1_2,datos_nuevos1), type = "l", xlab = "Año", ylab ="Ventas Passenger", main="Predicción de Ventas")En esta predicción de ventas de automóviles passenger, observamos que es hacia abajo. Es decir, tomando en cuenta una tasa de desempleo de 6.43 y el salario mínimo por hora de $7.25, se espera que las ventas de estos automóviles bajen en EUA del 2021 hasta 2025.
library(jtools)##
## Attaching package: 'jtools'
## The following object is masked from 'package:epiDisplay':
##
## summ
¿Cómo es el impacto de dichas variables explanatorias sobre la variable dependiente?
effect_plot(regresion1_2,pred=desempleo_usa,interval=TRUE)Si tomamos en cuenta la tasa de desempleo de EUA, y su relación con las ventas de los automóviles passenger, observamos que esta es NEGATIVA. Debido a que al crecer la tasa de desempleo, bajan las ventas.
effect_plot(regresion1_2,pred=salario_hora_min_usa,interval=TRUE)Sin embargo, se conoce que al subir el salario mínimo por hora, se espera que las ventas de los automóviles passenger incrementan. La relación
effect_plot(regresion1_2,pred=año,interval=TRUE)Con el pasar de los años las ventas han decrecido, la relación es NEGATIV.
En este caso, se escoge como variable dependiente las ventas de los
carros comerciales, por ello entiéndase los cualquier tipo de
vehículo de motor utilizado para transportar mercancías o pasajeros en
Estados Unidos. Para esta variable dependiente, se han tomado las
siguientes variables independientes, con el fin de notar su efecto en
las ventas. Estas son:
1. Desempleo USA: este índice es calculado anualmente
con la formula. (Unemployed ÷ Labor Force) x 100. Entre menor mejor. Se
mide en porcentaje.
2. Confianza del consumidor de USA: índice que mide, a partir de una encuesta que tan optimistas o pesimistas se encuentran los consumidores sobre su situación financiera. Entre mayor, mejor; se mide por puntos.
3. Salario mínimo por hora: se mide en dólares. Está establecido a nivel federal.
4. Año: los años que se tienen de los datos, 2007-2020.
regresion2 <- lm (ventas_comerciales ~ desempleo_usa + confianza_cons_usa + salario_hora_min_usa + año, data=base_eua)
summary (regresion2)##
## Call:
## lm(formula = ventas_comerciales ~ desempleo_usa + confianza_cons_usa +
## salario_hora_min_usa + año, data = base_eua)
##
## Residuals:
## Min 1Q Median 3Q Max
## -731.58 -87.12 57.56 160.03 513.82
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -588817.41 97672.75 -6.028 0.000196 ***
## desempleo_usa -147.24 107.37 -1.371 0.203504
## confianza_cons_usa 50.55 20.51 2.464 0.035896 *
## salario_hora_min_usa -839.15 343.94 -2.440 0.037374 *
## año 297.49 49.58 6.000 0.000203 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 351.6 on 9 degrees of freedom
## Multiple R-squared: 0.9732, Adjusted R-squared: 0.9613
## F-statistic: 81.82 on 4 and 9 DF, p-value: 4.516e-07
Aunque en la mayoría de las variables demuestran significancia en las ventas de autos comerciales, se ha decidido eliminar la variable dependendiente de “Índice de Desempleo de EUA”, debido a que su nivel de p no demuestra mucha significancia (0.20)
regresion2_2 <- lm (ventas_comerciales ~ confianza_cons_usa + salario_hora_min_usa + año, data=base_eua)
summary (regresion2_2)##
## Call:
## lm(formula = ventas_comerciales ~ confianza_cons_usa + salario_hora_min_usa +
## año, data = base_eua)
##
## Residuals:
## Min 1Q Median 3Q Max
## -803.8 -176.2 67.8 197.9 549.5
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -607695.96 100864.56 -6.025 0.000128 ***
## confianza_cons_usa 71.87 13.96 5.148 0.000433 ***
## salario_hora_min_usa -1117.90 289.39 -3.863 0.003145 **
## año 306.50 51.26 5.979 0.000136 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 366.7 on 10 degrees of freedom
## Multiple R-squared: 0.9676, Adjusted R-squared: 0.9579
## F-statistic: 99.69 on 3 and 10 DF, p-value: 9.47e-08
Viendo este nuevo modelo de regresión para las ventas de autos
comerciales, vemos que ahora todas las variables independientes
seleccionadas tienen una mayor significancia. Esto nos dice el
modelo:
1. Al subir una unidad del índice de confianza del consumidor de EUA,
incrementa 71.87 de las ventas de los vehículos
commercial.
2. Al subir una unidad (dólar) del salario mínimo por hora de EUA,
disminuyen las ventas por 1,117.9.
3. Con el pasar de cada año, se espera que las ventas de este tipo de
auto aumentan por 306.5.
Para el índice de confianza del consumidor, se ha decidido tomar el promedio del 2007 al 2020, para poder predecir. Con el salario mínimo por hora, al ser establecido a nivel federal, se toma en cuenta la última cantidad: $7.25 dólares. Se quieren las predicciones para los siguientes cinco años, a partir del último año con datos (2020).
datos_nuevos2 <- data.frame(confianza_cons_usa=82.3,salario_hora_min_usa=7.25,año=2021:2025)
predict(regresion2_2,datos_nuevos2)## 1 2 3 4 5
## 9552.768 9859.269 10165.770 10472.271 10778.772
¿Qué observamos?
segundo <- plot(predict(regresion2_2,datos_nuevos2), type = "l", xlab = "Año", ylab ="Ventas Comerciales", main="Predicción de Ventas")En esta predicción de ventas de automóviles comerciales, observamos que es hacia arriba. Es decir, tomando en cuenta un índice de confianza de 82.3 y el salario mínimo por hora de $7.25, se espera que las ventas de estos automóviles suban en EUA del 2021 hasta 2025. En el caso de las ventas de automóviles comerciales, notamos que el pasar de los años y el índice de confianza del consumidor son las variable que más impactan, siguiendo por el salario mínimo por hora.
effect_plot(regresion2_2,pred=confianza_cons_usa,interval=TRUE)El índice de confianza del consumidor de EUA, y su relación con las ventas de los automóviles comerciales, observamos que esta es POSITIVA. Debido a que al crecer la confianza, incrementan las ventas. A comparación de la gráfica de ventas passenger con el nivel de confianza, observamos que en este caso la pendiente es más pronunciada, por lo que vemos un mayor impacto.
¿Cómo es el impacto de dichas variables explanatorias sobre la variable dependiente?
effect_plot(regresion2_2,pred=salario_hora_min_usa,interval=TRUE)Igualmente, al subir el salario mínimo por hora, las ventas de los automóviles comerciales disminuyen. La relación es NEGATIVA. Este podría ser un tema interesante a investigar.
HIPÓTESIS, al subir el salario mínimo, las personas sienten menos necesidad de buscar nuevas opciones de generar dinero, de diferentes maneras.
effect_plot(regresion2_2,pred=año,interval=TRUE)Con el pasar de los años las ventas demuestran incrementar, la relación es POSITIVA.
Se importa la base de datos de la industria automotriz en México.
base_mex<-read.csv("/Users/elenavela/Downloads/industria_automotriz_mx.csv")
summary(base_mex)## año unidades_exportacion unidades_produccion unidades_ventas
## Min. :2017 Min. :2681806 Min. :3028481 Min. : 950063
## 1st Qu.:2018 1st Qu.:2706980 1st Qu.:3040178 1st Qu.:1014735
## Median :2019 Median :3253859 Median :3811068 Median :1317931
## Mean :2019 Mean :3096421 Mean :3546297 Mean :1248952
## 3rd Qu.:2020 3rd Qu.:3388305 3rd Qu.:3918603 3rd Qu.:1427086
## Max. :2021 Max. :3451157 Max. :3933154 Max. :1534943
## empleados_automotriz compensaciones_empleados salario_min
## Min. :784000 Min. :506716 Min. :2435
## 1st Qu.:831000 1st Qu.:520113 1st Qu.:2688
## Median :840000 Median :527878 Median :3123
## Mean :833200 Mean :542087 Mean :3261
## 3rd Qu.:844000 3rd Qu.:567228 3rd Qu.:3748
## Max. :867000 Max. :588498 Max. :4310
str(base_mex)## 'data.frame': 5 obs. of 7 variables:
## $ año : int 2017 2018 2019 2020 2021
## $ unidades_exportacion : int 3253859 3451157 3388305 2681806 2706980
## $ unidades_produccion : int 3933154 3918603 3811068 3040178 3028481
## $ unidades_ventas : int 1534943 1427086 1317931 950063 1014735
## $ empleados_automotriz : int 784000 844000 867000 840000 831000
## $ compensaciones_empleados: int 506716 527878 520113 567228 588498
## $ salario_min : num 2435 2688 3123 3748 4310
Se cambiana los nombres a las variables.
names (base_mex) = c("año", "uds_export", "uds_prod", "uds_ventas", "empleados_auto", "compensaciones_empleados","salario_min")
names (base_mex)## [1] "año" "uds_export"
## [3] "uds_prod" "uds_ventas"
## [5] "empleados_auto" "compensaciones_empleados"
## [7] "salario_min"
str(base_mex)## 'data.frame': 5 obs. of 7 variables:
## $ año : int 2017 2018 2019 2020 2021
## $ uds_export : int 3253859 3451157 3388305 2681806 2706980
## $ uds_prod : int 3933154 3918603 3811068 3040178 3028481
## $ uds_ventas : int 1534943 1427086 1317931 950063 1014735
## $ empleados_auto : int 784000 844000 867000 840000 831000
## $ compensaciones_empleados: int 506716 527878 520113 567228 588498
## $ salario_min : num 2435 2688 3123 3748 4310
En este caso, se escoge como variable dependiente las unidades producidas en México.
regresion3 <- lm (uds_prod ~ año + empleados_auto, data=base_mex)
summary (regresion3)##
## Call:
## lm(formula = uds_prod ~ año + empleados_auto, data = base_mex)
##
## Residuals:
## 1 2 3 4 5
## 18339 -3743 81649 -225423 129178
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.401e+08 1.379e+08 4.641 0.0434 *
## año -3.175e+05 6.899e+04 -4.603 0.0441 *
## empleados_auto 5.418e+00 3.572e+00 1.517 0.2686
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 193000 on 2 degrees of freedom
## Multiple R-squared: 0.9156, Adjusted R-squared: 0.8311
## F-statistic: 10.84 on 2 and 2 DF, p-value: 0.08443
Descripción de variable:
Dependiente: tenemos las unidades de autos pproducidas
en México, se miden en unidades (carros).
Independiente: los años y la cantidad de personass que
trabajan en la industria automotriz.
Viendo el modelo de regresión actual, observamos que la variable independiente que tiene más impacto en las unidades producidas es el año (posiblemente por temas de momento). Se espera que al pasar los años, las unidades producidas bajen. Con la variable empleados de la industria, podríamos esperar que suban las unidades producidas al subir la cantidad de empleados (sin embargo, esta variable no es muy significativa).
La cantidad de empleados de la industria se encuentra entre los 780,000 y los 870,000, se escoge 825,000 para el análisis. Con los años próximos.
datos_nuevos3 <- data.frame(año=2022:2025,empleados_auto=825000)
predict(regresion3,datos_nuevos3)## 1 2 3 4
## 2549259 2231721 1914184 1596647
¿Qué observamos?
tercer <- plot(predict(regresion3,datos_nuevos3), type = "l", xlab = "Año", ylab ="Unidades producidas", main="Predicción de Unidades Producidas en México")En esta predicción de unidades de automóviles producidas en México, observamos que es hacia abajo. Esto es, tomando en cuenta el pasar de los años, y un promedio de colaboradores de 825,000.
¿Cómo es el impacto de dichas variables explanatorias sobre la variable dependiente?
effect_plot(regresion3,pred=año,interval=TRUE)La relación del pasar de los años es NEGATIVA, debido a que se espera que disminuya la cantidad de producción.
effect_plot(regresion3,pred=empleados_auto,interval=TRUE)Vemos una relación POSITIVA, en este caso; al subir el número de empleados de la industria automotriz en México, incrementan las unidades producidas en México.
En este caso, se escoge como variable dependiente las unidades exportadas.
regresion4 <- lm (uds_export ~ año + uds_prod, data=base_mex)
summary (regresion4)##
## Call:
## lm(formula = uds_export ~ año + uds_prod, data = base_mex)
##
## Residuals:
## 1 2 3 4 5
## -44976 51491 -7169 39767 -39114
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -2.377e+08 9.430e+07 -2.520 0.1279
## año 1.173e+05 4.646e+04 2.524 0.1276
## uds_prod 1.129e+00 1.564e-01 7.223 0.0186 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 62600 on 2 degrees of freedom
## Multiple R-squared: 0.986, Adjusted R-squared: 0.972
## F-statistic: 70.38 on 2 and 2 DF, p-value: 0.01401
Descripción de variable:
Dependiente: las unidades de carros que son exportados
provenientes de México.
Independiente: los años tenemos las unidades de autos
pproducidas en México, se miden en unidades (carros).
En este caso, el año no tiene tantta significancia como en el modelo pasado. Sin embargo, al querer ver las unidades de autos producidas en México, ahora como variable independiente, vemos que si tiene un buen nivel de significancia (p menor a 0.05). Obtenemos que al pasar los años, y al subir las unidades prooducidas en México, la cantidad de autos exportados incrementa.
Se utilizan los próximos 5 años, en el cuál podemos ver un crecimiento (si tomamos en cuenta las dos variables descritas).
datos_nuevos4 <- data.frame(año=2022:2026,uds_prod=3000000)
predict(regresion4,datos_nuevos4)## 1 2 3 4 5
## 2831191 2948457 3065724 3182990 3300256
¿Qué observamos?
cuarto <- plot(predict(regresion4,datos_nuevos4), type = "l", xlab = "Año", ylab ="Unidades exportadas", main="Predicción de Unidades Exportadas de México")Notamos que al tener esa información de las variables independientes, podríamos esperar un crecimiento en las unidades exportadas de México.
¿Cómo es el impacto de dichas variables explanatorias sobre la variable dependiente?
effect_plot(regresion4,pred=año,interval=TRUE)Vemos una relación POSITIVA, al pasar los años se espera que las exportaciones crezcan.
effect_plot(regresion4,pred=uds_prod,interval=TRUE)Vemos una relación POSITIVA, al subir las unidades producidas en México se espera que las exportaciones crezcan.
Misma base de datos previamente utilizada
summary(base_eua)## año prod_total prod_passenger prod_veh_comerciales
## Min. :2007 Min. : 5710 Min. :1924 Min. :3514
## 1st Qu.:2010 1st Qu.: 8709 1st Qu.:2745 1st Qu.:5820
## Median :2014 Median :10823 Median :3382 Median :6891
## Mean :2014 Mean :10077 Mean :3326 Mean :6751
## 3rd Qu.:2017 3rd Qu.:11268 3rd Qu.:4061 3rd Qu.:8095
## Max. :2020 Max. :12179 Max. :4369 Max. :8512
## ventas_domesticas ventas_passenger ventas_comerciales desempleo_usa
## Min. : 7868 Min. :2560 Min. : 4309 Min. :3.680
## 1st Qu.:10474 1st Qu.:3865 1st Qu.: 6088 1st Qu.:4.685
## Median :12583 Median :4542 Median : 7634 Median :5.980
## Mean :11996 Mean :4491 Mean : 7505 Mean :6.430
## 3rd Qu.:13669 3rd Qu.:5184 3rd Qu.: 8964 3rd Qu.:8.088
## Max. :14128 Max. :5610 Max. :10133 Max. :9.610
## confianza_cons_usa salario_hora_min_usa
## Min. :63.75 Min. :5.500
## 1st Qu.:73.02 1st Qu.:7.250
## Median :82.83 Median :7.250
## Mean :82.29 Mean :7.025
## 3rd Qu.:92.67 3rd Qu.:7.250
## Max. :98.37 Max. :7.250
library(foreign)
library(dplyr) # data manipulation
library(forcats) # to work with categorical variables
library(ggplot2) # data visualization
library(janitor) # data exploration and cleaning
library(Hmisc) # several useful functions for data analysis
#install.packages("Hmisc")
#install.packages("naniar")
library(naniar)
#install.packages("dlookr")
#install.packages("pollster")
library(dlookr)
library(pollster)
#install.packages("descr")
library(descr)
library(data.table)
library(graphics)
library(epiDisplay)
library(tidyr)
library(psych) # functions for multivariate analysis
library(corrplot) # correlation plots
library(jtools) # presentation of regression analysis
library(lmtest) # diagnostic checks - linear regression analysis
library(car) # diagnostic checks - linear regression analysis
#install.packages("olsrr")
library(olsrr) # diagnostic checks - linear regression analysis
library(kableExtra) # HTML table attributes
library(tseries) # time series analysis and computational finance
library(forecast) # provides methods and tools for displaying and analyzing univariate time series forecast
#install.packages("astsa")
library(astsa) # applied statistical time series analysis
library(plyr) plot(base_eua$año,base_eua$prod_veh_comerciales, type="l",col="blue", lwd=1.5, xlab ="Año",ylab ="Dólares", main = "Ventas Anuales de Vehículos en EUA")
lines(base_eua$año,base_eua$prod_veh_comerciales,col="red",lty=3)
legend("topleft", legend=c("Domestic Commercial Sales", "Production Commercial Vehicles"),
col=c("blue", "red"), lty = 1:2, cex=0.8)En el presente gráfico, vemos la tendencia a través de los años de las ventas de los vehículos passenger y los comerciales, al juntarlos obtenemos lo presentado. Interesantemente, en el 2009 hubo una diminución de ventas debido a la crisis que empezó en EUA, e imapctó todo el mundo. Después observamos como sigue creciendo en los añoos, hasta el 2019 (por COVID-19) donde disminuyeron. Se esperaría que ahora que la economía va mejorando, saliendo del problema de sanidad.
summary(ma_model<-arma(base_eua$prod_total,order=c(0,1)))##
## Call:
## arma(x = base_eua$prod_total, order = c(0, 1))
##
## Model:
## ARMA(0,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3425.7 -1313.0 141.6 1100.1 1449.5
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## ma1 6.756e-01 1.610e-01 4.195 2.73e-05 ***
## intercept 1.010e+04 6.096e+02 16.569 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Fit:
## sigma^2 estimated as 2094390, Conditional Sum-of-Squares = 25229390, AIC = 247.5
ma_model_forecast<-forecast(ma_model$fitted,h=3,level=c(95))
ma_model_forecast## Point Forecast Lo 95 Hi 95
## 15 10455.67 8568.350 12342.99
## 16 10455.67 8438.084 12473.26
## 17 10455.67 8315.732 12595.61
Podemos ver que en la industria Automotriz de USA, específicamente en
ventas de autos (passenger y comerciales), tenemos una
tendencia continua y que nuestros rangos (por los intervalos de
confianza) van disminuyendo, pero las predicciones se encuentran de la
siguiente manera:
1. Primer año: desde los $8,568.35 hasta los $12,342.99
en ventas de carros (passenger y comerciales).
2. Segundo año: desde los $8,438.08 hasta los
$12,473.26 en ventas de carros (passenger y comerciales).
3. Tercer año: desde los $8,315.73 hasta los $12,595.61
en ventas de carros (passenger y comerciales).
summary(base_mex)## año uds_export uds_prod uds_ventas
## Min. :2017 Min. :2681806 Min. :3028481 Min. : 950063
## 1st Qu.:2018 1st Qu.:2706980 1st Qu.:3040178 1st Qu.:1014735
## Median :2019 Median :3253859 Median :3811068 Median :1317931
## Mean :2019 Mean :3096421 Mean :3546297 Mean :1248952
## 3rd Qu.:2020 3rd Qu.:3388305 3rd Qu.:3918603 3rd Qu.:1427086
## Max. :2021 Max. :3451157 Max. :3933154 Max. :1534943
## empleados_auto compensaciones_empleados salario_min
## Min. :784000 Min. :506716 Min. :2435
## 1st Qu.:831000 1st Qu.:520113 1st Qu.:2688
## Median :840000 Median :527878 Median :3123
## Mean :833200 Mean :542087 Mean :3261
## 3rd Qu.:844000 3rd Qu.:567228 3rd Qu.:3748
## Max. :867000 Max. :588498 Max. :4310
plot(base_mex$año,base_mex$uds_ventas, type="l",col="blue", lwd=1.5, xlab ="Año",ylab ="Unidades", main = "Ventas de Vehículos Anuales MX")
lines(base_mex$año,base_mex$uds_export,col="red",lty=3)
legend("topleft", legend=c("Vehículos"),
col=c("blue", "red"), lty = 1:2, cex=0.8)En las presentes gráficas observamos que tantas unidades de carros que se venden, considerando México. Vemos como el año “estrella” de los últimos 5 años fue el 2018, y el que bajó considerablemente en ventas fue el 2020, probablemente debido al incremento del Covid-19.
ma_model<- base_mex
ma_model_forecast<-forecast(ma_model$uds_ventas,h=3,level=c(95))
ma_model_forecast## Point Forecast Lo 95 Hi 95
## 6 887801 675739.5 1099862.5
## 7 779944 567882.5 992005.5
## 8 672087 460025.5 884148.5
Podemos ver que en la industria automotriz de México, específicamente
en ventas, tenemos una tendencia continua y que nuestros rangos (por los
intervalos de confianza) disminuyen, por lo que las predicciones se
encuentran de la siguiente manera:
1. Primer año: desde las 675,739.5 unidades hasta las
1,099,862.5 uidades en ventas de carros en México.
2. Segundo año: desde las 567,882.5 unidades hasta las
992,005.5 unidades en ventas de carros en México.
3. Tercer año: desde las 460,025.5 hasta las 884,148.5
unidades en ventas de carros en México.
plot(scrap_finalya$fecha, scrap_finalya$cantidad, type="l",col="red", lwd=1.5, xlab ="Fecha",ylab ="Cantidad", main = "Cantidad de Scrap por Fecha")
lines(scrap_finalya$fecha,scrap_finalya$cantidad,col="red",lty=3)
legend("topleft", legend=c("Scrap"),
col=c("red"), lty = 1:2, cex=0.8)Aquí vemos como progresó la cantidad de scrap durante el mes de agosto, presentando ciertos picos en ciertos días específicos. Vemos que hubo uno importante alrededor del 11 o 12 de agosto, y otra cantidad de scrap aún más relevante por el 24 de agosto. Por ora parte, había otros días que no presentaron cantidad de scrap.
(ma_model<-arma(scrap_finalya$cantidad,order=c(0,1)))##
## Call:
## arma(x = scrap_finalya$cantidad, order = c(0, 1))
##
## Coefficient(s):
## ma1 intercept
## 0.01931 6.71395
ma_model_forecast<-forecast(ma_model$fitted,h=3,level=c(95))
ma_model_forecast## Point Forecast Lo 95 Hi 95
## 251 6.714443 6.264717 7.164169
## 252 6.714443 6.264717 7.164169
## 253 6.714443 6.264717 7.164169
Para las siguientes tres fechas se presenta una cantidad de scrap igual. Con una cantidad mínima de 6.26 y un máximo de 7.16.
# Sumar el Total de KilosxMes
merma <- c(14560,22830,22470,18820,23410,18280,19370,32100,13586)
merma_st <- ts(data = merma, start = c(2022,1), frequency = 12)
merma_st## Jan Feb Mar Apr May Jun Jul Aug Sep
## 2022 14560 22830 22470 18820 23410 18280 19370 32100 13586
modelo <- auto.arima(merma_st)
modelo## Series: merma_st
## ARIMA(0,0,0) with non-zero mean
##
## Coefficients:
## mean
## 20602.889
## s.e. 1736.893
##
## sigma^2 = 30544665: log likelihood = -89.8
## AIC=183.59 AICc=185.59 BIC=183.99
pronostico <- forecast(modelo, level=c(95), h=3)
pronostico## Point Forecast Lo 95 Hi 95
## Oct 2022 20602.89 9770.711 31435.07
## Nov 2022 20602.89 9770.711 31435.07
## Dec 2022 20602.89 9770.711 31435.07
plot(pronostico)Para Form al desarrollar el pronóstico de Merma vemos que tenemos que para los próximos periodos de octubre, noviembre y diciembre tendremos una cantidad constante de 20,602.89 kilos de merma y que nuestro intervalo de confianza cae entre 9770.711 a 31435.07.Interpretando la información vemos que a comparación del último mes de septiembre, los kilos crecerán.
Descargar librerías
library(foreign)
library(dplyr) # data manipulation
library(ggplot2) # data visualization
#install.packages("psych")
library(psych) # functions for multivariate analysis
library(corrplot) # correlation plots
library(jtools) # presentation of regression analysis
library(lmtest) # diagnostic checks - linear regression analysis
library(car) # diagnostic checks - linear regression analysis
library(factoextra) # provides functions to extract and visualize the output of exploratory multivariate data analyses
#install.packages("ggfortify")
library(ggfortify) # data visualization tools for statistical analysis resultsSe importa la base de datos de BAJAS ya limpia.
#file.choose()
bajas<-read.csv("/Users/elenavela/bajas_final.csv")
summary(bajas)## nombre edad duracion salario_diario
## Length:232 Min. :18.00 Min. : 0.00 Min. :144.4
## Class :character 1st Qu.:23.00 1st Qu.: 9.00 1st Qu.:180.7
## Mode :character Median :28.50 Median : 20.50 Median :180.7
## Mean :30.77 Mean : 75.82 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.: 47.25 3rd Qu.:180.7
## Max. :61.00 Max. :1966.00 Max. :500.0
## estado e.civil. genero alta
## Length:232 Length:232 Length:232 Length:232
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## motivo_baja puesto
## Length:232 Length:232
## Class :character Class :character
## Mode :character Mode :character
##
##
##
¿Cuántos NA tengo por variables?
sapply(bajas,function(x) sum(is.na(x)))## nombre edad duracion salario_diario estado
## 0 0 0 0 0
## e.civil. genero alta motivo_baja puesto
## 0 0 0 0 0
bajas_new<-bajas
bajas_new<-subset(bajas_new,select = -c(alta,estado,nombre))
summary(bajas_new)## edad duracion salario_diario e.civil.
## Min. :18.00 Min. : 0.00 Min. :144.4 Length:232
## 1st Qu.:23.00 1st Qu.: 9.00 1st Qu.:180.7 Class :character
## Median :28.50 Median : 20.50 Median :180.7 Mode :character
## Mean :30.77 Mean : 75.82 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.: 47.25 3rd Qu.:180.7
## Max. :61.00 Max. :1966.00 Max. :500.0
## genero motivo_baja puesto
## Length:232 Length:232 Length:232
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
Se toman en cuenta la edad y la duración dentro de la empresa.
bajas_edaddur_norm<-scale(bajas_new[1:2]) fviz_nbclust(bajas_edaddur_norm, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method") ## Registered S3 methods overwritten by 'broom':
## method from
## tidy.glht jtools
## tidy.summary.glht jtools
Se toman en cuenta, primeramente, solo 4 clusters.
edad_cluster1<-kmeans(bajas_edaddur_norm,4)
edad_cluster1## K-means clustering with 4 clusters of sizes 44, 114, 70, 4
##
## Cluster means:
## edad duracion
## 1 1.5981208 -0.08817072
## 2 -0.8117882 -0.11434758
## 3 0.2558812 -0.13781428
## 4 1.0787124 6.64053370
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 3 3 2 2 3 1 3 3 1 2 2 3 2 3 3 2 2 2 2 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 3 4 2 3 1 2 3 2 2 2 3 2 2 2 3 2 2 2 3 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 2 3 2 2 2 2 2 2 1 1 1 4 2 1 2 2 1 2 2 2
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 3 2 2 1 2 1 2 2 2 2 3 2 3 2 3 2 2 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 4 2 1 2 2 2 1 2 2 2 3 1 1 2 2 2 1 3 2 3
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 2 2 1 3 2 2 3 4 3 2 3 3 2 3 3 3 1 1 1 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 2 2 2 2 3 2 3 1 2 3 2 1 2 2 2 3 1 3 1 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 3 1 1 1 2 3 3 3 2 2 2 3 1 1 2 3 2 3 1 1
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 1 1 3 1 2 2 3 2 2 1 3 1 2 1 3 3 1 3 3 2
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 2 2 3 1 3 3 2 2 3 3 3 3 3 2 3 2 3 3 2 3
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 1 3 2 2 2 1 2 2 2 3 3 2 2 3 3 3 1 2 2 3
## 221 222 223 224 225 226 227 228 229 230 231 232
## 2 2 2 2 1 3 1 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 20.59876 23.88535 25.54502 15.68265
## (between_SS / total_SS = 81.4 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(edad_cluster1,data=bajas_edaddur_norm)Al observar vemos cuatro clusters que toman en cuenta la edad y la
duración:
1. El rojo (será llamado “Senior”) es un cluster que observamos que son
personas de edad mediana-alta y que durán relativamente poco tiempo,
entran dentro del 25% con menor duración.
2. El verde (“Beginner”) es el segmento más joven y que de las personas
(en general) menos han durado. Se puede considerar que los jóvenes son
los que menos duran en Form a partir de este cluster.
3. El azul (“Junior”) resulta el cluster intermedio de los de menor
duración. Son personas en un rango de edad medio que también son parte
del 25% inferior que más han durado.
4. El morado (“Expert”) es el cluster que más se aparta de los demás;
son personas con un mayor rango de edad pero que se alejan de los más
jóvenes, y que han durado mucho má tiempo. Se encuentran en el 50%
superior del tiempo de duración.
bajas_new2<-bajas_new
bajas_new2$Clusters<-edad_cluster1$cluster
bajas_new3<-bajas_new2 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas_new2$Cluster_Names<-factor(bajas_new2$Clusters,levels = c(1,2,3,4),
labels=c("Senior", "Beginner", "Junior", "Expert"))#install.packages("dplyr")
library(dplyr)bajas_new4 <- bajas_new2 %>% group_by(Cluster_Names) %>% dplyr::summarise(edad_años=max(edad),
duracion=mean(duracion),
Count=n())clusters<-as.data.frame(bajas_new4)
clusters## Cluster_Names edad_años duracion Count
## 1 Senior 57 56.78409 44
## 2 Beginner 28 51.13158 114
## 3 Junior 39 46.06429 70
## 4 Expert 61 1509.75000 4
A partir de la tabla, observamos las edades máximas encontradas en cada clúster. Conocemos que la persona con mayor edad en los expert tiene 61, en senior tiene 57, en junior tiene 39 y en beginner 27.
Igualmente, vemos la duración máxima que ha durado alguien de cada cluster, comparamos el máximo del mayor, expert, que han sido más de 1,500 días, con el máximo del menor, junior, que han sido 46 días.
ggplot(bajas_new4,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")Existe una mayor cantidad de “beginners”. Muy poca gente ha sido “Expert”.
ggplot(bajas_new4, aes(x=Cluster_Names,y=edad_años,fill= Cluster_Names,label=round(edad_años,digits=2))) +
geom_col() +
geom_text()Comparamos la edad máxima en cada clúster (descrito anteriormente).
ggplot(bajas_new4,aes(x=Cluster_Names,y=duracion,fill= Cluster_Names,label=round(duracion,digits=2))) +
geom_col() +
geom_text()Comparamos los días máximos en cada clúster (descrito anteriormente).
Debido a que una gráfica anterior indicaba la posibilidad de tener otro clúster que describa a otro grupo, hacemos lo mismo con 5 segmentos, en vez de 4.
bajas_edaddur_norm2<-scale(bajas_new[1:2]) fviz_nbclust(bajas_edaddur_norm2, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method") edad_cluster2<-kmeans(bajas_edaddur_norm,5)
edad_cluster2## K-means clustering with 5 clusters of sizes 33, 83, 45, 67, 4
##
## Cluster means:
## edad duracion
## 1 1.7735967 -0.02984451
## 2 -0.9501264 -0.17750350
## 3 0.6732203 -0.26412700
## 4 -0.2131039 0.01554089
## 5 1.0787124 6.64053370
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 4 3 2 2 4 1 4 4 1 2 2 3 2 4 4 2 2 2 2 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 4 5 2 3 1 2 3 2 2 2 3 4 2 2 4 2 2 4 4 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 4 4 2 2 2 2 2 2 1 1 3 5 4 1 2 2 1 2 2 2
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 3 4 4 3 2 1 4 2 2 2 3 4 3 2 3 2 2 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 5 4 1 4 2 4 3 2 2 2 4 3 1 2 4 4 1 4 4 4
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 2 2 3 4 4 4 3 5 3 2 4 4 2 3 3 4 1 1 1 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 4 2 2 2 4 2 3 1 4 3 2 1 2 4 4 4 1 4 1 3
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 4 3 1 1 4 4 3 4 2 4 4 3 1 1 2 3 2 3 3 3
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 1 1 4 1 2 4 4 2 4 1 4 1 4 3 4 3 1 3 3 2
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 2 2 4 1 3 3 2 2 4 3 3 3 4 2 4 4 4 4 2 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 1 3 2 2 2 1 4 2 2 3 4 2 2 3 3 3 1 4 4 4
## 221 222 223 224 225 226 227 228 229 230 231 232
## 2 2 2 4 3 3 3 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 15.975197 6.410735 3.762808 31.155779 15.682652
## (between_SS / total_SS = 84.2 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(edad_cluster2,data=bajas_edaddur_norm2)Comparando esta gráfica de 5 segmentos contra la anteriormente vista
de 4. En esta observamos que separa un segmento que deja un “espacio”
que antes no existía; separa y crea un segmento que han durado
MUY poco, y que son de mediana edad:
1. El rojo (llamado “Senior”): tiene de baja a mediana duración y un
rango de edad alta.
El verde izquierdo (llamado “Beginner”): son las personas más jóvenes y que también han durado poco tiempo. Se quedan aproximadamente por el 10% inferior.
El verde derecho (llamado “Unmotivated”) son personas de mediana edad que han durado muy poco tiempo en la empresa, parte del 5% inferior de duración.
El azul (llamado “Junior”): al hacer el nuevo clúster nos damos cuenta de que existe un grupo de personas de corta-mediana edad que duran por lo general una buena cantidad de tiempo (a comparación de otros), aún más poco que los Senior.
El morado (llamado “Expert”): es el cluster que más se aparta de los demás; son personas con un mayor rango de edad pero que se alejan de los más jóvenes, y que han durado mucho má tiempo. Se encuentran en el 50% superior del tiempo de duración.
bajas_new6<-bajas_new
bajas_new6$Clusters<-edad_cluster2$cluster
bajas_new7<-bajas_new6 %>% group_by(Clusters) %>% summarise(edad=max(edad)) %>% arrange(desc(edad))
bajas_new6$Cluster_Names<-factor(bajas_new6$Clusters,levels = c(1,2,3,4,5),
labels=c("Senior", "Beginner", "Unmotivated", "Junior","Expert"))Análisis con variables cualitativas
ESTADO CIVIL
¿Qué concluímos?
1. La gran parte de los beginner y expert son
solteros.
2. Los estados civiles de los junior y senior están
más distribuidos que los demás clusters (sin contar divorcio).
**3. El único clúster que presenta divorcios es aquel llamado
UNMOTIVATED.*
GÉNERO
¿Qué concluímos?
1. Como ya se había vista, en general más mujeres han sido dadas de
baja.
2. Hay más hombres en el segmento de expert (75%).
3. Hay más mujeres en senior (75%) y en unmotivated
(80%)
4. Los generos están muy equitativamente distribuidos en
beginner y junior.
PUESTO
1. El puesto más repetido en TODOS los segmentos, es ayudante
general, representando el 75% de todos los puestos.
library(ggplot2)
#install.packages("ggalluvial")
library(ggalluvial)bajas_new8<-bajas_new2 %>% filter(Clusters==1 | Clusters==4) %>% arrange(Clusters)
ggplot(as.data.frame(bajas_new8),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")
Debido a que existen más personaas que son parte del cluster “SENIOR”
que de “EXPERT”, notamos más el color rosa. Notamos que en estos dos
clusters ninnguna persona es divorciada y que las personas que están en
unión libre (en estos dos casos) pertenecen solo a la categoría de
Senior. Los hombres expert están en su mayoría casados, y la
única mujer expert se encuentra soltera.
bajas_new9<-bajas_new2 %>% filter(Clusters==2 | Clusters==3) %>% arrange(Clusters)
ggplot(as.data.frame(bajas_new9),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")Ahora viendo los clusters de “BEGINNER” y “JUNIOR”, vemos como existen más mujeres beginner solteras que mujeres junior solteras; fenómeno que ocurre de la misma manera con los hombres. En este caso si vemos más frecuente la unión libre. Aquí mismo podemos observar que en general las mujeres tiene un salario superior a los hombres.
Importar base de datos
rh_bajas <-read.csv("/Users/elenavela/bajas_final.csv") ¿Cuántos NA tengo por variables?
sapply(rh_bajas,function(x) sum(is.na(x)))## nombre edad duracion salario_diario estado
## 0 0 0 0 0
## e.civil. genero alta motivo_baja puesto
## 0 0 0 0 0
Base de datos con valores CUANTITATIVOS
rh_bajas2<-rh_bajas
rh_bajas2<-subset(rh_bajas2,select = -c(alta,motivo_baja,estado,nombre))
summary(rh_bajas2)## edad duracion salario_diario e.civil.
## Min. :18.00 Min. : 0.00 Min. :144.4 Length:232
## 1st Qu.:23.00 1st Qu.: 9.00 1st Qu.:180.7 Class :character
## Median :28.50 Median : 20.50 Median :180.7 Mode :character
## Mean :30.77 Mean : 75.82 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.: 47.25 3rd Qu.:180.7
## Max. :61.00 Max. :1966.00 Max. :500.0
## genero puesto
## Length:232 Length:232
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Normalizando las variables
bajas_duracion_norm<-scale(rh_bajas2[2:3]) Elbow Plot
fviz_nbclust(bajas_duracion_norm, kmeans, method="wss")+
geom_vline(xintercept=5, linetype=2)+
labs(subtitle = "Elbow method") Visualización información de clusters
duracion_cluster1<-kmeans(bajas_duracion_norm,5)
duracion_cluster1## K-means clustering with 5 clusters of sizes 1, 190, 10, 27, 4
##
## Cluster means:
## duracion salario_diario
## 1 2.55713774 13.7308825
## 2 -0.23514390 0.1149688
## 3 1.49570950 -0.3716097
## 4 0.02225829 -1.1214525
## 5 6.64053370 -0.3949078
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 1 4 4 4 4 4 4 4 4 3 4 4 2 2 3 4 4 4 4 4
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 4 5 4 4 2 2 2 2 2 2 2 2 2 2 2 2 4 3 2 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 3 3 2 2 2 2 2 2 2 2 2 5 3 2 2 2 2 2 2 4
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 2 2 2 2 2 3 3 4 2 2 2 2 2 2 2 2 2 2
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 5 4 4 4 4 2 2 2 2 2 2 2 2 2 2 2 4 4 2 2
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 2 2 2 2 2 2 2 5 2 2 2 2 2 2 2 2 2 2 2 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2
## 221 222 223 224 225 226 227 228 229 230 231 232
## 2 2 2 2 2 2 2 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 0.000000 3.267978 6.410837 1.642234 7.852827
## (between_SS / total_SS = 95.8 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
Visualización clustering resultados
fviz_cluster(duracion_cluster1,data=bajas_duracion_norm)Al observar vemos 5 clusters que toman en cuenta la duración y el salario:
Por último tenemos el rojo (“Extra”) que tuvo duración corto plazo con un salario muy alto ($500 pesos).
El azul (“Costosos”) es el cluster que nos cuesta a la empresa porque se invierte en capacitaciones para ellos y terminan saliendo de la empresa; son personas con un poco mas de duración pero no la suficiente (197 días) y su salario es de $151 por debajo promedio.
El verde derecho (“Duraderos”) son los colaboradores que tienen una duración regular, pero que aun así no se encuentran satisfechos por lo que se salen de la empresa al rededor después de 1 año y medio (646 días) y su salario es de $169.
Vemos nuestro verde izquierdo (será llamado “Rehenes”) es un cluster que observamos que son personas que solo entran y salen muy pronto de la empresa (141 días) y tienen un salario diario que es arriba del promedio, alrededor de $180 pesos.
Como morado tenemos a los colaboradores que son leales a la empresa (“Fieles”) es el segmento donde ya tienen más de 4-5 años trabajando y cuentan con un salario de $168 pesos.
Nombrar a los clusters
rh_bajas3<-rh_bajas2
rh_bajas3$Clusters<-duracion_cluster1$cluster
rh_bajas4<-rh_bajas3 %>% group_by(Clusters) %>% summarise(duracion=max(duracion)) %>% arrange(desc(duracion))
rh_bajas3$Cluster_Names<-factor(rh_bajas3$Clusters,levels = c(1,2,3,4,5),
labels=c("Extra", "Rehenes","Duraderos", "Costosos","Fieles"))Engrupar los clusters por nombre de clusters y resumir columnas
rh_bajas5<- rh_bajas3 %>% group_by(Cluster_Names) %>% dplyr::summarise(duracion_dias=max(duracion),
salario_diario=mean(salario_diario),
Count=n())Formato tabla para información de los clusters
Clusters<-as.data.frame(rh_bajas5)
Clusters## Cluster_Names duracion_dias salario_diario Count
## 1 Extra 628 500.0000 1
## 2 Rehenes 141 180.6126 190
## 3 Duraderos 646 169.1990 10
## 4 Costosos 197 151.6100 27
## 5 Fieles 1966 168.6525 4
Gráfica con el numero de observaciones por nombres de clusters
ggplot(rh_bajas5,aes(x=reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")ggplot(rh_bajas5, aes(x=Cluster_Names,y=duracion_dias,fill= Cluster_Names,label=round(duracion_dias,digits=2))) +
geom_col() +
geom_text()ggplot(rh_bajas5,aes(x=Cluster_Names,y=salario_diario,fill= Cluster_Names,label=round(salario_diario,digits=2))) +
geom_col() +
geom_text()Estás ultimas gráficas nos muestran lo que se describió anteriorimente sobre que duración y salario tiene cada cluster y para concluir se mostrara cuantos colaboradores tiene cada cluster:
Total 233 * “Rehenes” tiene el segmento con más colaboradores y tiene un total de 191. En porcentaje se puede decir que es el 81.97% total de bajas.
“Costosos” esta en segundo lugar teniendo 27 colaboradores (11.57%).
“Duraderos” tercer lugar con un total de 10 colaboradores (4.29%).
“Fieles” cuarto lugar con 4 colaboradores (1.71%).
Por último esta el “Extra” que fue solo un colaborador que se encuentra fuera de lo normal (0.43%).
Análisis con variables cualitativas
ESTADO CIVIL
GENERO
PUESTO
1. Las 27 personas de costosos, tuvieron el puesto de
“Ayudante General”. De los 190 integrantes de rehenes,
144 tenían el mismo puesto.
2. La persona de extra pertenecía al puesto a
diseño.
rh_bajas6<-rh_bajas3 %>% filter(Clusters==2 | Clusters==3) %>% arrange(Clusters)
ggplot(as.data.frame(rh_bajas6),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")Debido a que no existen muchas personas que son parte del segmento duraderos, se ve mucha más presencia de parte del segmento de los rehenes. Aquí observamos que la mayoría de las personas en matrimonio que son rehenes son hombres.
rh_bajas7<-rh_bajas3 %>% filter(Clusters==1 | Clusters==4) %>% arrange(Clusters)
ggplot(as.data.frame(rh_bajas7),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")Como fue mencionado anteriormente, la persona que es parte de extra es un hombre soltero. Por otra parte, vemos que de los costosos, hay más mujeres en unión libre que hombres. Así como hay más mujeres solteras que casadas.
rh_bajas8<-rh_bajas3 %>% filter(Clusters==4 | Clusters==5) %>% arrange(Clusters)
ggplot(as.data.frame(rh_bajas8),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")
De parte de los fieles, observamos que hay una pequeñaa
cantidad de hombres que están casados, una pequeña cantidad de mujeres
solteras, y una cantidad unn poco mayor de hombres solteros.
Importar base de datos
bd_rh<-read.csv("/Users/elenavela/bajas_final.csv") Analizar la estructura de la base de datos
str(bd_rh) ## 'data.frame': 232 obs. of 10 variables:
## $ nombre : chr "MARIO VALDEZ ORTIZ" "ISABEL BARRIOS MENDEZ" "MARIA ELIZABETH GOMEZ HERNANDEZ" "ALONDRA ABIGAIL ESCARCIA GOMEZ" ...
## $ edad : int 32 36 23 21 29 46 29 31 50 19 ...
## $ duracion : num 628 60 59 59 51 37 37 31 18 224 ...
## $ salario_diario: num 500 152 152 152 152 ...
## $ estado : chr "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" "Nuevo Leon" ...
## $ e.civil. : chr "Soltero" "Union libre" "Matrimonio" "Soltero" ...
## $ genero : chr "MASCULINO" "FEMENINO" "FEMENINO" "FEMENINO" ...
## $ alta : chr "09/03/20" "09/11/21" "10/11/21" "10/11/21" ...
## $ motivo_baja : chr "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" "RENUNCIA VOLUNTARIA" ...
## $ puesto : chr "DISENO" "AYUDANTE GENERAL" "AYUDANTE GENERAL" "AYUDANTE GENERAL" ...
Cuantos Na´s hay por variable
sapply(bd_rh,function(x) sum(is.na(x)))## nombre edad duracion salario_diario estado
## 0 0 0 0 0
## e.civil. genero alta motivo_baja puesto
## 0 0 0 0 0
Dejamos únicamente las variables de interés
bdr_new <- bd_rh
bdr_new<-subset(bdr_new,select = -c(alta,motivo_baja,estado,nombre,duracion))
summary(bdr_new)## edad salario_diario e.civil. genero
## Min. :18.00 Min. :144.4 Length:232 Length:232
## 1st Qu.:23.00 1st Qu.:180.7 Class :character Class :character
## Median :28.50 Median :180.7 Mode :character Mode :character
## Mean :30.77 Mean :177.9
## 3rd Qu.:37.00 3rd Qu.:180.7
## Max. :61.00 Max. :500.0
## puesto
## Length:232
## Class :character
## Mode :character
##
##
##
Normalización de variables
bajas_edadsal <- scale(bdr_new[1:2]) Elbow plot
fviz_nbclust(bajas_edadsal, kmeans, method="wss")+
geom_vline(xintercept=4, linetype=2)+
labs(subtitle = "Elbow method") Visualización de clusters
Se toman en cuenta, primeramente, solo 4 clusters.
edadsal_cluster1<-kmeans(bajas_edadsal,4)
edadsal_cluster1## K-means clustering with 4 clusters of sizes 46, 110, 1, 75
##
## Cluster means:
## edad salario_diario
## 1 1.6393195 -0.05379675
## 2 -0.8328042 -0.06389667
## 3 0.1264636 13.73088247
## 4 0.2143107 -0.05636798
##
## Clustering vector:
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 3 4 2 2 4 1 4 4 1 2 2 4 2 4 4 2 2 2 2 2
## 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
## 4 1 2 4 1 2 4 2 2 2 4 2 2 2 4 2 2 4 4 2
## 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 2 4 2 2 2 2 2 2 1 1 1 1 2 1 2 2 1 2 2 2
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
## 2 2 4 2 2 1 2 1 2 2 2 2 4 2 4 2 4 2 2 1
## 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
## 2 4 1 2 2 2 1 2 2 2 4 1 1 2 2 4 1 4 2 4
## 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 2 2 1 4 2 2 4 2 4 2 4 4 2 4 4 4 1 1 1 2
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
## 2 2 2 2 4 2 4 1 2 4 2 1 2 4 2 4 1 4 1 4
## 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
## 4 1 1 1 2 4 4 4 2 2 2 4 1 1 2 4 2 4 1 1
## 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
## 1 1 4 1 2 2 4 2 2 1 4 1 2 1 4 4 1 4 4 2
## 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
## 2 2 4 1 4 4 2 2 4 4 4 4 4 2 4 4 4 4 2 4
## 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
## 1 4 2 2 2 1 2 2 2 4 4 2 2 4 4 4 1 2 2 4
## 221 222 223 224 225 226 227 228 229 230 231 232
## 2 2 2 4 1 4 1 2 2 2 2 2
##
## Within cluster sum of squares by cluster:
## [1] 18.69230 28.61998 0.00000 21.95851
## (between_SS / total_SS = 85.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
fviz_cluster(edadsal_cluster1,data=bajas_edadsal)Vemos que el número óptimo de klusters para las variables edad y salario diario son 4 según el método de Elbow.
Como dato disparado y posible warning vemos que hay un trabajador con un salario diario de 500 pesos lo que podría resultar como un error, sin embargo los otros 3 grupos varían bastante en edad más no en salario pues el rango es muy cercano.
Rojo Es el cluster con el registro de personas con mayor edad y cuentan con el salario diario más alto 183.68.
Verde Es el cluster con mayor registro de personas con edad jóven y salario de 182.68.
Alto El dato es único en el conteo con un trabajador de 32 años que tiene un salario diario de 500 pesos y es soltero. Su punto en el mapeo es único (color rojo).
Azul Es el cluster con el registro de personas con edad promedio y salario de 180.68.
Nombrar a los clusters
bdr_new2<-bdr_new
bdr_new2$Clusters <- edadsal_cluster1$cluster
bdr_new3<-bdr_new2 %>% group_by(Clusters) %>% dplyr::summarize(salario_diario=max(salario_diario)) %>% arrange(desc(salario_diario))
bdr_new2$Cluster_Names<-factor(bdr_new2$Cluster,levels = c(1,2,3,4),
labels=c("Alto", "Bajo","Muy Alto", "Regular"))Agrupar clusters
bdr_new4<- bdr_new2 %>% group_by(Cluster_Names) %>% dplyr::summarize(salario_diario=max(salario_diario),
edad=mean(edad),
Count=n())Tabla
clusters<-as.data.frame(bdr_new4)
clusters## Cluster_Names salario_diario edad Count
## 1 Alto 183.68 46.69565 46
## 2 Bajo 182.68 22.68182 110
## 3 Muy Alto 500.00 32.00000 1
## 4 Regular 180.68 32.85333 75
Gráficas
ggplot(bdr_new4,aes(x= reorder(Cluster_Names,Count),y=Count,fill=Cluster_Names)) +
geom_bar(stat="identity")Aquí podemos observar que hay una mayor cantidad de personas en el clússter de menor edad y menor salario. Seguido por el nivel regular, alto y muy alto.
ggplot(bdr_new4, aes(x=Cluster_Names,y=edad,fill= Cluster_Names,label=round(edad,digits=2))) +
geom_col() +
geom_text()La edad máxima del muy alto es de 32 años, de alto es de 46.7 años, de regular es 32.85 años y de bajo, los más jóvenes, 22.68.
ggplot(bdr_new4,aes(x=Cluster_Names,y=salario_diario,fill= Cluster_Names,label=round(salario_diario,digits=2))) +
geom_col() +
geom_text()En la segunda gráfica el clúster azul es el que tiene mayor frecuencia con un promedio de edad de 48 años.
El cluster alto en la segunda grafica englobó en 22 años el count, sin embargo hay trabajadores con menor edad. Dicho cluster es el que tiene menos trabajadores dentro de Form.
En cuanto al salario en la tercera gráfica, el dato más alto es el que anteriormente se había mencionado como un dato único ($500) y vemos el comportamiento que se generaba en el mapeo de clusters donde los demás tienen una diferencia mínima siendo los resultados 182.68, 180.68 y 183.68.
Análisis con variables cualitativas
ESTADO CIVIL
GENERO
1. La persona en muy alto es hombre.
2. En alto y en regular, se tiene a la
mayoría mujeres.
3. Finalmente, en bajo se ve muy parejo en cuanto a los
géneros.
PUESTO
1. En todos los segmentos, excepto muy alto, el puesto
más común es “Ayudante General”.
2. En muy alto, el hombre estaba en diseño.
bdr_new5<-bdr_new2 %>% filter(Clusters==4 | Clusters==3) %>% arrange(Clusters)
ggplot(as.data.frame(bdr_new5),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")Como vimos previamente, la persona perteneciente a muy alto es un hombre soltero.
bdr_new6<-bdr_new2 %>% filter(Clusters==2 | Clusters==1) %>% arrange(Clusters)
ggplot(as.data.frame(bdr_new6),
aes(y=salario_diario, axis1=genero, axis2=e.civil.)) +
geom_alluvium(aes(fill=Cluster_Names), width = 1/12) +
geom_stratum(width = 1/12, fill = "black", color = "grey") +
geom_label(stat = "stratum", aes(label = after_stat(stratum))) +
scale_x_discrete(limits = c("Genero", "Estado Civil"), expand = c(.05, .05)) +
scale_fill_brewer(type = "qual", palette = "Set1") +
ggtitle("Salario Diario de Pasados Empleados de Form por Género y Estado Civil")Las personas que se han divorciado del segmento alto han sido mujeres. Existen más personas en unión libre del segmento de bajo; muchos hombres y mujeres de este mismo segmento son solteros y solteras.
En conclusión para Form podemos plantear una estrategia de estandarización de salarios de acuerdo al tiempo que llevan en la empresa y su edad, para poder así tener un mejor control de gastos de la empresa y aplicar nuevas a estrategias a cada uno de los cluster.
En cuanto a lo más común de los actuales y pasados colaboradores de Form, observamos que hay (y hubieron) más mujeres que hombres. Igualmente, notamos que el puesto más repetido es el de “Ayudante General”; notorio ver como es el puesto que más presenta rotación. Las personas solteras y las personas casadas son aquellas que presentan una mayor presencia; sin embargo, comparando a décadas pasadas, se ve mucha gente que vive en unión libre. Hay más personas jóvenes (20-30).
La mayoría de los colaboradores actuales ingresaron durante los últimos dos años, y la mayoría ganan entre $140 y $200 diarios. Sin embargo, comparando la antigüedad de los colaboradores, notamos que una persona que lleva 12 años en la empresa gana lo mismo que una persona que lleva menos de un año. Inferimos que no existe un plan de crecimiento laboral interno, y tampoco existe un plan de compensaciones y beneficios que incentiven a permanecer más tiempo en Form.
Un insight positivo de Form, es que no presenta discriminación por género, por estado civil, ni por edad.
Existe un problema con la cantidad de faltas, más del 50% han salido de la organización debido a este tema. Notamos que no tienen información cuantitativa en cuanto a las faltas; se desconoce la cantidad límite de faltas y por cuánto se exceden. La duración de los pasados colaboradores no llega ni al año (máximo) por lo general. Todos ganaban aproximadamente lo mismo.
Viendo el plan de entrega, observamos que hay meses en donde se veían pedidos “fuera de lo común”; en este caso analizamos los mayores a 30,000. Estos meses son: marzo, abril, junio y agosto. El mes de agosto también demuestra tener una mayor cantidad de merma; en scrap, vemos un crecimiento de cantidad durante la segunda mitad del mes. Sin embargo, viendo las exportaciones de México, agosto es la que menos exportaciones presenta de todo el año.
Un diferenciado de Form es la importancia que le da a los tiempos; vemos como trabajan por mantener el tiempo mínimo, tiempo de calidad, el delay performance lo más bajo posible.
A partir de los clústers, notamos que los jóvenes son los que menos duran, aunque su salario no esté muy debajo de los demás. Comentando con Felipe, se mencionó como al momento de reclutar muchos no aceptan entrar por el tema de las faltas (3 faltas cada 30 días). Un insight que observamos es que es difícil crear un sentido de pertenencia o deseo de crear antigüedad dentro de la empresa; sin embargo, los datos demuestran que Form no “premia” la antigüedad.
Encontramos un nuevo cluster, al cuál hemos llamado: unmotivated. Las características que encontramos es que son personas de mediana edad que han durado muy poco tiempo en la empresa, parte del 5% inferior de duración. Un insight relevante es que SOLO en este cluster se presentan los divorcios, y que la gran parte son mujeres. ¿Fenómeno cultural?. Adicionalmente, en el análisis de duración y salario, encontramos a una persona que se salía de lo “normal”, esta persona forma su propio clúster (extra). Sus características son las siguientes: duró aprox 2 años, ganaba $500 pesos diarios en un puesto de Diseño; hombre y soltero.
Insights no relacionados a FORM
Se exporta una importante cantidad de autos japoneses desde México, algunas marcas siendo: Nissan y Mazda. Posible cliente potencial, igualmente, existe un nicho donde algunas marcas japonesas (Toyota y Nissan) que exportan muy poco, por lo que no puede ser muy “llamativo”, pero podría funcionar para adentrarse más a la cultura y el mercado. Las marcas de lujo no se exportan mucho de parte de México, como vemos algunas marcas de lujo como BMW, Audi y Mercedes (Alemania).
En EUA, vemos que cuando sube el salario mínimo por hora, sube la venta de autos passenger. Pero cuando sube esta misma variable, vemos que baja la venta de autos comerciales. Resultaría interesante investigar más a fondo este fenómeno. Se espera que en los próximos años suba la venta de autos en EUA, pero que bajen en México.
1. Business Analytics: Business Analytics se podría traducir, de manera más cercana, como “análisis empresarial”. Su enfoque es en datos históricos y actuales, que mediante su procesamiento, estudio y clasificación las empresas, pueden comprender su desempeño actual y pasado. El principal objetivo de este análisis es poder identificar patrones o problemas, identificar los riesgos, y tomar medidas para disminuirlos o evitarlos. A mi manera de verlo, Business Analytics es una buena manera de cuidar el futuro de la organización, al pensar y comprender su pasado se puede evitar repetir malass decisiones o ciertos problemas. Una frase famosa de Cicerón dice que “los pueblos que olvidan su historia están condenados a repetirla”; algo así podría verse con las organizaciones, al entender y manejar bien su pasado mediante datos, se pueden tomar las mejores decisiones (bien fundamentadas) para el futuro desempeño y planificación de la organización.
2. Business Intelligence: Business Intelligence podría definirse como el conjunto de herramientas, tecnologías y estrategias que permite la transformación de datos en información, para que esta información puede convertirse en conocimiento. De acuerdo a IBM, estas herramientas permiten a los integrantes de una organización acceder a diferentes tipos de datos (históricos o actuales) con el fin de analizar los datos y obtener insights de acuerdo a lo que necesitan conocer.
3. Diferencias:
El Business Analytics comúnmente se identifica como un complemento de Business Intelligence, por lo que no puede ser considerado lo mismo.
Business Intelligence se enfoca más a la recolección y la centralización de los datos, facilita el trabajo y el acceso a los datos; Business Analytics se encarga de analizar esta información y usarla en modelos descriptivos, predictivos y explicativos, con el fin de apoyar a ella toma de decisiones de alguna organización.
Business Intelligence busca contestar el WHAT? y HOW? de las cosas; Business Analytics contesta al WHY? las cosas suceden en la empresa, para poder predecir comportamientos.
Business Intelligence se orienta al pasado; Business Analytics se orienta al futuro.
¿Qué es un KPI?
Un Key Performance Indicatrr (KPI), o bien un Indicador Clave de
Rendimiento, es una métrica cuantitativa que pretende
medir el progreso de una persona, equipo o empresa hacia cierto
objetivo; lo que busca es ayudar a tomar mejores decisiones respecto al
estado actual de una persona, proceso, estrategia. Un buen KPI ayuda a
lograr objetivos estratégicos, informa sobre la planificación de
recurso, es medible (cuantitativo), se puede hacer seguimiento, ayuda a
acercar a objetivos concretos y específicos. La evaluación constante de
los KPIs (o con un periodo de tiempo delimitado) es de vital
importancia; recordando al consultor de negocios Peter Drucker:
“Lo que no se puede medir no se puede gestionar”.
KPIs para FORM:
1. Índice de rotación de personal: debido al análisis
realizado, observamos que la retención de personal es baja, sobretodo en
jóvenes, al ver los pocos días de duración en Form. Por lo tanto, se
recomienda a Form llevar el índice de rotación CADA MES.
La fórmula para obtener este índice es: número actual (del mes) de empleados que renunciaron o se fueron / ((empleados al inicio de mes+ empleados al final de mes)/2) x 100
Se busca que disminuya el índice de rotación a partir de los meses, puesto que podría significar que las estrategias diseñadas e implementadas están funcionando. Sin embargo, es importante que nunca llegue a ser 0, debido a que podría ser indicativo de falta de dinaamismo empresarial.
Se propone este índice para conocer con mayor exactitud que tanta gente se va y que tanta gente se queda mes con mes, y tratar de mejorar aspectos para mejorar la retención.
2. Índice de Ausentismo: un problema que pudimos ver en las personas que partieron de Form, es que la mayoría fue por exceso de falta. Por lo tanto, se desea saber realmente QUÉ tanto ausentismo existe. Debido a que fue mencionado como un problema actual y relevante, se quiere medirlo de manera QUINCENAL, para ver que tanto varía dentro de un mes, y finalmente, en el año. Se espera que a partir de este indicador se pueda llegar a tomar una decisión y realizar estrategias para disminuir el ausentismo.
La fórmula para medir el ausentismo= (Número Total de Horas Ausentismo / Número Total de Horas Planificadas) x 100
Como podemos ver, esto se mide con las horas. Se propone a Form tomar en cuenta las horas diarias, y en caso de faltar, tener en el excel ya lista la fórmula (1 x horas del día laboral). Igualmente, tomar en cuenta las veces que las personas salen antes en el día (que se van a medio día). En este caso, debido a ser el primero, no se toma en cuenta la falta justificada y la no justificada.
3. Nivel de servicio (entregas a tiempo): como se mencionó, el tiempo de entrega y sus retrasos (delay performance) es un tema que la empresa le da mucha importancia, puesto que para ellos es vital el tema de servicio oportuno. Por lo tanto, propongo el KPI de “Nivel de servicio”, el cuál pretende medir las entregas a tiempo. Si bien, Form ya posee datos que permiten ver el tiempo de entrega, este KPI lo haría más puntual.
Mide el porcentaje de pedidos que se entregan a tiempo frente a la fecha y hora de compromiso con el cliente. La fórmula es: (número de pedidos entregados tiempo/número total de pedidos entregados) × 100
Mediante estos tres KPI, dos enfocados en RH, y otro enfocado más al servicio al cliente y su la eficiencia.
DocuSign Contributor. (2021, February 10). Business analytics: ¿Qué es y cómo puede ayudar a tu empresa? DocuSign. Retrieved October 20, 2022, from https://www.docusign.mx/blog/Business-analytics
IBM. (n.d.). ¿Qué es business analytics? IBM. Retrieved October 20, 2022, from https://www.ibm.com/mx-es/analytics/business-analytics
Conasa. (n.d.). ¿Cuál es la diferencia entre business intelligence y business analytics? Conasa IT Works. Retrieved October 20, 2022, from https://conasa.grupocibernos.com/blog/cual-es-la-diferencia-entre-business-intelligence-y-business-analytics
IBM. (n.d.). ¿Qué es business intelligence y Cómo Funciona? IBM. Retrieved October 20, 2022, from https://www.ibm.com/mx-es/topics/business-intelligence
Sinergia. (n.d.). ¿Qué es Business Intelligence? Sinergia. Retrieved October 20, 2022, from https://www.sinnexus.com/business_intelligence/
Martins, J. (2022). Qué es un kpi, para qué sirve y cómo utilizarlo en tu proyecto. Asana. Retrieved October 20, 2022, from https://asana.com/es/resources/key-performance-indicator-kpi