❖ INTRODUCCIÓN

i) ¿Qué es un análisis exploratorio de los datos?
El análisis exploratorio de los datos, también conocido como EDA, es un método en el cual se pueden investigar y analizar conjuntos de datos mediante diversas técnicas para la visualización de datos, es de especial ayuda cuando se manejan grandes cantidades de datos. Su principal objetivo es descubrir patrones, tendencias, detectar irregularidades, probar hipótesis, y en sí, lograr entender con mayor profundidad los datos que se están analizando.

ii) ¿Cómo contribuye el análisis exploratorio de los datos a mejorar el proceso y los resultados de analítica descriptiva?
La analítica descriptiva consiste en identificar tendencias y relaciones entre las variables. La forma en que el análisis exploratorio ayuda a mejorar este proceso es que permite identificar estos patrones, tendencias y relaciones de forma más fácil y rápida al ser representados visualmente. Hallazgos que a simple vista no podrían ser encontrados por el ojo humano, así como también facilitar la selección de las variables más importantes para la situación o decisión que se está estudiando.

Antecedentes de la Empresa

Visión: En 2033 seremos una de las cinco mejores compañías de México que generan valor dentro de la cadena de suministro de las industrias que más valoran la forma en la que se protegen y trasladan las cosas.

Misión: Transformar nuestro entorno y resolver retos industriales de nuestros clientes a través de la colaboración, provocando nuevas oportunidades que potencian nuestro modelo de negocio, para alcanzar nuestros ideales.

Objetivos estrategicos:

  • Promover la sustentabilidad: reduciendo el uso de materiales no renovables, aumentar uso de materiales reciclables, optimizar sus recursos disminuyendo los residuos.

  • Fomentar la efectividad colaborativa: cumplir en tiempo y forma, establecer metas claras con sus respectivos responsables, tener transparencia dentro del equipo.

  • Fomentar la innovación: buscar promover la innovación en la organización donde los miembros de la empresa están trabajando juntos para lograr solucionar los problemas mediante su uso de ingenio y experimentación.

# Carga de librerias
library(xts)
library(dplyr)
library(ggplot2)
library(tseries)
library(stats)
library(forecast)
library(astsa)
library(corrplot)
library(AER)
library(vars)
library(dynlm)
library(TSstudio)
library(tidyverse)
library(sarima)
library(dygraphs)
library(readxl)
library(zoo)
library(DataExplorer)
library(foreign)
library(modelr)
library(broom)
library(ISLR)          
library(readr)
library(caret)
library(e1071)
library(class)
library(ROCR)
library(pROC)
library(lmtest)
library(caTools)
library(rpart)
library(rpart.plot)
library(psych)  
library(ggpubr)
library(reshape)
library(Metrics)
library(mlbench)
library(rsample)
library(cluster)     
library(factoextra)  
library(gridExtra)
library(readxl)
library(lubridate)
library(forecast)
library(RColorBrewer)
library(gt)
#install.packages  ("readtext")
library(readtext)
#install.packages("syuzhet")
library(syuzhet)
#install.packages("RColorBrewer")
library(RColorBrewer)
#install.packages("wordcloud")
library(wordcloud)
#install.packages("tm")
library(tm)

Contexto de la Industria

# Bases de datos
importadores <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Importers of Cartons boxes cases of corrugated paper or board 2020-2021.csv")

exportadores <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Exporters of Carton boxes cases of corrugated paper or board 2020-2021.csv")


#summary(importadores)
#summary(exportadores)

Glosario de variables

Importadores:

  • Continent.ID: Siglas para identificar el continente.

  • Continent: Nombre del continente.

  • Country.ID: Siglas para identificar el país y el continente al que pertenece.

  • Country: País.

  • Year: Año en el cual se registró el dato.

  • Trade.Value: El tamaño de la industria de la importación de cartón.

  • Trade.Value.Growth: El crecimiento porcentual del “Trade.Value” en relación al año anterior.

  • Trade.Value.Growth.Value: El crecimiento en unidades del “Trade.Value” en relación al año anterior.

  • Trade.Value.Previous: El tamaño de la industria de la importación de cartón en el año previo.

  • Trade.Value.Current: El tamaño de la industria de la importación de cartón en el año actual.

Exportadores:

  • Continent.ID: Siglas para identificar el continente.

  • Continent: Nombre del continente.

  • Country.ID: Siglas para identificar el país y el continente al que pertenece.

  • Country: País.

  • Year: Año en el cual se registró el dato.

  • Trade.Value: El tamaño de la industria de la exportación de cartón.

  • Trade.Value.Growth: El crecimiento porcentual del “Trade.Value” en relación al año anterior.

  • Trade.Value.Growth.Value: El crecimiento en unidades del “Trade.Value” en relación al año anterior.

  • Trade.Value.Previous: El tamaño de la industria de la exportación de cartón en el año previo.

  • Trade.Value.Current: El tamaño de la industria de la exportación de cartón en el año actual.

Importaciones y exportaciones de cartón

imp_crecimiento <- 
  importadores %>%
  group_by(Continent) %>%
  summarise(avg_growth = mean(Trade.Value.Growth),
            avg_value = mean(Trade.Value)) %>%
  filter(Continent != "Antarctica")

plot_imp <- ggplot(data=imp_crecimiento, aes(x=reorder(Continent, avg_value), y=avg_value, fill=avg_growth)) +
  geom_bar(stat="identity") + 
  coord_flip() +
   scale_fill_gradient(low = "yellow", high = "darkorange") +  
  labs(title = "Importaciones de Cartón por Continente")

exp_crecimiento <- 
  exportadores %>%
  group_by(Continent) %>%
  summarise(avg_growth = mean(Trade.Value.Growth),
            avg_value = mean(Trade.Value)) %>%
  filter(Continent != "Antarctica")

plot_exp <- ggplot(data=exp_crecimiento, aes(x=reorder(Continent, avg_value), y=avg_value, fill=avg_growth)) +
  geom_bar(stat="identity") + 
  coord_flip() +
  scale_fill_gradient(low = "yellow", high = "darkorange") +  
  labs(title = "Exportaciones de Cartón por Continente")

# Define a layout matrix with margins
layout_matrix <- rbind(c(1, 1), c(2, 2))

# Arrange the plots with the specified layout matrix
grid_arrangement <- grid.arrange(plot_imp, plot_exp, layout_matrix = layout_matrix)

imp_crecimiento_america <- 
  importadores %>%
  filter(Continent == "North America") %>%
  group_by(Country) %>%
  summarise(Trade.Value.Growth = mean(Trade.Value.Growth), Trade.Value = sum(Trade.Value)) %>%
  arrange(desc(Trade.Value)) %>%
  top_n(10, wt = Trade.Value)

plot_imp_america <- ggplot(data = imp_crecimiento_america, aes(x = reorder(Country, Trade.Value), y = Trade.Value, fill = Trade.Value.Growth)) +
  geom_bar(stat = "identity") + 
  coord_flip() +
  scale_fill_gradient(low = "yellow", high = "darkorange") +
  labs(title = "Importaciones de Cartón en Norteamérica", subtitle = "Top 10 Países por Value")

exp_crecimiento_america <- 
  exportadores %>%
  filter(Continent == "North America") %>%
  group_by(Country) %>%
  summarise(Trade.Value.Growth = mean(Trade.Value.Growth), Trade.Value = sum(Trade.Value)) %>%
  arrange(desc(Trade.Value)) %>%
  top_n(10, wt = Trade.Value)

plot_exp_america <- ggplot(data = exp_crecimiento_america, aes(x = reorder(Country, Trade.Value), y = Trade.Value, fill = Trade.Value.Growth)) +
  geom_bar(stat = "identity") + 
  coord_flip() +
  scale_fill_gradient(low = "yellow", high = "darkorange") + 
  labs(title = "Exportaciones de Cartón en Norteamérica", subtitle = "Top 10 Países por Value")

# Define a layout matrix with margins
layout_matrix <- rbind(c(1, 1), c(2, 2))

# Arrange the plots with the specified layout matrix
grid_arrangement2 <-grid.arrange(plot_imp_america, plot_exp_america, layout_matrix = layout_matrix)

ggsave("imp_na.png", plot = grid_arrangement2, device = "png")
## Saving 7 x 5 in image
imp_crecimiento_europa <- 
  importadores %>%
  filter(Continent == "Europe") %>%
  group_by(Country) %>%
  summarise(Trade.Value.Growth = mean(Trade.Value.Growth), Trade.Value = sum(Trade.Value)) %>%
  arrange(desc(Trade.Value)) %>%
  top_n(10, wt = Trade.Value)

plot_imp_europa <- ggplot(data = imp_crecimiento_europa, aes(x = reorder(Country, Trade.Value), y = Trade.Value, fill = Trade.Value.Growth)) +
  geom_bar(stat = "identity") + 
  coord_flip() +
  scale_fill_gradient(low = "yellow", high = "darkorange") +
  labs(title = "Importaciones de Cartón en Europa", subtitle = "Top 10 Países por Value")

exp_crecimiento_europa <- 
  exportadores %>%
  filter(Continent == "Europe") %>%
  group_by(Country) %>%
  summarise(Trade.Value.Growth = mean(Trade.Value.Growth), Trade.Value = sum(Trade.Value)) %>%
  arrange(desc(Trade.Value)) %>%
  top_n(10, wt = Trade.Value)



plot_exp_europa <- ggplot(data = exp_crecimiento_europa, aes(x = reorder(Country, Trade.Value), y = Trade.Value, fill = Trade.Value.Growth)) +
  geom_bar(stat = "identity") + 
  coord_flip() +
  scale_fill_gradient(low = "yellow", high = "darkorange") +
  labs(title = "Exportaciones de Cartón en Europa", subtitle = "Top 10 Países por Value")

# Define a layout matrix with margins
layout_matrix <- rbind(c(1, 1), c(2, 2))

# Arrange the plots with the specified layout matrix
grid_arrangement3 <- grid.arrange(plot_imp_europa, plot_exp_europa, layout_matrix = layout_matrix)

ggsave("imp_eu.png", plot = grid_arrangement3, device = "png")
## Saving 7 x 5 in image

Amenazas

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Aunque los EE.UU son los líderes del mercado de cartón en América, podemos considerar que el mercado Alemán de cartón puede ser una amenaza para Form. Esto se debe a que una gran parte de la industria automotríz y de autopartes se centra en Alemania. Asimismo, Alemania posee un valor comercial de alrededor de 1.5 mil millones de dólares (1,413,035,728 USD en el 2021), superando el valor comericial de 1.3 mil millones de dólares (1,319,071,8128 USD en el 2021) de los EE.UU.

  • El mercado de Los Países Bajos también pueden ser una amenaza para Form, ya que posee un gran crecimiento del 56% en cuanto a exportaciones de cartón en el 2021 (año en el que fueron grabados los datos) y es un mercado de 650 millones de dólares (651,558,509 USD). Esto siendo ~2.5 veces mayor que el mercado mexicano. También, la cercanía que tiene con Alemania también podría representar una amenaza adicional para Form. La interconexión de los mercados de los Países Bajos y Alemania podría facilitar la entrada de competidores alemanes en el mercado neerlandés, intensificando la competencia y afectando la cuota de mercado de Form.

Oportunidades

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Un gran beneficio para Form es que el mercado norteamericano ya se encuentra establecido en cuanto a Cartón. Claro, hay países con crecimiento como México (En específico el estado de Nuevo León) en cuanto al mercado automotriz. Existe la presencia actual de manufactura de autopartes en Nuevo León.

  • Ya que Form se centra en Detroit, Nuevo León, y León, la empresa se encuentra en grandes hotspots norteamericanos de la industria automotriz y de cartón. Por lo cual, siguiendo las tendencias actuales, sus clientes metas deben ser Kia, Ford, y Tesla.

Autopartes

# Base de datos
vol_autopartes <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\VFP_autopartes.csv")

Glosario de variables

vol_autopartes:

  • Periodos: Año y trimestre.

  • indice: Índice del volumen físico de la producción.

Índice del volumen físico de la producción

plot(vol_autopartes$Date, vol_autopartes$indice, type = "l", col = "orange", lwd = 2, xlab = "Fecha", ylab = "Índice", main = "Índice del volumen físico de la producción")

temporariedad<-ts(vol_autopartes$indice,start=c(2005),end=c(2023),frequency=4)
temporariedad_decompose<-decompose(temporariedad)
plot(temporariedad_decompose) 

decompose_plot <- autoplot(temporariedad_decompose)

