knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)

1. Contextualización de la base de datos y variables

La base datos_negocios_var_9_clientes.csv contiene información de 100 clientes de un negocio.
Las variables permiten caracterizar a los clientes en función de su categoría, gasto, edad y número de visitas.

Variables incluidas:

Se crea además una variable dicotómica Es_Frecuente: 1 si el cliente es “Frecuente”, 0 en otro caso.

library(readr)
library(dplyr)
library(ggplot2)
# Cargar datos
df <- read_csv("datos_negocios_var_9_clientes (2).csv")
# Variable binaria
df <- df %>%
  mutate(Es_Frecuente = ifelse(tolower(trimws(Categoria_Cliente))=="frecuente", 1, 0))

2. Características generales de la base de datos

dim(df)      # Número de filas y columnas
## [1] 100   5
names(df)    # Nombres de variables
## [1] "Categoria_Cliente" "Gasto_Mensual"     "Edad"             
## [4] "Visitas_Mensuales" "Es_Frecuente"
str(df)      # Tipos de datos
## tibble [100 × 5] (S3: tbl_df/tbl/data.frame)
##  $ Categoria_Cliente: chr [1:100] "Frecuente" "Nuevo" "Frecuente" "Ocasional" ...
##  $ Gasto_Mensual    : num [1:100] 2048 2188 1991 182 2486 ...
##  $ Edad             : num [1:100] 45 74 75 19 59 53 22 64 20 32 ...
##  $ Visitas_Mensuales: num [1:100] 18 16 26 24 23 28 14 29 12 23 ...
##  $ Es_Frecuente     : num [1:100] 1 0 1 0 0 1 0 0 0 1 ...

Interpretación:

La base tiene 100 registros y 4 variables principales. Tres son numéricas (Gasto_Mensual, Edad, Visitas_Mensuales) y una categórica (Categoria_Cliente).

3. Revisión de valores faltantes (NA)

colSums(is.na(df))
## Categoria_Cliente     Gasto_Mensual              Edad Visitas_Mensuales 
##                 0                 0                 0                 0 
##      Es_Frecuente 
##                 0

Interpretación:

No se identifican valores faltantes, lo cual asegura un análisis sin imputación previa.

4. Análisis de variables numéricas

Resumen de Edad

