R Markdown

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)
Data summary
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.

  1. Medidas de tendencia central

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

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

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

  3. Nos demuestra que la muestra tiene a mas hombres que mujeres, ya que la moda es el dato que aparece con mayor frecuencia

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

3.6 Media recortada

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.

3.7 Media ponderada

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

Ejemplo 1: Media ponderada de horas de cuidado por semestre

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

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

  2. Que el El boxplot muestra no solo la mediana, sino también la dispersión, los cuartiles y posibles valores atípicos.

  3. debido a que permite visualizar de inmediato qué categoría es más frecuente y comparar magnitudes entre todas las categorías.

  4. podria usar semestre (como histograma o boxplot), horas_cuidado (boxplot para ver atípicos), o programa y ciudad_residencia (gráfico de barras).

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