Amenazas

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Aunque ha existido una tendencia positiva en los últimos años, existen muchas fluctuaciones en el comportamiento de la serie de tiempo desde el 2019. Si juntamos esto con los comentarios hechos por Felipe de Form, esto puede afectar la precisión al hacer predicciones de la demanda de Form.

  • La creciente tendencia de nearshoring puede afectar la volatilidad de la demanda para Form. Si se junta esto con los procesos ad hoc de la empresa, esto puede resultar en jornadas de trabajo altamente demandantes y puede incrementar la rotación de personal.

Oportunidades

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Se puede observar que existe estacionalidad en la producción de autopartes. Se puede observar que en el tercer trimestre de cada año existe una alza en cuanto al índice del volumen físico de la producción de autopartes en México. Conociendo este dato, Form puede elaborar un análisis de demanda de acuerdo a la estacionalidad y generar estrategias de planeación para suplir con la alta demanda de cartón y empaques para autopartes.

  • El índice del volumen físico de la producción de autopartes en México tiene una tendencia positiva. Lo cual puede indicar que, considerando el estado actual de la industria automotriz en México, puede existir una futura alza en la producción de autopartes en México. Esto se puede traducir a un crecimiento de demanda para Form.

  • El volumen físico de producción de autopartes se encuentra en uno de sus puntos más altos históricos en México ya que de acuerdo al INEGI, alcanzó un índice base de 105.8 en el 4to trimestre del 2023. Esto presenta la oportunidad de un mayor volumen de ventas para Form.

Automotriz

# Base de datos
vol_vehiculos <- read.csv("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\vol_vehiculos.csv")

Glosario de variables

vol_vehiculos:

  • Periodos: Año y trimestre.

  • indice: Índice del volumen físico de la producción.

Índice del volumen físico de la producción

plot(vol_vehiculos$Date, vol_vehiculos$Indice, type = "l", col = "orange", lwd = 2, xlab = "Fecha", ylab = "Índice", main = "Índice del volumen físico de la producción")

#### Descompocisión

temporariedad1<-ts(vol_vehiculos$Indice,start=c(2005),end=c(2023),frequency=4)
temporariedad1_decompose<-decompose(temporariedad1)
plot(temporariedad1_decompose) 

decompose_plot1 <- autoplot(temporariedad1_decompose)

Amenazas

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Aunque ha existido una tendencia positiva en los últimos años, existen muchas fluctuaciones en el comportamiento de la serie de tiempo. Esto puede indicar que existen temporadas más volátiles que otras.

Oportunidades

A través de las visualizaciones previas, podemos concluir lo siguiente:

  • Al igual que la producción de autopartes, existe estacionalidad en los datos. En el 3er trimestre de cada año existe una alza en cuanto al índice de producción de automóviles. Conociendo este dato, Form puede elaborar un análisis de demanda de acuerdo a la estacionalidad y generar estrategias de planeación para suplir con la alta demanda de cartón y empaques para autopartes.

  • El 2023 fue el año más alto histórico en cuanto al índice de producción de automóviles. Podemos combinar esto con la tendencia positiva que existe en los datos y se puede concluir que el mercado se está expandiendo en México.

Flujos IED del Cartón

# Base de datos
flujos_carton <- read_xlsx("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\flujos_ied_porsector_historico_2023_2.xlsx", sheet = "flujos_papel")

Glosario de la base de datos

De la base de datos de “flujos_carton”, podemos ver las siguientes variables:

  • año: Año en el cual se presentan los datos.

  • trimestre: Trimestre del año en el cual se presentan los datos.

  • flujo_industria: Flujo total de la industria de papel.

  • fab_ppc: Fabricación de pulpa, papel y cartón.

  • fab_prod_pc: Fabricación de productos de papel y cartón.

Serie de tiempo del Flujo de la industria

plot(flujos_carton$fecha, flujos_carton$flujo_industria, type = "l", col = "orange", lwd = 2, xlab = "Fecha", ylab = "Índice", main = "Flujo de la Industria de Papel, Pulpa y Cartón")

Descompocisión

ts_industry<-ts(flujos_carton$flujo_industria,start=c(2005),end=c(2023),frequency=4)
ts_industry_decompose<-decompose(ts_industry)
plot(ts_industry_decompose) 

decompose_plot <- autoplot(ts_industry_decompose)

Augmented Dickey-Fuller Test

adf.test(ts_industry)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  ts_industry
## Dickey-Fuller = -3.7549, Lag order = 4, p-value = 0.02623
## alternative hypothesis: stationary

De acuerdo a la prueba Dickey-Fuller, tenemos suficiente evidencia para concluir que la serie de tiempo es estacionaria.

ACF Plot

acf(flujos_carton$flujo_industria,main="Significant Autocorrelations")  

El ACF plot no muestra autocorrelación serial.

Box-Ljung Test

Box.test(flujos_carton$flujo_industria,lag=4,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  flujos_carton$flujo_industria
## X-squared = 2.2695, df = 4, p-value = 0.6863

El Box-Ljung Test sugiere que no existe autocorrelación serial de acuerdo a la cantidad de lags que ingresamos en el modelo.

ARMA

industry_ARMA <- arima(flujos_carton$flujo_industria, order = c(4, 0, 4))
summary(industry_ARMA)
## 
## Call:
## arima(x = flujos_carton$flujo_industria, order = c(4, 0, 4))
## 
## Coefficients:
##          ar1      ar2     ar3      ar4      ma1     ma2      ma3     ma4
##       0.2938  -0.1682  0.0287  -0.7430  -0.3405  0.3897  -0.1459  0.8605
## s.e.  0.2827   0.2439  0.2560   0.3077   0.2815  0.2417   0.1680  0.2452
##       intercept
##          61.097
## s.e.     15.444
## 
## sigma^2 estimated as 13734:  log likelihood = -440.38,  aic = 900.76
## 
## Training set error measures:
##                      ME     RMSE      MAE      MPE     MAPE      MASE
## Training set -0.1387552 117.1938 68.16661 44.65385 543.6709 0.6652215
##                     ACF1
## Training set -0.01997132
plot(industry_ARMA)

fitted_values <- fitted(industry_ARMA)
residuals <- residuals(industry_ARMA)
adf_test_result <- adf.test(na.omit(fitted_values))
print(adf_test_result)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(fitted_values)
## Dickey-Fuller = -9.2028, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
Box_test_result <- Box.test(residuals, lag = 4, type = "Ljung-Box")
print(Box_test_result)
## 
##  Box-Ljung test
## 
## data:  residuals
## X-squared = 0.24062, df = 4, p-value = 0.9933

Al visualizar nuestras raíces inversas, podemos ver que el modelo es confiable ya que ningún punto reside en el exterior

De acuerdo a la prueba Dickey-Fuller, tenemos suficiente evidencia para concluir que la serie de tiempo es estacionaria.

El Box-Ljung Test sugiere que no existe autocorrelación serial de acuerdo a la cantidad de lags que imputamos en el modelo.

ARMA Forecast

industry_ARMA_forecast <- forecast(industry_ARMA, h = 5)
print(industry_ARMA_forecast)
##    Point Forecast      Lo 80    Hi 80     Lo 95    Hi 95
## 72      -17.41155 -169.08117 134.2581 -249.3702 214.5471
## 73       59.44057  -92.28502 211.1662 -172.6037 291.4848
## 74       18.69601 -136.21737 173.6094 -218.2236 255.6156
## 75       51.23540 -103.93779 206.4086 -186.0815 288.5523
## 76      123.61424  -31.72100 278.9495 -113.9505 361.1790
autoplot(industry_ARMA_forecast)

FODA

Fortalezas:

  • Entregas urgentes y servicio rápido: Son capaces de responder a sus clientes en menos de 24 horas y entregarle en menos de 2 semanas, como el caso que tuvieron con Yanfeng.

  • Anticipación de la demanda: Las alternativas de solución que ofrecen no se limitan a algún material o proceso productivo, diseñan y fabrican el mejor producto de acuerdo a la necesidad del cliente.

  • Anticipación al riesgo: Los diferencia el poder identificar potenciales riesgos que afecten el suministro de empaques a todas las líneas de producción.

  • Modelo de negocio único: Identifican problemática, desarrollo de ingeniería, soporte eficiente, y especialización en proyectos. La eficiencia de su modelo de negocio se puede ver avalado por el Premio Nacional de Envase que ganaron en múltiples ocasiones.

Debilidades:

  • Falta de marketing: No tienen presencia en Instagram, su perfil no tiene publicaciones y solo tiene un link a su página web , su página en Facebook y Linkedin tiene pocas interacciones y seguidores.

  • Alcance de marca débil: Al contar con un portafolio de clientes limitado no se le da la suficiente importancia a la promoción de los servicios que ofrece la empresa ni a su brand awareness que les podría ayudar a conseguir más clientes.

  • Alta rotación laboral por separación voluntaria: Se han implementado diversos incentivos, prestaciones y beneficios pero sigue habiendo una tasa muy alta del personal que decide irse por cuenta propia y sin una razón específica.

  • Estilo de trabajo rápido: Una de las mayores fortalezas y diferenciador de la empresa es su capacidad de realizar entregas urgentes y de calidad a sus clientes, sin embargo, también podría ser una de las principales razones por las que muchos colaboradores consideran salirse de la empresa al no lograr adaptarse al ritmo de trabajo.

Oportunidades:

  • Expansión a Estados Unidos: FORM encuentra una oportunidad de crecimiento en el mercado estadounidense, y esta idea es viable , ya que Estados Unidos se encuentra bien establecido dentro de la industria del cartón.

  • Nearshoring: Se pueden notar tendencias de crecimiento en el mercado automotriz en Nuevo León, empresas reconocidas internacionalmente como Tesla buscan implementar operaciones en el estado.

  • Dirigirse un nuevo segmento de mercado: Existe la presencia actual de manufactura de autopartes en el estado y la posibilidad de que más empresas se establezcan en un futuro cercano, por lo que FORM podría buscar ofrecer sus servicios a empresas grandes e internacionales como Kia, Ford, y Tesla, que tienen altas cantidades de producción y podrían ser beneficiadas por su modelo de trabajo único.

  • Cobertura de tipo de cambio: La industria del cartón depende fuertemente de las importaciones de insumos valorados en divisas (principalmente dólares y euros), por lo que, las fluctuaciones en el tipo de cambio podrían impactar de manera negativa a las empresas en esta industria. Para mantener sus costos de producción estables ante riesgos sobre tasas de cambio, FORM debe contar con estrategias de cobertura de tipo de cambio.

Amenazas:

  • Nearshoring: El mercado Alemán y de los Países Bajos de cartón pueden representar una amenaza para FORM. Un gran porcentaje de la industria automotriz y de autopartes se encuentra ubicada en Alemania, siendo este el país con mayores exportaciones de cartón en el mundo. Además, los Países Bajos han experimentado un notable crecimiento del 56% en cuanto a exportaciones de cartón en el 2021. Por lo que, la interconexión entre ambos países podría facilitar la entrada de competidores alemanes en el mercado neerlandés, intensificando así la competencia.

  • Beneficios ofrecidos por la competencia: A pesar de que FORM ha intentado implementar diversos beneficios para sus colaboradores, ninguno ha ayudado a disminuir la alta rotación laboral y FORM no puede permitirse el implementar múltiples beneficios como sus competidores más grandes.

  • Fluctuaciones y estacionalidad en la industria automotriz y de autopartes: Aunque ha existido una tendencia positiva en los últimos años, existen muchas fluctuaciones en el comportamiento de la serie de tiempo de la industria automotriz. Esto puede indicar que existen temporadas más volátiles que otras, por lo que es necesario que FORM genere un plan de gestión de riesgos que los ayude a navegar mejor esa variación.

  • Automatización en la industria del cartón: Los procesos de producción de FORM todavía dependen de gran manera de la mano de obra, mientras que competidores más grandes y reconocidos pueden invertir en la compra de máquinas que permitan una mayor automatización en sus procesos, FORM tiene una alta tasa de rotación laboral y no puede permitirse una inversión al nivel de competidores más grandes.

Estrategias a corto plazo:

1. Implementar estrategias de cobertura de tipo de cambio para minimizar el impacto de las fluctuaciones en la industria del cartón.

2. Invertir en estrategias de employer branding para mejorar la imagen de la empresa y reducir la rotación laboral.

3. Mejorar los beneficios ofrecidos a los colaboradores, tomando como referencia los que mejor les funcionaron en el pasado o aquellos ofrecidos por su competencia.

Análisis PESTLE

Políticos

  • El tratado del libre comercio entre Estados Unidos y México permite que las mercancías pasen con facilidad y con impuestos casi nulos por la misma alianza política y aduanera.

  • Políticas de inmigración (Visas de trabajos / Inmigración ilegal), hacen que mover trabajadores atravez de paises sea mas complicado.

  • Las regulaciones laborales, incluyendo las relacionadas con la rotación de personal y los incentivos laborales, influyen en la capacidad de Form para retener talento y mantener una fuerza laboral estable.

Económicos

  • Las economías de ambos países son muy buenas y favorables para la empresa sin embargo Estados Unidos destaca más por su economía que en México.

  • La competencia global puede influir en los precios y la demanda de los productos de Form, especialmente si surgen competidores internacionales con ventajas de costo o tecnología, como seria en el nearshoring.

  • Los cambios en los salarios mínimos y los costos laborales pueden afectar los costos de producción de Form y su competitividad en el mercado, de esta manera teniendo una mayor rotación de empleados al igual que es posible entrar en números rojos.

Sociales

  • Por la parte social en cuestión de manufactura méxico es líder a nivel mundial y más en estos momentos que muchas empresas de talla internacional como tesla, kia, honeywell entre muchas están optando por migrar su centro de operaciones y manufactura al país ya que es sumamente económico y seguro.

  • La tasa de homicidios en México supera el récord establecido en los sexenios anteriores.

  • Empresa que fabrica todo su producto en méxico siendo su manufactura mexicana y todo su mercado son empresas extranjeras como tesla (no trabajan con empresas mexicanas ni coreanas).

Tecnológicos

  • Estados Unidos a lo largo de la historia se ha destacado por llevar la innovación de ramas tecnológicas y es un país que tiene demasiados fondos para el desarrollo de tecnologías y procesos.

  • IA avanzando en el mercado Latino, lo cual dejaría sin trabajo a miles de personas pero aceleraría los procesos.

  • Nuevas máquinas tecnológicas para automatizar y eficientar el proceso de pegado de cajas.

Legales

  • Las leyes laborales relacionadas con la contratación, el despido y los incentivos pueden influir en las prácticas de recursos humanos de Form.

  • Normativas ambientales y de seguridad industrial.

  • Las regulaciones ambientales, como las relacionadas con la gestión de residuos y las emisiones es un tema muy valorado en ambos países, lo cual causa que Form tenga que tener actualizado todos los servicios relacionados a estas regulaciones.

Ambientales

México * Impacto ambiental de la industria, incluida la gestión de residuos y emisiones.

  • Adaptación al cambio climático y regulaciones ambientales.

Estados Unidos * Políticas ambientales y sus implicaciones para la industria, incluidas las regulaciones sobre emisiones y energía renovable.

  • Gestión de recursos naturales y sostenibilidad.

Estrategias a corto plazo:

1. DIVERSIFICACIÓN GEOGRÁFICA Y REDUCCIÓN DE RIESGOS: Búsqueda de oportunidades extranjeras con economías estables y proyectos a futuro. Todo por medio de diversificar más su presencia geográfica.

2. INVERSIÓN EN TECNOLOGÍA E INNOVACIÓN: Las inteligencias artificiales y las automatizaciones han tenido un boom espectacular en los últimos años el cual la empresa debería empezar el análisis para implementar nuevas medidas de automatización de procesos para así exponencial izar su eficiencia y productividad de fábrica y entrega de proyectos ayudando así a mantener la competitividad que tienen en el mercado.

3. DESARROLLO DE ESTRATEGIAS DE RETENCIÓN DE TALENTO: La empresa debe de buscar un nuevo enfoque, es cuestión a recursos humanos, ya que deben de buscar nuevas maneras para retener el talento dentro de la planta industrial para así reducir costos variables dentro de capacitaciones. Buscando oportunidades laborales y manteniendo la fuerza laboral estable y altamente calificada.

❖ DEFINICIÓN DE LA SITUACIÓN PROBLEMA

A partir de la sesión de inicio del reto con el Socio Formador FORM especificar las dos situaciones problema.

❖ PREGUNTAS DE ANÁLISIS

1. ¿Cuál es el puesto con más bajas al mes?
En los tres años analizados, el puesto con más bajas al mes es el de ayudante genereal, siendo el año 2023 donde hubo más renuncias de este puesto, lo cual parece que FORM mejoró al año siguiente al haber una disminución significativa. Después de ayudante general seguiría ayudante de embarques con 3 renuncias en 2023 y luego ayudante general cedis con 2 renuncias en 2024.

2. ¿Cuánto duran los colaboradores? Én la gráfica se puede apreciar el pico más alto en el 0, indicando que la mayoría de colaboradores que renuncian no llegan ni a completar el mes trabajando para FORM.

3. ¿Existe relación entre la residencia y edad de los colaboradores y su propensión a renunciar? En este caso se tomaron los municipios como referencia para la residencia de los colaboradores. El municipio con mayores renuncias fue Monterrey, y el municipio con más valores atípicos fue Apodaca. Además, se puede apreciar que la mediana de edad de las personas que renuncian en la mayoría de los municipios es de 30 años.

4. ¿Existe relación entre el puesto y edad de los colaboradores y su propensión a renunciar? El puesto con más renuncias es costurera y la mediana de edad es aproximadamente 30 años. Siguiéndole ayudante general de cedis con mediana de 45 años, y luego chofer con mediana de 30 años. Ayudante general es donde hay más valores atípicos.

5. ¿Cuál es el promedio de ventas por mes para Form? El promedio de ventas por mes en el año 2023 de FORM fue de aproximadamente 400 productos (ya que se uso la variable cantidad). Teniendo un pico en diciembre. El promedio de ventas por mes en el año 2022 de FORM fue de aproximadamente 350 productos (ya que se uso la variable cantidad). Teniendo un pico en diciembre. El promedio de ventas por mes en el año 2021 de FORM fue de aproximadamente 350 productos (ya que se uso la variable cantidad). Teniendo un pico en julio.

6. ¿Cúales son los mejores clientes de FORM? El mejor cliente de FORM con es Stabilus, siguiéndole Aptiv Services Us, Llc, y en tercer lugar Hella Automotive Mexico.

❖ ANÁLISIS EXPLORATORIO DE LOS DATOS (EDA)

# Bases de datos relevantes para responder las preguntas de análisis

# Base de datos RH
RH <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Form_RH_Junta (1).xlsx")

# Base de datos RH Encuesta
Encuesta <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Encuesta_Datos_FORM_Fall2023.xlsx")

# Base de datos Ventas por años
# 2023
Ventas23 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 3)

