Evidencia de Aprendizaje 2 - Modelamiento con Distribuciones de Probabilidad

Autores/as

Sharon Camacho Guzmán

Jaime Gutiérrez, Msc., PhD (Docente en Ciencia de Datos)

Fecha de publicación

10 de abril de 2025

Resumen

Esta evidencia aplica distribuciones de probabilidad para modelar variables cualitativas y cuantitativas seleccionadas del dataset de ventas retail. Se utiliza binomial y Poisson para variables cualitativas, y la distribución normal con intervalo de confianza para variables cuantitativas, con el objetivo de sustentar decisiones con base estadística.

Palabras clave: distribuciones de probabilidad, binomial, Poisson, normal, retail, modelamiento.

Código
knitr::opts_chunk$set(warning = FALSE, message = FALSE)
# Instalar si no están
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
if (!requireNamespace("dplyr", quietly = TRUE)) install.packages("dplyr")
if (!requireNamespace("DT", quietly = TRUE)) install.packages("DT")
if (!requireNamespace("googledrive", quietly = TRUE)) install.packages("googledrive")
if (!requireNamespace("tidyr", quietly = TRUE)) install.packages("tidyr")
if (!requireNamespace("kableExtra", quietly = TRUE)) install.packages("kableExtra")
if (!requireNamespace("purrr", quietly = TRUE)) install.packages("purrr")
Código
library(googledrive)
library(readr)      # para read_csv
library(ggplot2)
library(dplyr)
library(DT)
library(tidyr)
library(kableExtra)
library(purrr)

1 1. Carga de Datos desde Google Drive

El dataset utilizado en este análisis se obtuvo de Kaggle y se ha almacenado en Google Drive para facilitar su acceso y procesamiento.

Código
# ID del archivo en Google Drive
file_id <- "135RWVsM2YO_XahdI0LKYmg5oDrokGnfB"

# Descargar el archivo
drive_download(as_id(file_id), path = "data2.csv", overwrite = TRUE)

# Cargar el CSV en un data frame
df <- read_csv("data2.csv", 
    col_types = cols(`Row ID` = col_integer(), 
        `Order Date` = col_date(format = "%d/%m/%Y"), 
        `Ship Date` = col_date(format = "%d/%m/%Y"), 
        `Postal Code` = col_character()))

# Verificación de carga correcta
if (nrow(df) > 0) {
  cat("Datos cargados correctamente. Número de registros:", nrow(df), "\n")
} else {
  cat("⚠️ Error en la carga de datos.")
}
Datos cargados correctamente. Número de registros: 9800 

2 2. Naturaleza de las Variables

Código
library(DT)
nature <- data.frame(Variable = names(df), Tipo = sapply(df, class))
datatable(nature)

3 3. Modelamiento de Variables Cualitativas

3.1 3.1 Tabla de Contingencia

Código
# Tabla de contingencia entre Segment y Category
tabla_contingencia <- table(df$Segment, df$Category)

print("Tabla de Contingencia Absoluta:")
[1] "Tabla de Contingencia Absoluta:"
Código
tabla_contingencia
             
              Furniture Office Supplies Technology
  Consumer         1093            3072        936
  Corporate         628            1783        542
  Home Office       357            1054        335

3.1.1 3.1.1 Probabilidad Conjunta

Código
# Tabla con porcentajes totales
tabla_total <- round(prop.table(tabla_contingencia) * 100,2)

print("Proporciones Totales:")
[1] "Proporciones Totales:"
Código
round(tabla_total, 3)
             
              Furniture Office Supplies Technology
  Consumer        11.15           31.35       9.55
  Corporate        6.41           18.19       5.53
  Home Office      3.64           10.76       3.42

Con esto vemos que el mercado está impulsado principalmente por el segmento Consumer, especialmente en la categoría de Office Supplies (31%). Las estrategias de marketing, stock o campañas de fidelización podrían centrarse en ese segmento y categoría para maximizar impacto. Sin embargo, Corporate representa una oportunidad relevante, y Home Office, aunque más pequeño, tiene patrones consistentes que podrían explotarse con nichos específicos.