summary(df$Edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   18.00   29.00   47.00   46.21   64.00   75.00
summary(select_if(df, is.numeric))
##  Gasto_Mensual         Edad       Visitas_Mensuales  Es_Frecuente 
##  Min.   : 107.4   Min.   :18.00   Min.   : 1.00     Min.   :0.00  
##  1st Qu.:1155.6   1st Qu.:29.00   1st Qu.:10.75     1st Qu.:0.00  
##  Median :1817.3   Median :47.00   Median :17.50     Median :0.00  
##  Mean   :1738.9   Mean   :46.21   Mean   :17.09     Mean   :0.38  
##  3rd Qu.:2393.2   3rd Qu.:64.00   3rd Qu.:24.25     3rd Qu.:1.00  
##  Max.   :3073.0   Max.   :75.00   Max.   :30.00     Max.   :1.00

Interpretación:

Histogramas

# Histogramas simples
ggplot(df, aes(x=Edad)) + geom_histogram(bins=15, fill="skyblue", color="black") +
  labs(title="Histograma de Edad", x="Edad", y="Frecuencia")

ggplot(df, aes(x=Gasto_Mensual)) + geom_histogram(bins=15, fill="lightgreen", color="black") +
  labs(title="Histograma de Gasto Mensual", x="Gasto Mensual", y="Frecuencia")

ggplot(df, aes(x=Visitas_Mensuales)) + geom_histogram(bins=15, fill="lightpink", color="black") +
  labs(title="Histograma de Visitas Mensuales", x="Visitas Mensuales", y="Frecuencia")

# Histogramas por categoría
ggplot(df, aes(x=Edad, fill=Categoria_Cliente)) +
  geom_histogram(bins=15, alpha=0.6, position="identity") +
  labs(title="Distribución de Edad por Categoría de Cliente")

ggplot(df, aes(x=Gasto_Mensual, fill=Categoria_Cliente)) +
  geom_histogram(bins=15, alpha=0.6, position="identity") +
  labs(title="Distribución de Gasto Mensual por Categoría de Cliente")

ggplot(df, aes(x=Visitas_Mensuales, fill=Categoria_Cliente)) +
  geom_histogram(bins=15, alpha=0.6, position="identity") +
  labs(title="Distribución de Visitas Mensuales por Categoría de Cliente")

Interpretación general:

Bloxpots

# Boxplots simples
ggplot(df, aes(y=Edad)) + geom_boxplot(fill="orange") + labs(title="Boxplot de Edad")

ggplot(df, aes(y=Gasto_Mensual)) + geom_boxplot(fill="lightblue") + labs(title="Boxplot de Gasto Mensual")

ggplot(df, aes(y=Visitas_Mensuales)) + geom_boxplot(fill="lightcoral") + labs(title="Boxplot de Visitas Mensuales")

# Boxplots por categoría
ggplot(df, aes(x=Categoria_Cliente, y=Edad, fill=Categoria_Cliente)) + geom_boxplot() +
  labs(title="Edad según Categoría de Cliente")

ggplot(df, aes(x=Categoria_Cliente, y=Gasto_Mensual, fill=Categoria_Cliente)) + geom_boxplot() +
  labs(title="Gasto Mensual según Categoría de Cliente")

ggplot(df, aes(x=Categoria_Cliente, y=Visitas_Mensuales, fill=Categoria_Cliente)) + geom_boxplot() +
  labs(title="Visitas Mensuales según Categoría de Cliente")

Interpretación:

5. Análisis de variables categóricas

Frecuencias

table(df$Categoria_Cliente)
## 
## Frecuente     Nuevo Ocasional 
##        38        32        30

Gráfico de barras

ggplot(df, aes(x=Categoria_Cliente)) +
  geom_bar(fill="tomato") +
  labs(title="Frecuencia de clientes por categoría")

Interpretación:

La categoría Frecuente domina en el conjunto de datos, seguida de otras con menor participación.

6. Distribuciones muestrales

6.1 Media muestral (Gasto Mensual)

set.seed(123)
media_pob <- mean(df$Gasto_Mensual, na.rm = TRUE)
sd_pob <- sd(df$Gasto_Mensual, na.rm = TRUE)
n <- 30
N <- nrow(df)
SE <- (sd_pob / sqrt(n)) * sqrt((N - n) / (N - 1))
# Probabilidades
c <- 1900; a <- 1600; b <- 1800
p_mayor_c <- 1 - pnorm(c, mean = media_pob, sd = SE)
p_entre <- pnorm(b, mean = media_pob, sd = SE) - pnorm(a, mean = media_pob, sd = SE)
# IC 95%
z <- qnorm(0.975)
IC_media <- c(media_pob - z*SE, media_pob + z*SE)
data.frame(
  Media = round(media_pob,2),
  SD = round(sd_pob,2),
  ErrorEstandar = round(SE,4),
  P_Xbar_mayor_1900 = round(p_mayor_c,4),
  P_entre_1600y1800 = round(p_entre,4),
  IC_95 = paste0("(", round(IC_media[1],2), ", ", round(IC_media[2],2), ")")
)
##     Media     SD ErrorEstandar P_Xbar_mayor_1900 P_entre_1600y1800
## 1 1738.95 825.42      126.7202            0.1019            0.5486
##                IC_95
## 1 (1490.58, 1987.31)

Interpretación:

La media poblacional del gasto mensual se ubica alrededor de r round(media_pob,2). La probabilidad de que una muestra de 30 clientes supere los 1900 en promedio es muy baja, lo que confirma que esos valores altos corresponden a pocos outliers.

6.2 Proporción muestral (Clientes Premium)

df <- df %>%
  mutate(Cliente_Premium = ifelse(Categoria_Cliente == "Premium", 1, 0))
p_hat <- mean(df$Cliente_Premium)
SE_p <- sqrt((p_hat * (1 - p_hat)) / n) * sqrt((N - n) / (N - 1))
# Probabilidades
p_sup_30 <- 1 - pnorm(0.30, mean = p_hat, sd = SE_p)
p_entre_prop <- pnorm(0.35, mean = p_hat, sd = SE_p) - pnorm(0.20, mean = p_hat, sd = SE_p)
# IC 95%
IC_prop <- c(p_hat - z*SE_p, p_hat + z*SE_p)
data.frame(
  Proporcion = round(p_hat,4),
  ErrorEstandar = round(SE_p,4),
  P_phat_mayor_30 = round(p_sup_30,4),
  P_entre_20y35 = round(p_entre_prop,4),
  IC_95 = paste0("(", round(IC_prop[1],4), ", ", round(IC_prop[2],4), ")")
)
##   Proporcion ErrorEstandar P_phat_mayor_30 P_entre_20y35  IC_95
## 1          0             0               0             0 (0, 0)

Interpretación:

La proporción de clientes Premium en la base es cercana a r round(p_hat,2). Es poco probable que una muestra de 30 clientes supere el 30% de Premium.

7. Conclusiones