Informe de ventas del restaurante

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

El conjunto de datos captura transacciones de ventas de un restaurante local.

I. Aspectos generales

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

Caso 1 Balaji Fast Food

Caso 2 Infotec S.A.C.

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

Caso 1 Este conjunto de datos captura transacciones de ventas de un restaurante local cerca de mi casa. Incluye detalles como el ID del pedido, la fecha de la transacción, los nombres de los artículos (que representan varios alimentos y bebidas), los tipos de artículos (categorizados como comida rápida o bebidas), los precios de los artículos, las cantidades pedidas, los montos de las transacciones, los tipos de transacciones (efectivo , online u otros), el sexo del miembro del personal que recibió el pedido y la hora de la venta (Mañana, Tarde, Tarde, Noche, Medianoche). El conjunto de datos ofrece una valiosa instantánea de las operaciones diarias del restaurante y del comportamiento de los clientes.

Caso 2(Missing) El gerente de la empresa Infotec S.A.C, con la finalidad de investigar que existe relación lineal entre las ganancias anuales y la inversión en desarrollo en miles de soles, ha recopilado la siguiente información mensual de la empresa, Se desea realizar un modelo de regresión, de tal manera que permita predecir eventos futuros

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio

El objetivo del estudio es realizar un análisis de las ventas del restaurante para comprender su comportamiento y tendencias, así como para identificar oportunidades de mejora. El estudio se centrará en los siguientes aspectos: Análisis descriptivo de las ventas Caracterizar las ventas en términos de su magnitud, distribución y tendencias. Identificar las categorías de productos y servicios más vendidos. Analizar las ventas en función de factores como el día de la semana, la hora del día, el tipo de transacción y el sexo del personal. Análisis inferencial de las ventas Identificar las relaciones entre las ventas y otros factores. Realizar predicciones sobre las ventas.

2.2 Población de estudio

La población de estudio son todas las transacciones de ventas realizadas por el restaurante durante un período de tiempo determinado.

2.3 Muestra

La muestra es un subconjunto de la población de estudio que se utiliza para representar a la población. La muestra debe ser representativa de la población para que los resultados del estudio sean válidos.

2.4 Unidad de análisis

La unidad de análisis es la unidad sobre la que se recopilan los datos. En este caso, la unidad de análisis es cada transacción de venta realizada por el restaurante.

III. Variables y tipo de variables

  • order_id : un identificador único para cada pedido.
  • date: fecha de la transacción.
  • item_name : nombre de la comida.
  • item_type : categoría del artículo (comida rápida o bebidas).
  • item_price : precio del artículo por 1 cantidad.
  • Quantity: cantidad que pide el cliente.
  • transaction_amount: el importe total pagado por los clientes.
  • transaction_type: método de pago (efectivo, online, otros).
  • received_by: género de la persona que maneja la transacción.
  • time_of_sale: diferentes momentos del día (Mañana, Tarde, Tarde, Noche, Medianoche).

IV. Manejo de base de datos

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

V. Tablas de frecuencia (Para cada variable)

# Tabla de frecuencia order_id
library(agricolae)
tabla_frecuencia_id <- table.freq(hist(banco$order_id, breaks = "sturges", plot = FALSE))
tabla_frecuencia_id
# Tabla de frecuencia date
#library(ggplot2)
#ggplot(data=banco, aes(x=date))+
# geom_bar()
# Graficos estadisticos item_name
library(ggplot2)
ggplot(data=banco, aes(y=item_name))+
  geom_bar()+
  theme_classic()

# Graficos estadisticos item_type
library(ggplot2)
ggplot(data=banco, aes(y=item_type))+
  geom_bar()+
  theme_classic()

# Tabla de frecuencia item_price
library(agricolae) 
tabla_frecuencia_item_price <- table.freq(hist(banco$item_price, breaks = "sturges", plot = FALSE))
tabla_frecuencia_item_price
# Tabla de frecuencia quantity
library(agricolae) 
tabla_frecuencia_quantity <- table.freq(hist(banco$quantity, breaks = "sturges", plot = FALSE))
tabla_frecuencia_quantity
# Tabla de frecuencia transaction_amount
library(agricolae) 
tabla_frecuencia_transaction_amount <- table.freq(hist(banco$transaction_amount, breaks = "sturges", plot = FALSE))
tabla_frecuencia_transaction_amount
# Graficos estadisticos transaction_type
library(ggplot2)
ggplot(data=banco, aes(y=transaction_type))+
  geom_bar()+
  theme_classic()

# Graficos estadisticos received_by
library(ggplot2)
ggplot(data=banco, aes(y=received_by))+
  geom_bar()+
  theme_classic()

# Graficos estadisticos time_of_sale
library(ggplot2)
ggplot(data=banco, aes(y=time_of_sale))+
  geom_bar()+
  theme_classic()

