Informe de datos de ventas de muestra

Caratula

Caratula estadistica
Caratula estadistica

Índice

  1. Aspectos generales
    1.1 Nombre de la organización y/o empresa (real o propuesta)
    1.2 Descripción del caso (o los caso) que se va a analizar
  2. Fundamentos básicos de la Estadística
    2.1 Objetivo de estudio 2.2 Población de estudio
    2.3 Muestra 2.4 Unidad de análisis
  3. Variables y tipo de variables
  4. Manejo de base de datos
  5. Tablas de frecuencia (Para cada variable)
  6. Representación gráfica de datos.
  7. Medidas estadísticas de tendencia
  8. Medidas estadísticas de posición
  9. Manejo de datos Missing
  10. Manejo de valores outliers
  11. Transformación de variables
  12. Estandarización y normalización de variables
  13. Modelamiento predictivo

Resumen

Datos de ventas de muestra, información de pedidos, ventas, clientes, envíos, etc., utilizados para segmentación, análisis de clientes, agrupación en clústeres y más.

I. Aspectos generales

1.1 Nombre de la organización y/o empresa (real o propuesta)

Datos de ventas de muestra

1.2 Descripción del caso (o los caso) que se va a analizar

Datos de ventas de muestra, información de pedidos, ventas, clientes, envíos, etc., utilizados para segmentación, análisis de clientes, agrupación en clústeres y más. Inspirado para el análisis minorista. Este conjunto de datos de muestra es solo un punto de partida. Los minoristas pueden recopilar datos adicionales para realizar análisis más específicos y obtener insights más profundos.

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio

El objetivo principal del estudio es realizar análisis predictivos y descriptivos del mercado minorista utilizando el conjunto de datos de ventas de muestra. Específicamente, se busca: Comprender el comportamiento del cliente: Analizar las tendencias de compra, la frecuencia de compra, el valor promedio de compra y otros patrones de comportamiento. Segmentar el mercado: Dividir el mercado en grupos específicos (por edad, sexo, ubicación, etc.) para comprender mejor sus necesidades y preferencias. Identificar oportunidades de negocio: Evaluar la rentabilidad de diferentes productos, categorías y canales de venta para identificar oportunidades de crecimiento. Optimizar la estrategia de marketing: Desarrollar campañas de marketing más personalizadas y efectivas en función de la segmentación del mercado y el análisis del comportamiento del cliente. Pronosticar la demanda: Predecir la demanda de productos para optimizar la gestión del inventario y la planificación de la producción.

2.2 Población de estudio

La población de estudio está compuesta por todos los clientes que han realizado compras en el período de tiempo cubierto por el conjunto de datos.

2.3 Muestra

No se ha especificado si el conjunto de datos proporcionado representa una muestra o la población completa de clientes. Es importante verificar esta información para determinar la representatividad de los datos y la validez de las inferencias que se puedan realizar.

2.4 Unidad de análisis

La unidad de análisis es cada transacción individual de compra realizada por un cliente. El conjunto de datos proporciona información específica para cada compra, como fecha, ID del cliente, ID del producto, precio, cantidad, método de pago, etc.

III. Variables y tipo de variables

  • ORDERNUMBER: Identificador único para cada pedido
  • QUANTITYORDERED: Número de unidades pedidas
  • PRICEEACH: Precio por unidad del producto.
  • ORDERLINENUMBER: Identificador único para cada artículo dentro de un pedido.
  • SALES: Importe total de ventas para la línea de pedido
  • ORDERDATE: Fecha del pedido
  • STATUS: Estado actual del pedido (por ejemplo, enviado, pendiente, cancelado)
  • QTR_ID: Identificador del trimestre en el que se realizó el pedido
  • MONTH_ID: Identificador del mes en el que se realizó el pedido.
  • YEAR_ID: Año en el que se realizó el pedido
  • PRODUCTLINE: Línea o categoría de productos (p. ej., automóviles, camionetas, SUV)
  • MSRP: Precio de venta sugerido por el fabricante
  • PRODUCTCODE: Identificador único del producto.
  • CUSTOMERNAME: Nombre del cliente
  • PHONE: Número de teléfono del cliente
  • ADDRESSLINE1: Línea de dirección principal del cliente
  • ADDRESSLINE2: Línea de dirección secundaria del cliente (opcional)
  • CITY: ciudad del cliente
  • STATE: Estado/provincia del cliente
  • POSTALCODE: código postal del cliente
  • COUNTRY: País del cliente
  • TERRITORY: Territorio de ventas del cliente (opcional)
  • CONTACTLASTNAME: Apellido de la persona de contacto
  • CONTACTFIRSTNAME: Nombre de la persona de contacto
  • DEALSIZE: Tamaño del acuerdo en términos del monto total de ventas

IV. Manejo de base de datos

banco <- read.csv("sales_data_sample.csv", 
                    sep = ",", stringsAsFactors = TRUE) 
head(banco)

V. Tablas de frecuencia (Para cada variable)

library(agricolae)
tabla_frecuencia_ORDERNUMBER <- table.freq(hist(banco$ORDERNUMBER, breaks = "sturges", plot = FALSE))
tabla_frecuencia_ORDERNUMBER
library(agricolae)
tabla_frecuencia_QUANTITYORDERED <- table.freq(hist(banco$QUANTITYORDERED, breaks = "sturges", plot = FALSE))
tabla_frecuencia_QUANTITYORDERED
library(agricolae)
tabla_frecuencia_PRICEEACH <- table.freq(hist(banco$PRICEEACH, breaks = "sturges", plot = FALSE))
tabla_frecuencia_PRICEEACH
library(agricolae)
tabla_frecuencia_ORDERLINENUMBER <- table.freq(hist(banco$ORDERLINENUMBER, breaks = "sturges", plot = FALSE))
tabla_frecuencia_ORDERLINENUMBER
library(agricolae)
tabla_frecuencia_SALES <- table.freq(hist(banco$SALES, breaks = "sturges", plot = FALSE))
tabla_frecuencia_SALES
library(agricolae)
tabla_frecuencia_QTR_ID <- table.freq(hist(banco$QTR_ID, breaks = "sturges", plot = FALSE))
tabla_frecuencia_QTR_ID
library(agricolae)
tabla_frecuencia_MONTH_ID <- table.freq(hist(banco$MONTH_ID, breaks = "sturges", plot = FALSE))
tabla_frecuencia_MONTH_ID
library(agricolae)
tabla_frecuencia_MSRP <- table.freq(hist(banco$MSRP, breaks = "sturges", plot = FALSE))
tabla_frecuencia_MSRP

VI. Representación gráfica de datos.

library(ggplot2)
ggplot(data=banco, aes(x=ORDERNUMBER))+
  geom_bar()

library(ggplot2)
ggplot(data = banco, aes(x = ORDERNUMBER, y = QUANTITYORDERED)) +
  geom_point() +
  labs(x = "Numero de orden", y = "Cantidad de orden")

  library(ggplot2)
  ggplot(data=banco, aes(y=PRODUCTLINE))+
    geom_bar()+
    theme_classic()

  ggplot(data=banco, aes(STATE))+
  geom_bar()+
  theme_classic()

  ggplot(data=banco, aes(COUNTRY))+
  geom_bar()+
  theme_classic()

  ggplot(data=banco, aes(TERRITORY))+
  geom_bar()+
  theme_classic()

ggplot(data=banco, aes(DEALSIZE, fill = DEALSIZE))+
  geom_bar()+
  coord_polar("x", start=0)