Fórmula general:

\[P(\text{Segmento} \cap \text{Categoría}) = \frac{f_{ij}}{n}\]

Las probabilidades conjuntas calculan la probabilidad de que un registro pertenezca al mismo tiempo a cierto segmento y a cierta categoría., es decir, la proporción que representa cada combinación específica de segmento y categoría sobre el total de registros.

El numerador representa la frecuencia absoluta de la celda correspondiente a la intersección del segmento i y la categoría j. El denoninador es el total general de observaciones en la tabla.

En este caso se tienen las siguientes probabilidades conjuntas: \[P(\text{Consumer} \cap \text{Furniture}) = \frac{1093}{9800} \approx 0.1115\]

\[P(\text{Consumer} \cap \text{Office Supplies}) = \frac{3072}{9800} \approx 0.3135\]

\[P(\text{Consumer} \cap \text{Technology}) = \frac{936}{9800} \approx 0.0955\]

\[P(\text{Corporate} \cap \text{Furniture}) = \frac{628}{9800} \approx 0.0641\]

\[P(\text{Corporate} \cap \text{Office Supplies}) = \frac{1783}{9800} \approx 0.1819\] \[P(\text{Corporate} \cap \text{Technology}) = \frac{542}{9800} \approx 0.0553\] \[P(\text{Home Office} \cap \text{Furniture}) = \frac{357}{9800} \approx 0.0364\] \[P(\text{Home Office} \cap \text{Office Supplies}) = \frac{1054}{9800} \approx 0.1076\] \[P(\text{Home Office} \cap \text{Technology}) = \frac{335}{9800} \approx 0.0342\]

3.1.2 3.1.2 Probabilidades Condicionales por Fila

Código
# Tabla con porcentajes por fila
tabla_fila <- round(prop.table(tabla_contingencia, margin = 1) * 100,2)

print("Proporciones Condicionales por Fila:")
[1] "Proporciones Condicionales por Fila:"
Código
round(tabla_fila, 3)
             
              Furniture Office Supplies Technology
  Consumer        21.43           60.22      18.35
  Corporate       21.27           60.38      18.35
  Home Office     20.45           60.37      19.19

Fórmula General

\[P(\text{Categoría} \mid \text{Segmento}) = \frac{f_{ij}}{f_{i\cdot}}\]

Para Consumer

\[P(\text{Furniture} \mid \text{Consumer}) = \frac{1093}{5101} \approx 0.2143\]

\[P(\text{Office Supplies} \mid \text{Consumer}) = \frac{3072}{5101} \approx 0.6023\]

\[P(\text{Technology} \mid \text{Consumer}) = \frac{936}{5101} \approx 0.1834\]

Dentro del segmento Consumer, el 60% de las compras corresponden a Office Supplies, seguido de Furniture (21%) y Technology (18%). Estas probabilidades suman 1 porque describen cómo se distribuyen las categorías dentro del segmento.

Para Corporate

\[P(\text{Furniture} \mid \text{Corporate}) = \frac{628}{2953} \approx 0.2126\] \[P(\text{Office Supplies} \mid \text{Corporate}) = \frac{1783}{2953} \approx 0.6037\] \[P(\text{Technology} \mid \text{Corporate}) = \frac{542}{2953} \approx 0.1836\]

Interpretación

Al igual que en Consumer, en Corporate predomina Office Supplies con un 60%, seguido por Furniture y Technology.

Para Home Office

\[P(\text{Furniture} \mid \text{Home Office}) = \frac{357}{1746} \approx 0.2044\] \[P(\text{Office Supplies} \mid \text{Home Office}) = \frac{1054}{1746} \approx 0.6037\] \[P(\text{Technology} \mid \text{Home Office}) = \frac{335}{1746} \approx 0.1919\]

Interpretación

