Para comenzar, se importaron las 3 bases de datos y asimismo se entendieron y se usó la función de clean_names para utilizarlas más fácilmente como vemos a continuación:
#install.packages("dplyr")
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
#install.packages("psych")
library(psych)
#install.packages("janitor")
library(janitor)
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
#install.packages("ggplot2")
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
#file.choose()
bd <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\Produccion FORM BUENO CSV.csv")
produccion <- clean_names(bd)
summary(produccion)
## fecha no cliente id_form
## Length:2471 Min. : 1.00 Length:2471 Length:2471
## Class :character 1st Qu.: 27.00 Class :character Class :character
## Mode :character Median : 51.00 Mode :character Mode :character
## Mean : 51.92
## 3rd Qu.: 76.00
## Max. :121.00
## NA's :7
## producto piezas_prog tmo_min hr_fin
## Length:2471 Length:2471 Min. : 0.00 Min. : 0.0000
## Class :character Class :character 1st Qu.: 15.00 1st Qu.: 0.2014
## Mode :character Mode :character Median : 20.00 Median : 0.4062
## Mean : 22.09 Mean : 0.3586
## 3rd Qu.: 25.00 3rd Qu.: 0.4618
## Max. :150.00 Max. :11.1500
## NA's :710 NA's :752
## estacion_arranque laminas_procesadas inicio_sep_up fin_inicio_de_sep_up
## Length:2471 Min. : 0.0 Length:2471 Length:2471
## Class :character 1st Qu.: 0.0 Class :character Class :character
## Mode :character Median : 56.5 Mode :character Mode :character
## Mean : 108.5
## 3rd Qu.: 200.0
## Max. :1125.0
## NA's :563
## inicio_de_proceso fin_de_proceso tiempo_calidad tiempo_materiales
## Length:2471 Length:2471 Min. : 0.0000 Min. : 0.000
## Class :character Class :character 1st Qu.: 0.0964 1st Qu.: 0.000
## Mode :character Mode :character Median : 1.0000 Median : 0.000
## Mean : 0.8687 Mean : 2.321
## 3rd Qu.: 1.0000 3rd Qu.: 1.000
## Max. :22.0000 Max. :48.000
## NA's :603 NA's :2150
## mermas_maquinas
## Min. : 0.000
## 1st Qu.: 0.000
## Median : 1.000
## Mean : 1.626
## 3rd Qu.: 1.000
## Max. :50.000
## NA's :2364
#Importar las bases de datos
#file.choose()
bd1 <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\FORM - Merma .csv")
merma <- clean_names(bd1)
summary(merma)
## fecha mes kilos
## Mode:logical Length:10 Min. : 13586
## NA's:10 Class :character 1st Qu.: 18415
## Mode :character Median : 20920
## Mean : 37085
## 3rd Qu.: 23265
## Max. :185426
#file.choose()
bd2 <- read.csv("C:\\Users\\maria\\Documents\\ITESM LAET\\Semestre 7\\Reto\\FORM BASES DE DATOS\\FORM - Scrap.csv")
scrap <- clean_names(bd2)
summary(scrap)
## referencia fecha producto cantidad
## Length:250 Length:250 Length:250 Min. : 0.000
## Class :character Class :character Class :character 1st Qu.: 1.000
## Mode :character Mode :character Mode :character Median : 2.000
## Mean : 6.696
## 3rd Qu.: 7.000
## Max. :96.000
## unidad_de_medida ubicacion_de_origen ubicacion_de_desecho estado
## Length:250 Length:250 Length:250 Length:250
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
#Técnica 1: Eliminar columnas inecesarias
produccion <- subset(produccion,select = -c (no, id_form, producto, hr_fin, estacion_arranque, inicio_sep_up, fin_inicio_de_sep_up, inicio_de_proceso, fin_de_proceso, tiempo_materiales, mermas_maquinas))
summary(produccion)
## fecha cliente piezas_prog tmo_min
## Length:2471 Length:2471 Length:2471 Min. : 0.00
## Class :character Class :character Class :character 1st Qu.: 15.00
## Mode :character Mode :character Mode :character Median : 20.00
## Mean : 22.09
## 3rd Qu.: 25.00
## Max. :150.00
## NA's :710
## laminas_procesadas tiempo_calidad
## Min. : 0.0 Min. : 0.0000
## 1st Qu.: 0.0 1st Qu.: 0.0964
## Median : 56.5 Median : 1.0000
## Mean : 108.5 Mean : 0.8687
## 3rd Qu.: 200.0 3rd Qu.: 1.0000
## Max. :1125.0 Max. :22.0000
## NA's :563 NA's :603
#Técnica 2: Borrar todos los registros NA de la base de datos
produccion <- produccion[!is.na(produccion$tmo_min),]
summary(produccion)
## fecha cliente piezas_prog tmo_min
## Length:1761 Length:1761 Length:1761 Min. : 0.00
## Class :character Class :character Class :character 1st Qu.: 15.00
## Mode :character Mode :character Mode :character Median : 20.00
## Mean : 22.09
## 3rd Qu.: 25.00
## Max. :150.00
##
## laminas_procesadas tiempo_calidad
## Min. : 0.0 Min. : 0.000
## 1st Qu.: 34.5 1st Qu.: 1.000
## Median : 100.0 Median : 1.000
## Mean : 131.7 Mean : 1.048
## 3rd Qu.: 202.0 3rd Qu.: 1.000
## Max. :1125.0 Max. :22.000
## NA's :226 NA's :255
produccion <- produccion[!is.na(produccion$laminas_procesadas),]
summary(produccion)
## fecha cliente piezas_prog tmo_min
## Length:1535 Length:1535 Length:1535 Min. : 0.00
## Class :character Class :character Class :character 1st Qu.: 15.00
## Mode :character Mode :character Mode :character Median : 20.00
## Mean : 22.26
## 3rd Qu.: 25.00
## Max. :120.00
##
## laminas_procesadas tiempo_calidad
## Min. : 0.0 Min. : 0.000
## 1st Qu.: 34.5 1st Qu.: 1.000
## Median : 100.0 Median : 1.000
## Mean : 131.7 Mean : 1.053
## 3rd Qu.: 202.0 3rd Qu.: 1.000
## Max. :1125.0 Max. :22.000
## NA's :49
#Técnica 3: Cambiar formato de piezas programadas y laminadas procesadas (de caracter a entero); de tmo_min y tiempo calidad (de caracter a minutos) y de fecha a formato fecha.
#Convertir de caracter a fecha
produccion$fecha <- as.Date(produccion$fecha, format = "%d/%m/%Y")
tibble(produccion)
## # A tibble: 1,535 × 6
## fecha cliente piezas_prog tmo_min laminas_procesadas tiempo_calidad
## <date> <chr> <chr> <int> <int> <dbl>
## 1 2022-08-05 STABILUS 3 300 120 600 1
## 2 2022-08-31 VARROC 210 120 210 2
## 3 2022-08-09 TRMX 400 100 50 1
## 4 2022-08-04 YANFENG 352 90 352 1
## 5 2022-08-03 VARROC 240 80 122 1
## 6 2022-08-18 STABILUS 1 600 75 376 1
## 7 2022-08-19 STABILUS 1 600 75 150 1
## 8 2022-08-29 STABILUS 1 600 75 151 1
## 9 2022-08-30 STABILUS 1 600 75 151 1
## 10 2022-08-31 STABILUS 1 600 75 400 1
## # … with 1,525 more rows
#Convertir de caracter a entero
produccion$ piezas_prog <- substr(produccion$ piezas_prog, start = 1, stop = 2)
tibble(produccion)
## # A tibble: 1,535 × 6
## fecha cliente piezas_prog tmo_min laminas_procesadas tiempo_calidad
## <date> <chr> <chr> <int> <int> <dbl>
## 1 2022-08-05 STABILUS 3 30 120 600 1
## 2 2022-08-31 VARROC 21 120 210 2
## 3 2022-08-09 TRMX 40 100 50 1
## 4 2022-08-04 YANFENG 35 90 352 1
## 5 2022-08-03 VARROC 24 80 122 1
## 6 2022-08-18 STABILUS 1 60 75 376 1
## 7 2022-08-19 STABILUS 1 60 75 150 1
## 8 2022-08-29 STABILUS 1 60 75 151 1
## 9 2022-08-30 STABILUS 1 60 75 151 1
## 10 2022-08-31 STABILUS 1 60 75 400 1
## # … with 1,525 more rows
produccion$ piezas_prog <- as.integer(produccion$ piezas_prog)
str(produccion)
## 'data.frame': 1535 obs. of 6 variables:
## $ fecha : Date, format: "2022-08-05" "2022-08-31" ...
## $ cliente : chr "STABILUS 3" "VARROC" "TRMX" "YANFENG" ...
## $ piezas_prog : int 30 21 40 35 24 60 60 60 60 60 ...
## $ tmo_min : int 120 120 100 90 80 75 75 75 75 75 ...
## $ laminas_procesadas: int 600 210 50 352 122 376 150 151 151 400 ...
## $ tiempo_calidad : num 1 2 1 1 1 1 1 1 1 1 ...
produccion$ laminas_procesadas <- substr(produccion$ laminas_procesadas, start = 1, stop = 2)
tibble(produccion)
## # A tibble: 1,535 × 6
## fecha cliente piezas_prog tmo_min laminas_procesadas tiempo_calidad
## <date> <chr> <int> <int> <chr> <dbl>
## 1 2022-08-05 STABILUS 3 30 120 60 1
## 2 2022-08-31 VARROC 21 120 21 2
## 3 2022-08-09 TRMX 40 100 50 1
## 4 2022-08-04 YANFENG 35 90 35 1
## 5 2022-08-03 VARROC 24 80 12 1
## 6 2022-08-18 STABILUS 1 60 75 37 1
## 7 2022-08-19 STABILUS 1 60 75 15 1
## 8 2022-08-29 STABILUS 1 60 75 15 1
## 9 2022-08-30 STABILUS 1 60 75 15 1
## 10 2022-08-31 STABILUS 1 60 75 40 1
## # … with 1,525 more rows
produccion$ laminas_procesadas <- as.integer(produccion$ laminas_procesadas)
str(produccion)
## 'data.frame': 1535 obs. of 6 variables:
## $ fecha : Date, format: "2022-08-05" "2022-08-31" ...
## $ cliente : chr "STABILUS 3" "VARROC" "TRMX" "YANFENG" ...
## $ piezas_prog : int 30 21 40 35 24 60 60 60 60 60 ...
## $ tmo_min : int 120 120 100 90 80 75 75 75 75 75 ...
## $ laminas_procesadas: int 60 21 50 35 12 37 15 15 15 40 ...
## $ tiempo_calidad : num 1 2 1 1 1 1 1 1 1 1 ...
#Técnica 1: Eliminar columnas inecesarias
merma <- subset(merma,select = -c (fecha))
#Técnica 1: Eliminar columnas inecesarias
scrap <- subset(scrap, select = -c (referencia, producto, ubicacion_de_desecho, estado, unidad_de_medida))
#Sacar número de variables:
describeData(produccion,head=1,tail=1)
## n.obs = 1535 of which 1485 are complete cases. Number of variables = 6 of which all are numeric FALSE
## variable # n.obs type H1 T1
## fecha* 1 1534 4 2022-08-05 2022-08-22
## cliente* 2 1535 3 STABILUS 3 STABILUS 1
## piezas_prog 3 1535 1 30 20
## tmo_min 4 1535 1 120 0
## laminas_procesadas 5 1535 1 60 0
## tiempo_calidad 6 1486 1 1 0
#R: Existen 6 variables.
#Sacar número de registros totales en la base de datos:
#R: Existen 1,535 registros por columna, siendo asi 9,210 registros totales en la base de datos.
#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable<-c("Fecha", "Cliente", "Piezas Programadas", "Tiempo Min", "Láminas Procesadas", "Tiempo Calidad")
Tipo<-c("Cualitativa", "Cualitativa", "Cuantitativa(Discreta)", "Cuantitativa (Continua)", "Cuantitativa(Discreta)","Cuantitativa(Continua)")
Escala_Medicion <-c("NA", "NA", "No. Piezas", "Horas", "No. Piezas", "Horas")
tabla<-data.frame(Variable, Tipo, Escala_Medicion)
knitr::kable(tabla)
| Variable | Tipo | Escala_Medicion |
|---|---|---|
| Fecha | Cualitativa | NA |
| Cliente | Cualitativa | NA |
| Piezas Programadas | Cuantitativa(Discreta) | No. Piezas |
| Tiempo Min | Cuantitativa (Continua) | Horas |
| Láminas Procesadas | Cuantitativa(Discreta) | No. Piezas |
| Tiempo Calidad | Cuantitativa(Continua) | Horas |
#Sacar número de variables:
describeData(merma,head=1,tail=1)
## n.obs = 10 of which 10 are complete cases. Number of variables = 2 of which all are numeric FALSE
## variable # n.obs type H1 T1
## mes* 1 10 3 ENERO Total general
## kilos 2 10 1 14560 185426
#R: Existen 2 variables.
#Sacar número de registros totales en la base de datos:
#R: Existen 10 registros por columna, siendo asi 20 registros totales en la base de datos.
#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable1 <-c("Mes", "Kilos")
Tipo1 <-c("Cualitativa", "Cuantitativa (Continua)")
Escala_Medicion1 <-c("NA", "Kilogramos")
tabla1 <-data.frame(Variable1, Tipo1, Escala_Medicion1)
knitr::kable(tabla1)
| Variable1 | Tipo1 | Escala_Medicion1 |
|---|---|---|
| Mes | Cualitativa | NA |
| Kilos | Cuantitativa (Continua) | Kilogramos |
#Sacar número de variables:
describeData(scrap,head=1,tail=1)
## n.obs = 250 of which 250 are complete cases. Number of variables = 3 of which all are numeric FALSE
## variable # n.obs type H1 T1
## fecha* 1 250 3 06/08/2022 05/08/2022
## cantidad 2 250 1 43 7
## ubicacion_de_origen* 3 250 3 Pre-Production Post-Production
#R: Existen 4 variables.
#Sacar número de registros totales en la base de datos:
#R: Existen 250 registros por columna, siendo asi 1,000 registros totales en la base de datos.
#Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua.
Variable2 <-c("Fecha", "ID_Producto", "Producto", "Cantidad", "Estado")
Tipo2 <-c("Cualitativa", "Cualitativa", "Cualitativa", "Cuantitativa (Discreta)", "Cualitativa")
Escala_Medicion2 <-c("NA", "NA", "NA", "Unidades", "NA")
tabla2 <-data.frame(Variable2, Tipo2, Escala_Medicion2)
knitr::kable(tabla2)
| Variable2 | Tipo2 | Escala_Medicion2 |
|---|---|---|
| Fecha | Cualitativa | NA |
| ID_Producto | Cualitativa | NA |
| Producto | Cualitativa | NA |
| Cantidad | Cuantitativa (Discreta) | Unidades |
| Estado | Cualitativa | NA |
summary(produccion)
## fecha cliente piezas_prog tmo_min
## Min. :2022-08-01 Length:1535 Min. : 1.00 Min. : 0.00
## 1st Qu.:2022-08-09 Class :character 1st Qu.:14.00 1st Qu.: 15.00
## Median :2022-08-17 Mode :character Median :20.00 Median : 20.00
## Mean :2022-08-16 Mean :26.02 Mean : 22.26
## 3rd Qu.:2022-08-24 3rd Qu.:32.00 3rd Qu.: 25.00
## Max. :2022-08-31 Max. :99.00 Max. :120.00
## NA's :1
## laminas_procesadas tiempo_calidad
## Min. : 0.00 Min. : 0.000
## 1st Qu.:11.00 1st Qu.: 1.000
## Median :20.00 Median : 1.000
## Mean :27.57 Mean : 1.053
## 3rd Qu.:40.00 3rd Qu.: 1.000
## Max. :98.00 Max. :22.000
## NA's :49
summary(merma)
## mes kilos
## Length:10 Min. : 13586
## Class :character 1st Qu.: 18415
## Mode :character Median : 20920
## Mean : 37085
## 3rd Qu.: 23265
## Max. :185426
summary(scrap)
## fecha cantidad ubicacion_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
Con la función de “Summary” fue posible el analizar que las bases de datos ya estuvieran completamente limpias, sin NA´s, con el formato apropiado de cada variable, y solo con las variables necesarias para poder hacer las gráficas solicitadas.
hist(produccion$piezas_prog, main = "Piezas producidas", ylab = "Frecuencia", xlab = "Piezas Programadas", col = "lightblue")
mean (produccion$piezas_prog)
## [1] 26.01694
En este gráfica podemos observar que es más común producir tandas menores a 20 piezas por cliente, pero en promedio se producen 26 piezas.
plot(produccion$tiempo_calidad, produccion$tmo_min, main = "Tiempo de calidad invertido por tiempo de producción", xlab = "Tiempo de Calidad", ylab = "Tiempo de Producción", col= "blue")
En esta gráfica podemos observar que a un tiempo de 50h de
producción, hay una mayor inversión de tiempo de calidad. Y
a un tiempo mayor a 60 horas, hay una mucha menor inversión de
tiempo de calidad. Lo que significa que entre más se tarden
haciendo un producto, menos horas de calidad le invierten, esto se
puede deber a que como el proceso es más largo, le invierten más cuidado
en cada paso, y cuando es más corto el proceso puede ser mas rutinario y
es necesario invertirle horas extra a asegurarse que se haya producido
correctamente.
ggplot(data=produccion, mapping = aes(piezas_prog, laminas_procesadas)) + geom_point(aes(color = tmo_min)) + theme_bw()
Con esta gráfica podemos observar que hay una relación lineal
positiva entre las piezas producidas y la cantida de laminas utilizadas
(materia prima) realizadas en un tiempo menor a 30 horas.
produccion %>%
group_by(cliente) %>%
summarise(frequency = n())
## # A tibble: 9 × 2
## cliente frequency
## <chr> <int>
## 1 DENSO 166
## 2 HELLA 60
## 3 MERIDIAN LIGHTWEIGHT 24
## 4 STABILUS 1 515
## 5 STABILUS 3 225
## 6 STABILUS 3. 17
## 7 TRMX 222
## 8 VARROC 108
## 9 YANFENG 198
En esta tabla podemos observar las veces que aparece el cliente en la base de datos de producción, viendo asi que “Stabilius 1” es el cliente que más pedidos le ordena a FORM.
table(merma$mes)
##
## ABRIL AGOSTO ENERO FEBRERO JULIO
## 1 1 1 1 1
## JUNIO MARZO MAYO SEPTIEMBRE Total general
## 1 1 1 1 1
proporciones <- c(14560, 22830, 22470, 18820, 23410, 18280, 19370, 32100, 13586)
etiquetas <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre")
pct <- round(proporciones/sum(proporciones)*100)
etiquetas <- paste(etiquetas, pct)
etiquetas <- paste(etiquetas,"%",sep="")
pie(proporciones,labels = etiquetas,
col=rainbow(length(etiquetas)),
main="Merma por mes")
En este gráfico podemos observar que la mayor cantidad de Merma
de lo que va de este año fue en Agosto con un 17%. Sin embargo,
no hubo una diferencia muy notoria entre todos los meses.
boxplot(scrap$cantidad ~ scrap$ubicacion_de_origen,
col = rainbow(ncol(trees)))
Con esta gráfica podemos observar que la cantidad de unidades
producidas está normalmente ubicada en “Pre-Producción” y asimismo esta
categoría es la más dispersa.
Al observar las horas de calidad invertidas en producción, se propone que FORM genere un sistema de calidad equitativo dependiendo del cliente y de la cantidad de horas invertidas en la producción, pues bien, hay mucha dispersión en la gráfica 1 como podemos observar, y esto puede ocasionar fallas en los productos entregados y asimismo habría un mayor control de calidad en planta. Un ejemplo de esto sería que el sistema generado de prioridad a los clientes más importantes como lo es Stabilus y asimismo si hubo mucho tiempo de producción en algun producto, las horas invertidas de calidad sean menores que las invertidas en un producto que se tardó menos en producir, esto tomando en cuenta que el producto con mayor tiempo de producción fue realizado con más cuidado en cada etapa, necesitando menos horas de calidad.
Tomando en cuenta la cantidad de merma generada, observamos que hay meses que se producen desde 14,560 kg (enero) hasta 32,100 kg (agosto), como se ve en la gráfica 5, merma generada proporcional a la cantidad de producción, siendo mayor en el tercer trimestre del año. Se propone invertir en el proceso de producción para disminuir el uso de láminas utilizadas por piezas programadas como se ve en la gráfica 3 para disminuir al máximo la dispersión existente al generar un nuevo acomodo de las laminas para la generación de los empaques o bien, que los residuos de las láminas se reciclen para la producción de nuevos empaques.
Con esta actividad, fue posible el analizar detenidamente la información brindada por FORM, donde pude notar primeramente que muchas de las bases de datos trabajadas interiormente, están desordenadas, no son del todo ágiles y carecen de orden, por lo que fue difícil comprender la información brindada de la base de datos de “Producción” principalmente, siendo una fuerte área de oportunidad el volver a hacer el formato de sus BD para que sus colaboradores y gente externa, puedan comprenderla, agilizar sus procesos y poder trabajar con ellas para hacer indicadores de mejora en el futuro.
Por otro lado, las gráficas realizadas fueron sumamente útiles para la mejor comprensión de la información brindada, dando una mejor visualización y gracias a ellas, se pudieron hacer propuestas de mejora respaldadas con datos verídicos, siendo los mas rectables la inmensa cantidad de merma que FORM produce en cada mes, así como el análisis de las horas de calidad y producción invertidas en los productos realizados en planta.
Para concluir, usar R como herramienta principal de análisis ha sido sumamente útil y nos ha ayudado a realizar todo lo necesario para que FORM pueda mejorar sus procesos, desde la limpieza de las bases, hasta crear gráficas complicadas, algunas operaciones y crar propuestas con visualizaciones atractivas.