head(banco)

VII. Medidas estadísticas de tendencia

#QUANTITYORDERED

Media

QUANTITYORDERED <- banco$QUANTITYORDERED
promedio = sum(QUANTITYORDERED)/length(QUANTITYORDERED)
promedio
## [1] 89.25

Mediana

median(QUANTITYORDERED)
## [1] 22

Moda

library(modeest)
## 
## Attaching package: 'modeest'
## The following object is masked from 'package:agricolae':
## 
##     skewness
mfv(QUANTITYORDERED)
## [1] 21

#PRICEEACH

Media

PRICEEACH <- banco$PRICEEACH
promedio = sum(PRICEEACH)/length(PRICEEACH)
promedio
## [1] 93.99375

Mediana

median(PRICEEACH)
## [1] 100

Moda

library(modeest)
mfv(PRICEEACH)
## [1] 100

#SALES Media

SALES <- banco$SALES
promedio = sum(SALES)/length(SALES)
promedio
## [1] 355020.8

Mediana

median(SALES)
## [1] 378055

Moda

library(modeest)
mfv(SALES)
##  [1]   1451   2871  27659  37467  73311  73741 109935 216854 233312 243456
## [11] 249777 259739 318864 320712 347976 367676 388434 396566 409968 417735
## [21] 435804 439438 439614 470844 486024 520527 540462 551232 720911 732906
## [31] 751608 773793

VIII. Medidas estadísticas de posición

(cuartiles)

quantile(banco$SALES)
##       0%      25%      50%      75%     100% 
##   1451.0 229197.5 378055.0 474639.0 773793.0

Segun los resultados: El valor minimo de una venta es: 733.110

### Cuartil 1 \((Q_1)\) interpretación: es $ 2844.725; El 25% de las ventas, su monto máximo es $ 2844.725

### Cuartil 2 \((Q_2)\) interpretación: es $ 4032.670; El 50% de las ventas, su monto máximo es $ 4032.670

### Cuartil 3 \((Q_3)\) interpretación: es $ 5255.108; El 75% de las ventas, su monto máximo es $ 5255.108

Dividir en 10 grupo (deciles)

quantile(banco$SALES, probs = seq(0, 1, 0.1))
##       0%      10%      20%      30%      40%      50%      60%      70% 
##   1451.0  41051.4 131318.8 245352.3 319603.2 378055.0 414628.2 439561.2 
##      80%      90%     100% 
## 513626.4 703943.1 773793.0

Dividir en 100 grupo (percentiles)

quantile(banco$SALES, probs = seq(0, 1, 0.01))
##        0%        1%        2%        3%        4%        5%        6%        7% 
##   1451.00   1891.20   2331.40   2771.60   8820.12  16504.40  24188.68  29326.36 
##        8%        9%       10%       11%       12%       13%       14%       15% 
##  32366.84  35407.32  41051.40  52163.04  63274.68  73323.90  73457.20  73590.50 
##       16%       17%       18%       19%       20%       21%       22%       23% 
##  73723.80  83513.38  94733.52 105953.66 131318.80 164463.69 197608.58 218993.54 
##       24%       25%       26%       27%       28%       29%       30%       31% 
## 224095.52 229197.50 233920.64 237065.28 240209.92 243354.56 245352.30 247311.81 
##       32%       33%       34%       35%       36%       37%       38%       39% 
## 249271.32 252068.26 255156.48 258244.70 269199.00 287527.75 305856.50 319030.32 
##       40%       41%       42%       43%       44%       45%       46%       47% 
## 319603.20 320176.08 321257.28 329709.12 338160.96 346612.80 353098.00 359205.00 
##       48%       49%       50%       51%       52%       53%       54%       55% 
## 365312.00 371620.02 378055.00 384489.98 389409.84 391930.76 394451.68 397236.10 
##       56%       57%       58%       59%       60%       61%       62%       63% 
## 401390.72 405545.34 409699.96 412220.43 414628.20 417035.97 421710.18 427311.57 
##       64%       65%       66%       67%       68%       69%       70%       71% 
## 432912.96 436349.10 437475.64 438602.18 439452.08 439506.64 439561.20 439926.30 
##       72%       73%       74%       75%       76%       77%       78%       79% 
## 449607.60 459288.90 468970.20 474639.00 479344.80 484050.60 492234.54 502930.47 
##       80%       81%       82%       83%       84%       85%       86%       87% 
## 513626.40 522719.85 528899.70 535079.55 540892.80 544231.50 547570.20 550908.90 
##       88%       89%       90%       91%       92%       93%       94%       95% 
## 598742.12 651342.61 703943.10 723429.95 727148.40 730866.85 735524.28 741321.90 
##       96%       97%       98%       99%      100% 
## 747119.52 753160.95 760038.30 766915.65 773793.00

Asimetría y curtosis

Asimetría

library(fBasics)
## 
## Attaching package: 'fBasics'
## The following objects are masked from 'package:modeest':
## 
##     ghMode, ghtMode, gldMode, hypMode, nigMode, skewness
## The following objects are masked from 'package:agricolae':
## 
##     kurtosis, skewness
skewness(banco$SALES)
## [1] 0.1186137
## attr(,"method")
## [1] "moment"

Resultado: [1] 0.9536708

hist(banco$SALES)

Curtosis

kurtosis(banco$SALES)
## [1] -0.8081525
## attr(,"method")
## [1] "excess"

IX. Manejo de datos Missing

# Cargar conjunto de datos
bancoTwo<-read.csv("sales_data_sample.csv",
                    sep = "," , stringsAsFactors = TRUE)
# Mostrar
head(bancoTwo)
str(bancoTwo)
## 'data.frame':    32 obs. of  25 variables:
##  $ ORDERNUMBER     : int  10107 10121 10134 10145 10159 10168 10180 10188 10201 10211 ...
##  $ QUANTITYORDERED : int  20 24 21 35 19 26 19 18 12 2100 ...
##  $ PRICEEACH       : num  95.7 81.3 94.7 83.3 100 ...
##  $ ORDERLINENUMBER : int  3 5 2 6 10 7 9 1 2 14 ...
##  $ SALES           : int  2871 27659 388434 37467 520527 347976 249777 551232 216854 470844 ...
##  $ ORDERDATE       : Factor w/ 32 levels "1/15/2004 0:00",..: 15 24 26 29 3 6 7 9 12 1 ...
##  $ STATUS          : Factor w/ 2 levels "Disputed","Shipped": 2 2 2 2 2 2 2 2 2 1 ...
##  $ QTR_ID          : int  1 2 3 3 4 4 4 4 4 1 ...
##  $ MONTH_ID        : int  2 5 7 8 10 10 11 11 12 1 ...
##  $ YEAR_ID         : int  2003 2003 2003 2003 2003 2003 2003 2003 2003 2004 ...
##  $ PRODUCTLINE     : Factor w/ 2 levels "Classic Cars",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ MSRP            : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : Factor w/ 2 levels "S10_1678","S10_1949": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CUSTOMERNAME    : Factor w/ 28 levels "Australian Collectors, Co.",..: 15 19 16 25 5 22 7 13 18 2 ...
##  $ PHONE           : Factor w/ 28 levels "(1) 47.55.6555",..: 16 19 5 23 24 26 12 6 25 1 ...
##  $ ADDRESSLINE1    : Factor w/ 28 levels "1785 First Street",..: 17 9 6 16 15 18 2 24 8 3 ...
##  $ ADDRESSLINE2    : Factor w/ 5 levels "","Level 3","Level 6",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CITY            : Factor w/ 23 levels "Allentown","Bergen",..: 16 19 17 18 21 4 8 2 21 17 ...
##  $ STATE           : Factor w/ 9 levels "","CA","CT","MA",..: 7 1 1 2 2 2 1 1 2 1 ...
##  $ POSTALCODE      : Factor w/ 25 levels "","10022","2067",..: 2 12 17 19 1 21 14 23 1 16 ...
##  $ COUNTRY         : Factor w/ 10 levels "Australia","Austria",..: 10 4 4 10 10 10 4 5 10 4 ...
##  $ TERRITORY       : Factor w/ 3 levels "APAC","EMEA",..: NA 2 2 NA NA NA 2 2 NA 2 ...
##  $ CONTACTLASTNAME : Factor w/ 25 levels "Benitez","Berglund",..: 25 10 5 24 4 12 22 19 17 20 ...
##  $ CONTACTFIRSTNAME: Factor w/ 25 levels "Adrian","Christina",..: 13 21 3 11 11 12 18 23 11 5 ...
##  $ DEALSIZE        : Factor w/ 3 levels "Large","Medium",..: 3 3 2 2 2 2 3 2 3 2 ...

