Trabajo final

¿Cómo impacta la experiencia del servicio en la lealtad del cliente hacia el restaurante?

Juliana Chaparro, Silvana Baron, Mariana Ricaurte, Sarah Gonzalez

2025-11-27

library(readxl)
library(dplyr)
library (ggplot2)
library(descriptr)
library(knitr)
library(modeest)
library(fdth)
library(plotrix)
library(flextable)
library(nortest)
EncuestaSitiosComida <- read_excel("EncuestaSitiosComida.xlsx")
base_trabajo<- EncuestaSitiosComida
set.seed(6094)
muestra_trabajo <- sample_n(base_trabajo, size = 290, replace = FALSE)

is.data.frame(muestra_trabajo)
## [1] TRUE

Sección A: Medidas descriptivas y tablas

Punto 1

Calcule e interprete media, mediana, moda, desviación estándar y coeficiente de variación para las variables cuantitativas. Interpretación esperada: Identificar concentraciones, asimetrías, atípicos y diferencias visibles entre variables. Comparar media vs mediana para inferir asimetría; usar CV para comparar dispersión relativa

Tiempo que lleva almorzando en el sitio (meses)

media_v2 <- mean(muestra_trabajo$V2_TiempoConoce_meses)
mediana_v2 <- median(muestra_trabajo$V2_TiempoConoce_meses)
moda_v2 <- mlv1(muestra_trabajo$V2_TiempoConoce_meses)
sd_v2 <- sd(muestra_trabajo$V2_TiempoConoce_meses)
cv_v2 <- (sd_v2/media_v2)*100

df_v2 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v2, mediana_v2, moda_v2, sd_v2, cv_v2)
)

flextable(df_v2)

Medida

Valor

Media

32.49310

Mediana

25.00000

Moda

16.22069

Desviación Estándar

25.05982

Coeficiente de Variación

77.12352

Calificación atención (1-4)

media_v5 <- mean(muestra_trabajo$V5_Atencion_1a4)
mediana_v5 <- median(muestra_trabajo$V5_Atencion_1a4)
moda_v5 <- mlv1(muestra_trabajo$V5_Atencion_1a4)
sd_v5 <- sd(muestra_trabajo$V5_Atencion_1a4)
cv_v5 <- (sd_v5/media_v5)*100

df_v5 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v5, mediana_v5, moda_v5, sd_v5, cv_v5)
)

flextable(df_v5)

Medida

Valor

Media

2.520690

Mediana

3.000000

Moda

2.696552

Desviación Estándar

1.052885

Coeficiente de Variación

41.769723

Número de visitas a la semana

media_v6 <- mean(muestra_trabajo$V6_VisitasSemana)
mediana_v6 <- median(muestra_trabajo$V6_VisitasSemana)
moda_v6 <- mlv1(muestra_trabajo$V6_VisitasSemana)
sd_v6 <- sd(muestra_trabajo$V6_VisitasSemana)
cv_v6 <- (sd_v6/media_v6)*100

df_v6 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v6, mediana_v6, moda_v6, sd_v6, cv_v6)
)

flextable(df_v6)

Medida

Valor

Media

3.055172

Mediana

3.000000

Moda

2.186207

Desviación Estándar

1.941281

Coeficiente de Variación

63.540799

Precio del almuerzo (en pesos)

media_v7 <- mean(muestra_trabajo$V7_PrecioAlmuerzo)
mediana_v7 <- median(muestra_trabajo$V7_PrecioAlmuerzo)
moda_v7 <- mlv1(muestra_trabajo$V7_PrecioAlmuerzo)
sd_v7 <- sd(muestra_trabajo$V7_PrecioAlmuerzo)
cv_v7 <- (sd_v7/media_v7)*100

df_v7 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v7, mediana_v7, moda_v7, sd_v7, cv_v7)
)

flextable(df_v7)

Medida

Valor

Media

22,466.38621

Mediana

21,956.00000

Moda

19,847.50345

Desviación Estándar

4,525.32804

Coeficiente de Variación

20.14266

Edad (en años)

media_v9 <- mean(muestra_trabajo$V9_Edad)
mediana_v9 <- median(muestra_trabajo$V9_Edad)
moda_v9 <- mlv1(muestra_trabajo$V9_Edad)
sd_v9 <- sd(muestra_trabajo$V9_Edad)
cv_v9 <- (sd_v9/media_v9)*100

df_v9 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v9, mediana_v9, moda_v9, sd_v9, cv_v9)
)

flextable(df_v9)

Medida

Valor

Media

38.56897

Mediana

38.00000

Moda

34.98621

Desviación Estándar

10.39116

Coeficiente de Variación

26.94176

Ingresos (en pesos)

media_v11 <- mean(muestra_trabajo$V11_Ingresos)
mediana_v11 <- median(muestra_trabajo$V11_Ingresos)
moda_v11 <- mlv1(muestra_trabajo$V11_Ingresos)
sd_v11 <- sd(muestra_trabajo$V11_Ingresos)
cv_v11 <- (sd_v11/media_v11)*100

df_v11 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v11, mediana_v11, moda_v11, sd_v11, cv_v11)
)

flextable(df_v11)

Medida

Valor

Media

3,884,943.59655

Mediana

3,153,659.00000

Moda

2,045,632.87586

Desviación Estándar

2,659,074.02900

Coeficiente de Variación

68.44563

Gastos (en pesos)

media_v12 <- mean(muestra_trabajo$V12_Gastos)
mediana_v12 <- median(muestra_trabajo$V12_Gastos)
moda_v12 <- mlv1(muestra_trabajo$V12_Gastos)
sd_v12 <- sd(muestra_trabajo$V12_Gastos)
cv_v12 <- (sd_v12/media_v12)*100

df_v12 <- data.frame(
  Medida = c("Media", "Mediana", "Moda", "Desviación Estándar", "Coeficiente de Variación"),
  Valor = c(media_v12, mediana_v12, moda_v12, sd_v12, cv_v12)
)

flextable(df_v12)

Medida

Valor

Media

2,359,804.87586

Mediana

1,857,592.50000

Moda

1,314,499.49655

Desviación Estándar

1,709,120.92349

Coeficiente de Variación

72.42637

Resumen

resumen_final <- data.frame(
  variable = c("Tiempo que lleva almorzando en el sitio (meses)",
               "Calificación atención (1-4)",
               "Número de visitas a la semana",
               "Precio del almuerzo (en pesos)",
               "Edad (en años)",
               "Ingresos (en pesos)",
               "Gastos (en pesos)"),

  media = c(media_v2, media_v5, media_v6, media_v7,
            media_v9, media_v11, media_v12),

  mediana = c(mediana_v2, mediana_v5, mediana_v6, mediana_v7,
              mediana_v9, mediana_v11, mediana_v12),

  moda = c(moda_v2, moda_v5, moda_v6, moda_v7,
           moda_v9, moda_v11, moda_v12),

  ds = c(sd_v2, sd_v5, sd_v6, sd_v7, 
               sd_v9, sd_v11, sd_v12),

  cv = c(cv_v2, cv_v5, cv_v6, cv_v7,
         cv_v9, cv_v11, cv_v12)
)