names(banco)
##  [1] "order_id"           "date"               "item_name"         
##  [4] "item_type"          "item_price"         "quantity"          
##  [7] "transaction_amount" "transaction_type"   "received_by"       
## [10] "time_of_sale"

VI. Representación gráfica de datos.

# order_id
# library(ggplot2)
# ggplot(data=banco, aes(x=order_id))+
#   geom_bar()
# item_name
library(ggplot2)
ggplot(data=banco, aes(x=item_name))+
  geom_bar()

# item_type
plot(banco$item_type, main="Pedidos realizados", xlab="Tipo de comidas", ylab="Cantidad de pedidos",col=c(2,"pink"))

library(ggplot2)
# item_price
ggplot(data = banco, aes(x = item_name, y = item_price)) +
  geom_point() +
  labs(x = "Nombre del producto", y = "Precio del producto")

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

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

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

# Dreceived_by
plot(banco$received_by, main="Pedidos realizados", xlab="Señor y Señora", ylab="Cantidad de pedidos",col=c(2,"pink"))

# time_of_sale
plot(banco$time_of_sale, main="Pedidos realizados", xlab="Tiempo de ventas", ylab="Cantidad de pedidos",col=c(2,"green"))

VII. Medidas estadísticas de tendencia

#item_price

Media

item_price <- banco$item_price
promedio = sum(item_price)/length(item_price)
promedio
## [1] 34.85714

Mediana

median(item_price)
## [1] 35

Moda

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

#quantity

Media

quantity <- banco$quantity
promedio = sum(quantity)/length(quantity)
promedio
## [1] 7.77551

Mediana

median(quantity)
## [1] 8

Moda

library(modeest)
mfv(quantity)
## [1]  4  8 10

#transaction_amount

Media

transaction_amount <- banco$transaction_amount
promedio = sum(transaction_amount)/length(transaction_amount)
promedio
## [1] 266.5306

Mediana

median(transaction_amount)
## [1] 220

Moda

library(modeest)
mfv(transaction_amount)
## [1] 200

VIII. Medidas estadísticas de posición

(cuartiles)

quantile(banco$transaction_amount)
##   0%  25%  50%  75% 100% 
##   20  150  220  400  840

Segun los resultados: El valor minimo del monto de transaccion es 20

### Cuartil 1 \((Q_1)\) interpretación: es $ 120; El 25% de los clientes que accedieron al website, su monto máximo de transaccion es $ 120

### Cuartil 2 \((Q_2)\) interpretación: es $ 240; El 50% de los clientes que accedieron al website, su monto máximo de transaccion es $ 240

### Cuartil 3 \((Q_3)\) interpretación: es $ 360; El 75% de los clientes que accedieron al website, su monto máximo de transaccion es $ 360

Dividir en 10 grupo (deciles)

quantile(banco$transaction_amount, probs = seq(0, 1, 0.1))
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##   20   60  124  160  200  220  258  300  408  504  840

Dividir en 100 grupo (percentiles)

quantile(banco$transaction_amount, probs = seq(0, 1, 0.01))
##    0%    1%    2%    3%    4%    5%    6%    7%    8%    9%   10%   11%   12% 
##  20.0  20.0  20.0  20.0  20.0  28.0  37.6  47.2  56.8  60.0  60.0  65.6  75.2 
##   13%   14%   15%   16%   17%   18%   19%   20%   21%   22%   23%   24%   25% 
##  84.8  94.4 100.0 100.0 100.0 100.0 104.8 124.0 140.8 145.6 150.0 150.0 150.0 
##   26%   27%   28%   29%   30%   31%   32%   33%   34%   35%   36%   37%   38% 
## 154.8 159.6 160.0 160.0 160.0 160.0 167.2 176.8 180.0 180.0 185.6 195.2 200.0 
##   39%   40%   41%   42%   43%   44%   45%   46%   47%   48%   49%   50%   51% 
## 200.0 200.0 200.0 200.0 200.0 200.0 200.0 201.6 211.2 220.0 220.0 220.0 222.4 
##   52%   53%   54%   55%   56%   57%   58%   59%   60%   61%   62%   63%   64% 
## 224.8 225.0 225.0 231.0 238.2 243.6 248.4 253.2 258.0 260.0 260.0 264.8 274.4 
##   65%   66%   67%   68%   69%   70%   71%   72%   73%   74%   75%   76%   77% 
## 284.0 293.6 300.0 300.0 300.0 300.0 308.0 356.0 400.0 400.0 400.0 400.0 400.0 
##   78%   79%   80%   81%   82%   83%   84%   85%   86%   87%   88%   89%   90% 
## 400.0 400.0 408.0 417.6 427.2 436.8 440.0 440.0 451.2 470.4 484.8 494.4 504.0 
##   91%   92%   93%   94%   95%   96%   97%   98%   99%  100% 
## 513.6 532.8 571.2 600.0 600.0 604.8 633.6 667.2 753.6 840.0

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$transaction_amount)
## [1] 0.947314
## attr(,"method")
## [1] "moment"

