El conjunto de datos captura transacciones de ventas de un restaurante local.
Caso 1 Balaji Fast Food
Caso 2 Infotec S.A.C.
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
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.
La población de estudio son todas las transacciones de ventas realizadas por el restaurante durante un período de tiempo determinado.
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.
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.
banco <- read.csv("balaji.csv",
sep = ",", stringsAsFactors = TRUE)
head(banco)
# 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"
# 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"))
#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
(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"
# 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)
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)
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)
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])
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\)
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
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