Verificación de valores perdidos

# Verificar columnas con missing
which(colSums(is.na(bancoTwo))!= 0)
## TERRITORY 
##        22

Realizar el análisis utilizando librerias

library(VIM)
library(mice)

resumen_missing <- aggr(bancoTwo, numbers=T)

summary(resumen_missing)
## 
##  Missings per variable: 
##          Variable Count
##       ORDERNUMBER     0
##   QUANTITYORDERED     0
##         PRICEEACH     0
##   ORDERLINENUMBER     0
##             SALES     0
##         ORDERDATE     0
##            STATUS     0
##            QTR_ID     0
##          MONTH_ID     0
##           YEAR_ID     0
##       PRODUCTLINE     0
##              MSRP     0
##       PRODUCTCODE     0
##      CUSTOMERNAME     0
##             PHONE     0
##      ADDRESSLINE1     0
##      ADDRESSLINE2     0
##              CITY     0
##             STATE     0
##        POSTALCODE     0
##           COUNTRY     0
##         TERRITORY    14
##   CONTACTLASTNAME     0
##  CONTACTFIRSTNAME     0
##          DEALSIZE     0
## 
##  Missings in combinations of variables: 
##                                       Combinations Count Percent
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0    18   56.25
##  0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:1:0:0:0    14   43.75

Para determinar mejor lo patrones de comportamiento de missing se puede utilizar la siguiente función

library(VIM)
matrixplot(bancoTwo)

otra representación

#Con librería mice
library(mice)
md.pattern(bancoTwo, rotate.names = TRUE)

##    ORDERNUMBER QUANTITYORDERED PRICEEACH ORDERLINENUMBER SALES ORDERDATE STATUS
## 18           1               1         1               1     1         1      1
## 14           1               1         1               1     1         1      1
##              0               0         0               0     0         0      0
##    QTR_ID MONTH_ID YEAR_ID PRODUCTLINE MSRP PRODUCTCODE CUSTOMERNAME PHONE
## 18      1        1       1           1    1           1            1     1
## 14      1        1       1           1    1           1            1     1
##         0        0       0           0    0           0            0     0
##    ADDRESSLINE1 ADDRESSLINE2 CITY STATE POSTALCODE COUNTRY CONTACTLASTNAME
## 18            1            1    1     1          1       1               1
## 14            1            1    1     1          1       1               1
##               0            0    0     0          0       0               0
##    CONTACTFIRSTNAME DEALSIZE TERRITORY   
## 18                1        1         1  0
## 14                1        1         0  1
##                   0        0        14 14

La librería visdat permite visualizar missing pero los ordena por tipo de datos

library(visdat)
vis_dat(bancoTwo)

Para obtener columnas con porcentajes de missing

vis_miss(bancoTwo)

Corrección de missing

Eliminar filas o columnas con missin (es recomendable optar por eliminar columnas si el % de missing esta por arriba de 15% <para ralgunos expertos 30%>)

banco_corregido1 <- na.omit(bancoTwo)
str(banco_corregido1)
## 'data.frame':    18 obs. of  25 variables:
##  $ ORDERNUMBER     : int  10121 10134 10180 10188 10211 10223 10275 10299 10309 10341 ...
##  $ QUANTITYORDERED : int  24 21 19 18 2100 79 25 23 31 21 ...
##  $ PRICEEACH       : num  81.3 94.7 86.1 100 100 ...
##  $ ORDERLINENUMBER : int  5 2 9 1 14 9 1 9 5 9 ...
##  $ SALES           : int  27659 388434 249777 551232 470844 396566 417735 259739 439438 773793 ...
##  $ ORDERDATE       : Factor w/ 32 levels "1/15/2004 0:00",..: 24 26 7 9 1 14 27 32 4 11 ...
##  $ STATUS          : Factor w/ 2 levels "Disputed","Shipped": 2 2 2 2 1 1 1 1 1 2 ...
##  $ QTR_ID          : int  2 3 4 4 1 1 3 3 4 4 ...
##  $ MONTH_ID        : int  5 7 11 11 1 2 7 9 10 11 ...
##  $ YEAR_ID         : int  2003 2003 2003 2003 2004 2004 2004 2004 2004 2004 ...
##  $ PRODUCTLINE     : Factor w/ 2 levels "Classic Cars",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ MSRP            : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : Factor w/ 2 levels "S10_1678","S10_1949": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CUSTOMERNAME    : Factor w/ 28 levels "Australian Collectors, Co.",..: 19 16 7 13 2 1 14 24 3 20 ...
##  $ PHONE           : Factor w/ 28 levels "(1) 47.55.6555",..: 19 5 12 6 1 9 20 28 10 27 ...
##  $ ADDRESSLINE1    : Factor w/ 28 levels "1785 First Street",..: 9 6 2 24 3 11 12 27 25 26 ...
##  $ ADDRESSLINE2    : Factor w/ 5 levels "","Level 3","Level 6",..: 1 1 1 1 1 2 1 1 1 1 ...
##  $ CITY            : Factor w/ 23 levels "Allentown","Bergen",..: 19 17 8 2 17 12 13 7 23 20 ...
##  $ STATE           : Factor w/ 9 levels "","CA","CT","MA",..: 1 1 1 1 1 9 1 1 1 1 ...
##  $ POSTALCODE      : Factor w/ 25 levels "","10022","2067",..: 12 17 14 23 16 7 9 4 8 10 ...
##  $ COUNTRY         : Factor w/ 10 levels "Australia","Austria",..: 4 4 4 5 4 1 4 3 5 2 ...
##  $ TERRITORY       : Factor w/ 3 levels "APAC","EMEA",..: 2 2 2 2 2 1 2 2 2 2 ...
##  $ CONTACTLASTNAME : Factor w/ 25 levels "Benitez","Berglund",..: 10 5 22 19 20 7 16 14 3 21 ...
##  $ CONTACTFIRSTNAME: Factor w/ 25 levels "Adrian","Christina",..: 21 3 18 23 5 22 9 19 10 8 ...
##  $ DEALSIZE        : Factor w/ 3 levels "Large","Medium",..: 3 2 3 2 2 2 2 3 2 1 ...
##  - attr(*, "na.action")= 'omit' Named int [1:14] 1 4 5 6 9 12 13 14 16 19 ...
##   ..- attr(*, "names")= chr [1:14] "1" "4" "5" "6" ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido1))!= 0)
## named integer(0)

