1 La Estadística en los Negocios

La estadística es una herramienta fundamental en el mundo empresarial, ya que permite tomar decisiones basadas en datos y no en suposiciones. A través del análisis estadístico, las organizaciones pueden identificar tendencias del mercado, evaluar el rendimiento financiero, optimizar procesos y comprender el comportamiento del consumidor. Esto no solo mejora la eficiencia operativa, sino que también brinda ventajas competitivas al permitir una planificación estratégica más precisa y adaptada a los cambios del entorno.

Mira este video para profundizar más: Importancia de la estadística en los negocios

2 Importancia de Usar RStudio

RStudio es una de las herramientas más poderosas y versátiles para el análisis de datos estadísticos. Su entorno de desarrollo integrado facilita la escritura, ejecución y depuración de código en R, permitiendo a los usuarios realizar análisis complejos, visualizaciones interactivas y modelado estadístico de manera eficiente. Es ampliamente utilizado en el ámbito académico, científico y empresarial gracias a su capacidad para manejar grandes volúmenes de datos, su compatibilidad con múltiples paquetes especializados y su enfoque reproducible en los proyectos de análisis.

3 Instalación y Configuración de R-STUDIO

Para comenzar a usar R, el primer paso es instalarlo en tu computadora. R es compatible con casi todas las plataformas, incluyendo los sistemas operativos más comunes. Windows, Mac OS X y Linux. Links de descarga para R y RStudio.

RStudio es un entorno de desarrollo integrado (IDE) disponible para R, el cual tiene un buen editor con resaltado de sintaxis, un visor de objetos de R y un gran número de características agradables que están integradas.Ademas, esta dedicado a la computación estadística y gráficos.

3.1 “Mundo” Tidyverse en R-Studio

El Tidyverse es una colección de paquetes del R que permiten preparar, procesar y graficar bases de datos. Se destacan los siguientes:

  • ggplot: permite crear visualizaciones elegantes de los datos de una manera relativamente sencilla.

  • stringr: permite manipular cadenas de caracteres con el fin de realizar sustituciones, detectar duplicados, analizar patrones, etc.

  • tidyr: tiene como objetivo obtener datos ordenados. Destacan funciones como gather para crear factores con base en nombres de columnas y separate para crear factores separando los caracteres de una columna.

  • readr: permite importar y exportar bases de datos en diferentes formatos y tiene implementada la función problems que detecta problemas en nuestras bases.

Para más información visitar la página web:
https://www.tidyverse.org/packages/

3.2 Creación de reportes en R con R Markdown:

4 Conceptos básicos de programación en R:

library(magrittr)
# Crear los datos
comandos <- c("x == y", "x != y", "x > y", "x < y", "x >= y", "x <= y", "&", "|", "!", "isTRUE(A)")
significado <- c("x es igual a y", "x no es igual a y", "x es mayor que y", "x es menor que y",
                 "x es mayor o igual que y", "x es menor o igual que y", "y", "o", "No", "Evalúa si A es cierta")

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
tabla <- data.frame(Comando = comandos, Significado = significado)

tabla %>%
  kbl(col.names = c("Comando", "Significado"), booktabs = TRUE) %>%
  kable_styling(full_width = TRUE, position = "center", font_size = 24) %>%
  row_spec(0, bold = TRUE, background = "#D3D3D3") %>%
  kable_paper("striped", full_width = FALSE) %>%
  column_spec(1, width = "6cm") %>%
  column_spec(2, width = "12cm")
Comando Significado
x == y x es igual a y
x != y x no es igual a y
x > y x es mayor que y
x < y x es menor que y
x >= y x es mayor o igual que y
x <= y x es menor o igual que y
& y

4.1 Creación de Objetos

R es un lenguaje orientado a objetos. Los objetos pueden ser usados para guardar valores y pueden madificarse mediante funciones como por ejemplo sumar dos objetos o calcular la media.

X <- 4
Y <- 2

4.1.1 R como calculadora

Puedes usar el programa R como una calculadora, basta con conocer cuáles son los signos y comandos a utilizar para realizar las operaciones. Copia los comandos en tu script de R y ejecútalos para ver los resultados.

#suma
Z <- X +Y

Z
## [1] 6
#multiplicación
2*2
## [1] 4
#división
2/2
## [1] 1
#potencia
4^2
## [1] 16
#raíz cuadrada
sqrt(16)
## [1] 4

5 Visualización de Bases de datos en R.

5.1 Cargar paquetes

Lo primero que tenemos que hacer es cargar los paquetes que vamos a utilizar para el análisis. En este caso vamos a usar:

library(tidyverse)# Incluye paquetes de importación, visualización entre otros
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.1     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.0.4     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::extract()         masks magrittr::extract()
## ✖ dplyr::filter()          masks stats::filter()
## ✖ kableExtra::group_rows() masks dplyr::group_rows()
## ✖ dplyr::lag()             masks stats::lag()
## ✖ purrr::set_names()       masks magrittr::set_names()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)# Manipulación de Datos
library(ggplot2)# Visualización de datos 
library(readxl)# Importación de datos
require(tibble)# Tablas

Recordar que si no ha instalado estos paquetes debe correr primero el comando: install.packages("nombre del paquete")

6 Análisis Exploratorio de Datos

El análisis exploratorio de datos (Ver video) (EDA por sus siglas en inglés) implica el uso de gráficos y visualizaciones para explorar y analizar un conjunto de datos. El objetivo es explorar, investigar y aprender, no confirmar hipótesis estadísticas.

6.1 ¿Cuándo debo utilizarlo?

El análisis exploratorio de datos es una potente herramienta para explorar un conjunto de datos. Incluso cuando su objetivo es efectuar análisis planificados, el EDA puede utilizarse para limpiar datos, para análisis de subgrupos o simplemente para comprender mejor los datos. Un paso inicial importante en cualquier análisis de datos es representar los datos gráficamente.

No gráfico: Calcula estadísticas descriptivas de las variables

Gráfico: Calcula estadísticas de forma gráfica

Univariado: Analiza una sola variable a la vez

Multivariado: Analiza dos o más variables

A su vez, cada uno de esas dividisiones puede subdividirse según los tipos de datos con los que trabajemos: categóricos o numéricos.

6.2 Pasos para un Análisis Exploratorio de Datos (EDA)

6.2.1 Comprender el contexto

6.2.2 Importar datos:

  • Cargar los datos.
  • Comprender la estructura del dataset.

6.2.3 Limpieza, tratamiento y preparación:

  • Revisión de los tipos de datos y conversión si es necesario.

  • Revisión de valores faltantes.

  • Resumen estadístico inicial.

  • Detección de outliers.

    • Los atípicos deben ser tratados.
    • Si se tratan con imputación, y esta debe ser evaluada utilizando histogramas o pruebas analíticas de igualdad de distribución, dependiendo del resultado de la normalidad.

6.2.4 Análisis descriptivo de las variables:

  • Análisis de la distribución de las variables.
  • Identificación de relaciones entre variables.
  • Análisis de variables categóricas.
  • Exploración de interacciones de variables.

6.2.5 Documentación de hallazgos.

6.3 Representación de datos según su Naturaleza

tabla <- data.frame(
  "Naturaleza de la variable" = c("Cualitativa", "", "Cuantitativa", ""),
  "Escala de Medidas" = c("Nominal", "Ordinal", "Intervalo", "Razon"),
  "Frecuencias" = c("Si", "Si", "Agrupadas", ""),
  "Medidas de Localizacion" = c("Moda", "Moda", "Media, Mediana y Moda", ""),
  "Medidas de Dispersion" = c("No", "No", "Si", "Si"),
  "Medidas de Distribucion" = c("No", "No", "Si", "Si"),
  "Graficos" = c("Sectores, Barras", "Sectores, Barras (sin orden)", "Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion.", "")
)

# Create the table with kableExtra
library(knitr)
library(kableExtra)

tabla %>%
  kable("html", align = "c", col.names = c(
    "Naturaleza de la variable", 
    "Escala de Medidas", 
    "Frecuencias", 
    "Medidas de Localizacion", 
    "Medidas de Dispersion", 
    "Medidas de Distribucion", 
    "Graficos"
  )) %>%
  kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
  row_spec(1:2, background = "white", color = "black") %>%
  row_spec(3:4, background = "#E7E7E7", color = "black")
Naturaleza de la variable Escala de Medidas Frecuencias Medidas de Localizacion Medidas de Dispersion Medidas de Distribucion Graficos
Cualitativa Nominal Si Moda No No Sectores, Barras
Ordinal Si Moda No No Sectores, Barras (sin orden)
Cuantitativa Intervalo Agrupadas Media, Mediana y Moda Si Si Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion.
Razon Si Si

6.4 Presentación y análisis de la Información en estudios Descríptivos.

tabla <- data.frame(
  "Tipo de Tabla" = c(
    "De Frecuencia (Variable Cualitativa)",
    "De Frecuencia (Variable Cuantitativa)",
    "De Asociacion (Dos Variables Cualitativas)",
    "De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta)",
    "De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua)",
    "De Asociacion (Dos Variables Cuantitativas)"
  ),
  "Tipo de Grafico" = c(
    "- Barras simples\n- Pastel",
    "- Histograma",
    "- Barras compuestas\n- Barras superpuestas",
    "- Barras:\n  * Compuestas\n  * Superpuestas",
    "- Poligono de Frecuencia\n- Box plot (diagrama de cajas y bigotes)",
    "- Diagrama de Puntos"
  ),
  stringsAsFactors = FALSE
)

# Creating the table using kableExtra
tabla %>%
  kable("html", escape = FALSE, align = "l", col.names = c("Tipo de Tabla", "Tipo de Grafico")) %>%
  kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
  row_spec(c(3, 4), background = "#F2F2F2", color = "black") %>%
  row_spec(c(2, 5), background = "white", color = "black") %>%
  row_spec(c(1, 6), background = "#E7E7E7", color = "black") %>%
  column_spec(1, width = "4cm") %>%
  column_spec(2, width = "6cm")
Tipo de Tabla Tipo de Grafico
De Frecuencia (Variable Cualitativa)
  • Barras simples
  • Pastel
De Frecuencia (Variable Cuantitativa)
  • Histograma