# 2022
Ventas22 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 2)

# 2021
Ventas21 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 1)

# Base de datos Ventas General
datos_2021 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 1)
datos_2022 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 2)
datos_2023 <- read_excel("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx", sheet = 3)

VentasG <- rbind(datos_2021, datos_2022, datos_2023)

Limpiar las bases

# Nuevo df de Recursos Humanos con solo las columnas necesarias
RH1 <- RH[, !(names(RH) %in% c("No.", "RFC", "Imss", "SD", "Factor de Crédito Infonavit", "No. De Crédito Infonavit", "CURP", "Banco", "Correo Electronico", "Observaciones de baja", "Número de Télefono","Fecha de Baja", "dia", "mes", "año"))]
RH1
## # A tibble: 625 × 20
##    Apellido        Nombre `Fecha de nacimiento`  Edad Género `Fecha de Alta`    
##    <chr>           <chr>  <dttm>                <dbl> <chr>  <dttm>             
##  1 Luna Lopez      Yolan… 1985-08-18 00:00:00      39 Femen… 2017-02-20 00:00:00
##  2 Suarez Romo     Julio… 1969-06-27 00:00:00      55 Mascu… 2017-12-01 00:00:00
##  3 Cruz Ramos      Victo… 1989-06-21 00:00:00      35 Mascu… 2018-03-23 00:00:00
##  4 Esparza Pasaron Lucer… 1997-11-20 00:00:00      27 Femen… 2018-09-06 00:00:00
##  5 Garcia Perales  Yulia… 1984-08-19 00:00:00      40 Femen… 2019-05-02 00:00:00
##  6 Yabert Alvarado Mario… 1990-06-24 00:00:00      34 Mascu… 2019-07-30 00:00:00
##  7 Lopez Torres    Martin 1978-02-27 00:00:00      46 Mascu… 2020-08-20 00:00:00
##  8 Rodriguez More… Nicol… 1992-01-11 00:00:00      32 Mascu… 2020-11-03 00:00:00
##  9 Celestino Barb… Jaime  1982-06-02 00:00:00      42 Mascu… 2021-02-16 00:00:00
## 10 Hernandez Felix Emili… 1993-06-22 00:00:00      31 Femen… 2021-03-25 00:00:00
## # ℹ 615 more rows
## # ℹ 14 more variables: `Primer Mes` <dttm>, `Cuarto Mes` <dttm>,
## #   `Fecha Baja` <chr>, Puesto <chr>, Dpto <chr>, `Lugar de Nacimiento` <chr>,
## #   Calle <chr>, Número <chr>, Colonia <chr>, Municipio <chr>, Estado <chr>,
## #   CP <chr>, `Estado Civil` <chr>, `Causa de Baja` <chr>
# Nuevo df de Ventas con columnas necesarias
Ventas21 <- Ventas21[, !(names(Ventas21) %in% c("Folio de Factura", "No. OC Cliente", "Ref. cliente", "Estado", "Categoría de producto"))]
Ventas21
## # A tibble: 6,563 × 4
##    Fecha               Cliente                                 Producto Cantidad
##    <dttm>              <chr>                                   <chr>       <dbl>
##  1 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [CAJA R…      100
##  2 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [CELDA …       80
##  3 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180022…     1000
##  4 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180003…      100
##  5 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180203…       50
##  6 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180203…      300
##  7 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…       70
##  8 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…       60
##  9 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…      100
## 10 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180112…       60
## # ℹ 6,553 more rows
Ventas22 <- Ventas22[, !(names(Ventas22) %in% c("Folio de Factura", "No. OC Cliente", "Ref. cliente", "Estado", "Categoría de producto"))]
Ventas22
## # A tibble: 4,868 × 4
##    Fecha               Cliente           Producto                       Cantidad
##    <dttm>              <chr>             <chr>                             <dbl>
##  1 2022-01-03 00:00:00 DENSO MEXICO      [PART#: CHAROLA A 24 CHAROLA …       13
##  2 2022-01-03 00:00:00 DENSO MEXICO      [MX989001-0650 PALLET 330 MCA…        2
##  3 2022-01-03 00:00:00 DENSO MEXICO      [PART#: Retrabajo de 19 charo…        1
##  4 2022-01-03 00:00:00 DENSO MEXICO      [PART# TAPA A24 TAPA DE TERMO…     1212
##  5 2022-01-03 00:00:00 DENSO MEXICO      [PART#: CHAROLA A 24 CHAROLA …       12
##  6 2022-01-03 00:00:00 DENSO MEXICO      [PART#: CHAROLA FPI 16 EN PLA…       25
##  7 2022-01-03 00:00:00 TOKAI RIKA MEXICO [CELDA CON MICRO CORUUGAD O E…      150
##  8 2022-01-03 00:00:00 TOKAI RIKA MEXICO [CAJA RSC ECT 36 DK PAD ECT 3…      200
##  9 2022-01-03 00:00:00 TOKAI RIKA MEXICO [TR14085 KIT 95161] KIT 95161       250
## 10 2022-01-03 00:00:00 TOKAI RIKA MEXICO [TR13776 CAJA RSC CK 44 ECT C…      295
## # ℹ 4,858 more rows
Ventas23 <- Ventas23[, !(names(Ventas23) %in% c("Folio de Factura", "No. OC Cliente", "Ref. cliente", "Estado", "Categoría de producto"))]
Ventas23
## # A tibble: 5,275 × 4
##    Fecha               Cliente                                 Producto Cantidad
##    <dttm>              <chr>                                   <chr>       <dbl>
##  1 2023-12-22 00:00:00 Aptiv Services US, LLC                  "[CMP- …     7488
##  2 2023-12-22 00:00:00 Aptiv Services US, LLC                  "[CMP-C…      698
##  3 2023-12-21 00:00:00 HELLA AUTOMOTIVE MEXICO                 "[467.4…      800
##  4 2023-12-21 00:00:00 HELLA AUTOMOTIVE MEXICO                 "[467.9…     3200
##  5 2023-12-20 00:00:00 Aptiv Services US, LLC                  "[CMP- …     7488
##  6 2023-12-20 00:00:00 FAURECIA SISTEMAS AUTOMOTRICES DE MEXI… "[BOX-0…      624
##  7 2023-12-20 00:00:00 FAURECIA SISTEMAS AUTOMOTRICES DE MEXI… "[PALLE…       52
##  8 2023-12-19 00:00:00 AVANZAR INTERIOR PRODUCTS DE MEXICO     "[Dunna…       77
##  9 2023-12-19 00:00:00 AVANZAR INTERIOR PRODUCTS DE MEXICO     "[ROPAC…       77
## 10 2023-12-18 00:00:00 HELLA AUTOMOTIVE MEXICO                 "[467.4…      200
## # ℹ 5,265 more rows
# Nuevo df de Ventas con columnas necesarias
VentasG <- VentasG[, !(names(VentasG) %in% c("Folio de Factura", "No. OC Cliente", "Ref. cliente", "Estado", "Categoría de producto"))]
VentasG
## # A tibble: 16,706 × 4
##    Fecha               Cliente                                 Producto Cantidad
##    <dttm>              <chr>                                   <chr>       <dbl>
##  1 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [CAJA R…      100
##  2 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [CELDA …       80
##  3 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180022…     1000
##  4 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180003…      100
##  5 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180203…       50
##  6 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180203…      300
##  7 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…       70
##  8 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…       60
##  9 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180111…      100
## 10 2021-01-04 00:00:00 GRUPO ANTOLIN SALTILLO, S. de R.L de C… [180112…       60
## # ℹ 16,696 more rows