Aplicando técnicas de imputación Imputación por medidas de tendencia central

library(DMwR2)
banco_corregido2<-centralImputation(bancoTwo) #DMwR, mediana (númerico), moda(no númerico)
str(banco_corregido2)
## 'data.frame':    32 obs. of  25 variables:
##  $ ORDERNUMBER     : int  10107 10121 10134 10145 10159 10168 10180 10188 10201 10211 ...
##  $ QUANTITYORDERED : int  20 24 21 35 19 26 19 18 12 2100 ...
##  $ PRICEEACH       : num  95.7 81.3 94.7 83.3 100 ...
##  $ ORDERLINENUMBER : int  3 5 2 6 10 7 9 1 2 14 ...
##  $ SALES           : int  2871 27659 388434 37467 520527 347976 249777 551232 216854 470844 ...
##  $ ORDERDATE       : Factor w/ 32 levels "1/15/2004 0:00",..: 15 24 26 29 3 6 7 9 12 1 ...
##  $ STATUS          : Factor w/ 2 levels "Disputed","Shipped": 2 2 2 2 2 2 2 2 2 1 ...
##  $ QTR_ID          : int  1 2 3 3 4 4 4 4 4 1 ...
##  $ MONTH_ID        : int  2 5 7 8 10 10 11 11 12 1 ...
##  $ YEAR_ID         : int  2003 2003 2003 2003 2003 2003 2003 2003 2003 2004 ...
##  $ PRODUCTLINE     : Factor w/ 2 levels "Classic Cars",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ MSRP            : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : Factor w/ 2 levels "S10_1678","S10_1949": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CUSTOMERNAME    : Factor w/ 28 levels "Australian Collectors, Co.",..: 15 19 16 25 5 22 7 13 18 2 ...
##  $ PHONE           : Factor w/ 28 levels "(1) 47.55.6555",..: 16 19 5 23 24 26 12 6 25 1 ...
##  $ ADDRESSLINE1    : Factor w/ 28 levels "1785 First Street",..: 17 9 6 16 15 18 2 24 8 3 ...
##  $ ADDRESSLINE2    : Factor w/ 5 levels "","Level 3","Level 6",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CITY            : Factor w/ 23 levels "Allentown","Bergen",..: 16 19 17 18 21 4 8 2 21 17 ...
##  $ STATE           : Factor w/ 9 levels "","CA","CT","MA",..: 7 1 1 2 2 2 1 1 2 1 ...
##  $ POSTALCODE      : Factor w/ 25 levels "","10022","2067",..: 2 12 17 19 1 21 14 23 1 16 ...
##  $ COUNTRY         : Factor w/ 10 levels "Australia","Austria",..: 10 4 4 10 10 10 4 5 10 4 ...
##  $ TERRITORY       : Factor w/ 3 levels "APAC","EMEA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ CONTACTLASTNAME : Factor w/ 25 levels "Benitez","Berglund",..: 25 10 5 24 4 12 22 19 17 20 ...
##  $ CONTACTFIRSTNAME: Factor w/ 25 levels "Adrian","Christina",..: 13 21 3 11 11 12 18 23 11 5 ...
##  $ DEALSIZE        : Factor w/ 3 levels "Large","Medium",..: 3 3 2 2 2 2 3 2 3 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido2))!= 0)
## named integer(0)

Utilizando otra librería para imputar datos

library(VIM)
banco_corregido3 <- initialise(bancoTwo, method = "median") #media (continuos) mediana (discretos), moda(no númerico)
str(banco_corregido3)
## 'data.frame':    32 obs. of  25 variables:
##  $ ORDERNUMBER     : num  10107 10121 10134 10145 10159 ...
##  $ QUANTITYORDERED : num  20 24 21 35 19 26 19 18 12 2100 ...
##  $ PRICEEACH       : num  95.7 81.3 94.7 83.3 100 ...
##  $ ORDERLINENUMBER : num  3 5 2 6 10 7 9 1 2 14 ...
##  $ SALES           : num  2871 27659 388434 37467 520527 ...
##  $ ORDERDATE       : Factor w/ 32 levels "1/15/2004 0:00",..: 15 24 26 29 3 6 7 9 12 1 ...
##  $ STATUS          : Factor w/ 2 levels "Disputed","Shipped": 2 2 2 2 2 2 2 2 2 1 ...
##  $ QTR_ID          : num  1 2 3 3 4 4 4 4 4 1 ...
##  $ MONTH_ID        : num  2 5 7 8 10 10 11 11 12 1 ...
##  $ YEAR_ID         : num  2003 2003 2003 2003 2003 ...
##  $ PRODUCTLINE     : Factor w/ 2 levels "Classic Cars",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ MSRP            : num  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : Factor w/ 2 levels "S10_1678","S10_1949": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CUSTOMERNAME    : Factor w/ 28 levels "Australian Collectors, Co.",..: 15 19 16 25 5 22 7 13 18 2 ...
##  $ PHONE           : Factor w/ 28 levels "(1) 47.55.6555",..: 16 19 5 23 24 26 12 6 25 1 ...
##  $ ADDRESSLINE1    : Factor w/ 28 levels "1785 First Street",..: 17 9 6 16 15 18 2 24 8 3 ...
##  $ ADDRESSLINE2    : Factor w/ 5 levels "","Level 3","Level 6",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CITY            : Factor w/ 23 levels "Allentown","Bergen",..: 16 19 17 18 21 4 8 2 21 17 ...
##  $ STATE           : Factor w/ 9 levels "","CA","CT","MA",..: 7 1 1 2 2 2 1 1 2 1 ...
##  $ POSTALCODE      : Factor w/ 25 levels "","10022","2067",..: 2 12 17 19 1 21 14 23 1 16 ...
##  $ COUNTRY         : Factor w/ 10 levels "Australia","Austria",..: 10 4 4 10 10 10 4 5 10 4 ...
##  $ TERRITORY       : Factor w/ 3 levels "APAC","EMEA",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ CONTACTLASTNAME : Factor w/ 25 levels "Benitez","Berglund",..: 25 10 5 24 4 12 22 19 17 20 ...
##  $ CONTACTFIRSTNAME: Factor w/ 25 levels "Adrian","Christina",..: 13 21 3 11 11 12 18 23 11 5 ...
##  $ DEALSIZE        : Factor w/ 3 levels "Large","Medium",..: 3 3 2 2 2 2 3 2 3 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido3))!= 0)
## named integer(0)

Imputación utilizando neighboor más cercanos