De Asociacion (Dos Variables Cualitativas)
  • Barras compuestas
  • Barras superpuestas
  • De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta)
    • Barras:
    • Compuestas
    • Superpuestas
    De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua)
    • Poligono de Frecuencia
  • Box plot (diagrama de cajas y bigotes)
  • De Asociacion (Dos Variables Cuantitativas)
    • Diagrama de Puntos

    6.5 Situación Problema.

    Exploración de la Intersección entre la Economía, la Administración y la Ciencia de Datos: Comportamiento de Jóvenes Consumidores en Entornos Digitales

    En un centro de investigación en economía y administración, se analizan los patrones de consumo y comportamiento digital de jóvenes en distintos niveles educativos y ocupacionales. La base de datos recoge variables demográficas (edad, sexo, nivel educativo), así como indicadores de uso de redes sociales y tiempo dedicado a juegos en línea, que funcionan como aproximaciones al consumo digital y al ocio de los individuos.

    Además, se incluyen mediciones relacionadas con percepciones subjetivas como satisfacción con la vida, manejo del estrés y confianza personal, interpretadas aquí como capital humano y bienestar percibido, factores que influyen en la productividad y en la toma de decisiones económicas.

    El análisis se apoya en herramientas de ciencia de datos y estadística aplicada, con el objetivo de:

    Identificar diferencias en el comportamiento digital según ocupación o nivel educativo.

    Explorar la relación entre el tiempo invertido en ocio digital y variables de bienestar (estrés, satisfacción, autoestima).

    Estudiar cómo las redes sociales preferidas pueden estar asociadas a estrategias de mercadeo, segmentación de consumidores y hábitos de consumo en línea.

    Este enfoque interdisciplinar permite comprender mejor los hábitos digitales como un reflejo del comportamiento económico de los jóvenes, aportando información valiosa para la administración de empresas, el diseño de estrategias de marketing y la formulación de políticas orientadas al consumo digital responsable.

    6.6 Construcción de una base de datos

    A continuación se construirá la primera base de datos a partir de las variables. Para esto, como se observa en los siguientes comandos, se parte por la construcción de 11 variables de 20 casos cada una:

    #Creación de las variables: todas tienen la misma cantidad de casos.
    Jovenes <- c("Mario", "Luis", "Pedro", "Maria", "Sandra", "Erika", "Laura","Luz","Olga")
    Edad <- c(18, 20, 20, 17, 19, 22, 22, 22,31)
    Sexo <- c("Masculino", "Femenino", "Masculino", "Femenino", "Masculino", "Femenino", "Masculino", "Femenino","Femenino")
    Educacion <- c("Universidad", "Secundaria", "Universidad", "Posgrado", "Universidad", "Universidad", "Universidad", "Posgrado","Posgrado")
    Ocupacion <- c("Estudiante", "Profesional", "Estudiante", "Profesional", "Estudiante", "Profesional", "Estudiante", "Profesional","Posgrado")
    Red_Social_Principal <- c("Instagram", "Facebook", "Instagram", "Twitter", "TikTok", "Instagram", "Facebook", "Instagram","TikTok")
    Tiempo_en_Redes_Sociales <- c(2.5, 3.0, 2.0, 2.5, 3.5, 2.2, 2.8, 3.0,2.0)
    Horas_Semanales_de_Juego <- c(15, 20, 12, 10, 18, 15, 20, 15,41)
    Autoestima <- c(8.2, 6.9, 7.8, 7.0, 8.5, 7.3, 8.0, 7.6,9)
    Ansiedad_Social <- c(42, 50, 38, 45, 35, 48, 40, 42,45)
    Satisfaccion_con_la_Vida <- c(7.5, 6.9, 8.0, 7.2, 7.8, 6.5, 7.0, 7.3,8)
    Estres<- c(2,2,1,3,4,2,1,4,4)

    A partir de las variables ya creadas se puede construir una base de datos.

    df=data.frame(Jovenes, Edad,Sexo,Edad,Educacion, Ocupacion, Red_Social_Principal,Horas_Semanales_de_Juego,Ansiedad_Social,Satisfaccion_con_la_Vida,Estres)
    df

    7 Representación de datos

    La representación de datos se refiere al proceso de presentar la información de manera visual o tabular para facilitar su comprensión, análisis y comunicación. Esta representación puede tomar diversas formas, incluyendo gráficos, tablas, diagramas, mapas y resúmenes estadísticos. El objetivo principal de la representación de datos es convertir datos crudos en información comprensible y significativa.

    Aquí hay una descripción de algunas formas comunes de representación de datos:

    Gráficos: Los gráficos son representaciones visuales de datos que utilizan diferentes tipos de elementos visuales, como líneas, barras, puntos y áreas, para mostrar la relación entre variables o la distribución de datos. Algunos tipos comunes de gráficos incluyen gráficos de barras, gráficos de líneas, gráficos circulares, histogramas y diagramas de dispersión.

    Tablas: Las tablas son representaciones tabulares de datos que organizan la información en filas y columnas. Las tablas son útiles para mostrar datos detallados o para comparar valores entre diferentes categorías o grupos. Pueden incluir valores numéricos, texto descriptivo y otras características.

    7.1 Representación en Gráficos.

    Para visualizar los datos en formato dataframe puede usar el comando View() o también head() para visualizar las primeras filas en consola.

    head(df)

    7.1.1 Diagrama de barras

    ggplot2 es un sistema para crear gráficos de forma declarativa, basado en la Gramática de los Gráficos. Se deben proporcionar los datos, indicar a ggplot2 cómo asignar las variables a la estética y qué tipo de gráficas utilizar. La función geom_bar() se utiliza para producir gráficos de área 1d: gráficos de barras para x categóricas, e histogramas para y continuas

    library(ggplot2)
    ggplot(data=df, aes(x=Jovenes, y=Edad)) + geom_bar(stat="identity")+labs(title = "Distribución de Edad por Jovenes")

    El diagrama puede ser dibujado en forma horizontal usando la función coord_flip()

    ggplot(data=df, aes(x=Jovenes, y=Edad)) + geom_bar(stat="identity")+labs(title = "Distribución de Edad por Jovenes")+ coord_flip()

    Podemos cambiar el ancho, así como también el color de las barras y bordes. Nótese que se puede hacer una copia de la gráfica en una variable, en este ejemplo en p para que luego pueda ser usada para presentar el grafico o realizar más transformaciones

    ggplot(data=df, aes(x=Jovenes, y=Edad)) + geom_bar(stat="identity",width=0.5)+labs(title = "Distribución de Edad por Jovenes")

    ggplot(data=df, aes(x=Jovenes, y=Edad)) + geom_bar(stat="identity",width=0.5,color="blue", fill="green3")+labs(title = "Distribución de Edad por Jovenes")

    ggplot(data=df, aes(x=Jovenes, y=Edad)) + geom_bar(stat="identity",width=0.8, fill="steelblue")+labs(title = "Distribución de Edad por Jovenes")

    #creando tabla de resumen
    Tabla_1 <- df %>%
      dplyr::group_by(Red_Social_Principal) %>%                                  
      dplyr::summarise(Total = n()) %>%                                
      dplyr::mutate(Porcentaje = round(Total/sum(Total)*100, 1)) %>%   
      dplyr::arrange(Red_Social_Principal)
    Tabla_1
    "Grafico"
    ## [1] "Grafico"
    G1<-ggplot(Tabla_1, aes(x =Red_Social_Principal, y=Total) ) + 
      geom_bar(width = 0.7,stat="identity",                 
               position = position_dodge(), fill="cyan4") +  
      ylim(c(0,5))+
      #xlim(c(0,300)) +                  
      #ggtitle("Un título") + 
      labs(x="Red Social", y= "Frecuencias \n (Porcentajes)")   +   
      geom_text(aes(label=paste0(Total," ", "", "(", Porcentaje, "%", ")")),  
                vjust=-0.9, 
                color="black", 
                hjust=0.5,
                # define text position and size
                position = position_dodge(0.9),  
                angle=0, 
                size=4.5) +   
      theme(axis.text.x = element_text(angle = 0, vjust = 1, hjust=1)) +      
      theme_bw(base_size = 16) +
      #coord_flip() +                                                         
      facet_wrap(~"Distribución de Tipo de Red Social")
    G1

    7.1.2 Gráfico de barras agrupado

    Un gráfico de barras agrupado muestra un valor numérico para un conjunto de entidades divididas en grupos y subgrupos.

    El conjunto de datos para el presente ejemplo proporciona 3 columnas: el valor numérico (value), y 2 variables categóricas. En el llamada aes(), x es (categ), y el subgrupo (categ) se da al argumento fill. En la función geom_bar(), debe especificarse position=“dodge” para que las barras estén una al lado de la otra.

    • El siguiente llamado es utilizado para el gráfico de barras agrupado
    head(df)
    ggplot(df, aes(fill = Sexo, y = Edad, x = Red_Social_Principal, label = Edad)) +
      geom_bar(position = "dodge", stat = "identity") +
      labs(title = "Distribución de la Red Social según Sexo",
           x = "Red Social Principal",
           y = "Edad",
           fill = "Sexo")  

    ggplot(df, aes(fill = Sexo, x = Red_Social_Principal)) +
      geom_bar(position = "stack") +
      geom_text(stat = 'count', aes(label = ..count..), position = position_stack(vjust = 0.5), size = 3, color = "black") +
      labs(title = "Distribución de la Red Social según el Sexo",
           x = "Red Social Principal",
           y = "Frecuencia") +
      scale_fill_manual(values = c("blue2", "pink2"), name = "Sexo", labels = c("Hombre", "Mujer")) +
      theme(legend.position = "right")  # Ubicación de la leyenda 
    ## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
    ## ℹ Please use `after_stat(count)` instead.
    ## This warning is displayed once every 8 hours.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

    7.1.3 Histograma

    Los histogramas son útiles para representar la distribución de variables continuas como Edad, Tiempo en Redes Sociales y Horas Semanales de Juego. Cada barra del histograma muestra la frecuencia de los datos..

    ggplot(data = df, aes(x = Edad)) +
      geom_histogram(binwidth = 1, fill = "skyblue", color = "black", alpha = 0.8) +
      labs(title = "Histograma de Edades",
           x = "Edad",
           y = "Frecuencia")

    7.1.4 Gráfico Circular

    ggplot2 no ofrece ningún geom específica para construir diagramas circulares (piecharts). El truco es el siguiente: El marco de datos de entrada tiene 2 columnas: los nombres de los grupos (group here) y su valor (value here), se construye un gráfico de barras apilado con una sola barra utilizando la función geom_bar(), luego se hace circular con coord_polar()

    library(magrittr)
    library(dplyr)
    
    #Tabla resumen
    Tabla_2 <- df %>% 
      group_by(Sexo) %>% # Variable a ser transformada
      count() %>% 
      ungroup() %>% 
      mutate(Porcentaje = `n` / sum(`n`)) %>% 
      arrange(Porcentaje) %>%
      mutate(etiquetas = scales::percent(Porcentaje))
    
    #Grafico #2
    require(scales)
    ## Cargando paquete requerido: scales
    ## 
    ## Adjuntando el paquete: 'scales'
    ## The following object is masked from 'package:purrr':
    ## 
    ##     discard
    ## The following object is masked from 'package:readr':
    ## 
    ##     col_factor
    ggplot(Tabla_2, aes(x = "", y = Porcentaje, fill = Sexo)) +
      geom_col(color = "black") +
      geom_label(aes(label = etiquetas),
                 position = position_stack(vjust = 0.5),
                 show.legend = FALSE) +
      guides(fill = guide_legend(title = "Distribución de Pacientes según el Sexo")) + scale_color_gradient() +
      coord_polar(theta = "y") + ggtitle ("")

      #theme_void() 

    7.2 Representación en Tablas

    La libreria questionr de R contiene la función freq la cual genera y formatea tablas de frecuencia simples a partir de una variable o una tabla, con porcentajes y opciones de formato. El resultado es un objeto de la clase data.frame.

    library(questionr)
    
    Tabla_Sexo <- questionr::freq(Sexo, cum = TRUE, sort = "dec", total = TRUE)
    knitr::kable(Tabla_Sexo)
    n % val% %cum val%cum
    Femenino 5 55.6 55.6 55.6 55.6
    Masculino 4 44.4 44.4 100.0 100.0
    Total 9 100.0 100.0 100.0 100.0

    La tabla puede ordenarse opcionalmente en frecuencia descendente, y funciona bien con kable. Si deseamos ver la estructura de la tabla generada por freq() utilizamos la función str()

    str(Tabla_Sexo) 
    ## Classes 'freqtab' and 'data.frame':  3 obs. of  5 variables:
    ##  $ n      : num  5 4 9
    ##  $ %      : num  55.6 44.4 100
    ##  $ val%   : num  55.6 44.4 100
    ##  $ %cum   : num  55.6 100 100
    ##  $ val%cum: num  55.6 100 100

    7.2.1 Tabla de frecuencias agrupada

    Para realizar una tabla de frecuencias agrupada utilizaremos en este ejemplo la Regla de Sturges, en la que el número de clases es obtenido por medio de: \(c=1+ln(N)/ln(2)\) donde \(N\) representa el número total de datos. Consideremos el Ejemplo 23 de los apuntes, en el que se representan las edades de un conjunto de estudiantes.

    Ejemplo: Se tienen las siguientes edades de algunos estudiantes

    edades <- c(22, 19, 16, 13, 18, 15, 20, 14, 15, 16,
              15, 16, 20, 13, 15, 18, 15, 13, 18, 15)
    knitr::kable(head(edades))
    x
    22
    19
    16
    13
    18
    15

    Encontremos el número de clases usando la regla de Sturges

    n_sturges = 1 + log(length(edades))/log(2)
    n_sturgesc = ceiling(n_sturges)
    n_sturgesf = floor(n_sturges)
    
    n_clases = 0
    if (n_sturgesc%%2 == 0) {
      n_clases = n_sturgesf
    } else {
      n_clases = n_sturgesc
    }
    R = max(edades) - min(edades)
    w = ceiling(R/n_clases)

    Calculemos ahora nuestra tabla de frecuencias con número de clases n_clases. Primero creamos una lista de fronteras de clases bins y luego agrupamos los datos basados en estas

    bins <- seq(min(edades), max(edades) + w, by = w)
    bins
    ## [1] 13 15 17 19 21 23
    Edades <- cut(edades, bins)
    Freq_table <- transform(table(Edades), Rel_Freq=prop.table(Freq), Cum_Freq=cumsum(Freq))
    knitr::kable(Freq_table)
    Edades Freq Rel_Freq Cum_Freq
    (13,15] 7 0.4117647 7
    (15,17] 3 0.1764706 10
    (17,19] 4 0.2352941 14
    (19,21] 2 0.1176471 16
    (21,23] 1 0.0588235 17
    str(Freq_table)
    ## 'data.frame':    5 obs. of  4 variables:
    ##  $ Edades  : Factor w/ 5 levels "(13,15]","(15,17]",..: 1 2 3 4 5
    ##  $ Freq    : int  7 3 4 2 1
    ##  $ Rel_Freq: num  0.4118 0.1765 0.2353 0.1176 0.0588
    ##  $ Cum_Freq: int  7 10 14 16 17

    Podemos también crear un histograma para la tabla de frecuencias agrupada

    df2 <- data.frame(x = Freq_table$Edades, y = Freq_table$Freq)
    knitr::kable(df2)
    x y
    (13,15] 7
    (15,17] 3
    (17,19] 4
    (19,21] 2
    (21,23] 1
    ggplot(data=df2, aes(x=x, y=y)) +
      geom_bar(stat="identity", color="blue", fill="green") +
      xlab("Rango de Edades") +
      ylab("Frecuencia")

    8 Análisis Estadístico

    Una función multiuso muy útil en R es summary(X), donde X puede ser uno de cualquier número de objetos, incluyendo conjuntos de datos, variables y modelos lineales, por nombrar algunos. Cuando se utiliza, el comando proporciona datos de resumen relacionados con el objeto individual que se introdujo en él. Así, la función de resumen tiene diferentes resultados dependiendo del tipo de objeto que tome como argumento. Además de ser ampliamente aplicable, este método es valioso porque a menudo proporciona exactamente lo que se necesita en términos de estadísticas de resumen.

    Usando la función summary() podemos obtener estadísticos de interes y valores de posición:

    summary(df$Horas_Semanales_de_Juego)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##   10.00   15.00   15.00   18.44   20.00   41.00

    Del anterior resultado se puede observar que la hora mínima en el juego fue de 10, el 25% se ubicó en 15 horas indicando que dedicaron 15 o menor o igual a 15, al igual que el 50%, en promedio dedicaron 18,4 horas de juego, el 75% dedicó menos o igual que 20 horas y la hora que más dedicaron fue de 41.

    Por otro lado, se puede notar la función summary() no nos entrega todos los estadísticos de interés, para solucionar esto podemos hacer uso de la librería, pastecs y la función stat.desc(), como se muestra a continuación.

    library(pastecs)
    ## 
    ## Adjuntando el paquete: 'pastecs'
    ## The following object is masked from 'package:tidyr':
    ## 
    ##     extract
    ## The following objects are masked from 'package:dplyr':
    ## 
    ##     first, last
    ## The following object is masked from 'package:magrittr':
    ## 
    ##     extract
    stat.desc(df)

    8.1 Caja y extensión

    Los gráficos de caja (box plots), también conocidos como diagramas de cajas y bigotes, son una representación gráfica que permite resumir las características principales de los datos (posición, dispersión, asimetría, …) e identificar la presencia de valores atípicos. En esta sección revisaremos cómo hacer box plots en R base y en ggplot2.

    Utilizando boxplot() R base

    boxplot(df$Edad, horizontal=TRUE, col='steelblue')

    Usando geom_boxplot() de la librería ggplot2

    library(tidyverse)
    library(hrbrthemes)
    library(viridis)
    ## Cargando paquete requerido: viridisLite
    ## 
    ## Adjuntando el paquete: 'viridis'
    ## The following object is masked from 'package:scales':
    ## 
    ##     viridis_pal
    df %>% 
      ggplot(aes(x = "", y = Edad)) +
      geom_boxplot(color = "black", fill = "yellow2", alpha = 0.5) +
      theme_ipsum() +
      theme(legend.position = "none", plot.title = element_text(size = 11)) +
      ggtitle("Distribución de las Edades") +
      coord_flip()

    ggplot(df, aes(x = Sexo, y = Edad, fill = Sexo)) +
      geom_boxplot() +
      labs(title = "Diagrama de Edades según el Sexo",
           x = "Sexo", y = "Edades") +
      scale_fill_manual(values = c("lightblue", "pink")) +
      theme_minimal()

    8.2 Coeficiente de Variación

    El coeficiente de variación (CV) es una medida estadística que se utiliza para evaluar la variabilidad relativa de una muestra o población en relación con su media. Se calcula como la desviación estándar de los datos dividida por la media, y se expresa como un porcentaje multiplicado por 100 para facilitar su interpretación.

    El CV es útil cuando se comparan distribuciones de datos con diferentes escalas o unidades, ya que normaliza la variabilidad en relación con la magnitud de los datos. Esto permite realizar comparaciones más significativas entre diferentes conjuntos de datos.

    \[CV = \left( \frac{\text{Desviación Estándar}}{\text{Media}} \right) \times 100\]

    Ahora vamos a hallar el coeficiente de variación de la variable Edad.

    media <- mean(df$Edad)
    desviacion <- sd(df$Edad)
    coef_variacion <- (desviacion / media) * 100
    cat("El coeficiente de variación es:", coef_variacion, "%\n")
    ## El coeficiente de variación es: 19.25285 %

    8.3 Asimetría

    El coeficiente de asimetría de Pearson es que es una medida estandarizada de la asimetría de una distribución de datos. Se calcula como el tercer momento estandarizado de la distribución, es decir, la diferencia promedio al cubo entre los datos y la media, dividida por la desviación estándar al cubo. Si el coeficiente de asimetría de Pearson es cero, la distribución es simétrica. Si es positivo, la cola de la distribución está en el lado derecho, y si es negativo, la cola está en el lado izquierdo. Esto proporciona información sobre la forma y dirección de la asimetría en la distribución de datos.

    \[\text{Coeficiente de Asimetría de Pearson} = \frac{E[(X - \mu)^3]}{\sigma^3}\]

    Como el coefiente de asmetría de Pearson es mayo que cero, indica que la edad presenta distribución asimetrica hacia la derecha.

    8.4 Medidas de la curtosis

    La curtosis es una medida estadística que describe la forma de la distribución de los datos en relación con una distribución normal estándar. La curtosis es una medida de la “picudez” de la distribución, es decir, cuán puntiaguda o aplanada es en comparación con una distribución normal.

    \[\text{Curtosis} = \frac{1}{n} \sum_{i=1}^{n} \left(\frac{x_i - \bar{x}}{s}\right)^4 - 3\]

    Platicúrtica: Una distribución platicúrtica es aquella que tiene un exceso de curtosis negativo en comparación con la distribución normal estándar (cuyo exceso de curtosis es 0). Esto significa que la distribución tiene colas más ligeras y es más aplanada en comparación con la distribución normal. En una distribución platicúrtica, los valores se concentran más cerca de la media y hay menos valores extremos en comparación con una distribución normal.

    Mesocúrtica: Una distribución mesocúrtica es aquella que tiene un exceso de curtosis igual a 0, es decir, su forma es similar a la de una distribución normal estándar. Esto significa que la distribución tiene una cantidad “normal” de picos y colas, y su forma se asemeja a una campana simétrica.

    Leptocúrtica: Una distribución leptocúrtica es aquella que tiene un exceso de curtosis positivo en comparación con la distribución normal estándar. Esto significa que la distribución tiene colas más pesadas y es más puntiaguda en comparación con la distribución normal. En una distribución leptocúrtica, los valores tienden a agruparse más cerca de la media y hay más valores extremos en comparación con una distribución normal.

    curtosis <- kurtosis(df$Edad)
    cat("La curtosis de la muestra es:", curtosis, "\n")
    ## La curtosis de la muestra es: 0.8255815

    9 Ejemplo Práctico #1.

    Limpieza de Datos

    Análisis Económico de Incautaciones de Bebidas Alcohólicas Fraudulentas y de Contrabando

    Se dispone de una base de datos que recopila información sobre incautaciones de bebidas alcohólicas fraudulentas y de contrabando en una ciudad determinada. Este conjunto de datos es de especial interés para el campo de la economía y la administración pública, ya que permite estudiar los impactos del comercio ilegal sobre el mercado formal, los precios, la calidad de los productos y la seguridad del consumidor.

    Las variables incluidas son:

    TL (Tipo de licor): Identifica la categoría de la bebida alcohólica incautada (ron, aguardiente, whisky, etc.).

    PI (Precio de incautación): Corresponde al precio de venta por unidad en el establecimiento donde se detectó el producto, lo que permite analizar diferencias entre el mercado formal e informal.

    GAE (Grados de alcohol en etiqueta): Información declarada por el fabricante en la etiqueta, relevante para examinar prácticas de engaño al consumidor.

    GAQ (Grados de alcohol en prueba química): Resultado real obtenido mediante análisis de laboratorio, útil para contrastar con la información de la etiqueta y estimar riesgos asociados a la salud.

    CE (Cantidad estandarizada): Expresada en unidades de 750 ml, lo que permite comparar volúmenes de producto independientemente del tamaño original del envase.

    El análisis de esta información ofrece insumos para:

    Estimar las pérdidas fiscales derivadas del contrabando y la falsificación.

    Evaluar las distorsiones en precios entre el mercado formal e informal.

    Medir la magnitud del consumo riesgoso, considerando discrepancias entre grados de alcohol declarados y reales.

    Apoyar la formulación de políticas públicas de control y regulación del comercio ilícito de bebidas alcohólicas.

    Este enfoque económico permite comprender la dinámica del contrabando como un fenómeno que no solo afecta la recaudación tributaria y la competitividad empresarial, sino que también tiene externalidades negativas en la salud pública y la confianza de los consumidores.

    Puede acceder a la base de datos en el siguiente enlace: BASE_DATOS.xlsx.

    url_base_Datos <-"https://raw.github.com/Kalbam/Datos/blob/main/BASE_DATOS.xlsx"
    require(readxl) 
    direccion="BASE_DATOS.xlsx"
    DATOS<-read_excel(direccion,sheet="datos")

    NOTA: La función read_excel importa un objeto tibble, que es en esencia un data.frame, pero que cuenta con algunas ventajas estéticas en las presentaciones e informes.

    9.0.1 caracteristica generales de los datos

    Verifiquemos que leímos bien los datos viendo el encabezado y la cola de los datos:

    head(DATOS)
    tail(DATOS)

    Las dimensiones, los nombres de las columnas y la estructura de la base de datos se obtienen con los códigos:

    dim(DATOS) # dimensiones de los datos
    ## [1] 300   5
    colnames(DATOS) # Nombres de las columnas o variables
    ## [1] "TL"  "PI"  "GAE" "GAQ" "CE"
    str(DATOS)
    ## tibble [300 × 5] (S3: tbl_df/tbl/data.frame)
    ##  $ TL : chr [1:300] "Aguardiente" "Aguardiente" "Aguardiente" "Aguardiente" ...
    ##  $ PI : num [1:300] 21470 26422 19737 30240 28374 ...
    ##  $ GAE: num [1:300] 29 29 29 29 38 38 29 38 38 38 ...
    ##  $ GAQ: num [1:300] 25.1 29 25.3 29 33.5 ...
    ##  $ CE : num [1:300] 251 262 289 266 232 ...

    Otra función que funciona igual a str es glimpse, que hace parte del paquete tibble:

    require(tibble)
    glimpse(DATOS)
    ## Rows: 300
    ## Columns: 5
    ## $ TL  <chr> "Aguardiente", "Aguardiente", "Aguardiente", "Aguardiente", "Tequi…
    ## $ PI  <dbl> 21470, 26422, 19737, 30240, 28374, 33601, 33207, 33029, 30964, 309…
    ## $ GAE <dbl> 29, 29, 29, 29, 38, 38, 29, 38, 38, 38, 29, 29, 29, 35, 29, 38, 29…
    ## $ GAQ <dbl> 25.143, 29.000, 25.288, 29.000, 33.516, 31.198, 29.000, 33.060, NA…
    ## $ CE  <dbl> 250.6536, 261.7272, 289.1134, 266.3064, 231.7978, 248.8542, 252.57…
     summary(DATOS)
    ##       TL                  PI              GAE             GAQ       
    ##  Length:300         Min.   : 16308   Min.   :29.00   Min.   :24.27  
    ##  Class :character   1st Qu.: 26682   1st Qu.:29.00   1st Qu.:26.04  
    ##  Mode  :character   Median : 29390   Median :35.00   Median :30.07  
    ##                     Mean   : 31846   Mean   :33.54   Mean   :30.74  
    ##                     3rd Qu.: 32751   3rd Qu.:38.00   3rd Qu.:34.10  
    ##                     Max.   :430091   Max.   :40.00   Max.   :40.00  
    ##                     NA's   :5                        NA's   :2      
    ##        CE       
    ##  Min.   :  0.0  
    ##  1st Qu.:239.4  
    ##  Median :250.3  
    ##  Mean   :249.6  
    ##  3rd Qu.:261.7  
    ##  Max.   :296.5  
    ##  NA's   :3

    9.0.2 Considere el resumen individual de las variables numéricas:

    summary(DATOS$PI)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    ##   16308   26682   29390   31846   32751  430091       5
    summary(DATOS$GAE)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    ##   29.00   29.00   35.00   33.54   38.00   40.00
    summary(DATOS$GAQ)
    ##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    ##   24.27   26.04   30.07   30.74   34.10   40.00       2

    9.0.3 Análisis Descriptivo Individual Variable categórica

    Para hacer una tabla de frecuencias de las variables categóricas es necesario transformar primero la variable en factor:

    # Se transforma primero en factor
     TL_FACTOR<- as.factor(DATOS$TL)
     # Se obtiene el resumen
     summary(TL_FACTOR)
    ##  Aguardiente Aguardientre          Ron          Run      Tequila       Whiski 
    ##          131            1           60            1           85            1 
    ##       Whisky         NA's 
    ##           20            1

    Otra forma de obtener una tabla de frecuencias para las variables categóricas consiste en utilizar la función table del paquete base, que se carga automáticamente cuando abrimos una sesión del R o del R-Studio:

    table(DATOS$TL)
    ## 
    ##  Aguardiente Aguardientre          Ron          Run      Tequila       Whiski 
    ##          131            1           60            1           85            1 
    ##       Whisky 
    ##           20

    Para extraer los nombres de las categorías de una variable categórica usamos la función labels del paquete base:

    unique(DATOS$TL)
    ## [1] "Aguardiente"  "Tequila"      "Ron"          "Whisky"       "Run"         
    ## [6] NA             "Whiski"       "Aguardientre"

    Reemplazar los nombres de las categorías mal codificadas, utilizamos la función str_replace del paquete stringr y lo guardamos ya corregido directamente en la variable TL de DATOS:

    require(stringr)
    
    
    DATOS$TL <- str_replace(DATOS$TL, "Aguardientre", "Aguardiente")
    
    unique(DATOS$TL)
    ## [1] "Aguardiente" "Tequila"     "Ron"         "Whisky"      "Run"        
    ## [6] NA            "Whiski"

    Reemplazar los nombres de las categorías mal codificadas, utilizamos la función str_replace del paquete stringr y lo guardamos ya corregido directamente en la variable TL de DATOS:

    require(stringr)
    
    reemplazos <- c("Run" = "Ron", "Whiski" = "Whisky")
    
    DATOS$TL <- str_replace_all(DATOS$TL, reemplazos)
    
    unique(DATOS$TL)
    ## [1] "Aguardiente" "Tequila"     "Ron"         "Whisky"      NA

    9.0.4 Identificando valores NA:

    is.na(DATOS[1:10,]) # Identifica cuáles valores son NA
    ##          TL    PI   GAE   GAQ    CE
    ##  [1,] FALSE FALSE FALSE FALSE FALSE
    ##  [2,] FALSE FALSE FALSE FALSE FALSE
    ##  [3,] FALSE FALSE FALSE FALSE FALSE
    ##  [4,] FALSE FALSE FALSE FALSE FALSE
    ##  [5,] FALSE FALSE FALSE FALSE FALSE
    ##  [6,] FALSE FALSE FALSE FALSE FALSE
    ##  [7,] FALSE FALSE FALSE FALSE FALSE
    ##  [8,] FALSE FALSE FALSE FALSE FALSE
    ##  [9,] FALSE FALSE FALSE  TRUE FALSE
    ## [10,] FALSE FALSE FALSE FALSE FALSE
    is.na(DATOS$TL) # Identifica cuáles valores son NA en TL
    ##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
    ## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [145] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [169] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

    9.0.5 Identificando valores NA por columna:

     NAS_TL<-is.na(DATOS$TL) #GuardamosenNAS_TL
     DATOS[NAS_TL,] #FiltramosporlosNASdeTL
    NAS_PI<-is.na(DATOS$PI) # Guardamos en NAS_PI
     DATOS[NAS_TL | NAS_PI,] # Filtramos por los NAS de TL y PI

    9.0.6 Identificando las filas con al menos un NA:

    La función complete.cases del paquete stats nos muestra cuáles filas tienen datos en TODAS sus columnas:

    complete.cases(DATOS)
    ##   [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
    ##  [13]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [25]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [37]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [49]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [61]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [73] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [85]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    ##  [97]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
    ## [109]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
    ## [121]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
    ## [133]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [145]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [157]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [169]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [181]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [193]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [205]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [217]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [229]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [241]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [253]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [265]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [277]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    ## [289]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

    Cuando negamos estos casos completos obtenemos las filas donde hay al menos un valor faltante, es decir,

    !complete.cases(DATOS)
    ##   [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
    ##  [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [73]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ##  [85] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
    ##  [97] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    ## [109] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
    ## [121] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
    ## [133] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
    ## [145] FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [157] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [169] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
    ## [181] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [193] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [205] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [217] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [229] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [241] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [253] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [265] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [277] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    ## [289] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

    Guardamos los valores anteriores en un vector para luego filtrar por las filas donde hay al menos un valor NA:

    NAS_ALL <- !complete.cases(DATOS)
    
    DATOS[NAS_ALL, ]  # Filas donde hay al menos un valor NA

    9.0.7 Gráfica que identifica los NA en cada variable:

    suppressWarnings(require(Amelia))
    ## Cargando paquete requerido: Amelia
    ## Cargando paquete requerido: Rcpp
    ## ## 
    ## ## Amelia II: Multiple Imputation
    ## ## (Version 1.8.3, built: 2024-11-07)
    ## ## Copyright (C) 2005-2025 James Honaker, Gary King and Matthew Blackwell
    ## ## Refer to http://gking.harvard.edu/amelia/ for more information
    ## ##
    suppressWarnings(missmap(DATOS))

    summary(DATOS)# Analicemos las mediadas de tendencia
    ##       TL                  PI              GAE             GAQ       
    ##  Length:300         Min.   : 16308   Min.   :29.00   Min.   :24.27  
    ##  Class :character   1st Qu.: 26682   1st Qu.:29.00   1st Qu.:26.04  
    ##  Mode  :character   Median : 29390   Median :35.00   Median :30.07  
    ##                     Mean   : 31846   Mean   :33.54   Mean   :30.74  
    ##                     3rd Qu.: 32751   3rd Qu.:38.00   3rd Qu.:34.10  
    ##                     Max.   :430091   Max.   :40.00   Max.   :40.00  
    ##                     NA's   :5                        NA's   :2      
    ##        CE       
    ##  Min.   :  0.0  
    ##  1st Qu.:239.4  
    ##  Median :250.3  
    ##  Mean   :249.6  
    ##  3rd Qu.:261.7  
    ##  Max.   :296.5  
    ##  NA's   :3

    9.0.8 Identificando los valores atípicos:

     par(mfrow=c(1,4))
     boxplot(DATOS$PI,main="PI")
     boxplot(DATOS$GAE,main="GAE")
     boxplot(DATOS$GAQ,main="GAQ")
     boxplot(DATOS$CE,main="CE")

    De los gráficos anteriores podemos ver que:

    • La variable PI tiene algunos valores atípicos muy altos.
    • Las variables GAE y GAQ NO presentan valores atípicos muy altos o muy bajos.
    • La variable CE presenta valores atípicos muy bajos.

    Filtramos los datos sin los valores atípicos de la variable PI y de la variable CE, filtrando con la función filter del paquete dplyr con el siguiente código:

    require(dplyr)
    filter(DATOS, PI > 100000)
    filter(DATOS, CE < 200)

    Reemplazamos los valores atípicos por valores NA (lo cual es equivalente a eliminarlos):

    DATOS$PI[DATOS$PI > 100000] <- NA
    DATOS$CE[DATOS$CE < 200] <- NA

    Repetimos los gráficos boxplot:

    par(mfrow=c(1,4))
     boxplot(DATOS$PI,main="PI")
     boxplot(DATOS$GAE,main="GAE")
     boxplot(DATOS$GAQ,main="GAQ")
     boxplot(DATOS$CE,main="CE")

    9.0.9 Reemplazando los valores NA de la variable Númerica:

    Si se supone que estas variables tienen Distribución normal, se modifican por la Media, de lo contrario seria por la Mediana, como técnica básica de Imputación de datos.

    Calculamos la media de las columnas numéricas con la función colMeans del paquete base. Para esto primero excluimos la variable categórica TL que se encuentra en la columna 1:

    medias <- colMeans(DATOS[,-1], na.rm = TRUE)
    medias
    ##          PI         GAE         GAQ          CE 
    ## 29518.52560    33.54000    30.74141   250.49003

    El argumento na.rm=TRUE permite calcular las medias de los datos que no son NA.

    9.0.10 Verificamos que ya no hay valores NA en las variables numéricas:

    Para esto usamos la función replace_na del paquete tidyr:

    require(tidyr)  # Cargamos el paquete
    
    # Creamos una lista con los reemplazos:
    reemplazos <- list(PI = medias[1], GAE = medias[2], GAQ = medias[3], CE = medias[4])
    
    # Reemplazamos y guardamos en DATOS:
    DATOS <- replace_na(DATOS, reemplazos)
    summary(DATOS)
    ##       TL                  PI             GAE             GAQ       
    ##  Length:300         Min.   :16308   Min.   :29.00   Min.   :24.27  
    ##  Class :character   1st Qu.:26710   1st Qu.:29.00   1st Qu.:26.04  
    ##  Mode  :character   Median :29519   Median :35.00   Median :30.22  
    ##                     Mean   :29519   Mean   :33.54   Mean   :30.74  
    ##                     3rd Qu.:32459   3rd Qu.:38.00   3rd Qu.:34.07  
    ##                     Max.   :42022   Max.   :40.00   Max.   :40.00  
    ##        CE       
    ##  Min.   :210.9  
    ##  1st Qu.:239.7  
    ##  Median :250.5  
    ##  Mean   :250.5  
    ##  3rd Qu.:261.5  
    ##  Max.   :296.5

    9.0.11 Reemplazando los valores NA de la variable categórica:

    unique(DATOS$TL)
    ## [1] "Aguardiente" "Tequila"     "Ron"         "Whisky"      NA
    FACTOR_TL<-as.factor(DATOS$TL) #Convertimos en factorTL
     FRECUENCIAS_TL<-summary(FACTOR_TL) #Tabla de frecuencias
     barplot(FRECUENCIAS_TL) #Graficamos las frecuencias

    Si decidimos reemplazar por el valor más frecuente, lo cual NO es recomendable, lo hacemos con el código:

    reemplazos <- list(TL = "Aguardiente")
    DATOS <- replace_na(DATOS, reemplazos)
    
    # Verificamos el cambio:
    unique(DATOS$TL)
    ## [1] "Aguardiente" "Tequila"     "Ron"         "Whisky"
     FACTOR_TL<-as.factor(DATOS$TL) #Convertimos enfactor TL
     FRECUENCIAS_TL<-summary(FACTOR_TL) #Tabla de frecuencias
     barplot(FRECUENCIAS_TL) #Graficamos las frecuencias

    9.0.12 Finalmente se realiza el esquema de los Datos y se verifica que no se encuentren NAS

    suppressWarnings(missmap(DATOS))

    Una vez realizado el procesamiento y limpieza de los datos, el siguiente paso consiste en efectuar el análisis exploratorio de datos. Para ello, continúe el ejercicio representando gráficamente las variables de mayor interés.

    10 Técnicas de Estadistica II.

    Para aplicar las técnicas de estadística II, es necesario realizar previamente un análisis exploratorio de los datos. Tomaremos este contexto como base para la aplicación de dichas técnicas.

    11 Ejemplo Práctico #2:

    Interacciones entre Factores Organizacionales y Percepción del Entorno Económico-Empresarial

    El estudio de la economía y la administración no se limita a cifras macroeconómicas o indicadores financieros, sino también a cómo los individuos dentro de las organizaciones perciben, reaccionan e interactúan con su entorno económico y laboral. Factores como el nivel de estrés, la resiliencia organizacional y la percepción de equidad en el trabajo pueden influir directamente en la productividad, la innovación, la toma de decisiones y la confianza en las instituciones económicas.

    11.0.1 Variables Incluidas

    • ID – Identificador único de cada participante.
    • Edad – Edad del encuestado (18 a 65 años).
    • Género – Masculino, Femenino, No binario.
    • Nivel de estrés laboral – Escala de 1 a 10.
    • Nivel de resiliencia organizacional – Escala de 1 a 10.
    • Índice de satisfacción laboral (0-100) – Medición autoinformada sobre la satisfacción en el entorno de trabajo.
    • Horas de interacción con clientes por semana – Tiempo invertido en la atención y gestión de relaciones con clientes.
    • Conocimiento en gestión financiera (0-100) – Escala que mide el nivel de información sobre temas administrativos y financieros.
    • Apertura a la innovación (0-10) – Grado de disposición a implementar nuevas tecnologías y procesos.
    • Nivel de preocupación por la economía nacional (0-10) – Grado de inquietud respecto a la situación económica del país y su impacto en el negocio.
    • Participación en asociaciones empresariales – Sí / No, sobre la afiliación a gremios o cámaras de comercio.
    • Grado de liderazgo empresarial (0-10) – Nivel de participación en la toma de decisiones estratégicas dentro de la organización.
    • Percepción de equidad salarial (0-10) – Opinión sobre la justicia y equidad en la distribución de ingresos dentro de la empresa.
    • Horas semanales dedicadas a capacitación en administración y economía – Tiempo invertido en formación continua y actualización profesional.

    La base de datos utilizada para este análisis, se encuentra disponible en el siguiente repositorio: GitHub - Kalbam/Datos.

    Antes de aplicar las técnicas de estadística II se debe realizar un:

    11.1 Análisis Exploratorio de Datos

    En primer lugar analizamos las dimensiones de la base de datos:

    #Necesitas instalar los sigueintes paquetes
    #if (!require("readxl")) install.packages("readxl", dependencies=TRUE)
    #if (!require("ggplot2")) install.packages("ggplot2", dependencies=TRUE)
    #if (!require("dplyr")) install.packages("dplyr", dependencies=TRUE)
    #if (!require("corrplot")) install.packages("corrplot", dependencies=TRUE)
    #if (!require("ggpubr")) install.packages("ggpubr", dependencies=TRUE)
    library(readxl)
    library(ggplot2)
    library(dplyr)
    library(corrplot)
    ## corrplot 0.95 loaded
    library(ggpubr)
    data <- read_excel("Base_Datos_Economia.xlsx", sheet = "Sheet1")
    dim(data)
    ## [1] 100  14

    Luego de visualizar la base de datos, se observa que consta de 100 observaciones con 14 variables. Además, se revela que la base de datos no cuenta con valores NA. A continuacion un resumen de las variables númericas

    library(Amelia)
    
    # Convertir a data frame clásico
    data_df <- as.data.frame(data)
    
    # Visualizar los NA
    missmap(data_df)

    summary(data)
    ##        ID              Edad          Género          Nivel de depresión
    ##  Min.   :  1.00   Min.   :19.00   Length:100         Min.   : 1.00     
    ##  1st Qu.: 25.75   1st Qu.:30.00   Class :character   1st Qu.: 3.00     
    ##  Median : 50.50   Median :44.50   Mode  :character   Median : 5.50     
    ##  Mean   : 50.50   Mean   :42.31                      Mean   : 5.38     
    ##  3rd Qu.: 75.25   3rd Qu.:54.25                      3rd Qu.: 8.00     
    ##  Max.   :100.00   Max.   :63.00                      Max.   :10.00     
    ##  Nivel de resiliencia Índice de felicidad global (0-100)
    ##  Min.   : 1.0         Min.   : 0.00                     
    ##  1st Qu.: 3.0         1st Qu.:29.75                     
    ##  Median : 5.0         Median :61.50                     
    ##  Mean   : 5.5         Mean   :53.48                     
    ##  3rd Qu.: 8.0         3rd Qu.:77.50                     
    ##  Max.   :10.0         Max.   :98.00                     
    ##  Horas de interacción con extranjeros por semana
    ##  Min.   : 0.00                                  
    ##  1st Qu.: 5.75                                  
    ##  Median :11.00                                  
    ##  Mean   :10.41                                  
    ##  3rd Qu.:15.00                                  
    ##  Max.   :20.00                                  
    ##  Conocimiento en política internacional (0-100) Apertura a la migración (0-10)
    ##  Min.   :  1.00                                 Min.   : 0.00                 
    ##  1st Qu.: 20.75                                 1st Qu.: 2.00                 
    ##  Median : 42.00                                 Median : 4.00                 
    ##  Mean   : 45.10                                 Mean   : 4.28                 
    ##  3rd Qu.: 69.00                                 3rd Qu.: 7.00                 
    ##  Max.   :100.00                                 Max.   :10.00                 
    ##  Nivel de preocupación por conflictos internacionales (0-10)
    ##  Min.   : 0.00                                              
    ##  1st Qu.: 2.00                                              
    ##  Median : 4.00                                              
    ##  Mean   : 4.48                                              
    ##  3rd Qu.: 7.00                                              
    ##  Max.   :10.00                                              
    ##  Participación en ONGs internacionales Grado de activismo político (0-10)
    ##  Length:100                            Min.   : 0.00                     
    ##  Class :character                      1st Qu.: 3.00                     
    ##  Mode  :character                      Median : 5.00                     
    ##                                        Mean   : 4.93                     
    ##                                        3rd Qu.: 7.00                     
    ##                                        Max.   :10.00                     
    ##  Percepción de equidad global (0-10) Horas semanales dedicadas a temas de RRII
    ##  Min.   : 0.00                       Min.   : 0.00                            
    ##  1st Qu.: 3.00                       1st Qu.: 5.00                            
    ##  Median : 5.00                       Median : 9.00                            
    ##  Mean   : 5.34                       Mean   :10.11                            
    ##  3rd Qu.: 8.00                       3rd Qu.:16.00                            
    ##  Max.   :10.00                       Max.   :20.00

    La muestra analizada presenta un rango de edad entre 19 y 63 años, con una media de 42.31 años y una mediana de 44.50 años. El nivel de depresión varía entre 1 y 10, con una media de 5.38 y una mediana de 5.50, donde el 25% de los participantes tienen valores inferiores a 3 y el 75% inferiores a 8. En cuanto a la resiliencia, su distribución es equilibrada, con valores entre 1 y 10, y una media y mediana de 5. El índice de felicidad global presenta una amplia variabilidad (0-98), con una media de 53.48 y una mediana de 61.50, mostrando una distribución sesgada a la izquierda. Se recomienda analizar las correlaciones entre resiliencia, felicidad y depresión para comprender mejor los patrones de bienestar psicológico.

    11.2 Análisis Univariados

    11.2.1 Distribución de Edad

    ggplot(data, aes(x = Edad)) +
      geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
      theme_minimal() +
      ggtitle("Distribución de Edad")

    El histograma muestra la distribución de edades en la base de datos, con un rango que va aproximadamente de los 18 a los 70 años. Se observa una mayor concentración de individuos en los grupos de edad entre los 25 y 30 años, así como entre los 50 y 60 años, lo que indica posibles picos en la frecuencia de participantes en estas edades.

    11.2.2 Distribución de la muestra por Género

    La distribución no es completamente uniforme, ya que hay fluctuaciones en la cantidad de observaciones por intervalo, lo que sugiere que algunos rangos de edad están mejor representados que otros en la muestra. También se nota una menor cantidad de individuos en los extremos de la distribución, especialmente en edades cercanas a los 70 años.

    gender_counts <- data %>% 
      count(Género) 
    
    kable(gender_counts, format = "html") %>% 
      kable_styling("striped", full_width = FALSE)
    Género n
    Femenino 43
    Masculino 45
    No binario 12
    library(ggplot2)
    
    ggplot(data, aes(x = Género, fill = Género)) +
      geom_bar(color = "black", alpha = 0.7) +
      geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
      scale_fill_manual(values = c("skyblue", "lightcoral", "plum")) +
      labs(title = "Distribución de la muestra por Género",
           x = "Género",
           y = "Frecuencia") +
      theme_minimal() +
      theme(legend.position = "none",
            plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

    La muestra está compuesta por Masculino ≈ 45%, Femenino ≈ 43% y No binario ≈ 12%.

    Se observa equilibrio entre hombres y mujeres, lo que facilita comparaciones entre estos dos grupos.

    El grupo No binario es menor pero relevante para un análisis inclusivo; conviene reportar intervalos de confianza o evitar sobre-interpretar diferencias para este subgrupo por su menor tamaño.

    11.3 Análisis Bivariados

    ggplot(data, aes(x = Género, y = `Nivel de depresión`, fill = Género)) +
      geom_boxplot() +
      theme_minimal() +
      ggtitle("Nivel de Depresión por Género")

    El gráfico de cajas muestra la distribución del nivel de depresión según el género de los participantes en la base de datos. Se observan diferencias en la mediana y la dispersión de los valores entre los grupos.

    • Femenino: Presenta una mediana de nivel de depresión intermedia en comparación con los otros géneros, con una distribución más concentrada y menor dispersión.
    • Masculino: Se observa una mayor dispersión en los datos, con valores más extremos, lo que sugiere una mayor variabilidad en los niveles de depresión en este grupo.
    • No binario: Tiene una distribución más uniforme y una mediana de nivel de depresión ligeramente superior a la del grupo femenino.

    En general, se pueden notar diferencias en la variabilidad y centralidad del nivel de depresión según el género, lo que sugiere posibles factores diferenciales que influyen en la distribución de la variable analizada.

    ggplot(data, aes(x = `Nivel de resiliencia`, y = `Índice de felicidad global (0-100)`)) +
      geom_point(color = "blue") +
      geom_smooth(method = "lm", se = FALSE, color = "red") +
      theme_minimal() +
      ggtitle("Relación entre Resiliencia y Felicidad")
    ## `geom_smooth()` using formula = 'y ~ x'

    El gráfico de dispersión representa la relación entre el nivel de resiliencia y el índice de felicidad global (0-100). Se observa que los datos están distribuidos de manera dispersa, sin un patrón claramente definido.

    La línea de tendencia en rojo indica una leve pendiente negativa, lo que sugiere una relación inversa muy débil entre resiliencia y felicidad. Es decir, a medida que el nivel de resiliencia aumenta, el índice de felicidad tiende a disminuir ligeramente, aunque la dispersión de los datos indica que esta relación no es fuerte ni consistente.

    En general, la gran variabilidad en los datos sugiere que existen otros factores que podrían estar influyendo en la felicidad más allá de la resiliencia.

    12 Distribuciones Muestrales

    12.0.0.1 Tiempos de atención al cliente en supermercados

    Eres gerente de una cadena de supermercados y quieres saber si el tiempo promedio de atención al cliente en caja está dentro de lo esperado, porque sabes que si los clientes esperan mucho, pueden irse a la competencia.

    Tienes registros del tiempo de atención (en minutos) de todas las cajas durante una semana, pero analizar todos los datos puede ser costoso y no siempre es posible (sobre todo si hay muchas sucursales).

    Por eso, cada semana, seleccionas al azar una muestra de 30 cajas y analizas tiempo promedio de atención al cliente. El objetivo es monitorear la calidad del servicio y tomar decisiones informadas.

    Vamos a simular esta situación.

    set.seed(123)
    
    tiempos_atencion <- rnorm(300, mean = 4.5, sd = 1.2)  # 300 cajas, media 4.5 min, sd 1.2
    head(tiempos_atencion, 5)
    ## [1] 3.827429 4.223787 6.370450 4.584610 4.655145
    length(tiempos_atencion)
    ## [1] 300
    # Tomamos 100 muestras aleatorias de 30 cajas cada una
    promedios_muestrales <- replicate(100, mean(sample(tiempos_atencion, 30, replace = TRUE)))
    head(promedios_muestrales, 5)
    ## [1] 4.572373 4.677062 4.683360 4.393475 4.423894
    length(tiempos_atencion)
    ## [1] 300
    hist(tiempos_atencion,
         main = "Distribución de tiempos de atención (Población completa)",
         xlab = "Tiempo de atención (minutos)",
         col = "lightgreen",
         breaks = 20)
    abline(v = mean(tiempos_atencion), col = "red", lwd = 2, lty = 2)
    legend("topright", legend = "Media real", col = "red", lwd = 2, lty = 2)

    hist(promedios_muestrales,
         main = "Distribución muestral del promedio de atención",
         xlab = "Promedio de atención por muestra (minutos)",
         col = "skyblue",
         breaks = 15)
    abline(v = mean(tiempos_atencion), col = "red", lwd = 2, lty = 2)
    legend("topright", legend = "Media real", col = "red", lwd = 2, lty = 2)

    ¿Dónde entra la distribución muestral?

    Supón que el tiempo promedio de atención para TODAS las cajas en todas las semanas realmente es 4.5 minutos, pero cada muestra de 30 cajas te puede dar un promedio un poco diferente (a veces 4.2, a veces 4.8, etc.).

    Si tú tomas muchas muestras distintas de 30 cajas, y calculas el promedio de cada muestra, los promedios obtenidos forman una distribución muestral del promedio. Esta distribución te ayuda a:

    • Saber qué tan variable puede ser el promedio de una muestra respecto al promedio real de toda la población.

    • Estimar márgenes de error cuando haces reportes a la gerencia.

    • Tomar decisiones sobre si debes intervenir una sucursal, o si los cambios que notas pueden ser solo por variabilidad aleatoria.

    Conclusiones

    • Cada punto del histograma es el promedio de una muestra diferente de 30 cajas.

    • La línea roja muestra la media real de todas las cajas.

    • Si eliges una sola muestra, podrías sobreestimar o subestimar el promedio real solo por azar.

    • La distribución muestral te permite cuantificar esa variabilidad y dar reportes confiables (con márgenes de error). Así, puedes evitar tomar decisiones apresuradas solo porque una muestra fue muy alta o muy baja, sabiendo que hay un margen natural de variación.

    Las distribuciones muestrales te permiten hacer estimaciones confiables y tomar decisiones inteligentes con datos de muestra, sin tener que medir absolutamente todo. Son esenciales para monitorear procesos y mejorar la gestión en cualquier empresa.

    12.1 Ejercicios prácticos .

    12.1.1 Ejercicio 1: Incremento Salarial de Funcionarios

    Supongamos que el incremento porcentual de los salarios de los funcionarios de todas las corporaciones medianas se distribuye siguiendo una normal con media del 12.2% y desviación típica de 3.6%. Se toma una muestra aleatoria de n = 9 observaciones de esta población de incrementos porcentuales de salario.

    Se desea calcular la probabilidad de que la media muestral sea mayor al 10%.

    media_poblacional <- 12.2 
    desviacion_poblacional <- 3.6   
    n <- 9  
    error_estandar <- desviacion_poblacional / sqrt(n)
    probabilidad <- 1 - pnorm(10, mean = media_poblacional, sd = error_estandar)
    print(paste("La probabilidad de que la media muestral sea mayor al 10% es:", round(probabilidad, 2)))
    ## [1] "La probabilidad de que la media muestral sea mayor al 10% es: 0.97"

    12.1.2 Ejercicio 2: Tiempo de Respuesta de Servidores

    Supongamos que el tiempo de respuesta de todos los servidores de una red empresarial sigue una distribución normal con una media de 15 milisegundos y una desviación estándar de 4 milisegundos.
    Se selecciona una muestra aleatoria de nueve observaciones de estos tiempos de respuesta.

    ¿Cuál es la probabilidad de que la media muestral sea mayor de 12 milisegundos?

    media_poblacional <- 15 
    desviacion_poblacional <- 4   
    n <- 9  
    error_estandar <- desviacion_poblacional / sqrt(n)
    probabilidad <- 1 - pnorm(12, mean = media_poblacional, sd = error_estandar)
    print(paste("La probabilidad de que la media muestral sea mayor a 12 milisegundos es:", round(probabilidad, 2)))
    ## [1] "La probabilidad de que la media muestral sea mayor a 12 milisegundos es: 0.99"

    Muestras Pequeñas

    12.1.3 Ejercicio 3: Tiempos de Entrega en Cadena de Suministro.

    Supongamos que estamos analizando los tiempos de entrega de productos en una cadena de suministro global.
    Se sabe que los tiempos de entrega siguen una distribución normal, con una media poblacional de 20 días y una desviación estándar muestral de 4 días.
    Se decide tomar una muestra aleatoria de n = 16 envíos para evaluar el rendimiento del sistema logístico.

    Se desea calcular la probabilidad de que la media muestral de los tiempos de entrega sea estrictamente mayor que 21.753 días.

    media_poblacional <- 20  
    desviacion_muestral <- 4  
    n <- 16  
    gl <- n - 1  
    error_estandar <- desviacion_muestral / sqrt(n)
    valor_critico <- 21.753
    probabilidad <- 1 - pt((valor_critico - media_poblacional) / error_estandar, df = gl)
    print(paste("La probabilidad de que la media muestral sea mayor que 21.753 días es:", round(probabilidad, 4)))
    ## [1] "La probabilidad de que la media muestral sea mayor que 21.753 días es: 0.05"

    12.1.4 Ejercicio 4: Pesos Promedio de Niños y Niñas (Comparación de Medias)

    En el marco de un programa global de bienestar, se evalúa el impacto del programa en los pesos promedio de los estudiantes de sexto grado.
    La muestra incluye 20 niños y 25 niñas.

    • Niños: media = 100 libras, desviación estándar = 14.142
    • Niñas: media = 85 libras, desviación estándar = 12.247

    ¿Cuál es la probabilidad de que el peso promedio de los 20 niños sea al menos 20 libras mayor que el de las 25 niñas?

    n_ninos <- 20
    n_ninas <- 25
    mu_ninos <- 100
    sigma_ninos <- 14.142
    mu_ninas <- 85
    sigma_ninas <- 12.247
    
    diferencia_esperada <- mu_ninos - mu_ninas
    sigma_dif <- sqrt((sigma_ninos^2 / n_ninos) + (sigma_ninas^2 / n_ninas))
    z_valor <- (20 - diferencia_esperada) / sigma_dif
    probabilidad <- 1 - pnorm(z_valor)
    cat("La probabilidad de que el peso promedio de los niños sea al menos 20 libras mayor que el de las niñas es:", round(probabilidad, 3), "\n")
    ## La probabilidad de que el peso promedio de los niños sea al menos 20 libras mayor que el de las niñas es: 0.106

    13 Aplicación de Distribuciones Muestrales en la Base de Economía.

    Tomando en referencia la misma base de datos del ejercicio práctico #2 Base_Datos_Economia aplicaremos las Distribuciones Muestrales de la siguiente manera:

    Una empresa consultora en gestión empresarial aplicó una encuesta a 100 trabajadores de distintos sectores con el fin de estudiar factores organizacionales y económicos que pueden influir en la productividad y la toma de decisiones.

    Entre las variables recolectadas se encuentran:

    • Índice de satisfacción laboral (0-100)
    • Participación en asociaciones empresariales (Sí/No)

    La gerencia quiere responder a las siguientes preguntas mediante el uso de distribuciones muestrales.

    13.0.1 1. Distribución muestral de la media

    • Si se selecciona una muestra aleatoria de n = 30 trabajadores, determine la distribución muestral de la media del índice de satisfacción laboral.

    • Compare la media poblacional estimada (con los 100 datos) con la media y desviación estándar obtenidas a partir de la distribución muestral.

    • Calcule la probabilidad de que la media muestral del índice de satisfacción laboral sea mayor a 75.

    • Calcule la probabilidad de que la media muestral se encuentre entre 70 y 80.

    library(readxl)
    
    # 1) Leer
    df <- read_excel("Base_Datos_Economia.xlsx")
    
    # 2) Detectar la columna de satisfacción/felicidad (ignora acentos)
    cn <- names(df)
    cn_ascii <- tolower(iconv(cn, to = "ASCII//TRANSLIT"))
    i <- grep("satisfac|felicidad", cn_ascii)[1]
    stopifnot(!is.na(i))
    col <- cn[i]
    
    # 3) Vector numérico
    x <- as.numeric(df[[col]])
    
    # 4) Parámetros (N finita) y TCL con FPC
    N  <- nrow(df)         # tamaño de población (tus 100 registros)
    n  <- 30               # tamaño de muestra
    mu <- mean(x)
    sdx <- sd(x)
    se  <- sdx / sqrt(n)   # SE clásico
    fpc <- sqrt((N - n) / (N - 1))
    se_fpc <- se * fpc     # SE con corrección por población finita
    
    # 5) Probabilidades con FPC
    p_gt_75 <- 1 - pnorm(75, mean = mu, sd = se_fpc)                      # P(Xbar > 75)
    p_70_80 <- pnorm(80, mean = mu, sd = se_fpc) - pnorm(70, mean = mu, sd = se_fpc)
    
    # 6) Salida
    cat("Columna usada:", col, "\n")
    ## Columna usada: Índice de felicidad global (0-100)
    cat("N =", N, "  n =", n, "\n")
    ## N = 100   n = 30
    cat("mu =", round(mu, 2), "  sd =", round(sdx, 2), 
        "  SE (clásico) =", round(se, 3), "  SE (FPC) =", round(se_fpc, 3), "\n")
    ## mu = 53.48   sd = 29.5   SE (clásico) = 5.387   SE (FPC) = 4.53
    cat("P(Xbar > 75) =", signif(p_gt_75, 6), "\n")
    ## P(Xbar > 75) = 1.01243e-06
    cat("P(70 < Xbar < 80) =", signif(p_70_80, 6), "\n")
    ## P(70 < Xbar < 80) = 0.000132613

    Con corrección por población finita (N = 100, n = 30):

    • Error estándar con FPC: \(SE_{\text{FPC}} = SE \times \sqrt{\frac{N-n}{N-1}}\).
    • Para Índice de felicidad global (0–100): \(\mu \approx 53.48\), \(sd \approx 29.5\), \(SE \approx 5.387\) y \(SE_{\text{FPC}} \approx 4.526\).

    Probabilidades (TCL con FPC): - \(P(\bar X > 75) \approx 1.0\times10^{-6}\) (prácticamente cero). - \(P(70 < \bar X < 80) \approx 0.00013\) (≈ 0.013%).

    Lectura: la FPC estrecha la distribución muestral al muestrear desde una población pequeña (N=100), haciendo aún menos probables promedios tan altos como 75–80 con \(n=30\).

    13.0.2 2. Distribución muestral de la proporción

    • Si se selecciona una muestra aleatoria de n = 40 trabajadores, determine la distribución muestral de la proporción de afiliados a asociaciones empresariales.
    • Compare la proporción poblacional estimada (con los 100 datos) con la media y desviación estándar obtenidas a partir de la distribución muestral.
    • Calcule la probabilidad de que en una muestra de 40 trabajadores más del 50% estén afiliados.
    • Calcule la probabilidad de que la proporción muestral se encuentre entre 40% y 60%.
    library(readxl)
    
    # 1) Ver nombres de columnas (para elegir si hace falta)
    df <- read_excel("Base_Datos_Economia.xlsx")
    cn <- names(df)
    cn_ascii <- tolower(iconv(cn, to = "ASCII//TRANSLIT"))
    print(data.frame(idx = seq_along(cn), original = cn, normalizado = cn_ascii), row.names = FALSE)
    ##  idx                                                    original
    ##    1                                                          ID
    ##    2                                                        Edad
    ##    3                                                      Género
    ##    4                                          Nivel de depresión
    ##    5                                        Nivel de resiliencia
    ##    6                          Índice de felicidad global (0-100)
    ##    7             Horas de interacción con extranjeros por semana
    ##    8              Conocimiento en política internacional (0-100)
    ##    9                              Apertura a la migración (0-10)
    ##   10 Nivel de preocupación por conflictos internacionales (0-10)
    ##   11                       Participación en ONGs internacionales
    ##   12                          Grado de activismo político (0-10)
    ##   13                         Percepción de equidad global (0-10)
    ##   14                   Horas semanales dedicadas a temas de RRII
    ##                                                  normalizado
    ##                                                           id
    ##                                                         edad
    ##                                                       genero
    ##                                           nivel de depresion
    ##                                         nivel de resiliencia
    ##                           indice de felicidad global (0-100)
    ##              horas de interaccion con extranjeros por semana
    ##               conocimiento en politica internacional (0-100)
    ##                               apertura a la migracion (0-10)
    ##  nivel de preocupacion por conflictos internacionales (0-10)
    ##                        participacion en ongs internacionales
    ##                           grado de activismo politico (0-10)
    ##                          percepcion de equidad global (0-10)
    ##                    horas semanales dedicadas a temas de rrii
    # 2) Detectar columna de afiliación (ONG/asociación/gremio/cámara)
    idx <- grep("ong|asoci|grem|camara", cn_ascii)
    if (length(idx) == 0) stop("No se encontró columna de afiliación. Elige una por índice usando la tabla impresa.")
    col <- cn[idx[1]]   # si hay varias, toma la primera
    
    # 3) Convertir Sí/No a 0/1 (robusto a tildes y variantes)
    vals <- tolower(trimws(iconv(as.character(df[[col]]), to = "ASCII//TRANSLIT")))
    x <- ifelse(vals %in% c("si","yes","true","1","afiliado","miembro","participa"), 1,
         ifelse(vals %in% c("no","false","0"), 0, NA_real_))
    
    # 4) Parámetros y probabilidades (TCL + FPC)
    n  <- 40
    N  <- nrow(df)
    p  <- mean(x, na.rm = TRUE)
    
    se_cl  <- sqrt(p * (1 - p) / n)                 # SE clásico
    fpc    <- sqrt((N - n) / (N - 1))               # corrección por población finita
    se_fpc <- se_cl * fpc                           # SE ajustado (usar éste)
    
    p_gt_50 <- 1 - pnorm(0.5, mean = p, sd = se_fpc)                       # P(p̂ > 0.5)
    p_40_60 <- pnorm(0.6, mean = p, sd = se_fpc) - pnorm(0.4, mean = p, sd = se_fpc) # P(0.4 < p̂ < 0.6)
    
    # 5) Resultados (apto para Show in New Window)
    out <- data.frame(
      columna_usada = col,
      N = N, n = n,
      p_hat = round(p, 4),
      se_clasico = round(se_cl, 4),
      se_fpc = round(se_fpc, 4),
      P_phat_gt_0_5 = round(p_gt_50, 4),
      P_0_4_lt_phat_lt_0_6 = round(p_40_60, 4)
    )
    print(out)
    ##                           columna_usada   N  n p_hat se_clasico se_fpc
    ## 1 Participación en ONGs internacionales 100 40  0.33     0.0743 0.0579
    ##   P_phat_gt_0_5 P_0_4_lt_phat_lt_0_6
    ## 1        0.0017               0.1133
    # View(out)  # opcional

    Participación en ONGs internacionales (Sí/No).

    13.0.3 Supuestos y parámetros

    • Tamaño de población: \(N = 100\) (los 100 registros).
    • Tamaño de muestra: \(n = 40\).
    • Proporción poblacional estimada: \(\hat p = 0.33\).
    • Error estándar clásico: \(\mathrm{SE}_{\text{cl}} = \sqrt{\frac{p(1-p)}{n}} \approx 0.0743\).
    • Corrección por población finita (FPC): \(\sqrt{\frac{N-n}{N-1}} = \sqrt{\frac{60}{99}} \approx 0.778\).
    • Error estándar ajustado: \(\mathrm{SE}_{\text{FPC}} = \mathrm{SE}_{\text{cl}}\times\text{FPC} \approx 0.0579\).

    13.0.4 Distribución muestral con FPC

    \[ \hat p \;\sim\; \mathcal{N}\!\big(0.33,\; 0.0579^2\big). \]

    13.0.5 Probabilidades solicitadas (TCL + FPC)

    • Mayoría (> 50%):
      \[ P(\hat p > 0.50) \approx \mathbf{0.0017}\;(\textbf{0.17\%}). \] Interpretación: con \(p\approx 0.33\) y \(n=40\), es muy poco probable observar una muestra con más del 50% afiliado.

    • Entre 40% y 60%:
      \[ P(0.40 < \hat p < 0.60) \approx \mathbf{0.1133}\;(\textbf{11.33\%}). \] Interpretación: alrededor de 1 de cada 9 muestras de tamaño 40 caería en ese rango; lo más habitual es \(\hat p < 0.40\).

    13.0.6 Nota

    Si se ignorara la FPC, el error estándar sería mayor (\(0.0743\)) y las probabilidades cambiarían (por ejemplo, \(P(\hat p>0.50)\approx 1.11\%\)). Con FPC, la distribución muestral es más estrecha, reduciendo dichas probabilidades.

    14 Taller #1

    14.1 Lineamientos para Análisis Exploratorio de Datos (EDA) en RPubs (Primer Corte)

    Plazo máximo: por definir.

    En este informe, los estudiantes deberán organizarse en grupos de tres personas y explorar las bases de datos disponibles en el siguiente repositorio:
    https://github.com/Kalbam/Datos_EST_II

    El objetivo es realizar un análisis descriptivo básico de la base de datos seleccionada, empleando tablas de resumen y gráficos.
    El producto final debe incluir un documento publicado en RPubs y un archivo .R con los códigos utilizados.

    1. El Análisis Exploratorio debe contener los siguientes apartados:
    1. Contextualización de la base de datos y variables
      • Describa en qué consiste la base seleccionada.
      • Presente las variables explicando qué mide cada una.
    2. Características generales de la base de datos
      • Número de filas y columnas.
      • Nombres de las variables.
      • Tipos de variables (numéricas, categóricas, texto, etc.).
    3. Análisis de variables según su tipo
      • Describa las variables numéricas mediante medidas de resumen y gráficos.
      • Describa las variables categóricas con tablas de frecuencia y gráficos de barras.
    4. Revisión de valores faltantes (NA)
      • Identifique y comente si la base contiene valores ausentes.
    5. Detección de valores atípicos
      • Analice si existen outliers en las variables numéricas y represéntelos con boxplots.
    6. Comentarios de resultados
      • Interprete y redacte conclusiones claras para cada hallazgo del análisis.
    1. 2. Aplicación de Distribuciones Muestrales (media y proporción)

    Como cada grupo trabajará con bases de datos distintas, definan ustedes la variable continua (para media) y la variable dicotómica 0/1 (para proporción), el tamaño muestral \(n\) y, si corresponde, el tamaño de la población \(N\) (número total de filas útiles). Justifiquen brevemente sus elecciones.

    14.1.1 Media muestral

    1. Seleccione una variable numérica continua relevante (p. ej., precio, puntuación, horas, ventas).

    2. Estime con todos los datos:

      • Media poblacional aproximada \(\hat\mu\) y desviación estándar \(s\).
    3. Defina el tamaño de muestra \(n\). Si el muestreo se hace desde una base finita de tamaño \(N\) sin reemplazo, use la corrección por población finita (FPC): \[ SE_{\bar X}=\frac{s}{\sqrt{n}}\times \sqrt{\frac{N-n}{N-1}} \quad \text{(si no aplica FPC, use } s/\sqrt{n}\text{).} \]

    4. Plantee la distribución muestral: \[ \bar X \approx \mathcal{N}\!\big(\hat\mu,\; SE_{\bar X}^2\big). \]

    5. Responda dos probabilidades (elijan umbrales propios del contexto):

      • \(P(\bar X > c)\) (p. ej., “promedio de satisfacción/ventas mayor que 75”).
      • \(P(a < \bar X < b)\) (p. ej., entre 70 y 80).
    6. Interprete en lenguaje simple: ¿es probable observar esos promedios con \(n\) casos? ¿Qué implicaría para la gestión?

    14.1.2 Proporción muestral

    1. Defina una variable binaria (0/1) significativa (p. ej., “afiliado Sí/No”, “compra recurrente Sí/No”).
      • Si la base trae texto (“Sí/No”), recodifíquenla a 1/0 y reporten cómo lo hicieron.
    2. Estime con todos los datos:
      • Proporción poblacional aproximada \(\hat p\).
    3. Defina el tamaño de muestra \(n\). Con población finita sin reemplazo, use FPC: \[ SE_{\hat p}=\sqrt{\frac{\hat p(1-\hat p)}{n}}\times \sqrt{\frac{N-n}{N-1}}. \]
    4. Plantee la distribución muestral: \[ \hat p \approx \mathcal{N}\!\big(\hat p,\; SE_{\hat p}^2\big). \]
    5. Responda dos probabilidades (elijan umbrales del contexto):
      • \(P(\hat p > c)\) (p. ej., “más del 50% afiliado/que compra”).
      • \(P(a < \hat p < b)\) (p. ej., 40%–60%).
    6. Interprete: ¿qué tan factible es observar esas proporciones con \(n\)? ¿Qué decisión sugiere?

    15 Corte II

    15.0.1 Intervalos de Confianza

    15.0.1.1 Intervalo de confianza para la media

    1. Un analista financiero está evaluando el rendimiento diario de un portafolio de acciones. La desviación estándar histórica del rendimiento diario es de 15 puntos básicos (0.15%). En una muestra aleatoria de 25 días, el rendimiento medio observado fue de 100 puntos básicos (1.00%). El analista desea calcular un intervalo de confianza del 95% para el verdadero rendimiento medio diario del portafolio.

    x_bar <- 100  
    sigma <- 15   
    n <- 25       
    z_alpha <- 1.96  
    
    error_estandar <- sigma / sqrt(n)
    limite_inferior <- x_bar - z_alpha * error_estandar
    limite_superior <- x_bar + z_alpha * error_estandar
    cat("Intervalo de confianza del 95% para el rendimiento medio diario del portafolio:\n")
    ## Intervalo de confianza del 95% para el rendimiento medio diario del portafolio:
    cat("(", round(limite_inferior, 2), ",", round(limite_superior, 2), ") puntos básicos\n")
    ## ( 94.12 , 105.88 ) puntos básicos

    2. Un auditor desea hacer una estimación con un intervalo de confianza del 95% del valor promedio de los gastos diarios de una pequeña empresa. El auditor ha determinado que los valores diarios de los gastos están distribuidos normalmente.

    A partir de una muestra aleatoria de 36 días, los gastos diarios muestran:
    - Media muestral (\(\bar{x}\)) = $16,500 - Desviación estándar poblacional (\(\sigma\)) = $2,000 - Tamaño de la muestra (\(n\)) = 36 - Nivel de confianza = 95%

    x_bar <- 16500  
    sigma <- 2000   
    n <- 36         
    z_alpha <- 1.96 
    error_estandar <- sigma / sqrt(n)
    limite_inferior <- x_bar - z_alpha * error_estandar
    limite_superior <- x_bar + z_alpha * error_estandar
    cat("Intervalo de confianza del 95% para el valor promedio de los gastos diarios:\n")
    ## Intervalo de confianza del 95% para el valor promedio de los gastos diarios:
    cat("(", round(limite_inferior, 2), ",", round(limite_superior, 2), ") dólares\n")
    ## ( 15846.67 , 17153.33 ) dólares

    15.0.1.2 Intervalo de confianza para la Proporción

    3. Un analista de relaciones internacionales está evaluando el porcentaje de países en una muestra aleatoria que han incumplido acuerdos comerciales internacionales.

    En una muestra aleatoria de 85 países, 10 han incurrido en incumplimientos de acuerdos comerciales.

    El analista desea calcular un intervalo de confianza del 95% para la proporción de países en la población total que han incumplido acuerdos comerciales.

    n <- 85   
    x <- 10   
    p_hat <- x / n  
    
    z_critico <- qnorm(0.975)  
    
    error_estandar <- sqrt((p_hat * (1 - p_hat)) / n)
    IC <- c(p_hat - z_critico * error_estandar, p_hat + z_critico * error_estandar)
    
    cat("Proporción muestral (p̂):", round(p_hat, 4), "\n")
    ## Proporción muestral (p̂): 0.1176
    cat("Error estándar:", round(error_estandar, 4), "\n")
    ## Error estándar: 0.0349
    cat("Intervalo de confianza (95%):", round(IC[1], 4), "a", round(IC[2], 4), "\n")
    ## Intervalo de confianza (95%): 0.0492 a 0.1861

    15.0.1.3 Intervalo de confianza para la dif de Porporciones

    4. Se extrajeron dos muestras aleatorias independientes de estudiantes universitarios de estadística de sexo masculino y femenino.

    • De 120 hombres, 107 esperaban disfrutar de un trabajo de tiempo completo en un máximo de 6 años.
    • De 141 mujeres encuestadas, 73 tenían la misma expectativa.

    El objetivo es calcular un intervalo de confianza del 95% para la diferencia entre las proporciones poblacionales de hombres y mujeres que esperan trabajar a tiempo completo en un máximo de 6 años.

    Datos

    • Muestra de hombres: \(n_1 = 120\)

    • Hombres con expectativa de trabajo: \(x_1 = 107\)

    • Proporción muestral de hombres: \(\hat{p}_1 = \frac{x_1}{n_1}\)

    • Muestra de mujeres: \(n_2 = 141\)

    • Mujeres con expectativa de trabajo: \(x_2 = 73\)

    • Proporción muestral de mujeres: \(\hat{p}_2 = \frac{x_2}{n_2}\)

    • Nivel de confianza: 95%

    • Valor crítico: \(Z_{\alpha/2} = 1.96\)

    Cálculo del Intervalo de Confianza

    El intervalo de confianza para la diferencia de proporciones se basa en la distribución normal estándar y se calcula como:

    \[ IC = (\hat{p}_1 - \hat{p}_2) \pm Z_{\alpha/2} \times \sqrt{\frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2}} \]

    Donde:
    \(Z_{\alpha/2} = 1.96\) para un 95% de confianza.

    \(\hat{p}_1\) y \(\hat{p}_2\) son las proporciones muestrales.

    \(n_1\) y \(n_2\) son los tamaños de muestra.

    n1 <- 120   
    x1 <- 107   
    p1_hat <- x1 / n1  
    n2 <- 141   
    x2 <- 73    
    p2_hat <- x2 / n2  
    
    
    diff_p <- p1_hat - p2_hat  
    
    
    z_critico <- qnorm(0.975)  
    
    
    error_estandar <- sqrt((p1_hat * (1 - p1_hat) / n1) + (p2_hat * (1 - p2_hat) / n2))
    
    
    IC <- c(diff_p - z_critico * error_estandar, diff_p + z_critico * error_estandar)
    
    
    
    cat("Proporción de hombres (p̂1):", round(p1_hat, 4), "\n")
    ## Proporción de hombres (p̂1): 0.8917
    cat("Proporción de mujeres (p̂2):", round(p2_hat, 4), "\n")
    ## Proporción de mujeres (p̂2): 0.5177
    cat("Diferencia de proporciones (p1 - p2):", round(diff_p, 4), "\n")
    ## Diferencia de proporciones (p1 - p2): 0.3739
    cat("Intervalo de confianza (95%):", round(IC[1], 4), "a", round(IC[2], 4), "\n")
    ## Intervalo de confianza (95%): 0.2745 a 0.4734
    if (IC[1] > 0 & IC[2] > 0) {
      cat("Conclusión: Como el intervalo no incluye el 0, podemos afirmar con un 95% de confianza que la proporción de hombres que esperan trabajar a tiempo completo en un máximo de 6 años es mayor que la de las mujeres.\n")
    } else {
      cat("Conclusión: Como el intervalo incluye el 0, no hay suficiente evidencia para afirmar que hay una diferencia significativa entre hombres y mujeres y oscila entre 27% y 47%\n")
    }
    ## Conclusión: Como el intervalo no incluye el 0, podemos afirmar con un 95% de confianza que la proporción de hombres que esperan trabajar a tiempo completo en un máximo de 6 años es mayor que la de las mujeres.

    15.0.1.4 Intervalo de confianza para la Dif de Medias

    5. Para una muestra aleatoria de 321 fumadores, el número medio de horas de absentismo laboral al mes fue de 3,01 horas, con una desviación típica muestral de 1,09 horas. Para una muestra aleatoria independiente de 94 trabajadores que nunca han fumado, el número medio de horas fue de 2,88 horas, con una desviación típica muestral de 1,01 horas. El objetivo es calcular un intervalo de confianza del 95% para la diferencia entre las dos medias poblacionales de absentismo laboral.

    Datos

    • Muestra de fumadores: \(n_1 = 321\)
      • Media muestral: \(\bar{x}_1 = 3.01\)
      • Desviación estándar muestral: \(s_1 = 1.09\)
    • Muestra de no fumadores: \(n_2 = 94\)
      • Media muestral: \(\bar{x}_2 = 2.88\)
      • Desviación estándar muestral: \(s_2 = 1.01\)
    • Nivel de confianza: 95%
    • Valor crítico: \(Z_{\alpha/2} = 1.96\)

    Cálculo del Intervalo de Confianza para la Diferencia de Medias

    Dado que los tamaños muestrales son grandes, utilizamos la distribución normal estándar para calcular el intervalo de confianza:

    \[ IC = (\bar{x}_1 - \bar{x}_2) \pm Z_{\alpha/2} \times \sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}} \]

    \(Z_{\alpha/2} = 1.96\) para un 95% de confianza.

    \(s_1^2\) y \(s_2^2\) son las varianzas muestrales.

    \(n_1\) y \(n_2\) son los tamaños de muestra.

    n1 <- 321   
    x1_bar <- 3.01  
    s1 <- 1.09  
    
    n2 <- 94    
    x2_bar <- 2.88  
    s2 <- 1.01  
    
    
    diff_means <- x1_bar - x2_bar  
    
    
    z_critico <- qnorm(0.975)  
    
    
    error_estandar <- sqrt((s1^2 / n1) + (s2^2 / n2))
    
    
    IC <- c(diff_means - z_critico * error_estandar, diff_means + z_critico * error_estandar)
    
    
    
    cat("Media de fumadores (x̄1):", round(x1_bar, 4), "\n")
    ## Media de fumadores (x̄1): 3.01
    cat("Media de no fumadores (x̄2):", round(x2_bar, 4), "\n")
    ## Media de no fumadores (x̄2): 2.88
    cat("Diferencia de medias (x̄1 - x̄2):", round(diff_means, 4), "\n")
    ## Diferencia de medias (x̄1 - x̄2): 0.13
    cat("Intervalo de confianza (95%):", round(IC[1], 4), "a", round(IC[2], 4), "\n")
    ## Intervalo de confianza (95%): -0.1064 a 0.3664
    if (IC[1] > 0 & IC[2] > 0) {
      cat("Conclusión: Como el intervalo no incluye el 0, podemos afirmar con un 95% de confianza que los fumadores tienen un mayor absentismo laboral en promedio que los no fumadores.\n")
    } else {
      cat("Conclusión: Como el intervalo incluye el 0, no hay suficiente evidencia para afirmar que hay una diferencia significativa en el absentismo laboral entre fumadores y no fumadores.\n")
    }
    ## Conclusión: Como el intervalo incluye el 0, no hay suficiente evidencia para afirmar que hay una diferencia significativa en el absentismo laboral entre fumadores y no fumadores.

    15.0.1.5 Intervalo de confianza para la varianza

    6. Un analista financiero está evaluando la variabilidad en la rentabilidad diaria de una cartera de inversiones. La desviación estándar muestral de la rentabilidad diaria es 0.8% en una muestra de 15 observaciones.

    El objetivo es calcular un intervalo de confianza del 90% tanto para la varianza como para la desviación estándar poblacional de la rentabilidad diaria de la cartera.

    Datos

    • Tamaño de la muestra: \(n = 15\)
    • Desviación estándar muestral: \(s = 0.8\)
    • Grados de libertad: \(v = n - 1 = 14\)
    • Valores críticos de Chi-cuadrado:
      • \(\chi^2_{0.05, 14} = 23.68\)
      • \(\chi^2_{0.95, 14} = 6.57\)
    • Nivel de confianza: 90%

    Cálculo del Intervalo de Confianza para la Varianza

    El intervalo de confianza para la varianza poblacional se basa en la distribución Chi-cuadrado:

    \[ \left( \frac{(n-1) s^2}{\chi^2_{1-\alpha/2}}, \frac{(n-1) s^2}{\chi^2_{\alpha/2}} \right) \]

    Donde:

    \(\chi^2_{1-\alpha/2}\) y \(\chi^2_{\alpha/2}\) son los valores críticos de la distribución Chi-cuadrado.

    \(s^2\) es la varianza muestral.

    \(n-1\) son los grados de libert ad.

    n <- 15   
    s <- 0.8  
    gl <- n - 1  
    
    
    chi2_inf <- qchisq(0.95, df = gl)  
    chi2_sup <- qchisq(0.05, df = gl)  #
    
    
    varianza_inf <- (gl * s^2) / chi2_inf
    varianza_sup <- (gl * s^2) / chi2_sup
    IC_varianza <- c(varianza_inf, varianza_sup)
    
    
    IC_desviacion <- sqrt(IC_varianza)
    
    
    cat("### Intervalo de Confianza del 90% para la varianza ###\n")
    ## ### Intervalo de Confianza del 90% para la varianza ###
    cat("Intervalo de confianza (90%):", round(IC_varianza[1], 4), "a", round(IC_varianza[2], 4), "\n")
    ## Intervalo de confianza (90%): 0.3783 a 1.3636
    cat("\n### Intervalo de Confianza del 90% para la desviación estándar ###\n")
    ## 
    ## ### Intervalo de Confianza del 90% para la desviación estándar ###
    cat("Intervalo de confianza (90%):", round(IC_desviacion[1], 4), "a", round(IC_desviacion[2], 4), "\n")
    ## Intervalo de confianza (90%): 0.6151 a 1.1678

    15.0.1.6 Intervalo de confianza para la razón de varianzas

    7. Una compañía fabrica propulsores para motores de turbinas. Una de las operaciones consiste en esmerilar el terminado de una superficie particular con aleación de titanio. Pueden emplearse dos procesos de esmerilado, y ambos pueden producir partes que tienen la misma rigurosidad superficial promedio.

    El ingeniero de manufactura desea seleccionar el proceso que tenga la menor variabilidad en la rigurosidad de la superficie.

    Para ello, toma una muestra de 12 partes del primer proceso, con una desviación estándar muestral de 5.1 micro pulgadas.

    En el segundo proceso, se toma una muestra aleatoria de 15 partes, con una desviación estándar muestral de 4.7 micro pulgadas.

    Se desea encontrar un intervalo de confianza del 90% para el cociente de las dos varianzas.

    Datos

    • Muestra del primer proceso: \(n_1 = 12\)
      • Desviación estándar muestral: \(s_1 = 5.1\)
      • Varianza muestral: \(s_1^2\)
    • Muestra del segundo proceso: \(n_2 = 15\)
      • Desviación estándar muestral: \(s_2 = 4.7\)
      • Varianza muestral: \(s_2^2\)
    • Nivel de confianza: 90%
    • Distribución F: Usaremos los grados de libertad \(df_1 = n_1 - 1\) y \(df_2 = n_2 - 1\).

    Cálculo del Intervalo de Confianza para el Cociente de Varianzas

    El intervalo de confianza para la razón de varianzas se basa en la distribución F:

    \[ IC = \left( \frac{s_1^2}{s_2^2} \times \frac{1}{F_{1-\alpha/2, df_1, df_2}}, \frac{s_1^2}{s_2^2} \times F_{\alpha/2, df_1, df_2} \right) \]

    Donde:

    \(F_{\alpha/2, df_1, df_2}\) y \(F_{1-\alpha/2, df_1, df_2}\) son los valores críticos de la distribución F.

    \(s_1^2\) y \(s_2^2\) son las varianzas muestrales.

    \(n_1 - 1\) y \(n_2 - 1\) son los grados de libertad.

    n1 <- 12  
    s1 <- 5.1  
    var1 <- s1^2  
    
    n2 <- 15  
    s2 <- 4.7  
    var2 <- s2^2  
    
    
    F_stat <- var1 / var2  
    
    df1 <- n1 - 1  
    df2 <- n2 - 1  
    
    F_inf <- qf(0.95, df1, df2)  
    F_sup <- qf(0.05, df1, df2)  
    
    
    
    cat("### Intervalo de Confianza del 90% para el Cociente de Varianzas ###\n")
    ## ### Intervalo de Confianza del 90% para el Cociente de Varianzas ###
    cat("Cociente de varianzas (s1² / s2²):", round(F_stat, 4), "\n")
    ## Cociente de varianzas (s1² / s2²): 1.1775
    cat("Valores críticos de F:", round(F_inf, 4), "y", round(F_sup, 4), "\n")
    ## Valores críticos de F: 2.5655 y 0.3651

    Realice el intervalo de confianza

    15.0.1.7 Tamaño de Muestra para la Media

    8. La longitud de barras de metal producidas por una cadena de producción es una variable aleatoria con distribución normal y desviación estándar de 1.8 milímetros. Con una muestra aleatoria de 9 observaciones, se obtuvo el siguiente intervalo de confianza del 99% para la longitud media poblacional:

    \[ 194.65 < \mu < 197.75 \]

    Sin embargo, el director de producción considera que este intervalo es demasiado amplio y exige un intervalo con el mismo nivel de confianza, pero cuya longitud a cada lado de la media muestral no supere 0.5 milímetros.

    Se requiere calcular el tamaño muestral necesario para construir tal intervalo.

    Datos

    • Error máximo permitido: \(e = 0.5\) mm
    • Desviación estándar poblacional: \(\sigma = 1.8\) mm
    • Nivel de confianza: 99%
    • Valor crítico: \(Z_{\alpha/2} = Z_{0.005} = 2.575\)

    Cálculo del Tamaño Muestral

    El tamaño muestral necesario se obtiene con la siguiente fórmula:

    \[ n = \left( \frac{Z_{\alpha/2} \sigma}{e} \right)^2 \]

    Donde:
    \(Z_{\alpha/2}\) es el valor crítico de la distribución normal estándar para un 99% de confianza.

    \(\sigma\) es la desviación estándar poblacional.

    \(e\) es el error máximo permitido en cada lado del intervalo.

    e <- 0.5    
    sigma <- 1.8 
    z_alpha_2 <- qnorm(0.995) 
    
    
    n <- ( (z_alpha_2 * sigma) / e )^2
    n_requerido <- ceiling(n)  
    
    cat("Nivel de confianza:", "99%\n")
    ## Nivel de confianza: 99%
    cat("Valor crítico Zα/2:", round(z_alpha_2, 4), "\n")
    ## Valor crítico Zα/2: 2.5758
    cat("Desviación estándar σ:", sigma, "mm\n")
    ## Desviación estándar σ: 1.8 mm
    cat("Error permitido e:", e, "mm\n")
    ## Error permitido e: 0.5 mm
    cat("Tamaño muestral necesario n:", round(n, 2), "\n")
    ## Tamaño muestral necesario n: 85.99
    cat("Tamaño muestral requerido (redondeado):", n_requerido, "observaciones\n")
    ## Tamaño muestral requerido (redondeado): 86 observaciones

    15.0.1.8 Tamaño de Muestra para la Proporción

    9. Se ha construido un intervalo de confianza del 95% para la proporción de directores de recursos humanos que consideran que el expediente académico es muy importante en la evaluación de un candidato. El intervalo obtenido fue:

    \[ 0.533 \leq \pi \leq 0.693 \]

    Ahora, se desea construir un intervalo de confianza del 95% con una longitud a cada lado de la proporción muestral que no supere 0.06.

    Se requiere determinar cuántas observaciones son necesarias para obtener este nuevo intervalo más preciso.

    Datos

    • Error máximo permitido: \(e = 0.06\)
    • Nivel de confianza: 95%
    • Valor crítico: \(Z_{\alpha/2} = Z_{0.025} = 1.96\)
    • Dado que \(p\) es desconocido, usamos \(p = 0.5\) (máxima varianza).

    Cálculo del Tamaño Muestral

    El tamaño muestral necesario se obtiene con la siguiente fórmula:

    \[ n = \frac{(0.25) Z_{\alpha/2}^2}{e^2} \]

    Donde:

    \(Z_{\alpha/2}\) es el valor crítico de la distribución normal estándar para un 95% de confianza.

    \(0.25\) es la varianza máxima posible de una proporción cuando \(p\) es desconocido.

    \(e\) es el error máximo permitido en cada lado del intervalo.

    e <- 0.06    
    p <- 0.5     
    z_alpha_2 <- qnorm(0.975) 
    
    n <- (0.25 * (z_alpha_2^2)) / (e^2)
    n_requerido <- ceiling(n)  
    
    cat("Nivel de confianza:", "95%\n")
    ## Nivel de confianza: 95%
    cat("Valor crítico Zα/2:", round(z_alpha_2, 4), "\n")
    ## Valor crítico Zα/2: 1.96
    cat("Proporción asumida p:", p, "\n")
    ## Proporción asumida p: 0.5
    cat("Error permitido e:", e, "\n")
    ## Error permitido e: 0.06
    cat("Tamaño muestral necesario n:", round(n, 2), "\n")
    ## Tamaño muestral necesario n: 266.77
    cat("Tamaño muestral requerido (redondeado):", n_requerido, "observaciones\n")
    ## Tamaño muestral requerido (redondeado): 267 observaciones

    16 Análisis Exploratorio de Datos

    El análisis exploratorio de datos (Ver video) (EDA por sus siglas en inglés) implica el uso de gráficos y visualizaciones para explorar y analizar un conjunto de datos. El objetivo es explorar, investigar y aprender, no confirmar hipótesis estadísticas.

    16.1 ¿Cuándo debo utilizarlo?

    El análisis exploratorio de datos es una potente herramienta para explorar un conjunto de datos. Incluso cuando su objetivo es efectuar análisis planificados, el EDA puede utilizarse para limpiar datos, para análisis de subgrupos o simplemente para comprender mejor los datos. Un paso inicial importante en cualquier análisis de datos es representar los datos gráficamente.

    No gráfico: Calcula estadísticas descriptivas de las variables

    Gráfico: Calcula estadísticas de forma gráfica

    Univariado: Analiza una sola variable a la vez

    Multivariado: Analiza dos o más variables

    A su vez, cada uno de esas dividisiones puede subdividirse según los tipos de datos con los que trabajemos: categóricos o numéricos.

    16.2 Representación de datos según su Naturaleza

    tabla <- data.frame(
      "Naturaleza de la variable" = c("Cualitativa", "", "Cuantitativa", ""),
      "Escala de Medidas" = c("Nominal", "Ordinal", "Intervalo", "Razon"),
      "Frecuencias" = c("Si", "Si", "Agrupadas", ""),
      "Medidas de Localizacion" = c("Moda", "Moda", "Media, Mediana y Moda", ""),
      "Medidas de Dispersion" = c("No", "No", "Si", "Si"),
      "Medidas de Distribucion" = c("No", "No", "Si", "Si"),
      "Graficos" = c("Sectores, Barras", "Sectores, Barras (sin orden)", "Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion.", "")
    )
    
    # Create the table with kableExtra
    library(knitr)
    library(kableExtra)
    
    tabla %>%
      kable("html", align = "c", col.names = c(
        "Naturaleza de la variable", 
        "Escala de Medidas", 
        "Frecuencias", 
        "Medidas de Localizacion", 
        "Medidas de Dispersion", 
        "Medidas de Distribucion", 
        "Graficos"
      )) %>%
      kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
      row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
      row_spec(1:2, background = "white", color = "black") %>%
      row_spec(3:4, background = "#E7E7E7", color = "black")
    Naturaleza de la variable Escala de Medidas Frecuencias Medidas de Localizacion Medidas de Dispersion Medidas de Distribucion Graficos
    Cualitativa Nominal Si Moda No No Sectores, Barras
    Ordinal Si Moda No No Sectores, Barras (sin orden)
    Cuantitativa Intervalo Agrupadas Media, Mediana y Moda Si Si Histograma, Tallo y hojas, Cajas y Bigotes, Dispersion.
    Razon Si Si

    16.3 Presentación y análisis de la Información en estudios Descríptivos.

    tabla <- data.frame(
      "Tipo de Tabla" = c(
        "De Frecuencia (Variable Cualitativa)",
        "De Frecuencia (Variable Cuantitativa)",
        "De Asociacion (Dos Variables Cualitativas)",
        "De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta)",
        "De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua)",
        "De Asociacion (Dos Variables Cuantitativas)"
      ),
      "Tipo de Grafico" = c(
        "- Barras simples\n- Pastel",
        "- Histograma",
        "- Barras compuestas\n- Barras superpuestas",
        "- Barras:\n  * Compuestas\n  * Superpuestas",
        "- Poligono de Frecuencia\n- Box plot (diagrama de cajas y bigotes)",
        "- Diagrama de Puntos"
      ),
      stringsAsFactors = FALSE
    )
    
    # Creating the table using kableExtra
    tabla %>%
      kable("html", escape = FALSE, align = "l", col.names = c("Tipo de Tabla", "Tipo de Grafico")) %>%
      kable_styling(full_width = F, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
      row_spec(0, bold = TRUE, background = "#D9E2F1", color = "black") %>%
      row_spec(c(3, 4), background = "#F2F2F2", color = "black") %>%
      row_spec(c(2, 5), background = "white", color = "black") %>%
      row_spec(c(1, 6), background = "#E7E7E7", color = "black") %>%
      column_spec(1, width = "4cm") %>%
      column_spec(2, width = "6cm")
    Tipo de Tabla Tipo de Grafico
    De Frecuencia (Variable Cualitativa)
    • Barras simples
    • Pastel
    De Frecuencia (Variable Cuantitativa)
    • Histograma
    De Asociacion (Dos Variables Cualitativas)
    • Barras compuestas
  • Barras superpuestas
  • De Asociacion (Una Variable Cualitativa y una Cuantitativa Discreta)
    • Barras:
    • Compuestas
    • Superpuestas
    De Asociacion (Una Variable Cualitativa y una Cuantitativa Continua)
    • Poligono de Frecuencia
  • Box plot (diagrama de cajas y bigotes)
  • De Asociacion (Dos Variables Cuantitativas)
    • Diagrama de Puntos

    17 Problema de Aplicación utilizando la base de datos.

    Una consultora financiera está evaluando el desempeño de sucursales en dos ciudades (Ciudad A y Ciudad B). Se recopilaron datos sobre:

    Ingresos mensuales (en miles de dólares) para medir el rendimiento financiero de cada sucursal.

    Satisfacción de clientes (1 = satisfecho, 0 = no satisfecho) para evaluar la calidad del servicio.

    El objetivo es realizar estimaciones estadísticas para ayudar a la empresa a tomar decisiones sobre su crecimiento y mejora en la calidad del servicio.

    Una consultora financiera desea estimar el ingreso mensual promedio de sus sucursales en Ciudad A. Para ello, selecciona una muestra aleatoria de 50 sucursales y registra sus ingresos mensuales (en miles de dólares).

    17.0.1 Análisis exploratorio de la base

    library(dplyr)
    
    datos <- read.csv("datos_negocios.csv")
    head(datos)

    Resumen estadístico de las variables numéricas

    # Resumen estadístico de las variables numéricas
    summary(datos)
    ##     Ciudad             Ingresos        Satisfecho 
    ##  Length:100         Min.   : 71.78   Min.   :0.0  
    ##  Class :character   1st Qu.:102.35   1st Qu.:0.0  
    ##  Mode  :character   Median :113.86   Median :1.0  
    ##                     Mean   :115.47   Mean   :0.7  
    ##                     3rd Qu.:130.42   3rd Qu.:1.0  
    ##                     Max.   :155.89   Max.   :1.0

    La mediana (113.86) y la media (115.47) están muy cercanas, lo que sugiere que la distribución de los ingresos es aproximadamente simétrica. Hay una variabilidad en los ingresos, con valores que oscilan entre 71.78 y 155.89. El rango intercuartílico (Q3 - Q1) es 130.42 - 102.35 = 28.07, lo que indica que la mayor parte de los datos se encuentra en ese rango.

    library(ggplot2)
    ggplot(datos, aes(x = Ciudad, y = Ingresos, fill = Ciudad)) +
      geom_boxplot() +
      labs(title = "Distribución de Ingresos por Ciudad",
           x = "Ciudad",
           y = "Ingresos") +
      theme_minimal()

    Este gráfico muestra la variabilidad en los ingresos en cada ciudad. Se pueden observar diferencias en la mediana y la dispersión de los datos.

    satisfaccion_ciudad <- datos %>%
      group_by(Ciudad) %>%
      summarise(Satisfacción_Porcentaje = mean(Satisfecho) * 100)
    
    print(satisfaccion_ciudad)
    ## # A tibble: 2 × 2
    ##   Ciudad Satisfacción_Porcentaje
    ##   <chr>                    <dbl>
    ## 1 A                           74
    ## 2 B                           66

    En la Ciudad A, el 74% de los clientes están satisfechos.

    En la Ciudad B, el 66% de los clientes están satisfechos.

    Conclusión: La satisfacción es mayor en la Ciudad A que en la Ciudad B.

    ggplot(datos, aes(x = Ciudad, fill = as.factor(Satisfecho))) +
      geom_bar(position = "dodge") +
      labs(title = "Número de Clientes Satisfechos por Ciudad",
           x = "Ciudad",
           y = "Frecuencia",
           fill = "Satisfecho") +
      scale_fill_manual(values = c("lightblue", "coral"), labels = c("No", "Sí")) +
      theme_minimal()

    El anterior gráfico revela la cantidad de clientes satisfechos y no satisfechos en cada ciudad. Se puede observar si hay diferencias significativas en la satisfacción entre ambas ciudades

    ggplot(datos, aes(x = (Satisfecho), y = Ingresos, fill = as.factor(Satisfecho))) +
      geom_boxplot() +
      labs(title = "Distribución de Ingresos según Satisfacción del Cliente",
           x = "Satisfacción del Cliente",
           y = "Ingresos") +
      scale_x_discrete(labels = c("0" = "No Satisfecho", "1" = "Satisfecho")) +
      scale_fill_manual(values = c("lightblue", "coral")) +
      theme_minimal()

    • Los clientes satisfechos tienden a tener ingresos más altos.

    • La mediana de los ingresos es mayor en el grupo de clientes satisfechos.

    • Existe mayor dispersión en los ingresos de los clientes satisfechos.

    ggplot(datos, aes(x = Ingresos)) +
      geom_histogram(binwidth = 5, fill = "skyblue", color = "black", alpha = 0.7) +
      geom_density(aes(y = ..density.. * 5), color = "blue", size = 1) +
      labs(title = "Distribución de los Ingresos",
           x = "Ingresos",
           y = "Frecuencia") +
      theme_minimal()
    ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
    ## ℹ Please use `linewidth` instead.
    ## This warning is displayed once every 8 hours.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

    El anterior histograma nos muestra la distribución de los ingresos, donde se observa que la mayoría de los valores están concentrados entre 90 y 140, con una ligera asimetría.

    17.0.1.1 Intervalo de confianza para la media

    1. Calcular un intervalo de confianza al 95% para la media poblacional de los ingresos mensuales en Ciudad A. Interpretar el intervalo obtenido y evaluar si es posible hacer inferencias sobre el total de sucursales.

    Datos

    • Muestra: \(n = 50\) sucursales
    • Media muestral (\(\bar{X}\)): Calculada con la muestra
    • Desviación estándar muestral (\(s\)): Calculada con la muestra
    • Nivel de confianza: 95%
    datos_A <- filter(datos, Ciudad == "A")
    datos_A
    media_ingresos_A <- mean(datos_A$Ingresos)  
    sd_ingresos_A <- sd(datos_A$Ingresos)  
    n_A <- nrow(datos_A)  
    error_media_A <- qt(0.975, df = n_A - 1) * sd_ingresos_A / sqrt(n_A)  
    
    
    IC_media_A <- c(media_ingresos_A - error_media_A, media_ingresos_A + error_media_A)
    cat("Media de ingresos:", media_ingresos_A, "\n")
    ## Media de ingresos: 120.1991
    cat("Intervalo de confianza para la media poblacional de los ingresos mensuales en Ciudad A:", IC_media_A, "\n")
    ## Intervalo de confianza para la media poblacional de los ingresos mensuales en Ciudad A: 115.0763 125.3219

    17.0.1.2 Intervalo de confianza para la proporción

    2. La empresa también desea estimar el porcentaje de clientes satisfechos en sus sucursales de Ciudad A. Se selecciona una muestra aleatoria de 50 sucursales y se evalúa si los clientes reportaron estar satisfechos con el servicio (1 = Satisfecho, 0 = No satisfecho).

    Con base en estos datos, se requiere:

    • Calcular un intervalo de confianza al 95% para la proporción poblacional de clientes satisfechos.

    • analizar si esta proporción indica una buena calidad del servicio en la ciudad.

    Datos

    • Muestra: \(n = 50\) sucursales
    • Proporción muestral (\(\hat{p}\)): Calculada con la muestra
    • Nivel de confianza: 95%
    num_satisfechos_A <- sum(datos_A$Satisfecho)
    
    
    n_A <- nrow(datos_A)
    p_A <- num_satisfechos_A / n_A  
    
    error_p_A <- qnorm(0.975) * sqrt((p_A * (1 - p_A)) / n_A)
    IC_p_A <- c(p_A - error_p_A, p_A + error_p_A)
    
    
    
    cat("Clientes satisfechos en Ciudad A:", num_satisfechos_A, "\n")
    ## Clientes satisfechos en Ciudad A: 37
    cat("Tamaño de la muestra (n):", n_A, "\n")
    ## Tamaño de la muestra (n): 50
    cat("Proporción muestral de clientes satisfechos en la muestra fue de:", round(p_A, 4), "\n")
    ## Proporción muestral de clientes satisfechos en la muestra fue de: 0.74
    cat("Intervalo de confianza (95%) de la población de clientes satisfechos esta entre:", round(IC_p_A[1], 4), "y", round(IC_p_A[2], 4), "\n")
    ## Intervalo de confianza (95%) de la población de clientes satisfechos esta entre: 0.6184 y 0.8616

    17.0.1.3 Intervalo de confianza para la dif de proporciones

    3. Una empresa de consultoría desea comparar la proporción de clientes satisfechos entre sus sucursales en Ciudad A y Ciudad B para determinar si hay una diferencia significativa. Para ello, se han seleccionado muestras aleatorias de 50 sucursales en cada ciudad y se ha registrado si los clientes están satisfechos (1 = Satisfecho, 0 = No satisfecho).

    Calcular un intervalo de confianza al 95% para la diferencia de proporciones poblacionales de clientes satisfechos entre Ciudad A y Ciudad B.

    Interpretar el intervalo obtenido y evaluar si hay una diferencia significativa en la satisfacción de clientes entre ambas ciudades.

    Datos

    • Muestra en Ciudad A: \(n_A = 50\) sucursales
    • Muestra en Ciudad B: \(n_B = 50\) sucursales
    • Proporción muestral en Ciudad A: \(\hat{p}_A\)
    • Proporción muestral en Ciudad B: \(\hat{p}_B\)
    • Nivel de confianza: 95%

    El intervalo de confianza para la diferencia de proporciones se basa en la distribución normal y se calcula como:

    \[ IC = (\hat{p}_A - \hat{p}_B) \pm Z_{\alpha/2} \times \sqrt{\frac{\hat{p}_A (1 - \hat{p}_A)}{n_A} + \frac{\hat{p}_B (1 - \hat{p}_B)}{n_B}} \]

    Donde:

    ( Z_{/2} ) es el valor crítico de la distribución normal estándar.

    ( _A ) y \(\hat{p}_B\) son las proporciones muestrales de cada ciudad.

    ( n_A ) y \(n_B\) son los tamaños de muestra.

    datos_A <- filter(datos, Ciudad == "A")
    datos_B <- filter(datos, Ciudad == "B")
    
    num_satisfechos_A <- sum(datos_A$Satisfecho)
    num_satisfechos_B <- sum(datos_B$Satisfecho)
    
    p_A <- num_satisfechos_A / nrow(datos_A)
    p_B <- num_satisfechos_B / nrow(datos_B)
    
    diff_proporciones <- p_A - p_B
    
    error_diff_p <- sqrt((p_A * (1 - p_A) / nrow(datos_A)) + (p_B * (1 - p_B) / nrow(datos_B)))
    
    z_critico <- qnorm(0.975)  
    
    IC_diff_proporciones <- c(diff_proporciones - z_critico * error_diff_p, 
                               diff_proporciones + z_critico * error_diff_p)
    
    
    cat("Proporción de clientes satisfechos en Ciudad A:", round(p_A, 4), "\n")
    ## Proporción de clientes satisfechos en Ciudad A: 0.74
    cat("Proporción de clientes satisfechos en Ciudad B:", round(p_B, 4), "\n")
    ## Proporción de clientes satisfechos en Ciudad B: 0.66
    cat("Diferencia de proporciones:", round(diff_proporciones, 4), "\n")
    ## Diferencia de proporciones: 0.08
    cat("Intervalo de confianza (95%):", round(IC_diff_proporciones[1], 4), "a", round(IC_diff_proporciones[2], 4), "\n")
    ## Intervalo de confianza (95%): -0.0989 a 0.2589

    17.0.1.4 Intervalo de confianza para la diferencia de Medias (Caso 3)

    4. Una empresa de consultoría desea comparar los ingresos mensuales promedio de sus sucursales en Ciudad A y Ciudad B para determinar si hay una diferencia significativa entre ambas. Para ello, se han seleccionado muestras aleatorias de 50 sucursales en cada ciudad y se han registrado sus ingresos mensuales (en miles de dólares).

    Calcular un intervalo de confianza al 95% para la diferencia de medias poblacionales de los ingresos mensuales entre Ciudad A y Ciudad B.

    Interpretar el intervalo obtenido y evaluar si hay una diferencia significativa en los ingresos entre ambas ciudades.

    Datos

    • Muestra en Ciudad A: \(n_A = 50\) sucursales
    • Muestra en Ciudad B: \(n_B = 50\) sucursales
    • Media muestral en Ciudad A: \(\bar{X}_A\)
    • Media muestral en Ciudad B: \(\bar{X}_B\)
    • Desviación estándar en Ciudad A: \(s_A\)
    • Desviación estándar en Ciudad B: \(s_B\)
    • Nivel de confianza: 95%

    Cálculo del Intervalo de Confianza para la Diferencia de Medias

    El intervalo de confianza para la diferencia de medias se basa en la distribución t de Student y se calcula como:

    \[ IC = (\bar{X}_A - \bar{X}_B) \pm t_{\alpha/2} \times \sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}} \]

    Donde:
    ( t_{/2} ) es el valor crítico de la distribución t con grados de libertad aproximados.

    ( s_A^2 ) y \(s_B^2\) son las varianzas muestrales de cada ciudad.

    ( n_A ) y \(n_B\) son los tamaños de muestra.

    datos_A <- filter(datos, Ciudad == "A")
    datos_B <- filter(datos, Ciudad == "B")
    
    media_A <- mean(datos_A$Ingresos)
    media_B <- mean(datos_B$Ingresos)
    
    sd_A <- sd(datos_A$Ingresos)
    sd_B <- sd(datos_B$Ingresos)
    
    n_A <- nrow(datos_A)
    n_B <- nrow(datos_B)
    
    diff_medias <- media_A - media_B
    
    error_diff <- sqrt((sd_A^2 / n_A) + (sd_B^2 / n_B))
    
    df_welch <- ((sd_A^2 / n_A + sd_B^2 / n_B)^2) /
                (((sd_A^2 / n_A)^2 / (n_A - 1)) + ((sd_B^2 / n_B)^2 / (n_B - 1)))
    
    
    t_critico <- qt(0.975, df = df_welch)
    
    
    IC_diff_medias <- c(diff_medias - t_critico * error_diff, diff_medias + t_critico * error_diff)
    
    
    cat("Media de ingresos en Ciudad A:", round(media_A, 2), "\n")
    ## Media de ingresos en Ciudad A: 120.2
    cat("Media de ingresos en Ciudad B:", round(media_B, 2), "\n")
    ## Media de ingresos en Ciudad B: 110.74
    cat("Diferencia de medias:", round(diff_medias, 2), "\n")
    ## Diferencia de medias: 9.46
    cat("Intervalo de confianza (95%) para la diferencia de medias a nivel poblacional es de:", round(IC_diff_medias[1], 2), "a", round(IC_diff_medias[2], 2), "\n")
    ## Intervalo de confianza (95%) para la diferencia de medias a nivel poblacional es de: 2.04 a 16.88

    17.0.1.5 Intervalo de confianza para la Varianza

    5. Una empresa de auditoría desea evaluar la variabilidad en los ingresos mensuales de sus sucursales en Ciudad A. Para ello, selecciona una muestra aleatoria de 50 sucursales y registra sus ingresos mensuales (en miles de dólares). Dado que la variabilidad en los ingresos es clave para la estabilidad financiera, se requiere:

    Calcular un intervalo de confianza al 95% para la varianza poblacional de los ingresos mensuales en Ciudad A.

    Interpretar el intervalo obtenido y evaluar si los ingresos tienen una dispersión aceptable para la empresa.

    Datos

    • Muestra: \(n = 50\) sucursales
    • Varianza muestral (\(s^2\)): Calculada con la muestra
    • Nivel de confianza: 95%
    varianza_A <- var(datos_A$Ingresos)  
    n_A <- nrow(datos_A)  
    gl <- n_A - 1  
    chi2_inf <- qchisq(0.975, df = gl)  
    chi2_sup <- qchisq(0.025, df = gl)  
    IC_varianza_A <- c((gl * varianza_A) / chi2_inf, (gl * varianza_A) / chi2_sup)
    
    
    
    cat("Varianza muestral de ingresos en Ciudad A:", round(varianza_A, 4), "\n")
    ## Varianza muestral de ingresos en Ciudad A: 324.9189
    cat("Intervalo de confianza (95%) para la varianza de ingresos poblacionales:", round(IC_varianza_A[1], 4), "a", round(IC_varianza_A[2], 4), "\n")
    ## Intervalo de confianza (95%) para la varianza de ingresos poblacionales: 226.7229 a 504.5498

    17.0.1.6 Intervalo de confianza para la razón de varianzas

    6. Una empresa de auditoría desea comparar la variabilidad en los ingresos mensuales de sus sucursales en Ciudad A y Ciudad B. Para ello, selecciona muestras aleatorias de 50 sucursales en cada ciudad y mide la varianza de sus ingresos mensuales (en miles de dólares).

    Calcular un intervalo de confianza al 95% para la razón de varianzas poblacionales entre Ciudad A y Ciudad B.

    Interpretar el intervalo obtenido y evaluar si la variabilidad en los ingresos es significativamente diferente entre ambas ciudades.

    Datos

    • Muestra en Ciudad A: \(n_A = 50\) sucursales
    • Muestra en Ciudad B: \(n_B = 50\) sucursales
    • Varianza muestral en Ciudad A: \(s_A^2\)
    • Varianza muestral en Ciudad B: \(s_B^2\)
    • Nivel de confianza: 95%

    Cálculo del Intervalo de Confianza para la Razón de Varianzas

    El intervalo de confianza para la razón de varianzas se basa en la distribución F y se calcula como:

    \[ IC = \left( \frac{s_A^2}{s_B^2} \times \frac{1}{F_{1-\alpha/2, n_A-1, n_B-1}}, \frac{s_A^2}{s_B^2} \times F_{\alpha/2, n_A-1, n_B-1} \right) \]

    Donde:

    \(F_{\alpha/2, n_A-1, n_B-1}\) y \(F_{1-\alpha/2, n_A-1, n_B-1}\) son los valores críticos de la distribución F.

    \(s_A^2\) y \(s_B^2\) son las varianzas muestrales.

    \(n_A-1\) y \(n_B-1\) son los grados de libertad.

    var_A <- var(datos_A$Ingresos)
    var_B <- var(datos_B$Ingresos)
    
    n_A <- nrow(datos_A)
    n_B <- nrow(datos_B)
    
    
    F_stat <- var_A / var_B
    
    
    F_inf <- qf(0.975, df1 = n_A-1, df2 = n_B-1)  
    F_sup <- qf(0.025, df1 = n_A-1, df2 = n_B-1)  
    
    
    IC_F <- c(F_stat / F_inf, F_stat * F_sup)
    
    
    
    cat("Varianza muestral en Ciudad A:", round(var_A, 4), "\n")
    ## Varianza muestral en Ciudad A: 324.9189
    cat("Varianza muestral en Ciudad B:", round(var_B, 4), "\n")
    ## Varianza muestral en Ciudad B: 373.6803
    cat("Razón de varianzas (Ciudad A / Ciudad B):", round(F_stat, 4), "\n")
    ## Razón de varianzas (Ciudad A / Ciudad B): 0.8695
    cat("Intervalo de confianza (95%):", round(IC_F[1], 4), "a", round(IC_F[2], 4), "\n")
    ## Intervalo de confianza (95%): 0.4934 a 0.4934