Resultado: [1] 1.049487

hist(banco$transaction_amount)

Curtosis

kurtosis(banco$transaction_amount)
## [1] 0.5711093
## attr(,"method")
## [1] "excess"

IX. Manejo de datos Missing

# Cargar conjunto de datos
bancoTwo<-read.csv("datarent.csv", 
                    sep = ";" , stringsAsFactors = TRUE)
# Mostrar
head(bancoTwo)
str(bancoTwo)
## 'data.frame':    85 obs. of  9 variables:
##  $ sex        : Factor w/ 4 levels "","Female","Feminine",..: 3 3 4 4 4 3 3 4 4 4 ...
##  $ phone      : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 2 2 1 2 1 ...
##  $ age        : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ children   : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ guarantor  : Factor w/ 5 levels " No"," Yes","No",..: 4 4 3 4 3 3 4 3 3 4 ...
##  $ guarantor.1: Factor w/ 5 levels ""," Yes","No",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ months     : num  54 62 59 58 56 54 53 53 53 53 ...
##  $ income     : Factor w/ 5 levels ""," Fixed","Fixed",..: 3 3 3 3 4 3 3 2 3 3 ...
##  $ delinquency: Factor w/ 4 levels " Yes ","No ",..: 4 1 4 4 2 2 4 2 2 4 ...

Verificación de valores perdidos

# Verificar columnas con missing
which(colSums(is.na(bancoTwo))!= 0)
##      age children   months 
##        3        4        7

Realizar el análisis utilizando librerias

library(VIM)
library(mice)

resumen_missing <- aggr(bancoTwo, numbers=T)

summary(resumen_missing)
## 
##  Missings per variable: 
##     Variable Count
##          sex     0
##        phone     0
##          age     4
##     children     2
##    guarantor     0
##  guarantor.1     0
##       months     2
##       income     0
##  delinquency     0
## 
##  Missings in combinations of variables: 
##       Combinations Count   Percent
##  0:0:0:0:0:0:0:0:0    77 90.588235
##  0:0:0:0:0:0:1:0:0     2  2.352941
##  0:0:0:1:0:0:0:0:0     2  2.352941
##  0:0:1:0:0:0:0:0:0     4  4.705882

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)

##    sex phone guarantor guarantor.1 income delinquency children months age  
## 77   1     1         1           1      1           1        1      1   1 0
## 4    1     1         1           1      1           1        1      1   0 1
## 2    1     1         1           1      1           1        1      0   1 1
## 2    1     1         1           1      1           1        0      1   1 1
##      0     0         0           0      0           0        2      2   4 8

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':    77 obs. of  9 variables:
##  $ sex        : Factor w/ 4 levels "","Female","Feminine",..: 3 3 4 4 4 3 3 4 4 4 ...
##  $ phone      : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 2 2 1 2 1 ...
##  $ age        : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ children   : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ guarantor  : Factor w/ 5 levels " No"," Yes","No",..: 4 4 3 4 3 3 4 3 3 4 ...
##  $ guarantor.1: Factor w/ 5 levels ""," Yes","No",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ months     : num  54 62 59 58 56 54 53 53 53 53 ...
##  $ income     : Factor w/ 5 levels ""," Fixed","Fixed",..: 3 3 3 3 4 3 3 2 3 3 ...
##  $ delinquency: Factor w/ 4 levels " Yes ","No ",..: 4 1 4 4 2 2 4 2 2 4 ...
##  - attr(*, "na.action")= 'omit' Named int [1:8] 24 29 30 45 49 71 74 84
##   ..- attr(*, "names")= chr [1:8] "24" "29" "30" "45" ...
# 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':    85 obs. of  9 variables:
##  $ sex        : Factor w/ 4 levels "","Female","Feminine",..: 3 3 4 4 4 3 3 4 4 4 ...
##  $ phone      : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 2 2 1 2 1 ...
##  $ age        : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ children   : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ guarantor  : Factor w/ 5 levels " No"," Yes","No",..: 4 4 3 4 3 3 4 3 3 4 ...
##  $ guarantor.1: Factor w/ 5 levels ""," Yes","No",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ months     : num  54 62 59 58 56 54 53 53 53 53 ...
##  $ income     : Factor w/ 5 levels ""," Fixed","Fixed",..: 3 3 3 3 4 3 3 2 3 3 ...
##  $ delinquency: Factor w/ 4 levels " Yes ","No ",..: 4 1 4 4 2 2 4 2 2 4 ...
# 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':    85 obs. of  9 variables:
##  $ sex        : Factor w/ 4 levels "","Female","Feminine",..: 3 3 4 4 4 3 3 4 4 4 ...
##  $ phone      : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 2 2 1 2 1 ...
##  $ age        : int  44 77 59 35 65 66 73 73 74 75 ...
##  $ children   : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ guarantor  : Factor w/ 5 levels " No"," Yes","No",..: 4 4 3 4 3 3 4 3 3 4 ...
##  $ guarantor.1: Factor w/ 5 levels ""," Yes","No",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ months     : num  54 62 59 58 56 54 53 53 53 53 ...
##  $ income     : Factor w/ 5 levels ""," Fixed","Fixed",..: 3 3 3 3 4 3 3 2 3 3 ...
##  $ delinquency: Factor w/ 4 levels " Yes ","No ",..: 4 1 4 4 2 2 4 2 2 4 ...
# 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':    85 obs. of  9 variables:
##  $ sex        : Factor w/ 4 levels "","Female","Feminine",..: 3 3 4 4 4 3 3 4 4 4 ...
##  $ phone      : Factor w/ 2 levels "No","Yes": 2 2 1 1 2 2 2 1 2 1 ...
##  $ age        : num  44 77 59 35 65 66 73 73 74 75 ...
##  $ children   : num  3 4 5 5 0 1 5 0 0 1 ...
##  $ guarantor  : Factor w/ 5 levels " No"," Yes","No",..: 4 4 3 4 3 3 4 3 3 4 ...
##  $ guarantor.1: Factor w/ 5 levels ""," Yes","No",..: 4 3 4 4 4 3 4 3 4 4 ...
##  $ months     : num  54 62 59 58 56 54 53 53 53 53 ...
##  $ income     : Factor w/ 5 levels ""," Fixed","Fixed",..: 3 3 3 3 4 3 3 2 3 3 ...
##  $ delinquency: Factor w/ 4 levels " Yes ","No ",..: 4 1 4 4 2 2 4 2 2 4 ...
# Verificar columnas con missing
which(colSums(is.na(banco_corregido4))!= 0)
## named integer(0)