library(DMwR2)
banco_corregido4<-knnImputation(bancoTwo, k=10)
str(banco_corregido4)
## 'data.frame':    32 obs. of  25 variables:
##  $ ORDERNUMBER     : int  10107 10121 10134 10145 10159 10168 10180 10188 10201 10211 ...
##  $ QUANTITYORDERED : int  20 24 21 35 19 26 19 18 12 2100 ...
##  $ PRICEEACH       : num  95.7 81.3 94.7 83.3 100 ...
##  $ ORDERLINENUMBER : int  3 5 2 6 10 7 9 1 2 14 ...
##  $ SALES           : int  2871 27659 388434 37467 520527 347976 249777 551232 216854 470844 ...
##  $ ORDERDATE       : Factor w/ 32 levels "1/15/2004 0:00",..: 15 24 26 29 3 6 7 9 12 1 ...
##  $ STATUS          : Factor w/ 2 levels "Disputed","Shipped": 2 2 2 2 2 2 2 2 2 1 ...
##  $ QTR_ID          : int  1 2 3 3 4 4 4 4 4 1 ...
##  $ MONTH_ID        : int  2 5 7 8 10 10 11 11 12 1 ...
##  $ YEAR_ID         : int  2003 2003 2003 2003 2003 2003 2003 2003 2003 2004 ...
##  $ PRODUCTLINE     : Factor w/ 2 levels "Classic Cars",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ MSRP            : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : Factor w/ 2 levels "S10_1678","S10_1949": 1 1 1 1 1 1 1 1 1 1 ...
##  $ CUSTOMERNAME    : Factor w/ 28 levels "Australian Collectors, Co.",..: 15 19 16 25 5 22 7 13 18 2 ...
##  $ PHONE           : Factor w/ 28 levels "(1) 47.55.6555",..: 16 19 5 23 24 26 12 6 25 1 ...
##  $ ADDRESSLINE1    : Factor w/ 28 levels "1785 First Street",..: 17 9 6 16 15 18 2 24 8 3 ...
##  $ ADDRESSLINE2    : Factor w/ 5 levels "","Level 3","Level 6",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ CITY            : Factor w/ 23 levels "Allentown","Bergen",..: 16 19 17 18 21 4 8 2 21 17 ...
##  $ STATE           : Factor w/ 9 levels "","CA","CT","MA",..: 7 1 1 2 2 2 1 1 2 1 ...
##  $ POSTALCODE      : Factor w/ 25 levels "","10022","2067",..: 2 12 17 19 1 21 14 23 1 16 ...
##  $ COUNTRY         : Factor w/ 10 levels "Australia","Austria",..: 10 4 4 10 10 10 4 5 10 4 ...
##  $ TERRITORY       : Factor w/ 3 levels "APAC","EMEA",..: 2 2 2 1 2 1 2 2 1 2 ...
##  $ CONTACTLASTNAME : Factor w/ 25 levels "Benitez","Berglund",..: 25 10 5 24 4 12 22 19 17 20 ...
##  $ CONTACTFIRSTNAME: Factor w/ 25 levels "Adrian","Christina",..: 13 21 3 11 11 12 18 23 11 5 ...
##  $ DEALSIZE        : Factor w/ 3 levels "Large","Medium",..: 3 3 2 2 2 2 3 2 3 2 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido4))!= 0)
## named integer(0)

X. Manejo de valores outliers

banco <- read.csv("sales_data_sample.csv", 
                    sep = ",", stringsAsFactors = TRUE)
# Mostrar datos
head(banco)
# Resumen
summary(banco)
##   ORDERNUMBER    QUANTITYORDERED     PRICEEACH      ORDERLINENUMBER 
##  Min.   :10103   Min.   :  12.00   Min.   : 34.91   Min.   : 1.000  
##  1st Qu.:10149   1st Qu.:  19.75   1st Qu.: 94.74   1st Qu.: 4.000  
##  Median :10217   Median :  22.00   Median :100.00   Median : 6.500  
##  Mean   :10234   Mean   :  89.25   Mean   : 93.99   Mean   : 6.688  
##  3rd Qu.:10311   3rd Qu.:  26.50   3rd Qu.:100.00   3rd Qu.: 9.000  
##  Max.   :10417   Max.   :2100.00   Max.   :100.00   Max.   :14.000  
##                                                                     
##      SALES                  ORDERDATE       STATUS       QTR_ID     
##  Min.   :  1451   1/15/2004 0:00 : 1   Disputed:15   Min.   :1.000  
##  1st Qu.:229198   1/29/2003 0:00 : 1   Shipped :17   1st Qu.:2.000  
##  Median :378055   10/10/2003 0:00: 1                 Median :3.000  
##  Mean   :355021   10/15/2004 0:00: 1                 Mean   :2.688  
##  3rd Qu.:474639   10/20/2003 0:00: 1                 3rd Qu.:4.000  
##  Max.   :773793   10/28/2003 0:00: 1                 Max.   :4.000  
##                   (Other)        :26                                
##     MONTH_ID         YEAR_ID           PRODUCTLINE      MSRP      
##  Min.   : 1.000   Min.   :2003   Classic Cars: 6   Min.   : 95.0  
##  1st Qu.: 4.000   1st Qu.:2003   Motorcycles :26   1st Qu.: 95.0  
##  Median : 7.000   Median :2004                     Median : 95.0  
##  Mean   : 6.938   Mean   :2004                     Mean   :117.3  
##  3rd Qu.:10.000   3rd Qu.:2004                     3rd Qu.: 95.0  
##  Max.   :12.000   Max.   :2005                     Max.   :214.0  
##                                                                   
##    PRODUCTCODE                     CUSTOMERNAME            PHONE   
##  S10_1678:26   Baane Mini Imports        : 2    07-98 9555    : 2  
##  S10_1949: 6   La Rochelle Gifts         : 2    2125557818    : 2  
##                Land of Toys Inc.         : 2    40.67.8555    : 2  
##                Technics Stores Inc.      : 2    6505556809    : 2  
##                Australian Collectors, Co.: 1    (1) 47.55.6555: 1  
##                Auto Canal Petit          : 1    (171) 555-2282: 1  
##                (Other)                   :22    (Other)       :22  
##                        ADDRESSLINE1    ADDRESSLINE2            CITY   
##  67, rue des Cinquante Otages: 2             :28    NYC          : 4  
##  897 Long Airport Avenue     : 2    Level 3  : 1    Burlingame   : 2  
##  9408 Furth Circle           : 2    Level 6  : 1    Madrid       : 2  
##  Erling Skakkes gate 78      : 2    Suite 101: 1    Nantes       : 2  
##  1785 First Street           : 1    Suite 750: 1    Paris        : 2  
##  184, chausse de Tournai     : 1                    San Francisco: 2  
##  (Other)                     :22                    (Other)      :18  
##      STATE      POSTALCODE      COUNTRY   TERRITORY    CONTACTLASTNAME
##         :16   10022  : 4   USA      :14   APAC : 2   Yu        : 3    
##  CA     : 5          : 2   France   : 6   EMEA :15   Bergulfsen: 2    
##  NY     : 4   4110   : 2   Norway   : 3   Japan: 1   Brown     : 2    
##  MA     : 2   44000  : 2   Australia: 2   NA's :14   Hernandez : 2    
##  CT     : 1   94217  : 2   Spain    : 2              Hirano    : 2    
##  NJ     : 1   2067   : 1   Austria  : 1              Labrune   : 2    
##  (Other): 3   (Other):19   (Other)  : 4              (Other)   :19    
##  CONTACTFIRSTNAME   DEALSIZE 
##  Julie  : 4       Large : 6  
##  Janine : 2       Medium:17  
##  Jonas  : 2       Small : 9  
##  Juri   : 2                  
##  Kwai   : 2                  
##  Adrian : 1                  
##  (Other):19

Para todas las columnas

boxplot(banco)

head(banco)

Para QUANTITYORDERED

boxplot(banco$QUANTITYORDERED)

Para PRICEEACH

boxplot(banco$PRICEEACH)

Para SALES

#Gráfico de cajas y bigotes
boxplot(banco$SALES)

Según los resultados, se identifica valores atípicos. Vamos a identificarlo y plantear estrategia de corrección

