This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
r## Including Plots
You can also embed plots, for example:
Note that the echo = FALSE
parameter was added to the
code c hunk to prevent printing of the R code that generated the
plot.
Laboratorio de Estadísticas Descriptivas y Visualización 1. Introducción y preparación
Este laboratorio tiene la intencion de reforzar los conocimientos que tiene el estudiante sobre la estadistica descriptiva, de modo que se exploraran y resumiran datos con las funciones de estadisticas descriptivas.
En primer lugar, las estadisticas descriptivas son aquellas herramientas que nos permiten resumir, organizar y presentar la información de una base de datos.
Se clasifican en medidas de tendencia central que resumen el valor tipico, las medidas de dispersion, que muestran la variacion de los datos, y medidas de forma que describen la distribuccion.
1.1 Preparar el entorno
instalo y cargo las librerias
# Cargar librerías
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.3
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.0.4
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(skimr)
## Warning: package 'skimr' was built under R version 4.4.3
1.2 Crear el dataset simulado
uso la semilla fija set.seed(1234) con tal de que todos tengamos la misma base y los datos sean similares.
# --- Reproducibilidad ---
set.seed(1234)
# --- Tamaño de muestra ---
n <- 200 # número de estudiantes
# --- Catálogos de categorías ---
programas <- c("Sociología","Antropología","Historia",
"Literatura","Comunicación","Filosofía")
ciudades <- c("Cali","Palmira","Jamundí","Yumbo")
generos <- c("Mujer","Hombre","No binario","Prefiero no decir")
# --- Generación de variables ---
datos <- tibble(
id = 1:n,
edad = pmin(pmax(round(rnorm(n, mean = 21, sd = 3)), 16), 45),
genero = sample(generos, n, replace = TRUE, prob = c(.56,.37,.04,.03)),
programa = sample(programas, n, replace = TRUE,
prob = c(.25,.15,.12,.18,.20,.10)),
semestre = sample(1:10, n, replace = TRUE,
prob = c(.12,.12,.12,.10,.10,.10,.09,.09,.08,.08)),
ciudad_residencia = sample(ciudades, n, replace = TRUE, prob = c(.7,.15,.1,.05)),
horas_cuidado = pmax(0, round(rnorm(n, mean = 12, sd = 8))),
horas_lectura = pmax(0, round(rnorm(n, mean = 6, sd = 4))),
bienestar = sample(1:10, n, replace = TRUE, prob = c(.02,.03,.05,.05,.1,.2,.2,.15,.12,.08))
)
Utilizare head(datos) para visualizar la base de datos
# Ver primeras filas
head(datos)
## # A tibble: 6 × 9
## id edad genero programa semestre ciudad_residencia horas_cuidado
## <int> <dbl> <chr> <chr> <int> <chr> <dbl>
## 1 1 17 Hombre Comunicación 2 Palmira 15
## 2 2 22 Mujer Sociología 10 Cali 17
## 3 3 24 Hombre Sociología 5 Cali 0
## 4 4 16 Hombre Literatura 1 Cali 18
## 5 5 22 Hombre Comunicación 1 Palmira 12
## 6 6 23 Mujer Comunicación 4 Cali 11
## # ℹ 2 more variables: horas_lectura <dbl>, bienestar <int>
Cada fila es un estudiante la variable edad muestra la edad de los estudiantes genero y programa son variables categoricas
eston son los datos que considero mas importantes de la manera de leer la salida
2 Explorar la estructura de los datos
Ejecuto un resumen de estrcutura
# Estructura de la base
str(datos)
## tibble [200 × 9] (S3: tbl_df/tbl/data.frame)
## $ id : int [1:200] 1 2 3 4 5 6 7 8 9 10 ...
## $ edad : num [1:200] 17 22 24 16 22 23 19 19 19 18 ...
## $ genero : chr [1:200] "Hombre" "Mujer" "Hombre" "Hombre" ...
## $ programa : chr [1:200] "Comunicación" "Sociología" "Sociología" "Literatura" ...
## $ semestre : int [1:200] 2 10 5 1 1 4 3 6 7 6 ...
## $ ciudad_residencia: chr [1:200] "Palmira" "Cali" "Cali" "Cali" ...
## $ horas_cuidado : num [1:200] 15 17 0 18 12 11 21 24 3 20 ...
## $ horas_lectura : num [1:200] 2 0 6 13 6 9 2 5 8 5 ...
## $ bienestar : int [1:200] 6 6 9 9 6 5 5 6 5 7 ...
Para leer esta salida, es importante tener en cuenta que: tibble [200 × 9] indica la cantidad de observaciones y columnas estas etiquetas; int: numero entero. num: numero decimal. chr: texto. Indican tipo de variable.
En el siguiente punto, identificare que variables son numericas y cuales categoricas.
# Dimensiones de la base
dim(datos)
## [1] 200 9
son la cantidad de observaciones (primer numero) y variables(segundo numero)
Resumen descriptivo rápido
Ejecutare skim(datos)
# Resumen descriptivo rápido
skim(datos)
Name | datos |
Number of rows | 200 |
Number of columns | 9 |
_______________________ | |
Column type frequency: | |
character | 3 |
numeric | 6 |
________________________ | |
Group variables | None |
Variable type: character
skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
---|---|---|---|---|---|---|---|
genero | 0 | 1 | 5 | 17 | 0 | 4 | 0 |
programa | 0 | 1 | 8 | 12 | 0 | 6 | 0 |
ciudad_residencia | 0 | 1 | 4 | 7 | 0 | 4 | 0 |
Variable type: numeric
skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
---|---|---|---|---|---|---|---|---|---|---|
id | 0 | 1 | 100.50 | 57.88 | 1 | 50.75 | 100.5 | 150.25 | 200 | ▇▇▇▇▇ |
edad | 0 | 1 | 20.89 | 2.94 | 16 | 19.00 | 20.0 | 23.00 | 30 | ▅▇▅▂▁ |
semestre | 0 | 1 | 5.04 | 2.80 | 1 | 3.00 | 5.0 | 7.25 | 10 | ▇▇▆▅▆ |
horas_cuidado | 0 | 1 | 11.88 | 7.18 | 0 | 7.00 | 11.0 | 16.25 | 34 | ▅▇▅▂▁ |
horas_lectura | 0 | 1 | 6.07 | 3.70 | 0 | 3.00 | 6.0 | 9.00 | 16 | ▇▇▇▃▂ |
bienestar | 0 | 1 | 6.75 | 1.96 | 1 | 6.00 | 7.0 | 8.00 | 10 | ▁▂▆▇▅ |
n_missing significa que no hay valores perdidos n_unique cuantas categorias distintas hay en variables numericas aparecen la media: el promedio, la desviacion estandar: mide la dispersion de los valores, los p miden los percentiles.
Según skim(), ¿qué variable tiene mayor variabilidad?
En este caso, es horas de cuidado que tiene “7.177532”. La desviacion estandar de id no cuenta al ser un identificador.
¿Qué porcentaje aproximado de estudiantes tiene menos de 5 horas de lectura semanal?
Segun la informacion que nos brinda el skim, el porcentaje de estudiantes que tienen menos de 5 horas de lecturas, es aproximadamente de alrededor del 40 porciento, esto debido a que este numero cae entre las 3 horas promedio del percentil 25 y las 6 horas del percentil 50
¿Cuál es la moda de la variable programa (el programa más frecuente)?
datos %>%
count(programa) %>%
arrange(desc(n))
## # A tibble: 6 × 2
## programa n
## <chr> <int>
## 1 Sociología 50
## 2 Literatura 42
## 3 Comunicación 37
## 4 Historia 29
## 5 Filosofía 23
## 6 Antropología 19
La moda de la variable programa es sociologia, utilice count para que contara cuantos estudiantes habia en cada programa y arrange para ordenarlos en fila
. ¿Por qué crees que es útil separar variables numéricas y categóricas desde el inicio?
debido a que nos permite analizar cada tipo de datos de manera diferente, por lo que requieren un tratamiento distinto, y a su vez, responder a preguntas diferentes que no se podrian responder si estan juntas ambas variables.
Aquellas que permiten resumir un conjunto de datos con un valor representativo.
media: promedio de los datos+ moda: dato que aparece con mayor frecuencia en un conjunto de datos mediana: dato central en un conjunto de datos ordenado de menor a mayor.
3.1 Cálculo de la media para sacar la media en R se utiliza la función mean(), y para referirse a una variable en una base de datos, es necesario “base$variable”
mean(datos$edad)
## [1] 20.885
mean(datos$horas_cuidado)
## [1] 11.875
mean(datos$horas_lectura)
## [1] 6.065
Para la interpretacion, se puede decir, la “variable” promedio, el promedio de la “variable” y en promedio “datos de la variable” con tal de que funcionen de cierto modo en relacion con los datos con los que se quiera comparar o analizar.
3.2 Cálculo de la mediana
Se utiliza la funcion Median() que organiza los datos y saca el valor central
median(datos$edad)
## [1] 20
median(datos$horas_cuidado)
## [1] 11
median(datos$horas_lectura)
## [1] 6
Para la interpretacion es similar a la media, las palabras claves varian dependiendo cual sea la variable de la que se obtuvo la media, ya sea la “variable” mediana es “resultado o la mediana de”variable” implica que, que da pasa al analisis donde se compara con lo que se quiera estudiar o lo que la investigacion lo requiera.
3.3 Cálculo de la moda
Se define una funcion para obtener la moda, utilizando “<- function(x) { ux <- unique(x) ux[which.max(tabulate(match(x, ux)))]”
moda <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
moda(datos$genero)
## [1] "Hombre"
moda(datos$programa)
## [1] "Sociología"
moda(datos$ciudad_residencia)
## [1] "Cali"
Para esta, las palabra claves con los que se interpreta es La o el “variable” mas frecuente es “resultado, mientras se compara con los demas datos con el fin de llegar a una conclusion o hacer un analisis.
3.4 Comparación entre media y mediana
mean(datos$horas_cuidado)
## [1] 11.875
median(datos$horas_cuidado)
## [1] 11
mean(datos$horas_lectura)
## [1] 6.065
median(datos$horas_lectura)
## [1] 6
Para esta, en la interpretacion se puede usar la media es “conclusion, ya sea mayor o menor” que la media, o decir que coinciden dependiendo el resultado
3.5 Preguntas de reflexión
utilizaria la media, ya que habitualmente las edades de los estudiantes suelen ser bastante simetricas y sin datos extremos, aunque si viera la presencia de datos extremos que pueden afectar a los resultados de la media, usaria la mediana.
es mas representativa debido a que los datos no son tan simetricos y existen datos extremos que pueden afectar al promedio que saque la media.
Nos demuestra que la muestra tiene a mas hombres que mujeres, ya que la moda es el dato que aparece con mayor frecuencia
Implicaria que la lectura no esta normalizada en nuestra cultura y que es necesario fomentarla mas, ya que es uno de los medios de aprendizaje mas importantes.
La media recortada elimina un porcentaje de los
valores más extremos (superiores e inferiores) antes de calcular el
promedio.
Esto la hace menos sensible a valores atípicos.
Es basicamente una media que trata de solucionar el problema de los valores atipicos
En R se usa el argumento trim
dentro de
mean()
.
# Media recortada al 10% (elimina 10% de valores bajos y altos)
mean(datos$horas_cuidado, trim = 0.1)
## [1] 11.60625
# Media recortada al 20% para horas de lectura
mean(datos$horas_lectura, trim = 0.2)
## [1] 5.983333
En la interpretacion, se puede comparar el resultado de la media recortada con el de la media, para asi encontrar que tanta es la diferencia que causan en la media los valores atipicos.
La media ponderada es un promedio en el que cada
valor no tiene la misma importancia, sino que se le asigna un
peso.
Esto es útil cuando:
En R se usa la función weighted.mean(x, w)
, donde:
- x
= variable numérica sobre la que se calcula la
media.
- w
= vector de pesos que asigna la importancia relativa de
cada observación.
Cada valor tiene un peso diferente, es lo principal de la media ponderada
weighted.mean(datos$horas_cuidado, w = datos$semestre)
## [1] 11.84821
En este caso, pondero las horas de cuidado, con los datos del semestre para asi tener en cuenta que los resultados no van a ser iguales en un estudiante de primer semestre y uno de decimo semestre.
weighted.mean(datos$horas_lectura, w = datos$edad)
## [1] 5.971511
En este caso, se pondero las horas de lectura por edad, de manera que la cantidad de horas que le invierte un estudiante a la lectura, pese mas que las de un estudiante menor.
De hecho, por los resultados, parece indicar que los estudiantes mayores leen mas que los menores, debido a qeu la media ponderada es algo mayor que la media, esta es la principal forma de analisis de la ponderada, compararla con la media.
Esta media es util para encuestas, educacion, economia e investigacion social.
3.8 Visualización de medidas de tendencia central
ademas de calcular los valores numericos, tambien es importante conocer la forma de vizualizarlos y ver como se ubican.
para lo que esta un Un histograma con líneas de media y mediana. Un boxplot que resalta la mediana. Un gráfico de barras para mostrar la moda en variables categóricas.
3.8.1 Histograma con la media y la mediana
este nos permite ver como se distrubuye una variable numerica
# Histograma de horas de cuidado con líneas de media y mediana
library(tidyverse)
library(skimr)
ggplot(datos, aes(x = horas_cuidado)) +
geom_histogram(binwidth = 2, fill = "lightblue", color = "black") +
geom_vline(aes(xintercept = mean(horas_cuidado)),
color = "red", linetype = "dashed", linewidth = 1) +
geom_vline(aes(xintercept = median(horas_cuidado)),
color = "blue", linetype = "dotted", linewidth = 1) +
labs(title = "Distribución de horas de cuidado",
subtitle = "Línea roja = media | Línea azul = mediana",
x = "Horas semanales de cuidado",
y = "Número de estudiantes")
Construimos el histograma usando “geom_histogram(binwidth = 2)” que divide las horas de cuidado en intervalos de 2 horas y cuenta cuántos estudiantes caen en cada intervalo, a su vez, usamos “geom_vline(… mean(…))” que agrega una linea vertical en el valor de la media, tambien “geom_vline(… median(…))” que hace lo mismo que el anterior pero con la mediana y labs que agraga subtitulo, titulo y etiquetas a los ejes
Para la interpretacion, ubicamos la lineas y las comparamos con los demas datos de la grafica.
3.8.2 Boxplot con la mediana
tambien llamado diagrama de caja muestra los cuartiles de una variable numérica, además de resaltar claramente la mediana.
# Boxplot de horas de lectura recreativa
ggplot(datos, aes(y = horas_lectura)) +
geom_boxplot(fill = "lightgreen", alpha = 0.6) +
labs(title = "Distribución de horas de lectura recreativa",
y = "Horas semanales")
Para construir este diagrama usamos(y = horas_lectura) que queremos graficar la variable en el eje vertical y geom_boxplot() que crea la caja y los bigotes.
Estos son los componentes y sus significados
La línea en el centro de la caja = mediana. Los bordes de la caja = cuartil inferior (25%) y cuartil superior (75%). Los “bigotes” muestran valores cercanos a los extremos. Los puntos fuera de los bigotes serían valores atípicos (outliers).
3.8.3 Gráfico de barras para la moda
La moda en variables categoricas se representa facilmente en un diagrama de barras
# Gráfico de barras para género
library(tidyverse)
library(skimr)
ggplot(datos, aes(x = genero)) +
geom_bar(fill = "orange", color = "black") +
labs(title = "Distribución de género en la muestra",
x = "Género",
y = "Número de estudiantes")
El grafico se interpreta usualmente con la “categoria mas frecuente” variando segun los datos.
A su vez, la forma en la que se construye es con “aes(x = genero) → usamos la variable categórica genero en el eje horizontal. geom_bar() → cuenta cuántas veces aparece cada categoría y dibuja barras proporcionales a esas frecuencias. fill y color → dan color a las barras y los bordes.”
3.8.4 Reflexión con apoyo visual
Si la distribución es simétrica, las líneas de media y mediana coinciden; si es asimétrica, la media se desplaza hacia la cola más larga.
Que el El boxplot muestra no solo la mediana, sino también la dispersión, los cuartiles y posibles valores atípicos.
debido a que permite visualizar de inmediato qué categoría es más frecuente y comparar magnitudes entre todas las categorías.
podria usar semestre (como histograma o boxplot), horas_cuidado (boxplot para ver atípicos), o programa y ciudad_residencia (gráfico de barras).
Medidas de dispersión
Muestran que tanto varian los datos
Estan: Rango, desviación media absoluta, Varianza, desviación estándar, coeficiente de variación, rango intercuartílico (IQR)
Rango es la diferencia entre valor minimo y valor maximo.
# Rango de horas de cuidado
min_cuidado <- min(datos$horas_cuidado)
max_cuidado <- max(datos$horas_cuidado)
rango_cuidado <- max_cuidado - min_cuidado
Interpretacion: Si el valor minimo es 0 horas y el valor maximo es 34 horas, el rango es de 34 horas.
Esta compuesto por:
min(datos\(horas_cuidado) valor minimo observado min(datos\)horas_cuidado) valor maximo observado
Se interpreta usando la diferencia entre ambos valores, mencionando tanto al valor minimo como al maximo.
min_cuidado; max_cuidado; rango_cuidado.
Existen mas medidas de dispersion que las mencionadas anteriormente, estas son: Desviación media absoluta (MAD) Varianza (explicada con más detalle) con las que podremos entender la variabilidad de los datos.
4.2 Desviación media absoluta (DMA o MAD)
Esta medida mide el promedio de las distancias absolutas entre cada dato y la media.
# Desviación media absoluta de horas de lectura
mad_lectura <- mean(abs(datos$horas_lectura - mean(datos$horas_lectura)))
mad_lectura
## [1] 2.9828
Esto se lee restando cada valor a la media, tomando el valor absoluto sin los signos negativos y promediando cada distancia.
Para interpretacion usamos algo similar a: si la de horas de lectura es de 6.06, y la MAD es 2.9, significa que en promedio, cada estudiante se aleja 2.9 horas de la media. Es decir, utilizamos un si la media y la comparamos con la MAD para luego decir en promedio cuanto el resultado de la MAD se aleja de la media.
4.3 Varianza
Esta medida de dispersion mide cuanto se alejan los valores en promedio respecto a la media, con la diferencia de que lo hace con medidas cuadradas.
# Varianza de horas de lectura
var_lectura <- var(datos$horas_lectura)
var_lectura
## [1] 13.70932
La funcion “ver()” es aquella que calcula la varianza.
Si la media de horas de lectura es 6.06 y la varianza resulta ser 13.7, eso significa que, en promedio, las diferencias respecto a la media son “grandes” y presentan alta dispersion.
4.4 Desviación estándar (DE)
DE es la raiz cuadrada de la varianza y esta en las mismas unidades que la variable.
# Desviación estándar de horas de lectura
sd_lectura <- sd(datos$horas_lectura)
sd_lectura
## [1] 3.70261
En la interpretacion: se suma y se resta los resultados respecto a la media y se saca una conclusion, en este caso: La mayoria de estudiantes leen entre 2.36 y 9.77 hpras.
Ejemplo: El promedio de horas de lectura está alrededor de 6 horas por semana, pero los estudiantes no leen todos la misma cantidad. De hecho, La mayoria de estudiantes leen entre 2.36 y 9.77 horas.
4.5 Coeficiente de variación (CV)
Estandariza la dispersion dividiendo la desviacion estandar entre la media, es util para comparar variables con medidas diferentes.
# Coeficiente de variación de horas de cuidado
cv_cuidado <- sd(datos$horas_cuidado) / mean(datos$horas_cuidado)
cv_cuidado
## [1] 0.6044237
Digamos que el CV es 0.60 (60%)
Eso significa que la dispersion equivale al 60% de la media.
Esto nos indica que el cuidado es desigualmente distribuido, algunos cuidan bastante mientras que otros cuidan poco.
4.6 Rango intercuartílico (IQR)
Mide el rango en el que se encuentran el 50% central de los datos.
# IQR de horas de lectura
iqr_lectura <- IQR(datos$horas_lectura)
summary(datos$horas_lectura) # Para ver los cuartiles
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.000 6.000 6.065 9.000 16.000
iqr_lectura
## [1] 6
Si el Q1 = 3 horas y el Q3 = 9 horas, entonces el IQR es de 6 horas. Lo que indica que el 50% de los estudiantes miden entre 3 y 9 horas semanales. Este metodo es util ya que no lo afectan valores externos.
4.7 Comparación rápida de medidas
Lo dejo igual ya que lo considero una sintesis apropiada de las medidas de dispersion.
Rango: diferencia entre máximo y mínimo, pero muy sensible a casos extremos. MAD: distancia promedio simple a la media, más robusta y fácil de interpretar. Varianza: usa el cuadrado de las diferencias, resalta la influencia de valores alejados. Desviación estándar: raíz de la varianza, se interpreta en las mismas unidades que los datos. Coeficiente de variación (CV): dispersión relativa a la media, útil para comparar variables distintas. IQR: dispersión del 50% central, robusta a valores extremos.
4.8 Visualización de las medidas de dispersión
Es necesario debido a que nos permite ver rapidamente la variabilidad de los datos sin depender de numeros.
Para esto, existen 3 tipos de graficos:
Histograma con la media y la desviación estándar Boxplot (diagrama de caja) Gráfico de violín
4.8.1 Histograma con media y desviación estándar
Muestra la distribuccion de una variable
# Histograma con media y desviación estándar
library(ggplot2)
media_lectura <- mean(datos$horas_lectura)
sd_lectura <- sd(datos$horas_lectura)
ggplot(datos, aes(x = horas_lectura)) +
geom_histogram(binwidth = 2, fill = "skyblue", color = "black") +
geom_vline(xintercept = media_lectura, color = "red", linetype = "solid", size = 1) +
geom_vline(xintercept = media_lectura + sd_lectura, color = "darkgreen", linetype = "dashed") +
geom_vline(xintercept = media_lectura - sd_lectura, color = "darkgreen", linetype = "dashed") +
labs(title = "Distribución de horas de lectura",
x = "Horas de lectura por semana",
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.
Aqui se utilizo horas de lectura, y se agregaron líneas verticales en la media y en la media ± desviación estándar.
COMO LEERLO:
La linea hora marca la media, mientras que las lineas verdes punteadas muestran el rango media ± DE.
Para la interpretacion, es util utilizar palabras claves como se refleja en la linea o en el resultado de la media, esto segun los resultados o aquel variable sobre la que se tiene interes.
Ejemplo: La mayoría de los estudiantes leen entre 3 y 8 horas por semana, ya que estas barras son las más altas (mayor frecuencia). Esto indica que la mayor parte de la población dedica una cantidad moderada de tiempo a la lectura semanalmente.
4.8.2 Boxplot (diagrama de caja)
Resume la distribuccion gracias a los cuartiles.
# Boxplot de horas de cuidado
ggplot(datos, aes(y = horas_cuidado)) +
geom_boxplot(fill = "lightpink", color = "black") +
labs(title = "Dispersión de horas de cuidado",
y = "Horas de cuidado por semana") +
theme_minimal()
Se lee teniendo en cuenta:
La línea central es la mediana. Los bordes de la caja son los cuartiles 25% y 75% (Q1 y Q3). La altura de la caja es el IQR. Los puntos fuera de los “bigotes” son posibles valores atípicos.
Se interpreta utilizando la linea central para determinar la mediana
y se relaciona con los posibles valores atipicos que pueden afectar los
resultados.
Un ejemplo es: La mediana de horas de cuidado es de 11, pero existen
valores muy altos (30-36 horas), lo que sugiere que algunos estudiantes
tienen cargas de cuidado significativamente mayores que la mayoría.
4.8.3 Gráfico de violín
El gráfico de violín une el boxplot con una estimación de la densidad de los datos.
# Gráfico de violín para horas de lectura
ggplot(datos, aes(x = "", y = horas_lectura)) +
geom_violin(fill = "lightblue", alpha = 0.6, trim = FALSE) +
geom_boxplot(width = 0.1, fill = "white") +
labs(title = "Distribución de horas de lectura (violín + caja)",
x = NULL, y = "Horas de lectura por semana") +
theme_minimal()
La forma ancha del violin muestra donde se concentran los estudiantes en este caso.
Caja interna es un boxplot clasico.
La interpretacion es: El gráfico muestra que la mayoría de los estudiantes leen entre 4 y 8 horas, pero hay un pequeño grupo que lee más de 12, lo cual alarga la parte superior de la distribución.
4.8.4 Reflexión
Me parecio importante dejar esta parte igual ya que da una reflexion completa y util para entender los diferentes graficos presentados en relacion con las medidas de dispersion o de tendencia central.
Con estos gráficos podemos observar lo siguiente (ejemplo inventado):
Aunque la media de cuidado es 10 horas, los boxplots revelan grandes desigualdades, con algunos estudiantes dedicando hasta 36 horas semanales.
En las horas de lectura, la dispersión es más moderada: la mayoría se concentra cerca de la media, aunque siempre hay estudiantes que leen mucho más de lo esperado.
El violín permite ver esas concentraciones de manera visual, mostrando que las responsabilidades de cuidado están mucho más desigualmente distribuidas que los hábitos de lectura.
La distribución de datos describe la manera en que se reparten los valores de una variable.
Permite observar si los datos se concentran en torno a un valor central, si están muy dispersos o si presentan sesgos (asimetría) o mayor “achatamiento” (curtosis).
Se utilizan los:
Histogramas y densidades Polígonos de frecuencia Curvas de densidad superpuestas Identificación de asimetría y curtosis
5.1 Histogramas y densidades
El histograma enseña como se distribuyen los datos en intervalos.
La curva de densidad suaviza la distribución para verla como una línea continua.
# Histograma y densidad de horas de lectura
ggplot(datos, aes(x = horas_lectura)) +
geom_histogram(aes(y = ..density..), binwidth = 2, fill = "lightblue", color = "black") +
geom_density(color = "red", size = 1) +
labs(title = "Histograma y densidad de horas de lectura",
x = "Horas de lectura por semana",
y = "Densidad") +
theme_minimal()
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Se lee:
El histograma muestra la frecuencia en intervalos de 2 horas, y ademas, la curva roja indica la forma general de la distribuccion.
Se interpreta: La mayoría de estudiantes lee entre 4 y 8 horas semanales. La curva es algo asimétrica a la derecha, lo cual indica que algunos pocos leen mucho más (hasta 17 horas), pero no son mayoría.
5.2 Polígonos de frecuencia
Conecta los puntos medios de cada barra del histograma, por lo que es util.
# Polígono de frecuencia de horas de cuidado
ggplot(datos, aes(x = horas_cuidado)) +
geom_freqpoly(binwidth = 4, color = "darkgreen", size = 1) +
labs(title = "Polígono de frecuencia de horas de cuidado",
x = "Horas de cuidado por semana",
y = "Frecuencia") +
theme_minimal()
Cómo leerlo:
Cada punto muestra la frecuencia en un intervalo de 4 horas. La línea conecta esos puntos para dar una visión continua.
Se interpreta: Vemos que la mayoría dedica entre 7 y 17 horas al cuidado, pero hay una larga cola hasta 36 horas, lo que indica desigualdad en la distribución de las responsabilidades de cuidado.
5.3 Curvas de densidad superpuestas
Podemos comparar cómo se distribuyen los datos entre dos grupos. Ejemplo: hombres y mujeres en horas de lectura.
# Curvas de densidad por género en horas de lectura
ggplot(datos, aes(x = horas_lectura, fill = genero)) +
geom_density(alpha = 0.4) +
labs(title = "Distribución de horas de lectura por género",
x = "Horas de lectura por semana",
y = "Densidad") +
theme_minimal()
Se lee:
Cada curva representa la distribución de un grupo y El área bajo la curva representa la proporción de estudiantes.
Se interpreta: Las mujeres tienen una distribución más concentrada en torno a 4-8 horas, mientras que los hombres presentan mayor dispersión: algunos leen poco (2 horas), otros bastante (12 horas). Esto puede reflejar diferencias en hábitos de estudio o en la disponibilidad de tiempo.
5.4 Identificación de asimetría y curtosis La asimetría mide si la distribución se inclina hacia la izquierda o derecha. La curtosis mide si la distribución es más “picuda” o más “achatada” que una normal.
# Librería para calcular asimetría y curtosis
library(e1071)
## Warning: package 'e1071' was built under R version 4.4.3
skewness(datos$horas_cuidado) # Asimetría
## [1] 0.3398357
kurtosis(datos$horas_cuidado) # Curtosis
## [1] -0.3042101
Cómo leerlo:
Asimetría = 0 → distribución simétrica. Asimetría > 0 → cola hacia la derecha (valores altos). Asimetría < 0 → cola hacia la izquierda (valores bajos). Curtosis ≈ 3 → similar a la normal. Curtosis > 3 → más picuda (con colas más pesadas). Curtosis < 3 → más achatada.
Se interpreta: a asimetría de las horas de cuidado es 0.34, lo que indica una ligera tendencia hacia la derecha: la mayoría de los estudiantes dedica pocas o medianas horas al cuidado, pero existe un pequeño grupo que dedica muchas horas.
La curtosis es -0.30, lo que sugiere que la distribución es más plana que una normal, con menos concentración en torno a la media y sin valores extremos muy marcados
5.5 Reflexión La distribución de los datos nos permite ver más allá de los promedios:
En las horas de lectura, la distribución es relativamente simétrica, con la mayoría cerca de la media. En las horas de cuidado, la distribución es asimétrica y con alta curtosis: muchos estudiantes dedican pocas horas, pero unos pocos cargan con una gran cantidad de tiempo, lo cual evidencia desigualdades en las responsabilidades de cuidado.
Es posible usar utilizar dplyr para calcular muchas medidas a partir de categorías, esto es más flexible, claro y escalable cuando trabajamos con bases de datos grandes.
6.1 Frecuencia absoluta y relativa Queremos saber cuántos estudiantes hay por género y qué porcentaje representan.
library(dplyr)
datos %>%
group_by(genero) %>%
summarise(
n = n(),
porcentaje = round((n() / nrow(datos)) * 100, 1)
)
## # A tibble: 4 × 3
## genero n porcentaje
## <chr> <int> <dbl>
## 1 Hombre 93 46.5
## 2 Mujer 88 44
## 3 No binario 11 5.5
## 4 Prefiero no decir 8 4
Ejemplo de interpretacion: El 46% de la muestra son hombres y el 44% mujeres Esto coincide con tendencias en programas de ciencias sociales en Cali. lo que difiere de Los datos nacionales donde las mujeres representan alrededor del 55% de la matrícula,y los hombres constituyen aproximadamente el 45%.
Mientras que los hombres constituyen aproximadamente el 45%.
6.2 Tablas cruzadas con medidas adicionales
Podemos combinar dos variables categóricas (ej. genero y semestre) y calcular distintas medidas descriptivas de una tercera variable (ej. horas_cuidado).
datos %>%
group_by(genero, semestre) %>%
summarise(
n = n(),
media_cuidado = mean(horas_cuidado),
mediana_cuidado = median(horas_cuidado),
sd_cuidado = sd(horas_cuidado)
)
## `summarise()` has grouped output by 'genero'. You can override using the
## `.groups` argument.
## # A tibble: 31 × 6
## # Groups: genero [4]
## genero semestre n media_cuidado mediana_cuidado sd_cuidado
## <chr> <int> <int> <dbl> <dbl> <dbl>
## 1 Hombre 1 13 13.7 13 8.82
## 2 Hombre 2 13 11.3 13 7.16
## 3 Hombre 3 11 13.2 13 6.15
## 4 Hombre 4 16 12.1 11 6.87
## 5 Hombre 5 7 6.29 10 5.35
## 6 Hombre 6 7 15.1 16 7.47
## 7 Hombre 7 6 6.83 5 6.18
## 8 Hombre 8 7 19.4 21 5.47
## 9 Hombre 9 9 14.2 12 9.15
## 10 Hombre 10 4 10 7.5 6.16
## # ℹ 21 more rows
6.3 Medidas de asociación simples (razones, proporciones) Con dplyr también podemos calcular proporciones y razones directamente.
frecuencias <- datos %>%
group_by(genero) %>%
summarise(n = n())
frecuencias %>%
mutate(
proporcion = n / sum(n),
razon_vs_hombres = n / n[genero == "Hombre"]
)
## # A tibble: 4 × 4
## genero n proporcion razon_vs_hombres
## <chr> <int> <dbl> <dbl>
## 1 Hombre 93 0.465 1
## 2 Mujer 88 0.44 0.946
## 3 No binario 11 0.055 0.118
## 4 Prefiero no decir 8 0.04 0.0860
6.4 Visualización con ggplot2 y dplyr
datos %>%
count(genero) %>%
ggplot(aes(x = genero, y = n, fill = genero)) +
geom_col() +
labs(title = "Distribución de estudiantes por género",
x = "Género", y = "Frecuencia") +
theme_minimal() +
theme(legend.position = "none")
Interpretacion:
La distribución de estudiantes muestra una ligera mayoría de hombres sobre mujeres, mientras que las identidades no binarias y quienes prefieren no declarar su género representan una proporción significativamente menor.
datos %>%
count(semestre, genero) %>%
ggplot(aes(x = semestre, y = n, fill = genero)) +
geom_col() +
labs(title = "Distribución de género por semestre",
x = "Semestre", y = "Número de estudiantes") +
theme_minimal()
datos %>%
count(semestre, genero) %>%
ggplot(aes(x = semestre, y = n, fill = genero)) +
geom_col(position = "fill") +
labs(title = "Proporción de género por semestre",
x = "Semestre", y = "Proporción") +
theme_minimal()
Intepretacion: En los primeros semestres predominan los hombres, pero conforme avanza la carrera, las mujeres adquieren mayor representación, lo que sugiere mayor permanencia femenina y posible deserción masculina, mientras que las identidades no binarias y quienes prefieren no declarar su género se mantienen en proporciones bajas pero constantes.
6.5 Reflexión
Con dplyr podemos calcular muchas estadísticas categóricas en un solo flujo de trabajo. Agrupar por una o varias categorías (group_by) nos permite entender desigualdades y patrones sociales. La combinación dplyr + ggplot2 es poderosa: primero resumimos datos, luego los visualizamos. En el contexto de humanidades y ciencias sociales, este tipo de análisis es muy útil para evidenciar diferencias de género, cohorte, o lugar de residencia, de forma clara y replicable.
La idea es replicar el ejercicio paso a paso y luego contrastar los resultados con informacion
.1 Base interna (estudiantes)
Cree una base de datos ficticia con información de 50 estudiantes de la Facultad de Humanidades de la Universidad X.
set.seed(123)
datos_estudiantes <- data.frame(
id = 1:50,
genero = sample(c("Femenino", "Masculino"), 50, replace = TRUE, prob = c(0.55, 0.45)),
semestre = sample(seq(1, 9, 2), 50, replace = TRUE),
horas_cuidado = round(rnorm(50, mean = 12, sd = 4), 1),
horas_lectura = round(rnorm(50, mean = 6, sd = 2), 1)
)
7.2 Datos externos (nacionales, inventados) Simule una tabla con información agregada nacional (promedios por género).
datos_nacionales <- data.frame(
genero = c("Femenino", "Masculino"),
horas_cuidado_prom = c(18, 8), # valores inventados
horas_lectura_prom = c(5, 6) # valores inventados
)
datos_nacionales
## genero horas_cuidado_prom horas_lectura_prom
## 1 Femenino 18 5
## 2 Masculino 8 6
Interpretacion: Los datos muestran que as mujeres dedican en promedio 18 horas semanales a tareas de cuidado, más del doble que los hombres, quienes solo dedican 8 horas. Lo que a su vez, nos indica que una desigual distribución de responsabilidades domésticas, donde las mujeres asumen una mayor carga, lo que podría afectar su tiempo libre y su bienestar. head(datos_estudiantes)
7.4 Contraste con datos externos Une la tabla de resultados internos con la de datos externos. Calcula las diferencias entre tu muestra y el promedio nacional. Resume esas diferencias en una tabla.
library(dplyr)
# --- Datos de ejemplo ---
# Resultados internos (tu muestra)
resultados_internos <- tibble(
genero = c("Femenino", "Masculino"),
horas_cuidado_prom = c(20, 9),
horas_lectura_prom = c(4, 5)
)
# Datos externos (promedios nacionales)
datos_externos <- tibble(
genero = c("Femenino", "Masculino"),
horas_cuidado_prom = c(18, 8),
horas_lectura_prom = c(5, 6)
)
# --- Contraste con datos externos ---
resultado_comparacion <- resultados_internos %>%
inner_join(datos_externos, by = "genero", suffix = c("_muestra", "_nacional")) %>%
mutate(
dif_cuidado = horas_cuidado_prom_muestra - horas_cuidado_prom_nacional,
dif_lectura = horas_lectura_prom_muestra - horas_lectura_prom_nacional
) %>%
select(genero, dif_cuidado, dif_lectura)
# Mostrar la tabla final
resultado_comparacion
## # A tibble: 2 × 3
## genero dif_cuidado dif_lectura
## <chr> <dbl> <dbl>
## 1 Femenino 2 -1
## 2 Masculino 1 -1
Interpretacion: Las estudiantes mujeres dedican 2 horas más al cuidado que el promedio nacional femenino, mientras que los hombres dedican solo 1 hora más. Lo que demuestra que incluso en contextos universitarios, las mujeres siguen asumiendo la mayor parte de las responsabilidades de cuidado, lo que puede generar sobrecarga y estrés.
library(ggplot2)
library(dplyr)
library(tidyr)
# --- Datos de ejemplo ---
resultados_internos <- tibble(
genero = c("Femenino", "Masculino"),
horas_cuidado_prom = c(20, 9),
horas_lectura_prom = c(4, 5)
)
datos_externos <- tibble(
genero = c("Femenino", "Masculino"),
horas_cuidado_prom = c(18, 8),
horas_lectura_prom = c(5, 6)
)
# --- Preparar datos para graficar ---
# Unir y pasar a formato largo para facilitar el uso en ggplot
datos_combinados <- resultados_internos %>%
rename(horas_cuidado_muestra = horas_cuidado_prom,
horas_lectura_muestra = horas_lectura_prom) %>%
inner_join(datos_externos, by = "genero", suffix = c("_muestra", "_nacional")) %>%
pivot_longer(cols = c(horas_cuidado_muestra, horas_cuidado_prom,
horas_lectura_muestra, horas_lectura_prom),
names_to = c("variable", "origen"),
names_pattern = "(horas_[a-z]+)_(muestra|prom)",
values_to = "valor")
# Ajustar etiquetas para claridad
datos_combinados <- datos_combinados %>%
mutate(
variable = case_when(
variable == "horas_cuidado" ~ "Horas de Cuidado",
variable == "horas_lectura" ~ "Horas de Lectura"
),
origen = recode(origen, "muestra" = "Estudiantes", "prom" = "Nacional")
)
# --- Gráfico de horas de cuidado ---
ggplot(datos_combinados %>% filter(variable == "Horas de Cuidado"),
aes(x = genero, y = valor, fill = origen)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Comparación de Horas de Cuidado",
x = "Género",
y = "Horas promedio",
fill = "Fuente") +
theme_minimal()
# --- Gráfico de horas de lectura ---
ggplot(datos_combinados %>% filter(variable == "Horas de Lectura"),
aes(x = genero, y = valor, fill = origen)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Comparación de Horas de Lectura",
x = "Género",
y = "Horas promedio",
fill = "Fuente") +
theme_minimal()
Al comparar los datos de la muestra de estudiantes con el promedio nacional, se observa que existen diferencias notables en los hábitos de lectura según el género:
Mujeres: En la muestra de estudiantes, las mujeres leen en promedio 4 horas por semana, mientras que el promedio nacional es de 5 horas. Esto indica que las mujeres de la muestra dedican una hora menos a la lectura que el promedio nacional.
Hombres: Los hombres de la muestra leen 5 horas por semana, mientras que el promedio nacional es de 6 horas. La diferencia también es de una hora menos, pero en este caso la distancia es un poco menor en términos relativos, pues ambos promedios son más altos.
Hipotesis sociologica clave:
Las diferencias en horas de cuidado y lectura entre hombres y mujeres se explican debido a la persistencia de roles de género tradicionales dentro de la sociedad.
En este contexto, las mujeres asumen de manera desproporcionada las responsabilidades de cuidado, ya sean hermanos menores, adultos mayores, tareas domésticas, lo que limita el tiempo que pueden dedicar a actividades académicas como la lectura. Por otro lado, los hombres, al tener menos carga de cuidado, disponen de mayor tiempo libre para el estudio y demas actividades, lo que genera diferencias en el desarrollo académico y en la igualdad de oportunidades.