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
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