X. Manejo de valores outliers

banco <- read.csv("balaji.csv", 
                    sep = ",", stringsAsFactors = TRUE)
# Mostrar datos
head(banco)
# Resumen
summary(banco)
##     order_id          date              item_name     item_type 
##  Min.   : 1   02-03-2023: 2   Aalopuri       :5   Beverages:16  
##  1st Qu.:13   02-05-2023: 2   Cold coffee    :8   Fastfood :33  
##  Median :25   12/22/2022: 2   Frankie        :6                 
##  Mean   :25   5/26/2022 : 2   Panipuri       :8                 
##  3rd Qu.:37   01-05-2023: 1   Sandwich       :6                 
##  Max.   :49   01-06-2023: 1   Sugarcane juice:8                 
##               (Other)   :39   Vadapav        :8                 
##    item_price       quantity      transaction_amount transaction_type
##  Min.   :18.00   Min.   : 1.000   Min.   : 20.0            : 5       
##  1st Qu.:20.00   1st Qu.: 5.000   1st Qu.:150.0      Cash  :18       
##  Median :35.00   Median : 8.000   Median :220.0      Online:26       
##  Mean   :34.86   Mean   : 7.776   Mean   :266.5                      
##  3rd Qu.:50.00   3rd Qu.:10.000   3rd Qu.:400.0                      
##  Max.   :60.00   Max.   :15.000   Max.   :840.0                      
##                                                                      
##  received_by    time_of_sale
##  Mr. :29     Afternoon:14   
##  Mrs.:20     Evening  :12   
##              Midnight : 2   
##              Morning  : 7   
##              Night    :14   
##                             
## 

Para todas las columnas

boxplot(banco)

Para item_price

boxplot(banco$item_price)

Para quantity

boxplot(banco$quantity)

Para transaction_amount

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

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$transaction_amount, 0.25)
q3 <- quantile(banco$transaction_amount, 0.75)
RIC <- q3-q1
RIC
## 75% 
## 250
# Limites o bigotes (Superior e inferior)
bigote_inferior <- q1-1.5*RIC
bigote_inferior
##  25% 
## -225
bigote_superior <- q3+1.5*RIC
bigote_superior
## 75% 
## 775
# Identificar lo valores atípicos
outliers_det <- banco$transaction_amount[banco$transaction_amount < bigote_inferior | banco$transaction_amount > bigote_superior]
outliers_det
## [1] 840

Correción

Eliminar los atípicos

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

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