El patrón se repite también en Home Office, donde Office Supplies representa el 60% de las compras. Esto puede sugerir una tendencia general de preferencia por esta categoría en todos los segmentos.

3.1.3 3.1.3 Probabilidades Condicionales por Columna

Código
# Tabla con porcentajes por columna (condicionales)
tabla_columna <- round(prop.table(tabla_contingencia, margin = 2) * 100,2)

print("Proporciones Condicionales por Columna:")
[1] "Proporciones Condicionales por Columna:"
Código
round(tabla_columna, 3)
             
              Furniture Office Supplies Technology
  Consumer        52.60           51.99      51.63
  Corporate       30.22           30.17      29.90
  Home Office     17.18           17.84      18.48

Fórmula General

\[P(\text{Segmento} \mid \text{Categoría}) = \frac{f_{ij}}{f_{\cdot j}}\]

Para Furniture:

\[P(\text{Consumer} \mid \text{Furniture}) = \frac{1093}{2078} \approx 0.5261\]\[P(\text{Corporate} \mid \text{Furniture}) = \frac{628}{2078} \approx 0.3022\]\[P(\text{Home Office} \mid \text{Furniture}) = \frac{357}{2078} \approx 0.1717\]

De todos los registros en la categoría Furniture, el 52.6% corresponde a Consumer, lo que indica que más de la mitad de estas compras provienen de ese segmento.

Para Office Supplies:

\[P(\text{Consumer} \mid \text{Office Supplies}) = \frac{3072}{5909} \approx 0.5200\] \[P(\text{Corporate} \mid \text{Office Supplies}) = \frac{1783}{5909} \approx 0.3017\] \[P(\text{Home Office} \mid \text{Office Supplies}) = \frac{1054}{5909} \approx 0.1783\]

Similar a Furniture, la mayoría de las compras de Office Supplies son realizadas por Consumer (52%), mientras que Corporate y Home Office participan en menor proporción.

Para Technology:

\[P(\text{Consumer} \mid \text{Technology}) = \frac{936}{1813} \approx 0.5163\]

\[P(\text{Corporate} \mid \text{Technology}) = \frac{542}{1813} \approx 0.2989\] \[P(\text{Home Office} \mid \text{Technology}) = \frac{335}{1813} \approx 0.1848\]

También en Technology se mantiene la tendencia: Consumer es el principal contribuyente (51.6%), seguido de Corporate y Home Office.


3.2 3.2 Test de independencia de Chi-cuadrado:

Para determinar si existe una relación entre el tipo de cliente y la categoría de producto, se aplicó un test chi-cuadrado de independencia. Este test permite evaluar si dos variables categóricas están asociadas o si, por el contrario, son independientes.

Las hipótesis formuladas fueron las siguientes:

  • La hipótesis nula (H₀) plantea que no existe relación entre las variables, es decir, que la categoría del producto es independiente del segmento de cliente.

  • La hipótesis alternativa (H₁) sostiene que sí existe una dependencia entre ambas variables.

El resultado obtenido fue un valor-p de 0.8865, significativamente mayor al umbral común de significancia (0.05). Esto indica que no se puede rechazar la hipótesis nula.

De esta manera, no se encontró evidencia estadísticamente significativa para afirmar que existe una asociación entre el segmento de cliente y la categoría del producto. En otras palabras, la distribución de las categorías de productos parece ser independiente del tipo de cliente.

Código
chisq.test(tabla_contingencia)

    Pearson's Chi-squared test

data:  tabla_contingencia
X-squared = 1.1483, df = 4, p-value = 0.8865

3.3 3.3 Distribución Binomial

Se consideró como “éxito” que un pedido provenga del segmento Consumer porque, según el análisis de frecuencias relativas, este es el segmento con mayor representación dentro del dataset. Identificar este comportamiento nos permite evaluar la consistencia de una muestra con respecto a los patrones históricos de compra.

