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

library(readxl)
library(dplyr)
library (ggplot2)
library(descriptr)
library(knitr)
library(modeest)
library(fdth)
library(plotrix)
library(flextable)
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

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

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

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

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

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)

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

Número de visitas a la semana

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

plot(tabla_visitas, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma del número de visitas a la semana")

plot(tabla_visitas, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     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

Precio del almuerzo (en pesos)

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

plot(tabla_precio, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma del precio del almuerzo (en pesos)")

plot(tabla_precio, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     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

Edad (en años)

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

plot(tabla_edad, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma de la edad (en años)")

plot(tabla_edad, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     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

Ingresos (en pesos)

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

plot(tabla_ingresos, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma del ingreso (en pesos)")

plot(tabla_ingresos, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     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

Gastos (en pesos)

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

plot(tabla_gastos, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma de los gastos (en pesos)")

plot(tabla_gastos, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     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

Peso (en KG)

tabla_peso <- fdt(x =muestra_trabajo$V13_PesoKg,k =10)

plot(tabla_peso, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma del peso (en KG)")

plot(tabla_peso, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fp", main = "Poligono del peso (en KG)")

asim_peso <- ds_skewness(muestra_trabajo$V13_PesoKg)
curt_peso <- ds_kurtosis(muestra_trabajo$V13_PesoKg)

df_peso <- data.frame (asim_peso, curt_peso)
kable(df_peso, caption = "Medidas de Forma")
Medidas de Forma
asim_peso curt_peso
-0.147834 0.116463

Estatura (en CM)

tabla_estatura <- fdt(x =muestra_trabajo$V14_EstaturaCm,k =10)

plot(tabla_estatura, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fh", main = "Histograma de la estatura (en CM)")

plot(tabla_peso, col=c("blue4","blue3","blue2","blue", "deepskyblue2",
                          "deepskyblue4","dodgerblue", "dodgerblue4",
                          "dodgerblue3", "royalblue4"),
     type = "fp", main = "Poligono de la estatura (en CM)")

asim_estatura <- ds_skewness(muestra_trabajo$V14_EstaturaCm)
curt_estatura <- ds_kurtosis(muestra_trabajo$V14_EstaturaCm)

df_estatura <- data.frame (asim_estatura, curt_estatura)
kable(df_estatura, caption = "Medidas de Forma")
Medidas de Forma
asim_estatura curt_estatura
-0.0049305 -0.7546748

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

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

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

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

Punto 8

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

# QQ-Plot Ingresos
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()

# QQ-Plot Edad
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()

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

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

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

Punto 12

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

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

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

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

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

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

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.

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

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

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/Rtmpw27A8O/remotes18612105b949a/fhernanb-stests-b25bf7e/DESCRIPTION’ ...  ✔  checking for file ‘/private/var/folders/t5/dzcbxnbs35v7_kvq7j1_qcvr0000gp/T/Rtmpw27A8O/remotes18612105b949a/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

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

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

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

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

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

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

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.