boxplot(telco_sin_atipicos$transaction_amount)

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("balaji.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$transaction_amount, 12)

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

sqrt(banco$transaction_amount)
##  [1] 16.124515 17.320508  4.472136 12.247449 14.142136 14.142136 15.000000
##  [8] 16.733201  4.472136 10.000000 20.000000 12.649111 13.416408 14.142136
## [15]  7.745967 25.690465 14.832397 14.142136 14.832397 20.000000 24.494897
## [22] 17.320508 13.416408 15.811388  7.745967 10.000000 20.976177 20.000000
## [29] 15.000000 10.000000 22.803509  8.944272 16.124515 24.494897 12.649111
## [36] 20.000000 22.360680 15.491933  6.324555 17.320508 20.976177 12.649111
## [43]  4.472136 21.908902 12.247449 11.832160 20.493902 28.982753 14.142136

Graficamente

hist(sqrt(banco$transaction_amount))

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$transaction_amount)
##  [1] 8.252115e+112 1.942426e+130  4.851652e+08  1.393710e+65  7.225974e+86
##  [6]  7.225974e+86  5.203055e+97 4.003639e+121  4.851652e+08  2.688117e+43
## [11] 5.221470e+173  3.069850e+69  1.489384e+78  7.225974e+86  1.142007e+26
## [16] 4.308817e+286  3.505791e+95  7.225974e+86  3.505791e+95 5.221470e+173
## [21] 3.773020e+260 1.942426e+130  1.489384e+78 3.746455e+108  1.142007e+26
## [26]  2.688117e+43 1.229057e+191 5.221470e+173  5.203055e+97  2.688117e+43
## [31] 6.809741e+225  5.540622e+34 8.252115e+112 3.773020e+260  3.069850e+69
## [36] 5.221470e+173 1.403592e+217 1.700888e+104  2.353853e+17 1.942426e+130
## [41] 1.229057e+191  3.069850e+69  4.851652e+08 2.893019e+208  1.393710e+65
## [46]  6.327432e+60 2.533275e+182           Inf  7.225974e+86

para poder observarlo graficamente se tiene:

hist(exp(banco$transaction_amount))

Forma 2

transaction_amount_exp<- exp(banco$transaction_amount)
hist(transaction_amount_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$transaction_amount)
##  [1] 5.560682 5.703782 2.995732 5.010635 5.298317 5.298317 5.416100 5.634790
##  [9] 2.995732 4.605170 5.991465 5.075174 5.192957 5.298317 4.094345 6.492240
## [17] 5.393628 5.298317 5.393628 5.991465 6.396930 5.703782 5.192957 5.521461
## [25] 4.094345 4.605170 6.086775 5.991465 5.416100 4.605170 6.253829 4.382027
## [33] 5.560682 6.396930 5.075174 5.991465 6.214608 5.480639 3.688879 5.703782
## [41] 6.086775 5.075174 2.995732 6.173786 5.010635 4.941642 6.040255 6.733402
## [49] 5.298317

graficamente

hist(log(banco$transaction_amount))

Cambiar la base 2

log(banco$transaction_amount, base=2)
##  [1] 8.022368 8.228819 4.321928 7.228819 7.643856 7.643856 7.813781 8.129283
##  [9] 4.321928 6.643856 8.643856 7.321928 7.491853 7.643856 5.906891 9.366322
## [17] 7.781360 7.643856 7.781360 8.643856 9.228819 8.228819 7.491853 7.965784
## [25] 5.906891 6.643856 8.781360 8.643856 7.813781 6.643856 9.022368 6.321928
## [33] 8.022368 9.228819 7.321928 8.643856 8.965784 7.906891 5.321928 8.228819
## [41] 8.781360 7.321928 4.321928 8.906891 7.228819 7.129283 8.714246 9.714246
## [49] 7.643856

graficamente

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

Comparación de transformaciones

#Obtener solo tranaformaciones
transaction_amount_sqrt <- sqrt(banco$transaction_amount)
transaction_amount_exp <- exp(banco$transaction_amount)
transaction_amount_ln <- log(banco$transaction_amount)
transaction_amount_log2 <- log(banco$transaction_amount, base=2)
transaction_amount_log5 <- log(banco$transaction_amount, base=5)

Ver graficamente cada una:

par(mfrow=c(3,2))
hist(banco$transaction_amount)
hist(transaction_amount_sqrt)
hist(transaction_amount_exp)
hist(transaction_amount_ln)
hist(transaction_amount_log2)
hist(transaction_amount_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$transaction_amount), main = "Distribución de montos de transacciones originales")
plot(density(transaction_amount_sqrt), main = "Distribución de montos de transacciones transformadas - sqrt")
plot(density(transaction_amount_exp), main = "Distribución de montos de transacciones transformadas - exp")
plot(density(transaction_amount_ln), main = "Distribución de montos de transacciones transformadas - ln")
plot(density(transaction_amount_log2), main = "Distribución de montos de transacciones transformadas - log2")
plot(density(transaction_amount_log5), main = "Distribución de montos de transacciones 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[,5:7]), 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$transaction_amount
##  [1] 260 300  20 150 200 200 225 280  20 100 400 160 180 200  60 660 220 200 220
## [20] 400 600 300 180 250  60 100 440 400 225 100 520  80 260 600 160 400 500 240
## [39]  40 300 440 160  20 480 150 140 420 840 200
media_transaction_amount <- mean(banco$transaction_amount)
media_transaction_amount                                         
## [1] 266.5306
desv_est <- sd(banco$transaction_amount)
desv_est
## [1] 181.949
transaction_amount_estandar <- (banco$transaction_amount-media_transaction_amount) / desv_est
transaction_amount_estandar
##  [1] -0.03589255  0.18394933 -1.35494385 -0.64045773 -0.36565538 -0.36565538
##  [7] -0.22825420  0.07402839 -1.35494385 -0.91526008  0.73355404 -0.58549726
## [13] -0.47557632 -0.36565538 -1.13510196  2.16252627 -0.25573443 -0.36565538
## [19] -0.25573443  0.73355404  1.83276345  0.18394933 -0.47557632 -0.09085302
## [25] -1.13510196 -0.91526008  0.95339592  0.73355404 -0.22825420 -0.91526008
## [31]  1.39307968 -1.02518102 -0.03589255  1.83276345 -0.58549726  0.73355404
## [37]  1.28315874 -0.14581349 -1.24502291  0.18394933  0.95339592 -0.58549726
## [43] -1.35494385  1.17323780 -0.64045773 -0.69541820  0.84347498  3.15181474
## [49] -0.36565538

Metodo 2: Directo

transaction_amount_estandar2 <- (banco$transaction_amount-mean(banco$transaction_amount))/sd(banco$transaction_amount)
transaction_amount_estandar2
##  [1] -0.03589255  0.18394933 -1.35494385 -0.64045773 -0.36565538 -0.36565538
##  [7] -0.22825420  0.07402839 -1.35494385 -0.91526008  0.73355404 -0.58549726
## [13] -0.47557632 -0.36565538 -1.13510196  2.16252627 -0.25573443 -0.36565538
## [19] -0.25573443  0.73355404  1.83276345  0.18394933 -0.47557632 -0.09085302
## [25] -1.13510196 -0.91526008  0.95339592  0.73355404 -0.22825420 -0.91526008
## [31]  1.39307968 -1.02518102 -0.03589255  1.83276345 -0.58549726  0.73355404
## [37]  1.28315874 -0.14581349 -1.24502291  0.18394933  0.95339592 -0.58549726
## [43] -1.35494385  1.17323780 -0.64045773 -0.69541820  0.84347498  3.15181474
## [49] -0.36565538

Metodo 3: apoyarse en la funciones de R

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

transaction_amount_estandar3 <- scale(banco$transaction_amount)
transaction_amount_estandar3
##              [,1]
##  [1,] -0.03589255
##  [2,]  0.18394933
##  [3,] -1.35494385
##  [4,] -0.64045773
##  [5,] -0.36565538
##  [6,] -0.36565538
##  [7,] -0.22825420
##  [8,]  0.07402839
##  [9,] -1.35494385
## [10,] -0.91526008
## [11,]  0.73355404
## [12,] -0.58549726
## [13,] -0.47557632
## [14,] -0.36565538
## [15,] -1.13510196
## [16,]  2.16252627
## [17,] -0.25573443
## [18,] -0.36565538
## [19,] -0.25573443
## [20,]  0.73355404
## [21,]  1.83276345
## [22,]  0.18394933
## [23,] -0.47557632
## [24,] -0.09085302
## [25,] -1.13510196
## [26,] -0.91526008
## [27,]  0.95339592
## [28,]  0.73355404
## [29,] -0.22825420
## [30,] -0.91526008
## [31,]  1.39307968
## [32,] -1.02518102
## [33,] -0.03589255
## [34,]  1.83276345
## [35,] -0.58549726
## [36,]  0.73355404
## [37,]  1.28315874
## [38,] -0.14581349
## [39,] -1.24502291
## [40,]  0.18394933
## [41,]  0.95339592
## [42,] -0.58549726
## [43,] -1.35494385
## [44,]  1.17323780
## [45,] -0.64045773
## [46,] -0.69541820
## [47,]  0.84347498
## [48,]  3.15181474
## [49,] -0.36565538
## attr(,"scaled:center")
## [1] 266.5306
## attr(,"scaled:scale")
## [1] 181.949

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

banco_cuanti_scale <- scale(banco[,5:7])
banco_cuanti_scale
##         item_price    quantity transaction_amount
##  [1,] -0.333393423  0.06154976        -0.03589255
##  [2,]  0.353004800  0.60990217         0.18394933
##  [3,]  1.039403023 -1.03515505        -1.35494385
##  [4,]  0.009805689 -0.48680265        -0.64045773
##  [5,]  0.696203912  0.06154976        -0.36565538
##  [6,] -1.019791646 -0.48680265        -0.36565538
##  [7,] -0.676592534  0.33572596        -0.22825420
##  [8,] -1.157071290  1.70660698         0.07402839
##  [9,] -1.019791646 -0.21262644        -1.35494385
## [10,] -1.019791646 -0.76097885        -0.91526008
## [11,]  1.039403023  0.06154976         0.73355404
## [12,] -1.019791646  0.06154976        -0.58549726
## [13,] -1.019791646  0.33572596        -0.47557632
## [14,]  1.039403023 -1.03515505        -0.36565538
## [15,] -1.019791646 -1.30933125        -1.13510196
## [16,]  1.725801247  0.88407837         2.16252627
## [17,]  0.353004800  0.88407837        -0.25573443
## [18,] -1.019791646 -1.03515505        -0.36565538
## [19,] -1.019791646 -0.76097885        -0.25573443
## [20,]  0.353004800  0.60990217         0.73355404
## [21,]  0.353004800  1.98078318         1.83276345
## [22,] -0.676592534 -0.21262644         0.18394933
## [23,]  1.725801247 -1.30933125        -0.47557632
## [24,] -0.676592534  0.60990217        -0.09085302
## [25,]  1.725801247 -1.85768366        -1.13510196
## [26,] -0.676592534 -1.03515505        -0.91526008
## [27,]  0.353004800  0.88407837         0.95339592
## [28,]  0.353004800  0.60990217         0.73355404
## [29,] -0.676592534  0.33572596        -0.22825420
## [30,]  1.039403023 -1.58350746        -0.91526008
## [31,]  0.353004800  1.43243077         1.39307968
## [32,] -1.019791646 -1.03515505        -1.02518102
## [33,] -1.019791646  1.43243077        -0.03589255
## [34,]  1.039403023  1.15825457         1.83276345
## [35,] -1.019791646  0.06154976        -0.58549726
## [36,]  0.353004800  0.60990217         0.73355404
## [37,]  1.039403023  0.60990217         1.28315874
## [38,] -1.019791646  1.15825457        -0.14581349
## [39,] -1.019791646 -1.58350746        -1.24502291
## [40,]  1.725801247 -0.76097885         0.18394933
## [41,]  0.353004800  0.88407837         0.95339592
## [42,] -1.019791646  0.06154976        -0.58549726
## [43,] -1.019791646 -1.85768366        -1.35494385
## [44,]  0.353004800  1.15825457         1.17323780
## [45,] -0.676592534 -0.48680265        -0.64045773
## [46,] -1.019791646 -0.21262644        -0.69541820
## [47,]  1.725801247 -0.21262644         0.84347498
## [48,]  1.725801247  1.70660698         3.15181474
## [49,]  1.039403023 -1.03515505        -0.36565538
## attr(,"scaled:center")
##         item_price           quantity transaction_amount 
##           34.85714            7.77551          266.53061 
## attr(,"scaled:scale")
##         item_price           quantity transaction_amount 
##           14.56880            3.64729          181.94895
boxplot(banco_cuanti_scale)

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

transaction_amount_normal <- (banco$transaction_amount-min(banco$transaction_amount))/(max(banco$transaction_amount)-min(banco$transaction_amount))
transaction_amount_normal
##  [1] 0.29268293 0.34146341 0.00000000 0.15853659 0.21951220 0.21951220
##  [7] 0.25000000 0.31707317 0.00000000 0.09756098 0.46341463 0.17073171
## [13] 0.19512195 0.21951220 0.04878049 0.78048780 0.24390244 0.21951220
## [19] 0.24390244 0.46341463 0.70731707 0.34146341 0.19512195 0.28048780
## [25] 0.04878049 0.09756098 0.51219512 0.46341463 0.25000000 0.09756098
## [31] 0.60975610 0.07317073 0.29268293 0.70731707 0.17073171 0.46341463
## [37] 0.58536585 0.26829268 0.02439024 0.34146341 0.51219512 0.17073171
## [43] 0.00000000 0.56097561 0.15853659 0.14634146 0.48780488 1.00000000
## [49] 0.21951220

Metodo 2:

library(scales)
rescale(banco$transaction_amount)
##  [1] 0.29268293 0.34146341 0.00000000 0.15853659 0.21951220 0.21951220
##  [7] 0.25000000 0.31707317 0.00000000 0.09756098 0.46341463 0.17073171
## [13] 0.19512195 0.21951220 0.04878049 0.78048780 0.24390244 0.21951220
## [19] 0.24390244 0.46341463 0.70731707 0.34146341 0.19512195 0.28048780
## [25] 0.04878049 0.09756098 0.51219512 0.46341463 0.25000000 0.09756098
## [31] 0.60975610 0.07317073 0.29268293 0.70731707 0.17073171 0.46341463
## [37] 0.58536585 0.26829268 0.02439024 0.34146341 0.51219512 0.17073171
## [43] 0.00000000 0.56097561 0.15853659 0.14634146 0.48780488 1.00000000
## [49] 0.21951220

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("balaji.csv")

# Seleccionar las columnas
dataPredic <- datos[, c("item_price", "quantity")]

# Ver el data frame
str(datos)
## 'data.frame':    49 obs. of  10 variables:
##  $ order_id          : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ date              : chr  "07-03-2022" "8/23/2022" "11/20/2022" "02-03-2023" ...
##  $ item_name         : chr  "Aalopuri" "Vadapav" "Vadapav" "Sugarcane juice" ...
##  $ item_type         : chr  "Fastfood" "Fastfood" "Fastfood" "Beverages" ...
##  $ item_price        : int  30 40 50 35 45 20 25 18 20 20 ...
##  $ quantity          : int  8 10 4 6 8 6 9 14 7 5 ...
##  $ transaction_amount: int  260 300 20 150 200 200 225 280 20 100 ...
##  $ transaction_type  : chr  "" "Cash" "Cash" "Online" ...
##  $ received_by       : chr  "Mr." "Mr." "Mr." "Mr." ...
##  $ time_of_sale      : chr  "Night" "Afternoon" "Afternoon" "Night" ...
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$item_price,y=dataPredic$quantity)

