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)
##
## Attaching package: '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)
##
## Attaching package: '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.1 ✔ readr 2.2.0
## ✔ ggplot2 4.0.3 ✔ stringr 1.6.0
## ✔ lubridate 1.9.5 ✔ tibble 3.3.1
## ✔ purrr 1.2.2 ✔ tidyr 1.3.2
## ── 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 per session.
## 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)
## Loading required package: scales
##
## Attaching package: '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)
##
## Attaching package: '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)
## Loading required package: viridisLite
##
## Attaching package: '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
## N.unique : 7 1st Qu.: 26682 1st Qu.:29.00 1st Qu.:26.04
## N.blank : 0 Median : 29390 Median :35.00 Median :30.07
## Min.nchar: 3 Mean : 31846 Mean :33.54 Mean :30.74
## Max.nchar: 12 3rd Qu.: 32751 3rd Qu.:38.00 3rd Qu.:34.10
## NAs : 1 Max. :430091 Max. :40.00 Max. :40.00
## NAs :5 NAs :2
## CE
## Min. : 0.0
## 1st Qu.:239.4
## Median :250.3
## Mean :249.6
## 3rd Qu.:261.7
## Max. :296.5
## NAs :3
summary(DATOS$PI)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## 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. NAs
## 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 NAs
## 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))
## Loading required package: Amelia
## Loading required package: Rcpp
## ##
## ## Amelia II: Multiple Imputation
## ## (Version 1.8.3, built: 2024-11-07)
## ## Copyright (C) 2005-2026 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
## N.unique : 4 1st Qu.: 26682 1st Qu.:29.00 1st Qu.:26.04
## N.blank : 0 Median : 29390 Median :35.00 Median :30.07
## Min.nchar: 3 Mean : 31846 Mean :33.54 Mean :30.74
## Max.nchar: 11 3rd Qu.: 32751 3rd Qu.:38.00 3rd Qu.:34.10
## NAs : 1 Max. :430091 Max. :40.00 Max. :40.00
## NAs :5 NAs :2
## CE
## Min. : 0.0
## 1st Qu.:239.4
## Median :250.3
## Mean :249.6
## 3rd Qu.:261.7
## Max. :296.5
## NAs :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
## N.unique : 4 1st Qu.:26710 1st Qu.:29.00 1st Qu.:26.04
## N.blank : 0 Median :29519 Median :35.00 Median :30.22
## Min.nchar: 3 Mean :29519 Mean :33.54 Mean :30.74
## Max.nchar: 11 3rd Qu.:32459 3rd Qu.:38.00 3rd Qu.:34.07
## NAs : 1 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.
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 N.unique : 3 1st Qu.: 3.00
## Median : 50.50 Median :44.50 N.blank : 0 Median : 5.50
## Mean : 50.50 Mean :42.31 Min.nchar: 8 Mean : 5.38
## 3rd Qu.: 75.25 3rd Qu.:54.25 Max.nchar: 10 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
## N.unique : 2 1st Qu.: 3.00
## N.blank : 0 Median : 5.00
## Min.nchar: 2 Mean : 4.93
## Max.nchar: 2 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.
Como actividad de cierre del primer corte, deberán realizar en grupos de 3 integrantes un análisis descriptivo de una base de datos relacionada con las áreas de Economía, Administración o Negocios.
Las bases de datos y el archivo de Excel con las orientaciones, el contexto, la pregunta problema, el diccionario de variables y las preguntas que deben resolver se encuentran disponibles en el siguiente repositorio:
https://github.com/Kalbam/Data_Est_I
Cada grupo deberá seleccionar una base de datos que le sea asignada. Todas las bases contienen 200 observaciones y cinco variables de distinta naturaleza:
Importante: El trabajo no debe limitarse a presentar código, cálculos o gráficos. Cada resultado debe estar acompañado de una interpretación relacionada con el contexto de la base de datos.
Por ejemplo, después de elaborar un gráfico deberán explicar:
En el repositorio encontrarán:
.csv correspondientes a las doce
bases de datos;Cuadro_Orientaciones_Act_bases_Corte_I.xlsx,
que contiene:
\[ \boxed{ \text{Contexto} \rightarrow \text{Datos} \rightarrow \text{Variables} \rightarrow \text{Análisis descriptivo} \rightarrow \text{Gráficos} \rightarrow \text{Interpretación} \rightarrow \text{Conclusión} } \]
Organicen el documento en R Markdown utilizando, como mínimo, las siguientes secciones:
Describan brevemente el caso asignado y presenten la pregunta que orientará el análisis.
Identifiquen claramente estos tres elementos.
Presenten y clasifiquen cada variable según su naturaleza.
Incluyan las medidas estadísticas que sean pertinentes para cada variable.
Construyan tablas de frecuencias y representaciones gráficas apropiadas.
Identifiquen y analicen posibles observaciones atípicas cuando corresponda.
Realicen comparaciones cuando el contexto de la base lo permita.
Utilicen los resultados obtenidos para responder de manera argumentada.
Presenten una conclusión sustentada en la evidencia estadística obtenida durante el análisis.
Recuerden: una gráfica o una tabla sin interpretación está incompleta. El objetivo es utilizar la estadística para describir, comparar, interpretar y sustentar decisiones.
Una variable aleatoria discreta toma valores aislados o contables.
Por ejemplo:
\[ X=\text{número de compras realizadas por un cliente} \]
podría tomar los valores:
\[ X=0,1,2,3,\ldots \]
Otros ejemplos son:
Una distribución de probabilidad asigna una probabilidad a cada posible valor de \(X\).
Debe cumplirse:
\[ P(X=x)\geq0 \]
y:
\[ \sum_x P(X=x)=1 \]
Supongamos que el número de compras semanales de un cliente tiene la siguiente distribución:
x <- c(0, 1, 2, 3)
prob <- c(
0.20,
0.45,
0.25,
0.10
)
distribucion <- data.frame(
Compras = x,
Probabilidad = prob
)
distribucion
Comprobamos:
sum(prob)
## [1] 1
barplot(
prob,
names.arg = x,
main = "Distribución del número de compras",
xlab = "Número de compras",
ylab = "Probabilidad"
)
Probabilidad de exactamente una compra:
prob[x == 1]
## [1] 0.45
Probabilidad de máximo una compra:
sum(prob[x <= 1])
## [1] 0.65
Probabilidad de dos o más compras:
sum(prob[x >= 2])
## [1] 0.35
El valor esperado de una variable aleatoria discreta es:
\[ E(X)=\sum_x xP(X=x) \]
En R:
EX <- sum(x * prob)
EX
## [1] 1.25
El valor esperado representa el comportamiento promedio de la variable a largo plazo.
La varianza se puede calcular como:
\[ Var(X)=E(X^2)-[E(X)]^2 \]
Primero:
EX2 <- sum(x^2 * prob)
EX2
## [1] 2.35
Luego:
varX <- EX2 - EX^2
varX
## [1] 0.7875
Desviación estándar:
sdX <- sqrt(varX)
sdX
## [1] 0.887412
Un banco registra si un cliente entra o no en mora.
Definimos:
\[ X= \begin{cases} 1, & \text{entra en mora},\\ 0, & \text{no entra en mora}. \end{cases} \]
Supongamos:
\[ p=0.12 \]
Entonces:
\[ X\sim Bernoulli(0.12) \]
mora <- rbinom(
n = 500,
size = 1,
prob = 0.12
)
head(mora)
## [1] 0 0 0 1 1 0
table(mora)
## mora
## 0 1
## 444 56
prop.table(
table(mora)
)
## mora
## 0 1
## 0.888 0.112
barplot(
prop.table(table(mora)),
names.arg = c("No mora", "Mora"),
main = "Estado de mora de los clientes",
xlab = "Estado",
ylab = "Proporción"
)
Para una Bernoulli:
\[ E(X)=p \]
\[ Var(X)=p(1-p) \]
p <- 0.12
media_bernoulli <- p
var_bernoulli <- p * (1 - p)
media_bernoulli
## [1] 0.12
var_bernoulli
## [1] 0.1056
Una empresa envía una promoción a 20 clientes.
La probabilidad de compra es:
\[ p=0.30 \]
Definimos:
\[ X=\text{número de clientes que compran} \]
Entonces:
\[ X\sim Binomial(20,0.30) \]
dbinom(
x = 6,
size = 20,
prob = 0.30
)
## [1] 0.191639
Esto calcula:
\[ P(X=6) \]
pbinom(
q = 6,
size = 20,
prob = 0.30
)
## [1] 0.6080098
Es decir:
\[ P(X\leq6) \]
1 - pbinom(
q = 6,
size = 20,
prob = 0.30
)
## [1] 0.3919902
Es decir:
\[ P(X>6) \]
x_bin <- 0:20
prob_bin <- dbinom(
x_bin,
size = 20,
prob = 0.30
)
plot(
x_bin,
prob_bin,
type = "h",
lwd = 5,
main = "Distribución Binomial",
xlab = "Número de compradores",
ylab = "Probabilidad"
)
points(
x_bin,
prob_bin,
pch = 19
)
\[ E(X)=np \]
\[ Var(X)=np(1-p) \]
n <- 20
p <- 0.30
media_bin <- n * p
var_bin <- n * p * (1 - p)
media_bin
## [1] 6
var_bin
## [1] 4.2
Un vendedor tiene una probabilidad:
\[ p=0.20 \]
de cerrar una venta en cada llamada.
Definimos:
\[ X=\text{número de llamadas hasta conseguir la primera venta} \]
Matemáticamente:
\[ P(X=4) = (1-p)^3p \]
En R, dgeom() cuenta el número de fracasos antes del
primer éxito.
Por eso:
dgeom(
x = 3,
prob = 0.20
)
## [1] 0.1024
Esto corresponde a que hubo 3 fracasos y luego ocurrió el primer éxito.
(1 - 0.20)^3 * 0.20
## [1] 0.1024
llamadas <- 1:15
prob_geo <- dgeom(
llamadas - 1,
prob = 0.20
)
plot(
llamadas,
prob_geo,
type = "h",
lwd = 5,
main = "Llamadas hasta la primera venta",
xlab = "Número de llamada",
ylab = "Probabilidad"
)
points(
llamadas,
prob_geo,
pch = 19
)
Si \(X\) es el número de ensayos hasta el primer éxito:
\[ E(X)=\frac{1}{p} \]
1 / 0.20
## [1] 5
Interpretación:
En promedio se requieren aproximadamente 5 llamadas para obtener la primera venta.
Supongamos que la probabilidad de cerrar una venta es:
\[ p=0.30 \]
Ahora interesa obtener:
\[ r=3 \]
ventas.
Definimos:
\[ X=\text{número de llamadas hasta alcanzar la tercera venta} \]
Queremos:
\[ P(X=6) \]
\[ P(X=6)= \binom{5}{2} (0.30)^3 (0.70)^3 \]
choose(5, 2) *
(0.30)^3 *
(0.70)^3
## [1] 0.09261
dnbinom() cuenta el número de fracasos antes de alcanzar
los éxitos requeridos.
Si la tercera venta ocurre en la sexta llamada:
\[ 6-3=3 \]
fracasos.
dnbinom(
x = 3,
size = 3,
prob = 0.30
)
## [1] 0.09261
La distribución Geométrica responde:
¿Cuántos ensayos se requieren hasta el primer éxito?
Mientras que la Binomial negativa responde:
¿Cuántos ensayos se requieren hasta alcanzar varios éxitos?
\[ \boxed{ \text{Geométrica} \Rightarrow r=1 } \]
\[ \boxed{ \text{Binomial negativa} \Rightarrow r>1 } \]
Una empresa posee:
\[ N=100 \]
facturas.
De ellas:
\[ K=15 \]
presentan errores.
Se seleccionan:
\[ n=10 \]
facturas sin reemplazo.
Definimos:
\[ X=\text{número de facturas con errores en la muestra} \]
La distribución adecuada es:
\[ \boxed{\text{Hipergeométrica}} \]
porque la selección se realiza sin reemplazo.
dhyper(
x = 2,
m = 15,
n = 85,
k = 10
)
## [1] 0.2919112
En R:
m = elementos considerados éxito;n = elementos que no son éxito;k = tamaño de la muestra;x = número de éxitos encontrados.phyper(
q = 2,
m = 15,
n = 85,
k = 10
)
## [1] 0.8294603
1 - phyper(
q = 2,
m = 15,
n = 85,
k = 10
)
## [1] 0.1705397
x_hiper <- 0:10
prob_hiper <- dhyper(
x_hiper,
m = 15,
n = 85,
k = 10
)
plot(
x_hiper,
prob_hiper,
type = "h",
lwd = 5,
main = "Facturas con errores",
xlab = "Número de facturas con errores",
ylab = "Probabilidad"
)
points(
x_hiper,
prob_hiper,
pch = 19
)
Se usa cuando:
\[ X\sim Binomial(n,p) \]
Se usa cuando:
Una empresa recibe en promedio:
\[ \lambda=4 \]
reclamos por día.
Definimos:
\[ X=\text{número de reclamos recibidos en un día} \]
Entonces:
\[ X\sim Poisson(4) \]
dpois(
x = 3,
lambda = 4
)
## [1] 0.1953668
ppois(
q = 3,
lambda = 4
)
## [1] 0.4334701
1 - ppois(
q = 6,
lambda = 4
)
## [1] 0.110674
x_pois <- 0:15
prob_pois <- dpois(
x_pois,
lambda = 4
)
plot(
x_pois,
prob_pois,
type = "h",
lwd = 5,
main = "Número de reclamos diarios",
xlab = "Número de reclamos",
ylab = "Probabilidad"
)
points(
x_pois,
prob_pois,
pch = 19
)
Para una distribución Poisson:
\[ E(X)=\lambda \]
\[ Var(X)=\lambda \]
lambda <- 4
media_pois <- lambda
var_pois <- lambda
media_pois
## [1] 4
var_pois
## [1] 4
| Distribución | Pregunta principal | Ejemplo |
|---|---|---|
| Bernoulli | ¿Ocurre o no ocurre? | Mora / no mora |
| Binomial | ¿Cuántos éxitos en \(n\) ensayos? | Compradores entre 20 clientes |
| Geométrica | ¿Cuántos ensayos hasta el primer éxito? | Llamadas hasta primera venta |
| Binomial negativa | ¿Cuántos ensayos hasta \(r\) éxitos? | Llamadas hasta tercera venta |
| Hipergeométrica | ¿Cuántos éxitos al muestrear sin reemplazo? | Facturas con errores |
| Poisson | ¿Cuántos eventos ocurren en un intervalo? | Reclamos diarios |
R utiliza una estructura común para las distribuciones.
| Prefijo | Significado |
|---|---|
d |
Probabilidad puntual |
p |
Probabilidad acumulada |
q |
Cuantil |
r |
Simulación |
dbinom(3, size = 10, prob = 0.30)
## [1] 0.2668279
pbinom(3, size = 10, prob = 0.30)
## [1] 0.6496107
qbinom(0.90, size = 10, prob = 0.30)
## [1] 5
rbinom(10, size = 10, prob = 0.30)
## [1] 4 3 4 4 0 3 3 4 4 4
dpois(3, lambda = 4)
## [1] 0.1953668
ppois(3, lambda = 4)
## [1] 0.4334701
qpois(0.90, lambda = 4)
## [1] 7
rpois(10, lambda = 4)
## [1] 4 4 1 8 4 4 5 2 2 7
dgeom(3, prob = 0.20)
## [1] 0.1024
pgeom(3, prob = 0.20)
## [1] 0.5904
qgeom(0.90, prob = 0.20)
## [1] 10
rgeom(10, prob = 0.20)
## [1] 0 13 0 1 0 5 1 1 10 1
dnbinom(3, size = 3, prob = 0.30)
## [1] 0.09261
pnbinom(3, size = 3, prob = 0.30)
## [1] 0.25569
qnbinom(0.90, size = 3, prob = 0.30)
## [1] 13
rnbinom(10, size = 3, prob = 0.30)
## [1] 15 3 15 9 3 5 1 6 7 4
dhyper(2, m = 15, n = 85, k = 10)
## [1] 0.2919112
phyper(2, m = 15, n = 85, k = 10)
## [1] 0.8294603
qhyper(0.90, m = 15, n = 85, k = 10)
## [1] 3
rhyper(10, m = 15, n = 85, k = 10)
## [1] 2 2 1 2 1 3 2 0 4 0
Antes de utilizar R, responda:
¿Existe solamente éxito o fracaso?
\[ \Rightarrow \boxed{\text{Bernoulli}} \]
¿Se cuentan éxitos en un número fijo de ensayos?
\[ \Rightarrow \boxed{\text{Binomial}} \]
¿Se cuentan ensayos hasta el primer éxito?
\[ \Rightarrow \boxed{\text{Geométrica}} \]
¿Se cuentan ensayos hasta alcanzar varios éxitos?
\[ \Rightarrow \boxed{\text{Binomial negativa}} \]
¿Se selecciona sin reemplazo de una población finita?
\[ \Rightarrow \boxed{\text{Hipergeométrica}} \]
¿Se cuenta el número de eventos en un intervalo?
\[ \Rightarrow \boxed{\text{Poisson}} \]
Supongamos que una empresa registra el número de reclamos diarios durante 30 días.
reclamos <- c(
4,5,3,6,4,7,2,5,4,6,
3,5,7,4,5,6,2,4,5,3,
8,4,6,5,3,4,7,5,4,6
)
\[ X=\text{número de reclamos recibidos diariamente} \]
Es una variable:
\[ \boxed{\text{cuantitativa discreta}} \]
porque representa un conteo.
summary(reclamos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.000 4.000 5.000 4.733 6.000 8.000
mean(reclamos)
## [1] 4.733333
var(reclamos)
## [1] 2.271264
table(reclamos)
## reclamos
## 2 3 4 5 6 7 8
## 2 4 8 7 5 3 1
barplot(
table(reclamos),
main = "Número de reclamos diarios",
xlab = "Número de reclamos",
ylab = "Número de días"
)
Como se cuentan eventos que ocurren durante un intervalo fijo de tiempo:
\[ \boxed{\text{Poisson}} \]
lambda <- mean(reclamos)
lambda
## [1] 4.733333
La empresa considera crítico recibir:
\[ 8\text{ o más reclamos} \]
Queremos:
\[ P(X\geq8) \]
prob_critica <- 1 - ppois(
7,
lambda = lambda
)
prob_critica
## [1] 0.1070411
En porcentaje:
prob_critica * 100
## [1] 10.70411
x <- 0:15
prob_teorica <- dpois(
x,
lambda = lambda
)
data.frame(
Reclamos = x,
Probabilidad = prob_teorica
)
plot(
x,
prob_teorica,
type = "h",
lwd = 5,
main = "Modelo Poisson del número de reclamos",
xlab = "Número de reclamos",
ylab = "Probabilidad"
)
points(
x,
prob_teorica,
pch = 19
)
El resultado de:
\[ P(X\geq8) \]
representa la probabilidad de que en un día se reciban al menos 8 reclamos.
Esta información puede apoyar decisiones relacionadas con:
Trabajo en grupos de 3 integrantes.
Cada grupo trabajará con uno de los casos propuestos en las áreas de Economía, Administración, Finanzas o Negocios, aplicando la metodología desarrollada durante la clase.
La ruta de trabajo será:
\[ \boxed{ \text{Contexto} \rightarrow \text{Datos} \rightarrow \text{Variable aleatoria} \rightarrow \text{Distribución} \rightarrow \text{Parámetros} \rightarrow \text{Probabilidades} \rightarrow \text{Gráfica} \rightarrow \text{Interpretación} \rightarrow \text{Decisión} } \]
Para el caso asignado, cada grupo deberá:
Importante: No es suficiente presentar código o resultados numéricos.
Cada probabilidad, tabla o gráfica debe ir acompañada de una interpretación estadística y contextual.
Un banco analiza el comportamiento histórico de 50 clientes.
La variable mora toma los valores:
\[ 1=\text{cliente en mora}, \qquad 0=\text{cliente sin mora} \]
mora <- c(
0,0,0,1,0,0,0,0,1,0,
0,0,1,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,0,0,
1,0,0,0,0,0,0,1,0,0,
0,0,1,0,0,0,0,0,1,0
)
Una nueva cartera estará formada por:
\[ n=20 \]
clientes.
\[ P(X=4) \]
\[ P(X\leq4) \]
\[ P(X\geq5) \]
Una empresa registró durante 40 días el número de empleados ausentes:
ausentes <- c(
2,3,1,4,2,3,2,5,1,3,
2,4,3,2,1,5,3,2,4,2,
3,1,2,4,3,2,5,2,3,1,
4,2,3,2,1,3,4,2,3,2
)
mean(ausentes)
## [1] 2.65
var(ausentes)
## [1] 1.310256
\[ P(X\geq5) \]
Una empresa registra si los clientes que reciben una promoción realizan una compra.
\[ 1=\text{compra}, \qquad 0=\text{no compra} \]
compra <- c(
0,1,0,0,1,0,1,0,0,1,
0,0,1,0,1,0,0,0,1,0,
1,0,0,1,0,0,1,0,1,0,
0,1,0,0,0,1,0,1,0,0,
1,0,0,1,0,0,0,1,0,0,
1,0,1,0,0,1,0,0,1,0
)
La próxima campaña se enviará a:
\[ n=30 \]
clientes.
\[ P(X=10) \]
\[ P(X\geq10) \]
\[ P(X<8) \]
\[ E(X) \qquad\text{y}\qquad Var(X) \]
Una entidad registra el número de nuevas empresas creadas diariamente:
empresas <- c(
5,7,4,6,8,5,6,7,3,6,
5,8,6,4,7,5,6,9,4,6,
7,5,8,6,4,5,7,6,5,8,
6,4,7,5,6,8,5,7,4,6
)
\[ P(X=6) \]
\[ P(X\leq6) \]
\[ P(X\geq9) \]
Un asesor comercial registra los resultados de distintas llamadas:
\[ 1=\text{venta}, \qquad 0=\text{no venta} \]
ventas <- c(
0,0,1,0,0,0,1,0,1,0,
0,1,0,0,0,1,0,0,1,0,
0,0,1,0,1,0,0,0,1,0,
1,0,0,0,1,0,0,1,0,0
)
Defina:
\[ X=\text{número de llamadas hasta conseguir la primera venta} \]
\[ E(X) \]
Utilice los mismos datos del caso anterior:
ventas <- c(
0,0,1,0,0,0,1,0,1,0,
0,1,0,0,0,1,0,0,1,0,
0,0,1,0,1,0,0,0,1,0,
1,0,0,0,1,0,0,1,0,0
)
Defina:
\[ X=\text{número de llamadas hasta obtener la tercera venta} \]
Una empresa posee:
\[ N=100 \]
facturas, de las cuales:
\[ K=15 \]
presentan errores.
Un auditor selecciona:
\[ n=10 \]
facturas sin reemplazo.
Defina:
\[ X=\text{número de facturas con errores en la muestra} \]
\[ P(X=2) \]
\[ P(X\leq2) \]
\[ P(X\geq3) \]
Una planta posee un lote de:
\[ N=80 \]
productos, de los cuales:
\[ K=12 \]
son defectuosos.
Se seleccionan:
\[ n=8 \]
productos sin reemplazo.
Defina:
\[ X=\text{número de productos defectuosos en la muestra} \]
\[ P(X=0) \]
\[ P(X=1) \]
\[ P(X\geq2) \]
Cada grupo deberá presentar su trabajo en R Markdown incluyendo:
No escriba únicamente:
La probabilidad es 0.15.
Explique el resultado en contexto, por ejemplo:
Existe aproximadamente un 15 % de probabilidad de que ocurra el evento analizado. Esto indica que…
La finalidad del taller es utilizar R para transformar:
\[ \boxed{ \text{Datos} \rightarrow \text{Modelo probabilístico} \rightarrow \text{Interpretación} \rightarrow \text{Decisión} } \]