“Año del Bicentenario, de la consolidación de nuestra Independencia, y de la conmemoración de las heroicas batallas de Junín y Ayacucho”


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:

IV

Año:

Indice

I. Aspectos generales

1.1 Nombre de la organización y/o empresa (real o propuesta)
1.2 Descripción del caso (o los caso) que se va a analizar

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio
2.2 Población de estudio
2.3 Muestra
2.4 Unidad de análisis

III. Variables

3.1 Tipos de variables

IV. Manejo de base de datos

V. Tablas de frecuencia (Para cada variable)

5.1 Tablas de frecuencia para variables cuantitativas

VI. Representación gráfica de datos

6.1 Gráficos estadísticos para variables cualitativa
6.1.1 Gráficos de Barras
6.1.2 Gráfico Circular
6.2 Gráficos estadísticos para variables cuantitativas
6.2.1 Histogramas
6.2.2 Gráfico de densidad
6.2.3 Gráficos de cajas
6.2.4 Gráficos Lineales

VII. Medidas estadísticas de tendencia

7.1 Caso Pinguinos
7.2 Media aritmética
7.3 Mediana
7.4 Moda
7.5 Medidad de Variabilidad o Disperción

VIII. Medidas estadísticas de posición

IX. Manejo de datos Missing

9.1 Caso Starbucks
9.2 Verificación de valores perdidos
9.3 Corrección de missing
9.4 Aplicando Técnicas de Imputación

X. Manejo de valores outliers

10.1 Detección de outtliers univariado - gráfica

XI. Transformación de variables

11.1 Transformación de raíz cuadrada
11.2 Transformación exponencial
11.3 Transformación logarítmica
11.3 Gráfica general

XII. Estandarización y normalización de variables

XIII. Modelamiento predictivo

XIV. Regresión logistica

I. Aspectos generales

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

Conjunto de datos sobre tamaños de pingüinos.

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

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.

II. Fundamentos básicos de la Estadística

2.1 Objetivo de estudio

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.

2.2 Población de estudio

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.

2.3 Muestra

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.

2.4 Unidad de análisis

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.

III. Variables

3.1 Tipos de variables:

IV. Manejo de base de datos

#Agregar el conjunto de datos:
pinguinos <- read.csv("pinguinos.csv", sep = ",")
head(pinguinos)

V. Tablas de frecuencia (Para cada variable)

5.1 Tablas de frecuencia para variables cuantitativas

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

VI. Representación gráfica de datos.

6.1 Gráficos estadísticos para variables cualitativa

6.1.1 Gráficos de Barras

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

6.1.2 Gráfico Circular

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)

Gráficos estadísticos para variables cuantitativas

6.2.1 Histogramas

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()

6.2.2 Gráfico de densidad

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")

6.2.3 Gráficos de cajas

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())

6.2.4 Gráficos Lineales

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()

VII. Medidas estadísticas de tendencia

7.1 Caso Pinguinos

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.

Datos Masa corporal del pingüino:

# Masa corporal
body_mass_g<- c(3750,3800,3250,3450,3650,3625,4675,3475,4250,3300,3700,3200,3800,4400,3700)

7.2 Media aritmética

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
  • Interpretación: La Masa Corporal de los pinguinos promedio es: 3735 IMC.

7.3 Mediana

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

  • Interpretación: El 50% de los pinguinos de distintas especies su masa coorporal máxima es 3700 IMC. El otro 50% (la mitad) su valor mínimo es 3700 IMC.

7.4 Moda

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
  • Interpretación: La masas cooporales de las distintas especies más frecuentes (que más se repiten) son 3700 y 3800 años respectivamente.

7.5 Medidad de Variabilidad o Disperción

Rango

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

Varianza

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

Desviación estándar

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.

Coeficiente de variación

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
  • Interpretación: como el CV es 11.27 ≤ 30%, entonces la distribución de la masa coorporal de las distintas especies es homogénea y la media es representativa.

VIII. Medidas estadísticas de posición

Categorizar en 4 grupos la masa corporal de los pinguinos

quantile(pinguinos_sin_na$body_mass_g)
##   0%  25%  50%  75% 100% 
## 2700 3550 4050 4750 6300

Cuartil 1 \((Q_1)\)

  • interpretación:El IMC es 3550; El 25% de los pinguinos de distintas especies , tienen un IMC máximo de 3550.

Cuartil 2 \((Q_2)\)

  • interpretación:El IMC es 4050; El 50% de los pinguinos de distintas especies , tienen un IMC máximo de 4050.

Cuartil 3 \((Q_3)\)

  • interpretación:El IMC es 4750; El 75% de los pinguinos de distintas especies , tienen un IMC máximo de 4750.

IX. Manejo de datos Missing

<span style=“background-color:yellow ; color:#000;> #### 9.1 Caso Starbucks

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)

9.2 Verificación de valores perdidos

# Verificar columnas con missing

which(colSums(is.na(starbucks))!=0)
## named integer(0)

Realizar el análisis utilizando librerias

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)

9.4 Aplicando Técnicas de Imputación

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)
  • Utilizando otra librería para imputar datos
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)
  • Imputación utilizando vecinos más cercanos
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)

X. Manejo de valores outliers

#### 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

10.1 Detección de outtliers univariado - gráfica

El análisis solo se realiza para variable cuantitativas

Gráfico de cajas

<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

Correción

Eliminar los atípicos

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)

Correción

Eliminar los atípicos

starbucks_sin_atipicos_edad <- starbucks[!starbucks$Edad %in% outliers_det_starbucks_edad,]
starbucks_sin_atipicos_edad
  • Para confirmar vamos a realizar un gráfico de cajas con la nueva data