Glosario de variables

Base de datos Recursos Humanos

  • Apellido: Apellido del empleado.
  • Nombre: Nombre del empleado.
  • Fecha de nacimiento: Fecha de nacimiento del empleado.
  • Edad: Edad del empleado.
  • Género: Género del empleado.
  • Fecha de alta: Fecha en la que el empleado fue dado de alta.
  • Primer mes: Mes en el que el empleado comenzó a trabajar.
  • Cuarto mes: Mes cuatro después de que el empleado comenzó a trabajar.
  • Fecha de baja: Fecha en la que el empleado fue dado de baja.
  • Puesto: Puesto o posición laboral del empleado.
  • Dpto: Departamento al que pertenece el empleado.
  • Lugar de nacimiento: Lugar de nacimiento del empleado.
  • Calle: Calle de la dirección del empleado.
  • Número: Número de la dirección del empleado.
  • Colonia: Colonia de la dirección del empleado.
  • Municipio: Municipio de la dirección del empleado.
  • Estado: Estado de la dirección del empleado.
  • CP: Código Postal de la dirección del empleado.
  • Estado Civil: Estado civil del empleado.
  • Causa Baja: Causa de la baja del empleado.

Base de datos Ventas

  • Folio de factura: Número de identificación único asociado a una factura.
  • Fecha: Fecha en la que se realizó la transacción.
  • No. OC Cliente: Número de orden de compra del cliente relacionado con la factura.
  • Ref. cliente: Referencia específica del cliente asociada a la factura.
  • Cliente: Nombre o identificación del cliente que realizó la compra.
  • Producto: Nombre o descripción del producto vendido.
  • Cantidad: Cantidad de productos vendidos en la transacción.
  • Estado: Estado actual de la transacción (posted o cancel).
  • Categoría de producto: Clasificación del producto en una categoría específica (por ejemplo, cartón, retornable, servicios).

Base de datos RH Encuesta

  • Encuesta: Número de encuesta hecha.
  • Puesto: El cargo o posición que ocupa la persona encuestada.
  • Antigüedad: Tiempo que la persona lleva trabajando en su puesto actual.
  • Razón de entrada: Motivo por el cual la persona entró a trabajar en su empleo actual.
  • Salario Bueno: Percepción de la persona sobre si su salario es bueno.
  • Prestaciones Bueno: Percepción de la persona sobre si las prestaciones que recibe son buenas.
  • Jornada No Excesiva: Opinión de la persona sobre si su jornada laboral es excesiva o no.
  • Ofrecimiento de Herramientas: Si la empresa ofrece las herramientas necesarias para realizar el trabajo.
  • No Molestia por Temperatura: Si la persona no se ve molesta por la temperatura en su lugar de trabajo.
  • Estrés Bajo: Si la persona siente que su nivel de estrés es bajo.
  • Facilidad de Transporte: Si la persona percibe que tiene facilidad para llegar a su lugar de trabajo.
  • Zona de Trabajo Cómoda: Si la persona considera que la zona de trabajo es cómoda.
  • Permanencia para Formación Futuro: Si la persona considera que su permanencia en la empresa le permitirá formarse para el futuro.
  • Situaciones de Conflicto Sufridas: Si la persona ha sufrido situaciones de conflicto en su trabajo.
  • Molestias en el Puesto: Si la persona experimenta molestias en su puesto de trabajo.
  • Sentimiento de Formación: Si la persona siente que la empresa le ofrece oportunidades de formación.
  • Edad: Edad de la persona encuestada.
  • Género: Género de la persona encuestada.
  • Estado Civil: Estado civil de la persona encuestada.
  • Municipio: Municipio donde reside la persona encuestada.
  • Nivel Escolar: Nivel educativo alcanzado por la persona encuestada.
  • Personas Dependientes: Si la persona tiene personas dependientes a su cargo.
# Recursos Humanos
str(RH1)
## tibble [625 × 20] (S3: tbl_df/tbl/data.frame)
##  $ Apellido           : chr [1:625] "Luna Lopez" "Suarez Romo" "Cruz Ramos" "Esparza Pasaron" ...
##  $ Nombre             : chr [1:625] "Yolanda Judith" "Julio Cesar" "Victor Abel" "Lucero Shanyeza" ...
##  $ Fecha de nacimiento: POSIXct[1:625], format: "1985-08-18" "1969-06-27" ...
##  $ Edad               : num [1:625] 39 55 35 27 40 34 46 32 42 31 ...
##  $ Género             : chr [1:625] "Femenino" "Masculino" "Masculino" "Femenino" ...
##  $ Fecha de Alta      : POSIXct[1:625], format: "2017-02-20" "2017-12-01" ...
##  $ Primer Mes         : POSIXct[1:625], format: "2017-03-22" "2017-12-31" ...
##  $ Cuarto Mes         : POSIXct[1:625], format: "2017-06-20" "2018-03-31" ...
##  $ Fecha Baja         : chr [1:625] "2/10/2023" "5/1/2023" "31/10/2023" "0/1/1900" ...
##  $ Puesto             : chr [1:625] "Costurera" "Gestor" "Chofer" "Lider" ...
##  $ Dpto               : chr [1:625] "Costura" "Embarques" "Embarques" "Produccion Cartón Mdl" ...
##  $ Lugar de Nacimiento: chr [1:625] NA NA NA NA ...
##  $ Calle              : chr [1:625] "De Los Carniceros" "Mar Rojo" "Altamura" "Dolores Hidalgo" ...
##  $ Número             : chr [1:625] NA NA "216" NA ...
##  $ Colonia            : chr [1:625] "C. H. Blas Chumacero C.T.M" "Loma Linda" "Lomas De San Martin" "Insurgentes" ...
##  $ Municipio          : chr [1:625] "San Nicolas De Los G" "Monterrey" "Pesqueria" "Apodaca" ...
##  $ Estado             : chr [1:625] "Nuevo León" "Nuevo León" "Nuevo León" "Nuevo León" ...
##  $ CP                 : chr [1:625] "66473" "64120" "66673" "66612" ...
##  $ Estado Civil       : chr [1:625] "Casado" "Casado" "Casado" "Soltero" ...
##  $ Causa de Baja      : chr [1:625] "Personal" "Interna" "No le agradaba horario de entrada/salida" "Inducida" ...
# Ventas
str(Ventas23)
## tibble [5,275 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Fecha   : POSIXct[1:5275], format: "2023-12-22" "2023-12-22" ...
##  $ Cliente : chr [1:5275] "Aptiv Services US, LLC" "Aptiv Services US, LLC" "HELLA AUTOMOTIVE MEXICO" "HELLA AUTOMOTIVE MEXICO" ...
##  $ Producto: chr [1:5275] "[CMP- C0027158] CMP-C0027158 Centro de Cartón de 0.940\" Blue" "[CMP-C0030139] CMP-C0030139 Núcleo de Cartón de 0.500\" Red" "[467.416-21 COMPARTIMENT INSERT 1132X712X231MM CC] Sudáfrica. Celdas en Contenedor." "[467.905-59 INSERT 368.3X60X25.4 MM FOAM] Sudáfrica. Inserto Foam." ...
##  $ Cantidad: num [1:5275] 7488 698 800 3200 7488 ...
str(Ventas22)
## tibble [4,868 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Fecha   : POSIXct[1:4868], format: "2022-01-03" "2022-01-03" ...
##  $ Cliente : chr [1:4868] "DENSO MEXICO" "DENSO MEXICO" "DENSO MEXICO" "DENSO MEXICO" ...
##  $ Producto: chr [1:4868] "[PART#: CHAROLA A 24 CHAROLA DE PLASTICO CORRUGADO 6 CAVIDADES, COLOR NEGRO EN 4MM + ACCESORIOS DE PLASTICO COR"| __truncated__ "[MX989001-0650 PALLET 330 MCA ACP] PALLET 330 MCA ACP" "[PART#: Retrabajo de 19 charolas (diferentes issues)] PART#: Retrabajo de 19 charolas (diferentes issues)" "[PART# TAPA A24 TAPA DE TERMOFORMADO PARA A24 EN LA COMPRA MINIMA DE 3000 TAPAS, PRECIO OTORGADO SI SE RECIBE P"| __truncated__ ...
##  $ Cantidad: num [1:4868] 13 2 1 1212 12 ...
str(Ventas21)
## tibble [6,563 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Fecha   : POSIXct[1:6563], format: "2021-01-04" "2021-01-04" ...
##  $ Cliente : chr [1:6563] "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." ...
##  $ Producto: chr [1:6563] "[CAJA RSC 180302840] 180302840" "[CELDA ARMADA 180302870] 180302870" "[180022270 LINNER CMP-1210] LINNER 180022270 (L42 P)" "[180003720 CAJA RSC] 180003720 CAJA RSC" ...
##  $ Cantidad: num [1:6563] 100 80 1000 100 50 300 70 60 100 60 ...
# Ventas General
str(VentasG)
## tibble [16,706 × 4] (S3: tbl_df/tbl/data.frame)
##  $ Fecha   : POSIXct[1:16706], format: "2021-01-04" "2021-01-04" ...
##  $ Cliente : chr [1:16706] "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." "GRUPO ANTOLIN SALTILLO, S. de R.L de C.V." ...
##  $ Producto: chr [1:16706] "[CAJA RSC 180302840] 180302840" "[CELDA ARMADA 180302870] 180302870" "[180022270 LINNER CMP-1210] LINNER 180022270 (L42 P)" "[180003720 CAJA RSC] 180003720 CAJA RSC" ...
##  $ Cantidad: num [1:16706] 100 80 1000 100 50 300 70 60 100 60 ...
# Ver los nombres de las columnas del df de RH
colnames(RH1)
##  [1] "Apellido"            "Nombre"              "Fecha de nacimiento"
##  [4] "Edad"                "Género"              "Fecha de Alta"      
##  [7] "Primer Mes"          "Cuarto Mes"          "Fecha Baja"         
## [10] "Puesto"              "Dpto"                "Lugar de Nacimiento"
## [13] "Calle"               "Número"              "Colonia"            
## [16] "Municipio"           "Estado"              "CP"                 
## [19] "Estado Civil"        "Causa de Baja"
# Cambiar nombres de columnas a que no tengan espacios del df RH1

# Nombres de las columnas que deseas cambiar
columnas_a_cambiar <- c("Fecha de nacimiento", "Fecha de Alta", "Primer Mes", "Cuarto Mes", 
                        "Fecha Baja", "Lugar de Nacimiento", "Estado Civil", "Causa de Baja")

# Nuevos nombres para estas columnas
nuevos_nombres <- c("Fecha_de_nacimiento", "Fecha_de_Alta", "Primer_Mes", "Cuarto_Mes", 
                    "Fecha_Baja", "Lugar_de_Nacimiento", "Estado_Civil", "Causa_de_Baja")

# Iterar sobre las columnas que deseas cambiar y asignarles los nuevos nombres
for (i in seq_along(columnas_a_cambiar)) {
  colnames(RH1)[colnames(RH1) == columnas_a_cambiar[i]] <- nuevos_nombres[i]
}

# Verificar que cambiaron los nombres
colnames(RH1)
##  [1] "Apellido"            "Nombre"              "Fecha_de_nacimiento"
##  [4] "Edad"                "Género"              "Fecha_de_Alta"      
##  [7] "Primer_Mes"          "Cuarto_Mes"          "Fecha_Baja"         
## [10] "Puesto"              "Dpto"                "Lugar_de_Nacimiento"
## [13] "Calle"               "Número"              "Colonia"            
## [16] "Municipio"           "Estado"              "CP"                 
## [19] "Estado_Civil"        "Causa_de_Baja"
# Quitar tildes de las columnas del df RH1
colnames(RH1)[colnames(RH1) == "Género"] <- "Genero"
colnames(RH1)[colnames(RH1) == "Número"] <- "Numero"