# Calcular el RIC (RIC = Q3 - Q1)
q1 <- quantile(banco$SALES, 0.25)
q3 <- quantile(banco$SALES, 0.75)
RIC <- q3-q1
RIC
##      75% 
## 245441.5
# Limites o bigotes (Superior e inferior)
bigote_inferior <- q1-1.5*RIC
bigote_inferior
##       25% 
## -138964.8
bigote_superior <- q3+1.5*RIC
bigote_superior
##      75% 
## 842801.2
# Identificar lo valores atípicos
outliers_det <- banco$SALES[banco$SALES < bigote_inferior | banco$SALES > bigote_superior]
outliers_det
## integer(0)

Correción

Eliminar los atípicos

telco_sin_atipicos <- banco[!banco$SALES %in% outliers_det,]
telco_sin_atipicos

Para confirmar vamos a realizar un gráfico de cajas con la nueva data

boxplot(telco_sin_atipicos$SALES)

XI. Transformación de variables

La transformación y estandarización de variables son técnicas comunes utilizadas en el análisis de datos para mejorar la interpretación de los datos y garantizar que las variables sean comparables entre sí.

# 
banco<-read.csv("sales_data_sample.csv", sep = ",", encoding = "latin1", stringsAsFactors = T)

head(banco)

Transformación de raíz cuadrada:

Esta transformación se utiliza para reducir la dispersión de los datos cuando estos tienen una distribución con una varianza que aumenta con el nivel medio de la variable. También puede ayudar a reducir la asimetría.

# Original
hist(banco$QUANTITYORDERED, 12)

Para sacar la raiz cuadrada, simplemente se puede utilizar la función sqrt

sqrt(banco$QUANTITYORDERED)
##  [1]  4.472136  4.898979  4.582576  5.916080  4.358899  5.099020  4.358899
##  [8]  4.242641  3.464102 45.825757  8.888194  4.795832  5.291503  5.477226
## [15]  5.000000  5.099020  4.795832  5.567764  5.099020  3.464102  4.582576
## [22]  4.472136  4.582576  4.000000  5.830952  4.582576  5.291503  4.690416
## [29]  4.242641  4.582576  4.690416  3.872983

Graficamente

hist(sqrt(banco$QUANTITYORDERED))

Transformación de variables

Se aplica cuando los datos tienen una distribución sesgada hacia la izquierda (asimetría negativa). La transformación exponencial puede ayudar a corregir la asimetría y hacer que los datos se aproximen más a una distribución simétrica.

en r para poder obtener esta transformación, se debe utilizar la función exp()

exp(banco$QUANTITYORDERED)
##  [1] 4.851652e+08 2.648912e+10 1.318816e+09 1.586013e+15 1.784823e+08
##  [6] 1.957296e+11 1.784823e+08 6.565997e+07 1.627548e+05          Inf
## [11] 2.038281e+34 9.744803e+09 1.446257e+12 1.068647e+13 7.200490e+10
## [16] 1.957296e+11 9.744803e+09 2.904885e+13 1.957296e+11 1.627548e+05
## [21] 1.318816e+09 4.851652e+08 1.318816e+09 8.886111e+06 5.834617e+14
## [26] 1.318816e+09 1.446257e+12 3.584913e+09 6.565997e+07 1.318816e+09
## [31] 3.584913e+09 3.269017e+06

para poder observarlo graficamente se tiene:

hist(exp(banco$QUANTITYORDERED))

Forma 2

QUANTITYORDERED_exp<- exp(banco$QUANTITYORDERED)
hist(QUANTITYORDERED_exp)

Transformación logarítmica:

Esta transformación se utiliza cuando los datos presentan una distribución sesgada hacia la derecha (asimetría positiva). La transformación logarítmica reduce la asimetría y puede facilitar la interpretación de los datos.

Para la transformación logaritmica, utilizar log (dentro de los argumentos se puede cambiar la base)

log(banco$QUANTITYORDERED)
##  [1] 2.995732 3.178054 3.044522 3.555348 2.944439 3.258097 2.944439 2.890372
##  [9] 2.484907 7.649693 4.369448 3.135494 3.332205 3.401197 3.218876 3.258097
## [17] 3.135494 3.433987 3.258097 2.484907 3.044522 2.995732 3.044522 2.772589
## [25] 3.526361 3.044522 3.332205 3.091042 2.890372 3.044522 3.091042 2.708050

graficamente

hist(log(banco$QUANTITYORDERED))

Cambiar la base 2

log(banco$QUANTITYORDERED, base=2)
##  [1]  4.321928  4.584963  4.392317  5.129283  4.247928  4.700440  4.247928
##  [8]  4.169925  3.584963 11.036174  6.303781  4.523562  4.807355  4.906891
## [15]  4.643856  4.700440  4.523562  4.954196  4.700440  3.584963  4.392317
## [22]  4.321928  4.392317  4.000000  5.087463  4.392317  4.807355  4.459432
## [29]  4.169925  4.392317  4.459432  3.906891

graficamente

hist(log(banco$QUANTITYORDERED, base=2))

Comparación de transformaciones

#Obtener solo tranaformaciones
QUANTITYORDERED_sqrt <- sqrt(banco$QUANTITYORDERED)
QUANTITYORDERED_exp <- exp(banco$QUANTITYORDERED)
QUANTITYORDERED_ln <- log(banco$QUANTITYORDERED)
QUANTITYORDERED_log2 <- log(banco$QUANTITYORDERED, base=2)
QUANTITYORDERED_log5 <- log(banco$QUANTITYORDERED, base=5)

Ver graficamente cada una:

par(mfrow=c(3,2))
hist(banco$QUANTITYORDERED)
hist(QUANTITYORDERED_sqrt)
hist(QUANTITYORDERED_exp)
hist(QUANTITYORDERED_ln)
hist(QUANTITYORDERED_log2)
hist(QUANTITYORDERED_log5)

par(mfrow=c(1,1))

Este tipo de transformaciones, busca que los datos sean simétricos (distribución forma de campana) o que se cumpla un supuesto estadístico La visualización de la distribución puede mejorarse con la gráfica de densidad

par(mfrow=c(3,2))
plot(density(banco$QUANTITYORDERED), main = "Distribución de cantidad de pedidos originales")
plot(density(QUANTITYORDERED_sqrt), main = "Distribución de cantidad de pedidos transformadas - sqrt")
plot(density(QUANTITYORDERED_exp), main = "Distribución de cantidad de pedidos transformadas - exp")
plot(density(QUANTITYORDERED_ln), main = "Distribución de cantidad de pedidos transformadas - ln")
plot(density(QUANTITYORDERED_log2), main = "Distribución de cantidad de pedidos transformadas - log2")
plot(density(QUANTITYORDERED_log5), main = "Distribución de cantidad de pedidos transformadas - log5")

par(mfrow=c(1,1))    

Se puede realizar un análisis general de las variables originales y verificar su comportmiento, a partir de allí se puede aplicar la transformación más adecuado según objetivo.

gráfica general

library(PerformanceAnalytics)
chart.Correlation(cor(banco[,8:10]), histogram = TRUE)

XII. Estandarización y normalización de variables

Estandarización de variables:

La estandarización de variables, también conocida como normalización, implica transformar los valores de una variable para que tengan una media de cero y una desviación estándar de uno. Esto se logra restando la media de la variable a cada valor y dividiendo por la desviación estándar.

La estandarización es útil cuando se desea comparar variables que están en diferentes escalas o unidades. Al estandarizar las variables, se eliminan las diferencias en las escalas y se asegura que todas las variables tengan la misma escala relativa.