pairs(dataPredic)

Coeficiente de correlación

# Mediante la función cor
cor(dataPredic) # Matriz de correlaciones
##            item_price   quantity
## item_price 1.00000000 0.04956897
## quantity   0.04956897 1.00000000

r = 0.04956897
Interpretación: Existe correlación positiva alta entre la quantity y la item_price

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(banco$item_price ~ banco$quantity, data=dataPredic)

# Resumen de resultados
summary(modelo1)
## 
## Call:
## lm(formula = banco$item_price ~ banco$quantity, data = dataPredic)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -18.0896 -14.1096   0.4944  14.3064  26.4844 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     33.3176     4.9887   6.679 2.51e-08 ***
## banco$quantity   0.1980     0.5819   0.340    0.735    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.7 on 47 degrees of freedom
## Multiple R-squared:  0.002457,   Adjusted R-squared:  -0.01877 
## F-statistic: 0.1158 on 1 and 47 DF,  p-value: 0.7352
#Coefficients:
#               Estimate Std. Error t value Pr(>|t|)    
#(Intercept)     31.9252     0.9917  32.191   <2e-16 ***
#banco$quantity   0.1703     0.1069   1.593    0.111    
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 14.91 on 998 degrees of freedom
#Multiple R-squared:  0.002536, Adjusted R-squared:  0.001537 
#F-statistic: 2.538 on 1 and 998 DF,  p-value: 0.1115