resumen_final[, 2:6] <- round(resumen_final[, 2:6], 2)
  
kable(resumen_final)
variable media mediana moda ds cv
Tiempo que lleva almorzando en el sitio (meses) 32.49 25 16.22 25.06 77.12
Calificación atención (1-4) 2.52 3 2.70 1.05 41.77
Número de visitas a la semana 3.06 3 2.19 1.94 63.54
Precio del almuerzo (en pesos) 22466.39 21956 19847.50 4525.33 20.14
Edad (en años) 38.57 38 34.99 10.39 26.94
Ingresos (en pesos) 3884943.60 3153659 2045632.88 2659074.03 68.45
Gastos (en pesos) 2359804.88 1857592 1314499.50 1709120.92 72.43

Las variables del precio del almuerzo, la calificación de atención, el peso, la estatura y la edad muestran medias y medianas relativamente cercanas, lo cual indica distribuciones más simétricas y sin valores extremos significativos. En cambio, variables como los ingresos, los gastos y el tiempo que llevan almorzando en el sitio presentan diferencias mayores entre lestas variables, lo que sugiere asimetrías positivas impulsadas por valores altos aislados. El coeficiente de variación confirma estas diferencias: mientras que variables fisiológicas como peso y estatura tienen CV bajos ya que se mantienen constantes luego de cierta edad demostrando alta homogeneidad. Por otro lado, variables monetarias, especialmente ingresos y gastos, exhiben niveles de dispersión muy elevados, lo que evidencia poblaciones heterogéneas y distribuciones más extendidas.

Punto 2

Calcule e interprete cuartiles, RIQ y percentiles 10, 50, 90 para todas las variables.

Tiempo que lleva almorzando en el sitio (meses)

cuartiles_v2 <- quantile(muestra_trabajo$V2_TiempoConoce_meses,probs = c(0.25, 0.50, 0.75))
riq_v2 <- IQR(muestra_trabajo$V2_TiempoConoce_meses)
percentiles_v2 <- quantile(muestra_trabajo$V2_TiempoConoce_meses, probs = c(0.10, 0.50, 0.90))

Calificación atención (1-4)

cuartiles_v5 <- quantile(muestra_trabajo$V5_Atencion_1a4,probs = c(0.25, 0.50, 0.75))
riq_v5 <- IQR(muestra_trabajo$V5_Atencion_1a4)
percentiles_v5 <- quantile(muestra_trabajo$V5_Atencion_1a4, probs = c(0.10, 0.50, 0.90))

Número de visitas a la semana

cuartiles_v6 <- quantile(muestra_trabajo$V6_VisitasSemana,probs  = c(0.25, 0.50, 0.75))
riq_v6 <- IQR(muestra_trabajo$V6_VisitasSemana)
percentiles_v6 <- quantile(muestra_trabajo$V6_VisitasSemana, probs = c(0.10, 0.50, 0.90))

Precio del almuerzo (en pesos)

cuartiles_v7 <- quantile(muestra_trabajo$V7_PrecioAlmuerzo, probs = c(0.25, 0.50, 0.75))
riq_v7 <- IQR(muestra_trabajo$V7_PrecioAlmuerzo)
percentiles_v7 <- quantile(muestra_trabajo$V7_PrecioAlmuerzo, probs = c(0.10, 0.50, 0.90))

Edad (en años)

cuartiles_v9 <- quantile(muestra_trabajo$V9_Edad, probs = c(0.25, 0.50, 0.75))
riq_v9 <- IQR(muestra_trabajo$V9_Edad)
percentiles_v9 <- quantile(muestra_trabajo$V9_Edad, probs = c(0.10, 0.50, 0.90))

Ingresos (en pesos)

cuartiles_v11 <- quantile(muestra_trabajo$V11_Ingresos, probs = c(0.25, 0.50, 0.75))
riq_v11 <- IQR(muestra_trabajo$V11_Ingresos)
percentiles_v11 <- quantile(muestra_trabajo$V11_Ingresos, probs = c(0.10, 0.50, 0.90))

Gastos (en pesos)

cuartiles_v12 <- quantile(muestra_trabajo$V12_Gastos, probs = c(0.25, 0.50, 0.75))
riq_v12 <- IQR(muestra_trabajo$V12_Gastos)
percentiles_v12 <- quantile(muestra_trabajo$V12_Gastos, probs = c(0.10, 0.50, 0.90))

Resumen

resumen_cuartiles <- data.frame(
  variable = c("Tiempo que lleva almorzando en el sitio (meses)",
               "Calificación atención (1-4)",
               "Número de visitas a la semana",
               "Precio del almuerzo (en pesos)",
               "Edad (en años)",
               "Ingresos (en pesos)",
               "Gastos (en pesos)"),
  
  Q1 = c(cuartiles_v2[1], cuartiles_v5[1], cuartiles_v6[1], cuartiles_v7[1],
         cuartiles_v9[1], cuartiles_v11[1], cuartiles_v12[1]),
  
  Q2 = c(cuartiles_v2[2], cuartiles_v5[2], cuartiles_v6[2], cuartiles_v7[2],
         cuartiles_v9[2], cuartiles_v11[2], cuartiles_v12[2]),
  
  Q3 = c(cuartiles_v2[3], cuartiles_v5[3], cuartiles_v6[3], cuartiles_v7[3], 
         cuartiles_v9[3], cuartiles_v11[3], cuartiles_v12[3]),

  RIQ = c(riq_v2, riq_v5, riq_v6, riq_v7,
          riq_v9, riq_v11, riq_v12),

  P10 = c(percentiles_v2[1], percentiles_v5[1], percentiles_v6[1], percentiles_v7[1], 
          percentiles_v9[1], percentiles_v11[1], percentiles_v12[1]),

  P50 = c(percentiles_v2[2], percentiles_v5[2], percentiles_v6[2], percentiles_v7[2],
          percentiles_v9[2], percentiles_v11[2], percentiles_v12[2]),

  P90 = c(percentiles_v2[3], percentiles_v5[3], percentiles_v6[3], percentiles_v7[3], 
          percentiles_v9[3], percentiles_v11[3], percentiles_v12[3])
)

kable(resumen_cuartiles)
variable Q1 Q2 Q3 RIQ P10 P50 P90
Tiempo que lleva almorzando en el sitio (meses) 15.00 25 41.75 26.75 10.0 25 66.0
Calificación atención (1-4) 2.00 3 3.00 1.00 1.0 3 4.0
Número de visitas a la semana 1.00 3 4.00 3.00 1.0 3 6.0
Precio del almuerzo (en pesos) 18827.25 21956 26194.75 7367.50 16633.1 21956 28778.6
Edad (en años) 31.00 38 45.00 14.00 26.9 38 54.0
Ingresos (en pesos) 2001808.75 3153659 4793630.25 2791821.50 1500000.0 3153659 7319765.4
Gastos (en pesos) 1219634.75 1857592 2951625.50 1731990.75 882277.8 1857592 4421303.6