boxplot(starbucks_sin_atipicos_edad$Edad)

Gráfico de cajas y bigotes para la variable Días por mes en Starbucks

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

Correción

Eliminar los atípicos

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

Correción

Eliminar los atípicos

starbucks_sin_atipicos_cafepordia <- starbucks[!starbucks$Tazas.de.café.por.día %in% outliers_det_starbucks_cafepordia,]
starbucks_sin_atipicos_cafepordia
  • Para confirmar vamos a realizar un gráfico de cajas con la nueva data
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"))

  • Para todo
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

Correción

Eliminar los atípicos

starbucks_sin_atipicos_ingresos <- starbucks[!starbucks$Ingresos....1000. %in% outliers_det_starbucks_ingresos,]
starbucks_sin_atipicos_ingresos
  • Para confirmar vamos a realizar un gráfico de cajas con la nueva data
boxplot(starbucks_sin_atipicos_ingresos$Ingresos....1000.)

XI. Transformación de variables

11.1 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.

<span style=“background-color:yellow ; color:#000> #### Variable Cantidad de tarjetas prepagada

# Original
hist(starbucks$Cantidad.de.tarjeta.prepagada...., 12)

  • Para sacar la raiz cuadrada, simplemente se puede utilizar la función sqrt
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

Graficamente

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

Graficamente

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

Graficamente

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

Graficamente

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

Graficamente

hist(sqrt(starbucks$Ingresos....1000.))

11.2 Transformación exponencial

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

  • función exp()
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

  • función exp()
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

  • función exp()
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

  • función exp()
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)

11.3 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)

<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

Graficamente

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

Graficamente

hist(log(starbucks$Cantidad.de.tarjeta.prepagada...., base=2))

Comparación de transformaciones

#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

Graficamente

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

Graficamente

hist(log(starbucks$Edad, base=2))

Comparación de transformaciones

#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

Graficamente

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

Graficamente

hist(log(starbucks$Días.por.mes.en.Starbucks, base=2))

Comparación de transformaciones

#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

Graficamente

hist(log(starbucks$Tazas.de.café.por.día, base=2))

Comparación de transformaciones

#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

Graficamente

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

Graficamente

hist(log(starbucks$Ingresos....1000., base=2))

Comparación de transformaciones

#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.

11.3 Gráfica general

library(PerformanceAnalytics)
chart.Correlation(cor(starbucks[,1:5]), histogram = TRUE)

XII. Estandarización y normalización de variables

## 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:

Aplicar estandarización Z a la variable Cantidad de tarjetas prepagada de manera manual
Método 1: Por partes
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
Método 2: Directo
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
Método 3: Apoyarse en las funciones de R

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])

Gráfico con los valores de las variables transformadas

boxplot(starbucks_cuanti_scale)

Aplicar estandarización Z a la variable Edad
Método 1: Por partes
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
Método 2: Directo
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
Método 3: Apoyarse en las funciones de R

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])

Gráfico con los valores de las variables transformadas

boxplot(starbucks_cuanti_scale_edad)

Aplicar estandarización Z a la variable Días por mes
Método 1: Por partes
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
Método 2: Directo
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
Método 3: Apoyarse en las funciones de R

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])

Gráfico con los valores de las variables transformadas

boxplot(starbucks_cuanti_scale_diaspormes)

Aplicar estandarización Z a la variable tazas de café por día
Método 1: Por partes
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
Método 2: Directo
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
Método 3: Apoyarse en las funciones de R

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])

Gráfico con los valores de las variables transformadas

boxplot(starbucks_cuanti_scale_tazapordia)

Aplicar estandarización Z a la variable Ingresos
Método 1: Por partes
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
Método 2: Directo
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
Método 3: Apoyarse en las funciones de R

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])

Gráfico con los valores de las variables transformadas

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

Método 1:
###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
Método 2: Función
###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
  • Aplicando a todo el caso (las cuantitativas) la función rescale solo permite aplicarse a vectores, no es posible directamente apicar al data frame.
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]) 
Aplicar estandarización Z a la variable Días por mes y tazas de café por día
Método 1:
###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
Método 2: Función
###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
  • Aplicando a todo el caso (las cuantitativas) la función rescale solo permite aplicarse a vectores, no es posible directamente apicar al data frame.
library(caret)
pre_procesamiento<-preProcess(starbucks[,3:4]) # Así por defecto muestra la est. Z
predict(pre_procesamiento, starbucks[,3:4]) 
Aplicar estandarización Z a la variable ingresos
Método 1:
###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
Método 2: Función
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
  • Aplicando a todo el caso (las cuantitativas) la función rescale solo permite aplicarse a vectores, no es posible directamente apicar al data frame.
library(caret)
pre_procesamiento<-preProcess(starbucks[,4:5]) # Así por defecto muestra la est. Z
predict(pre_procesamiento, starbucks[,4:5]) 

XIII. Modelamiento predictivo

#### Modelo de regresión:

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.

Coeficiente de correlación

# 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\)

Resumen: Regresión lineal simple

#### 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.

\[ 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)

Gráfico de columnas para variable dependiente (Días por meses en starbucks e Ingresos)

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)

XIV. Regresión logistica

n <- 100 
starbucks_cantidad_tarjeta_prepagadas <- round(rnorm(n, mean = 7, sd = 1.5), 2)
 # Variable independiente: Cantidad de tarjetas prepagadas de 7% con una desviación de 1.5%

Simular una relación entre cantidad de tarjeta prepagada y ingresos

Supongamos que la probabilidad de una cantidad de tarjeta prepagada aumenta en 10% por cada 1% de aumento en ingresos

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

Probabilidades predichas

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