Meta del curso. Aprender a organizar un proyecto, importar una base real, entender qué contiene, transformarla con cuidado, calcular porcentajes y producir un gráfico que otra persona pueda leer sin conocer R.
Este curso propone una primera aproximación y parte desde los conceptos básicos. Vamos a trabajar con la base de personas de la Encuesta Permanente de Hogares (EPH), primer trimestre de 2025, publicada por el INDEC.
El análisis responderá una pregunta concreta:
¿Qué porcentaje de las personas de 18 a 65 años está económicamente activo en la muestra y cómo cambia ese porcentaje según sexo y nivel educativo agrupado?
Usaremos dos recorridos. Primero veremos cada idea con R
base, las herramientas que vienen con R. Después mostraremos
una alternativa con paquetes como dplyr,
janitor y ggplot2. Comparar las dos sintaxis
permite reconocer distintas formas de resolver una misma tarea y elegir
la más clara para cada situación.
Límite. En este curso trabajamos con porcentajes sin ponderar. Por lo tanto, los resultados describen los casos observados después del filtro y no representan tasas oficiales ni estimaciones de toda la población. La EPH cubre 31 aglomerados urbanos y su análisis poblacional requiere considerar el diseño de la encuesta.
R es el lenguaje y el programa que interpreta nuestras instrucciones. RStudio es un entorno de trabajo que reúne un editor, la consola, los objetos, los archivos, la ayuda y los gráficos en una misma ventana.
En RStudio suelen verse cuatro zonas:
| Zona | Para qué sirve |
|---|---|
| Editor | Escribir y guardar scripts o documentos R Markdown. |
| Consola | Ejecutar instrucciones y mostrar resultados o errores. |
| Environment | Ver los objetos creados durante la sesión. |
| Files, Plots, Packages, Help | Navegar archivos, gráficos, paquetes y documentación. |
La consola sirve para probar. El script o el R Markdown sirven para conservar y reproducir el trabajo. Si un análisis existe solamente en la consola, será difícil reconstruirlo más adelante.
En un script, colocamos el cursor en una línea y usamos Ctrl + Enter en Windows o Linux, o Cmd + Enter en macOS. En un R Markdown también podemos usar el botón verde de cada bloque.
Probemos tres instrucciones sencillas:
La flecha <- asigna un valor a un objeto. Se lee
“edad recibe 30”. R distingue mayúsculas de minúsculas:
edad, Edad y EDAD serían tres
nombres diferentes.
Práctica 1. Creá un objeto llamado
ingresos con los valores 100, 200 y 300. Después calculá su
promedio.
El pseudocódigo es una lista ordenada de acciones expresadas con palabras comunes, independiente de la sintaxis de R. Su función es separar dos problemas:
Para nuestra pregunta, el plan será:
El pseudocódigo también permite detectar decisiones ocultas. Por ejemplo, “conservar personas adultas” requiere indicar qué edades consideraremos y por qué.
Práctica 2. Reescribí los pasos 6 a 9 para estudiar personas ocupadas en lugar de personas activas.
Un objeto es un nombre que usamos para guardar algo. Puede contener un número, texto, una secuencia o una tabla completa.
cantidad <- 12
curso <- "Introducción a R"
aprobado <- TRUE
edades <- c(18, 25, 40, NA)
class(cantidad)
#> [1] "numeric"
class(curso)
#> [1] "character"
class(aprobado)
#> [1] "logical"NA significa que un valor está ausente o no disponible y
se diferencia de cero. Muchas funciones necesitan que indiquemos qué
hacer con esos valores:
El argumento na.rm = TRUE pide omitir los
NA durante el cálculo y conserva intacto el objeto
original.
| Operador | Pregunta que representa | Ejemplo |
|---|---|---|
== |
¿Es igual a? | edad == 30 |
!= |
¿Es distinto de? | sexo != 9 |
> y < |
¿Es mayor o menor? | edad > 18 |
>= y <= |
¿Incluye el límite? | edad >= 18 |
%in% |
¿Pertenece a este conjunto? | estado %in% c(1, 2) |
& |
¿Se cumplen ambas condiciones? | edad >= 18 & edad <= 65 |
| |
¿Se cumple al menos una? | estado == 1 | estado == 2 |
! |
Negación | !is.na(edad) |
Un error común es escribir = cuando queremos comparar.
Para preguntar si dos valores son iguales usamos ==.
Una función recibe entradas, realiza una tarea y devuelve una salida. Para leer una llamada conviene avanzar desde el nombre hacia el interior de los paréntesis. En esta expresión:
round() es la función exterior y recibe el resultado de
mean().mean() es la función interior y se ejecuta
primero.edades es el primer argumento de mean() y
aporta los datos.na.rm = TRUE indica que la función debe omitir valores
ausentes.digits = 1 indica que round() debe
conservar un decimal.Una llamada puede combinar argumentos por posición y argumentos por nombre:
Las dos líneas producen el mismo resultado. En la primera, R reconoce
edades por su posición; en la segunda, x =
nombra explícitamente el argumento. Nombrar las opciones mejora la
lectura y evita depender del orden.
La ayuda de una función muestra su forma general, los argumentos, el
tipo de resultado y ejemplos. Podemos abrirla con ?mean o
help(mean). También podemos inspeccionar los argumentos
desde la consola:
La expresión que aparece en la ayuda suele incluir:
x, que debemos
proporcionar;..., que permite transmitir argumentos
adicionales;Antes de ejecutar una función nueva, conviene responder cuatro preguntas:
El prefijo paquete:: también forma parte de la lectura.
Por ejemplo, dplyr::filter(datos, CH06 >= 18) indica con
claridad que usamos la función filter() del paquete
dplyr sobre el objeto datos.
Práctica 3. Leé la expresión
round(mean(c(10, 12, NA, 15), na.rm = TRUE), digits = 2)
desde adentro hacia afuera. Identificá los datos, las opciones y el
orden de ejecución. Después anticipá qué tipo de resultado
devolverá.
c() reúne los cuatro valores en un vector
numérico.mean() calcula el promedio y na.rm = TRUE
omite el valor ausente.round() recibe ese promedio y digits = 2
lo redondea a dos decimales.12.33.La carpeta principal debe contener este documento y la subcarpeta con los datos:
markdown/
├── curso_introductorio_R_EPH_1T2025.Rmd
└── EPH_usu_1er_Trim_2025_txt/
├── usu_individual_T125.txt
└── usu_hogar_T125.txt
La ruta de trabajo es la dirección que R usa como
punto de partida. getwd() muestra esa carpeta y
list.files() enumera su contenido.
El bloque queda sin ejecutar para mantener fuera del documento la ruta personal de la computadora que lo tejió.
La ruta relativa que usaremos es:
Una ruta relativa funciona dentro del proyecto aunque la carpeta
completa se copie a otra computadora. En cambio, una ruta como
C:/Users/Ana/Desktop/... depende de una persona y una
máquina específicas.
Buena práctica. Abrí el proyecto o el archivo desde
su carpeta principal. Las rutas relativas mantienen el código portable.
setwd() fija una ruta personal y file.choose()
detiene el tejido automático mientras espera un clic.
Los paquetes agregan funciones a R. Hay dos pasos diferentes:
# Ejecutar una sola vez y sin el signo # inicial:
install.packages(c("dplyr", "janitor", "ggplot2", "readxl", "rmarkdown"))También podemos escribir dplyr::filter(). Los dos puntos
dobles indican de qué paquete viene la función y evitan dudas cuando dos
paquetes tienen funciones con el mismo nombre.
Para elegir una función de importación debemos conocer:
El TXT de la EPH usa punto y coma como separador y coma decimal. Por
eso utilizamos read.csv2().
eph <- read.csv2(
file = ruta_datos,
header = TRUE,
stringsAsFactors = FALSE,
fileEncoding = "Latin1",
na.strings = c("", "NA"),
check.names = FALSE
)
dim(eph)
#> [1] 45425 235La importación conserva el TXT original y crea un objeto llamado
eph en la sesión de R. En este caso hay 45.425 filas y 235
columnas.
Estos ejemplos quedan sin ejecutar porque los archivos no están en la carpeta. La lógica se mantiene: ruta, función y objeto de destino.
# CSV separado por comas
eph_csv <- read.csv(
"datos/eph_individual_T125.csv",
stringsAsFactors = FALSE,
fileEncoding = "UTF-8"
)
# Excel: requiere el paquete readxl
eph_excel <- readxl::read_excel(
"datos/eph_individual_T125.xlsx",
sheet = 1
)Práctica 4. Sin ejecutar código, señalá qué parte
habría que cambiar para importar un archivo llamado
personas.csv guardado en la subcarpeta
datos.
"datos/personas.csv". También habría que
comprobar el separador: usaríamos read.csv() si es coma y
read.csv2() si es punto y coma.
Cada fila de la base individual representa una persona. Las columnas son variables. Antes de modificar algo, revisamos dimensiones, nombres y tipos.
nrow(eph)
#> [1] 45425
ncol(eph)
#> [1] 235
names(eph)[1:15]
#> [1] "CODUSU" "ANO4" "TRIMESTRE" "NRO_HOGAR" "COMPONENTE"
#> [6] "H15" "REGION" "MAS_500" "AGLOMERADO" "PONDERA"
#> [11] "CH03" "CH04" "CH05" "CH06" "CH07"Las variables centrales del ejercicio son:
| Variable | Significado para este curso |
|---|---|
CH04 |
Sexo registrado: 1 varón, 2 mujer. |
CH06 |
Edad en años cumplidos. |
NIVEL_ED |
Nivel educativo codificado. |
ESTADO |
1 ocupado, 2 desocupado, 3 inactivo; otros códigos quedan fuera del ejercicio. |
PONDERA |
Factor de expansión, excluido de este ejercicio introductorio. |
variables_interes <- c("CH04", "CH06", "NIVEL_ED", "ESTADO", "PONDERA")
head(eph[variables_interes])str(eph[variables_interes])
#> 'data.frame': 45425 obs. of 5 variables:
#> $ CH04 : int 2 2 1 1 2 2 1 2 1 2 ...
#> $ CH06 : int 25 7 4 -1 29 13 5 39 41 2 ...
#> $ NIVEL_ED: int 4 1 7 7 5 1 7 6 3 7 ...
#> $ ESTADO : int 1 4 4 4 1 3 4 1 1 4 ...
#> $ PONDERA : int 927 927 927 927 1294 1294 1294 727 727 727 ...
summary(eph[variables_interes])
#> CH04 CH06 NIVEL_ED ESTADO
#> Min. :1.00 Min. : -1.00 Min. :1.000 Min. :0.000
#> 1st Qu.:1.00 1st Qu.: 18.00 1st Qu.:3.000 1st Qu.:1.000
#> Median :2.00 Median : 35.00 Median :4.000 Median :3.000
#> Mean :1.52 Mean : 36.79 Mean :3.757 Mean :2.191
#> 3rd Qu.:2.00 3rd Qu.: 54.00 3rd Qu.:5.000 3rd Qu.:3.000
#> Max. :2.00 Max. :103.00 Max. :7.000 Max. :4.000
#> PONDERA
#> Min. : 21.0
#> 1st Qu.: 181.0
#> Median : 319.0
#> Mean : 657.1
#> 3rd Qu.: 684.0
#> Max. :8257.0Una alternativa compacta es glimpse():
dplyr::glimpse(eph[variables_interes], width = 72)
#> Rows: 45,425
#> Columns: 5
#> $ CH04 <int> 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1,…
#> $ CH06 <int> 25, 7, 4, -1, 29, 13, 5, 39, 41, 2, 51, 28, 24, 19, 3…
#> $ NIVEL_ED <int> 4, 1, 7, 7, 5, 1, 7, 6, 3, 7, 3, 3, 5, 5, 4, 4, 7, 1,…
#> $ ESTADO <int> 1, 4, 4, 4, 1, 3, 4, 1, 1, 4, 1, 1, 1, 3, 1, 3, 4, 4,…
#> $ PONDERA <int> 927, 927, 927, 927, 1294, 1294, 1294, 727, 727, 727, …Estas funciones responden preguntas diferentes:
dim(), nrow() y ncol(): ¿qué
tamaño tiene la base?names(): ¿cómo se llaman las variables?head(): ¿cómo se ven algunos registros?str() y glimpse(): ¿qué tipo tiene cada
variable?summary(): ¿qué rangos y distribuciones básicas
aparecen?El diseño de registros del INDEC permite interpretar el significado de cada código con respaldo documental.
Seleccionar columnas y filtrar filas son tareas distintas. Primero conservaremos las cuatro variables necesarias.
En eph[filas, columnas], lo que está antes de la coma
corresponde a filas y lo que está después corresponde a columnas.
Ahora construimos una condición que sea verdadera solo para los casos válidos del ejercicio.
datos_alt <- dplyr::select(eph, CH04, CH06, NIVEL_ED, ESTADO)
datos_alt <- dplyr::filter(
datos_alt,
!is.na(CH06),
CH06 >= 18,
CH06 <= 65,
CH04 %in% c(1, 2),
NIVEL_ED %in% 1:7,
ESTADO %in% c(1, 2, 3)
)
nrow(datos_alt)
#> [1] 28719Comprobamos que ambos caminos seleccionaron los mismos registros:
Si stopifnot() no muestra nada, la comprobación fue
exitosa. Comparamos el contenido de las columnas porque R base conserva
los números de fila originales y dplyr los reinicia. Esa
diferencia de etiquetas no cambia los datos. Si la condición fuera
falsa, R detendría la ejecución.
Práctica 5. Creá datos_25_60 con
personas de 25 a 60 años, sin modificar datos.
Recodificar significa construir una representación más útil a partir de códigos existentes. Conservaremos las columnas originales para poder revisar nuestras decisiones.
Para este ejercicio agrupamos los códigos 4, 5 y 6 como “Secundaria completa o más”. Los códigos 1, 2, 3 y 7 forman “Hasta secundaria incompleta”. Es una agrupación didáctica, no una nueva categoría oficial del INDEC.
Una persona económicamente activa puede estar ocupada o desocupada.
Por eso activo vale 1 cuando ESTADO es 1 o 2,
y 0 cuando es 3.
datos$activo <- ifelse(datos$ESTADO %in% c(1, 2), 1, 0)
table(datos$sexo, useNA = "ifany")
#>
#> Varones Mujeres
#> 13828 14891
table(datos$educacion, useNA = "ifany")
#>
#> Hasta secundaria incompleta Secundaria completa o más
#> 8964 19755
table(datos$activo, useNA = "ifany")
#>
#> 0 1
#> 8047 20672datos_alt <- dplyr::mutate(
datos_alt,
sexo = factor(
CH04,
levels = c(1, 2),
labels = c("Varones", "Mujeres")
),
educacion = dplyr::if_else(
NIVEL_ED %in% c(4, 5, 6),
"Secundaria completa o más",
"Hasta secundaria incompleta"
),
educacion = factor(educacion, levels = niveles_educacion),
activo = dplyr::if_else(ESTADO %in% c(1, 2), 1, 0)
)
stopifnot(
identical(datos$sexo, datos_alt$sexo),
identical(datos$educacion, datos_alt$educacion),
identical(datos$activo, datos_alt$activo)
)Práctica 6. Creá una variable ocupado
que valga 1 cuando ESTADO == 1 y 0 cuando
ESTADO sea 2 o 3. ¿Por qué no es igual a
activo?
Una frecuencia absoluta es un conteo. Una proporción divide cada conteo por el total y un porcentaje multiplica esa proporción por 100.
Cuando una variable solo contiene 0 y 1, su media es la proporción de valores iguales a 1.
El cálculo funciona porque activo fue definida
expresamente como una variable binaria: su media es la proporción de
valores iguales a 1. Multiplicar por 100 convierte esa proporción en
porcentaje.
tabla_base <- aggregate(
activo ~ sexo + educacion,
data = datos,
FUN = mean
)
casos_base <- aggregate(
activo ~ sexo + educacion,
data = datos,
FUN = length
)
tabla_base$porcentaje <- round(100 * tabla_base$activo, 1)
tabla_base$casos <- casos_base$activo
tabla_base <- tabla_base[, c("sexo", "educacion", "casos", "porcentaje")]
tabla_basegrupos <- dplyr::group_by(datos, sexo, educacion)
tabla_alt <- dplyr::summarise(
grupos,
casos = dplyr::n(),
porcentaje = round(100 * mean(activo), 1),
.groups = "drop"
)
tabla_altVerificamos que los resultados coincidan después de ordenarlos:
tabla_base_ordenada <- tabla_base[order(tabla_base$sexo, tabla_base$educacion), ]
tabla_alt_ordenada <- as.data.frame(
dplyr::arrange(tabla_alt, sexo, educacion)
)
stopifnot(
identical(tabla_base_ordenada$casos, tabla_alt_ordenada$casos),
identical(tabla_base_ordenada$porcentaje, tabla_alt_ordenada$porcentaje),
all(tabla_base_ordenada$porcentaje >= 0),
all(tabla_base_ordenada$porcentaje <= 100),
nrow(tabla_base_ordenada) == 4
)
knitr::kable(
tabla_alt_ordenada,
col.names = c("Sexo", "Educación", "Casos", "Personas activas (%)"),
caption = "Actividad por sexo y educación en la muestra seleccionada"
)| Sexo | Educación | Casos | Personas activas (%) |
|---|---|---|---|
| Varones | Hasta secundaria incompleta | 4913 | 80.0 |
| Varones | Secundaria completa o más | 8915 | 83.0 |
| Mujeres | Hasta secundaria incompleta | 4051 | 49.2 |
| Mujeres | Secundaria completa o más | 10840 | 67.8 |
El denominador cambia entre filas: cada porcentaje se calcula dentro de su combinación de sexo y educación.
Práctica 7. Calculá el porcentaje de personas
activas por sexo, primero con R base y luego con dplyr.
Comprobá que coincidan.
actividad_sexo_base <- aggregate(activo ~ sexo, data = datos, FUN = mean)
actividad_sexo_base$porcentaje <- round(100 * actividad_sexo_base$activo, 1)
actividad_sexo_alt <- dplyr::summarise(
dplyr::group_by(datos, sexo),
porcentaje = round(100 * mean(activo), 1),
.groups = "drop"
)
actividad_sexo_base[, c("sexo", "porcentaje")]Un gráfico legible permite responder estas preguntas con rapidez:
Para barplot() convertimos la tabla a una matriz. Usamos
dos colores distinguibles, una escala de 0 a 100, etiquetas directas y
una leyenda fuera de las barras.
matriz <- xtabs(porcentaje ~ educacion + sexo, data = tabla_base)
op <- par(mar = c(5, 5, 4, 1), las = 1)
posiciones <- barplot(
matriz,
beside = TRUE,
ylim = c(0, 100),
col = c("#0072B2", "#D55E00"),
border = NA,
main = "Actividad según sexo y educación",
sub = "Personas de 18 a 65 años; porcentajes sin ponderar",
xlab = "Sexo",
ylab = "Personas activas en la muestra (%)",
legend.text = rownames(matriz),
args.legend = list(
x = "topleft",
bty = "n",
cex = 0.85,
inset = c(0.01, 0.01)
)
)
text(
x = posiciones,
y = matriz,
labels = paste0(format(matriz, decimal.mark = ",", nsmall = 1), "%"),
pos = 3,
cex = 0.85
)Porcentaje de personas activas por sexo y educación. Resultados sin ponderar.
ggplot2 organiza la construcción en capas. Cada capa
cumple una función específica y se suma con +:
| Componente | Pregunta que responde | Ejemplo |
|---|---|---|
| Datos | ¿Qué tabla usamos? | tabla_alt |
| Mapeos estéticos | ¿Qué variables ocupan cada canal visual? | aes(x = sexo, y = porcentaje, fill = educacion) |
| Geometría | ¿Cómo representamos las observaciones? | geom_col() |
| Escala | ¿Cómo se traducen valores a posiciones, colores o etiquetas? | scale_y_continuous() |
| Etiquetas | ¿Qué contexto necesita quien lee? | labs() |
| Tema | ¿Cómo se presentan los elementos que rodean a los datos? | theme_minimal() y
theme() |
Dentro de aes() escribimos relaciones con variables de
la tabla. Fuera de aes() fijamos una propiedad para todos
los elementos. Por ejemplo, aes(fill = educacion) asigna un
color a cada nivel educativo, mientras que colour = "white"
aplicaría el mismo borde blanco a todas las barras.
El siguiente gráfico se puede leer de arriba hacia abajo: datos y mapeos generales, geometrías, escala, textos y aspecto visual.
grafico <- ggplot(
tabla_alt,
aes(x = sexo, y = porcentaje, fill = educacion)
) +
geom_col(
position = position_dodge(width = 0.82),
width = 0.72
) +
geom_text(
aes(label = paste0(format(porcentaje, decimal.mark = ",", nsmall = 1), "%")),
position = position_dodge(width = 0.82),
vjust = -0.45,
size = 4
) +
scale_fill_manual(values = c("#0072B2", "#D55E00")) +
scale_y_continuous(
limits = c(0, 100),
breaks = seq(0, 100, 20),
labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.06))
) +
labs(
title = "Actividad según sexo y educación",
subtitle = "Personas de 18 a 65 años; porcentajes sin ponderar",
x = NULL,
y = "Personas activas en la muestra",
fill = "Educación",
caption = paste(
"Fuente: INDEC, EPH, primer trimestre de 2025.",
"Cálculos sobre la muestra; no son tasas oficiales."
)
) +
theme_minimal(base_size = 13) +
theme(
legend.position = "bottom",
legend.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
panel.grid.major.x = element_blank(),
plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(color = "#444444"),
plot.caption = element_text(hjust = 0, color = "#555555"),
axis.text.x = element_text(face = "bold")
)
graficoPorcentaje de personas activas por sexo y educación. Fuente: INDEC, EPH 1T2025.
La tabla ya contiene los porcentajes calculados, por eso usamos
geom_col(). geom_bar() se reserva
habitualmente para contar observaciones. position_dodge()
coloca los grupos lado a lado y usa el mismo ancho en las barras y sus
etiquetas para mantenerlas alineadas.
Las barras funcionan bien para introducir comparaciones desde cero. Un gráfico de puntos ocupa menos tinta y deja los valores sobre una escala común, una opción útil cuando el interés principal está en comparar porcentajes.
grafico_puntos <- ggplot(
tabla_alt,
aes(x = porcentaje, y = educacion, colour = sexo)
) +
geom_line(
aes(group = educacion),
colour = "#D9D9D9",
linewidth = 1.2
) +
geom_point(size = 4) +
geom_text(
aes(label = paste0(format(porcentaje, decimal.mark = ",", nsmall = 1), "%")),
hjust = -0.25,
show.legend = FALSE
) +
scale_colour_manual(values = c("Varones" = "#0072B2", "Mujeres" = "#D55E00")) +
scale_x_continuous(
limits = c(0, 100),
breaks = seq(0, 100, 20),
labels = function(x) paste0(x, "%"),
expand = expansion(mult = c(0, 0.05))
) +
labs(
title = "La actividad es mayor entre los varones en ambos grupos educativos",
subtitle = "Personas de 18 a 65 años; porcentajes sin ponderar",
x = "Personas activas en la muestra",
y = NULL,
colour = "Sexo",
caption = "Fuente: INDEC, EPH, primer trimestre de 2025. Cálculos sobre la muestra."
) +
theme_minimal(base_size = 13) +
theme(
legend.position = "top",
legend.title = element_text(face = "bold"),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_blank(),
plot.title = element_text(face = "bold", size = 15),
plot.caption = element_text(hjust = 0, colour = "#555555")
)
grafico_puntosPorcentaje de personas activas por sexo y educación. Alternativa con puntos; resultados sin ponderar.
El título comunica el hallazgo principal y el subtítulo delimita el universo. Esta jerarquía orienta la lectura, mientras que el epígrafe conserva la fuente y el alcance del cálculo. Elegir entre barras y puntos depende de la pregunta y del espacio disponible; comparar ambas versiones ayuda a evaluar cuál hace más evidente el patrón.
ggsave(
filename = "grafico_actividad_EPH_1T2025.png",
plot = grafico,
width = 10,
height = 6,
units = "in",
dpi = 180,
bg = "white"
)La extensión del archivo define el formato. width y
height controlan el tamaño físico; dpi
controla la resolución de una imagen rasterizada como PNG.
Una lectura descriptiva podría decir:
En esta muestra de personas de 18 a 65 años, el porcentaje de actividad es mayor entre los varones que entre las mujeres en los dos grupos educativos. La diferencia más amplia se observa en el grupo de hasta secundaria incompleta.
El gráfico muestra asociaciones descriptivas entre las variables. Una afirmación causal requeriría otro diseño de análisis. Además, los porcentajes caracterizan la muestra seleccionada: el cálculo usa un universo de edad particular y prescinde de ponderadores.
Práctica 8. Cambiá el título del gráfico para que mencione el indicador, el período y el grupo de edad. Después escribí una oración descriptiva y una limitación.
Título: “Porcentaje de actividad por sexo y educación, EPH 1T2025, 18 a 65 años”.
Descripción: “En los dos grupos educativos, las barras de los varones son más altas que las de las mujeres”.
Limitación: “Los porcentajes describen los casos seleccionados; una estimación oficial requiere aplicar los ponderadores y considerar el diseño de la encuesta”.Un mensaje de error informa el punto en el que una instrucción dejó de ser comprensible para R o la tarea quedó incompleta.
class(),
str(), names() o head().?funcion.| Mensaje o síntoma | Causa habitual | Qué revisar |
|---|---|---|
object 'x' not found |
El objeto no fue creado o el nombre no coincide. | Ejecutar el bloque anterior; revisar mayúsculas. |
could not find function |
Falta cargar un paquete o hay un error en el nombre. | Usar library() o
paquete::funcion(). |
there is no package called... |
El paquete no está instalado. | Ejecutar install.packages() una vez. |
cannot open the connection |
La ruta o el archivo no existen. | Usar file.exists() y revisar la carpeta
del proyecto. |
unexpected symbol o
unexpected end |
Falta una coma, comilla o paréntesis. | Revisar la línea y también la anterior. |
non-numeric argument |
Se intentó calcular con texto o categorías. | Revisar class() y la importación. |
El resultado es NA |
Hay valores faltantes. | Decidir si corresponde na.rm = TRUE. |
| Todo queda en una columna | El separador de importación es incorrecto. | Comparar read.csv() y
read.csv2(). |
| Las tildes se ven mal | La codificación no coincide. | Probar fileEncoding = "Latin1" o
"UTF-8". |
| Funciona por líneas pero no al tejer | Dependía de objetos previos o rutas personales. | Reiniciar R y ejecutar desde arriba con rutas relativas. |
| Las etiquetas del gráfico se superponen | Hay poco espacio o demasiado texto. | Aumentar tamaño, abreviar, girar o reubicar etiquetas. |
Podemos comprobar una ruta sin intentar abrirla:
También es útil reiniciar R desde Session > Restart R y ejecutar todo desde el principio. Una sesión limpia revela dependencias invisibles.
El recorrido aplicado en este curso queda disponible como una secuencia reutilizable:
pregunta → pseudocódigo → proyecto → importación → exploración → filtro → recodificación → control → porcentaje → gráfico → interpretación
Para afianzar el proceso, elegí una variación de la pregunta original: cambiá el grupo de edad, reemplazá actividad por ocupación o compará otro nivel de agrupación educativa. Registrá la decisión en el pseudocódigo, adaptá el análisis y revisá cómo cambia la tabla y cuál de los dos gráficos comunica mejor el resultado.
Al terminar, escribí una breve nota que explique la modificación realizada, el principal resultado y el límite del análisis.