En variables como el precio del almuerzo, la estatura, el peso y la calificación de atención, los cuartiles muestran una concentración alta de los valores en el centro, con rangos intercuartílicos estrechos y percentiles que avanzan de manera regular, lo que confirma baja variabilidad y ausencia de asimetrías marcadas. Por el contrario, variables como los ingresos, los gastos y el tiempo que llevan almorzando en el sitio presentan rangos intercuartílicos amplios y grandes diferencias entre percentiles extremos, lo que indica una alta dispersión y una distribución estirada hacia la derecha. Esto refuerza la presencia de valores altos atípicos y una heterogeneidad significativa dentro del grupo.

Punto 3

Construya e interprete una tabla de frecuencias (8 clases) para V7_PrecioAlmuerzo con frecuencias absolutas, relativas y acumuladas.

tabla_3 <- fdt(x =muestra_trabajo$V7_PrecioAlmuerzo,k =8)

kable(tabla_3)
Class limits f rf rf(%) cf cf(%)
[12868,15300) 9 0.0310345 3.103448 9 3.103448
[15300,17731) 41 0.1413793 14.137931 50 17.241379
[17731,20163) 56 0.1931034 19.310345 106 36.551724
[20163,22594) 53 0.1827586 18.275862 159 54.827586
[22594,25026) 36 0.1241379 12.413793 195 67.241379
[25026,27457) 37 0.1275862 12.758621 232 80.000000
[27457,29889) 45 0.1551724 15.517241 277 95.517241
[29889,32320) 13 0.0448276 4.482759 290 100.000000
x
start 12868.020
end 32320.000
h 2431.497
right 0.000

La tabla de frecuencias del precio del almuerzo evidencia una distribución concentrada principalmente en la zona central del rango observado. Los intervalos comprendidos entre aproximadamente 17,700 y 22,600 pesos agrupan la mayor parte de los registros, lo que sugiere que este es el rango típico de precios para la mayoría de los consumidores. A medida que los valores aumentan, las frecuencias comienzan a disminuir de manera progresiva, lo que indica que los precios altos son menos comunes y que la distribución presenta una ligera asimetría hacia la derecha. Los precios por debajo de 15200 apenas representan un 3.1% de los valores analizados. En general, el comportamiento de las frecuencias acumuladas confirma que más de la mitad de los almuerzos se venden dentro de un rango bastante acotado, pero existen precios poco frecuentes que podrían interpretarse como valores extremos o excepcionales.

Punto 4

Tablas de contingencia: V4_Atencion_cat vs V1_SitioZona (freq y proporciones por fila).Interprete cada resultado

tabla_4 <- table(muestra_trabajo$V4_Atencion_cat,
                 muestra_trabajo$V1_SitioZona)
kable(tabla_4)
Zona Centro Zona Norte Zona Sur
Buena 45 29 15
Excelente 20 24 18
Mala 29 16 17
Regular 35 20 22
prop_4 <- round(prop.table(tabla_4, margin = 1),3)
kable(prop_4)
Zona Centro Zona Norte Zona Sur
Buena 0.506 0.326 0.169
Excelente 0.323 0.387 0.290
Mala 0.468 0.258 0.274
Regular 0.455 0.260 0.286

Al analizar la tabla de contingencia entre la calificación de la atención y la zona donde se encuentra el sitio, se observa que las tres zonas presentan opiniones variadas, sin un patrón claro. La zona Centro fue la más visitada, seguida del Norte y Sur. En proporción, la zona Centro y Norte tiene una calificación en un tercio Buena mientras que la Zona Sur se sitúa en una atención Regular. A nivel general, la atención en todas las zonas es Buena aunque las zonas en Norte y Sur hay una menor participación.

Punto 5

Compare media y desviación estándar de V11_Ingresos por V15_Sexo. ¿Cuál grupo es más homogéneo)

hombres <- subset(muestra_trabajo, V15_Sexo == "Masculino")
mujeres <- subset(muestra_trabajo, V15_Sexo == "Femenino")

media_hombres <- mean(hombres$V11_Ingresos)
sd_hombres    <- sd(hombres$V11_Ingresos)

media_mujeres <- mean(mujeres$V11_Ingresos)
sd_mujeres    <- sd(mujeres$V11_Ingresos)

tabla_comparativa <- data.frame(
  sexo = c("Masculino", "Femenino"),
  media_ingresos = c(media_hombres, media_mujeres),
  desv_est_ingresos = c(sd_hombres, sd_mujeres)
)


kable(tabla_comparativa)
sexo media_ingresos desv_est_ingresos
Masculino 3915782 2701130
Femenino 3851443 2621966

En este punto se compararon los ingresos entre hombres y mujeres para ver cuál de los dos grupos es más homogéneo, es decir, en cuál los ingresos son más parecidos entre sí. Los hombres tienen un ingreso promedio de aproximadamente 3.915.782 pesos, mientras que las mujeres tienen un promedio de 3.851.443 pesos, por lo que ambos grupos presentan ingresos bastante similares en promedio. Sin embargo, al observar la desviación estándar, se nota que en los hombres es de 2.701.130 pesos y en las mujeres es de 2.621.966 pesos. Esto indica que, aunque los promedios son parecidos, los ingresos de las mujeres están un poco menos dispersos que los de los hombres. Por lo tanto, se puede concluir que el grupo femenino es ligeramente más homogéneo en términos de ingresos, ya que sus valores son un poco más parecidos entre sí.

Sección B: gráficos

Punto 6

Grafique histograma y polígono de frecuencias para todas las variables. Comente asimetría y curtosis

**Debido a que los histogramas funcionan con variables cuantitativas discretas, los elaboramos solo con ese tipo.

Tiempo que lleva almorzando en el sitio (meses)