# Verificar cambios
colnames(RH1)
##  [1] "Apellido"            "Nombre"              "Fecha_de_nacimiento"
##  [4] "Edad"                "Genero"              "Fecha_de_Alta"      
##  [7] "Primer_Mes"          "Cuarto_Mes"          "Fecha_Baja"         
## [10] "Puesto"              "Dpto"                "Lugar_de_Nacimiento"
## [13] "Calle"               "Numero"              "Colonia"            
## [16] "Municipio"           "Estado"              "CP"                 
## [19] "Estado_Civil"        "Causa_de_Baja"
# Convertir la columna "Fecha Baja" a formato fecha
RH1$Fecha_Baja <- as.Date(RH1$Fecha_Baja, format = "%d/%m/%Y")

# Manejar valores atípicos
RH1$Fecha_Baja[RH1$Fecha_Baja == "0/1/1900"] <- NA

# Asegurar que también la fecha de alta este en formato Date
RH1$Fecha_de_Alta <- as.Date(RH1$Fecha_de_Alta) 
# Convertir la columna "Fecha" del DF de Ventas a formato fecha

# 2023
Ventas23$Fecha <- as.Date(Ventas23$Fecha, format = "%Y-%m-%d") 

# Manejar valores atípicos
Ventas23$Fecha[Ventas23$Fecha == as.Date("1900-01-01")] <- NA 

# 2022
Ventas22$Fecha <- as.Date(Ventas22$Fecha, format = "%Y-%m-%d") 

# Manejar valores atípicos
Ventas22$Fecha[Ventas22$Fecha == as.Date("1900-01-01")] <- NA 

# 2021
Ventas21$Fecha <- as.Date(Ventas21$Fecha, format = "%Y-%m-%d") 

# Manejar valores atípicos
Ventas21$Fecha[Ventas21$Fecha == as.Date("1900-01-01")] <- NA 
# Convertir la columna "Fecha" del DF Ventas General a formato fecha 
VentasG$Fecha <- as.Date(VentasG$Fecha, format = "%Y-%m-%d") 

# Manejar valores atípicos
VentasG$Fecha[VentasG$Fecha == as.Date("1900-01-01")] <- NA 
# Cambiar de columna "Puesto" a que todo sea en minusculas 
RH1$Puesto <- tolower(RH1$Puesto)
# Cambiar de columna "Cliente" a que todo sea en minusculas 
Ventas23$Cliente <- tolower(Ventas23$Cliente)

Ventas22$Cliente <- tolower(Ventas22$Cliente)

Ventas21$Cliente <- tolower(Ventas21$Cliente)
# Cambiar de columna "Cliente" a que todo sea en minusculas 
VentasG$Cliente <- tolower(VentasG$Cliente)

Identificar NAs

colSums(is.na(RH1)) # Hay NAs en las columnas "Edad", "Primer_Mes", "Cuarto_Mes", "Puesto", "Dpto", "Lugar_de_Nacimiento", "Calle", "Número", "Estado", "CP" y "Causa_de_Baja". Aunque "Fecha_Baja" tiene NAs, estos no serán reemplazados ya que se usarán como filtro entre los trabajadores dados de baja y los que siguen trabajando en FORM.
##            Apellido              Nombre Fecha_de_nacimiento                Edad 
##                   0                   0                   0                 427 
##              Genero       Fecha_de_Alta          Primer_Mes          Cuarto_Mes 
##                   0                   0                  21                   9 
##          Fecha_Baja              Puesto                Dpto Lugar_de_Nacimiento 
##                 141                   2                 418                  17 
##               Calle              Numero             Colonia           Municipio 
##                   1                   8                   0                   0 
##              Estado                  CP        Estado_Civil       Causa_de_Baja 
##                   1                   4                   0                 383
# Reemplazar NAs con la mediana al ser num
mediana_Edad <- median(RH1$Edad, na.rm = TRUE) 
RH1$Edad[is.na(RH1$Edad)] <- mediana_Edad

mediana_Primer_Mes <- median(RH1$Primer_Mes, na.rm = TRUE) 
RH1$Primer_Mes[is.na(RH1$Primer_Mes)] <- mediana_Primer_Mes

mediana_Cuarto_Mes <- median(RH1$Cuarto_Mes, na.rm = TRUE) 
RH1$Cuarto_Mes[is.na(RH1$Cuarto_Mes)] <- mediana_Cuarto_Mes

# Reemplazar NAs con la moda al ser chr
moda_Puesto <- names(sort(table(RH1$Puesto), decreasing = TRUE))[1] 
RH1$Puesto[is.na(RH1$Puesto)] <- moda_Puesto

moda_Dpto <- names(sort(table(RH1$Dpto), decreasing = TRUE))[1] 
RH1$Dpto[is.na(RH1$Dpto)] <- moda_Dpto

moda_Lugar_de_Nacimiento <- names(sort(table(RH1$Lugar_de_Nacimiento), decreasing = TRUE))[1] 
RH1$Lugar_de_Nacimiento[is.na(RH1$Lugar_de_Nacimiento)] <- moda_Lugar_de_Nacimiento

moda_Calle <- names(sort(table(RH1$Calle), decreasing = TRUE))[1] 
RH1$Calle[is.na(RH1$Calle)] <- moda_Calle

moda_Numero <- names(sort(table(RH1$Numero), decreasing = TRUE))[1] 
RH1$Numero[is.na(RH1$Numero)] <- moda_Numero

moda_Estado <- names(sort(table(RH1$Estado), decreasing = TRUE))[1] 
RH1$Estado[is.na(RH1$Estado)] <- moda_Estado

moda_CP <- names(sort(table(RH1$CP), decreasing = TRUE))[1] 
RH1$CP[is.na(RH1$CP)] <- moda_CP

moda_Causa_de_Baja <- names(sort(table(RH1$Causa_de_Baja), decreasing = TRUE))[1] 
RH1$Causa_de_Baja[is.na(RH1$Causa_de_Baja)] <- moda_Causa_de_Baja
colSums(is.na(Ventas21)) # No hay NAs en esta base de datos.
##    Fecha  Cliente Producto Cantidad 
##        0        0        0        0
colSums(is.na(Ventas22)) # No hay NAs en esta base de datos.
##    Fecha  Cliente Producto Cantidad 
##        0        0        0        0
colSums(is.na(Ventas23)) # No hay NAs en esta base de datos.
##    Fecha  Cliente Producto Cantidad 
##        0        0        0        0
colSums(is.na(VentasG)) # No hay NAs en esta base de datos.
##    Fecha  Cliente Producto Cantidad 
##        0        0        0        0

Estadísticos Descriptivos

# Recursos Humanos
summary(RH1)
##    Apellido            Nombre          Fecha_de_nacimiento             
##  Length:625         Length:625         Min.   :1962-12-29 00:00:00.00  
##  Class :character   Class :character   1st Qu.:1984-08-19 00:00:00.00  
##  Mode  :character   Mode  :character   Median :1994-03-09 00:00:00.00  
##                                        Mean   :1991-09-11 03:52:42.24  
##                                        3rd Qu.:2000-05-29 00:00:00.00  
##                                        Max.   :2022-10-31 00:00:00.00  
##                                                                        
##       Edad          Genero          Fecha_de_Alta       
##  Min.   :19.00   Length:625         Min.   :2017-02-20  
##  1st Qu.:31.00   Class :character   1st Qu.:2023-01-05  
##  Median :31.00   Mode  :character   Median :2023-06-10  
##  Mean   :31.91                      Mean   :2023-04-07  
##  3rd Qu.:31.00                      3rd Qu.:2023-09-11  
##  Max.   :60.00                      Max.   :2024-03-07  
##                                                         
##    Primer_Mes                       Cuarto_Mes                    
##  Min.   :2017-03-22 00:00:00.00   Min.   :2017-06-20 00:00:00.00  
##  1st Qu.:2023-02-13 00:00:00.00   1st Qu.:2023-05-13 00:00:00.00  
##  Median :2023-07-19 00:00:00.00   Median :2023-10-19 00:00:00.00  
##  Mean   :2023-05-18 06:52:24.96   Mean   :2023-08-16 15:46:56.64  
##  3rd Qu.:2023-10-09 00:00:00.00   3rd Qu.:2024-01-11 00:00:00.00  
##  Max.   :2024-04-06 00:00:00.00   Max.   :2024-07-07 00:00:00.00  
##                                                                   
##    Fecha_Baja            Puesto              Dpto           Lugar_de_Nacimiento
##  Min.   :2022-01-25   Length:625         Length:625         Length:625         
##  1st Qu.:2023-03-13   Class :character   Class :character   Class :character   
##  Median :2023-07-01   Mode  :character   Mode  :character   Mode  :character   
##  Mean   :2023-06-12                                                            
##  3rd Qu.:2023-09-08                                                            
##  Max.   :2024-02-22                                                            
##  NA's   :141                                                                   
##     Calle              Numero            Colonia           Municipio        
##  Length:625         Length:625         Length:625         Length:625        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##     Estado               CP            Estado_Civil       Causa_de_Baja     
##  Length:625         Length:625         Length:625         Length:625        
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
## 
describe(RH1)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf

## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf

## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf

## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf

## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf

## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf

## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf

## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf

## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##                      vars   n   mean     sd median trimmed    mad min  max
## Apellido*               1 625 297.10 171.07    295  296.98 217.94   1  595
## Nombre*                 2 625 285.96 161.62    293  286.84 201.63   1  567
## Fecha_de_nacimiento     3 625    NaN     NA     NA     NaN     NA Inf -Inf
## Edad                    4 625  31.91   6.31     31   31.06   0.00  19   60
## Genero*                 5 625   1.91   0.99      1    1.88   0.00   1    4
## Fecha_de_Alta           6 625    NaN     NA     NA     NaN     NA Inf -Inf
## Primer_Mes              7 625    NaN     NA     NA     NaN     NA Inf -Inf
## Cuarto_Mes              8 625    NaN     NA     NA     NaN     NA Inf -Inf
## Fecha_Baja              9 484    NaN     NA     NA     NaN     NA Inf -Inf
## Puesto*                10 625  14.74   9.67     11   12.06   0.00   1   49
## Dpto*                  11 625  16.41   4.27     18   17.51   0.00   1   23
## Lugar_de_Nacimiento*   12 625 117.35  47.71    109  120.20  66.72   1  211
## Calle*                 13 625 256.73 138.66    272  259.41 166.05   1  493
## Numero*                14 625 158.15 100.78    150  154.33 128.99   1  350
## Colonia*               15 625 121.21  55.72    147  124.58  50.41   1  216
## Municipio*             16 625   4.05   4.70      1    3.30   0.00   1   19
## Estado*                17 625   3.07   0.51      3    3.04   0.00   1    4
## CP*                    18 625  38.83  11.67     38   38.99   4.45   1   70
## Estado_Civil*          19 625   6.08   2.79      6    6.34   4.45   1   12
## Causa_de_Baja*         20 625   9.47   2.16     10   10.00   0.00   1   13
##                      range  skew kurtosis   se
## Apellido*              594  0.00    -1.20 6.84
## Nombre*                566 -0.05    -1.16 6.46
## Fecha_de_nacimiento   -Inf    NA       NA   NA
## Edad                    41  1.85     4.81 0.25
## Genero*                  3  0.22    -1.87 0.04
## Fecha_de_Alta         -Inf    NA       NA   NA
## Primer_Mes            -Inf    NA       NA   NA
## Cuarto_Mes            -Inf    NA       NA   NA
## Fecha_Baja            -Inf    NA       NA   NA
## Puesto*                 48  2.40     4.56 0.39
## Dpto*                   22 -2.46     5.24 0.17
## Lugar_de_Nacimiento*   210 -0.46    -0.35 1.91
## Calle*                 492 -0.18    -1.16 5.55
## Numero*                349  0.26    -1.13 4.03
## Colonia*               215 -0.56    -0.61 2.23
## Municipio*              18  1.11    -0.27 0.19
## Estado*                  3 -1.35     7.30 0.02
## CP*                     69 -0.36     2.37 0.47
## Estado_Civil*           11 -0.63    -0.89 0.11
## Causa_de_Baja*          12 -2.96     7.63 0.09
# Ventas 2023
summary(Ventas23)
##      Fecha              Cliente            Producto            Cantidad      
##  Min.   :2023-01-02   Length:5275        Length:5275        Min.   :    1.0  
##  1st Qu.:2023-03-23   Class :character   Class :character   1st Qu.:   21.0  
##  Median :2023-06-22   Mode  :character   Mode  :character   Median :  100.0  
##  Mean   :2023-06-23                                         Mean   :  427.1  
##  3rd Qu.:2023-09-28                                         3rd Qu.:  342.0  
##  Max.   :2023-12-22                                         Max.   :36220.0
describe(Ventas23)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##           vars    n   mean      sd median trimmed    mad min   max range  skew
## Fecha        1 5275    NaN      NA     NA     NaN     NA Inf  -Inf  -Inf    NA
## Cliente*     2 5275  14.54    5.34     17   14.87   2.97   1    21    20 -0.78
## Producto*    3 5275 152.02  101.54    115  147.04 124.54   1   344   343  0.33
## Cantidad     4 5275 427.13 1170.43    100  198.10 133.43   1 36220 36219 12.00
##           kurtosis    se
## Fecha           NA    NA
## Cliente*     -1.01  0.07
## Producto*    -1.23  1.40
## Cantidad    254.02 16.12
# Ventas 2022
summary(Ventas22)
##      Fecha              Cliente            Producto            Cantidad      
##  Min.   :2022-01-03   Length:4868        Length:4868        Min.   :    1.0  
##  1st Qu.:2022-03-31   Class :character   Class :character   1st Qu.:   24.0  
##  Median :2022-06-30   Mode  :character   Mode  :character   Median :   80.0  
##  Mean   :2022-06-28                                         Mean   :  349.9  
##  3rd Qu.:2022-09-28                                         3rd Qu.:  250.5  
##  Max.   :2022-12-21                                         Max.   :19000.0
describe(Ventas22)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##           vars    n   mean     sd median trimmed    mad min   max range  skew
## Fecha        1 4868    NaN     NA     NA     NaN     NA Inf  -Inf  -Inf    NA
## Cliente*     2 4868  10.67   3.33     11   11.04   1.48   1    18    17 -1.11
## Producto*    3 4868 141.24  95.53    103  134.23  94.89   1   344   343  0.57
## Cantidad     4 4868 349.92 849.12     80  158.72 103.78   1 19000 18999  7.45
##           kurtosis    se
## Fecha           NA    NA
## Cliente*      1.62  0.05
## Producto*    -0.87  1.37
## Cantidad     99.83 12.17
# Ventas 2021
summary(Ventas21)
##      Fecha              Cliente            Producto            Cantidad      
##  Min.   :2021-01-04   Length:6563        Length:6563        Min.   :    1.0  
##  1st Qu.:2021-02-22   Class :character   Class :character   1st Qu.:   40.0  
##  Median :2021-04-23   Mode  :character   Mode  :character   Median :   70.0  
##  Mean   :2021-05-18                                         Mean   :  327.2  
##  3rd Qu.:2021-08-05                                         3rd Qu.:  200.0  
##  Max.   :2021-12-20                                         Max.   :21755.0
describe(Ventas21)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##           vars    n   mean     sd median trimmed    mad min   max range  skew
## Fecha        1 6563    NaN     NA     NA     NaN     NA Inf  -Inf  -Inf    NA
## Cliente*     2 6563  11.28   4.93     14   11.24   1.48   1    21    20 -0.33
## Producto*    3 6563 168.49 127.75    130  155.28 120.09   1   457   456  0.74
## Cantidad     4 6563 327.16 837.55     70  128.85  74.13   1 21755 21754  7.08
##           kurtosis    se
## Fecha           NA    NA
## Cliente*     -1.26  0.06
## Producto*    -0.50  1.58
## Cantidad     96.62 10.34
# Ventas General
summary(VentasG)
##      Fecha              Cliente            Producto            Cantidad      
##  Min.   :2021-01-04   Length:16706       Length:16706       Min.   :    1.0  
##  1st Qu.:2021-06-08   Class :character   Class :character   1st Qu.:   30.0  
##  Median :2022-05-12   Mode  :character   Mode  :character   Median :   80.0  
##  Mean   :2022-05-13                                         Mean   :  365.4  
##  3rd Qu.:2023-03-09                                         3rd Qu.:  250.0  
##  Max.   :2023-12-22                                         Max.   :36220.0
describe(VentasG)
## Warning in FUN(newX[, i], ...): ningún argumento finito para min; retornando
## Inf
## Warning in FUN(newX[, i], ...): ningun argumento finito para max; retornando
## -Inf
##           vars     n   mean     sd median trimmed    mad min   max range  skew
## Fecha        1 16706    NaN     NA     NA     NaN     NA Inf  -Inf  -Inf    NA
## Cliente*     2 16706  23.28   8.18     27   24.22   2.97   1    36    35 -1.01
## Producto*    3 16706 292.71 222.79    176  270.55 160.12   1   799   798  0.69
## Cantidad     4 16706 365.36 959.15     80  158.87 100.82   1 36220 36219 10.29
##           kurtosis   se
## Fecha           NA   NA
## Cliente*     -0.21 0.06
## Producto*    -0.81 1.72
## Cantidad    219.51 7.42

Medidas de Dispersión

# Recursos Humanos

# Seleccionar solo las columnas numéricas
RH1_numeric <- RH1[, sapply(RH1, is.numeric)]

# Media
media <- colMeans(RH1_numeric, na.rm = TRUE)

# Mediana
mediana <- apply(RH1_numeric, 2, median, na.rm = TRUE)

# Moda
moda <- apply(RH1_numeric, 2, function(x) {
  table_x <- table(x)
  mode <- as.numeric(names(table_x)[which.max(table_x)])
  return(mode)
})

# Desviación estándar
desviacion_estandar <- apply(RH1_numeric, 2, sd, na.rm = TRUE)

# Varianza
varianza <- apply(RH1_numeric, 2, var, na.rm = TRUE)

resultados <- data.frame(Media = media, Mediana = mediana, Moda = moda, `Desviación Estándar` = desviacion_estandar, Varianza = varianza)
print(resultados)
##        Media Mediana Moda Desviación.Estándar Varianza
## Edad 31.9136      31   31            6.311535 39.83547
# Ventas (para las bases por año como la general)

# Seleccionar solo las columnas numéricas
Ventas21_numeric <- Ventas21[, sapply(Ventas21, is.numeric)]

# Media
media <- colMeans(Ventas21_numeric, na.rm = TRUE)

# Mediana
mediana <- apply(Ventas21_numeric, 2, median, na.rm = TRUE)

# Moda
moda <- apply(Ventas21_numeric, 2, function(x) {
  table_x <- table(x)
  mode <- as.numeric(names(table_x)[which.max(table_x)])
  return(mode)
})

# Desviación estándar
desviacion_estandar <- apply(Ventas21_numeric, 2, sd, na.rm = TRUE)

# Varianza
varianza <- apply(Ventas21_numeric, 2, var, na.rm = TRUE)

resultados <- data.frame(Media = media, Mediana = mediana, Moda = moda, `Desviación Estándar` = desviacion_estandar, Varianza = varianza)
print(resultados)
##             Media Mediana Moda Desviación.Estándar Varianza
## Cantidad 327.1566      70   50            837.5473 701485.5

Gráficos para las preguntas de análisis

1. ¿Cuál es el puesto con más bajas al mes?

# Filtrar los datos para excluir filas con NA en la columna "Fecha_Baja"
RH1 <- RH1[complete.cases(RH1$Fecha_Baja), ]

# Extraer el mes y el año de la fecha de baja
RH1 <- RH1 %>%
  mutate(Mes = format(Fecha_Baja, "%m"),
         Año = format(Fecha_Baja, "%Y"))

# Calcular el número de bajas por puesto y mes
bajas_por_puesto_mes <- RH1 %>%
  group_by(Año, Mes, Puesto) %>%
  summarise(Numero_Bajas = n()) %>%
  ungroup()

# Identificar los cinco puestos con más bajas en cada mes
top5_puestos_por_mes <- bajas_por_puesto_mes %>%
  group_by(Año, Mes) %>%
  top_n(5, Numero_Bajas) %>%
  arrange(Año, Mes, desc(Numero_Bajas))

# Filtrar los datos para excluir las filas con NA en la columna "Puesto"
top_puestos <- top5_puestos_por_mes %>%
  filter(!is.na(Puesto)) %>%
  group_by(Año) %>%
  slice(1:5)  # Tomar los primeros 5 puestos con más bajas por año

# Obtener los niveles únicos de la variable "Puesto"
niveles_puesto <- unique(top_puestos$Puesto)

# Definir las paletas de colores
paleta_1 <- brewer.pal(8, "YlOrBr")
paleta_2 <- brewer.pal(8, "Oranges")

# Combinar las paletas
mis_colores <- c(paleta_1, paleta_2)

# Graficarlo
ggplot(top_puestos, aes(x = reorder(Puesto, -Numero_Bajas), y = Numero_Bajas, fill = Puesto)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Numero_Bajas), vjust = -0.5, size = 3, color = "black") + 
  facet_wrap(~ Año, scales = "free") +
  labs(x = "Puesto", y = "Número de Bajas", fill = "Puesto") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_manual(values = mis_colores) +  
  ggtitle("Top 5 puestos con Mayores Bajas al Mes")  

2. ¿Cuánto duran los colaboradores?

# Calcular la diferencia en meses, obteniendo como resultado un número flotante
RH1$Duracion_Meses <- as.numeric(interval(RH1$Fecha_de_Alta, RH1$Fecha_Baja) / months(1))

# Redondear al mes más cercano cuando sea necesario  
RH1$Duracion_Meses <- round(RH1$Duracion_Meses, 0)

# Graficarlo

# Filtrar valores no finitos
RH1_filtrado <- RH1 %>% filter(is.finite(Duracion_Meses))

# Graficar con límites de eje x ajustados
ggplot(RH1_filtrado, aes(x = Duracion_Meses)) +
  geom_histogram(binwidth = 1, fill = "orange", color = "black") +
  theme_minimal() +
  labs(title = "Distribución de la Duración de Colaboradores en Meses",
       x = "Duración en Meses",
       y = "Frecuencia") +
  coord_cartesian(xlim = c(0, max(RH1_filtrado$Duracion_Meses, na.rm = TRUE) + 1))

3. ¿Existe relación entre la residencia y edad de los colaboradores y su propensión a renunciar?

# Filtrar solo las personas que se han dado de baja (aquellas con fecha de baja)
datos_baja <- RH1 %>% filter(!is.na(Fecha_Baja))

# Municipios con mayores bajas
municipios_mostrar <- c("Apodaca", "Cadereyta", "Guadalupe","Juarez","Monterrey","Pesqueria","Ramos Arizpe","Saltillo","San Nicolas De Los G")  

# Subconjunto de datos con solo las filas correspondientes a los municipios que deseas mostrar
datos_filtrados <- datos_baja %>% filter(Municipio %in% municipios_mostrar)

# Boxplot de la relación entre la edad, municipio y propensión a renunciar de los colaboradores
ggplot(datos_filtrados, aes(x = factor(Municipio, levels = municipios_mostrar), y = Edad, fill = Fecha_Baja)) +
 geom_boxplot(fill ="orange") +
 labs(title = "Relación entre Residencia, Edad y Renuncias",
    x = "Municipio",
    y = "Edad",
    fill = "Fecha de Baja") +
 theme_minimal() +
 theme(axis.text.x = element_text(angle = 45, hjust = 1))

4. ¿Existe relación entre el puesto y edad de los colaboradores y su propensión a renunciar?

# Puestos con mayor cantidad de bajas
puestos_mostrar <- c("costurero", "calidad", "ayudante general","ay.general","ayudante general cedis","chofer","costurera","inspectora de calidad","limpieza","montacarguista","soldador")  

# Subconjunto de datos con solo las filas correspondientes a los puestos que deseas mostrar
datos_filtrados <- subset(datos_baja, Puesto %in% puestos_mostrar)

# Boxplot de la relación entre la edad, puesto y propensión a renunciar de los colaboradores
ggplot(datos_filtrados, aes(x = factor(Puesto, levels = puestos_mostrar), y = Edad, fill = Fecha_Baja)) +
  geom_boxplot(fill ="orange") +
  labs(title = "Relación entre Puesto, Edad y Renuncias",
       x = "Puesto",
       y = "Edad",
       fill = "Fecha de Baja") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5. ¿Cuál es el promedio de ventas por mes para Form?

# 2023

# Seleccionar solo el mes de la variable "Fecha" y extraer el nombre del mes
Ventas23 <- Ventas23 %>%
  mutate(Mes = format(Fecha, "%m"),
         Mes_nombre23 = month(Fecha, label = TRUE))

# Calcular el promedio de ventas por mes
ventas_por_mes23 <- Ventas23 %>%
  group_by(Mes_nombre23) %>%
  summarise(Promedio_Ventas23 = mean(Cantidad))