Por ejemplo, si tienes un conjunto de variables con diferentes unidades de medida, como peso en kilogramos y altura en metros, puedes estandarizar ambas variables para que sean comparables y no se vean afectadas por las diferencias en las unidades.

Metodo 1: por partes

banco$SALES
##  [1]   2871  27659 388434  37467 520527 347976 249777 551232 216854 470844
## [11] 396566 233312 318864 367676 417735 409968 259739 439438 435804 439614
## [21] 773793   1451  73311 320712 243456 751608 540462 720911 732906  73741
## [31] 109935 486024
media_SALES<- mean(banco$SALES)
media_SALES                                         
## [1] 355020.8
desv_est <- sd(banco$SALES)
desv_est
## [1] 221108.3
SALES_estandar <- (banco$SALES-media_SALES) / desv_est
SALES_estandar
##  [1] -1.5926575 -1.4805496  0.1511167 -1.4361912  0.7485297 -0.0318615
##  [7] -0.4759832  0.8873983 -0.6248830  0.5238299  0.1878950 -0.5504489
## [13] -0.1635255  0.0572351  0.2836354  0.2485079 -0.4309283  0.3817909
## [19]  0.3653556  0.3825869  1.8939683 -1.5990797 -1.2740807 -0.1551676
## [25] -0.5045710  1.7936328  0.8386892  1.6548004  1.7090499 -1.2721359
## [31] -1.1084424  0.5924840

Metodo 2: Directo

media_SALES_estandar2 <- (banco$SALES-mean(banco$SALES))/sd(banco$SALES)
media_SALES_estandar2
##  [1] -1.5926575 -1.4805496  0.1511167 -1.4361912  0.7485297 -0.0318615
##  [7] -0.4759832  0.8873983 -0.6248830  0.5238299  0.1878950 -0.5504489
## [13] -0.1635255  0.0572351  0.2836354  0.2485079 -0.4309283  0.3817909
## [19]  0.3653556  0.3825869  1.8939683 -1.5990797 -1.2740807 -0.1551676
## [25] -0.5045710  1.7936328  0.8386892  1.6548004  1.7090499 -1.2721359
## [31] -1.1084424  0.5924840

Metodo 3: apoyarse en la funciones de R

R tiene multiple funciones para estandarizacion, la clasica es la funcion scale

SALES_estandar3 <- scale(banco$SALES)
SALES_estandar3
##             [,1]
##  [1,] -1.5926575
##  [2,] -1.4805496
##  [3,]  0.1511167
##  [4,] -1.4361912
##  [5,]  0.7485297
##  [6,] -0.0318615
##  [7,] -0.4759832
##  [8,]  0.8873983
##  [9,] -0.6248830
## [10,]  0.5238299
## [11,]  0.1878950
## [12,] -0.5504489
## [13,] -0.1635255
## [14,]  0.0572351
## [15,]  0.2836354
## [16,]  0.2485079
## [17,] -0.4309283
## [18,]  0.3817909
## [19,]  0.3653556
## [20,]  0.3825869
## [21,]  1.8939683
## [22,] -1.5990797
## [23,] -1.2740807
## [24,] -0.1551676
## [25,] -0.5045710
## [26,]  1.7936328
## [27,]  0.8386892
## [28,]  1.6548004
## [29,]  1.7090499
## [30,] -1.2721359
## [31,] -1.1084424
## [32,]  0.5924840
## attr(,"scaled:center")
## [1] 355020.8
## attr(,"scaled:scale")
## [1] 221108.3

La ventaja de la funcion de R, es que se puede enviar todo el caso

banco_cuanti_scale <- scale(banco[,8:10])
banco_cuanti_scale
##           QTR_ID    MONTH_ID    YEAR_ID
##  [1,] -1.4349031 -1.39227576 -0.9366141
##  [2,] -0.5845901 -0.54633606 -0.9366141
##  [3,]  0.2657228  0.01762374 -0.9366141
##  [4,]  0.2657228  0.29960364 -0.9366141
##  [5,]  1.1160357  0.86356345 -0.9366141
##  [6,]  1.1160357  0.86356345 -0.9366141
##  [7,]  1.1160357  1.14554335 -0.9366141
##  [8,]  1.1160357  1.14554335 -0.9366141
##  [9,]  1.1160357  1.42752325 -0.9366141
## [10,] -1.4349031 -1.67425566  0.4906074
## [11,] -1.4349031 -1.39227576  0.4906074
## [12,] -0.5845901 -0.82831596  0.4906074
## [13,] -0.5845901 -0.54633606  0.4906074
## [14,] -0.5845901 -0.26435616  0.4906074
## [15,]  0.2657228  0.01762374  0.4906074
## [16,]  0.2657228  0.29960364  0.4906074
## [17,]  0.2657228  0.58158354  0.4906074
## [18,]  1.1160357  0.86356345  0.4906074
## [19,]  1.1160357  1.14554335  0.4906074
## [20,]  1.1160357  1.14554335  0.4906074
## [21,]  1.1160357  1.14554335  0.4906074
## [22,]  1.1160357  1.42752325  0.4906074
## [23,] -1.4349031 -1.39227576  1.9178288
## [24,] -1.4349031 -1.11029586  1.9178288
## [25,] -0.5845901 -0.82831596  1.9178288
## [26,] -0.5845901 -0.54633606  1.9178288
## [27,] -1.4349031 -1.67425566 -0.9366141
## [28,] -1.4349031 -1.11029586 -0.9366141
## [29,] -0.5845901 -0.54633606 -0.9366141
## [30,]  0.2657228  0.01762374 -0.9366141
## [31,]  0.2657228  0.58158354 -0.9366141
## [32,]  1.1160357  0.86356345 -0.9366141
## attr(,"scaled:center")
##    QTR_ID  MONTH_ID   YEAR_ID 
##    2.6875    6.9375 2003.6562 
## attr(,"scaled:scale")
##    QTR_ID  MONTH_ID   YEAR_ID 
## 1.1760376 3.5463521 0.7006621
boxplot(banco_cuanti_scale)

\[ X_{norm}=\frac{\left(X_i-X_{\min }\right)}{X_{\max }-X_{\min }} \]

Metodo 1:

SALES_normal <- (banco$SALES-min(banco$SALES))/(max(banco$SALES)-min(banco$SALES))
SALES_normal
##  [1] 0.001838564 0.033933154 0.501051348 0.046632191 0.672080503 0.448667818
##  [7] 0.321523367 0.711836207 0.278895878 0.607752783 0.511580362 0.300205090
## [13] 0.410974672 0.474174653 0.538989204 0.528932778 0.334421798 0.567089450
## [19] 0.562384281 0.567317328 1.000000000 0.000000000 0.093041684 0.413367394
## [25] 0.313339168 0.971275678 0.697891608 0.931530332 0.947061017 0.093598432
## [31] 0.140461091 0.627407288

Metodo 2:

library(scales)
rescale(banco$SALES)
##  [1] 0.001838564 0.033933154 0.501051348 0.046632191 0.672080503 0.448667818
##  [7] 0.321523367 0.711836207 0.278895878 0.607752783 0.511580362 0.300205090
## [13] 0.410974672 0.474174653 0.538989204 0.528932778 0.334421798 0.567089450
## [19] 0.562384281 0.567317328 1.000000000 0.000000000 0.093041684 0.413367394
## [25] 0.313339168 0.971275678 0.697891608 0.931530332 0.947061017 0.093598432
## [31] 0.140461091 0.627407288

