Tema:
Conjunto de datos sobre tamaños de pingüinos.
Cursos:
Estadisticas Aplicadas a la Computación.
Docente:
Victor Manuel Guevara Ponce.
Integrantes:
Carlos Fernando Meca Flores.
Maria Fernanda Tezen Dioses.
Carrera:
Gestión de Sistemas de Información.
Ciclo:
Año:
Conjunto de datos sobre tamaños de pingüinos.
Este conjunto de datos se presenta como una herramienta educativa y de exploración, centrada en proporcionar información detallada sobre diversas especies de pingüinos procedentes de distintas islas. Incluye mediciones precisas de dimensiones y géneros asociados a cada especie.
Brindar a los usuarios la oportunidad de explorar y aprender sobre las distintas especies de pingüinos, así como comprender las variaciones en sus dimensiones físicas.
Esta población de estudio permite realizar análisis comparativos y examinar las variaciones dentro de las especies de pingüinos en función de las características como la longitud del culmen, la profundidad del culmen, la longitud de la aleta, la masa corporal y el género. Los datos presentados ofrecen una visión detallada de la diversidad morfológica y física dentro de esta población de pingüinos,para comprender mejor la biología y ecología de estas aves en su entorno.
La muestra consiste en los 344 pingüinos que han sido objeto de medición y análisis, y se utiliza para realizar inferencias y generalizaciones sobre la población completa de pingüinos a partir de los datos recopilados de estos individuos seleccionados.
La unidad de análisis es el pingüino individual, y la recopilación de datos y análisis se lleva a cabo a nivel de cada uno de estos individuos para obtener una comprensión completa de la población de pingüinos estudiada.
#Agregar el conjunto de datos:
pinguinos <- read.csv("pinguinos.csv", sep = ",")
head(pinguinos)
Tabla de frecuencia para la variable longitud del pingüino
library(agricolae)
tabla_frecuencia_culmen_length_mm <- table.freq(hist(pinguinos$culmen_length_mm,breaks = "Sturges",
plot = FALSE))
tabla_frecuencia_culmen_length_mm
Tabla de frecuencia para la variable profundidad del pingüino
tabla_frecuencia_culmen_depth_mm <- table.freq(hist(pinguinos$culmen_depth_mm,breaks = "Sturges",
plot = FALSE))
tabla_frecuencia_culmen_depth_mm
Tabla de frecuencia para la variable longitud de la aleta del pingüino
tabla_frecuencia_flipper_length_mm <- table.freq(hist(pinguinos$flipper_length_mm,breaks = "Sturges",
plot = FALSE))
tabla_frecuencia_flipper_length_mm
Tabla de frecuencia para la variable de la Masa corporal del pingüino.
tabla_frecuencia_body_mass_g <- table.freq(hist(pinguinos$body_mass_g,breaks = "Sturges",
plot = FALSE))
tabla_frecuencia_body_mass_g
Distribución de pinguinos según su especie
library(ggplot2)
# Crear el gráfico de barras
ggplot(pinguinos, aes(x =species , fill =species)) +
geom_bar() +
labs(
x = "especies",
y = "Frecuencia") +
scale_fill_manual(values = c("#3B91F9", "#FA5066", "#5FF458"))
Distribución de pinguinos según su isla
# Crear el gráfico de barras
ggplot(data = pinguinos, aes(y = island, fill = island)) +
geom_bar() +
theme_classic() +
scale_fill_manual(values = c("#87F681", "#FFAA4C", "#C67FFB")) + # Puedes ajustar los colores según tus preferencias
labs(
x = "Frecuencia",
y = "islas")
Distribución de pinguinos según su género
# Contar la frecuencia de cada género
frecuencia <- table(pinguinos$sex)
# Crear un data frame con los resultados
df_frecuencia <- data.frame(sex = names(frecuencia), Frecuencia = as.numeric(frecuencia))
# Crear el gráfico de barras horizontal con ggplot2 y colores diferentes
ggplot(df_frecuencia, aes(x = Frecuencia, y = reorder(sex, Frecuencia), fill = sex)) +
geom_bar(stat = "identity", orientation = "horizontal") +
labs(
x = "Frecuencia",
y = "Género") +
scale_fill_manual(values = c("skyblue", "lightgreen", "lightcoral")) + # Colores diferentes
theme_minimal() # Puedes cambiar el tema según tus preferencias
Distribución de pinguinos según su especie
## Grafico Circular
ggplot(pinguinos, aes(x = "", fill = species)) +
geom_bar(width = 1, stat = "count") +
labs(
x = NULL,
y = NULL,
fill = "Especies"
) +
scale_fill_manual(values = c("#3B91F9", "#FA5066", "#5FF458")) +
# Agregar el coord_polar para convertirlo en un diagrama de rosca
coord_polar(theta = "y") +
theme_minimal()
Distribución de pinguinos según su isla
library(plotrix)
num_islands <- length(unique(pinguinos$island))
island_counts <- table(pinguinos$island)
labels_island <- names(island_counts)
# Create
pie3D(island_counts, labels = labels_island, explode = 0.2)
Distribución de pinguinos según su género
ggplot(data=pinguinos, aes(sex, fill = sex))+
geom_bar()+
coord_polar("x", start=0)
Longitud del pingüino
# Histograma y polígono de frecuencia
# Filtrar filas con valores no NA en culmen_length_mm
pinguinos_sin_na <- pinguinos[!is.na(pinguinos$culmen_length_mm), ]
ggplot(pinguinos_sin_na, aes(x = culmen_length_mm)) +
geom_histogram(binwidth = 1, fill = "yellow", color = "black") +
labs() +
theme_minimal()
Profundidad del pingüino
# Polígono de Frecuencias
h1<-hist(pinguinos$culmen_depth_mm, border=FALSE)
polygon.freq(h1,frequency=1 , col="red")
Longitud de la aleta del pingüino
ggplot(data.frame(x= pinguinos_sin_na$flipper_length_mm), aes(x)) +
geom_histogram(binwidth=0.5, fill='orange', alpha=0.7) +
labs(title='Histograma Acumulado', x='Valor', y='Frecuencia acumulada') +
theme_minimal()
Masa corporal del pingüino.
ggplot(pinguinos_sin_na, aes(x = body_mass_g)) +
geom_histogram(binwidth = 2, color="green", boundary = 0.2) +
labs( x = "masa") +
theme_classic()
Longitud del pingüino
ggplot(pinguinos_sin_na, aes(x =culmen_length_mm)) +
geom_density(alpha = 0.2, fill ="orange" , color="black") +
labs() +
theme_minimal()
Profundidad del pingüino
# Calcular la densidad
densidad <- density(pinguinos_sin_na$culmen_depth_mm)
# Gráfico con colores llamativos
plot(densidad, col = "green", main = "Gráfico de Densidad", xlab = "Profundidad del Culmen", ylab = "Densidad")
Longitud de la aleta del pingüino
# Calcular la densidad
densidad <- density(pinguinos_sin_na$flipper_length_mm)
# Gráfico con colores llamativos
plot(densidad, col = "red", main = "Gráfico de Densidad", xlab = "Longitud de la Aleta", ylab = "Densidad")
Masa corporal del pingüino.
# Calcular la densidad
densidad <- density(pinguinos_sin_na$body_mass_g)
# Gráfico con colores llamativos
plot(densidad, col = "purple", main = "Gráfico de Densidad", xlab = "Masa", ylab = "Densidad")
Longitud del pingüino
# Crear un diagrama de caja
ggplot(pinguinos_sin_na, aes(y = culmen_length_mm)) +
geom_boxplot(fill = "skyblue", color = "black") +
labs( y = "longitud") +
theme_minimal()
Profundidad del pingüino
#Boxplots
boxplot(pinguinos_sin_na$culmen_depth_mm)
Longitud de la aleta del pingüino
# Diagrama de caja llamativo
ggplot(pinguinos_sin_na, aes(x = species, y = flipper_length_mm, fill = species)) +
geom_boxplot(alpha = 0.7) +
scale_fill_viridis_d() +
labs( x = "Especie", y = "Longitud de Aletas (mm)") +
theme_minimal() +
theme(panel.grid = element_blank(), panel.border = element_blank())
Masa corporal del pingüino.
ggplot(pinguinos_sin_na, aes(x = species, y = body_mass_g, fill = species)) +
geom_boxplot(width = 0.8, color = "black", alpha = 0.8) +
scale_fill_manual(values = c("#FF9999", "#66B2FF", "#99FF99")) +
coord_flip() +
labs( x = "Especie", y = "Longitud de Aletas (mm)") +
theme_minimal() +
theme(panel.grid = element_blank(), panel.border = element_blank())
Longitud del pingüino
ggplot(pinguinos_sin_na, aes(x = seq_along(culmen_length_mm), y = culmen_length_mm, color = species)) +
geom_line(aes(group = species), linewidth = 1) +
geom_point(size = 2, shape = 21, fill = "white", color = "black") +
labs( x = "Posición en el Conjunto de Datos", y = "Longitud del pingüino (mm)", color = "Especie") +
theme_minimal()
Profundidad del pingüino
#
pinguinos$culmen_depth_mm <- factor(pinguinos$culmen_depth_mm)
#
plot(pinguinos$culmen_depth_mm, pinguinos$Frecuencia, type = "l", col = "blue",
xlab = "profundidad", ylab = "Frecuencia")
Longitud de la aleta del pingüino
ggplot(pinguinos_sin_na, aes(x = reorder(species, flipper_length_mm), y = flipper_length_mm, group = species, color = species)) +
geom_line() +
geom_point(size = 3) +
labs(x = "Especie", y = "Longitud de Aletas (mm)", color = "Especie") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Masa corporal del pingüino.
ggplot(pinguinos_sin_na, aes(x = seq_along(body_mass_g), y = body_mass_g, color = species, group = species)) +
geom_point(size = 3) +
geom_line() +
labs(
x = "Observación", y = "Masa Corporal (g)", color = "Especie") +
theme_minimal()
En un estudio de biología marina que se centra en el análisis de diversas características físicas de los pingüinos.El objetivo es obtener medidas estadísticas a partir de los datos de la masa corporal de los pingüinos pertenecientes a tres especies específicas: Adelie, Chinstrap y Gentoo.
# Masa corporal
body_mass_g<- c(3750,3800,3250,3450,3650,3625,4675,3475,4250,3300,3700,3200,3800,4400,3700)
La media aritmética (media o promedio) de un conjunto de valores de una variable es la suma de dichos valores dividida entre el número de valores. Se denota por \(\bar{X}\)
mean(body_mass_g)
## [1] 3735
Representa el valor que, al ordenar todos los valores de menor a mayor, se encuentra al medio. En caso que el número de valores sea par, la mediana es el promedio de los dos valores de en medio. Cuando la variable es de tipo ordinal, la mediana es la mejor medida para representar la tendencia central.
median(body_mass_g)
## [1] 3700
El valor de la mediana es: 3700
La moda es el valor que tiene mayor frecuencia absoluta. Se representa por Mo. Se puede hallar la moda para variables cualitativas y cuantitativas.
library(modeest)
mfv(body_mass_g)
## [1] 3700 3800
La medida de variabilidad más sencilla es el Rango, para calcular esta medida hay que restar el valor máximo de los datos menos el valor menor.
range(body_mass_g) #Se restan las salidas
## [1] 3200 4675
Representa en cuanto difiere el valor de cada observación (xi) a la media de los datos (cuadrada). A diferencia de las medidas anteriores, la varianza emplea todos los datos disponibles de la variable. Se recomienda su uso cuando se compara las variabilidades de dos o más variables.
\(s^2=\frac{\sum_{i=1}^n\left(x_i-\bar{x}\right)^2}{n-1}\)
var(body_mass_g)
## [1] 177214.3
Llamada también desviación típica, es la medida de dispersión más importante y de mayor uso en trabajos estadísticos. Un valor relativamente grande, significa, que la generosidad de los datos está alejados de la media y así recíprocamente. Es la raíz cuadrada positiva de la varianza.
# Opción 2
sd(body_mass_g)
## [1] 420.9683
Interpretación: La varibilidad promedio de los datos respecto a la media es de 420.9683.
El coeficiente de variación (CV) es una medida estadística que indica porcentualmente qué tan separados están los datos en relación con su promedio. Se obtiene al dividir la desviación estándar (S) entre el promedio (\(\bar{x}\))
\[ C V=\frac{S}{\bar{x}} \times 100 \]
• Si CV ≤ 30%, entonces la distribución es homogénea y la media es representativa.
• Si CV > 30%, entonces la distribución no es homogénea y la media no es representativa. En este caso debemos tomar la mediana como medida representativa.
coef_varBody <- sd(body_mass_g)/mean(body_mass_g)*100
coef_varBody
## [1] 11.2709
quantile(pinguinos_sin_na$body_mass_g)
## 0% 25% 50% 75% 100%
## 2700 3550 4050 4750 6300
Resultado /## 0% 25% 50% 75% 100%
/## 2700 3550 4050 4750 6300
Según los resultados: El valor mínimo de la masa muscular es 2700
Starbucks disfrutó de considerable éxito con sus tarjetas de prepago, que se venden entre $5 y $500 dólares. Desde que la tarjeta fue introducida en noviembre del 2001,aumentaron los ingresos por ventas. Suponga que la gerencia de Starbucks desea conocer las razones por las que algunas personas compran tarjetas con cantidades prepagadas más altas que otras personas, suponga que hace un estudio de 25 compradores de tarjetas prepagadas. A quienes respondieron el estudio se les preguntó la cantidad de tarjetas prepagadas, edad del cliente, número de días al mes que el cliente hace una compra en Starbucks, número de tazas de café que el cliente toma por día y los ingresos del cliente. Con los datos, se quiere evaluar si existe relación entre la cantidad de tarjetas prepagadas, por medio de otras variables y cuáles de estas pueden ser más útiles para hacer el pronósticos (mayor relación). La descripción de las variables tenemos:
#Agregar el conjunto de datos para missing:
starbucks <- read.csv("https://raw.githubusercontent.com/VictorGuevaraP/Estadistica-R/master/starbucks.csv", sep = ";")
head(starbucks)
# Verificar columnas con missing
which(colSums(is.na(starbucks))!=0)
## named integer(0)
library(VIM)
library(mice)
resumen_missing_starbucks <- aggr(starbucks, numbers = TRUE)
summary(resumen_missing_starbucks)
##
## Missings per variable:
## Variable Count
## Cantidad.de.tarjeta.prepagada.... 0
## Edad 0
## Días.por.mes.en.Starbucks 0
## Tazas.de.café.por.día 0
## Ingresos....1000. 0
##
## Missings in combinations of variables:
## Combinations Count Percent
## 0:0:0:0:0 25 100
matrixplot(starbucks)
#Con librería mice
md.pattern(starbucks, rotate.names = TRUE)
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## Cantidad.de.tarjeta.prepagada.... Edad Días.por.mes.en.Starbucks
## 25 1 1 1
## 0 0 0
## Tazas.de.café.por.día Ingresos....1000.
## 25 1 1 0
## 0 0 0
library(visdat)
vis_dat(starbucks)
vis_miss(starbucks)
#### 9.3 Corrección de missing
2.1 Eliminar filas o columnas con missing (es recomendable optar por eliminar columnas si el porcentaje de missing esta por arriba de 15% <para algunos experos 30%>)
Solo para este ejemplo se va a eliminar filas:
starbucks <- na.omit(starbucks)
str(starbucks)
## 'data.frame': 25 obs. of 5 variables:
## $ Cantidad.de.tarjeta.prepagada....: int 5 25 10 5 15 50 10 15 5 5 ...
## $ Edad : int 25 30 27 42 29 25 50 45 32 23 ...
## $ Días.por.mes.en.Starbucks : int 4 12 10 8 11 12 8 6 16 10 ...
## $ Tazas.de.café.por.día : int 1 5 4 5 8 5 3 5 7 1 ...
## $ Ingresos....1000. : int 20 35 30 30 25 60 30 35 25 20 ...
# Verificar columnas con missing
which(colSums(is.na(starbucks))!=0)
## named integer(0)
Imputación por medidas de tendencia central
library(DMwR2)
starbucks<-centralImputation(starbucks) #DMwR, mediana(númerico), moda(no númerico)
str(starbucks)
## 'data.frame': 25 obs. of 5 variables:
## $ Cantidad.de.tarjeta.prepagada....: int 5 25 10 5 15 50 10 15 5 5 ...
## $ Edad : int 25 30 27 42 29 25 50 45 32 23 ...
## $ Días.por.mes.en.Starbucks : int 4 12 10 8 11 12 8 6 16 10 ...
## $ Tazas.de.café.por.día : int 1 5 4 5 8 5 3 5 7 1 ...
## $ Ingresos....1000. : int 20 35 30 30 25 60 30 35 25 20 ...
# Verificar columnas con missing
which(colSums(is.na(starbucks))!=0)
## named integer(0)
library(VIM)
starbucks <- initialise(starbucks, method = "median") #media(continuos) mediana(discretos), moda(no númerico)
# Verificar columnas con missing
which(colSums(is.na(starbucks))!=0)
## named integer(0)
starbucks <- knnImputation(starbucks, k=10)
str(starbucks)
## 'data.frame': 25 obs. of 5 variables:
## $ Cantidad.de.tarjeta.prepagada....: int 5 25 10 5 15 50 10 15 5 5 ...
## $ Edad : int 25 30 27 42 29 25 50 45 32 23 ...
## $ Días.por.mes.en.Starbucks : int 4 12 10 8 11 12 8 6 16 10 ...
## $ Tazas.de.café.por.día : int 1 5 4 5 8 5 3 5 7 1 ...
## $ Ingresos....1000. : int 20 35 30 30 25 60 30 35 25 20 ...
# Verificar columnas con missing
which(colSums(is.na(starbucks))!=0)
## named integer(0)
#### El principal objetivo es realizar un análisis de la empresa “Starbucks”.
# Resumen
summary(starbucks)
## Cantidad.de.tarjeta.prepagada.... Edad Días.por.mes.en.Starbucks
## Min. : 5.0 Min. :20.00 Min. : 3.00
## 1st Qu.: 10.0 1st Qu.:27.00 1st Qu.: 8.00
## Median : 20.0 Median :30.00 Median :10.00
## Mean : 31.6 Mean :32.72 Mean :10.76
## 3rd Qu.: 35.0 3rd Qu.:38.00 3rd Qu.:12.00
## Max. :200.0 Max. :51.00 Max. :19.00
## Tazas.de.café.por.día Ingresos....1000.
## Min. : 1.00 Min. :20.0
## 1st Qu.: 3.00 1st Qu.:30.0
## Median : 5.00 Median :35.0
## Mean : 4.44 Mean :36.8
## 3rd Qu.: 5.00 3rd Qu.:40.0
## Max. :10.00 Max. :80.0
El análisis solo se realiza para variable cuantitativas
<span style=“background-color:yellow ; color:#000> #### Gráfico de cajas y bigotes para la variable Cantidad de tarjetas prepagada
#Gráfico de cajas y bigotes
boxplot(starbucks$Cantidad.de.tarjeta.prepagada,
col = "cyan", # Color de los cuadros
border = "black", # Color del borde de los cuadros
main = "Cantidad de Tarjeta Prepagada en Starbucks", # Título del gráfico
xlab = "Tarjeta prepagada", # Etiqueta del eje X
ylab = "Cantidad" # Etiqueta del eje Y
)
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_starbucks <- quantile(starbucks$Cantidad.de.tarjeta.prepagada...., 0.25)
q3_starbucks <- quantile(starbucks$Cantidad.de.tarjeta.prepagada...., 0.75)
RIC_starbucs <- q3_starbucks-q1_starbucks
RIC_starbucs
## 75%
## 25
# Limites o bigotes (Superior e inferior)
bigote_inferior_starbucks <- q1_starbucks-1.5*RIC_starbucs
bigote_inferior_starbucks
## 25%
## -27.5
bigote_superior_starbucks <- q3_starbucks+1.5*RIC_starbucs
bigote_superior_starbucks
## 75%
## 72.5
# Identificar lo valores atípicos
outliers_det_starbucks <- starbucks$Cantidad.de.tarjeta.prepagada....[starbucks$Cantidad.de.tarjeta.prepagada.... < bigote_inferior_starbucks | starbucks$Cantidad.de.tarjeta.prepagada.... > bigote_superior_starbucks]
outliers_det_starbucks
## [1] 200 100
starbucks_sin_atipicos <- starbucks[!starbucks$Cantidad.de.tarjeta.prepagada.... %in% outliers_det_starbucks,]
starbucks_sin_atipicos
Para confirmar vamos a realizar un gráfico de cajas con la nueva data
boxplot(starbucks_sin_atipicos$Cantidad.de.tarjeta.prepagada....)
<span style=“background-color:yellow ; color:#000> #### Gráfico de cajas y bigotes para la variable Edad
boxplot(starbucks$Edad,
col = c("#5EF7A6"), # Colores de los cuadros
border = "black", # Color del borde de los cuadros
main = "Distribución de Edad en Starbucks", # Título del gráfico
xlab = "Edad", # Etiqueta del eje X
ylab = "Frecuencia" # Etiqueta del eje Y
)
# Agregar una leyenda para los colores
legend("topright", legend = c("Edad"), fill = c("#5EF7A6"))
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_starbucks_edad <- quantile(starbucks$Edad, 0.25)
q3_starbucks_edad <- quantile(starbucks$Edad, 0.75)
RIC_starbucks_edad <- q3_starbucks_edad-q1_starbucks_edad
RIC_starbucks_edad
## 75%
## 11
# Limites o bigotes (Superior e inferior)
bigote_inferior_starbucks_edad <- q1_starbucks_edad-1.5*RIC_starbucks_edad
bigote_inferior_starbucks_edad
## 25%
## 10.5
bigote_superior_starbucks_edad <- q3_starbucks_edad+1.5*RIC_starbucks_edad
bigote_superior_starbucks_edad
## 75%
## 54.5
# Identificar lo valores atípicos
outliers_det_starbucks_edad <- starbucks$Edad[starbucks$Edad < bigote_inferior_starbucks_edad | starbucks$Edad > bigote_superior_starbucks_edad]
outliers_det_starbucks_edad
## integer(0)
starbucks_sin_atipicos_edad <- starbucks[!starbucks$Edad %in% outliers_det_starbucks_edad,]
starbucks_sin_atipicos_edad
boxplot(starbucks_sin_atipicos_edad$Edad)
boxplot(starbucks$Días.por.mes.en.Starbucks,
col = c("#7FFF5A"), # Colores de los cuadros
border = "black", # Color del borde de los cuadros
main = "Distribución de días por mes en Starbucks", # Título del gráfico
xlab = "Días por mes", # Etiqueta del eje X
ylab = "Frecuencia" # Etiqueta del eje Y
)
# Agregar una leyenda para los colores
legend("topright", legend = c("Días por meses"), fill = c("#7FFF5A"))
# Calcular el RIC (RIC = Q3 - Q1)
q1_starbucks_diaspormes <- quantile(starbucks$Días.por.mes.en.Starbucks, 0.25)
q3_starbucks_diaspormes <- quantile(starbucks$Días.por.mes.en.Starbucks, 0.75)
RIC_starbucks_diaspormes <- q3_starbucks_diaspormes-q1_starbucks_diaspormes
RIC_starbucks_diaspormes
## 75%
## 4
# Limites o bigotes (Superior e inferior)
bigote_inferior_starbucks_diaspormes <- q1_starbucks_diaspormes-1.5*RIC_starbucks_diaspormes
bigote_inferior_starbucks_diaspormes
## 25%
## 2
bigote_superior_starbucks_diaspormes <- q3_starbucks_diaspormes+1.5*RIC_starbucks_diaspormes
bigote_superior_starbucks_diaspormes
## 75%
## 18
# Identificar lo valores atípicos
outliers_det_starbucks_diaspormes <- starbucks$Días.por.mes.en.Starbucks[starbucks$Días.por.mes.en.Starbucks < bigote_inferior_starbucks_diaspormes | starbucks$Días.por.mes.en.Starbucks > bigote_superior_starbucks_diaspormes]
outliers_det_starbucks_diaspormes
## [1] 19
starbucks_sin_atipicos_diaspormes <- starbucks[!starbucks$Días.por.mes.en.Starbucks %in% outliers_det_starbucks_diaspormes,]
starbucks_sin_atipicos_diaspormes
Para confirmar vamos a realizar un gráfico de cajas con la nueva data
boxplot(starbucks_sin_atipicos_diaspormes$Días.por.mes.en.Starbucks)
<span style=“background-color:yellow ; color:#000> Gráfico de cajas y bigotes para la variable Tazas de café por día
boxplot(starbucks$Tazas.de.café.por.día ,
col = c("#FF885A"), # Colores de los cuadros
border = "black", # Color del borde de los cuadros
main = "Distribución de Tazas de café por día ", # Título del gráfico
xlab = "Tazas de café ", # Etiqueta del eje X
ylab = "Frecuencia" # Etiqueta del eje Y
)
# Agregar una leyenda para los colores
legend("topright", legend = c("Tazas de café por día "), fill = c("#FF885A"))
# Calcular el RIC (RIC = Q3 - Q1)
q1_starbucks_cafepordia <- quantile(starbucks$Tazas.de.café.por.día, 0.25)
q3_starbucks_cafepordia <- quantile(starbucks$Tazas.de.café.por.día, 0.75)
RIC_starbucks_cafepordia <- q3_starbucks_cafepordia-q1_starbucks_cafepordia
RIC_starbucks_cafepordia
## 75%
## 2
# Limites o bigotes (Superior e inferior)
bigote_inferior_starbucks_cafepordia <- q1_starbucks_cafepordia-1.5*RIC_starbucks_cafepordia
bigote_inferior_starbucks_cafepordia
## 25%
## 0
bigote_superior_starbucks_cafepordia <- q3_starbucks_cafepordia+1.5*RIC_starbucks_cafepordia
bigote_superior_starbucks_cafepordia
## 75%
## 8
# Identificar lo valores atípicos
outliers_det_starbucks_cafepordia <- starbucks$Tazas.de.café.por.día[starbucks$Tazas.de.café.por.día < bigote_inferior_starbucks_cafepordia | starbucks$Tazas.de.café.por.día > bigote_superior_starbucks_cafepordia]
outliers_det_starbucks_cafepordia
## [1] 10
starbucks_sin_atipicos_cafepordia <- starbucks[!starbucks$Tazas.de.café.por.día %in% outliers_det_starbucks_cafepordia,]
starbucks_sin_atipicos_cafepordia
boxplot(starbucks_sin_atipicos_cafepordia$Tazas.de.café.por.día)
<span style=“background-color:yellow ; color:#000> #### Gráfico de cajas y bigotes para la variable Ingresos
boxplot(starbucks$Ingresos....1000. ,
col = c("#FDFF5D"), # Colores de los cuadros
border = "black", # Color del borde de los cuadros
main = "Distribución de Ingresos ", # Título del gráfico
xlab = "Ingresos", # Etiqueta del eje X
ylab = "Frecuencia" # Etiqueta del eje Y
)
# Agregar una leyenda para los colores
legend("topright", legend = c("Ingresos"), fill = c("#FDFF5D"))
boxplot(starbucks)
# Calcular el RIC (RIC = Q3 - Q1)
q1_starbucks_ingresos <- quantile(starbucks$Ingresos....1000., 0.25)
q3_starbucks_ingresos <- quantile(starbucks$Ingresos....1000., 0.75)
RIC_starbucks_ingresos <- q3_starbucks_ingresos-q1_starbucks_ingresos
RIC_starbucks_ingresos
## 75%
## 10
# Limites o bigotes (Superior e inferior)
bigote_inferior_starbucks_ingresos <- q1_starbucks_ingresos-1.5*RIC_starbucks_ingresos
bigote_inferior_starbucks_ingresos
## 25%
## 15
bigote_superior_starbucks_ingresos <- q3_starbucks_ingresos+1.5*RIC_starbucks_ingresos
bigote_superior_starbucks_ingresos
## 75%
## 55
# Identificar lo valores atípicos
outliers_det_starbucks_ingresos <- starbucks$Ingresos....1000.[starbucks$Ingresos....1000. < bigote_inferior_starbucks_ingresos | starbucks$Ingresos....1000. > bigote_superior_starbucks_ingresos]
outliers_det_starbucks_ingresos
## [1] 60 80
starbucks_sin_atipicos_ingresos <- starbucks[!starbucks$Ingresos....1000. %in% outliers_det_starbucks_ingresos,]
starbucks_sin_atipicos_ingresos
boxplot(starbucks_sin_atipicos_ingresos$Ingresos....1000.)
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.
<span style=“background-color:yellow ; color:#000> #### Variable Cantidad de tarjetas prepagada
# Original
hist(starbucks$Cantidad.de.tarjeta.prepagada...., 12)
sqrt(starbucks$Cantidad.de.tarjeta.prepagada....)
## [1] 2.236068 5.000000 3.162278 2.236068 3.872983 7.071068 3.162278
## [8] 3.872983 2.236068 2.236068 4.472136 5.916080 6.324555 3.872983
## [15] 14.142136 3.872983 6.324555 2.236068 5.477226 10.000000 5.477226
## [22] 5.000000 5.000000 7.071068 3.872983
hist(sqrt(starbucks$Cantidad.de.tarjeta.prepagada....))
<span style=“background-color:yellow ; color:#000> #### Variable Edad
# Original
hist(starbucks$Edad, 12)
sqrt(starbucks$Edad)
## [1] 5.000000 5.477226 5.196152 6.480741 5.385165 5.000000 7.071068 6.708204
## [9] 5.656854 4.795832 6.324555 5.916080 5.291503 5.744563 6.324555 6.082763
## [17] 7.141428 4.472136 5.099020 6.164414 5.196152 5.385165 5.830952 5.477226
## [25] 4.690416
hist(sqrt(starbucks$Edad))
<span style=“background-color:yellow ; color:#000> #### Variable Cantidad de Días por mes en Starbucks
# Original
hist(starbucks$Días.por.mes.en.Starbucks, 12)
sqrt(starbucks$Días.por.mes.en.Starbucks)
## [1] 2.000000 3.464102 3.162278 2.828427 3.316625 3.464102 2.828427 2.449490
## [9] 4.000000 3.162278 4.242641 3.464102 3.162278 3.464102 3.872983 1.732051
## [17] 3.162278 2.828427 3.872983 4.358899 3.464102 3.741657 3.162278 2.449490
## [25] 2.828427
hist(sqrt(starbucks$Días.por.mes.en.Starbucks))
<span style=“background-color:yellow ; color:#000> #### Variable Tazas de cafe por día
# Original
hist(starbucks$Tazas.de.café.por.día, 12)
sqrt(starbucks$Tazas.de.café.por.día)
## [1] 1.000000 2.236068 2.000000 2.236068 2.828427 2.236068 1.732051 2.236068
## [9] 2.645751 1.000000 2.236068 1.732051 1.732051 1.414214 2.236068 1.000000
## [17] 2.828427 2.000000 2.236068 3.162278 1.732051 2.449490 2.000000 1.732051
## [25] 2.236068
hist(sqrt(starbucks$Tazas.de.café.por.día))
<span style=“background-color:yellow ; color:#000> #### Variable Ingresos
# Original
hist(starbucks$Ingresos....1000., 12)
sqrt(starbucks$Ingresos....1000.)
## [1] 4.472136 5.916080 5.477226 5.477226 5.000000 7.745967 5.477226 5.916080
## [9] 5.000000 4.472136 6.324555 6.324555 7.071068 5.477226 8.944272 5.477226
## [17] 5.916080 5.000000 5.916080 6.708204 5.916080 5.916080 6.708204 7.416198
## [25] 5.477226
hist(sqrt(starbucks$Ingresos....1000.))
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()
<span style=“background-color:yellow ; color:#000> #### Variable Cantidad de tarjetas prepagada
exp(starbucks$Cantidad.de.tarjeta.prepagada....)
## [1] 1.484132e+02 7.200490e+10 2.202647e+04 1.484132e+02 3.269017e+06
## [6] 5.184706e+21 2.202647e+04 3.269017e+06 1.484132e+02 1.484132e+02
## [11] 4.851652e+08 1.586013e+15 2.353853e+17 3.269017e+06 7.225974e+86
## [16] 3.269017e+06 2.353853e+17 1.484132e+02 1.068647e+13 2.688117e+43
## [21] 1.068647e+13 7.200490e+10 7.200490e+10 5.184706e+21 3.269017e+06
para poder observarlo graficamente se tiene:
Cantidad.de.tarjeta_exp<- exp(starbucks$Cantidad.de.tarjeta.prepagada....)
hist(Cantidad.de.tarjeta_exp)
<span style=“background-color:yellow ; color:#000> #### Variable Edad
exp(starbucks$Edad)
## [1] 7.200490e+10 1.068647e+13 5.320482e+11 1.739275e+18 3.931334e+12
## [6] 7.200490e+10 5.184706e+21 3.493427e+19 7.896296e+13 9.744803e+09
## [11] 2.353853e+17 1.586013e+15 1.446257e+12 2.146436e+14 2.353853e+17
## [16] 1.171914e+16 1.409349e+22 4.851652e+08 1.957296e+11 3.185593e+16
## [21] 5.320482e+11 3.931334e+12 5.834617e+14 1.068647e+13 3.584913e+09
para poder observarlo graficamente se tiene:
edad_exp<- exp(starbucks$Edad)
hist(edad_exp)
<span style=“background-color:yellow ; color:#000> #### Variable Días por mes en Starbucks
exp(starbucks$Días.por.mes.en.Starbucks)
## [1] 5.459815e+01 1.627548e+05 2.202647e+04 2.980958e+03 5.987414e+04
## [6] 1.627548e+05 2.980958e+03 4.034288e+02 8.886111e+06 2.202647e+04
## [11] 6.565997e+07 1.627548e+05 2.202647e+04 1.627548e+05 3.269017e+06
## [16] 2.008554e+01 2.202647e+04 2.980958e+03 3.269017e+06 1.784823e+08
## [21] 1.627548e+05 1.202604e+06 2.202647e+04 4.034288e+02 2.980958e+03
para poder observarlo graficamente se tiene:
Días.por.mes_exp<- exp(starbucks$Días.por.mes.en.Starbucks)
hist(Días.por.mes_exp)
<span style=“background-color:yellow ; color:#000> #### Variable Tazas de cafe por día
exp(starbucks$Tazas.de.café.por.día)
## [1] 2.718282 148.413159 54.598150 148.413159 2980.957987
## [6] 148.413159 20.085537 148.413159 1096.633158 2.718282
## [11] 148.413159 20.085537 20.085537 7.389056 148.413159
## [16] 2.718282 2980.957987 54.598150 148.413159 22026.465795
## [21] 20.085537 403.428793 54.598150 20.085537 148.413159
para poder observarlo graficamente se tiene:
Tazas_de_café_por_día_exp<- exp(starbucks$Tazas.de.café.por.día)
hist(Tazas_de_café_por_día_exp)
<span style=“background-color:yellow ; color:#000> #### Variable Ingresos
exp(starbucks$Ingresos....1000.)
## [1] 4.851652e+08 1.586013e+15 1.068647e+13 1.068647e+13 7.200490e+10
## [6] 1.142007e+26 1.068647e+13 1.586013e+15 7.200490e+10 4.851652e+08
## [11] 2.353853e+17 2.353853e+17 5.184706e+21 1.068647e+13 5.540622e+34
## [16] 1.068647e+13 1.586013e+15 7.200490e+10 1.586013e+15 3.493427e+19
## [21] 1.586013e+15 1.586013e+15 3.493427e+19 7.694785e+23 1.068647e+13
para poder observarlo graficamente se tiene:
ingresos_exp<- exp(starbucks$Ingresos....1000.)
hist(ingresos_exp)
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)
<span style=“background-color:yellow ; color:#000> #### Variable Cantidad de tarjetas prepagada
log(starbucks$Cantidad.de.tarjeta.prepagada....)
## [1] 1.609438 3.218876 2.302585 1.609438 2.708050 3.912023 2.302585 2.708050
## [9] 1.609438 1.609438 2.995732 3.555348 3.688879 2.708050 5.298317 2.708050
## [17] 3.688879 1.609438 3.401197 4.605170 3.401197 3.218876 3.218876 3.912023
## [25] 2.708050
hist(log(starbucks$Cantidad.de.tarjeta.prepagada....))
Cambiar la base 2
log(starbucks$Cantidad.de.tarjeta.prepagada...., base=2)
## [1] 2.321928 4.643856 3.321928 2.321928 3.906891 5.643856 3.321928 3.906891
## [9] 2.321928 2.321928 4.321928 5.129283 5.321928 3.906891 7.643856 3.906891
## [17] 5.321928 2.321928 4.906891 6.643856 4.906891 4.643856 4.643856 5.643856
## [25] 3.906891
hist(log(starbucks$Cantidad.de.tarjeta.prepagada...., base=2))
#Obtener solo tranaformaciones
cantidad_tarjetas_prepagada_sqrt <- sqrt(starbucks$Cantidad.de.tarjeta.prepagada....)
cantidad_tarjetas_prepagada_exp <- exp(starbucks$Cantidad.de.tarjeta.prepagada....)
cantidad_tarjetas_prepagada_ln <- log(starbucks$Cantidad.de.tarjeta.prepagada....)
cantidad_tarjetas_prepagada_log2 <- log(starbucks$Cantidad.de.tarjeta.prepagada...., base=2)
cantidad_tarjetas_prepagada_log5 <- log(starbucks$Cantidad.de.tarjeta.prepagada...., base=5)
Ver graficamente cada una:
par(mfrow=c(3,2), mar=c(2,2,2,2))
hist(starbucks$Cantidad.de.tarjeta.prepagada....)
hist(cantidad_tarjetas_prepagada_sqrt)
hist(cantidad_tarjetas_prepagada_exp)
hist(cantidad_tarjetas_prepagada_ln)
hist(cantidad_tarjetas_prepagada_log2)
hist(cantidad_tarjetas_prepagada_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), mar=c(4, 4, 2, 1))
plot(density(starbucks$Cantidad.de.tarjeta.prepagada....), main = "Distribución de cantidad de tarjetas prepagada originales")
plot(density(cantidad_tarjetas_prepagada_sqrt), main = "Distribución de cantidad de tarjetas prepagada transformadas - sqrt")
plot(density(cantidad_tarjetas_prepagada_exp), main = "Distribución de cantidad de tarjetas prepagada transformadas - exp")
plot(density(cantidad_tarjetas_prepagada_ln), main = "Distribución de cantidad de tarjetas prepagada transformadas - ln")
plot(density(cantidad_tarjetas_prepagada_log2), main = "Distribución de cantidad de tarjetas prepagada transformadas - log2")
plot(density(cantidad_tarjetas_prepagada_log5), main = "Distribución de cantidad de tarjetas prepagada transformadas - log5")
par(mfrow=c(1,1))
<span style=“background-color:yellow ; color:#000 > #### Variable Edad
-transformación logaritmica
log(starbucks$Edad)
## [1] 3.218876 3.401197 3.295837 3.737670 3.367296 3.218876 3.912023 3.806662
## [9] 3.465736 3.135494 3.688879 3.555348 3.332205 3.496508 3.688879 3.610918
## [17] 3.931826 2.995732 3.258097 3.637586 3.295837 3.367296 3.526361 3.401197
## [25] 3.091042
hist(log(starbucks$Edad))
Cambiar la base 2
log(starbucks$Edad, base=2)
## [1] 4.643856 4.906891 4.754888 5.392317 4.857981 4.643856 5.643856 5.491853
## [9] 5.000000 4.523562 5.321928 5.129283 4.807355 5.044394 5.321928 5.209453
## [17] 5.672425 4.321928 4.700440 5.247928 4.754888 4.857981 5.087463 4.906891
## [25] 4.459432
hist(log(starbucks$Edad, base=2))
#Obtener solo tranaformaciones
edad_sqrt <- sqrt(starbucks$Edad)
edad_exp <- exp(starbucks$Edad)
edad_ln <- log(starbucks$Edad)
edad_log2 <- log(starbucks$Edad, base=2)
edad_log5 <- log(starbucks$Edad, base=5)
Ver graficamente cada una:
par(mfrow=c(3,2))
par(mar=c(3, 4, 4, 2))
hist(starbucks$Edad)
hist(edad_sqrt)
hist(edad_exp)
hist(edad_ln)
hist(edad_log2)
hist(edad_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
# Adjusting the margins
par(mfrow=c(3,2), mar=c(4, 4, 2, 1)) # Set bottom, left, top, right margins
# Plotting
plot(density(starbucks$Edad), main = "Distribución de edades originales")
plot(density(edad_sqrt), main = "Distribución de edades transformadas - sqrt")
plot(density(edad_exp), main = "Distribución de edades transformadas - exp")
plot(density(edad_ln), main = "Distribución de edades transformadas - ln")
plot(density(edad_log2), main = "Distribución de edades transformadas - log2")
plot(density(edad_log5), main = "Distribución de edades transformadas - log5")
# Resetting the layout
par(mfrow=c(1,1))
<span style=“background-color:yellow ; color:#000> #### Variable Días por mes
-transformación logaritmica
log(starbucks$Días.por.mes.en.Starbucks)
## [1] 1.386294 2.484907 2.302585 2.079442 2.397895 2.484907 2.079442 1.791759
## [9] 2.772589 2.302585 2.890372 2.484907 2.302585 2.484907 2.708050 1.098612
## [17] 2.302585 2.079442 2.708050 2.944439 2.484907 2.639057 2.302585 1.791759
## [25] 2.079442
hist(log(starbucks$Días.por.mes.en.Starbucks))
Cambiar la base 2
log(starbucks$Días.por.mes.en.Starbucks, base=2)
## [1] 2.000000 3.584963 3.321928 3.000000 3.459432 3.584963 3.000000 2.584963
## [9] 4.000000 3.321928 4.169925 3.584963 3.321928 3.584963 3.906891 1.584963
## [17] 3.321928 3.000000 3.906891 4.247928 3.584963 3.807355 3.321928 2.584963
## [25] 3.000000
hist(log(starbucks$Días.por.mes.en.Starbucks, base=2))
#Obtener solo tranaformaciones
días_por_mes_sqrt <- sqrt(starbucks$Días.por.mes.en.Starbucks)
días_por_mes_exp <- exp(starbucks$Días.por.mes.en.Starbucks)
días_por_mes_ln <- log(starbucks$Días.por.mes.en.Starbucks)
días_por_mes_log2 <- log(starbucks$Días.por.mes.en.Starbucks, base=2)
días_por_mes_log5 <- log(starbucks$Días.por.mes.en.Starbucks, base=5)
Ver graficamente cada una:
par(mfrow=c(3,2))
hist(starbucks$Días.por.mes.en.Starbucks)
hist(días_por_mes_sqrt)
hist(días_por_mes_exp)
hist(días_por_mes_ln)
hist(días_por_mes_log2)
hist(días_por_mes_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(starbucks$Días.por.mes.en.Starbucks), main = "Distribución de día por mes originales")
plot(density(días_por_mes_sqrt), main = "Distribución de día por mes transformadas - sqrt")
plot(density(días_por_mes_exp), main = "Distribución de día por mes transformadas - exp")
plot(density(días_por_mes_ln), main = "Distribución de día por mes transformadas - ln")
plot(density(días_por_mes_log2), main = "Distribución de día por mes transformadas - log2")
plot(density(días_por_mes_log5), main = "Distribución de día por mes transformadas - log5")
par(mfrow=c(1,1))
<span style=“background-color:yellow ; color:#000> ####Variable Tazas de café por día
-transformación logaritmica
log(starbucks$Tazas.de.café.por.día)
## [1] 0.0000000 1.6094379 1.3862944 1.6094379 2.0794415 1.6094379 1.0986123
## [8] 1.6094379 1.9459101 0.0000000 1.6094379 1.0986123 1.0986123 0.6931472
## [15] 1.6094379 0.0000000 2.0794415 1.3862944 1.6094379 2.3025851 1.0986123
## [22] 1.7917595 1.3862944 1.0986123 1.6094379
hist(log(starbucks$Tazas.de.café.por.día))
Cambiar la base 2
log(starbucks$Tazas.de.café.por.día, base=2)
## [1] 0.000000 2.321928 2.000000 2.321928 3.000000 2.321928 1.584963 2.321928
## [9] 2.807355 0.000000 2.321928 1.584963 1.584963 1.000000 2.321928 0.000000
## [17] 3.000000 2.000000 2.321928 3.321928 1.584963 2.584963 2.000000 1.584963
## [25] 2.321928
hist(log(starbucks$Tazas.de.café.por.día, base=2))
#Obtener solo tranaformaciones
tazas_de_café_por_día_sqrt <- sqrt(starbucks$Tazas.de.café.por.día)
tazas_de_café_por_día_exp <- exp(starbucks$Tazas.de.café.por.día)
tazas_de_café_por_día_ln <- log(starbucks$Tazas.de.café.por.día)
tazas_de_café_por_día_log2 <- log(starbucks$Tazas.de.café.por.día, base=2)
tazas_de_café_por_día_log5 <- log(starbucks$Tazas.de.café.por.día, base=5)
Ver graficamente cada una:
par(mfrow=c(3,2))
hist(starbucks$Tazas.de.café.por.día)
hist(tazas_de_café_por_día_sqrt)
hist(tazas_de_café_por_día_exp)
hist(tazas_de_café_por_día_ln)
hist(tazas_de_café_por_día_log2)
hist(tazas_de_café_por_día_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(starbucks$Tazas.de.café.por.día), main = "Distribución de edades originales")
plot(density(tazas_de_café_por_día_sqrt), main = "Distribución de edades transformadas - sqrt")
plot(density(tazas_de_café_por_día_exp), main = "Distribución de edades transformadas - exp")
plot(density(tazas_de_café_por_día_ln), main = "Distribución de edades transformadas - ln")
plot(density(tazas_de_café_por_día_log2), main = "Distribución de edades transformadas - log2")
plot(density(tazas_de_café_por_día_log5), main = "Distribución de edades transformadas - log5")
par(mfrow=c(1,1))
<span style=“background-color:yellow ; color:#000> #### Variable Ingresos
-transformación logaritmica
log(starbucks$Ingresos....1000.)
## [1] 2.995732 3.555348 3.401197 3.401197 3.218876 4.094345 3.401197 3.555348
## [9] 3.218876 2.995732 3.688879 3.688879 3.912023 3.401197 4.382027 3.401197
## [17] 3.555348 3.218876 3.555348 3.806662 3.555348 3.555348 3.806662 4.007333
## [25] 3.401197
hist(log(starbucks$Ingresos....1000.))
Cambiar la base 2
log(starbucks$Ingresos....1000., base=2)
## [1] 4.321928 5.129283 4.906891 4.906891 4.643856 5.906891 4.906891 5.129283
## [9] 4.643856 4.321928 5.321928 5.321928 5.643856 4.906891 6.321928 4.906891
## [17] 5.129283 4.643856 5.129283 5.491853 5.129283 5.129283 5.491853 5.781360
## [25] 4.906891
hist(log(starbucks$Ingresos....1000., base=2))
#Obtener solo tranaformaciones
ingresos_sqrt <- sqrt(starbucks$Ingresos....1000.)
ingresos_exp <- exp(starbucks$Ingresos....1000.)
ingresos_ln <- log(starbucks$Ingresos....1000.)
ingresos_log2 <- log(starbucks$Ingresos....1000., base=2)
ingresos_log5 <- log(starbucks$Ingresos....1000., base=5)
Ver graficamente cada una:
par(mfrow=c(3,2))
hist(starbucks$Ingresos....1000.)
hist(ingresos_sqrt)
hist(ingresos_exp)
hist(ingresos_ln)
hist(ingresos_log2)
hist(ingresos_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(starbucks$Ingresos....1000.), main = "Distribución de ingresos originales")
plot(density(ingresos_sqrt), main = "Distribución de ingresos transformadas - sqrt")
plot(density(ingresos_exp), main = "Distribución de ingresos transformadas - exp")
plot(density(ingresos_ln), main = "Distribución de ingresos transformadas - ln")
plot(density(ingresos_log2), main = "Distribución de ingresos transformadas - log2")
plot(density(ingresos_log5), main = "Distribución de ingresos 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.
library(PerformanceAnalytics)
chart.Correlation(cor(starbucks[,1:5]), histogram = TRUE)
## Estandarización:
La estandarización se hace o se aplica a la transformación Z: Se debe restar cada datos con su media y dividir este resultado con la desviación estándar.
\[ z=\frac{x_i-\mu}{\sigma} \]
Donde:
starbucks$Cantidad.de.tarjeta.prepagada....
## [1] 5 25 10 5 15 50 10 15 5 5 20 35 40 15 200 15 40 5 30
## [20] 100 30 25 25 50 15
media_cantidad_tarjetas_prepagada <- mean(starbucks$Cantidad.de.tarjeta.prepagada....)
media_cantidad_tarjetas_prepagada
## [1] 31.6
desv_est <- sd(starbucks$Cantidad.de.tarjeta.prepagada....)
desv_est
## [1] 40.81768
cantidad_tarjetas_prepagada_estandar <- (starbucks$Cantidad.de.tarjeta.prepagada....-media_cantidad_tarjetas_prepagada)/desv_est
cantidad_tarjetas_prepagada_estandar
## [1] -0.65167833 -0.16169462 -0.52918240 -0.65167833 -0.40668647 0.45078501
## [7] -0.52918240 -0.40668647 -0.65167833 -0.65167833 -0.28419055 0.08329723
## [13] 0.20579316 -0.40668647 4.12566278 -0.40668647 0.20579316 -0.65167833
## [19] -0.03919870 1.67574426 -0.03919870 -0.16169462 -0.16169462 0.45078501
## [25] -0.40668647
cantidad_tarjetas_prepagada_estandar2 <- (starbucks$Cantidad.de.tarjeta.prepagada....-mean(starbucks$Cantidad.de.tarjeta.prepagada....))/sd(starbucks$Cantidad.de.tarjeta.prepagada....)
cantidad_tarjetas_prepagada_estandar2
## [1] -0.65167833 -0.16169462 -0.52918240 -0.65167833 -0.40668647 0.45078501
## [7] -0.52918240 -0.40668647 -0.65167833 -0.65167833 -0.28419055 0.08329723
## [13] 0.20579316 -0.40668647 4.12566278 -0.40668647 0.20579316 -0.65167833
## [19] -0.03919870 1.67574426 -0.03919870 -0.16169462 -0.16169462 0.45078501
## [25] -0.40668647
R tiene múltiple funciones para estandarizar, la clásica es la función scale
#Función scale
cantidad_tarjetas_prepagada_estandar3 <- scale(starbucks$Cantidad.de.tarjeta.prepagada....)
cantidad_tarjetas_prepagada_estandar3
## [,1]
## [1,] -0.65167833
## [2,] -0.16169462
## [3,] -0.52918240
## [4,] -0.65167833
## [5,] -0.40668647
## [6,] 0.45078501
## [7,] -0.52918240
## [8,] -0.40668647
## [9,] -0.65167833
## [10,] -0.65167833
## [11,] -0.28419055
## [12,] 0.08329723
## [13,] 0.20579316
## [14,] -0.40668647
## [15,] 4.12566278
## [16,] -0.40668647
## [17,] 0.20579316
## [18,] -0.65167833
## [19,] -0.03919870
## [20,] 1.67574426
## [21,] -0.03919870
## [22,] -0.16169462
## [23,] -0.16169462
## [24,] 0.45078501
## [25,] -0.40668647
## attr(,"scaled:center")
## [1] 31.6
## attr(,"scaled:scale")
## [1] 40.81768
La ventaja de la función de R, es que se puede enviar todo el caso
starbucks_cuanti_scale <- scale(starbucks[ ,1:1])
head(starbucks_cuanti_scale)
## [,1]
## [1,] -0.6516783
## [2,] -0.1616946
## [3,] -0.5291824
## [4,] -0.6516783
## [5,] -0.4066865
## [6,] 0.4507850
Recordar No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(starbucks[,1:1])
boxplot(starbucks_cuanti_scale)
starbucks$Edad
## [1] 25 30 27 42 29 25 50 45 32 23 40 35 28 33 40 37 51 20 26 38 27 29 34 30 22
media_edad <- mean(starbucks$Edad)
media_edad
## [1] 32.72
desv_est <- sd(starbucks$Edad)
desv_est
## [1] 8.403967
edad <- (starbucks$Edad-media_edad)/desv_est
edad
## [1] -0.91861376 -0.32365666 -0.68063092 1.10424037 -0.44264808 -0.91861376
## [7] 2.05617173 1.46121463 -0.08567382 -1.15659660 0.86625753 0.27130044
## [13] -0.56163950 0.03331760 0.86625753 0.50928328 2.17516315 -1.51357086
## [19] -0.79962234 0.62827469 -0.68063092 -0.44264808 0.15230902 -0.32365666
## [25] -1.27558802
edad_estandar2 <- (starbucks$Edad-mean(starbucks$Edad))/sd(starbucks$Edad)
edad_estandar2
## [1] -0.91861376 -0.32365666 -0.68063092 1.10424037 -0.44264808 -0.91861376
## [7] 2.05617173 1.46121463 -0.08567382 -1.15659660 0.86625753 0.27130044
## [13] -0.56163950 0.03331760 0.86625753 0.50928328 2.17516315 -1.51357086
## [19] -0.79962234 0.62827469 -0.68063092 -0.44264808 0.15230902 -0.32365666
## [25] -1.27558802
R tiene múltiple funciones para estandarizar, la clásica es la función scale
#Función scale
edad_estandar3 <- scale(starbucks$Edad)
edad_estandar3
## [,1]
## [1,] -0.91861376
## [2,] -0.32365666
## [3,] -0.68063092
## [4,] 1.10424037
## [5,] -0.44264808
## [6,] -0.91861376
## [7,] 2.05617173
## [8,] 1.46121463
## [9,] -0.08567382
## [10,] -1.15659660
## [11,] 0.86625753
## [12,] 0.27130044
## [13,] -0.56163950
## [14,] 0.03331760
## [15,] 0.86625753
## [16,] 0.50928328
## [17,] 2.17516315
## [18,] -1.51357086
## [19,] -0.79962234
## [20,] 0.62827469
## [21,] -0.68063092
## [22,] -0.44264808
## [23,] 0.15230902
## [24,] -0.32365666
## [25,] -1.27558802
## attr(,"scaled:center")
## [1] 32.72
## attr(,"scaled:scale")
## [1] 8.403967
La ventaja de la función de R, es que se puede enviar todo el caso
starbucks_cuanti_scale_edad <- scale(starbucks[ ,2:2])
head(starbucks_cuanti_scale_edad)
## [,1]
## [1,] -0.9186138
## [2,] -0.3236567
## [3,] -0.6806309
## [4,] 1.1042404
## [5,] -0.4426481
## [6,] -0.9186138
Recordar No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(starbucks[,2:2])
boxplot(starbucks_cuanti_scale_edad)
starbucks$Días.por.mes.en.Starbucks
## [1] 4 12 10 8 11 12 8 6 16 10 18 12 10 12 15 3 10 8 15 19 12 14 10 6 8
media_diaspormes <- mean(starbucks$Días.por.mes.en.Starbucks)
media_diaspormes
## [1] 10.76
desv_est_diaspormes <- sd(starbucks$Días.por.mes.en.Starbucks)
desv_est_diaspormes
## [1] 4.013311
diaspormes <- (starbucks$Días.por.mes.en.Starbucks-media_diaspormes)/desv_est_diaspormes
diaspormes
## [1] -1.68439468 0.30897180 -0.18936982 -0.68771144 0.05980099 0.30897180
## [7] -0.68771144 -1.18605306 1.30565505 -0.18936982 1.80399667 0.30897180
## [13] -0.18936982 0.30897180 1.05648424 -1.93356549 -0.18936982 -0.68771144
## [19] 1.05648424 2.05316748 0.30897180 0.80731343 -0.18936982 -1.18605306
## [25] -0.68771144
diaspormes_estandar2 <- (starbucks$Días.por.mes.en.Starbucks-mean(starbucks$Días.por.mes.en.Starbucks))/sd(starbucks$Días.por.mes.en.Starbucks)
diaspormes_estandar2
## [1] -1.68439468 0.30897180 -0.18936982 -0.68771144 0.05980099 0.30897180
## [7] -0.68771144 -1.18605306 1.30565505 -0.18936982 1.80399667 0.30897180
## [13] -0.18936982 0.30897180 1.05648424 -1.93356549 -0.18936982 -0.68771144
## [19] 1.05648424 2.05316748 0.30897180 0.80731343 -0.18936982 -1.18605306
## [25] -0.68771144
R tiene múltiple funciones para estandarizar, la clásica es la función scale
#Función scale
diaspormes_estandar3 <- scale(starbucks$Días.por.mes.en.Starbucks)
diaspormes_estandar3
## [,1]
## [1,] -1.68439468
## [2,] 0.30897180
## [3,] -0.18936982
## [4,] -0.68771144
## [5,] 0.05980099
## [6,] 0.30897180
## [7,] -0.68771144
## [8,] -1.18605306
## [9,] 1.30565505
## [10,] -0.18936982
## [11,] 1.80399667
## [12,] 0.30897180
## [13,] -0.18936982
## [14,] 0.30897180
## [15,] 1.05648424
## [16,] -1.93356549
## [17,] -0.18936982
## [18,] -0.68771144
## [19,] 1.05648424
## [20,] 2.05316748
## [21,] 0.30897180
## [22,] 0.80731343
## [23,] -0.18936982
## [24,] -1.18605306
## [25,] -0.68771144
## attr(,"scaled:center")
## [1] 10.76
## attr(,"scaled:scale")
## [1] 4.013311
La ventaja de la función de R, es que se puede enviar todo el caso
starbucks_cuanti_scale_diaspormes <- scale(starbucks[ ,3:3])
head(starbucks_cuanti_scale_diaspormes)
## [,1]
## [1,] -1.68439468
## [2,] 0.30897180
## [3,] -0.18936982
## [4,] -0.68771144
## [5,] 0.05980099
## [6,] 0.30897180
Recordar No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(starbucks[,3:3])
boxplot(starbucks_cuanti_scale_diaspormes)
starbucks$Tazas.de.café.por.día
## [1] 1 5 4 5 8 5 3 5 7 1 5 3 3 2 5 1 8 4 5 10 3 6 4 3 5
media_tazapordia <- mean(starbucks$Tazas.de.café.por.día)
media_tazapordia
## [1] 4.44
desv_est_tazapordia <- sd(starbucks$Tazas.de.café.por.día)
desv_est_tazapordia
## [1] 2.237558
tazapordia <- (starbucks$Tazas.de.café.por.día-media_tazapordia)/desv_est_tazapordia
tazapordia
## [1] -1.5373902 0.2502728 -0.1966429 0.2502728 1.5910201 0.2502728
## [7] -0.6435587 0.2502728 1.1441043 -1.5373902 0.2502728 -0.6435587
## [13] -0.6435587 -1.0904744 0.2502728 -1.5373902 1.5910201 -0.1966429
## [19] 0.2502728 2.4848516 -0.6435587 0.6971886 -0.1966429 -0.6435587
## [25] 0.2502728
tazapordia_estandar2 <- (starbucks$Tazas.de.café.por.día-mean(starbucks$Tazas.de.café.por.día))/sd(starbucks$Tazas.de.café.por.día)
tazapordia_estandar2
## [1] -1.5373902 0.2502728 -0.1966429 0.2502728 1.5910201 0.2502728
## [7] -0.6435587 0.2502728 1.1441043 -1.5373902 0.2502728 -0.6435587
## [13] -0.6435587 -1.0904744 0.2502728 -1.5373902 1.5910201 -0.1966429
## [19] 0.2502728 2.4848516 -0.6435587 0.6971886 -0.1966429 -0.6435587
## [25] 0.2502728
R tiene múltiple funciones para estandarizar, la clásica es la función scale
#Función scale
tazapordia_estandar3 <- scale(starbucks$Tazas.de.café.por.día)
tazapordia_estandar3
## [,1]
## [1,] -1.5373902
## [2,] 0.2502728
## [3,] -0.1966429
## [4,] 0.2502728
## [5,] 1.5910201
## [6,] 0.2502728
## [7,] -0.6435587
## [8,] 0.2502728
## [9,] 1.1441043
## [10,] -1.5373902
## [11,] 0.2502728
## [12,] -0.6435587
## [13,] -0.6435587
## [14,] -1.0904744
## [15,] 0.2502728
## [16,] -1.5373902
## [17,] 1.5910201
## [18,] -0.1966429
## [19,] 0.2502728
## [20,] 2.4848516
## [21,] -0.6435587
## [22,] 0.6971886
## [23,] -0.1966429
## [24,] -0.6435587
## [25,] 0.2502728
## attr(,"scaled:center")
## [1] 4.44
## attr(,"scaled:scale")
## [1] 2.237558
La ventaja de la función de R, es que se puede enviar todo el caso
starbucks_cuanti_scale_tazapordia <- scale(starbucks[ ,4:4])
head(starbucks_cuanti_scale_tazapordia)
## [,1]
## [1,] -1.5373902
## [2,] 0.2502728
## [3,] -0.1966429
## [4,] 0.2502728
## [5,] 1.5910201
## [6,] 0.2502728
Recordar No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(starbucks[,4:4])
boxplot(starbucks_cuanti_scale_tazapordia)
starbucks$Ingresos....1000.
## [1] 20 35 30 30 25 60 30 35 25 20 40 40 50 30 80 30 35 25 35 45 35 35 45 55 30
media_ingresos <- mean(starbucks$Ingresos....1000.)
media_ingresos
## [1] 36.8
desv_est_ingresos <- sd(starbucks$Ingresos....1000.)
desv_est_ingresos
## [1] 13.45362
ingresos <- (starbucks$Ingresos....1000.-media_ingresos)/desv_est_ingresos
ingresos
## [1] -1.2487342 -0.1337929 -0.5054400 -0.5054400 -0.8770871 1.7244424
## [7] -0.5054400 -0.1337929 -0.8770871 -1.2487342 0.2378541 0.2378541
## [13] 0.9811483 -0.5054400 3.2110307 -0.5054400 -0.1337929 -0.8770871
## [19] -0.1337929 0.6095012 -0.1337929 -0.1337929 0.6095012 1.3527953
## [25] -0.5054400
ingresos_estandar2 <- (starbucks$Ingresos....1000.-mean(starbucks$Ingresos....1000.))/sd(starbucks$Ingresos....1000.)
ingresos_estandar2
## [1] -1.2487342 -0.1337929 -0.5054400 -0.5054400 -0.8770871 1.7244424
## [7] -0.5054400 -0.1337929 -0.8770871 -1.2487342 0.2378541 0.2378541
## [13] 0.9811483 -0.5054400 3.2110307 -0.5054400 -0.1337929 -0.8770871
## [19] -0.1337929 0.6095012 -0.1337929 -0.1337929 0.6095012 1.3527953
## [25] -0.5054400
R tiene múltiple funciones para estandarizar, la clásica es la función scale
#Función scale
ingresos_estandar3 <- scale(starbucks$Ingresos....1000.)
ingresos_estandar3
## [,1]
## [1,] -1.2487342
## [2,] -0.1337929
## [3,] -0.5054400
## [4,] -0.5054400
## [5,] -0.8770871
## [6,] 1.7244424
## [7,] -0.5054400
## [8,] -0.1337929
## [9,] -0.8770871
## [10,] -1.2487342
## [11,] 0.2378541
## [12,] 0.2378541
## [13,] 0.9811483
## [14,] -0.5054400
## [15,] 3.2110307
## [16,] -0.5054400
## [17,] -0.1337929
## [18,] -0.8770871
## [19,] -0.1337929
## [20,] 0.6095012
## [21,] -0.1337929
## [22,] -0.1337929
## [23,] 0.6095012
## [24,] 1.3527953
## [25,] -0.5054400
## attr(,"scaled:center")
## [1] 36.8
## attr(,"scaled:scale")
## [1] 13.45362
La ventaja de la función de R, es que se puede enviar todo el caso
starbucks_cuanti_scale_ingresos <- scale(starbucks[ ,4:4])
head(starbucks_cuanti_scale_ingresos)
## [,1]
## [1,] -1.5373902
## [2,] 0.2502728
## [3,] -0.1966429
## [4,] 0.2502728
## [5,] 1.5910201
## [6,] 0.2502728
Recordar No se recomienda trabajar con valores originales para la siguiente gráfica
boxplot(starbucks[,4:4])
boxplot(starbucks_cuanti_scale_ingresos)
#### Normalización:
Estandarización min-max: Consiste en restar cada dato con el valor mínimo y a esta operación se le divide con la resta del valor máximo con el mínimo. Esto permite que los resultados varien solo entre 0 y 1
\[ X_{norm}=\frac{\left(X_i-X_{\min }\right)}{X_{\max }-X_{\min }} \] ##### Aplicar estandarización Z a la variable Cantidad de tarjeta prepagada y Edad
###Variable Cantidad de tarjeta prepagada
cantidad_tarjeta_prepagada_normal <- (starbucks$Cantidad.de.tarjeta.prepagada....-min(starbucks$Cantidad.de.tarjeta.prepagada....))/(max(starbucks$Cantidad.de.tarjeta.prepagada....)-min(starbucks$Cantidad.de.tarjeta.prepagada....))
cantidad_tarjeta_prepagada_normal
## [1] 0.00000000 0.10256410 0.02564103 0.00000000 0.05128205 0.23076923
## [7] 0.02564103 0.05128205 0.00000000 0.00000000 0.07692308 0.15384615
## [13] 0.17948718 0.05128205 1.00000000 0.05128205 0.17948718 0.00000000
## [19] 0.12820513 0.48717949 0.12820513 0.10256410 0.10256410 0.23076923
## [25] 0.05128205
###Variable Edad
edad_normal <- (starbucks$Edad-min(starbucks$Edad))/(max(starbucks$Edad)-min(starbucks$Edad))
edad_normal
## [1] 0.16129032 0.32258065 0.22580645 0.70967742 0.29032258 0.16129032
## [7] 0.96774194 0.80645161 0.38709677 0.09677419 0.64516129 0.48387097
## [13] 0.25806452 0.41935484 0.64516129 0.54838710 1.00000000 0.00000000
## [19] 0.19354839 0.58064516 0.22580645 0.29032258 0.45161290 0.32258065
## [25] 0.06451613
###Variable cantidad de tarjetas prepagada
library(scales)
##
## Attaching package: 'scales'
## The following object is masked from 'package:plotrix':
##
## rescale
rescale(starbucks$Cantidad.de.tarjeta.prepagada....)
## [1] 0.00000000 0.10256410 0.02564103 0.00000000 0.05128205 0.23076923
## [7] 0.02564103 0.05128205 0.00000000 0.00000000 0.07692308 0.15384615
## [13] 0.17948718 0.05128205 1.00000000 0.05128205 0.17948718 0.00000000
## [19] 0.12820513 0.48717949 0.12820513 0.10256410 0.10256410 0.23076923
## [25] 0.05128205
###Variable Edad
library(scales)
rescale(starbucks$Edad)
## [1] 0.16129032 0.32258065 0.22580645 0.70967742 0.29032258 0.16129032
## [7] 0.96774194 0.80645161 0.38709677 0.09677419 0.64516129 0.48387097
## [13] 0.25806452 0.41935484 0.64516129 0.54838710 1.00000000 0.00000000
## [19] 0.19354839 0.58064516 0.22580645 0.29032258 0.45161290 0.32258065
## [25] 0.06451613
library(caret)
## Loading required package: lattice
pre_procesamiento<-preProcess(starbucks[,1:2]) # Así por defecto muestra la est. Z
predict(pre_procesamiento, starbucks[,1:2])
###Variable Días por mes
dia_por_mes_normal <- (starbucks$Días.por.mes.en.Starbucks-min(starbucks$Días.por.mes.en.Starbucks))/(max(starbucks$Días.por.mes.en.Starbucks)-min(starbucks$Días.por.mes.en.Starbucks))
dia_por_mes_normal
## [1] 0.0625 0.5625 0.4375 0.3125 0.5000 0.5625 0.3125 0.1875 0.8125 0.4375
## [11] 0.9375 0.5625 0.4375 0.5625 0.7500 0.0000 0.4375 0.3125 0.7500 1.0000
## [21] 0.5625 0.6875 0.4375 0.1875 0.3125
### Tazas de café por día
tazas_de_cafe_por_día_normal <- (starbucks$Tazas.de.café.por.día-min(starbucks$Tazas.de.café.por.día))/(max(starbucks$Tazas.de.café.por.día)-min(starbucks$Tazas.de.café.por.día))
tazas_de_cafe_por_día_normal
## [1] 0.0000000 0.4444444 0.3333333 0.4444444 0.7777778 0.4444444 0.2222222
## [8] 0.4444444 0.6666667 0.0000000 0.4444444 0.2222222 0.2222222 0.1111111
## [15] 0.4444444 0.0000000 0.7777778 0.3333333 0.4444444 1.0000000 0.2222222
## [22] 0.5555556 0.3333333 0.2222222 0.4444444
###Variable Días por mes
library(scales)
rescale(starbucks$Días.por.mes.en.Starbucks)
## [1] 0.0625 0.5625 0.4375 0.3125 0.5000 0.5625 0.3125 0.1875 0.8125 0.4375
## [11] 0.9375 0.5625 0.4375 0.5625 0.7500 0.0000 0.4375 0.3125 0.7500 1.0000
## [21] 0.5625 0.6875 0.4375 0.1875 0.3125
### Tazas de café por día
library(scales)
rescale(starbucks$Tazas.de.café.por.día)
## [1] 0.0000000 0.4444444 0.3333333 0.4444444 0.7777778 0.4444444 0.2222222
## [8] 0.4444444 0.6666667 0.0000000 0.4444444 0.2222222 0.2222222 0.1111111
## [15] 0.4444444 0.0000000 0.7777778 0.3333333 0.4444444 1.0000000 0.2222222
## [22] 0.5555556 0.3333333 0.2222222 0.4444444
library(caret)
pre_procesamiento<-preProcess(starbucks[,3:4]) # Así por defecto muestra la est. Z
predict(pre_procesamiento, starbucks[,3:4])
###Variable ingresos
ingresos_normal <- (starbucks$Ingresos....1000.-min(starbucks$Ingresos....1000.))/(max(starbucks$Ingresos....1000.)-min(starbucks$Ingresos....1000.))
ingresos_normal
## [1] 0.00000000 0.25000000 0.16666667 0.16666667 0.08333333 0.66666667
## [7] 0.16666667 0.25000000 0.08333333 0.00000000 0.33333333 0.33333333
## [13] 0.50000000 0.16666667 1.00000000 0.16666667 0.25000000 0.08333333
## [19] 0.25000000 0.41666667 0.25000000 0.25000000 0.41666667 0.58333333
## [25] 0.16666667
library(scales)
rescale(starbucks$Ingresos....1000.)
## [1] 0.00000000 0.25000000 0.16666667 0.16666667 0.08333333 0.66666667
## [7] 0.16666667 0.25000000 0.08333333 0.00000000 0.33333333 0.33333333
## [13] 0.50000000 0.16666667 1.00000000 0.16666667 0.25000000 0.08333333
## [19] 0.25000000 0.41666667 0.25000000 0.25000000 0.41666667 0.58333333
## [25] 0.16666667
library(caret)
pre_procesamiento<-preProcess(starbucks[,4:5]) # Así por defecto muestra la est. Z
predict(pre_procesamiento, starbucks[,4:5])
#### Modelo de regresión:
Paso 1: Determinar las variables X,Y
Variable independiente (X): Cantidad de Tarjeta prepagada
Variable dependiente (y): Ingresos
Ingresamos los datos
starbucks_ejemplo1 <- data.frame(cantidadTarjeta=c(starbucks$Cantidad.de.tarjeta.prepagada....),
ingresos=c(starbucks$Ingresos....1000.))
starbucks_ejemplo1
## Diagrama de dispersión o puntos
# Gráfico con plot
plot(x=starbucks$Cantidad.de.tarjeta.prepagada....,y=starbucks$Ingresos....1000.)
# Gráfico con pairs
pairs(starbucks_ejemplo1)
Interpretación: Según los resultados, hay relación lineal positiva o directa entre la cantidad de tarjeta prepagada y los ingresos.
# Mediante la función cor
cor(starbucks_ejemplo1) # Matriz de correlaciones
## cantidadTarjeta ingresos
## cantidadTarjeta 1.0000000 0.8500323
## ingresos 0.8500323 1.0000000
Coeficiente de correlación:
r = 0.8500323
Interpretación: Existe correlación positiva mul alta entre los ingresos y la cantidad de tarjeta prepagada.
(Recordar: Si el r en menor que 0.35 para algunos autores, no es viable la regresión, para otros autores se debe probar hipótesis)
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
Modelo general
\[ \hat{Y} = b_o + b_1X \]
Modelo para el caso:
\[ \hat{ingresos} = b_0 + b_1 cantidadTarjetaPrepagada \]
Para obtener el modelo, se va a utilizar una función de R > lm
# lm, notación: Y ~ X, data=
modelo1 <- lm(ingresos ~ cantidadTarjeta, data=starbucks_ejemplo1)
# Resumen de resultados
summary(modelo1)
##
## Call:
## lm(formula = ingresos ~ cantidadTarjeta, data = starbucks_ejemplo1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.964 -4.154 -1.352 2.247 18.045
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 27.9465 1.8452 15.146 1.87e-13 ***
## cantidadTarjeta 0.2802 0.0362 7.739 7.53e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.239 on 23 degrees of freedom
## Multiple R-squared: 0.7226, Adjusted R-squared: 0.7105
## F-statistic: 59.9 on 1 and 23 DF, p-value: 7.534e-08
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 27.9465 1.8452 15.146 1.87e-13 ***
## cantidadTarjeta 0.2802 0.0362 7.739 7.53e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.239 on 23 degrees of freedom
## Multiple R-squared: 0.7226, Adjusted R-squared: 0.7105
## F-statistic: 59.9 on 1 and 23 DF, p-value: 7.534e-08
Modelo final con los resultados:
Modelo general
\[ \hat{y} = 27.9465 + 0.2802 X \]
Modelo para el caso:
\(\hat{ingresos} = 27.9465 + 0.2802 cantidadTarjetaPrepagada\)
#### Regresión lineal múltiple
La regresión lineal múltiple generaliza el modelo de regresión lineal simple al permitir muchos regresores en una función media. Comenzamos agregando solo un regresor a la función media de regresión simple porque las ideas se generalizan al agregar muchos regresores.
El modelo de regresión lineal múltiple
El modelo general de regresión lineal múltiple con respuesta Y y regresores X1; . . . ;Xp tendrá la forma:
\[ Y = β_0 + β_1X_{1} + β_2X_{2} + ⋯ + β_pX_{p} + e \] - Estimación de los coeficientes
Los parámetros β_0,β_1,…,β_p son desconocidos y debemos estimarlos. El método de mínimos cuadrados permite estimarlos pues escogemos los parámetros que minimizan la suma de cuadrados de los residuales.
\[ SCR = \sum_{i=1}^{n} (Y_i - \bar Y_i )^2 = \sum_{i=1}^{n}(Y_i - \hat{\beta_{0}}-\beta_{i2}- ...- \hat{\beta_{p}}X_{ip})^2 \]
Para contestar la pregunta ¿al menos uno de los predictores X1, X2, …, Xp (variables independientes), son útiles para predecir Y (variable dependiente)?? se puede realizar una prueba de hipótesis en donde
\[ H_{0}= β_1 = β_2 =...=β_p=0 \\ H_{1} \not\stackrel{\text{}}{=} \beta_1 \not\stackrel{\text{}}{=} \beta_2 \not\stackrel{\text{}}{=} \ldots \not\stackrel{\text{}}{=} \beta_p \not\stackrel{\text{}}{=} 0 \]
La significancia se determinará utilizando el estadístico F Estadístico F
\[ F = \frac{{(SCT - SCR)}}{P}\\ {SCR}\\ \overline{{n-p-1}}\\ donde \quad SCT = \sum (y_i - \bar{y})^2 \quad y \quad SCR = \sum (y_i - \hat{y_i})^2 \]
Si no existe relación entre la variable respuesta y los predictores, entonces el valor del estadístico F estaría cerca de 1. Si al menos uno importa, entonces esperamos que F sea mayor que 1.
Rechazar Ho, si el p-valor es menor que 5%
El modelo ajustado aplicando el MMCO seria:
\[ \hat{y} = \beta_0 + x_1 \beta_1 + x_2 \beta_2 + \ldots + x_p \beta_p \]
Donde:
y ̂: variable dependiente
\[ SCT = \sum (y_i - \bar{y})^2 - SCR = \sum (y_i - \hat{y_i})^2 \] X1, X2, …, Xp: variables independientes β_0,β_1,…,β_p: Coeficientes a estimar
Ajustamos el modelo de regresión:
library(dplyr)
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
##
## first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggcorrplot)
222
## [1] 222
corr_datos_starbucks <- starbucks %>%
select(Cantidad.de.tarjeta.prepagada...., Edad, Días.por.mes.en.Starbucks, Tazas.de.café.por.día, Ingresos....1000.) %>%
cor(use = "pairwise") %>%
round(1)
ggcorrplot(corr_datos_starbucks, type = "lower", lab = TRUE, show.legend = TRUE)
ggplot(starbucks, aes(x = starbucks$Días.por.mes.en.Starbucks, y = starbucks$Ingresos....1000.)) +
geom_col(fill = "coral") +
labs(
x = "Días Por meses en Starbucks", y = "Ingresos") +
theme_minimal()
library(ggplot2)
variables_independientes <- c("Cantidad.de.tarjeta.prepagada....")
for (var in variables_independientes) {
grafica_var <- ggplot(starbucks, aes(x = Cantidad.de.tarjeta.prepagada...., y = !!sym(var))) +
geom_col(fill = "coral") +
labs(
x = "Cantidad de Tarjeta de Prepagada",
y = gsub("_", " ", var)) +
theme_minimal() +
theme(
title = element_text(size = 9),
axis.title.x = element_text(size = 7),
axis.title.y = element_text(size = 7)
)
print(grafica_var)
}
modelo_starbucks<-lm(starbucks$Cantidad.de.tarjeta.prepagada....~., data = starbucks)
modelo_starbucks
##
## Call:
## lm(formula = starbucks$Cantidad.de.tarjeta.prepagada.... ~ .,
## data = starbucks)
##
## Coefficients:
## (Intercept) Edad
## -83.8257 0.2369
## Días.por.mes.en.Starbucks Tazas.de.café.por.día
## 1.1897 1.4216
## Ingresos....1000.
## 2.4065
Se muentran los coeficientes, por lo tanto, si el modelo fuera válido sería:
\[ \hat{y} = -83.8257 + 0.2369x_1 + 1.1897_2 - 1.4216x_3 - 2.4065_4 \] Resumen del modelo:
summary(modelo_starbucks)
##
## Call:
## lm(formula = starbucks$Cantidad.de.tarjeta.prepagada.... ~ .,
## data = starbucks)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.874 -9.947 -2.351 7.332 56.872
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -83.8257 22.4944 -3.727 0.00133 **
## Edad 0.2369 0.5759 0.411 0.68515
## Días.por.mes.en.Starbucks 1.1897 1.4739 0.807 0.42909
## Tazas.de.café.por.día 1.4216 2.6310 0.540 0.59494
## Ingresos....1000. 2.4065 0.3597 6.690 1.64e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 22.15 on 20 degrees of freedom
## Multiple R-squared: 0.7546, Adjusted R-squared: 0.7056
## F-statistic: 15.38 on 4 and 20 DF, p-value: 6.758e-06
El valor del estadístico F es F-statistic: 15.38 Su p-Value: 6.758e-06 < 0.05 esto quiere decir que se rechaza.
### Gráficos de dispersión generales
library(psych)
## Registered S3 method overwritten by 'psych':
## method from
## plot.residuals rmutil
##
## Attaching package: 'psych'
## The following objects are masked from 'package:scales':
##
## alpha, rescale
## The following object is masked from 'package:plotrix':
##
## rescale
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
multi.hist(x = starbucks, dcol = c("blue", "red"), dlty = c("dotted", "solid"),
main = "")
library(GGally)
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
suppressMessages(capture.output({
ggpairs(starbucks, lower = list(starbucks = "smooth"),
diag = list(starbucks = "barDiag"), axisLabels = "none")
}))
## character(0)
prob_cantidad_tarjeta_prepagada <- pmin(0.1 * starbucks_cantidad_tarjeta_prepagadas, 1)
ingresos <- rbinom(n, 1, prob_cantidad_tarjeta_prepagada) # Variable dependiente: Hubo ingresos (1) vs. No hubo ingresos (0)
starkbucks_data <- data.frame(ingresos, starbucks_cantidad_tarjeta_prepagadas)
View(starkbucks_data)
modelo_starkbucks <- glm(ingresos ~ starbucks_cantidad_tarjeta_prepagadas, data = starbucks, family = binomial("logit"))
summary(modelo_starkbucks)
##
## Call:
## glm(formula = ingresos ~ starbucks_cantidad_tarjeta_prepagadas,
## family = binomial("logit"), data = starbucks)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.5765 1.2676 -2.821 0.004781 **
## starbucks_cantidad_tarjeta_prepagadas 0.6857 0.1917 3.578 0.000347 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 114.611 on 99 degrees of freedom
## Residual deviance: 98.783 on 98 degrees of freedom
## AIC: 102.78
##
## Number of Fisher Scoring iterations: 4
n <- 100
starbucks_tarjeta_prepagadas_predichas <- data.frame(starbucks_cantidad_tarjeta_prepagadas = c(4, 10)) # Valores dos desviaciones estándar alejadas de la media
logit_prediccion <- predict(modelo_starkbucks, newdata = starbucks_tarjeta_prepagadas_predichas, type = "link")
probabilidad_prediccion <- exp(logit_prediccion) / (1 + exp(logit_prediccion))
probabilidad_prediccion
## 1 2
## 0.3028378 0.9637420