De acuerdo con los datos, aproximadamente el 60% de los pedidos pertenecen a este segmento. Por tanto, si seleccionamos aleatoriamente 10 pedidos, podemos estimar la probabilidad de que exactamente 6 de ellos sean del tipo Consumer.

¿Cuál es la probabilidad de que 6 de 10 pedidos sean del segmento Consumer, si la probabilidad de que un pedido sea Consumer es 0.6?

Código
dbinom(6, size = 10, prob = 0.6)
[1] 0.2508227

Existe una probabilidad del 25.08% de que 6 de cada 10 pedidos pertenezcan al segmento Consumer.

3.4 3.4 Distribución Poisson

En el contexto del negocio, observamos que se realizan 6 ventas por día., según el valor de la mediana.

Código
library(dplyr)
ventas_por_dia <- df %>%
  group_by(`Order Date`) %>%
  summarise(n_ventas = n())

mean(ventas_por_dia$n_ventas)
[1] 7.96748
Código
median(ventas_por_dia$n_ventas)
[1] 6

Si se tienen 6 ventas por día, ¿cuál es la probabilidad de que hoy se hagan exactamente 3?

Código
dpois(3, lambda = 6)
[1] 0.08923508

Existe una probabilidad del 8.92% de que se realicen exactamente 3 ventas en un día, si el promedio diario es de 6. Esto puede interpretarse como un evento poco probable, lo cual sugiere que una jornada con solo 3 ventas estaría por debajo de lo esperado y podría requerir revisión en términos de rendimiento o factores externos que hayan afectado la demanda.

4 4. Modelamiento de Variables Cuantitativas

4.1 4.1 Estadísticos y desviación estándar

La media de las ventas es de 231, mientras que la mediana es considerablemente menor, 54.5. Aunque muestra alta concentración de ventas en valores bajos, existen algunas ventas de valor excepcionalmente alto que elevan la media y representan valores atípicos como se ve en el boxplot. El valor mínimo registrado es 0.444, y el máximo es 22,638, con una desviación estándar de 627, lo cual sugiere una gran variabilidad en los datos.

Código
summary(df$Sales)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
    0.444    17.248    54.490   230.769   210.605 22638.480 

4.2 4.2 Intervalo de confianza del 95% para la media de ventas

A continuación, se calcula el intervalo de confianza del 95% para la media de ventas. Este valor nos indica el rango dentro del cual se espera que esté la media poblacional con un 95% de certeza, lo cual es fundamental para la toma de decisiones basada en evidencia.

Código
t.test(df$Sales, conf.level = 0.95)

    One Sample t-test

data:  df$Sales
t = 36.456, df = 9799, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 218.3607 243.1774
sample estimates:
mean of x 
 230.7691 

Con un nivel de confianza del 95%, el valor real de la media poblacional de ventas se encuentra comprendido entre 218.36 USD y 243.18USD. Además, el valor de p < 2.2e-16 indica que hay evidencia estadísticamente significativa para afirmar que la media de ventas es diferente de cero

4.3 4.3 Gráfico de distribución normal ajustada

La variable presenta una alta asimetría positiva, donde la mayoría de los datos se concentran en valores bajos, mientras que existen algunos valores extremos (outliers) que alcanzan montos significativamente elevados.

Código
ggplot(df, aes(x = Sales)) +
  geom_histogram(aes(y = ..density..), bins = 40, fill = "steelblue", color = "black") +
  stat_function(fun = dnorm, args = list(mean = mean(df$Sales), sd = sd(df$Sales)), color = "red") +
  labs(title = "Distribución Normal Ajustada - Ventas") +
  theme_minimal()

4.4 4.4 Verificación de normalidad

Debido a que el dataset cuenta con más de 5000 datos, se aplica la prueba de Kolmogorov-Smirnov, para verificar estadísticamente si la variable Sales sigue una distribución normal. Un valor p mayor a 0.05 indica que no hay evidencia suficiente para rechazar la hipótesis de nor