tabla_tiempo <- fdt(x =muestra_trabajo$V2_TiempoConoce_meses,k =10)
tabla_tiempo
##       Class limits  f   rf rf(%)  cf  cf(%)
##      [1.98,17.538) 93 0.32 32.07  93  32.07
##    [17.538,33.096) 95 0.33 32.76 188  64.83
##    [33.096,48.654) 49 0.17 16.90 237  81.72
##    [48.654,64.212) 22 0.08  7.59 259  89.31
##     [64.212,79.77) 12 0.04  4.14 271  93.45
##     [79.77,95.328)  7 0.02  2.41 278  95.86
##   [95.328,110.886)  8 0.03  2.76 286  98.62
##  [110.886,126.444)  2 0.01  0.69 288  99.31
##  [126.444,142.002)  1 0.00  0.34 289  99.66
##   [142.002,157.56)  1 0.00  0.34 290 100.00
plot(tabla_tiempo, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma del tiempo que lleva almorzando en el sitio (meses)")

plot(tabla_tiempo, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fp", main = "Poligono de frecuencias del tiempo que lleva almorzando en el sitio (meses)")

asim_tiempo <- ds_skewness(muestra_trabajo$V2_TiempoConoce_meses)
curt_tiempo <- ds_kurtosis(muestra_trabajo$V2_TiempoConoce_meses)

df_tiempo <- data.frame (asim_tiempo, curt_tiempo)
kable(df_tiempo, caption = "Medidas de Forma")
Medidas de Forma
asim_tiempo curt_tiempo
1.734309 3.582536

La distribución es asimétrica a la derecha,lo que representa que muchos clientes que conocen el sitio desde hace pocos meses y unos pocos con desde hace más tiempo. Esto indica que el restaurante sigue captando nuevos clientes, pero aún así mantiene algunos de permanencia prolongada, relevante para evaluar lealtad a largo plazo.

Número de visitas a la semana

tabla_visitas <- fdt(x =muestra_trabajo$V6_VisitasSemana,k =10)

plot(tabla_visitas, col=c("palegreen4","lightgreen","olivedrab3","palegreen4", "seagreen2",
                          "seagreen4","darkseagreen", "darkseagreen2",
                          "darkolivegreen", "palegreen"),
     type = "fh", main = "Histograma del número de visitas a la semana")

plot(tabla_visitas, col=c("palegreen4","lightgreen","olivedrab3","palegreen4", "seagreen2",
                          "seagreen4","darkseagreen", "darkseagreen2",
                          "darkolivegreen", "palegreen"),
     type = "fp", main = "Poligono del número de visitas a la semana")

asim_visitas<- ds_skewness(muestra_trabajo$V6_VisitasSemana)
curt_visitas <- ds_kurtosis(muestra_trabajo$V6_VisitasSemana)

df_visitas <- data.frame (asim_visitas, curt_visitas)
kable(df_visitas, caption = "Medidas de Forma")
Medidas de Forma
asim_visitas curt_visitas
0.5818369 -0.0830734

Se observa concentración en valores bajos (1–2 visitas), con pocos clientes que van 3 o más veces. Esto refleja una base mayormente ocasional, aunque el grupo que visita con mayor frecuencia puede representar el segmento más leal.

Precio del almuerzo (en pesos)

tabla_precio <- fdt(x =muestra_trabajo$V7_PrecioAlmuerzo,k =10)

plot(tabla_precio, col=c("darkorchid","darkorchid4","mediumorchid1","mediumpurple2", "orchid4",
                          "orchid3","plum", "mediumorchid4",
                          "purple4", "blueviolet"),
     type = "fh", main = "Histograma del precio del almuerzo (en pesos)")

plot(tabla_precio, col=c("darkorchid","darkorchid4","mediumorchid1","mediumpurple2", "orchid4",
                          "orchid3","plum", "mediumorchid4",
                          "purple4", "blueviolet"),
     type = "fp", main = "Poligono del precio del almuerzo (en pesos)")

asim_precio <- ds_skewness(muestra_trabajo$V7_PrecioAlmuerzo)
curt_precio <- ds_kurtosis(muestra_trabajo$V7_PrecioAlmuerzo)

df_precio <- data.frame (asim_precio, curt_precio)
kable(df_precio, caption = "Medidas de Forma")
Medidas de Forma
asim_precio curt_precio
0.1335854 -1.081637

Los precios se concentran claramente en un rango estrecho, mostrando uniformidad. Esto ayuda a que la percepción del servicio pueda analizarse sin que el precio introduzca variabilidad significativa.

Edad (en años)

tabla_edad <- fdt(x =muestra_trabajo$V9_Edad,k =10)

plot(tabla_edad, col=c("palevioletred","palevioletred4","violetred","deeppink2", "hotpink2",
                          "hotpink4","lightpink2", "maroon",
                          "#FF56F1", "maroon3"),
     type = "fh", main = "Histograma de la edad (en años)")

plot(tabla_edad, col=c("palevioletred","palevioletred4","violetred","deeppink2", "hotpink2",
                          "hotpink4","lightpink2", "maroon",
                          "#FF56F1", "maroon3"),
     type = "fp", main = "Poligono de la edad (en años)")

asim_edad <- ds_skewness(muestra_trabajo$V9_Edad)
curt_edad <- ds_kurtosis(muestra_trabajo$V9_Edad)

df_edad <- data.frame (asim_edad, curt_edad)
kable(df_edad, caption = "Medidas de Forma")
Medidas de Forma
asim_edad curt_edad
0.4559939 -0.2131688

La distribución muestra clientela diversa, sin fuerte concentración alrededor de una única edad. Esto refleja que el restaurante atiende tanto a clientes jóvenes como adultos, lo cual es útil para ver si la percepción del servicio cambia según la etapa de vida.

Ingresos (en pesos)

tabla_ingresos <- fdt(x =muestra_trabajo$V11_Ingresos,k =10)

plot(tabla_ingresos, col=c("lightsalmon","darkorange","chocolate","coral2", "coral4",
                          "orange2","sienna3", "tan2",
                          "lightcoral", "sandybrown"),
     type = "fh", main = "Histograma del ingreso (en pesos)")

plot(tabla_ingresos, col=c("lightsalmon","darkorange","chocolate","coral2", "coral4",
                          "orange2","sienna3", "tan2",
                          "lightcoral", "sandybrown"),
     type = "fp", main = "Poligono del ingreso (en pesos)")

asim_ingresos <- ds_skewness(muestra_trabajo$V11_Ingresos)
curt_ingresos <- ds_kurtosis(muestra_trabajo$V11_Ingresos)

df_ingresos <- data.frame (asim_ingresos, curt_ingresos)
kable(df_ingresos, caption = "Medidas de Forma")
Medidas de Forma
asim_ingresos curt_ingresos
1.820321 3.78526

Los ingresos están muy dispersos y presentan asimetría a la derecha. Existen algunos valores altos que se alejan del resto. Esto sugiere diferencias económicas en la clientela, importante para evaluar segmentación.

Gastos (en pesos)

tabla_gastos <- fdt(x =muestra_trabajo$V12_Gastos,k =10)

plot(tabla_gastos, col=c("powderblue","cornflowerblue","steelblue1","skyblue", "slategray3",
                          "paleturquoise3","lightsteelblue2", "lightskyblue",
                          "cadetblue2", "deepskyblue"),
     type = "fh", main = "Histograma de los gastos (en pesos)")

plot(tabla_gastos, col=c("powderblue","cornflowerblue","steelblue1","skyblue", "slategray3",
                          "paleturquoise3","lightsteelblue2", "lightskyblue",
                          "cadetblue2", "deepskyblue"),
     type = "fp", main = "Poligono del gastos (en pesos)")

asim_gastos <- ds_skewness(muestra_trabajo$V12_Gastos)
curt_gastos <- ds_kurtosis(muestra_trabajo$V12_Gastos)

df_gastos <- data.frame (asim_gastos, curt_gastos)
kable(df_gastos, caption = "Medidas de Forma")
Medidas de Forma
asim_gastos curt_gastos
1.929154 4.154793

La distribución es parecida a la de ingresos, con datos dispersos y algunos casos con gastos altos. Esto indica patrones de gasto variados, lo que puede influir en la frecuencia de visita o satisfacción.

Punto 7

Boxplots comparativos entre variables

Para resolver este punto, usaremos las variables que nos ayudan a responder nuestra pregunta.

Visitas por semana según calidad de atención Cómo la experiencia del servicio influye en la frecuencia de visita, y por ende en lealtad del consumidor

ggplot(muestra_trabajo, aes(x = V4_Atencion_cat, y = V6_VisitasSemana)) +
  geom_boxplot(fill = c("skyblue", "skyblue4", "deepskyblue3", "deepskyblue4"), color = "black") +
  labs(title = "Visitas por Semana según Calidad de la Atención",
       x = "Calidad de la Atención",
       y = "Número de Visitas por Semana") +
  theme_bw()

Las visitas semanales aumentan ligeramente en los niveles más altos de calidad de atención. Además, la dispersión es menor cuando la atención es mejor, lo que indica que los clientes satisfechos tienden a visitar el sitio de manera más constante, reforzando la relación entre servicio y lealtad.

Calificación del servicio según si recomiendan o no Cómo la experiencia del servicio se relaciona con la recomendación de los clientes, y como esto incide en su lealtad

ggplot(muestra_trabajo, aes(x = V3_Recomienda, y = V5_Atencion_1a4)) +
  geom_boxplot(fill = c("lightgreen", "darkseagreen1"), color = "black") +
  labs(title = "Calificación de la Atención según Recomienda Sí/No",
       x = "Recomienda",
       y = "Calificación de la Atención (1 a 4)") +
  theme_bw()

El grupo que recomienda presenta valores más altos y menos dispersos que el grupo que no recomienda. Esto muestra una relación directa: quienes perciben un buen servicio son mucho más propensos a recomendar el restaurante.

Visitas por semana según calificación numérica de atención Comparación de la experiencia del servicio vs lealtad

ggplot(muestra_trabajo, aes(x = factor(V5_Atencion_1a4), y = V6_VisitasSemana)) +
  geom_boxplot(fill = c("orchid", "orchid4", "darkorchid", "darkorchid4"), color = "black") +
  labs(title = "Visitas por Semana según Calificación de la Atención",
       x = "Calificación de la Atención (1 a 4)",
       y = "Número de Visitas por Semana") +
  theme_bw()

Los niveles altos de atención (3 y 4) muestran medianas de visita mayores que los niveles bajos. Esto sugiere que la experiencia del servicio impacta tanto la percepción como el comportamiento real de visita, evidenciando un vínculo entre satisfacción y frecuencia.

Visitas por semana según Recomienda Sí/No Esto determina la lealtad directa, segun sus recomendaciones y el numero de visitas que tienen

ggplot(muestra_trabajo, aes(x = V3_Recomienda, y = V6_VisitasSemana)) +
  geom_boxplot(fill = c("hotpink", "hotpink3"), color = "black") +
  labs(title = "Visitas por Semana según Recomienda Sí/No",
       x = "Recomienda",
       y = "Número de Visitas por Semana") +
  theme_bw()

El grupo que recomienda visita más veces por semana y con menor variabilidad. Esto respalda que la recomendación está asociada a una relación más fuerte con el restaurante, lo cual se alinea con indicadores de lealtad.

Punto 8

QQ-plot de V11_Ingresos y V9_Edad. ¿La Normalidad es aceptable? Justifique la respuesta.

ggplot(muestra_trabajo, aes(sample = V11_Ingresos)) +
  stat_qq(col = "deepskyblue3") +
  stat_qq_line(col = "navy") +
  labs(title = "QQ-Plot de V11_Ingresos") +
  theme_bw()

Los ingresos presentan una fuerte desviación de la normalidad, reflejando asimetría y valores altos atípicos. La variable no se ajusta al comportamiento esperado bajo un modelo normal.

ggplot(muestra_trabajo, aes(sample = V9_Edad)) +
  stat_qq(col = "skyblue3") +
  stat_qq_line(col = "navy") +
  labs(title = "QQ-Plot de V9_Edad") +
  theme_bw()

La edad muestra un comportamiento moderadamente cercano a la normalidad, con desviaciones evidentes solo en las colas. No es perfectamente normal, pero su estructura general se asemeja más a la normal que la de ingresos.

Sección C: probabilidad y conteo

Punto 9

(Conteo) ¿De cuántas maneras puede seleccionarse un subgrupo de 5 personas que incluya exactamente 2 de Zona Centro?

C_centro <- sum(muestra_trabajo$V1_SitioZona == "Zona Centro", na.rm = TRUE)
N_total <- nrow(muestra_trabajo)

p9 <- choose(C_centro, 2) * choose(N_total - C_centro, 3)

cat("Número de formas de seleccionar un subgrupo de 5 personas con EXACTAMENTE 2 de Zona Centro:", 
    p9)
## Número de formas de seleccionar un subgrupo de 5 personas con EXACTAMENTE 2 de Zona Centro: 5635875840

5635875840 representa el número de formas de seleccionar un subgrupo de 5 personas con exactamente 2 de Zona Centro. Esto tiene varias implicaciones dentro de las cuales se encuentran que la ubicación geográfica puede influir en la percepción del servicio y que las diferentes zonas pueden tener distintas experiencias en los restaurantes lo que nos deja que la experiencia del servicio no impacta uniformemente en todos los clientes

Punto 10

(Condicional) Estime P(Recomienda=Sí | V5_Atencion_1a4 >= 3).

# P(Recomienda = Sí | V5_Atencion_1a4 >= 3)

# B: atención >= 3
b <- sum(muestra_trabajo$V5_Atencion_1a4 >= 3)

# A ∩ B: recomienda Sí y atención >=3
anb <- sum(muestra_trabajo$V3_Recomienda == "Sí" &
             muestra_trabajo$V5_Atencion_1a4 >= 3)

# Probabilidad condicional
p.cond <- anb / b
p.cond
## [1] 0.5695364

Este resultado nos indica que existe una relación directa y medible entre la calidad de la atención y la lealtad del cliente. Es decir que de cada 100 clientes que reciben buena atención solo el 57 lo recomendaría, mientras que los otros 43 no lo harian a pesar de la buena atención.

Punto 11

(Bayes) Calcule P(Zona Norte | Recomienda=Sí) usando la base.

# (Bayes) P(Zona Norte | Recomienda = "Sí") -- estilo profe

# B = Recomienda == "Sí"
P_SR <- sum(muestra_trabajo$V3_Recomienda == "Sí", na.rm = TRUE)

# A ∩ B = Zona Norte y Recomienda == "Sí"
ZNnSR <- sum(muestra_trabajo$V1_SitioZona == "Zona Norte" &
             muestra_trabajo$V3_Recomienda == "Sí", na.rm = TRUE)


p11 <- anb / b


cat("N(SR) =", b, "\n")
## N(SR) = 151
cat("N(ZN n SR) =", ZNnSR, "\n")
## N(ZN n SR) = 40
cat("P(ZN|SR) =", round(p11, 4), "\n")
## P(ZN|SR) = 0.5695

Este resultado nos muestra que la lealtad del cliente esta geográficamente concentrada y que la zona norte es el lugar en donde la experiencia del servicio está generando resultados medibles en términos de recomendaciones.

Punto 12

(Binomial) Sea p la proporción muestral de recomienda; calcule P(X>=8) para X~Binomial(n=10, x, p).

x <- 0:10
n <- 10 
p <- mean(muestra_trabajo$V3_Recomienda=="Sí")
q <- 1-p 


f.x <- dbinom(x=x, size=n, prob = p)


df <- data.frame(x, f.x)
flextable(df)

x

f.x

0

0.0024546595

1

0.0202239245

2

0.0749811541

3

0.1647384685

4

0.2375238611

5

0.2348349117

6

0.1612336134

7

0.0759087272

8

0.0234529322

9

0.0042939680

10

0.0003537798

ggplot(df, aes(x=x, y=f.x))+
  geom_point(col="hotpink")+
  geom_segment(aes(x=x, xend=x, y=0, yend=f.x),
               linetype="dashed", col="hotpink")+      
  labs(title="Función de probabilidad P(X >=8)")+
  theme_bw()

sol.a <- sum(df$f.x[9:11]) 
sol.a
## [1] 0.02810068
sol.b <- pbinom(q=7, size=n, prob=p, lower.tail = FALSE) 
sol.b
## [1] 0.02810068
sol.c <- sum(dbinom(x=8:10, size=n, prob=p))
sol.c
## [1] 0.02810068

0.02810068 este resultado nos indica que la experiencia del servicio general la lealtad suficiente para la superviviencia de la empresa, sin embargo, no es suficiente para un crecimiento exponencial

Punto 13

(Poisson) Ajuste Poisson a V6_VisitasSemana por zona; calcule P(X>=4) en Zona Sur.

zona_sur <- muestra_trabajo[muestra_trabajo$V1_SitioZona=="Zona Sur", ]

l <- mean(zona_sur$V6_VisitasSemana)
l
## [1] 4.236111
xp <- 0:15

yp <- dpois(x=xp, lambda = l)

df.p <- data.frame(xp,yp)

flextable(df.p)

xp

yp

0

0.01446373045

1

0.06126996929

2

0.12977319884

3

0.18324456317

4

0.19406108253

5

0.16441286158

6

0.11607852496

7

0.07024593276

8

0.03719619704

9

0.01750746928

10

0.00741635852

11

0.00285604716

12

0.00100821109

13

0.00032853032

14

0.00009940650

15

0.00002807313

ggplot(df.p, aes(x=xp, y=yp))+
  geom_point(col="darkorchid")+
  geom_segment(aes(x=xp, y=yp), x=xp, xend=xp, y=0, yend=yp, linetype="dashed", col="darkorchid")+
  labs(title="Distribución Poisson para Visitas Semana (Zona Sur)")

solp.a <- ppois(q = 3, lambda = l, lower.tail = FALSE)
solp.a
## [1] 0.6112485
solp.b <- 1 - ppois(q = 3, lambda = l, lower.tail = TRUE)
solp.b
## [1] 0.6112485
solp.c <- sum(dpois(x = 4:15, lambda = l))
solp.c
## [1] 0.6112387

Este resultado indica el nivel máximo de lealtad en clientes que usan el restaurante en su vida diaria. Lo que nos indica que la zona sur aprecia que el servicio sea muy bueno, los clientes suelen responder con lealtad lo que corresponde a visitas más recurrentes

Punto 14

(Hipergeométrica) Si en la población de 1200 hay K ‘Excelente’, calcule probabilidad de 6 ‘Excelente’ en muestra de 20 sin reemplazo.

Solución

k <- sum(muestra_trabajo$V4_Atencion_cat == "Excelente")
k
## [1] 62
x.h <- 0:20
m.h <- k
n.h <- 1200-k
k.h <- 20
f.h <- dhyper(x=x.h, m=m.h, n=n.h,k=k.h)

df.h <- data.frame(x.h, f.h)
flextable(df.h)

x.h

f.h

0

0.3431087313887062895112478599912720

1

0.3802098542645183099075723021087470

2

0.1967246522734717173452878569150926

3

0.0631765163411684010918989429228532

4

0.0141189941823065736453690632856706

5

0.0023334686734070388992867695066025

6

0.0002958356636659268909007869385874

7

0.0000294520838494078537818550433958

8

0.0000023377264600717741103660680252

9

0.0000001493489841394576395718117937

10

0.0000000077190122121723317206162058

11

0.0000000003232052782292948171216521

12

0.0000000000109403556568765365663614

13

0.0000000000002976360105251058860020

14

0.0000000000000064417687790327697293

15

0.0000000000000001091632485061151237

16

0.0000000000000000014138758487068557

17

0.0000000000000000000134829311304514

18

0.0000000000000000000000890158305267

19

0.0000000000000000000000003626067253

20

0.0000000000000000000000000006850654

sum(df.h$f.h)
## [1] 1
#P(K=6)
sol.a <- 1-phyper(q=0, m=m.h, n=n.h, k=k.h)
cat("P(X=6)", sol.a)
## P(X=6) 0.6568913
#forma 2
sol.b <- sum(dhyper(x=1:20, m=m.h, n=n.h, k=k.h))
cat("P(X=6)", sol.b)
## P(X=6) 0.6568913
#grafica
ggplot(df.h, aes(x=x.h, y=f.h))+
  geom_point(col="hotpink")+
  geom_segment(aes(x=x.h, xend=x.h, y=0, yend=f.h),
               linetype="dashed", col="hotpink4")+      
  labs(title="Función de probabilidad del Hipergeométrica")+
  theme_bw()

0.6568913 este resultado nos indica que el restaurante es bueno pero que no pasa de ahí, es decir que no es un restaurante excelente, lo que genera lealtad transaccional.

Punto 15

(Normal) Usando media y desviación de V7_PrecioAlmuerzo, calcule P(20000 < Precio <24000).

media_15 <- mean(muestra_trabajo$V7_PrecioAlmuerzo)
cat("La media del precio del almuerzo es de", media_15)
## La media del precio del almuerzo es de 22466.39
sd_15 <- sd(muestra_trabajo$V7_PrecioAlmuerzo)
cat("La desviación estandar del precio del almuerzo es de", sd_15)
## La desviación estandar del precio del almuerzo es de 4525.328
#P(20000 < precio <24000) = P(X<= 24000) - P(X<=20000)
soln <- pnorm(q=24000, mean=media_15, sd=sd_15, lower.tail = TRUE) -  pnorm(q=20000, mean=media_15, sd=sd_15, lower.tail = TRUE)

cat("P(20000 < precio <24000) =", soln)
## P(20000 < precio <24000) = 0.3397853
#Gráfica

xn <- seq(min(muestra_trabajo$V7_PrecioAlmuerzo),
           max(muestra_trabajo$V7_PrecioAlmuerzo),
           by = 10)

yn <- dnorm (x=xn, mean=media_15, sd=sd_15)

df.n <- data.frame(xn, yn)

df.s <- subset(df.n, 20000 <xn & xn<24000)

ggplot(df.n, aes(x=xn, y=yn))+
  geom_line(col="hotpink")+
  geom_area(data=df.s, aes(x=xn, y=yn), fill="hotpink", alpha=0.5)+
  labs(title="Distribución normal del precio del almuerzo", 
       x="Precio", y="f(X)")+
    theme_bw()

0.3397853 este resultado revela que el restaurante ha encontrado un equilibrio efectivo en su estrategia de precios que soporta la lealtad de sus clientes

Punto 16

(Exponencial) Modele tiempo entre visitas: suponga tasa lambda diaria derivada de V6_VisitasSemana y calcule P(T>10 días).

media_16 <- mean(muestra_trabajo$V6_VisitasSemana)
media_16
## [1] 3.055172
l <- media_16 / 7
l
## [1] 0.4364532
sol.exp <- exp(-l * 10)
cat("El tiempo entre visitas tiene una distribución exponencial de",sol.exp)
## El tiempo entre visitas tiene una distribución exponencial de 0.01272061
#gráfica

f.x <- function(x){ l * exp(-l*x) }

x.e <- seq(0, 30, by = 0.1)
y.e <- sapply(x.e, f.x)

df.e <- data.frame(x.e, y.e)


df.area <- subset(df.e, x.e > 10)

ggplot(df.e, aes(x = x.e, y = y.e))+
  geom_line(col="deepskyblue3")+
  geom_area(data=df.area, aes(x=x.e, y=y.e),
            fill="skyblue", alpha=0.4)+
  labs(title="Distribución Exponencial del tiempo entre visitas",
       x="Días", y="f(x)")+
  theme_bw()

0.01272061 este resultado indica que los clientes no están solo satisfechos, sino que han integrado el restaurante en su vida cotidiana creando así un hábito casi que automático

Sección D: Intervalos de confianza y pruebas de hipótesis

Punto 17

Calcule e interprete un Intervalo de Confianza IC del 95% para la media de V7_PrecioAlmuerzo.

lillie.test(x=muestra_trabajo$V7_PrecioAlmuerzo)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  muestra_trabajo$V7_PrecioAlmuerzo
## D = 0.07278, p-value = 0.0008073
sol_17 <- t.test(x=muestra_trabajo$V7_PrecioAlmuerzo, conf.level = 0.95)$conf.int

cat("Con una confianza del 95% se estima que el precio promedio del almuerzo es de",sol_17)
## Con una confianza del 95% se estima que el precio promedio del almuerzo es de 21943.36 22989.41

El intervalo de confianza calculado muestra el rango dentro del cual se encuentra el precio promedio del almuerzo con un 95% de confianza. Como el intervalo es relativamente estrecho, indica baja variabilidad en los precios y sugiere estabilidad en el costo del almuerzo. Esto implica que el precio no depende directamente de la experiencia del servicio y que los clientes enfrentan un precio consistente, lo que reduce la incertidumbre y contribuye a una percepción más clara del valor recibido.

Punto 18

IC 95% para la proporción de quienes recomiendan (V3_Recomienda=‘Sí’).

recom_si <- sum(muestra_trabajo$V3_Recomienda == "Sí")
recom_si
## [1] 131
n_total <- nrow(muestra_trabajo)
n_total
## [1] 290
prop.test(recom_si, n_total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  recom_si out of n_total, null probability 0.5
## X-squared = 2.5138, df = 1, p-value = 0.1129
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3937673 0.5109809
## sample estimates:
##         p 
## 0.4517241

El intervalo de confianza para la proporción de clientes que recomiendan el restaurante muestra que una mayoría significativa de los encuestados sí lo recomendaría. La estrechez del intervalo indica que esta proporción es estable y confiable. Este resultado es directamente relevante para la lealtad: una alta proporción de recomendación es uno de los indicadores más fuertes de satisfacción, repetición de compra y compromiso emocional con el restaurante.

Punto 19

IC 95% para la varianza de V11_Ingresos.

if (!require('devtools')) install.packages('devtools')
devtools::install_github('fhernanb/stests', force=TRUE)
## 
## ── R CMD build ─────────────────────────────────────────────────────────────────
##      checking for file ‘/private/var/folders/t5/dzcbxnbs35v7_kvq7j1_qcvr0000gp/T/RtmpfsZBSv/remotes221248b4e3be/fhernanb-stests-b25bf7e/DESCRIPTION’ ...  ✔  checking for file ‘/private/var/folders/t5/dzcbxnbs35v7_kvq7j1_qcvr0000gp/T/RtmpfsZBSv/remotes221248b4e3be/fhernanb-stests-b25bf7e/DESCRIPTION’
##   ─  preparing ‘stests’:
##      checking DESCRIPTION meta-information ...  ✔  checking DESCRIPTION meta-information
##   ─  checking for LF line-endings in source and make files and shell scripts
##   ─  checking for empty or unneeded directories
##      Omitted ‘LazyData’ from DESCRIPTION
##   ─  building ‘stests_0.1.0.tar.gz’
##      
## 
library(stests)

sol <- stests::var.test(x = muestra_trabajo$V11_Ingresos,
                        conf.level = 0.95)$conf.int

cat("El intervalo de confianza del 95% indica que la desviación estándar de los ingresos se encuentra entre",
    round(sqrt(sol)[1], 2), "y", round(sqrt(sol)[2], 2))
## El intervalo de confianza del 95% indica que la desviación estándar de los ingresos se encuentra entre 2458840 y 2895086

El intervalo de confianza para la varianza de Ingresos muestra que existe una dispersión considerable en el nivel económico de los clientes. Esto implica que el restaurante atiende una población heterogénea en ingresos. Esta variabilidad puede influir en patrones de gasto y frecuencia de visita, pero también indica que el restaurante es atractivo para distintos perfiles económicos, lo que puede reforzar la estabilidad de la demanda.

Punto 20

Prueba t (dos colas) para H0: media Precio = 22000.

t.test(muestra_trabajo$V7_PrecioAlmuerzo,
       mu = 22000,
       alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  muestra_trabajo$V7_PrecioAlmuerzo
## t = 1.7551, df = 289, p-value = 0.08031
## alternative hypothesis: true mean is not equal to 22000
## 95 percent confidence interval:
##  21943.36 22989.41
## sample estimates:
## mean of x 
##  22466.39

La prueba t compara el precio promedio real con un valor de referencia de 22.000. Los resultados indican si existe evidencia estadística para afirmar que el precio difiere significativamente. Si la prueba rechaza la hipótesis nula, significa que el precio promedio no es realmente 22.000 sino mayor o menor. Si no se rechaza, el precio es consistente con ese valor objetivo. Esto permite evaluar si el precio se mantiene controlado y dentro del rango esperado, lo cual es importante para la percepción de valor del cliente.

Punto 21

Chi-cuadrado de independencia entre V4_Atencion_cat y V1_SitioZona.

tabla_chi <- table(muestra_trabajo$V4_Atencion_cat,
                   muestra_trabajo$V1_SitioZona)

kable(tabla_chi)
Zona Centro Zona Norte Zona Sur
Buena 45 29 15
Excelente 20 24 18
Mala 29 16 17
Regular 35 20 22
chisq.test(tabla_chi)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla_chi
## X-squared = 8.6781, df = 6, p-value = 0.1925

La prueba Chi-cuadrado evalúa si existe asociación entre el sitio/zona visitada y la calidad percibida de la atención. Si la hipótesis de independencia se rechaza, significa que la atención no es uniforme en todas las zonas y que algunos lugares podrían estar ofreciendo mejor servicio que otros. Esto es clave para el análisis, ya que inconsistencias en la calidad afectan directamente la experiencia y, por ende, la lealtad.

Punto 22

Prueba de bondad de ajuste: ¿Precio sigue una distribución normal? (usar como estadística Kolmogorov- Smirnov vs Shapiro-wilk en submuestra).

subm <- muestra_trabajo$V7_PrecioAlmuerzo[1:30]
shapiro.test(subm)
## 
##  Shapiro-Wilk normality test
## 
## data:  subm
## W = 0.93076, p-value = 0.05143
z <- (subm - mean(subm)) / sd(subm)

ks.test(z, "pnorm")
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  z
## D = 0.14088, p-value = 0.5442
## alternative hypothesis: two-sided

La prueba de normalidad (Shapiro-Wilk o Kolmogorov-Smirnov en submuestra) permite determinar si el precio del almuerzo sigue una distribución normal. Al no ajustarse perfectamente a esta distribución, se reconoce que los precios no son totalmente simétricos, aunque suelen estar concentrados. Esto informa sobre el tipo de análisis estadístico apropiado y ayuda a entender si la dispersión de precios influye en la percepción del cliente.

Sección E: Regresión y asociación

Punto 23

Ajuste regresión lineal simple: V7_PrecioAlmuerzo ~ V9_Edad. Interprete coeficiente de correlación y determinación.

modelo <- lm(V7_PrecioAlmuerzo ~ V9_Edad, data = muestra_trabajo)
summary(modelo)
## 
## Call:
## lm(formula = V7_PrecioAlmuerzo ~ V9_Edad, data = muestra_trabajo)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -9730  -3590   -603   3855   9371 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 23421.32    1023.27  22.889   <2e-16 ***
## V9_Edad       -24.76      25.62  -0.966    0.335    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4526 on 288 degrees of freedom
## Multiple R-squared:  0.003232,   Adjusted R-squared:  -0.0002288 
## F-statistic: 0.9339 on 1 and 288 DF,  p-value: 0.3347
correlacion <- cor(muestra_trabajo$V7_PrecioAlmuerzo,
                   muestra_trabajo$V9_Edad)
correlacion
## [1] -0.05685233
R2 <- summary(modelo)$r.squared
R2
## [1] 0.003232187

La relación entre la edad y el precio del almuerzo es prácticamente inexistente. La correlación es muy débil (–0.0568), el coeficiente de regresión no es significativo (p > 0.05) y el R² es muy bajo (0.00323), lo que indica que la edad es menos del 1% de la variación del precio. Es por ello que la edad no es un predictor útil del precio del almuerzo.

Punto 24

Regresión múltiple: V7_PrecioAlmuerzo ~ V9_Edad + V11_Ingresos + V6_VisitasSemana. Interprete.

modelo_mult <- lm(V7_PrecioAlmuerzo ~ V9_Edad + V11_Ingresos + V6_VisitasSemana,
                  data = muestra_trabajo)

summary(modelo_mult)
## 
## Call:
## lm(formula = V7_PrecioAlmuerzo ~ V9_Edad + V11_Ingresos + V6_VisitasSemana, 
##     data = muestra_trabajo)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -9012  -3377    119   2888   9796 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       2.386e+04  1.019e+03  23.416  < 2e-16 ***
## V9_Edad          -1.859e+01  2.228e+01  -0.834    0.405    
## V11_Ingresos      5.009e-04  8.771e-05   5.711 2.82e-08 ***
## V6_VisitasSemana -8.579e+02  1.203e+02  -7.133 8.06e-12 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3931 on 286 degrees of freedom
## Multiple R-squared:  0.2531, Adjusted R-squared:  0.2453 
## F-statistic: 32.31 on 3 and 286 DF,  p-value: < 2.2e-16

El precio del almuerzo no depende de la edad, pero sí está relacionado con los ingresos y la frecuencia con la que la persona visita el restaurante. Los ingresos aumentan el precio pagado y las visitas semanales lo reducen. Este modelo mejora la explicación del precio frente al modelo simple, pasando de un R² de 0.003 a 0.253, lo que muestra que incluir más variables relevantes hace el modelo mucho más útil.

Punto 25

Calcule correlación de Pearson entre V11_Ingresos y V12_Gastos.

pear <- cor(muestra_trabajo$V11_Ingresos,
    muestra_trabajo$V12_Gastos)
cat("La correlación de Pearson entre los ingresos y gastos es de", pear)
## La correlación de Pearson entre los ingresos y gastos es de 0.9451792

Existe una correlación positiva entre los ingresos y los gastos. Esto muestra que los dos valores están estrechamente relacionados: los clientes con mayores ingresos generalmente presentan mayores niveles de gasto.

Sección F: Análisis de varianza

Punto 26

Con los datos suministrados elabore un análisis de varianza a una y dos vías.

Nota para esta sección realizamos el análisis de varianza solo de una vía, puesto que el metodo de dos vias no fue abordado en clase. * Nuevamente tomamos las variables que nos ayudan a responder nuestra pregunta de investigación.

¿Los clientes que califican la atención (Excelente/Regular/Mala) visitan con distinta frecuencia?

anova1 <- aov(muestra_trabajo$V6_VisitasSemana ~ muestra_trabajo$V4_Atencion_cat, data = muestra_trabajo)
summary(anova1)
##                                  Df Sum Sq Mean Sq F value Pr(>F)
## muestra_trabajo$V4_Atencion_cat   3   16.6   5.527   1.474  0.222
## Residuals                       286 1072.5   3.750
ggplot(muestra_trabajo, aes(x = V4_Atencion_cat, y = V6_VisitasSemana)) +
  geom_boxplot(fill = "lightblue", color = "royalblue4") +
  labs(title = "Visitas semanales según calidad de la atención",
       x = "Calidad de la atención",
       y = "Visitas por semana") +
  theme_bw()

¿Los clientes que perciben mejor atención pagan precios distintos?

anova2 <- aov(V7_PrecioAlmuerzo ~ V4_Atencion_cat, data = muestra_trabajo)
summary(anova2)
##                  Df    Sum Sq  Mean Sq F value Pr(>F)
## V4_Atencion_cat   3 4.871e+07 16238000   0.791    0.5
## Residuals       286 5.870e+09 20523076
ggplot(muestra_trabajo, aes(x = V4_Atencion_cat, y = V7_PrecioAlmuerzo)) +
  geom_boxplot(fill = "plum", color = "purple4") +
  labs(title = "Precio del almuerzo según calidad de la atención",
       x = "Calidad de la atención",
       y = "Precio del almuerzo") +
  theme_bw()

¿Quienes llevan más tiempo almorzando en el sitio (mayor “antigüedad”) perciben distinta atención?

anova3 <- aov(V2_TiempoConoce_meses ~ V4_Atencion_cat, data = muestra_trabajo)
summary(anova3)
##                  Df Sum Sq Mean Sq F value Pr(>F)
## V4_Atencion_cat   3   1109   369.8   0.586  0.624
## Residuals       286 180381   630.7
ggplot(muestra_trabajo, aes(x = V4_Atencion_cat, y = V2_TiempoConoce_meses)) +
  geom_boxplot(fill = "lightgreen", color = "darkgreen") +
  labs(title = "Tiempo que lleva visitando el restaurante según calidad de atención",
       x = "Calidad de la atención",
       y = "Meses de antigüedad") +
  theme_bw()