library(readxl)
setwd("~/Desktop")
datos_brutos <- read_excel("EncuestaSitiosComida.xlsx")
Numero de registros en la base de datos original
cat("Registros originales en el archivo:", nrow(datos_brutos), "\n")
## Registros originales en el archivo: 1200
Generacion de muestra aleatoria (290) y semilla 4793.Asi al correr el codigo la muestra sera siempre la misma
set.seed(4793)
tam_muestra <- 290
idx <- sample.int(n = nrow(datos_brutos), size = tam_muestra, replace = FALSE) #generar 290 valores aleatorios de 1 a 1200 sin repetir
muestra_290 <- datos_brutos[idx, ] #generacion de la muestra
cat("Tamaño de la muestra usada en el análisis:", nrow(muestra_290))
## Tamaño de la muestra usada en el análisis: 290
Seleccion de variables numericas
vars_num <- select(muestra_290, where(is.numeric))
A.Medidas descriptivas y tablas
Creacion de funcion para encontrar la moda
moda_simple <- function(v) {
v_ok <- v[!is.na(v)]
if (!length(v_ok)) return(NA_real_)
t <- table(v_ok)
as.numeric(names(t)[which.max(t)])
}
# Variable que almacena los nombres de las variables numericas
nom_var <- colnames(vars_num)
#Creacion de Dataframe con resumen estadistico
res_desc <- data.frame(
Variable = nom_var,
Media = sapply(vars_num, function(x) mean(x, na.rm = TRUE)),
Mediana = sapply(vars_num, function(x) median(x, na.rm = TRUE)),
Moda = sapply(vars_num, moda_simple),
DesvEst = sapply(vars_num, function(x) sd(x, na.rm = TRUE)),
CV_pct = NA_real_,
row.names = NULL
)
res_desc$CV_pct <- round(100 * res_desc$DesvEst / res_desc$Media, 2)
1)Resumen estadistico
cat(">>> Resumen básico de variables cuantitativas:\n")
## >>> Resumen básico de variables cuantitativas:
flextable(res_desc)
Variable | Media | Mediana | Moda | DesvEst | CV_pct |
|---|---|---|---|---|---|
ID | 570.131034 | 564.5 | 4.0 | 351.317693 | 61.62 |
V2_TiempoConoce_meses | 32.420690 | 24.0 | 21.0 | 25.813992 | 79.62 |
V5_Atencion_1a4 | 2.444828 | 3.0 | 3.0 | 1.064718 | 43.55 |
V6_VisitasSemana | 2.900000 | 2.5 | 2.0 | 1.927851 | 66.48 |
V7_PrecioAlmuerzo | 22,782.700000 | 22,933.5 | 15,256.0 | 4,705.617244 | 20.65 |
V8_CompanerosAlmuerzo | 1.910345 | 2.0 | 2.0 | 1.411359 | 73.88 |
V9_Edad | 37.165517 | 35.0 | 32.0 | 9.973330 | 26.83 |
V11_Ingresos | 4,001,613.458621 | 3,195,199.5 | 1,500,000.0 | 2,550,634.349144 | 63.74 |
V12_Gastos | 2,399,030.955172 | 1,907,369.5 | 500,000.0 | 1,648,285.544614 | 68.71 |
V13_PesoKg | 69.432414 | 69.7 | 66.6 | 9.287331 | 13.38 |
V14_EstaturaCm | 166.466552 | 166.1 | 150.0 | 8.634289 | 5.19 |
Cuartiles, RIQ, P10 y P90
extra_cuartiles <- t(sapply(
vars_num,
function(x) {
q <- quantile(x, probs = c(0.25, 0.5, 0.75, 0.10, 0.90), na.rm = TRUE)
c(Q1 = q[1], Q2 = q[2], Q3 = q[3], P10 = q[4], P90 = q[5], RIQ = q[3] - q[1])
}
))
cuartiles_df <- data.frame(
Variable = rownames(extra_cuartiles),
extra_cuartiles,
row.names = NULL
)
2)Cuartiles, RIQ y percentiles 10 y 90:
flextable(cuartiles_df)
Variable | Q1.25. | Q2.50. | Q3.75. | P10.10. | P90.90. | RIQ.75. |
|---|---|---|---|---|---|---|
ID | 261.50 | 564.5 | 855.750 | 83.90 | 1,090.10 | 594.250 |
V2_TiempoConoce_meses | 14.00 | 24.0 | 41.750 | 9.00 | 66.10 | 27.750 |
V5_Atencion_1a4 | 1.25 | 3.0 | 3.000 | 1.00 | 4.00 | 1.750 |
V6_VisitasSemana | 1.00 | 2.5 | 4.000 | 1.00 | 6.00 | 3.000 |
V7_PrecioAlmuerzo | 18,622.25 | 22,933.5 | 26,761.750 | 16,500.20 | 29,118.80 | 8,139.500 |
V8_CompanerosAlmuerzo | 1.00 | 2.0 | 3.000 | 0.00 | 4.00 | 2.000 |
V9_Edad | 30.00 | 35.0 | 42.000 | 26.00 | 52.00 | 12.000 |
V11_Ingresos | 2,182,824.75 | 3,195,199.5 | 5,121,989.000 | 1,500,000.00 | 7,663,144.10 | 2,939,164.250 |
V12_Gastos | 1,252,848.00 | 1,907,369.5 | 3,036,766.500 | 914,772.30 | 4,644,757.20 | 1,783,918.500 |
V13_PesoKg | 63.30 | 69.7 | 75.575 | 56.27 | 82.33 | 12.275 |
V14_EstaturaCm | 160.00 | 166.1 | 173.275 | 155.28 | 177.90 | 13.275 |
3)Tabla de frecuencias para la V7 Precio del almuerzo
precio <- as.numeric(as.character(muestra_290$V7_PrecioAlmuerzo))
precio <- precio[!is.na(precio)]
#creacion de las clases o intervalos,en total son 8
clases_precio <- cut(
x = precio,
breaks = 8,
include.lowest = TRUE,
right = FALSE,
dig.lab=8
)
# Creacion de la tabla
tabla_precio <- as.data.frame(table(clases_precio))
names(tabla_precio) <- c("Clase", "Frecuencia")
# Creacion de las columnas de la tabla
tabla_precio$Prop_rel <- tabla_precio$Frecuencia / sum(tabla_precio$Frecuencia)
tabla_precio$Prop_acum <- cumsum(tabla_precio$Prop_rel)
tabla_precio$Porc_rel <- round(100 * tabla_precio$Prop_rel, 2)
tabla_precio$Porc_acum <- round(100 * tabla_precio$Prop_acum, 2)
Tabla de distribución de V7_PrecioAlmuerzo (8 clases):
flextable(tabla_precio)
Clase | Frecuencia | Prop_rel | Prop_acum | Porc_rel | Porc_acum |
|---|---|---|---|---|---|
[12988.539,15314.625) | 11 | 0.03793103 | 0.03793103 | 3.79 | 3.79 |
[15314.625,17622.25) | 38 | 0.13103448 | 0.16896552 | 13.10 | 16.90 |
[17622.25,19929.875) | 46 | 0.15862069 | 0.32758621 | 15.86 | 32.76 |
[19929.875,22237.5) | 40 | 0.13793103 | 0.46551724 | 13.79 | 46.55 |
[22237.5,24545.125) | 33 | 0.11379310 | 0.57931034 | 11.38 | 57.93 |
[24545.125,26852.75) | 53 | 0.18275862 | 0.76206897 | 18.28 | 76.21 |
[26852.75,29160.375) | 40 | 0.13793103 | 0.90000000 | 13.79 | 90.00 |
[29160.375,31486.461] | 29 | 0.10000000 | 1.00000000 | 10.00 | 100.00 |
kable(tabla_precio)
| Clase | Frecuencia | Prop_rel | Prop_acum | Porc_rel | Porc_acum |
|---|---|---|---|---|---|
| [12988.539,15314.625) | 11 | 0.0379310 | 0.0379310 | 3.79 | 3.79 |
| [15314.625,17622.25) | 38 | 0.1310345 | 0.1689655 | 13.10 | 16.90 |
| [17622.25,19929.875) | 46 | 0.1586207 | 0.3275862 | 15.86 | 32.76 |
| [19929.875,22237.5) | 40 | 0.1379310 | 0.4655172 | 13.79 | 46.55 |
| [22237.5,24545.125) | 33 | 0.1137931 | 0.5793103 | 11.38 | 57.93 |
| [24545.125,26852.75) | 53 | 0.1827586 | 0.7620690 | 18.28 | 76.21 |
| [26852.75,29160.375) | 40 | 0.1379310 | 0.9000000 | 13.79 | 90.00 |
| [29160.375,31486.461] | 29 | 0.1000000 | 1.0000000 | 10.00 | 100.00 |
datatable(tabla_precio)
4)Tabla de de contingencia V4 atencion categoria y V1 Sitio Zona
tab_at_zona <- with(muestra_290,
table(V4_Atencion_cat, V1_SitioZona))
tab_at_zona
## V1_SitioZona
## V4_Atencion_cat Zona Centro Zona Norte Zona Sur
## Buena 41 28 23
## Excelente 23 23 9
## Mala 32 18 23
## Regular 32 25 13
Proporciones por fila (Atención -> distribución en zonas)
prop_filas <- prop.table(tab_at_zona, margin = 1)
round(prop_filas, 3)
## V1_SitioZona
## V4_Atencion_cat Zona Centro Zona Norte Zona Sur
## Buena 0.446 0.304 0.250
## Excelente 0.418 0.418 0.164
## Mala 0.438 0.247 0.315
## Regular 0.457 0.357 0.186
5)Ingresos por sexo
ing_x_sexo <- muestra_290 |>
group_by(V15_Sexo) |>
summarise(
Media = mean(V11_Ingresos, na.rm = TRUE),
SD = sd(V11_Ingresos, na.rm = TRUE),
CV_pct = round(100 * SD / Media, 2),
numero = n(),
.groups = "drop"
)
flextable(ing_x_sexo)
V15_Sexo | Media | SD | CV_pct | numero |
|---|---|---|---|---|
Femenino | 4,269,366 | 2,616,195 | 61.28 | 148 |
Masculino | 3,722,547 | 2,458,666 | 66.05 | 142 |
B.Visualizacion
6)Histogramas y poligonos de frecuencia
for (v in colnames(vars_num)[-1]) {
x <- vars_num[[v]]
hist_obj <- hist(
x,
breaks = 12,
freq=FALSE,
main = paste("Histograma y polÃgono -", v),
xlab = v,
col = "lightblue",
border = "gray40",
ylab="Frecuencia relativa"
)
# polÃgono de frecuencias normalizado
lines(hist_obj$mids, hist_obj$density, type = "b", col = "darkblue", lwd = 2)
}
7)Cajas y bigotes
valores_largos <- pivot_longer(
data = vars_num,
cols = dplyr::everything(),
names_to = "Variable",
values_to = "Valor"
)
ggplot(valores_largos, aes(x = Variable, y = Valor)) +
geom_boxplot(fill = "#fdd0a2", colour = "#d94801", outlier.alpha = 0.6) +
theme_bw(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(
title = "Comparación de cajas para variables numéricas",
x = "Variable",
y = "Valor observado"
)
8)QQ-plots y normalidad (Ingresos y Edad)
par(mfrow = c(1, 2))
qqnorm(ing <- na.omit(muestra_290$V11_Ingresos),
main = "QQ-plot: V11_Ingresos",
pch = 19, col = "#1f78b4")
qqline(ing, col = "#1f78b4", lwd = 2)
qqnorm(edad <- na.omit(muestra_290$V9_Edad),
main = "QQ-plot: V9_Edad",
pch = 19, col = "#33a02c")
qqline(edad, col = "#33a02c", lwd = 2)
par(mfrow = c(1, 1))
sh_ing <- shapiro.test(ing)
sh_edad <- shapiro.test(edad)
cat("\n>>> Shapiro-Wilk para V11_Ingresos:\n"); print(sh_ing)
##
## >>> Shapiro-Wilk para V11_Ingresos:
##
## Shapiro-Wilk normality test
##
## data: ing
## W = 0.8482, p-value = 0.0000000000000003335
cat("\n>>> Shapiro-Wilk para V9_Edad:\n"); print(sh_edad)
##
## >>> Shapiro-Wilk para V9_Edad:
##
## Shapiro-Wilk normality test
##
## data: edad
## W = 0.95579, p-value = 0.0000001079
C.Conteo y probabilidad
9)Combinatoria (5 con exactamente 2 de Zona Centro)
n_centro <- sum(muestra_290$v1_sitio_zona == "Zona Centro")
## Warning: Unknown or uninitialised column: `v1_sitio_zona`.
n_no_centro <- nrow(muestra_290) - n_centro
formas_5 <- choose(n_centro, 2) * choose(n_no_centro, 3)
cat("\nNúmero de subgrupos posibles (5 personas, 2 de Zona Centro):", formas_5, "\n")
##
## Número de subgrupos posibles (5 personas, 2 de Zona Centro): 0
10)\(P(Recomienda = SÃ | \text{ V5_Atencion_1a4} \geq 3)\)
#subset se usa seleccionar un subconjunto de una base de datos si se pide que se satisfaga determinada condicion ,en otras palbras se usa para filtrar bases de datos o dataframes en R
subset_buena_at <- subset(muestra_290, V5_Atencion_1a4 >= 3)
p_cond <- mean(subset_buena_at$V3_Recomienda == "SÃ", na.rm = TRUE)
cat("P(Recomienda = SÃ | V5_Atencion_1a4 >= 3):",
round(p_cond, 4), "\n")
## P(Recomienda = SÃ | V5_Atencion_1a4 >= 3): 0.5374
11)Bayes: P(Zona Norte | Recomienda = SÃ)
p_rec <- mean(muestra_290$V3_Recomienda == "SÃ", na.rm = TRUE)
p_norte <- mean(muestra_290$V1_SitioZona == "Zona Norte", na.rm = TRUE)
p_rec_y_norte <- mean(
muestra_290$V3_Recomienda == "SÃ" &
muestra_290$V1_SitioZona == "Zona Norte",
na.rm = TRUE
)
p_norte_dado_rec <- p_rec_y_norte / p_rec
cat("P(Zona Norte | Recomienda = SÃ):", round(p_norte_dado_rec, 4), "\n")
## P(Zona Norte | Recomienda = SÃ): 0.2761
12)Binomial: \(P(X\geq 8)\) con \(p\) = proporción muestral
p_hat <- mean(muestra_290$v3_recomienda == "SÃ", na.rm = TRUE)
## Warning: Unknown or uninitialised column: `v3_recomienda`.
p_bin_ge8 <- 1 - pbinom(q = 7, size = 10, prob = p_hat)
cat("P(X >= 8) para X ~ Bin(10, p̂):", round(p_bin_ge8, 4), "\n")
## P(X >= 8) para X ~ Bin(10, p̂): NaN
13)Poisson: \(P(X \geq 4)\) visitas en Zona Sur
lambda_sur <- with(muestra_290,
mean(V6_VisitasSemana[V1_SitioZona == "Zona Sur"], na.rm = TRUE))
#ppois hace referencia a la probabilidad acumulada para una variable aleatoria distribuida Poisson (discreta) con promedio de ocurrencia del evento de interes conocido
p_pois_ge4 <- 1 - ppois(q = 3, lambda = lambda_sur)
cat("P(X >= 4) para visitas en Zona Sur (Poisson):", round(p_pois_ge4, 4), "\n")
## P(X >= 4) para visitas en Zona Sur (Poisson): 0.5283
14)Hipergeométrica: 6 ‘Excelente’ en 20 (N=1200)
N_poblacion <- 1200
K_exc <- sum(datos_brutos$V4_Atencion_cat == "Excelente", na.rm = TRUE)
#calculo de la poblacion que NO califica la atencion de manera escelente.Como el total debe ser la suma de :
#califican excelente+califican de otra manera(no excelente)=total--> despejamos no excelente
N_no_exc <- N_poblacion - K_exc
p_hip <- dhyper(
x = 6,
m = K_exc,
n = N_no_exc,
k = 20
)
cat("P(6 'Excelente' en una muestra de 20 sin reemplazo):", round(p_hip, 6), "\n")
## P(6 'Excelente' en una muestra de 20 sin reemplazo): 0.110361
15)Normal: \(P(20000 < Precio < 24000)\)
mu_prec <- mean(muestra_290$v7_precio_almuerzo, na.rm = TRUE)
## Warning: Unknown or uninitialised column: `v7_precio_almuerzo`.
## Warning in mean.default(muestra_290$v7_precio_almuerzo, na.rm = TRUE): argument
## is not numeric or logical: returning NA
sd_prec <- sd(muestra_290$v7_precio_almuerzo, na.rm = TRUE)
## Warning: Unknown or uninitialised column: `v7_precio_almuerzo`.
p_norm_20_24 <- pnorm(24000, mean = mu_prec, sd = sd_prec) -pnorm(20000, mean = mu_prec, sd = sd_prec)
cat("P(20000 < Precio < 24000) asumiendo Normal:", round(p_norm_20_24, 4), "\n")
## P(20000 < Precio < 24000) asumiendo Normal: NA
16)Exponencial: \(P(T > 10 ~dÃas)\)
lambda_diaria <- mean(muestra_290$v6_visitas_semana, na.rm = TRUE) / 7
## Warning: Unknown or uninitialised column: `v6_visitas_semana`.
## Warning in mean.default(muestra_290$v6_visitas_semana, na.rm = TRUE): argument
## is not numeric or logical: returning NA
p_exp_10 <- exp(-lambda_diaria * 10)
cat("P(T > 10 dÃas) bajo modelo Exponencial:", round(p_exp_10, 4), "\n")
## P(T > 10 dÃas) bajo modelo Exponencial: NA
D: Intervalos de confianza y pruebas de hipotesis
17)IC 95% para media de V7_PrecioAlmuerzo
x_precio <- as.numeric(as.character(muestra_290$V7_PrecioAlmuerzo))
x_precio <- x_precio[!is.na(x_precio)]
ic_mean_precio <- t.test(x_precio, conf.level = 0.95)
cat("\nIC 95% para la media de V7_PrecioAlmuerzo:\n")
##
## IC 95% para la media de V7_PrecioAlmuerzo:
print(ic_mean_precio$conf.int)
## [1] 22238.84 23326.56
## attr(,"conf.level")
## [1] 0.95
18)IC 95% para proporción de recomendación
indicador_reco <- muestra_290$V3_Recomienda == "SÃ"
ic_prop_reco <- prop.test(
x = sum(indicador_reco, na.rm = TRUE),
n = sum(!is.na(indicador_reco)),
conf.level = 0.95
)
cat("\nIC 95% para proporción que recomienda (V3_Recomienda = 'SÃ'):\n")
##
## IC 95% para proporción que recomienda (V3_Recomienda = 'SÃ'):
print(ic_prop_reco$conf.int)
## [1] 0.4038718 0.5212874
## attr(,"conf.level")
## [1] 0.95
19)IC 95% para varianza de V11_Ingresos
n_ing <- sum(!is.na(muestra_290$V11_Ingresos))
s2_ing <- var(muestra_290$V11_Ingresos, na.rm = TRUE)
alfa <- 0.05
chi_inf <- qchisq(alfa / 2, df = n_ing - 1)
chi_sup <- qchisq(1 - alfa / 2, df = n_ing - 1)
ic_var_ing <- c(
(n_ing - 1) * s2_ing / chi_sup,
(n_ing - 1) * s2_ing / chi_inf
)
cat("\nIC 95% para la varianza de V11_Ingresos:\n")
##
## IC 95% para la varianza de V11_Ingresos:
print(ic_var_ing)
## [1] 5562834712230 7711847066837
20)Prueba t: \(H0: \mu= 22000\) (Precio)
x_precio <- as.numeric(as.character(muestra_290$V7_PrecioAlmuerzo))
x_precio <- x_precio[!is.na(x_precio)]
prueba_t_22000 <- t.test(
x_precio,
mu = 22000,
alternative = "two.sided",
conf.level = 0.95
)
cat("\nPrueba t bilateral para H0: mu = 22000 (V7_PrecioAlmuerzo):\n")
##
## Prueba t bilateral para H0: mu = 22000 (V7_PrecioAlmuerzo):
print(prueba_t_22000)
##
## One Sample t-test
##
## data: x_precio
## t = 2.8326, df = 289, p-value = 0.004943
## alternative hypothesis: true mean is not equal to 22000
## 95 percent confidence interval:
## 22238.84 23326.56
## sample estimates:
## mean of x
## 22782.7
21)Chi-cuadrado independencia Atención vs Zona
tabla_indep <- with(muestra_290,
table(V4_Atencion_cat, V1_SitioZona))
chi_res <- chisq.test(tabla_indep)
cat("\nChi-cuadrado de independencia entre V4_Atencion_cat y V1_SitioZona:\n")
##
## Chi-cuadrado de independencia entre V4_Atencion_cat y V1_SitioZona:
print(chi_res)
##
## Pearson's Chi-squared test
##
## data: tabla_indep
## X-squared = 7.3173, df = 6, p-value = 0.2925
22)Normalidad de Precio (KS + Shapiro)
# Normalidad de Precio (KS + Shapiro)
# 1) Vector numérico de precios sin NA
precio_sin_na <- as.numeric(as.character(muestra_290$V7_PrecioAlmuerzo))
precio_sin_na <- precio_sin_na[!is.na(precio_sin_na)]
# 2) Parámetros muestrales
mu_prec <- mean(precio_sin_na)
sd_prec <- sd(precio_sin_na)
# 3) Precio estandarizado
precio_standar <- (precio_sin_na - mu_prec) / sd_prec
# 4) Kolmogorov–Smirnov contra N(0,1)
ks_norm <- ks.test(precio_standar, "pnorm")
## Warning in ks.test.default(precio_standar, "pnorm"): ties should not be present
## for the one-sample Kolmogorov-Smirnov test
cat("\nKolmogorov–Smirnov para Precio estandarizado ~ Normal(0,1):\n")
##
## Kolmogorov–Smirnov para Precio estandarizado ~ Normal(0,1):
print(ks_norm)
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: precio_standar
## D = 0.080692, p-value = 0.0458
## alternative hypothesis: two-sided
# 5) Shapiro-Wilk en una submuestra (máx. 500 datos)
set.seed(4793)
sub_muestra_prec <- sample(
x = precio_sin_na,
size = min(500, length(precio_sin_na)),
replace = FALSE
)
sw_prec <- shapiro.test(sub_muestra_prec)
cat("\nShapiro-Wilk para V7_PrecioAlmuerzo (submuestra):\n")
##
## Shapiro-Wilk para V7_PrecioAlmuerzo (submuestra):
print(sw_prec)
##
## Shapiro-Wilk normality test
##
## data: sub_muestra_prec
## W = 0.95883, p-value = 0.0000002602
E.Regresion y asociacion
23)Regresión lineal simple: Precio ~ Edad
#lm en ingles linear model se usa para generar el modelo de regresion lineal simple y/o multiple
mod_simple <- lm(V7_PrecioAlmuerzo ~ V9_Edad, data = muestra_290)
cat("\nRegresión lineal simple: V7_PrecioAlmuerzo ~ V9_Edad\n")
##
## Regresión lineal simple: V7_PrecioAlmuerzo ~ V9_Edad
print(summary(mod_simple))
##
## Call:
## lm(formula = V7_PrecioAlmuerzo ~ V9_Edad, data = muestra_290)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9666.6 -3992.4 64.8 3808.7 8875.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 23840.61 1067.77 22.327 <0.0000000000000002 ***
## V9_Edad -28.46 27.75 -1.026 0.306
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4705 on 288 degrees of freedom
## Multiple R-squared: 0.00364, Adjusted R-squared: 0.0001801
## F-statistic: 1.052 on 1 and 288 DF, p-value: 0.3059
r_pe <- cor(muestra_290$V7_PrecioAlmuerzo, muestra_290$V9_Edad, use = "complete.obs")
cat("Correlación (Precio, Edad):", round(r_pe, 4), "\n")
## Correlación (Precio, Edad): -0.0603
cat("R^2 simple:", round(summary(mod_simple)$r.squared, 4), "\n")
## R^2 simple: 0.0036
24)Regresión múltiple
mod_multiple <- lm(
V7_PrecioAlmuerzo ~ V9_Edad + V11_Ingresos + V6_VisitasSemana,
data = muestra_290
)
cat("\nRegresión múltiple: Precio ~ Edad + Ingresos + VisitasSemana\n")
##
## Regresión múltiple: Precio ~ Edad + Ingresos + VisitasSemana
print(summary(mod_multiple))
##
## Call:
## lm(formula = V7_PrecioAlmuerzo ~ V9_Edad + V11_Ingresos + V6_VisitasSemana,
## data = muestra_290)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9464.5 -3561.7 79.5 3329.0 9545.4
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20831.58939915 1105.92254315 18.836 < 0.0000000000000002 ***
## V9_Edad 7.24663380 24.71146305 0.293 0.769544
## V11_Ingresos 0.00077573 0.00009665 8.026 0.0000000000000262 ***
## V6_VisitasSemana -490.47664695 127.91114176 -3.835 0.000155 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4134 on 286 degrees of freedom
## Multiple R-squared: 0.2363, Adjusted R-squared: 0.2283
## F-statistic: 29.5 on 3 and 286 DF, p-value: < 0.00000000000000022
25)Correlacion de Pearson entre ingresos y gastos
#cor calcula la correlacion entre variables
r_ing_gas <- cor(muestra_290$V11_Ingresos, muestra_290$V12_Gastos, use = "complete.obs")
cat("\nCorrelación de Pearson entre V11_Ingresos y V12_Gastos:", round(r_ing_gas, 4), "\n")
##
## Correlación de Pearson entre V11_Ingresos y V12_Gastos: 0.9393
F.ANOVA
26)ANOVA de una vÃa: Precio ~ Zona
anova_uno <- aov(V7_PrecioAlmuerzo ~ V1_SitioZona, data = muestra_290)
cat("\nANOVA de una vÃa: V7_PrecioAlmuerzo ~ V1_SitioZona\n")
##
## ANOVA de una vÃa: V7_PrecioAlmuerzo ~ V1_SitioZona
print(summary(anova_uno))
## Df Sum Sq Mean Sq F value Pr(>F)
## V1_SitioZona 2 4813692513 2406846257 435.7 <0.0000000000000002 ***
## Residuals 287 1585586410 5524691
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\nVerificación rápida de supuestos (ANOVA 1 vÃa):\n")
##
## Verificación rápida de supuestos (ANOVA 1 vÃa):
print(shapiro.test(residuals(anova_uno)))
##
## Shapiro-Wilk normality test
##
## data: residuals(anova_uno)
## W = 0.99748, p-value = 0.9365
print(bartlett.test(V7_PrecioAlmuerzo ~ V1_SitioZona, data = muestra_290))
##
## Bartlett test of homogeneity of variances
##
## data: V7_PrecioAlmuerzo by V1_SitioZona
## Bartlett's K-squared = 34.96, df = 2, p-value = 0.00000002561
ggplot(muestra_290, aes(x = V1_SitioZona, y = V7_PrecioAlmuerzo, fill = V1_SitioZona)) +
geom_boxplot(alpha = 0.85, colour = "gray20") +
scale_fill_manual(values = c("#1b9e77", "#d95f02", "#7570b3")) +
theme_minimal(base_size = 11) +
theme(legend.position = "none") +
labs(
title = "Precio del almuerzo por zona (ANOVA 1 vÃa)",
x = "Zona",
y = "Precio del almuerzo"
)
ANOVA de dos vÃas: Precio ~ Zona * Atención
anova_dos <- aov(V7_PrecioAlmuerzo ~ V1_SitioZona * V4_Atencion_cat, data = muestra_290)
cat("\nANOVA de dos vÃas: V7_PrecioAlmuerzo ~ Zona * Atención\n")
##
## ANOVA de dos vÃas: V7_PrecioAlmuerzo ~ Zona * Atención
print(summary(anova_dos))
## Df Sum Sq Mean Sq F value
## V1_SitioZona 2 4813692513 2406846257 458.020
## V4_Atencion_cat 3 61745817 20581939 3.917
## V1_SitioZona:V4_Atencion_cat 6 62979390 10496565 1.997
## Residuals 278 1460861203 5254896
## Pr(>F)
## V1_SitioZona < 0.0000000000000002 ***
## V4_Atencion_cat 0.00918 **
## V1_SitioZona:V4_Atencion_cat 0.06616 .
## Residuals
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cat("\nPruebas de supuestos (ANOVA 2 vÃas):\n")
##
## Pruebas de supuestos (ANOVA 2 vÃas):
print(shapiro.test(residuals(anova_dos)))
##
## Shapiro-Wilk normality test
##
## data: residuals(anova_dos)
## W = 0.99524, p-value = 0.5145
print(car::leveneTest(V7_PrecioAlmuerzo ~ V1_SitioZona * V4_Atencion_cat,
data = muestra_290))
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 11 3.2164 0.0003849 ***
## 278
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
interaction.plot(
x.factor = muestra_290$V1_SitioZona,
trace.factor = muestra_290$V4_Atencion_cat,
response = muestra_290$V7_PrecioAlmuerzo,
col = c("#1b9e77", "#d95f02", "#7570b3", "#e7298a"),
lwd = 2,
xlab = "Zona",
ylab = "Precio promedio",
trace.label = "CategorÃa de atención",
main = "Interacción Zona x Atención",
bty="l"
)