Modelo final con los resultados:

Modelo general

$ = 31.9252 +0.1703 X $

Modelo para el caso:

\(\hat{ganancia} = 31.9252 + 0.1703 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.

# lm, notación: Y ~ X, data=
modeloMulti <- lm(banco$item_price ~ banco$quantity + banco$received_by)

summary(modeloMulti)
## 
## Call:
## lm(formula = banco$item_price ~ banco$quantity + banco$received_by)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -17.236 -13.466   1.534  12.764  27.192 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            32.1506     5.4271   5.924 3.76e-07 ***
## banco$quantity          0.2192     0.5873   0.373    0.711    
## banco$received_byMrs.   2.4555     4.3139   0.569    0.572    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.81 on 46 degrees of freedom
## Multiple R-squared:  0.009434,   Adjusted R-squared:  -0.03363 
## F-statistic: 0.2191 on 2 and 46 DF,  p-value: 0.8041
#Coefficients:
#                      Estimate Std. Error t value Pr(>|t|)    
#(Intercept)            31.6146     1.1092  28.503   <2e-16 ***
#banco$quantity          0.1730     0.1070   1.616    0.106    
#banco$received_byMrs.   0.5911     0.9443   0.626    0.532    
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 14.91 on 997 degrees of freedom
#Multiple R-squared:  0.002928, Adjusted R-squared:  0.0009279 
#F-statistic: 1.464 on 2 and 997 DF,  p-value: 0.2318

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)

#Coefficients:
#                      Estimate Std. Error t value Pr(>|t|)    
#(Intercept)            31.6146     1.1092  28.503   <2e-16 ***
#banco$quantity          0.1730     0.1070   1.616    0.106    
#banco$received_byMrs.   0.5911     0.9443   0.626    0.532    
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
#Residual standard error: 14.91 on 997 degrees of freedom
#Multiple R-squared:  0.002928, Adjusted R-squared:  0.0009279 
#F-statistic: 1.464 on 2 and 997 DF,  p-value: 0.2318