Código
# Prueba de normalidad con Kolmogorov-Smirnov
ks.test(df$Sales, "pnorm", mean(df$Sales), sd(df$Sales))

    Asymptotic one-sample Kolmogorov-Smirnov test

data:  df$Sales
D = 0.35663, p-value < 2.2e-16
alternative hypothesis: two-sided

El resultado de la prueba de Kolmogorov-Smirnov fue un valor D = 0.3566 con un p-valor < 2.2e-16, lo cual indica que existe una diferencia significativa entre la distribución empírica de la variable Sales y la distribución normal teórica.

Código
# Visualización Q-Q plot
qqnorm(df$Sales)
qqline(df$Sales, col = "red")

El Q-Q plot muestra que la mayoría de los valores de la variable Sales se ajustan razonablemente a la línea teórica de la distribución normal, especialmente en la parte central del gráfico. Sin embargo, se observan colas, lo que indica la presencia de outliers y una distribución sesgada a la derecha, como lo vimos anteriormente.

Aunque la prueba de Kolmogorov-Smirnov rechaza la normalidad (p < 0.05), y el Q-Q plot revela outliers en la cola superior, la distribución de Sales puede considerarse aproximadamente normal para fines analíticos, especialmente si se trabaja con medidas como la media y se acompaña de visualizaciones que evidencian la asimetría.

5 5. Conclusiones

El análisis de frecuencia revela que el segmento Consumer concentra la mayor proporción de pedidos. Esto sugiere una oportunidad clara para priorizar este grupo en campañas de marketing, promociones y gestión de inventario.

Además, la probabilidad de obtener esta distribución en una muestra aleatoria de 10 pedidos es estadísticamente significativa (25.08% para 6 pedidos provenientes del segmento Consumer), lo cual respalda decisiones comerciales informadas basadas en muestreo probabilístico.

La categoría Office Supplies es la más demandada, representa más del 60% de las ventas, independientemente del segmento, consolidándose como el principal motor de ingresos.

Particularmente, la combinación Consumer - Office Supplies representa más del 30% de las transacciones totales, lo que sugiere oportunidades tácticas como promociones cruzadas, bundles específicos y estrategias de fidelización centradas en este binomio.

El análisis probabilístico indica que el número promedio de ventas diarias es de 6, mientras que eventos de baja demanda (como días con solo 3 ventas) tienen una probabilidad menor al 9%.

Con un intervalo de confianza del 95% entre USD 218.36 y 243.18, se define un rango esperable para el valor medio diario de ventas. Este indicador puede ser integrado en modelos de proyección financiera, definición de metas comerciales y monitoreo de desvíos a lo largo del tiempo.

Aunque la variable Sales muestra una asimetría positiva significativa y presencia de valores atípicos, se observa que puede ser tratada como aproximadamente normal para efectos de análisis de tendencia central y planificación financiera.

Cómo citar

BibTeX
@online{camacho_guzmán2025,
  author = {Camacho Guzmán, Sharon and Gutiérrez, Msc., PhD (Docente en
    Ciencia de Datos), Jaime},
  title = {Evidencia de Aprendizaje 2 - Modelamiento con Distribuciones
    de Probabilidad},
  date = {2025-04-10},
  langid = {es},
  abstract = {Esta evidencia aplica distribuciones de probabilidad para
    modelar variables cualitativas y cuantitativas seleccionadas del
    dataset de ventas retail. Se utiliza binomial y Poisson para
    variables cualitativas, y la distribución normal con intervalo de
    confianza para variables cuantitativas, con el objetivo de sustentar
    decisiones con base estadística. **Palabras clave:** distribuciones
    de probabilidad, binomial, Poisson, normal, retail, modelamiento.}
}
Por favor, cita este trabajo como:
Camacho Guzmán, Sharon, and Jaime Gutiérrez, Msc., PhD (Docente en Ciencia de Datos). 2025. “Evidencia de Aprendizaje 2 - Modelamiento con Distribuciones de Probabilidad.” April 10, 2025.