Análisis integral avanzado de ventas sector alimentación
En este proyecto se pretende dar información a un negocio dedicado a la compra-venta de clientes alimentarios y que inició su andadura comercial en Abril de 2020; los últimos datos a analizar son del 05/06/2022.
ANALISIS DESCRIPTIVO
Se realizarán tareas de ETL, creación de nuevas variables de negocio y visualización de insights.
Vamos a realizar el proceso de ETL directamente en la BBDD de SQL Server.
Conexión a BBDD
Carga de librerias necesarias
Conexión a la BBDD
Diagnóstico y tratamiento de las tablas de la BBDD
Obtención y visualización de las tablas de la BBDD
Visualización de la informacion de las tablas de la BBDD para obtener las tablas que necesitamos
Después de visualizar las tablas, seleccionamos aquellas que van a ser objeto de análisis y comenzamos a realizar las transformaciones oportunas; para ello usaremos:
Transformaciones iniciales usando el conector odbc para realizar manipulaciones de tablas directamente desde el servidor.
Otras transformaciones con las librerias dplyr y sqldf.
Antes de realizar cualquier transformación, realizamos una exploración inicial para observar cualquier incidencia en los datos de cada tabla, como serían posibles valores nulos y valores atípicos:
1- Seleccionamos y almacenamos en variables aquellas tablas que serán objeto de transformaciones posteriores
2- Comenzamos la fase exploratoria inicial con cada tabla, para ello haremos los mismos pasos con cada tabla, con el objetivo de ver posibles incidencias en las variables, tanto categóricas como numéricas:
TABLA ‘empleados’
- Diagnóstico variables categóricas
Name | empleados_non_numeric |
Number of rows | 9 |
Number of columns | 12 |
_______________________ | |
Column type frequency: | |
character | 10 |
Date | 2 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
apellido | 0 | 1.00 | 4 | 9 | 0 | 9 | 0 |
nombre | 0 | 1.00 | 3 | 8 | 0 | 8 | 0 |
titulo | 0 | 1.00 | 17 | 24 | 0 | 4 | 0 |
titulocortesia | 0 | 1.00 | 3 | 4 | 0 | 3 | 0 |
direccion | 0 | 1.00 | 17 | 35 | 0 | 9 | 0 |
ciudad | 0 | 1.00 | 6 | 8 | 0 | 5 | 0 |
region | 4 | 0.56 | 2 | 2 | 0 | 1 | 0 |
codigopostal | 0 | 1.00 | 5 | 5 | 0 | 9 | 0 |
pais | 0 | 1.00 | 3 | 11 | 0 | 2 | 0 |
telefono | 0 | 1.00 | 13 | 14 | 0 | 9 | 0 |
Variable type: Date
skim_variable | n_missing | complete_rate | min | max | median | n_unique |
---|---|---|---|---|---|---|
fecha_nac | 0 | 1 | 1957-09-19 | 1986-01-27 | 1978-01-09 | 9 |
fecha_contrato | 0 | 1 | 2020-04-01 | 2022-11-15 | 2021-10-17 | 8 |
Diagnóstico variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_empleado | ▇▇▃▇▇ | 0 | 0 | 0 | 0 | 5.00 | 1 | 3 | 5 | 7 | 9 | 0.00 | 0.000000 | 0 | 0 | 5.00 | 5.00 |
id_jefe | ▂▅▅▁▇ | 1 | 0 | 0 | 0 | 3.25 | 1 | 2 | 3 | 5 | 5 | 0.25 | 8.333333 | 0 | 0 | 3.25 | 3.25 |
Repetimos el proceso con el resto de las tablas, con el fin de visualizar los datos clave para la limpieza y transformación de las variables de interés.
TABLA ‘proveedores’
Variables categóricas
Name | proveedores_non_numeric |
Number of rows | 29 |
Number of columns | 10 |
_______________________ | |
Column type frequency: | |
character | 10 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nombreproveedor | 0 | 1.00 | 15 | 15 | 0 | 29 | 0 |
nombrecontacto | 0 | 1.00 | 11 | 24 | 0 | 29 | 0 |
titulocontacto | 0 | 1.00 | 5 | 35 | 0 | 15 | 0 |
direccion | 0 | 1.00 | 13 | 58 | 0 | 29 | 0 |
ciudad | 0 | 1.00 | 4 | 13 | 0 | 29 | 0 |
region | 20 | 0.31 | 2 | 8 | 0 | 8 | 0 |
codigopostal | 0 | 1.00 | 5 | 5 | 0 | 29 | 0 |
pais | 0 | 1.00 | 3 | 12 | 0 | 16 | 0 |
telefono | 0 | 1.00 | 8 | 15 | 0 | 29 | 0 |
fax | 16 | 0.45 | 8 | 15 | 0 | 13 | 0 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_proveedor | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 15 | 1 | 8 | 15 | 22 | 29 | 0 | 0 | 0 | 0 | 15 | 15 |
TABLA ‘categorias’
Variables categóricas
Name | categorias_non_numeric |
Number of rows | 8 |
Number of columns | 2 |
_______________________ | |
Column type frequency: | |
character | 2 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nombrecategoria | 0 | 1 | 6 | 17 | 0 | 8 | 0 |
descripcion | 0 | 1 | 6 | 56 | 0 | 8 | 0 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_categoria | ▇▃▇▃▇ | 0 | 0 | 0 | 0 | 4.5 | 1 | 2.75 | 4.5 | 6.25 | 8 | 0 | 0 | 0 | 0 | 4.5 | 4.5 |
TABLA ‘productos’
Variables categóricas
Name | productos_non_numeric |
Number of rows | 77 |
Number of columns | 2 |
_______________________ | |
Column type frequency: | |
character | 1 |
logical | 1 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nombreproducto | 0 | 1 | 14 | 14 | 0 | 77 | 0 |
Variable type: logical
skim_variable | n_missing | complete_rate | mean | count |
---|---|---|---|---|
descontinuado | 0 | 1 | 0.1 | FAL: 69, TRU: 8 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_producto | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 39.000000 | 1.0 | 20.00 | 39.0 | 58.00 | 77.0 | 0.0000000 | 0.000000 | 0 | 0.000000 | 39.000000 | 39.000000 |
id_proveedor | ▇▇▅▆▅ | 0 | 0 | 0 | 0 | 13.649351 | 1.0 | 7.00 | 13.0 | 20.00 | 29.0 | 0.6493506 | 4.995005 | 0 | 0.000000 | 13.649351 | 13.649351 |
id_categoria | ▇▅▆▂▆ | 0 | 0 | 0 | 0 | 4.116883 | 1.0 | 2.00 | 4.0 | 6.00 | 8.0 | 0.1168831 | 2.922078 | 0 | 0.000000 | 4.116883 | 4.116883 |
preciounitario | ▇▁▁▁▁ | 0 | 4 | 0 | 0 | 28.866364 | 2.5 | 13.25 | 19.5 | 33.25 | 263.5 | 9.3663636 | 48.032634 | 4 | 5.194805 | 28.866364 | 22.704384 |
TABLA ‘clientes’
Name | clientes_non_numeric |
Number of rows | 91 |
Number of columns | 10 |
_______________________ | |
Column type frequency: | |
character | 10 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nombrecliente | 0 | 1.00 | 13 | 13 | 0 | 91 | 0 |
nombrecontacto | 0 | 1.00 | 7 | 25 | 0 | 90 | 0 |
titulocontacto | 0 | 1.00 | 5 | 29 | 0 | 12 | 0 |
direccion | 0 | 1.00 | 12 | 48 | 0 | 91 | 0 |
ciudad | 0 | 1.00 | 4 | 15 | 0 | 68 | 0 |
region | 59 | 0.35 | 2 | 13 | 0 | 18 | 0 |
codigopostal | 0 | 1.00 | 5 | 5 | 0 | 90 | 0 |
pais | 0 | 1.00 | 3 | 11 | 0 | 21 | 0 |
telefono | 0 | 1.00 | 8 | 17 | 0 | 91 | 0 |
fax | 22 | 0.76 | 9 | 17 | 0 | 69 | 0 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_cliente | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 46 | 1 | 23.5 | 46 | 68.5 | 91 | 0 | 0 | 0 | 0 | 46 | 46 |
TABLA ‘transportistas’
Name | transportistas_non_numeri… |
Number of rows | 3 |
Number of columns | 2 |
_______________________ | |
Column type frequency: | |
character | 2 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
compañia | 0 | 1 | 19 | 19 | 0 | 3 | 0 |
telefono | 0 | 1 | 14 | 14 | 0 | 3 | 0 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_transportista | ▇▁▇▁▇ | 0 | 0 | 0 | 0 | 2 | 1 | 1.5 | 2 | 2.5 | 3 | 0 | 0 | 0 | 0 | 2 | 2 |
TABLA ‘pedidos’
Name | pedidos_non_numeric |
Number of rows | 830 |
Number of columns | 9 |
_______________________ | |
Column type frequency: | |
character | 6 |
Date | 3 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nombretransporte | 0 | 1.00 | 11 | 17 | 0 | 241 | 0 |
direcciontransporte | 0 | 1.00 | 12 | 48 | 0 | 241 | 0 |
ciudadtransporte | 0 | 1.00 | 4 | 15 | 0 | 70 | 0 |
regiontransporte | 507 | 0.39 | 2 | 13 | 0 | 19 | 0 |
codpostaltransporte | 0 | 1.00 | 5 | 5 | 0 | 241 | 0 |
paistransporte | 0 | 1.00 | 3 | 11 | 0 | 21 | 0 |
Variable type: Date
skim_variable | n_missing | complete_rate | min | max | median | n_unique |
---|---|---|---|---|---|---|
fecha_orden | 0 | 1.00 | 2020-07-04 | 2022-05-06 | 2021-09-09 | 480 |
fecha_requerida | 0 | 1.00 | 2020-07-24 | 2022-06-11 | 2021-10-07 | 454 |
fecha_transporte | 21 | 0.97 | 2020-07-10 | 2022-05-06 | 2021-09-09 | 387 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_orden | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 10,662.500000 | 10,248.00 | 10,455.25 | 10,662.50 | 10,869.75 | 11,077.00 | 0.000000000 | 0.0000000 | 0 | 0.000000 | 10,662.500000 | 10,662.500000 |
id_cliente | ▆▇▆▇▆ | 0 | 0 | 0 | 0 | 46.413253 | 1.00 | 24.00 | 46.00 | 68.00 | 91.00 | 0.413253012 | 0.8983761 | 0 | 0.000000 | 46.413253 | 46.413253 |
id_empleado | ▆▇▁▃▅ | 0 | 0 | 0 | 0 | 4.403614 | 1.00 | 2.00 | 4.00 | 7.00 | 9.00 | 0.403614458 | 10.0903614 | 0 | 0.000000 | 4.403614 | 4.403614 |
id_transportista | ▆▁▇▁▆ | 0 | 0 | 0 | 0 | 2.007229 | 1.00 | 1.00 | 2.00 | 3.00 | 3.00 | 0.007228916 | 0.3614458 | 0 | 0.000000 | 2.007229 | 2.007229 |
flete | ▇▁▁▁▁ | 0 | 66 | 0 | 0 | 78.244205 | 0.02 | 13.38 | 41.36 | 91.43 | 1,007.64 | 36.884204819 | 89.1784449 | 66 | 7.951807 | 78.244205 | 51.397736 |
TABLA ‘detalle_pdos’
Variables categóricas, no hay
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_orden | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 10,659.37587007 | 10,248 | 10,451 | 10,657.0 | 10,862.5 | 11,077.00 | 2.37587007 | 0.02229399 | 0 | 0.000000 | 10,659.37587007 | 10,659.37587007 |
id_producto | ▆▇▇▇▇ | 0 | 0 | 0 | 0 | 40.79303944 | 1 | 22 | 41.0 | 60.0 | 77.00 | 0.20696056 | 0.50478185 | 0 | 0.000000 | 40.79303944 | 40.79303944 |
preciounitario | ▇▁▁▁▁ | 0 | 98 | 0 | 0 | 26.21851972 | 2 | 12 | 18.4 | 32.0 | 263.50 | 7.81851972 | 42.49195501 | 98 | 4.547564 | 26.21851972 | 21.33788527 |
cantidad | ▇▃▁▁▁ | 0 | 87 | 0 | 0 | 23.81299304 | 1 | 10 | 20.0 | 30.0 | 130.00 | 3.81299304 | 19.06496520 | 87 | 4.037123 | 23.81299304 | 21.29013540 |
descuento | ▇▁▁▁▁ | 0 | 0 | 1,317 | 0 | 0.05616705 | 0 | 0 | 0.0 | 0.1 | 0.25 | 0.05616705 | Inf | 0 | 0.000000 | 0.05616705 | 0.05616705 |
Una vez revisadas las variables de las tablas, se concluye que:
con respecto a las variables categóricas no se van a realizar ninguna labor de limpieza de datos.
con respecto a las variables numéricas, se realizarán transformaciones para suavizar el efecto de los valores atípicos de las variables preciounitario de la tabla ‘productos’, flete de la tabla ‘pedidos’ y preciounitario y cantidad de la tabla ‘detalle_pdos’
Visualizamos cuales transformaciones son las más adecuadas para las variables númericas detalladas
Realizamos las transformaciones
Resultados
Transformación | Estadístico | Valor.p |
---|---|---|
Logarítmica | 0.9808 | 0.2948 |
Raíz cuadrada | 0.8155 | 0.0000 |
Realizamos la misma operación para todas las variables que queremos transformar
Transformación | Estadístico | Valor.p |
---|---|---|
Logarítmica | 0.9655 | 0 |
Raíz cuadrada | 0.9018 | 0 |
Transformación | Estadístico | Valor.p |
---|---|---|
Logarítmica | 0.9855 | 0 |
Raíz cuadrada | 0.8378 | 0 |
Transformación | Estadístico | Valor.p |
---|---|---|
Logarítmica | 0.9721 | 0 |
Raíz cuadrada | 0.9739 | 0 |
CONCLUSIONES PARA LAS TRANSFORMACIONES:
De la tabla ‘clientes’-> variable preciounitario -> transformación logarítmica., la cual es la única de todas las transformaciones en la que existe normalidad.
De la tabla ‘pedidos’->variable flete -> transformación logarítmica, al tener un valor estadístico más alto.
De la tabla ‘detalle_pdos’-> la variable preciounitario -> transformación logarítmica, al tener un valor estadístico más alto.
De la tabla ‘detalle_pdos’-> la variable cantidad -> transformación de raíz cuadrada, al tener un valor estadístico más alto.
Creación de las tablas objeto de análisis (transformaciones)
Tabla detallada ‘detalle_pdos’
Para la creación de la tabla de ‘detalle_pdos’ tenemos que combinar varias tablas, además creamos un índice para evitar que se borren duplicados cara a futuros análisis con PowerBI y dos nuevas variables como son subtotal_pdo y total_pdo
Tabla resumen ‘pedidos’
Para la creación de la tabla de pedidos tenemos que combinar varias tablas
Mostramos las primeras filas del resultado
Manipulaciones finales para calidad de datos:
Resumen de datos de la tabla ‘pedidos’
Name | pedidos_non_numeric |
Number of rows | 830 |
Number of columns | 7 |
_______________________ | |
Column type frequency: | |
character | 5 |
Date | 2 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nomb_empleado | 0 | 1 | 9 | 15 | 0 | 9 | 0 |
nombrecliente | 0 | 1 | 13 | 13 | 0 | 89 | 0 |
ciudad_cliente | 0 | 1 | 4 | 15 | 0 | 68 | 0 |
pais_cliente | 0 | 1 | 3 | 11 | 0 | 21 | 0 |
transportista | 0 | 1 | 19 | 19 | 0 | 3 | 0 |
Variable type: Date
skim_variable | n_missing | complete_rate | min | max | median | n_unique |
---|---|---|---|---|---|---|
fecha_pedido | 0 | 1 | 2020-07-04 | 2022-05-06 | 2021-09-09 | 480 |
fecha_entrega | 0 | 1 | 2020-07-24 | 2022-06-11 | 2021-10-07 | 454 |
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id_orden | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 10,662.500000 | 10,248.00 | 10,455.25 | 10,662.50 | 10,869.75 | 11,077.00 | 0.0000000 | 0.000000000 | 0 | 0.000000 | 10,662.500000 | 10,662.500000 |
año | ▃▁▇▁▅ | 0 | 0 | 0 | 0 | 2,021.142169 | 2,020.00 | 2,021.00 | 2,021.00 | 2,022.00 | 2,022.00 | 0.1421687 | 0.007034571 | 0 | 0.000000 | 2,021.142169 | 2,021.142169 |
mes | ▇▅▂▃▆ | 0 | 0 | 0 | 0 | 6.046988 | 1.00 | 3.00 | 5.00 | 9.00 | 12.00 | 1.0469880 | 20.939759036 | 0 | 0.000000 | 6.046988 | 6.046988 |
flete | ▇▁▁▁▁ | 0 | 66 | 0 | 0 | 78.244205 | 0.02 | 13.38 | 41.36 | 91.43 | 1,007.64 | 36.8842048 | 89.178444921 | 66 | 7.951807 | 78.244205 | 51.397736 |
Los rangos máximos de la variables ‘flete’, como se mencionó con anterioridad, son elevados y se revisarán por posibles valores atípicos.
Resumen de datos de la tabla ‘detalle_pdos’
Variables categóricas, no hay
Variables numéricas
variables | numeric.hist | nulos | atipicos | ceros | negativos | media | min | Q1 | mediana | Q3 | max | mediana_vs_media | pct_dif | num_atipicos | ratio_atipicos | media_con_atip | media_sin_atip |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
indice | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 1,078.00000000 | 1.0 | 539.5 | 1,078.00 | 1,616.5 | 2,155.00 | 0.00000000 | 0.00000000 | 0 | 0.000000 | 1,078.00000000 | 1,078.00000000 |
id_orden | ▇▇▇▇▇ | 0 | 0 | 0 | 0 | 10,659.37587007 | 10,248.0 | 10,451.0 | 10,657.00 | 10,862.5 | 11,077.00 | 2.37587007 | 0.02229399 | 0 | 0.000000 | 10,659.37587007 | 10,659.37587007 |
id_empleado | ▆▇▁▃▃ | 0 | 0 | 0 | 0 | 4.33317865 | 1.0 | 2.0 | 4.00 | 7.0 | 9.00 | 0.33317865 | 8.32946636 | 0 | 0.000000 | 4.33317865 | 4.33317865 |
id_producto | ▆▇▇▇▇ | 0 | 0 | 0 | 0 | 40.79303944 | 1.0 | 22.0 | 41.00 | 60.0 | 77.00 | 0.20696056 | 0.50478185 | 0 | 0.000000 | 40.79303944 | 40.79303944 |
id_categoria | ▇▅▇▂▆ | 0 | 0 | 0 | 0 | 4.13549884 | 1.0 | 2.0 | 4.00 | 6.0 | 8.00 | 0.13549884 | 3.38747100 | 0 | 0.000000 | 4.13549884 | 4.13549884 |
id_cliente | ▅▇▅▇▅ | 0 | 0 | 0 | 0 | 47.26589327 | 1.0 | 24.0 | 47.00 | 69.5 | 91.00 | 0.26589327 | 0.56573036 | 0 | 0.000000 | 47.26589327 | 47.26589327 |
pcu | ▇▁▁▁▁ | 0 | 98 | 0 | 0 | 26.21851972 | 2.0 | 12.0 | 18.40 | 32.0 | 263.50 | 7.81851972 | 42.49195501 | 98 | 4.547564 | 26.21851972 | 21.33788527 |
pvu | ▇▁▁▁▁ | 0 | 77 | 0 | 0 | 27.94868677 | 2.5 | 12.5 | 19.45 | 34.0 | 263.50 | 8.49868677 | 43.69504769 | 77 | 3.573086 | 27.94868677 | 23.17764196 |
cantidad | ▇▃▁▁▁ | 0 | 87 | 0 | 0 | 23.81299304 | 1.0 | 10.0 | 20.00 | 30.0 | 130.00 | 3.81299304 | 19.06496520 | 87 | 4.037123 | 23.81299304 | 21.29013540 |
descuento | ▇▁▁▁▁ | 0 | 0 | 1,317 | 0 | 0.05616705 | 0.0 | 0.0 | 0.00 | 0.1 | 0.25 | 0.05616705 | Inf | 0 | 0.000000 | 0.05616705 | 0.05616705 |
subtotal_pdo | ▇▁▁▁▁ | 0 | 168 | 0 | 0 | 628.16842947 | 6.0 | 157.5 | 360.00 | 728.5 | 15,810.00 | 268.16842947 | 74.49123041 | 168 | 7.795824 | 628.16842947 | 420.17410393 |
total_pdo | ▇▁▁▁▁ | 0 | 147 | 0 | 0 | 1,985.06199142 | 12.5 | 670.0 | 1,423.00 | 2,346.3 | 16,387.50 | 562.06199142 | 39.49838309 | 147 | 6.821346 | 1,985.06199142 | 1,545.51819920 |
Los rangos máximos de las variables ‘pcu’,‘pvu’ y ‘cantidad’ , como se mencionó con anterioridad, son elevados y se revisarán por posibles valores atípicos.
Revisión de la variable ‘flete’ de la tabla resumen ‘pedidos’
A nivel general vemos muchos valores atípicos de la variable flete; a continuación vamos a segregar la variable por empleados para ver aún más detalle de los valores atípicos
Ahora procedemos a analizar la media de flete facturado por cliente y lo comparamos con el flete facturado por orden; esa diferencia la contrastamos por empleado para ver como estos se desvian con respecto a la media
Resultado
Podemos concluir que los empleados concentran los fletes facturados en importes pequeños (según la mediana que se puede visualizar por cada empleado) y facturan algunos fletes elevados (atípicos); incluso así, podemos observar que el total de flete que factura cada empleado tiene un desvío negativo con respecto a la media de flete general.
Realizamos la transformacion de la variable flete detallada en el punto de CONCLUSIONES PARA LAS TRANSFORMACIONES y la añadimos al dataset
Name | pedidos |
Number of rows | 830 |
Number of columns | 12 |
_______________________ | |
Column type frequency: | |
character | 5 |
Date | 2 |
numeric | 5 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nomb_empleado | 0 | 1 | 9 | 15 | 0 | 9 | 0 |
nombrecliente | 0 | 1 | 13 | 13 | 0 | 89 | 0 |
ciudad_cliente | 0 | 1 | 4 | 15 | 0 | 68 | 0 |
pais_cliente | 0 | 1 | 3 | 11 | 0 | 21 | 0 |
transportista | 0 | 1 | 19 | 19 | 0 | 3 | 0 |
Variable type: Date
skim_variable | n_missing | complete_rate | min | max | median | n_unique |
---|---|---|---|---|---|---|
fecha_pedido | 0 | 1 | 2020-07-04 | 2022-05-06 | 2021-09-09 | 480 |
fecha_entrega | 0 | 1 | 2020-07-24 | 2022-06-11 | 2021-10-07 | 454 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
id_orden | 0 | 1 | 10662.50 | 239.74 | 10248.00 | 10455.25 | 10662.50 | 10869.75 | 11077.00 | ▇▇▇▇▇ |
año | 0 | 1 | 2021.14 | 0.70 | 2020.00 | 2021.00 | 2021.00 | 2022.00 | 2022.00 | ▃▁▇▁▅ |
mes | 0 | 1 | 6.05 | 3.66 | 1.00 | 3.00 | 5.00 | 9.00 | 12.00 | ▇▅▂▃▆ |
flete | 0 | 1 | 78.24 | 116.78 | 0.02 | 13.38 | 41.36 | 91.43 | 1007.64 | ▇▁▁▁▁ |
flete_log | 0 | 1 | 3.45 | 1.58 | -3.91 | 2.59 | 3.72 | 4.52 | 6.92 | ▁▁▃▇▃ |
Comparamos la variable original con la variable transformada
Vemos una mejora de la normalidad en los datos de flete_log comparándola con su original, ya que se reduce el efecto de los valores atípicos.
Revisión de la variable ‘pcu’ de la tabla detallada ‘detalle_pdos’
Existen algunos precios atipicos en algunos proveedores, el departamento de compras revisará en consecuencia.
No obstante, realizamos la transformación de la variable pcu en el punto de CONCLUSIONES PARA LAS TRANSFORMACIONES; también realizamos la transformación de la variable pvu y ambas las añadimos al dataset
Name | detalle_pdos |
Number of rows | 2155 |
Number of columns | 22 |
_______________________ | |
Column type frequency: | |
character | 8 |
numeric | 14 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nomb_empleado | 0 | 1 | 9 | 15 | 0 | 9 | 0 |
nombreproducto | 0 | 1 | 14 | 14 | 0 | 77 | 0 |
nombrecategoria | 0 | 1 | 6 | 17 | 0 | 8 | 0 |
descrip_categoria | 0 | 1 | 6 | 56 | 0 | 8 | 0 |
nombrecliente | 0 | 1 | 13 | 13 | 0 | 89 | 0 |
nombreproveedor | 0 | 1 | 15 | 15 | 0 | 29 | 0 |
ciudad_proveedor | 0 | 1 | 4 | 13 | 0 | 29 | 0 |
pais_proveedor | 0 | 1 | 3 | 12 | 0 | 16 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
indice | 0 | 1 | 1078.00 | 622.24 | 1.00 | 539.50 | 1078.00 | 1616.50 | 2155.00 | ▇▇▇▇▇ |
id_orden | 0 | 1 | 10659.38 | 241.38 | 10248.00 | 10451.00 | 10657.00 | 10862.50 | 11077.00 | ▇▇▇▇▇ |
id_empleado | 0 | 1 | 4.33 | 2.49 | 1.00 | 2.00 | 4.00 | 7.00 | 9.00 | ▆▇▁▃▃ |
id_producto | 0 | 1 | 40.79 | 22.16 | 1.00 | 22.00 | 41.00 | 60.00 | 77.00 | ▆▇▇▇▇ |
id_categoria | 0 | 1 | 4.14 | 2.38 | 1.00 | 2.00 | 4.00 | 6.00 | 8.00 | ▇▅▇▂▆ |
id_cliente | 0 | 1 | 47.27 | 25.85 | 1.00 | 24.00 | 47.00 | 69.50 | 91.00 | ▅▇▅▇▅ |
pcu | 0 | 1 | 26.22 | 29.83 | 2.00 | 12.00 | 18.40 | 32.00 | 263.50 | ▇▁▁▁▁ |
pvu | 0 | 1 | 27.95 | 31.61 | 2.50 | 12.50 | 19.45 | 34.00 | 263.50 | ▇▁▁▁▁ |
cantidad | 0 | 1 | 23.81 | 19.02 | 1.00 | 10.00 | 20.00 | 30.00 | 130.00 | ▇▃▁▁▁ |
descuento | 0 | 1 | 0.06 | 0.08 | 0.00 | 0.00 | 0.00 | 0.10 | 0.25 | ▇▁▁▁▁ |
subtotal_pdo | 0 | 1 | 628.17 | 1031.40 | 6.00 | 157.50 | 360.00 | 728.50 | 15810.00 | ▇▁▁▁▁ |
total_pdo | 0 | 1 | 1985.06 | 2099.97 | 12.50 | 670.00 | 1423.00 | 2346.30 | 16387.50 | ▇▁▁▁▁ |
pcu_log | 0 | 1 | 2.95 | 0.77 | 0.69 | 2.48 | 2.91 | 3.47 | 5.57 | ▁▅▇▂▁ |
pvu_log | 0 | 1 | 3.01 | 0.76 | 0.92 | 2.53 | 2.97 | 3.53 | 5.57 | ▁▅▇▂▁ |
Comparación de variables originales con variables transformadas
Vemos una mejora de la normalidad en los datos tanto de pcu_log como de pvu_log comparando ambas variables con sus originales, ya que se reduce el efecto de los valores atípicos.
Revisión de la variable ‘cantidad’ de la tabla detallada ‘detalle_pdos’
Dentro de la distribución normal de las cantidades vendidas, aparecen cantidades vendidas más elevadas que consideramos atipicas.
Realizamos la transformación de la variable cantidad en el punto de CONCLUSIONES PARA LAS TRANSFORMACIONES y la añadimos al dataset
Name | detalle_pdos |
Number of rows | 2155 |
Number of columns | 23 |
_______________________ | |
Column type frequency: | |
character | 8 |
numeric | 15 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
nomb_empleado | 0 | 1 | 9 | 15 | 0 | 9 | 0 |
nombreproducto | 0 | 1 | 14 | 14 | 0 | 77 | 0 |
nombrecategoria | 0 | 1 | 6 | 17 | 0 | 8 | 0 |
descrip_categoria | 0 | 1 | 6 | 56 | 0 | 8 | 0 |
nombrecliente | 0 | 1 | 13 | 13 | 0 | 89 | 0 |
nombreproveedor | 0 | 1 | 15 | 15 | 0 | 29 | 0 |
ciudad_proveedor | 0 | 1 | 4 | 13 | 0 | 29 | 0 |
pais_proveedor | 0 | 1 | 3 | 12 | 0 | 16 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
indice | 0 | 1 | 1078.00 | 622.24 | 1.00 | 539.50 | 1078.00 | 1616.50 | 2155.00 | ▇▇▇▇▇ |
id_orden | 0 | 1 | 10659.38 | 241.38 | 10248.00 | 10451.00 | 10657.00 | 10862.50 | 11077.00 | ▇▇▇▇▇ |
id_empleado | 0 | 1 | 4.33 | 2.49 | 1.00 | 2.00 | 4.00 | 7.00 | 9.00 | ▆▇▁▃▃ |
id_producto | 0 | 1 | 40.79 | 22.16 | 1.00 | 22.00 | 41.00 | 60.00 | 77.00 | ▆▇▇▇▇ |
id_categoria | 0 | 1 | 4.14 | 2.38 | 1.00 | 2.00 | 4.00 | 6.00 | 8.00 | ▇▅▇▂▆ |
id_cliente | 0 | 1 | 47.27 | 25.85 | 1.00 | 24.00 | 47.00 | 69.50 | 91.00 | ▅▇▅▇▅ |
pcu | 0 | 1 | 26.22 | 29.83 | 2.00 | 12.00 | 18.40 | 32.00 | 263.50 | ▇▁▁▁▁ |
pvu | 0 | 1 | 27.95 | 31.61 | 2.50 | 12.50 | 19.45 | 34.00 | 263.50 | ▇▁▁▁▁ |
cantidad | 0 | 1 | 23.81 | 19.02 | 1.00 | 10.00 | 20.00 | 30.00 | 130.00 | ▇▃▁▁▁ |
descuento | 0 | 1 | 0.06 | 0.08 | 0.00 | 0.00 | 0.00 | 0.10 | 0.25 | ▇▁▁▁▁ |
subtotal_pdo | 0 | 1 | 628.17 | 1031.40 | 6.00 | 157.50 | 360.00 | 728.50 | 15810.00 | ▇▁▁▁▁ |
total_pdo | 0 | 1 | 1985.06 | 2099.97 | 12.50 | 670.00 | 1423.00 | 2346.30 | 16387.50 | ▇▁▁▁▁ |
pcu_log | 0 | 1 | 2.95 | 0.77 | 0.69 | 2.48 | 2.91 | 3.47 | 5.57 | ▁▅▇▂▁ |
pvu_log | 0 | 1 | 3.01 | 0.76 | 0.92 | 2.53 | 2.97 | 3.53 | 5.57 | ▁▅▇▂▁ |
cantidad_sqrt | 0 | 1 | 4.53 | 1.82 | 1.00 | 3.16 | 4.47 | 5.48 | 11.40 | ▃▇▅▁▁ |
Comparación de variable original con la variable transformada
Vemos una mejora de la normalidad en la variable cantidad_sqrt, ya que se reduce el efecto de los valores atípicos.
Creación de nuevas variables
Se crean nuevas variables que enriqueceran el análisis posterior.
Creamos nuevas variables en la tabla detallada ‘detalle_pdos’
nombrecliente total_x_cliente
1 Cliente AHPOP 53524.015
2 Cliente AHXHT 13258.020
3 Cliente AZJED 98310.826
4 Cliente BSVAR 4587.300
5 Cliente CCFIZ 8854.150
6 Cliente CCKOT 58554.181
7 Cliente CQRAA 20362.640
8 Cliente CYZTN 88899.690
9 Cliente DVFMB 11124.800
10 Cliente EEALV 65409.375
11 Cliente EFFTC 5724.650
12 Cliente ENQZT 3956.800
13 Cliente EYHKM 5240.000
14 Cliente FAPSM 10963.140
15 Cliente FEVNN 7737.370
16 Cliente FRXZL 145829.802
17 Cliente FVXPQ 3529.200
18 Cliente GCJSG 1605.000
19 Cliente GLLAG 114818.078
20 Cliente GYBBY 4623.000
21 Cliente HFBZG 38884.900
22 Cliente HGVLZ 79907.118
23 Cliente IAIJK 1720.000
24 Cliente IBVRG 62837.192
25 Cliente IRRVL 408150.785
26 Cliente JMIKW 71624.035
27 Cliente JUWXK 13454.900
28 Cliente JYPSC 23851.540
29 Cliente KBUDE 20084.755
30 Cliente KIDPX 13664.340
31 Cliente KSLQF 33805.890
32 Cliente KZQZT 43359.650
33 Cliente LCOUJ 448198.966
34 Cliente LCYBZ 6822.400
35 Cliente LHANT 16834.100
36 Cliente LJUCA 18759.400
37 Cliente LOLJO 64432.190
38 Cliente LVJSO 4869.100
39 Cliente LWGMD 7304.860
40 Cliente MDLWA 1686.000
41 Cliente MLTDN 4038.850
42 Cliente NLTYP 5613.720
43 Cliente NRCSK 29652.845
44 Cliente NRZBB 8482.500
45 Cliente NYUHS 195663.872
46 Cliente OXFRU 59747.518
47 Cliente PSNMQ 3692.600
48 Cliente PSQUZ 56755.095
49 Cliente PVDZC 96544.150
50 Cliente PZNLA 14870.800
51 Cliente QNIVZ 41620.575
52 Cliente QUHWH 9960.200
53 Cliente QVEPD 35913.950
54 Cliente QXPPT 8375.267
55 Cliente QXVLA 79071.920
56 Cliente QZURI 13206.400
57 Cliente RFNQC 45805.460
58 Cliente RTXGC 68879.928
59 Cliente SFOGW 100200.650
60 Cliente SIUIH 4761.510
61 Cliente SNXOJ 30575.925
62 Cliente SRQVM 20046.380
63 Cliente TDKEG 12161.000
64 Cliente THYOB 422651.797
65 Cliente TMXGN 20186.700
66 Cliente UBHAU 14469.100
67 Cliente UISOJ 394.000
68 Cliente UMTLM 68639.056
69 Cliente USDBG 5531.360
70 Cliente VMLOG 252.000
71 Cliente VONTK 35792.750
72 Cliente WFIZJ 101333.503
73 Cliente WMFEA 3035.860
74 Cliente WNMAF 35663.705
75 Cliente WULWD 21704.160
76 Cliente WVFAF 44518.600
77 Cliente XBBVR 8321.250
78 Cliente XHXJV 7567.800
79 Cliente XIIWM 26533.655
80 Cliente XOJYP 42679.456
81 Cliente XPNIK 51157.200
82 Cliente XYUFB 22842.938
83 Cliente YBQTI 89079.148
84 Cliente YJCBX 22705.970
85 Cliente YQQWW 17665.228
86 Cliente YSHXL 6528.350
87 Cliente YSIQX 46272.215
88 Cliente ZHYOS 52250.728
89 Cliente ZRNDE 57226.790
Una vez tengamos todas las variables que queremos estudiar, las guardamos en formato .csv para poder trabajarlas dentro de un informe de PowerBi
Análisis avanzado: insights relevantes con PowerBI
Usando la matriz de correlación (tabla detalle_pdos)
Buscamos la fuerza de las correlaciones entre las variables numericas de la tabla ‘detalle_pdos’, para ello seleccionaremos las variables ‘log_cantidad’, ‘beneficio’ y ‘aplica_descuento’; usamos una matriz de correlacion en PowerBI, la cual puede ser filtrada por empleados, clientes, clientes y además por el gráfico de clientes, obteniendo valiosísimos insights de negocio:
La matriz de correlación intenta explicar como de fuertes son las relaciones entre las variables; los resultados oscilan entre 1 (correlación positiva fuerte) y -1 (correlación negativa fuerte), siendo 0 cuando NO hay correlación.
A continuación, se muestra un análisis de ventas y fletes creados con PowerBI que ofrece información detallada aplicando técnicas de inteligencia de tiempo.
Análisis avanzado: insights relevantes (segmentación de clientes K-means)
Para clusterizar a los clientes, primero debemos de hallar su frecuencia de compra
nombrecliente frec_compra total_x_cliente
1 Cliente AHPOP 9 53524.01
2 Cliente AHXHT 6 13258.02
3 Cliente AZJED 15 98310.83
4 Cliente BSVAR 4 4587.30
5 Cliente CCFIZ 7 8854.15
6 Cliente CCKOT 10 58554.18
Realizamos las transformaciones oportunas para hallar el número óptimo de cluster para este estudio
RESULTADO: número óptimo de cluster = 3
Ahora que ya sabemos los clusteres óptimos hallaremos el centroide de cada cluster y graficaremos todo para visualizar el resultado obtenido
En el gráfico podemos ver como se agrupa por medio de la clusterización el comportamiento de compra de cada cliente, según la frecuencia de compra con respecto al total de ventas de cada cliente.
ANALISIS INFERENCIAL
Ahora vamos a realizar pruebas de hipótesis para ver la significancia de las variables
Añadimos una condición aplica_dcto usando la variable descuento
aplica_dcto cantidad cantidad_sqrt subtotal_pdo
1 no 12 3.464102 252.00
2 no 10 3.162278 140.00
3 no 5 2.236068 174.00
4 no 9 3.000000 209.25
5 no 40 6.324555 2120.00
6 no 10 3.162278 96.50
Pruebas de hipótesis
Conocer como afecta la relacion entre aplica_dcto con importes de ventas
Vamos a plantear una hipótesis sobre esta consulta en la que:
H0 (hipótesis nula) -> Aplicar un descuento NO afecta significativamente el importe total de las ventas.
H1 (hipótesis alternativa)-> Aplicar un descuento SI afecta significativamente el importe total de las ventas.
Para ello, primero filtramos la variable discreta en sus dos niveles (si o no)
Vemos si los datos siguen una distribución normal, para ello sabemos que tenemos muchas observaciones en nuestros datos, por lo que las valoramos
Resultado observaciones: 2155
Al tener > 30 datos, tenemos una muestra lo suficientemente grande para poder asumir normalidad.
También hay que comprobar la homocedasticidad o igualdad de varianzas, para ello se realiza el test de Levene
Levene's Test for Homogeneity of Variance (center = "median")
Df F value Pr(>F)
group 1 0.8074 0.369
2153
Levene's Test for Homogeneity of Variance (center = "mean")
Df F value Pr(>F)
group 1 1.0919 0.2962
2153
El resultado del test arroja un p-valor mayor a 0.05, tanto aplicando tanto la mediana como la media, por lo que podriamos usar el T-test ya que encontramos homocedasticidad y asumimos normalidad.
Ahora visualizamos los datos, tanto gráficamente como con un resumen
Debido a la presencia de atipicos vamos a normalizar los datos de la variable subtotal_pdo
Name | descuento |
Number of rows | 2155 |
Number of columns | 5 |
_______________________ | |
Column type frequency: | |
character | 1 |
numeric | 4 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
aplica_dcto | 0 | 1 | 2 | 2 | 0 | 2 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
cantidad | 0 | 1 | 23.81 | 19.02 | 1.00 | 10.00 | 20.00 | 30.00 | 130.00 | ▇▃▁▁▁ |
cantidad_sqrt | 0 | 1 | 4.53 | 1.82 | 1.00 | 3.16 | 4.47 | 5.48 | 11.40 | ▃▇▅▁▁ |
subtotal_pdo | 0 | 1 | 628.17 | 1031.40 | 6.00 | 157.50 | 360.00 | 728.50 | 15810.00 | ▇▁▁▁▁ |
subtotal_pdo_log | 0 | 1 | 5.80 | 1.16 | 1.79 | 5.06 | 5.89 | 6.59 | 9.67 | ▁▃▇▃▁ |
Comparación de la variable original con la variable transformada
Segregamos las estadísticas descriptivas de cada grupo aplica_dcto
Name | Piped data |
Number of rows | 2155 |
Number of columns | 5 |
_______________________ | |
Column type frequency: | |
numeric | 1 |
________________________ | |
Group variables | aplica_dcto |
Variable type: numeric
skim_variable | aplica_dcto | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|---|
subtotal_pdo_log | no | 0 | 1 | 5.77 | 1.15 | 1.79 | 5.01 | 5.88 | 6.55 | 9.67 | ▁▃▇▃▁ |
subtotal_pdo_log | si | 0 | 1 | 5.85 | 1.17 | 2.14 | 5.18 | 5.91 | 6.63 | 9.62 | ▁▃▇▃▁ |
Tanto la media como la mediana de los datos logarítmicos son muy parecidas entre los dos grupos de descuentos, pero esta diferencia es suficientemente significativa como para decir que son parecidas? para ello, aplicamos el t-test
Separamos las muestras
Realizamos el t-test comparando la superioridad de una muestra sobre la otra (análisis bilateral)
Welch Two Sample t-test
data: con_dcto_s_vtas_log and sin_dcto_s_vtas_log
t = 1.6346, df = 1764.9, p-value = 0.05116
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
-0.0005716175 Inf
sample estimates:
mean of x mean of y
5.849164 5.765212
El resultado arroja un p-valor muy cercano a 0.05, por lo que, tras revisar los datos posteriormente, hay evidencias estadísticas suficientes para rechazar la hipótesis nula, es por lo que se concluye que en promedio, los valores con descuento SI son mayores que los valores sin descuento, lo podemos ver en el siguiente gráfico, en el cual transformamos la media de la variable logarítmica a una escala original para apreciar con más detalle las diferencias entre medias de los grupos
Media transformada con descuento: 346.94
Media transformada sin descuento: 319.01
Diferencia de medias: 27,93 (a favor de cantidades aplicando descuento)
CONCLUSION FINAL -> SI APLICAMOS DESCUENTOS VENDEMOS DE MEDIA 27,93 € MAS QUE SI NO APLICAMOS DESCUENTOS.
Conocer como afecta la relacion entre aplica_dcto con cantidades vendidas
Vamos a plantear una hipótesis sobre esta consulta en la que:
H0 -> Aplicar un descuento NO afecta significativamente las cantidades vendidas.
H1 -> Aplicar un descuento SI afecta significativamente las cantidades vendidas.
Vemos si los datos siguen una distribución normal, para ello lo visualizamos gráficamente
Tenemos 2155 observaciones, por lo que asumimos normalidad en los datos
Vemos la homocedasticidad de los datos
Levene's Test for Homogeneity of Variance (center = "mean")
Df F value Pr(>F)
group 1 5.8633 0.01554 *
2153
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
El resultado arroja que los datos presentan heterocedasticidad.
Al tener normalidad pero no homocedasticidad, recurrimos al test de Welch
Welch Two Sample t-test
data: cantidad_sqrt by aplica_dcto
t = -6.5306, df = 1674, p-value = 8.662e-11
alternative hypothesis: true difference in means between group no and group si is not equal to 0
95 percent confidence interval:
-0.6878997 -0.3701339
sample estimates:
mean in group no mean in group si
4.323039 4.852056
El resultado arroja un p-valor inferior a 0.05, por lo que se rechaza la hipótesis nula y se concluye que estadisticamente aplicar un descuento SI afecta significativamente las cantidades vendidas
Ahora veremos la significancia graficamente, pero calcularemos la media de la variable cantidad_sqrt debido a la alta presencia de atípicos en la variable original y luego haremos la transformación de vuelta a la escala original
Media sqrt sin descuento: 4.323039
Media transformada sin descuento: 75.41746
Media sqrt con descuento: 4.852056
Media transformada con descuento: 128.0032
Comparamos los resultados obtenidos con las medias originales y podemos ver como han variado
Name | Piped data |
Number of rows | 2155 |
Number of columns | 5 |
_______________________ | |
Column type frequency: | |
numeric | 1 |
________________________ | |
Group variables | aplica_dcto |
Variable type: numeric
skim_variable | aplica_dcto | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|---|
cantidad | no | 0 | 1 | 21.72 | 17.51 | 1 | 10 | 18 | 30 | 130 | ▇▃▁▁▁ |
cantidad | si | 0 | 1 | 27.11 | 20.77 | 1 | 12 | 20 | 36 | 130 | ▇▃▁▁▁ |
CONCLUSIONES:
Debido a la presencia de valores atípicos, tomamos la media sqrt convirtiendola a la escala original como valor correcto.
Entonces podemos concluir que, sabiendo que estadisticamente hay diferencias significativas si aplicamos un descuento con respecto a las cantidades vendidas segun el t-test y valorando la media sqrt como se ha expuesto:
Media transformada con descuento: 128.0032
Media transformada sin descuento: 75.41746
Diferencia de medias: 52,59 (a favor de cantidades aplicando descuento)
CONCLUSION FINAL -> SI APLICAMOS DESCUENTOS VENDEMOS DE MEDIA 52,59 UNIDADES MAS QUE SI NO APLICAMOS DESCUENTOS.
ANALISIS PREDICTIVO
Modelo de regresión lineal simple
Visualizamos las variables por si tenemos que realizar alguna transformación. Además vemos, si optaramos por ello, el resultado de la transformación
Después de este análisis, optamos por añadir al dataset las 2 transformaciones de cada variable para ver su impacto entre las correlaciones y visualizamos el resultado obtenido tras la transformación de cada variable
vars | statistic | p_value | sample |
---|---|---|---|
frec_compra | 0.8773014 | 0.0000 | 89 |
total_x_cliente | 0.5311082 | 0.0000 | 89 |
total_x_cliente_log | 0.9786161 | 0.1493 | 89 |
total_x_cliente_sqrt | 0.8372029 | 0.0000 | 89 |
frec_compra_log | 0.9803499 | 0.1968 | 89 |
frec_compra_sqrt | 0.9686456 | 0.0298 | 89 |
La variables que presentan normalidad según el test de Shapiro-Wilk son las variables logaritmicas de total_x_cliente y frec_compra.
Graficamos la correlación entre todas las variables para visualizar los mejores resultados
Despúes del análisis visual de las correlaciones, se van a realizar varios modelos de regresión lineal para ver cual es el que ofrece homocedasticidad, siendo siempre la variable de respuesta el total de ventas. Para ello, se escogerán las variables independientes que tengan la correlación más alta con respecto a la variable dependiente.
MODELO 1
Call:
lm(formula = sqrt(total_x_cliente) ~ frec_compra, data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-110.986 -25.680 1.757 24.584 134.973
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -8.5701 9.6071 -0.892 0.375
frec_compra 20.1748 0.8757 23.039 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 47.74 on 87 degrees of freedom
Multiple R-squared: 0.8592, Adjusted R-squared: 0.8576
F-statistic: 530.8 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_1
BP = 9.597, df = 1, p-value = 0.001949
MODELO 2
Call:
lm(formula = log10(total_x_cliente) ~ log10(frec_compra), data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-0.70199 -0.15951 0.01976 0.18897 0.71969
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.52367 0.09485 26.61 <2e-16 ***
log10(frec_compra) 2.01036 0.10191 19.73 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2625 on 87 degrees of freedom
Multiple R-squared: 0.8173, Adjusted R-squared: 0.8152
F-statistic: 389.1 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_2
BP = 5.3921, df = 1, p-value = 0.02023
MODELO 3
Call:
lm(formula = sqrt(total_x_cliente) ~ sqrt(frec_compra), data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-120.102 -39.916 -1.743 30.189 160.543
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -188.575 20.866 -9.037 3.77e-14 ***
sqrt(frec_compra) 126.032 6.833 18.445 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 57.4 on 87 degrees of freedom
Multiple R-squared: 0.7964, Adjusted R-squared: 0.794
F-statistic: 340.2 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_3
BP = 24.121, df = 1, p-value = 9.046e-07
MODELO 4
Call:
lm(formula = total_x_cliente ~ frec_compra, data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-81955 -21582 2520 18925 143944
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -62166.6 8139.3 -7.638 2.68e-11 ***
frec_compra 11820.0 741.9 15.932 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 40440 on 87 degrees of freedom
Multiple R-squared: 0.7447, Adjusted R-squared: 0.7418
F-statistic: 253.8 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_4
BP = 49.882, df = 1, p-value = 1.632e-12
MODELO 5
Call:
lm(formula = log10(total_x_cliente) ~ sqrt(frec_compra), data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-0.80441 -0.19851 0.01313 0.17887 0.75097
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.54354 0.10257 24.80 <2e-16 ***
sqrt(frec_compra) 0.60554 0.03359 18.03 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2822 on 87 degrees of freedom
Multiple R-squared: 0.7889, Adjusted R-squared: 0.7864
F-statistic: 325 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_5
BP = 7.1446, df = 1, p-value = 0.007519
MODELO 6
Call:
lm(formula = log10(total_x_cliente) ~ frec_compra, data = frecuencia)
Residuals:
Min 1Q Median 3Q Max
-1.17594 -0.17561 0.01841 0.21332 0.74801
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.489056 0.067011 52.07 <2e-16 ***
frec_compra 0.088285 0.006108 14.45 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.333 on 87 degrees of freedom
Multiple R-squared: 0.706, Adjusted R-squared: 0.7026
F-statistic: 208.9 on 1 and 87 DF, p-value: < 2.2e-16
studentized Breusch-Pagan test
data: rl_6
BP = 1.5756, df = 1, p-value = 0.2094
El modelo 6 es el único modelo donde encontramos homocedasticidad; la normalidad de los datos se asume ya que tenemos >30 observaciones.
Graficamos el modelo 6
Vamos a pasar el eje y a escala original, para ello, tenemos que tomar la pendiente del modelo con las variables originales (rl_4) y el intercepto del modelo rl_6
frec_compra
11820.04
(Intercept)
3.489056
Creamos el modelo final de regresión lineal
Por último, graficamos la regresión lineal
Modelo de regresión logística
Regresión logística (una variable independiente)
Para esta primera regresión logística usaremos como variable dependiente el total_x_cliente_log y como variable independiente la frec_compra_log
Umbral en la variable transformada: 9.929647
Umbral en la variable original: 20529.1
Se establece las ventas de la siguiente forma; total_x_cliente > 21000 -> venta alta (el evento sucede-> 1, sino 0); la nueva variable la llamaremos vtas_bin y es la que usaremos finalmente como variable de respuesta en la regresión
nombrecliente frec_compra total_x_cliente cluster total_x_cliente_log
1 Cliente AHPOP 9 53524.01 1 10.887886
2 Cliente AHXHT 6 13258.02 2 9.492358
3 Cliente AZJED 15 98310.83 1 11.495889
4 Cliente BSVAR 4 4587.30 2 8.431047
5 Cliente CCFIZ 7 8854.15 2 9.088642
6 Cliente CCKOT 10 58554.18 1 10.977708
total_x_cliente_sqrt frec_compra_log frec_compra_sqrt valores_ajustados
1 231.35258 2.197225 3.000000 106383.85
2 115.14348 1.791759 2.449490 70923.73
3 313.54557 2.708050 3.872983 177304.08
4 67.72961 1.386294 2.000000 47283.65
5 94.09649 1.945910 2.645751 82743.77
6 241.97971 2.302585 3.162278 118203.89
vtas_bin
1 1
2 0
3 1
4 0
5 0
6 1
RESUMEN
Variable independiente -> frec_compra_log
Variable dependiente -> vtas_bin
McFadden
0.5991509
El valor de ajuste del modelo de regresion logística es alto
Area under the curve: 0.9495
actual
pred 0 1
0 38 3
1 6 42
[1] "Precisión del modelo: 0.875"
Ahora visualizamos, según el punto de corte indicado, a partir de cuando se clasifican las frecuencias de compra según sea una venta alta o no, pero antes pasamos a escala original la variable independiente
La clasificación indica que, en el punto de corte o umbral de decisión de 0.5, el modelo estima que a partir de que el cliente compra 8 veces es el corte, es decir, que a partir de que un cliente compre 8 veces o más, éstas compras tienen una probabilidad significativamente alta de ser clasificados como altas ventas
Evolución de la frecuencia de compra, según las ventas predichas
El modelo predice la probabilidad de que según sea la frecuencia de compra del cliente, estas sean catalogadas como alta venta o no; si el color es naranja la probabilidad es mucho más baja de que se catalogue tanto como 0 (baja venta) como 1 (alta venta)
nombrecliente frec_compra total_x_cliente cluster total_x_cliente_log
1 Cliente AHPOP 9 53524.01 1 10.887886
2 Cliente AHXHT 6 13258.02 2 9.492358
3 Cliente AZJED 15 98310.83 1 11.495889
4 Cliente BSVAR 4 4587.30 2 8.431047
5 Cliente CCFIZ 7 8854.15 2 9.088642
6 Cliente CCKOT 10 58554.18 1 10.977708
total_x_cliente_sqrt frec_compra_log frec_compra_sqrt valores_ajustados
1 231.35258 2.197225 3.000000 106383.85
2 115.14348 1.791759 2.449490 70923.73
3 313.54557 2.708050 3.872983 177304.08
4 67.72961 1.386294 2.000000 47283.65
5 94.09649 1.945910 2.645751 82743.77
6 241.97971 2.302585 3.162278 118203.89
vtas_bin frec_compra_original pred clas es_venta_alta
1 1 9 0.68308832 1 si
2 0 6 0.13367850 0 no
3 1 15 0.98353637 1 si
4 0 4 0.01092585 0 no
5 0 7 0.29601515 0 no
6 1 10 0.81048755 1 si
Visualizamos la frecuencia de compra original agrupada por si es considerada venta alta o no
Regresión logística (varias variables independientes)
dcto_bin preciounitario cantidad total_con_dcto total_sin_dcto dcto_aplicado
1 0 14.0 12 168.0 168.0 0
2 0 9.8 10 98.0 98.0 0
3 0 34.8 5 174.0 174.0 0
4 0 18.6 9 167.4 167.4 0
5 0 42.4 40 1696.0 1696.0 0
6 0 7.7 10 77.0 77.0 0
es_bebidas es_Condimentos es_Dulces es_Lacteos es_Cereales_Granos
1 0 0 0 0 0
2 0 0 0 0 1
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 0 0 0 0 0
es_Carne_Aves es_Frescos es_Mariscos hay_dcto
1 0 0 0 no
2 0 0 0 no
3 0 0 0 no
4 0 0 0 no
5 0 0 0 no
6 0 0 1 no
Graficamos la distribución de la variable cantidad agrupada por si hay o no descuento
También graficamos la distribución de la variable total_con_dcto
Se observan muchos outliers para establecer un umbral medio de esta variable dependiente, optamos por la transformación
Umbral en la variable transformada: 5.735805
Umbral en la variable original: 308.7623
Se establece las ventas de la siguiente forma total_con_dcto > 350 -> venta alta (el evento sucede-> 1, sino 0)
dcto_bin preciounitario cantidad total_con_dcto total_sin_dcto dcto_aplicado
1 0 14.0 12 168.0 168.0 0
2 0 9.8 10 98.0 98.0 0
3 0 34.8 5 174.0 174.0 0
4 0 18.6 9 167.4 167.4 0
5 0 42.4 40 1696.0 1696.0 0
6 0 7.7 10 77.0 77.0 0
es_bebidas es_Condimentos es_Dulces es_Lacteos es_Cereales_Granos
1 0 0 0 0 0
2 0 0 0 0 1
3 0 0 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 0 0 0 0 0
es_Carne_Aves es_Frescos es_Mariscos hay_dcto total_con_dcto_log vtas_bin
1 0 0 0 no 5.129899 0
2 0 0 0 no 4.595120 0
3 0 0 0 no 5.164786 0
4 0 0 0 no 5.126342 0
5 0 0 0 no 7.436617 1
6 0 0 1 no 4.356709 0
Start: AIC=957.26
vtas_bin ~ dcto_bin + preciounitario + cantidad + dcto_aplicado +
es_bebidas + es_Condimentos + es_Dulces + es_Lacteos + es_Cereales_Granos +
es_Carne_Aves + es_Frescos + es_Mariscos
Step: AIC=957.26
vtas_bin ~ dcto_bin + preciounitario + cantidad + dcto_aplicado +
es_bebidas + es_Condimentos + es_Dulces + es_Lacteos + es_Cereales_Granos +
es_Carne_Aves + es_Mariscos
Step: AIC=957.26
vtas_bin ~ dcto_bin + preciounitario + cantidad + dcto_aplicado +
es_bebidas + es_Condimentos + es_Dulces + es_Cereales_Granos +
es_Carne_Aves + es_Mariscos
Df Deviance AIC
- es_Dulces 1 935.76 955.76
- es_Carne_Aves 1 935.79 955.79
<none> 935.26 957.26
- es_bebidas 1 938.07 958.07
- es_Mariscos 1 938.74 958.74
- es_Cereales_Granos 1 940.52 960.52
- dcto_aplicado 1 944.10 964.10
- es_Condimentos 1 944.56 964.56
- dcto_bin 1 969.77 989.77
- preciounitario 1 1769.54 1789.54
- cantidad 1 2044.55 2064.55
Step: AIC=955.76
vtas_bin ~ dcto_bin + preciounitario + cantidad + dcto_aplicado +
es_bebidas + es_Condimentos + es_Cereales_Granos + es_Carne_Aves +
es_Mariscos
Df Deviance AIC
- es_Carne_Aves 1 936.05 954.05
<none> 935.76 955.76
- es_bebidas 1 938.07 956.07
- es_Mariscos 1 938.74 956.74
+ es_Dulces 1 935.26 957.26
- es_Cereales_Granos 1 940.53 958.53
- dcto_aplicado 1 944.59 962.59
- es_Condimentos 1 944.78 962.78
- dcto_bin 1 970.05 988.05
- preciounitario 1 1778.81 1796.81
- cantidad 1 2047.92 2065.92
Step: AIC=954.05
vtas_bin ~ dcto_bin + preciounitario + cantidad + dcto_aplicado +
es_bebidas + es_Condimentos + es_Cereales_Granos + es_Mariscos
Df Deviance AIC
<none> 936.05 954.05
- es_bebidas 1 938.13 954.13
- es_Mariscos 1 938.78 954.78
+ es_Carne_Aves 1 935.76 955.76
+ es_Dulces 1 935.79 955.79
- es_Cereales_Granos 1 940.56 956.56
- es_Condimentos 1 944.78 960.78
- dcto_aplicado 1 944.86 960.86
- dcto_bin 1 970.20 986.20
- preciounitario 1 1782.99 1798.99
- cantidad 1 2049.37 2065.37
Call:
glm(formula = vtas_bin ~ dcto_bin + preciounitario + cantidad +
dcto_aplicado + es_bebidas + es_Condimentos + es_Cereales_Granos +
es_Mariscos, family = binomial, data = reg_logis_dcto)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -10.15669 0.54405 -18.669 < 2e-16 ***
dcto_bin -1.63987 0.29837 -5.496 3.88e-08 ***
preciounitario 0.21032 0.01200 17.534 < 2e-16 ***
cantidad 0.25434 0.01377 18.468 < 2e-16 ***
dcto_aplicado 0.01119 0.00399 2.803 0.00506 **
es_bebidas 0.35866 0.24903 1.440 0.14980
es_Condimentos 0.81256 0.27532 2.951 0.00316 **
es_Cereales_Granos 0.63649 0.30014 2.121 0.03395 *
es_Mariscos 0.41795 0.25267 1.654 0.09811 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2985.62 on 2154 degrees of freedom
Residual deviance: 936.05 on 2146 degrees of freedom
AIC: 954.05
Number of Fisher Scoring iterations: 8
McFadden
0.6864811
El valor de ajuste del modelo de regresion logística es alto
Tomamos como umbral el 0.7 para clasificar como 1
Area under the curve: 0.9749
actual
pred 0 1
0 1055 191
1 54 855
[1] "Precisión del modelo: 0.9406"
Ahora visualizamos, según el punto de corte indicado, a partir de cuando se clasifican las cantidades según sea una venta alta o no
La clasificación indica que, en el punto de corte o umbral de decisión de 0.7, el modelo estima que a partir de 32 unidades es el corte, es decir, que pedidos a partir de 32 unidades tienen una probabilidad significativamente alta de ser clasificados como altas ventas
Evolución del descuento aplicado, según la cantidad predicha
El modelo predice la probabilidad de que diversas cantidades sean catalogadas como alta venta o no; si el color es naranja la probabilidad es mucho más baja de que se catalogue tanto como 0 (baja venta) como 1 (alta venta)