Aplicando a todo el caso (var cuantitativas) la funcion rescale solo se permite aplicarse a vectores, no es posible directamente apicar al data frame.

library(caret)
## Loading required package: lattice
pre_procesamiento <- preProcess(banco[,4:9]) # Asi por defecto muestra la estandarizacion z
predict(pre_procesamiento, banco[,4:9])
library(caret)
pre_procesamiento <- preProcess(banco[,4:9], method = "range") # Asi por defecto muestra la estandarizacion z
predict(pre_procesamiento, banco[,4:9])

XIII. Modelamiento predictivo

a. Regresión lineal simple

Que es regresión lineal simple?

La regresión lineal simple (RLS) es un modelo estadístico que se utiliza para predecir una variable dependiente continua (Y) a partir de una única variable independiente (X). La RLS busca establecer una relación lineal entre las dos variables.

Ingresamos los datos

datos <- read.csv("sales_data_sample.csv")

# Seleccionar las columnas
dataPredic <- datos[, c("QUANTITYORDERED", "ORDERLINENUMBER")]

# Ver el data frame
str(datos)
## 'data.frame':    32 obs. of  25 variables:
##  $ ORDERNUMBER     : int  10107 10121 10134 10145 10159 10168 10180 10188 10201 10211 ...
##  $ QUANTITYORDERED : int  20 24 21 35 19 26 19 18 12 2100 ...
##  $ PRICEEACH       : num  95.7 81.3 94.7 83.3 100 ...
##  $ ORDERLINENUMBER : int  3 5 2 6 10 7 9 1 2 14 ...
##  $ SALES           : int  2871 27659 388434 37467 520527 347976 249777 551232 216854 470844 ...
##  $ ORDERDATE       : chr  "2/24/2003 0:00" "5/7/2003 0:00" "7/1/2003 0:00" "8/25/2003 0:00" ...
##  $ STATUS          : chr  "Shipped" "Shipped" "Shipped" "Shipped" ...
##  $ QTR_ID          : int  1 2 3 3 4 4 4 4 4 1 ...
##  $ MONTH_ID        : int  2 5 7 8 10 10 11 11 12 1 ...
##  $ YEAR_ID         : int  2003 2003 2003 2003 2003 2003 2003 2003 2003 2004 ...
##  $ PRODUCTLINE     : chr  "Motorcycles" "Motorcycles" "Motorcycles" "Motorcycles" ...
##  $ MSRP            : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ PRODUCTCODE     : chr  "S10_1678" "S10_1678" "S10_1678" "S10_1678" ...
##  $ CUSTOMERNAME    : chr  "Land of Toys Inc." "Reims Collectables" "Lyon Souveniers" "Toys4GrownUps.com" ...
##  $ PHONE           : chr  "2125557818" "26.47.1555" "+33 1 46 62 7555" "6265557265" ...
##  $ ADDRESSLINE1    : chr  "897 Long Airport Avenue" "59 rue de l'Abbaye" "27 rue du Colonel Pierre Avia" "78934 Hillside Dr." ...
##  $ ADDRESSLINE2    : chr  "" "" "" "" ...
##  $ CITY            : chr  "NYC" "Reims" "Paris" "Pasadena" ...
##  $ STATE           : chr  "NY" "" "" "CA" ...
##  $ POSTALCODE      : chr  "10022" "51100" "75508" "90003" ...
##  $ COUNTRY         : chr  "USA" "France" "France" "USA" ...
##  $ TERRITORY       : chr  NA "EMEA" "EMEA" NA ...
##  $ CONTACTLASTNAME : chr  "Yu" "Henriot" "Da Cunha" "Young" ...
##  $ CONTACTFIRSTNAME: chr  "Kwai" "Paul" "Daniel" "Julie" ...
##  $ DEALSIZE        : chr  "Small" "Small" "Medium" "Medium" ...
head(datos)

Pasos para construir un modelo de regresión:

Paso 1: Determinar las variables X,Y

* Variable independiente (X): Inversión * Variable dependiente (y): ganancia

Paso 2: Evaluar la relación entre variables (Correlación) graficamente

Diagrama de dispersión o puntos

plot(x=dataPredic$QUANTITYORDERED,y=dataPredic$ORDERLINENUMBER)

pairs(dataPredic)

Coeficiente de correlación

# Mediante la función cor
cor(dataPredic) # Matriz de correlaciones
##                 QUANTITYORDERED ORDERLINENUMBER
## QUANTITYORDERED       1.0000000       0.3678606
## ORDERLINENUMBER       0.3678606       1.0000000

Coeficiente de correlación:

r = 0.3678606
Interpretación: Existe correlación positiva entre la inversión y la ganancia.

Como en este caso el coeficiente de correlación es superior a 0.35, es viable la regresión.

Paso 3: Regresión

Regresión lineal simple

Para obtener el modelo, se va a utilizar una función de R > lm

# lm, notación: Y ~ X, data=
modelo1 <- lm(QUANTITYORDERED  ~ ORDERLINENUMBER, data=dataPredic)

# Resumen de resultados
summary(modelo1)
## 
## Call:
## lm(formula = QUANTITYORDERED ~ ORDERLINENUMBER, data = dataPredic)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -302.27 -152.86  -33.37   45.18 1740.82 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)  
## (Intercept)      -157.61     129.39  -1.218   0.2327  
## ORDERLINENUMBER    36.91      17.04   2.167   0.0383 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 347 on 30 degrees of freedom
## Multiple R-squared:  0.1353, Adjusted R-squared:  0.1065 
## F-statistic: 4.695 on 1 and 30 DF,  p-value: 0.03832

Modelo final con los resultados:

Modelo general

$ = -157.61 +36.91 X $

Modelo para el caso:

\(\hat{ganancia} = -157.61 + 36.91 Inversión\)

b. Regresión lineal múltiple

Que es regresión lineal múltiple?

La regresión lineal múltiple (RLM) es una técnica estadística que se utiliza para predecir una variable dependiente continua a partir de dos o más variables independientes. Es una extensión de la regresión lineal simple, la cual solo considera una variable independiente.

modeloMulti <- lm(banco$QUANTITYORDERED ~ banco$ORDERLINENUMBER + banco$SALES)

summary(modeloMulti)
## 
## Call:
## lm(formula = banco$QUANTITYORDERED ~ banco$ORDERLINENUMBER + 
##     banco$SALES)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -295.30 -148.89  -47.50   58.48 1719.69 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)  
## (Intercept)           -2.191e+02  1.668e+02  -1.313   0.1994  
## banco$ORDERLINENUMBER  3.712e+01  1.723e+01   2.155   0.0396 *
## banco$SALES            1.693e-04  2.850e-04   0.594   0.5572  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 350.8 on 29 degrees of freedom
## Multiple R-squared:  0.1457, Adjusted R-squared:  0.0868 
## F-statistic: 2.473 on 2 and 29 DF,  p-value: 0.1019

c. Regresión lineal logistica

Que es regresión lineal logistica?

La regresión lineal logística (RLL) es un modelo estadístico que se utiliza para predecir la probabilidad de que ocurra un evento a partir de una o más variables independientes. A diferencia de la regresión lineal simple o múltiple, que se utiliza para predecir valores continuos, la RLL se utiliza para predecir variables categóricas binarias (por ejemplo, sí/no, éxito/fracaso, presente/ausente).

# lm, notación: Y ~ X, data=
# modeloLog <- glm(banco$quantity ~ banco$item_price + banco$transaction_amount, data = banco, family = binomial())

# Resumen de resultados
# summary(modelo1)