Libreria

library(lsm)        # Para acceder a la base de datos survey
library(knitr)      # Para construir tablas
library(kableExtra) # Para mejorar la presentación de las tablas

Base de datos

datosCompleto <- lsm::survey

Funciones para intervalos de confianza

# ============================================================
# 1. Intervalo Z para una media con sigma conocida
# ============================================================

ic_media_z <- function(media, sigma, n, conf = 0.95,
                       digitos = 4) {
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  error_estandar <- sigma / sqrt(n)
  margen_error <- z * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "\u03c3",
      "Error estándar",
      "n",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(sigma, digitos),
      round(error_estandar, digitos),
      n,
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

# ============================================================
# 2. Intervalo t para una media con sigma desconocida
# ============================================================

ic_media_t <- function(media, s, n, conf = 0.95,
                       digitos = 4) {
  
  alpha <- 1 - conf
  gl <- n - 1
  t_critico <- qt(1 - alpha / 2, df = gl)
  error_estandar <- s / sqrt(n)
  margen_error <- t_critico * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "s",
      "Error estándar",
      "n",
      "Grados de libertad",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(s, digitos),
      round(error_estandar, digitos),
      n,
      gl,
      round(conf, digitos),
      round(t_critico, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}


# ============================================================
# 3. Intervalo Z para una proporción
# ============================================================

ic_proporcion <- function(exitos, n, conf = 0.95,
                          digitos = 4) {
  
  if (exitos < 0 || exitos > n) {
    stop("El número de éxitos debe estar entre 0 y n.")
  }
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  
  proporcion <- exitos / n
  error_estandar <- sqrt(proporcion * (1 - proporcion) / n)
  margen_error <- z * error_estandar
  
  inferior <- max(0, proporcion - margen_error)
  superior <- min(1, proporcion + margen_error)
  
  resultado <- data.frame(
    Medida = c(
      "Éxitos",
      "n",
      "Proporción",
      "Error estándar",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      exitos,
      n,
      round(proporcion, digitos),
      round(error_estandar, digitos),
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(proporcion, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

Data frame

#Base de datos
datosCompleto <- lsm::survey

# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 100 observaciones
df1 <- datosCompleto[1:100,]

# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 29 observaciones
df2 <- datosCompleto[1:29,]

# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800  66
dim(df1)
## [1] 100  66
dim(df2)
## [1] 29 66

Media con Z

# Elimina los valores perdidos (NA)
edad <- df1$Age[!is.na(df1$Age)] 

# Calcula media y tamaño
media_edad <- mean(edad)
n_edad <- length(edad)

# Calcula el intervalo
resultado <- ic_media_z(
  media = media_edad,
  sigma = 6,
  n = n_edad,
  conf = 0.95
)

resultado
Medida Valor
Media 18.9374
σ 6
Error estándar 0.6
n 100
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 1.176
Extremo inferior 17.7614
Extremo superior 20.1134
Intervalo 18.9374 ± 1.176

Interpretación

Con un grado de confianza del 95% la edad promedio de todos los estudiantes está entre 17.76 y 20.11 años.

Funciones para intervalos de confianza - ejemplo 2 (0.90)

# ============================================================
# 1. Intervalo Z para una media con sigma conocida
# ============================================================

ic_media_z <- function(media, sigma, n, conf = 0.90,
                       digitos = 4) {
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  error_estandar <- sigma / sqrt(n)
  margen_error <- z * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "\u03c3",
      "Error estándar",
      "n",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(sigma, digitos),
      round(error_estandar, digitos),
      n,
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

# ============================================================
# 2. Intervalo t para una media con sigma desconocida
# ============================================================

ic_media_t <- function(media, s, n, conf = 0.90,
                       digitos = 4) {
  
  alpha <- 1 - conf
  gl <- n - 1
  t_critico <- qt(1 - alpha / 2, df = gl)
  error_estandar <- s / sqrt(n)
  margen_error <- t_critico * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "s",
      "Error estándar",
      "n",
      "Grados de libertad",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(s, digitos),
      round(error_estandar, digitos),
      n,
      gl,
      round(conf, digitos),
      round(t_critico, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}


# ============================================================
# 3. Intervalo Z para una proporción
# ============================================================

ic_proporcion <- function(exitos, n, conf = 0.90,
                          digitos = 4) {
  
  if (exitos < 0 || exitos > n) {
    stop("El número de éxitos debe estar entre 0 y n.")
  }
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  
  proporcion <- exitos / n
  error_estandar <- sqrt(proporcion * (1 - proporcion) / n)
  margen_error <- z * error_estandar
  
  inferior <- max(0, proporcion - margen_error)
  superior <- min(1, proporcion + margen_error)
  
  resultado <- data.frame(
    Medida = c(
      "Éxitos",
      "n",
      "Proporción",
      "Error estándar",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      exitos,
      n,
      round(proporcion, digitos),
      round(error_estandar, digitos),
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(proporcion, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

Data frame

#Base de datos
datosCompleto <- lsm::survey

# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 100 observaciones
df1 <- datosCompleto[1:100,]

# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 29 observaciones
df2 <- datosCompleto[1:29,]

# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800  66
dim(df1)
## [1] 100  66
dim(df2)
## [1] 29 66

Media con Z

# Elimina los valores perdidos (NA)
edad <- df1$Age[!is.na(df1$Age)] 

# Calcula media y tamaño
media_edad <- mean(edad)
n_edad <- length(edad)

# Calcula el intervalo
resultado <- ic_media_z(
  media = media_edad,
  sigma = 6,
  n = n_edad,
  conf = 0.90
)

resultado
Medida Valor
Media 18.9374
σ 6
Error estándar 0.6
n 100
Grado de confianza 0.9
Valor crítico 1.6449
Margen de error 0.9869
Extremo inferior 17.9505
Extremo superior 19.9243
Intervalo 18.9374 ± 0.9869

Interpretación

Con un grado de confianza del 90% la edad promedio de todos los estudiantes está entre 17.95 y 19.92 años.

Funciones para intervalos de confianza - ejemplo 3 (0.99)

# ============================================================
# 1. Intervalo Z para una media con sigma conocida
# ============================================================

ic_media_z <- function(media, sigma, n, conf = 0.99,
                       digitos = 4) {
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  error_estandar <- sigma / sqrt(n)
  margen_error <- z * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "\u03c3",
      "Error estándar",
      "n",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(sigma, digitos),
      round(error_estandar, digitos),
      n,
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

# ============================================================
# 2. Intervalo t para una media con sigma desconocida
# ============================================================

ic_media_t <- function(media, s, n, conf = 0.99,
                       digitos = 4) {
  
  alpha <- 1 - conf
  gl <- n - 1
  t_critico <- qt(1 - alpha / 2, df = gl)
  error_estandar <- s / sqrt(n)
  margen_error <- t_critico * error_estandar
  
  inferior <- media - margen_error
  superior <- media + margen_error
  
  resultado <- data.frame(
    Medida = c(
      "Media",
      "s",
      "Error estándar",
      "n",
      "Grados de libertad",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      round(media, digitos),
      round(s, digitos),
      round(error_estandar, digitos),
      n,
      gl,
      round(conf, digitos),
      round(t_critico, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(media, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}


# ============================================================
# 3. Intervalo Z para una proporción
# ============================================================

ic_proporcion <- function(exitos, n, conf = 0.99,
                          digitos = 4) {
  
  if (exitos < 0 || exitos > n) {
    stop("El número de éxitos debe estar entre 0 y n.")
  }
  
  alpha <- 1 - conf
  z <- qnorm(1 - alpha / 2)
  
  proporcion <- exitos / n
  error_estandar <- sqrt(proporcion * (1 - proporcion) / n)
  margen_error <- z * error_estandar
  
  inferior <- max(0, proporcion - margen_error)
  superior <- min(1, proporcion + margen_error)
  
  resultado <- data.frame(
    Medida = c(
      "Éxitos",
      "n",
      "Proporción",
      "Error estándar",
      "Grado de confianza",
      "Valor crítico",
      "Margen de error",
      "Extremo inferior",
      "Extremo superior",
      "Intervalo"
    ),
    
    Resultado = c(
      exitos,
      n,
      round(proporcion, digitos),
      round(error_estandar, digitos),
      round(conf, digitos),
      round(z, digitos),
      round(margen_error, digitos),
      round(inferior, digitos),
      round(superior, digitos),
      paste0(
        round(proporcion, digitos),
        " ± ",
        round(margen_error, digitos)
      )
    ),
    
    check.names = FALSE
  )
  
  knitr::kable(
    resultado,
    format = "html",
    col.names = c("Medida", "Valor"),
    align = c("l", "r")
  )
}

Data frame

#Base de datos
datosCompleto <- lsm::survey

# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 100 observaciones
df1 <- datosCompleto[1:100,]

# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 29 observaciones
df2 <- datosCompleto[1:29,]

# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800  66
dim(df1)
## [1] 100  66
dim(df2)
## [1] 29 66

Media con Z

# Elimina los valores perdidos (NA)
edad <- df1$Age[!is.na(df1$Age)] 

# Calcula media y tamaño
media_edad <- mean(edad)
n_edad <- length(edad)

# Calcula el intervalo
resultado <- ic_media_z(
  media = media_edad,
  sigma = 6,
  n = n_edad,
  conf = 0.99
)

resultado
Medida Valor
Media 18.9374
σ 6
Error estándar 0.6
n 100
Grado de confianza 0.99
Valor crítico 2.5758
Margen de error 1.5455
Extremo inferior 17.3919
Extremo superior 20.4829
Intervalo 18.9374 ± 1.5455

Interpretación

Con un grado de confianza del 99% la edad promedio de todos los estudiantes está entre 17.39 y 20.48 años.

Media con 𝑡

# Elimina los valores perdidos (NA)
edad <- df2$Age[!is.na(df2$Age)] 

# Calcula media y tamaño
media_edad <- mean(edad)
s_edad <- sd(edad)
n_edad <- length(edad)

# Calcula el intervalo
resultado <- ic_media_t(
  media = media_edad,
  s = s_edad,
  n = n_edad,
  conf = 0.95
)

resultado
Medida Valor
Media 19.2641
s 2.0637
Error estándar 0.3832
n 29
Grados de libertad 28
Grado de confianza 0.95
Valor crítico 2.0484
Margen de error 0.785
Extremo inferior 18.4792
Extremo superior 20.0491
Intervalo 19.2641 ± 0.785

Interpretación

Con un grado de confianza del 95% la media verdadera de la edad en toda la población se encuentra entre 18.48 y 20.05 años.

Intervalo para una proporción (Female)

# Elimina los valores perdidos (NA)
genero <- df1$Gender[!is.na(df1$Gender)]

# Calcula número de estudiantes de género Female (éxitos) y tamaño total de la muestra.
total_fem <- sum(genero == "Female")
n_fem <- length(genero)

# Calcula el intervalo
resultado <- ic_proporcion(
  exitos = total_fem,
  n = n_fem,
  conf = 0.95
)

resultado
Medida Valor
Éxitos 49
n 100
Proporción 0.49
Error estándar 0.05
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 0.098
Extremo inferior 0.392
Extremo superior 0.588
Intervalo 0.49 ± 0.098

Interpretación

Con un grado de confianza del 95%, la proporción real de estudiantes de género femenino en la población objetivo se encuentra entre el 39.2% y el 58.8%.

Tabla FEMALE - MALE

table(df1$Gender)
## 
## Female   Male 
##     49     51

Intervalo para una proporción (Male)

# Elimina los valores perdidos (NA)
genero <- df1$Gender[!is.na(df1$Gender)]

# Calcula número de estudiantes de género Female (éxitos) y tamaño total de la muestra.
total_male <- sum(genero == "Male")
n_male <- length(genero)

# Calcula el intervalo
resultado <- ic_proporcion(
  exitos = total_male,
  n = n_male,
  conf = 0.95
)

resultado
Medida Valor
Éxitos 51
n 100
Proporción 0.51
Error estándar 0.05
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 0.098
Extremo inferior 0.412
Extremo superior 0.608
Intervalo 0.51 ± 0.098

Interpretación

Con un grado de confianza del 95%, la proporción real de estudiantes de género masculino en la población objetivo se encuentra entre el 41.2% y el 60.8%.

EJERCICIO DE PRACTICA

Data frame

#Base de datos
datosCompleto <- lsm::survey

# Para algunos ejemplos de esta sección utilizaremos únicamente las primeras 50 observaciones
df3 <- datosCompleto[1:50,]

# Para otros ejemplos de esta sección utilizaremos únicamente las primeras 25 observaciones
df4 <- datosCompleto[1:25,]

# Dimensión de las dos bases de datos (observaciones, variables)
dim(datosCompleto)
## [1] 800  66
dim(df3)
## [1] 50 66
dim(df4)
## [1] 25 66

Media con Z

# Elimina los valores perdidos (NA)
peso <- df3$Weight[!is.na(df3$Weight)] 

# Calcula media y tamaño
media_peso <- mean(peso)
n_peso <- length(peso)

# Calcula el intervalo
resultado <- ic_media_z(
  media = media_peso,
  sigma = 6,
  n = n_peso,
  conf = 0.95
)

resultado
Medida Valor
Media 73.708
σ 6
Error estándar 0.8485
n 50
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 1.6631
Extremo inferior 72.0449
Extremo superior 75.3711
Intervalo 73.708 ± 1.6631

Interpretación

Con un grado de confianza del 95%, el peso medio poblacional verdadero se encuentra entre 72.04 kg y 75.37 kg.

Media (con 𝑡)

# Elimina los valores perdidos (NA)
peso <- df4$Weight[!is.na(df4$Weight)] 

# Calcula media y tamaño
media_peso <- mean(peso)
s_peso <- sd(peso)
n_peso<- length(peso)

# Calcula el intervalo
resultado <- ic_media_t(
  media = media_peso,
  s = s_peso,
  n = n_peso,
  conf = 0.95
)

resultado
Medida Valor
Media 77.256
s 16.8435
Error estándar 3.3687
n 25
Grados de libertad 24
Grado de confianza 0.95
Valor crítico 2.0639
Margen de error 6.9527
Extremo inferior 70.3033
Extremo superior 84.2087
Intervalo 77.256 ± 6.9527

Interpretación

Con un grado de confianza del 95%, el peso promedio real en la población objetivo se encuentra entre 70.30 kg y 84.21 kg.

Intervalo para una proporción (colegio privado)

# Elimina los valores perdidos (NA)
School <- df3$School[!is.na(df3$School)]

# Calcula número de estudiantes de colegio privado (éxitos) y tamaño total de la muestra.
total_priv <- sum(School == "Private")
n_priv <- length(School)

# Calcula el intervalo
resultado <- ic_proporcion(
  exitos = total_priv,
  n = n_priv,
  conf = 0.95
)

resultado
Medida Valor
Éxitos 25
n 50
Proporción 0.5
Error estándar 0.0707
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 0.1386
Extremo inferior 0.3614
Extremo superior 0.6386
Intervalo 0.5 ± 0.1386

Interpretación

Con un grado de confianza del 95%, la proporción real de estudiantes que provienen de colegio privado en la población objetivo se encuentra entre el 36.14% y el 63.86%.

Intervalo para una proporción (colegio publico)

# Elimina los valores perdidos (NA)
School <- df4$School[!is.na(df4$School)]

# Calcula número de estudiantes de colegio publico (éxitos) y tamaño total de la muestra.
total_public <- sum(School == "Public")
n_public <- length(School)

# Calcula el intervalo
resultado <- ic_proporcion(
  exitos = total_public,
  n = n_public,
  conf = 0.95
)

resultado
Medida Valor
Éxitos 12
n 25
Proporción 0.48
Error estándar 0.0999
Grado de confianza 0.95
Valor crítico 1.96
Margen de error 0.1958
Extremo inferior 0.2842
Extremo superior 0.6758
Intervalo 0.48 ± 0.1958

Interpretación

Con un grado de confianza del 95%, la proporción real de estudiantes provenientes de colegio público en la población objetivo se encuentra entre el 28.42% y el 67.58%.