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
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.
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.
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/
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 |
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
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
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")
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.
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.
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.
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 |
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) |
|
| 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) |
|
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.
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
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.
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)
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
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.
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.
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")
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()
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
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")
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)
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()
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 %
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.
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
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.
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
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
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
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
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
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
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
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:
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")
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.
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
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
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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"
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
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"
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.
¿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
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:
La gerencia quiere responder a las siguientes preguntas mediante el uso de distribuciones muestrales.
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):
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\).
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).
\[ \hat p \;\sim\; \mathcal{N}\!\big(0.33,\; 0.0579^2\big). \]
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\).
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.
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.
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.
Seleccione una variable numérica continua relevante (p. ej., precio, puntuación, horas, ventas).
Estime con todos los datos:
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{).} \]
Plantee la distribución muestral: \[ \bar X \approx \mathcal{N}\!\big(\hat\mu,\; SE_{\bar X}^2\big). \]
Responda dos probabilidades (elijan umbrales propios del contexto):
Interprete en lenguaje simple: ¿es probable observar esos promedios con \(n\) casos? ¿Qué implicaría para la gestión?
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
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
4. Se extrajeron dos muestras aleatorias independientes de estudiantes universitarios de estadística de sexo masculino y femenino.
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.
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
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.
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
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
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
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
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
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
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
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
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.
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.
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 |
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) |
|
| 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) |
|
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).
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.
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
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
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
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
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
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
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
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
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
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
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
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