# Gráfico de barras
ggplot(ventas_por_mes23, aes(x = Mes_nombre23, y = Promedio_Ventas23)) +
  geom_bar(stat = "identity", fill = "orange") +
  labs(title = "Promedio de Ventas por Mes del 2023",
       x = "Mes",
       y = "Promedio de Ventas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# 2022

# Seleccionar solo el mes de la variable "Fecha" y extraer el nombre del mes
Ventas22 <- Ventas22 %>%
  mutate(Mes = format(Fecha, "%m"),
         Mes_nombre22 = month(Fecha, label = TRUE))

# Calcular el promedio de ventas por mes
ventas_por_mes22 <- Ventas22 %>%
  group_by(Mes_nombre22) %>%
  summarise(Promedio_Ventas22 = mean(Cantidad))

# Gráfico de barras
ggplot(ventas_por_mes22, aes(x = Mes_nombre22, y = Promedio_Ventas22)) +
  geom_bar(stat = "identity", fill = "orange") +
  labs(title = "Promedio de Ventas por Mes del 2022",
       x = "Mes",
       y = "Promedio de Ventas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# 2021

# Seleccionar solo el mes de la variable "Fecha" y extraer el nombre del mes
Ventas21 <- Ventas21 %>%
  mutate(Mes = format(Fecha, "%m"),
         Mes_nombre21 = month(Fecha, label = TRUE))

# Calcular el promedio de ventas por mes
ventas_por_mes21 <- Ventas21 %>%
  group_by(Mes_nombre21) %>%
  summarise(Promedio_Ventas21 = mean(Cantidad))

# Gráfico de barras
ggplot(ventas_por_mes21, aes(x = Mes_nombre21, y = Promedio_Ventas21)) +
  geom_bar(stat = "identity", fill = "orange") +
  labs(title = "Promedio de Ventas por Mes del 2021",
       x = "Mes",
       y = "Promedio de Ventas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

6. ¿Cúales son los mejores clientes de FORM?

# 2023 
clientes_totales23 <- Ventas23 %>%
  group_by(Cliente) %>%
  summarise(Cantidad_Total23 = sum(Cantidad)) %>%
  arrange(desc(Cantidad_Total23)) 

# Mostrar los mejores 5 clientes
mejores_clientes23 <- head(clientes_totales23, 5) 

# Crear el gráfico de barras
ggplot(mejores_clientes23, aes(x = reorder(Cliente, -Cantidad_Total23), y = Cantidad_Total23)) +
  geom_bar(stat = "identity", fill = "orange") +
  geom_text(aes(label = Cantidad_Total23), vjust = -0.5, color = "black", size = 3.5) + 
  labs(title = "Top 5 Mejores Clientes 2023",
       x = "Cliente",
       y = "Cantidad Total de Productos Comprados") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# 2022
clientes_totales22 <- Ventas22 %>%
  group_by(Cliente) %>%
  summarise(Cantidad_Total22 = sum(Cantidad)) %>%
  arrange(desc(Cantidad_Total22)) 

# Mostrar los mejores 5 clientes
mejores_clientes22 <- head(clientes_totales22, 5) 

# Crear el gráfico de barras
ggplot(mejores_clientes22, aes(x = reorder(Cliente, -Cantidad_Total22), y = Cantidad_Total22)) +
  geom_bar(stat = "identity", fill = "orange") +
  geom_text(aes(label = Cantidad_Total22), vjust = -0.5, color = "black", size = 3.5) + 
  labs(title = "Top 5 Mejores Clientes 2022",
       x = "Cliente",
       y = "Cantidad Total de Productos Comprados") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# 2021

clientes_totales21 <- Ventas21 %>%
  group_by(Cliente) %>%
  summarise(Cantidad_Total21 = sum(Cantidad)) %>%
  arrange(desc(Cantidad_Total21))  

# Mostrar los mejores 5 clientes
mejores_clientes21 <- head(clientes_totales21, 5) 


# Crear el gráfico de barras
ggplot(mejores_clientes21, aes(x = reorder(Cliente, -Cantidad_Total21), y = Cantidad_Total21)) +
  geom_bar(stat = "identity", fill = "orange") +
  geom_text(aes(label = Cantidad_Total21), vjust = -0.5, color = "black", size = 3.5) + 
  labs(title = "Top 5 Mejores Clientes 2021",
       x = "Cliente",
       y = "Cantidad Total de Productos Comprados") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Análisis de sentimientos de la encuesta a los colaboradores

library(readtext)
library(SnowballC)
library(RColorBrewer)
library(wordcloud)
library(tm)

# Importar texto del archivo "Encuesta_Datos_FORM_Fall2023"
text <- readLines(("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Encuesta_Datos_FORM_Fall2023.txt"), warn=FALSE)
texto <- iconv(text,"WINDOWS-1252","UTF-8")
# Hacerlo Corpus
docs <- Corpus(VectorSource(texto))
# Limpieza del texto

docs <- tm_map(docs, content_transformer(tolower))
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, removeWords, stopwords("spanish"))
docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, stripWhitespace) 
texto_palabras <- get_tokens(texto)
emociones_df <- get_nrc_sentiment(texto_palabras, language = 'spanish')

barplot(colSums(prop.table(emociones_df[, 1:8])))

sentimientos <- (emociones_df$negative*-1) + emociones_df$positive
simple_plot(sentimientos)

wordcloud(words=texto_palabras, min.freq = 5)

❖ NEARSHORING

# Cargar base de datos
df1 <- read_xlsx("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\nearshoring_datos_series_de_tiempo_trimestral.xlsx")
#View(df)
roman_to_arabic <- function(roman) {
  roman_numerals <- c("I", "II", "III", "IV")
  arabic_numerals <- c(1, 2, 3, 4)
  arabic_numerals[match(roman, roman_numerals)]
}

df1$Quarter <- sapply(df1$Quarter, roman_to_arabic)

df1$fecha <- as.Date(as.yearmon(paste(df1$Year, df1$Quarter, sep = "-")))
df1$fecha <- as.Date(as.yearqtr(paste(df1$Year, df1$Quarter), format = "%Y %q"))
df1 <- df1[, c("Year", "Quarter", "fecha", names(df1)[!names(df1) %in% c("Year", "Quarter", "fecha")])]
DataExplorer::plot_histogram(df1)

#### Time Series

# converting to time series format
IED_Flujos_time<-ts(df1$new_fdi_inflows_mxn,start=c(1997,1),end=c(2022,4),frequency=4)
# plotting time series data
par(mfrow=c(2,3))
plot(IED_Flujos_time, type="l", col="orange", lwd=2, xlab="Date", ylab="Non-Store Retail",main="IED_Flujos_time")

#### Decomposing

IED_Flujos_time_dec<-decompose(IED_Flujos_time)
plot(IED_Flujos_time_dec)

# it is important to assess whether the variables under study are stationary or not
adf.test(df1$new_fdi_inflows_mxn)                # stationary (p-value > 0.05)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  df1$new_fdi_inflows_mxn
## Dickey-Fuller = -5.4066, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
acf(df1$new_fdi_inflows_mxn,main="Significant Autocorrelations")  # Generally, non-stationary time series data show the presence of serial autocorrelation. 

Nearshoring

# ARIMA
plot(df1$fecha,df1$new_fdi_inflows_mxn, type="l",col="orange", lwd=2, xlab ="Año",ylab ="IED_Flujos", main = "IED_Flujos")

plot(df1$fecha,log(df1$new_fdi_inflows_mxn), type="l",col="orange", lwd=2, xlab ="Año",ylab ="log(IED_Flujos)", main = "IED_Flujos")

plot(diff(log(df1$new_fdi_inflows_mxn)),type="l",ylab="first order difference",main = "IED_Flujos")

#### Model Evaluation

adf.test((df1$log_new_fdi_inflows_mxn))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  (df1$log_new_fdi_inflows_mxn)
## Dickey-Fuller = -3.4897, Lag order = 4, p-value = 0.04934
## alternative hypothesis: stationary
adf.test(diff((df1$log_new_fdi_inflows_mxn)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff((df1$log_new_fdi_inflows_mxn))
## Dickey-Fuller = -9.3026, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

Forecast (ARIMA)

IED_ARIMA <- Arima(df1$new_fdi_inflows_mxn,order=c(4,0,4))
print(IED_ARIMA)
## Series: df1$new_fdi_inflows_mxn 
## ARIMA(4,0,4) with non-zero mean 
## 
## Coefficients:
##          ar1      ar2     ar3      ar4      ma1     ma2      ma3     ma4
##       0.6828  -0.1883  0.4243  -0.7685  -0.9067  0.1683  -0.3806  0.7031
## s.e.  0.3378   0.4171  0.2998   0.2282   0.4135  0.5865   0.4021  0.2954
##            mean
##       52666.883
## s.e.   2703.971
## 
## sigma^2 = 1.218e+09:  log likelihood = -817.36
## AIC=1654.71   AICc=1658.5   BIC=1677.05
plot(IED_ARIMA$residuals,main="ARIMA(1,1,1) - IED_Flujos")

acf(IED_ARIMA$residuals,main="ACF - ARIMA (1,1,1)")              

Box.test(IED_ARIMA$residuals,lag=1,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  IED_ARIMA$residuals
## X-squared = 0.033304, df = 1, p-value = 0.8552
adf.test(IED_ARIMA$residuals)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  IED_ARIMA$residuals
## Dickey-Fuller = -3.8382, Lag order = 4, p-value = 0.02216
## alternative hypothesis: stationary
# Forecast 
IED_ARIMA_forecast<-forecast(IED_ARIMA,h=5)
IED_ARIMA_forecast
##    Point Forecast     Lo 80     Hi 80      Lo 95    Hi 95
## 70       36229.84 -9088.965  81548.65 -33079.292 105539.0
## 71       55038.76  8830.413 101247.11 -15630.808 125708.3
## 72       55560.94  8775.121 102346.75 -15991.795 127113.7
## 73       69844.32 23032.548 116656.09  -1748.106 141436.7
## 74       77488.96 30097.735 124880.18   5010.336 149967.6
plot(IED_ARIMA_forecast)

autoplot(IED_ARIMA_forecast)

El Desempeño de FORM

# Cargar base de datos
df2 <- read_xlsx("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\nearshoring_datos_series_de_tiempo.xlsx") 
#View(df)
df2[] <- lapply(df2, as.numeric)
summary(df2)
##       Año         IED_Flujos    Exportaciones       Empleo        Educación    
##  Min.   :1997   Min.   : 8374   Min.   : 9088   Min.   :95.06   Min.   :7.198  
##  1st Qu.:2003   1st Qu.:21367   1st Qu.:13260   1st Qu.:95.90   1st Qu.:7.864  
##  Median :2010   Median :27698   Median :21188   Median :96.53   Median :8.457  
##  Mean   :2010   Mean   :26770   Mean   :23601   Mean   :96.47   Mean   :8.424  
##  3rd Qu.:2016   3rd Qu.:32183   3rd Qu.:31601   3rd Qu.:97.08   3rd Qu.:9.004  
##  Max.   :2022   Max.   :48354   Max.   :46478   Max.   :97.83   Max.   :9.579  
##                                                 NA's   :3       NA's   :3      
##  Salario_Diario     Innovación    Inseguridad_Robo Inseguridad_Homicidio
##  Min.   : 24.30   Min.   :11.28   Min.   :120.5    Min.   : 8.037       
##  1st Qu.: 41.97   1st Qu.:12.56   1st Qu.:148.3    1st Qu.:10.250       
##  Median : 54.48   Median :13.09   Median :181.8    Median :16.928       
##  Mean   : 65.16   Mean   :13.11   Mean   :185.4    Mean   :17.292       
##  3rd Qu.: 72.31   3rd Qu.:13.75   3rd Qu.:209.9    3rd Qu.:22.433       
##  Max.   :172.87   Max.   :15.11   Max.   :314.8    Max.   :29.592       
##                   NA's   :2                        NA's   :1            
##  Tipo_de_Cambio   Densidad_Carretera Densidad_Población CO2_Emisiones  
##  Min.   : 8.064   Min.   :0.05205    Min.   :47.44      Min.   :3.592  
##  1st Qu.:10.752   1st Qu.:0.05954    1st Qu.:52.78      1st Qu.:3.832  
##  Median :13.016   Median :0.06989    Median :58.09      Median :3.925  
##  Mean   :13.910   Mean   :0.07106    Mean   :57.33      Mean   :3.946  
##  3rd Qu.:18.489   3rd Qu.:0.08275    3rd Qu.:61.39      3rd Qu.:4.106  
##  Max.   :20.664   Max.   :0.09020    Max.   :65.60      Max.   :4.221  
##                                                         NA's   :3      
##  PIB_Per_Cápita        INPC       
##  Min.   :126739   Min.   : 33.28  
##  1st Qu.:130964   1st Qu.: 56.15  
##  Median :136845   Median : 73.35  
##  Mean   :138550   Mean   : 75.17  
##  3rd Qu.:146148   3rd Qu.: 91.29  
##  Max.   :153236   Max.   :126.48  
## 
DataExplorer::plot_histogram(df2)

# Buscar NAs
num_na <- sum(is.na(df2))
print(num_na)
## [1] 12
# Limpiar los NAs
for (col in names(df2)) {
  col_mean <- mean(df2[[col]], na.rm = TRUE)  # Calcular la media de la columna
  df2[[col]][is.na(df2[[col]])] <- col_mean }

num_na <- sum(is.na(df2))
print(num_na)
## [1] 0

Time series data

# Converting to time series format
Exportaciones_time<-ts(df2$Exportaciones,start=c(1997,1),end=c(2022,4),frequency=4)
# Plotting time series data
par(mfrow=c(2,3))
plot(Exportaciones_time, type="l", col="blue", lwd=2, xlab="Date", ylab="Non-Store Retail",main="Exportaciones_time")

#### Decomposing

Exportaciones_time_dec<-decompose(Exportaciones_time)
plot(Exportaciones_time_dec)

#### ARIMA

plot(df2$Año,df2$Exportaciones, type="l",col="orange", lwd=2, xlab ="Año",ylab ="Exportaciones", main = "Exportaciones")

plot(df2$Año,log(df2$Exportaciones), type="l",col="orange", lwd=2, xlab ="Año",ylab ="log(Exportaciones)", main = "Exportaciones")

plot(diff(log(df2$Exportaciones)),type="l",ylab="first order difference",main = "Exportaciones")

adf.test(log(df2$Exportaciones))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  log(df2$Exportaciones)
## Dickey-Fuller = -2.989, Lag order = 2, p-value = 0.1956
## alternative hypothesis: stationary
adf.test(diff(log(df2$Exportaciones)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(df2$Exportaciones))
## Dickey-Fuller = -4.1992, Lag order = 2, p-value = 0.01631
## alternative hypothesis: stationary

De acuerdo a la prueba Dickey-Fuller, no tenemos suficiente evidencia para concluir que la serie de tiempo es estacionaria.

El Box-Ljung Test sugiere que no existe autocorrelación serial de acuerdo a la cantidad de lags que imputamos en el modelo.

Forecast (ARIMA)

Exp_ARIMA <- Arima(df2$Exportaciones,order=c(4,0,4))
print(Exp_ARIMA)
## Series: df2$Exportaciones 
## ARIMA(4,0,4) with non-zero mean 
## 
## Coefficients:
##          ar1      ar2     ar3      ar4     ma1     ma2     ma3     ma4
##       0.7072  -0.6810  0.9419  -0.0114  0.7763  1.9109  0.7668  0.9890
## s.e.  0.3167   0.2174  0.2029   0.3015  0.2928  1.5213  1.3614  1.5711
##           mean
##       27954.45
## s.e.  14678.86
## 
## sigma^2 = 2663360:  log likelihood = -230.83
## AIC=481.65   AICc=496.32   BIC=494.24
plot(Exp_ARIMA$residuals,main="ARIMA(1,1,1) - IED_Flujos")

acf(IED_ARIMA$residuals,main="ACF - ARIMA (1,1,1)")              

Box.test(Exp_ARIMA$residuals,lag=1,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  Exp_ARIMA$residuals
## X-squared = 1.3316, df = 1, p-value = 0.2485
adf.test(Exp_ARIMA$residuals)
## Warning in adf.test(Exp_ARIMA$residuals): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Exp_ARIMA$residuals
## Dickey-Fuller = -4.7084, Lag order = 2, p-value = 0.01
## alternative hypothesis: stationary
# Forecast 
Exp_ARIMA_forecast<-forecast(Exp_ARIMA,h=5)
Exp_ARIMA_forecast
##    Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 27       45882.09 43654.73 48109.45 42475.63 49288.54
## 28       47498.83 43562.66 51434.99 41478.98 53518.67
## 29       47674.12 41486.38 53861.87 38210.78 57137.47
## 30       45632.93 37789.21 53476.65 33637.00 57628.86
## 31       45229.41 35861.54 54597.29 30902.48 59556.34
plot(Exp_ARIMA_forecast)

autoplot(Exp_ARIMA_forecast)

Desempeño FORM productos

# Cargar base
df3 <- read_xlsx("C:\\Users\\kathi\\OneDrive\\Escritorio\\EVIDENCIA1_IA_\\Datos_FORM_Ventas_FJ2024.xlsx")
# Buscar NAs
num_na1 <- sum(is.na(df3))
print(num_na1)
## [1] 3
for (col in names(df3)) {
  col_mean1 <- mean(df3[[col]], na.rm = TRUE)  # Calcular la media de la columna
  df3[[col]][is.na(df3[[col]])] <- col_mean1 }

num_na1 <- sum(is.na(df3))
print(num_na1)
## [1] 3
df_cantidades <- df3 %>% 
  group_by(Fecha) %>% 
  summarise(Total_Cantidad = sum(Cantidad))

# Mostrar el dataframe resultante
print(df_cantidades)
## # A tibble: 272 × 2
##    Fecha               Total_Cantidad
##    <dttm>                       <dbl>
##  1 2021-01-04 00:00:00          30828
##  2 2021-01-05 00:00:00           9360
##  3 2021-01-06 00:00:00           7664
##  4 2021-01-07 00:00:00           8612
##  5 2021-01-08 00:00:00           9399
##  6 2021-01-09 00:00:00           8520
##  7 2021-01-11 00:00:00           7408
##  8 2021-01-12 00:00:00           7953
##  9 2021-01-13 00:00:00          11411
## 10 2021-01-14 00:00:00          11352
## # ℹ 262 more rows

Time Series Data

### converting to time series format
ventas_form_time<-ts(df_cantidades$Total_Cantidad,start=c(1997,1),end=c(2022,4),frequency=4)
# plotting time series data
par(mfrow=c(2,3))
plot(ventas_form_time, type="l", col="blue", lwd=2, xlab="Date", ylab="Non-Store Retail",main="ventas_form_time")

#### Decomposing

ventas_form_time_dec<-decompose(ventas_form_time)
plot(ventas_form_time_dec)

#### ARIMA

plot(df_cantidades$Fecha,df_cantidades$Total_Cantidad, type="l",col="orange", lwd=2, xlab ="Fecha",ylab ="Cantidad", main = "Cantidad")

plot(df_cantidades$Fecha,log(df_cantidades$Total_Cantidad), type="l",col="orange", lwd=2, xlab ="Fecha",ylab ="log(Cantidad)", main = "Cantidad")

plot(diff(log(df_cantidades$Total_Cantidad)),type="l",ylab="first order difference",main = "Cantidad")

adf.test(log(df_cantidades$Total_Cantidad))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  log(df_cantidades$Total_Cantidad)
## Dickey-Fuller = -5.2794, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
adf.test(diff(log(df_cantidades$Total_Cantidad)))
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff(log(df_cantidades$Total_Cantidad))
## Dickey-Fuller = -9.7013, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

Forecast (ARIMA)

# forecast (ARIMA)
Cant_ARIMA <- Arima(df_cantidades$Total_Cantidad,order=c(6,2,6))
print(Cant_ARIMA)
## Series: df_cantidades$Total_Cantidad 
## ARIMA(6,2,6) 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5      ar6      ma1     ma2
##       -0.7296  -1.1203  -0.8913  -0.9223  -0.2204  -0.1003  -1.2935  0.6522
## s.e.      NaN      NaN      NaN      NaN   0.0582      NaN      NaN     NaN
##           ma3     ma4      ma5     ma6
##       -0.6507  0.3751  -0.7739  0.6992
## s.e.      NaN     NaN      NaN  0.1402
## 
## sigma^2 = 66234213:  log likelihood = -2814.62
## AIC=5655.25   AICc=5656.67   BIC=5702.03
plot(Cant_ARIMA$residuals,main="ARIMA(1,1,1) - IED_Flujos")

acf(Cant_ARIMA$residuals,main="ACF - ARIMA (1,1,1)")              

Box.test(Cant_ARIMA$residuals,lag=1,type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  Cant_ARIMA$residuals
## X-squared = 0.027022, df = 1, p-value = 0.8694
adf.test(Cant_ARIMA$residuals)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Cant_ARIMA$residuals
## Dickey-Fuller = -6.3164, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
# Forecast 
Cant_ARIMA_forecast<-forecast(Cant_ARIMA,h=5)
Cant_ARIMA_forecast
##     Point Forecast     Lo 80    Hi 80      Lo 95    Hi 95
## 273       2346.471 -8083.405 12776.35 -13604.648 18297.59
## 274       7312.206 -3120.458 17744.87  -8643.177 23267.59
## 275       9370.829 -1069.442 19811.10  -6596.187 25337.84
## 276       6791.051 -3670.795 17252.90  -9208.963 22791.07
## 277       4631.571 -5840.530 15103.67 -11384.126 20647.27
plot(Cant_ARIMA_forecast)

autoplot(Cant_ARIMA_forecast)

❖ PRINCIPALES HALLAZGOS

  • El puesto con más renuncias es costurera y la mediana de edad es 30 años aproximadamente. Esto podría deberse al hecho de que FORM depende mucho de sus costureras y les puede estar exigiendo una alta carga de trabajo al diferenciarse por sus proyectos a la medida de las necesidades de sus clientes.

  • En los últimos dos años ha habido un pico de ventas en el mes de diciembre, lo que podría indicar un patrón de cuando deberían preparar más inventario.

  • En casi todos los municipios la mediana se encuentra posicionada en el rango de edad 30. Por lo que podría significar que el problema no radica tanto en la distancia que hacen al trabajo, sino más en lo que buscan los colaboradores de este rango de edad.

  • En el análisis de sentimientos se puede apreciar que el sentimiento más presente en las respuestas de la encuesta hecha a los colaboradores es la confianza, lo que podría indicar que la mayoría de trabajadores en FORM se encuentran conformes con su trabajo o que el ambiente con sus compañeros es armonioso.

  • La distribución de la duración en meses de los colaboradores que se dan de baja tiene un sesgo marcado hacia los primeros meses, indicando que la mayoría tienden a darse de baja aproximadamente durante los primeros 3 meses.

  • El puesto de ayudante general es donde hay más valores atípicos en el boxplot de la relación entre puesto, edad y la propensión a renunciar, lo que indica que sin importar la edad este puesto es donde más bajas hay y tomando como referencia la primera gráfica de top 5 puestos con más bajas al mes, también es donde más renuncias hubo en los 3 años. Esto podría representar que la carga, las responsabilidades o las condiciones de trabajo de este puesto son las principales razones detrás de tantas renuncias.

  • Finalmente, la relación que existe entre los resultados estimados del pronóstico del Nearshoring y las situaciones problema, es que el Nearshoring si va a ocurrir, esto tomando como referencia la tendencia positiva pronosticada por los modelos ARIMA realizados, en los cuales se espera que el valor de la variable aumente en el futuro. Es por esto que FORM debe prepararse para utilizar el Nearshoring a su favor, ya que este puede ser tanto una oportunidad como una amenaza para la empresa. Como se mencionó antes en el FODA, FORM debe buscar ofrecer su modelo de negocio único y capacidad de respuesta rápida a estas empresas internacionales que buscan implementar operaciones en el país. Así mismo, FORM debe solucionar su alta rotación laboral para aprovechar esta oportunidad que ofrece el Nearshoring y la posible alta demanda que podría conllevar. Esto al ofrecerle mejores beneficios o condiciones laborales a sus costureras, ayudantes generales y colaboradores en el rango de edad de los 30 años, así como también ofrecer una capacitación completa y un proceso de acompañamiento y retroalimentación durante los primeros meses de los colaboradores de nuevo ingreso. Y por último, otra opción sería buscar implementar automatización gradual en sus procesos para depender menos de la mano de obra.

❖ REFERENCIAS

Vallejo, J. (2005). El mercado del papel y cartón en México. Oficina Económica y Comercial de la Embajada de España en México. https://boletines.exportemos.pe/recursos/boletin/28064.PDF

¿Qué es el análisis exploratorio de datos? | IBM. (s.f.). https://www.ibm.com/mx-es/topics/exploratory-data-analysis

What is descriptive Analytics? 5 examples | HBS Online. (2021, 9 noviembre). Business Insights Blog. https://online.hbs.edu/blog/post/descriptive-analytics