También podemos preguntar por texto
Para comparar texto usamos el operador de igualdad exacta == (doble signo igual):
carreras == "Sociología"
Vector: carreras <- c("Sociología", "Historia", "Sociología", "Antropología").
== evalúa igualdad; = se reserva para argumentos.
Comparar texto con `==` y seleccionar elementos de un vector categórico.
Esquema del curso
Tus primeros minutos con R
Has terminado los 8 ejercicios de este módulo.
Tu primera instrucción
Dos grupos respondieron una encuesta: uno aportó 18 respuestas y otro 12. R evalúa instrucciones y muestra el resultado en la consola.
Tu tarea
Coloca el cursor en la línea con
18 + 12, presiona Ctrl + Enter y observa el resultado30en la Consola R.Cómo trabajar
script.R.La instrucción ya está escrita en el editor. No necesitas calcular mentalmente ni modificar nada todavía.
Coloca el cursor al final o sobre la línea que contiene la operación
18 + 12.Usa Ctrl + Enter sobre
18 + 12y busca el resultado que aparece después de ejecutar en la consola.Cambia la respuesta
El segundo grupo actualizó su conteo a 15 respuestas. Al modificar una instrucción y reejecutarla, R recalcula el resultado.
Tu tarea
Cambia el segundo valor a
15en la suma y ejecuta para obtener el total actualizado.Solo cambió la cantidad del segundo grupo; el primer valor se mantiene idéntico.
Localiza el número
12en la suma original y reemplázalo por el nuevo conteo del segundo grupo.Modifica el segundo número en la instrucción del editor para que sume 15 y presiona Ctrl + Enter para recalcular.
Guardar para después
Para conservar un valor y reutilizarlo, lo guardamos en un objeto con
<-:respuestas <- 33La asignación guarda el valor sin imprimirlo. Para consultar su contenido, escribe el nombre del objeto:
respuestas.Tu tarea
respuestas.respuestaspara comprobar su contenido en la consola.Comprende la secuencia: primero guardas el valor en la memoria de R con un nombre, y luego consultas ese nombre para ver qué contiene.
La flecha
<-asigna el valor de la derecha al objeto de la izquierda. Escribir el nombre solo en una línea posterior muestra su contenido.Ejecuta primero la línea de asignación y a continuación ejecuta la línea con el nombre del objeto para verificar su contenido en la consola.
Crea un objeto tú
La encuesta recibió 18 respuestas de Sociología y 15 de Antropología. El primer objeto ya está creado:
respuestas_sociologia <- 18Tu tarea
Crea el objeto
respuestas_antropologiapara guardar las 15 respuestas. Luego consulta ambos objetos para comprobar sus valores.Necesitas almacenar el número de respuestas del segundo grupo bajo el nombre
respuestas_antropologia.Utiliza el operador de asignación
<-colocando el nombre a la izquierda y la cantidad a la derecha. Luego escribe el nombre de cada objeto en su propia línea para consultarlo.Guíate con esta estructura para asignar y luego consultar ambos nombres:
Reutiliza lo guardado
Los objetos guardados pueden reutilizarse en nuevas operaciones y almacenarse en otro objeto para continuar el análisis.
Tu tarea
Crea
total_respuestassumandorespuestas_sociologiayrespuestas_antropologia. Luego consúltalo.Los datos que necesitas sumar ya están almacenados en objetos existentes. No debes volver a escribir los números crudos
18ni15.Puedes usar los nombres de los objetos a ambos lados del operador
+para sumar sus valores y guardar el resultado entotal_respuestasusando<-.Organiza la suma de objetos y su consulta con este esquema:
Número o texto
Los objetos guardan distintos tipos de información:
Números: van sin comillas (
20).Texto: va entre comillas (
"Historia").Tu tarea
Asigna
21aedady"Sociología"acarrera. Luego consulta ambos objetos.Para cada dato, evalúa si representa una cantidad que permite operaciones matemáticas o un texto descriptivo.
En R, los números se escriben directamente sin comillas, mientras que cualquier palabra o categoría de texto debe ir entre comillas dobles.
Estructura las dos asignaciones y sus consultas, recordando las comillas solo para el texto:
Lee el error antes de corregir
Los errores en R son mensajes informativos, no fallas permanentes. Aquí intentamos sumar un número con un texto:
18 + "15"R no puede operar matemáticamente con texto entre comillas.
Tu tarea
Corrige
respuestas_antropologiaquitando las comillas para guardarlo como número. Luego ejecuta la suma para calculartotal_respuestas.Observa el mensaje de error: R te advierte que no puede aplicar una operación matemática (
+) a un argumento que no es numérico.Revisa cómo está guardado
respuestas_antropologia. Las comillas hacen que R lo interprete como texto y no como un número operable.Retira las comillas del valor de
respuestas_antropologiapara que sea un número. Vuelve a ejecutar la asignación y la suma, y consultatotal_respuestasen la última línea.Encuesta piloto
Una encuesta piloto llamada “Encuesta de vida universitaria” recibió 14 respuestas de Sociología y 11 de Antropología.
Tu tarea
Construye un script autónomo que:
estudio.respuestas_sociologia(14) yrespuestas_antropologia(11).total_respuestasy consúltalo.Descompón el ejercicio en etapas: identificar el nombre del estudio (texto), registrar las respuestas de cada disciplina (números) y calcular el total reutilizando los objetos.
Crea cada objeto usando
<-. Recuerda entrecomillar el texto del estudio y mantener los conteos como números. Luego suma los dos objetos de conteo para obtenertotal_respuestas.Organiza el script siguiendo esta secuencia con marcadores:
De uno a varios
Para guardar varios valores juntos en un solo objeto usamos un vector mediante
c():tiempos_viaje <- c(25, 40, 35, 50, 30)c()combina los valores conservando su orden (1°: 25, 2°: 40, 3°: 35, etc.).Tu tarea
Ejecuta la asignación de
tiempos_viajey consúltalo para observar los cinco valores ordenados dentro del vector.Un vector permite almacenar múltiples observaciones de una misma característica bajo un único nombre, conservando su orden.
La función
c()combina los valores separados por comas. El resultado se asigna al objeto con<-.Ejecuta primero la línea de asignación con
c()para crear el vector en el entorno y luego ejecuta la línea con el nombretiempos_viajepara inspeccionar sus elementos.Tu primer vector
Cinco personas informaron estos tiempos de viaje en minutos: 20, 35, 45, 25 y 30, en ese orden.
Tu tarea
Reúne los cinco tiempos en un solo vector usando
c(), guárdalo entiempos_viajey consúltalo.Para guardar las cinco observaciones juntas necesitas combinarlas en un solo vector en el orden en que fueron informadas.
Asigna a
tiempos_viajeel resultado de la funciónc(), colocando los cinco tiempos dentro de los paréntesis separados por comas.Estructura la creación del vector y su consulta:
Usa todos los valores juntos
Las funciones en R reciben datos entre paréntesis y devuelven un resultado:
sum(respuestas_diarias)sum()recibe un vector completo y suma todos sus elementos.Datos de la semana:
respuestas_diarias <- c(18, 22, 15, 25, 20).Tu tarea
Aplica la función
sum()sobrerespuestas_diariaspara calcular el total acumulado y guárdalo entotal_respuestas.Los valores ya están dentro del vector
respuestas_diarias. No debes sumarlos uno a uno con+.Pasa el vector completo como argumento dentro de la función
sum()y asigna ese resultado atotal_respuestas.Estructura la función de resumen y consulta el total:
¿Qué hay en esta posición?
Para recuperar un valor según su posición usamos corchetes
[]. En R las posiciones comienzan en 1:tiempos_viaje[3]recupera el tercer valor (35), no el número 3.Vector observado:
tiempos_viaje <- c(25, 40, 35, 50, 30).Tu tarea
Usa corchetes de posición para extraer el tercer valor de
tiempos_viaje.En R las posiciones de un vector se numeran secuencialmente desde el 1 (primera posición = 1, segunda = 2, tercera = 3).
Para acceder a un elemento por su índice, escribe el nombre del vector seguido inmediatamente por corchetes
[]con el número de posición dentro.Escribe la expresión de indexación usando corchetes:
Más de una posición
Para recuperar varias posiciones pasamos un vector dentro de los corchetes:
tiempos_viaje[c(2, 5)]Extrae los valores de las posiciones 2 y 5 (
40y30).Tu tarea
Usa corchetes y
c()para seleccionar simultáneamente los tiempos de las posiciones 2 y 5 entiempos_viaje.Para extraer varias observaciones simultáneamente, debes indicarle a los corchetes un conjunto ordenado de posiciones.
Dentro de los corchetes
[], usa la funciónc()para reunir los números de las posiciones que deseas conservar.Estructura la selección múltiple con corchetes y un vector de índices:
Vuelve a usar lo aprendido
Cinco estudiantes informaron que estudiaron 2, 4, 3, 5 y 1 horas, en ese orden.
Tu tarea
horas_estudio.total.cuarta.Divide la tarea en tres pasos independientes: primero agrupar las horas en un vector, segundo sintetizar todas las horas con una función de suma, y tercero aislar una sola observación según su índice.
Usa
c()para crearhoras_estudio, luego aplicasum()sobre ese vector paratotal, y finalmente usa corchetes sobrehoras_estudioindicando el índice de la cuarta persona.Sigue este esquema para las tres instrucciones:
Encuentra la información que piden
Durante cinco semanas se registraron estas participaciones: 3, 1, 4, 2 y 5, en ese orden.
Tu tarea
participacion.sum()y guárdalo entotal.seleccion.Distingue cuándo una operación procesa la totalidad del vector (como calcular el total) y cuándo requiere seleccionar un subconjunto de posiciones específicas.
Crea
participacionconc(), calculatotalconsum(participacion)y paraseleccionindexa el vector pasando un vector de posicionesc(...)dentro de corchetes.Completa la estructura del análisis:
De posiciones a preguntas
Hasta ahora buscabas valores por su posición. Con R también podemos formular preguntas de comparación sobre los datos:
35 > 30→TRUE25 > 30→FALSE>se lee “es mayor que”.TRUEindica que la afirmación se cumple;FALSE, que no se cumple. Ambos son valores lógicos producidos por R al evaluar la pregunta.Tu tarea
Ejecuta las dos comparaciones en el editor y comprueba cómo responde R con
TRUEyFALSEen la consola.En lugar de buscar por ubicación fija, formulamos preguntas lógicas para evaluar si una condición se cumple (
TRUE) o no (FALSE).El operador
>compara los valores a ambos lados. Ejecuta cada comparación y observa qué responde R en la consola.Presiona Ctrl + Enter en cada línea para comparar las respuestas lógicas emitidas por R.
Pregunta a todos los valores
Al comparar un vector con un valor, R evalúa la condición elemento por elemento en el mismo orden:
tiempos_viaje > 30Vector:
c(25, 40, 35, 50, 30).Tu tarea
Pregunta cuáles tiempos en
tiempos_viajesuperan los 30 minutos usando el operador>.Cuando aplicas una comparación a un vector completo, R evalúa la regla caso a caso y devuelve un vector de respuestas lógicas con el mismo largo.
Escribe el nombre del vector seguido del operador mayor que y el umbral de 30 minutos.
Formula la comparación directa sobre el vector:
tiempos_viaje > UMBRAL_COMPARACION.Guarda las respuestas
El resultado de una comparación es un vector lógico que podemos guardar en un objeto para reutilizarlo:
supera_30 <- tiempos_viaje > 30Guarda la respuesta lógica (
TRUE/FALSE) de cada posición.Tu tarea
Evalúa qué tiempos son mayores a 30, guarda el vector lógico resultante en
supera_30y consúltalo.El vector de
TRUEyFALSEque produjo la comparación puede guardarse en un objeto para reutilizarlo como filtro posterior.Asigna la expresión comparativa al objeto
supera_30usando<-.Estructura la asignación y la consulta de la condición lógica:
TRUE conserva
Cuando pasamos un vector de
TRUEyFALSEdentro de los corchetes[], R conserva las posiciones donde hayTRUEy descarta las posiciones donde hayFALSE:tiempos_viaje[supera_30]Tu tarea
Usa el vector lógico
supera_30dentro de los corchetes para seleccionar los tiempos mayores a 30 entiempos_viaje.Al poner un vector lógico dentro de corchetes, R conserva únicamente las observaciones donde la condición fue
TRUEy descarta losFALSE.Coloca el nombre del objeto que contiene los
TRUEyFALSEdentro de los corchetes del vector de datos.Indexa el vector original usando el objeto lógico:
tiempos_viaje[VECTOR_LOGICO].Selecciona tú
Podemos escribir la condición directamente dentro de los corchetes en un solo paso:
vector[vector > valor]Vector observado:
horas_estudio <- c(2, 5, 3, 6, 4).Tu tarea
Filtra en un solo paso las observaciones de
horas_estudioque sean mayores a 4 usando corchetes.No es obligatorio crear un objeto intermedio para guardar los
TRUEyFALSE: puedes escribir la pregunta de comparación directamente dentro de los corchetes.Dentro de los corchetes de
horas_estudio, escribe la condición que compara si cada valor dehoras_estudioes mayor a 4 usando>.Estructura la selección directa en una sola línea:
También podemos preguntar por texto
Para comparar texto usamos el operador de igualdad exacta
==(doble signo igual):carreras == "Sociología"Vector:
carreras <- c("Sociología", "Historia", "Sociología", "Antropología").==evalúa igualdad;=se reserva para argumentos.Tu tarea
carrerasson iguales a"Sociología"y guarda la respuesta enes_sociologia.es_sociologiadentro de corchetes para seleccionar únicamente esas carreras decarreras.Para consultar si un elemento coincide exactamente con una categoría textual usamos el operador de igualdad
==(dos signos igual seguidos).Compara
carreras == "Sociología"respetando las comillas en el texto y guarda el resultado enes_sociologia. Luego pasa ese vector lógico dentro de corchetes acarreras.Estructura la evaluación y el filtrado por texto:
Checkpoint A: encuentra lo que buscas
Se registraron las sesiones de estudio de cinco estudiantes: 6, 12, 8, 15 y 10 sesiones.
Tu tarea
sesiones.mas_de_ochopreguntando qué sesiones superan 8.mas_de_ochopara seleccionar las sesiones correspondientes y guárdalas enseleccionadas.Recupera el flujo metodológico: registrar los casos observados, construir el criterio sustantivo de corte y utilizar ese criterio para aislar la submuestra de interés.
Usa
c()para crearsesiones. Luego formula la pregunta lógica comparando sisesionessupera 8 y guárdala enmas_de_ocho. Por último, usa corchetes sobresesionescon esa condición y almacénalo enseleccionadas.Organiza las tres etapas del checkpoint:
Varias características de las mismas personas
Una fila reúne la información de una persona. Una columna reúne los valores de una misma característica (por ejemplo, la edad).
En análisis de datos, solemos llamar caso a cada fila y variable a cada columna.
En R, una tabla que organiza casos y variables se llama data frame:
Tu tarea
Observa la tabla en el panel izquierdo y guarda en
edad_persona_2la edad de la persona que estudia 5 horas (Persona 2).Una base de datos tabular organiza los datos de forma que cada fila corresponde a un caso o individuo y cada columna a una característica observada.
Para encontrar la edad de quien estudia 5 horas, busca en la tabla de
encuesta_social_demola fila dondehoras_estudioes 5. Luego revisa el número correspondiente en la columnaedad.Identifica visualmente el valor en la fila correspondiente y asígnalo al objeto pedido:
Lee una fila y una columna
Al leer una base de datos:
Una fila recorre un mismo caso (una persona) y muestra todas sus características.
Una columna recorre una misma variable para todos los casos, funcionando como un vector.
Aquí tienes la encuesta de cuatro personas:
Tu tarea
Mirando la tabla en el panel izquierdo:
edades_encuestacomo un vector.horas_encuestacomo un vector.Pregunta si la consigna mantiene fija a la persona o a la característica.
Una fila mantiene fijo el caso; una columna mantiene fija la variable.
Para una persona concreta lee horizontalmente toda su fila. Para una variable como edad, lee verticalmente completa la columna correspondiente y reúne sus números con
c().Mira los primeros casos
Una base de datos real puede contener miles de filas. Para obtener un vistazo inicial sin imprimirla completa usamos
head():head(encuesta_social_demo)Por defecto,
head()muestra las primeras 6 filas de la base.Tu tarea
head(encuesta_social_demo)para ver las primeras filas en la consola.filas_visibles.Necesitas mirar el comienzo de la base, no modificarla.
head()recibe dentro de los paréntesis el objeto data frame que quieres inspeccionar.Ejecuta la función sobre la base de datos y cuenta cuántas filas numéricas imprimió R en la consola:
Una variable dentro de la base
Para pedirle a R una columna completa de la base usamos el operador
$:base$variable.Por ejemplo:
encuesta_social_demo$edadrecupera todas las edades como un vector.
Esta es una muestra de las primeras filas de
encuesta_social_demo:Tu tarea
Siguiendo el ejemplo anterior:
horas_estudiodeencuesta_social_demo.carreradeencuesta_social_demo.Para extraer una columna completa de una base de datos y trabajarla como vector, usamos el operador
$.La sintaxis conecta el nombre del data frame a la izquierda y el nombre de la variable a la derecha:
base$columna.Estructura la extracción para cada una de las dos variables solicitadas:
¿Qué contiene la base?
str()da una radiografía rápida de una base: cantidad de filas, columnas, nombres y tipo de almacenamiento técnico (num,chr, etc.):str(encuesta_social_demo)No necesitas memorizar los códigos técnicos. Lo fundamental es que
str()te ayuda a conocer qué variables existen en la base antes de analizarlas.Tu tarea
str(encuesta_social_demo)para ver sus variables en la consola.trabaja), extráela con$y guárdala ensituacion_laboral.Busca los nombres de las columnas dentro de la salida que entrega
str().No necesitas interpretar las abreviaciones técnicas de tipos para responder; localiza el nombre de la variable laboral y conéctala con
$a la base.Inspecciona la estructura en la consola y luego extrae la columna indicada:
Otra encuesta
Dispones de una base sobre movilidad llamada
encuesta_barrio:Tu tarea
Usando lo aprendido en el módulo:
minutos_viajedeencuesta_barrioy guárdala entiempos.transportedeencuesta_barrioy guárdala enmedios.Aplica el operador
$a la nueva base de datos para recuperar cada característica como un vector independiente.Asigna a
tiemposla columnaminutos_viajey amediosla columnatransportedeencuesta_barrio.Sigue esta estructura para almacenar las variables en nuevos objetos:
Vuelve a hacer una pregunta
En el Módulo 3 hicimos preguntas a vectores. En el Módulo 4 aprendimos que una columna de una base se extrae como un vector con
$. Ahora juntamos ambas ideas para formular preguntas sobre una base.Base disponible
encuesta_social_demo:Tu tarea
Formula una pregunta lógica con el operador
$y>para saber qué edades enencuesta_social_demoson mayores a 21.Para consultar si los casos de una base cumplen una condición, primero debes acceder a la columna como vector mediante
$.Escribe el nombre de la base, el operador
$y la variableedad, seguida del operador mayor que y el umbral 20.Formula la comparación sobre la columna:
De TRUE/FALSE a personas completas
Al evaluar una condición en una tabla, cada respuesta
TRUEpuede conservar la fila completa con todas sus variables:mayores_21 <- encuesta_social_demo$edad > 21encuesta_social_demo[mayores_21, ]La coma
,después de la condición indica a R que conserve todas las columnas de esas personas.Tu tarea
mayores_21la condición que identifica a quienes tienen más de 21 años.encuesta_social_demo[mayores_21, ]para observar las personas completas conservadas.El vector de
TRUEyFALSEque creaste en el paso 1 puede colocarse antes de la coma para seleccionar filas.La coma dentro de
[,]es fundamental: indica que estás filtrando filas (antes de la coma) y conservando todas las columnas (después de la coma).Puedes probar primero con un vector manual para observar cómo funciona la selección de filas:
Una forma más legible de filtrar
La función
filter()del paquetedplyrsimplifica el filtrado de casos:filter(base, condicion)Dentro de
filter()escribimos directamente el nombre de la variable sin repetirbase$.Tu tarea
Usa
filter()sobreencuesta_social_demopara conservar únicamente a las personas que dedican más de 3 horas de estudio.filter()evalúa una condición lógica directamente sobre las filas de una base y conserva solo los casos donde esa condición esTRUE.El primer argumento de
filter()es la base de datos y el segundo es la condición de comparación sobre la variable de interés.Estructura la función indicando la base y la condición requerida:
Filtra otro grupo
Para filtrar por una categoría de texto usamos
==con el valor exacto entre comillas:filter(base, variable == "Categoría")Tu tarea
Aplica
filter()para conservar únicamente a las personas cuya carrera sea"Sociología".Para filtrar filas por una categoría textual, la condición debe comparar la columna con el valor exacto entre comillas usando
==.La primera línea evalúa la condición sobre el vector (
base$columna == "..."); la segunda línea pasa la base y esa regla dentro defilter().Estructura la condición y el filtrado por categoría:
Los datos pasan a la siguiente acción
El operador pipe
|>pasa los datos de una etapa a la siguiente:base |> filter(condicion)Permite leer las transformaciones de izquierda a derecha sin modificar la base original guardada en memoria.
Tu tarea
Encadena
encuesta_social_democon el pipe|>haciafilter()para conservar a quienes trabajan (trabaja == "Sí").Parte desde la base de datos que quieres enviar a la siguiente acción.
|>puede leerse como ‘pasa este resultado a la siguiente operación’. La función que recibe los datos ya no necesita que repitas el nombre de la base.Organiza el encadenamiento desde la base hacia el filtro:
Qué variables necesito
Mientras
filter()elige casos (filas),select()elige variables (columnas) por su nombre:filter(edad > 20)→ conserva filasselect(edad, carrera)→ conserva columnasTu tarea
Usa
select()sobreencuesta_social_demopara conservar únicamente las variablesedadycarrera.Mientras
filter()escoge qué personas (filas) permanecen,select()escoge qué características (columnas) te interesa conservar.Pasa la base como primer argumento de
select()y luego escribe los nombres de las variables que necesitas separados por comas y sin comillas.Estructura la selección de columnas:
Filtra y después selecciona
El pipe permite encadenar múltiples decisiones en un flujo de lectura continuo:
Tu tarea
Construye un pipeline con
|>que primero filtre a las personas que trabajan (trabaja == "Sí") y luego seleccione las variablesedadycarrera.El pipe permite construir un flujo analítico legible: primero defines qué subpoblación estudiar y luego qué variables conservar de ella.
Inicia con
encuesta_social_demo, usa|>para aplicarfilter()con la condición laboral (trabaja == "Sí"), y vuelve a encadenar con|>haciaselect()con las variables requeridas.Organiza el flujo de dos transformaciones:
Checkpoint B: prepara los datos
Checkpoint B — Bases y preparación
Para una investigación social necesitamos trabajar con las personas que estudian en
encuesta_jovenes. De ellas necesitamos su edad y comuna:Tu tarea
Construye un flujo con
|>que filtre a quienes estudian, seleccione las variablesedadycomuna, y guarde el resultado endatos_preparados.Un procedimiento de preparación de datos parte desde la fuente bruta, aísla el universo de estudio pertinente y descarta las variables no analíticas.
Asigna el resultado a
datos_preparados. Comienza el pipe desdeencuesta_jovenes, filtra por quienes estudian con== "Sí"y selecciona las dos columnas solicitadas.Estructura el pipeline de preparación asignado:
El valor que no está
En encuestas sociales es común que algunas personas no respondan. En R, la ausencia de información se representa con
NA(sin comillas):0: es un valor observado (reportó cero horas).NA: el dato no está disponible (desconocido).Vector disponible:
horas_cuidado <- c(6, 0, NA, 8, 4).Tu tarea
Ejecuta
horas_cuidadoy observa en la consola la diferencia entre el valor observado0y el dato ausenteNA.En R los datos que no fueron registrados o que las personas no respondieron se representan con el valor especial
NA.Ejecuta el nombre del vector para inspeccionar cómo aparecen representados los datos ausentes en la consola.
Escribe el nombre del objeto que contiene el registro de cuidados para observar sus valores:
NOMBRE_DEL_VECTOR.¿Dónde falta información?
Para detectar datos ausentes usamos
is.na(). DevuelveTRUEdonde falta información yFALSEdonde hay un valor disponible:is.na(c(6, 0, NA))→FALSE, FALSE, TRUEVector:
horas_cuidado <- c(6, 0, NA, 8, 4).Tu tarea
Aplica
is.na()sobrehoras_cuidadopara identificar qué posiciones contienen datos ausentes.No podemos preguntar
vector == NAporque la comparación no está definida. Para detectar ausencias usamos una función especializada.La función
is.na()evalúa cada observación y devuelveTRUEsi el dato falta yFALSEsi está presente.Pasa el vector de interés dentro de la función evaluadora:
is.na(VECTOR_A_EVALUAR).¿Cuántos faltan y cuántos quedan?
En operaciones aritméticas, R trata a
TRUEcomo 1 y aFALSEcomo 0. Por eso podemos contar cuántos datos faltan sumando los valores lógicos:sum(is.na(horas_cuidado))Si restamos las ausencias al total de 5 personas, obtenemos el tamaño muestral efectivo disponible (Ndisponible):
disponibles <- 5 - faltanVector:
horas_cuidado <- c(6, 0, NA, 8, 4).Tu tarea
horas_cuidadoy guarda el resultado enfaltan.faltanal total de 5 personas y guárdalo endisponibles.Dado que
TRUEequivale aritméticamente a 1, sumar un vector lógico cuenta cuántas ausencias existen. La diferencia respecto del largo total indica cuántos casos quedan disponibles.Aplica
sum()sobreis.na(horas_cuidado)parafaltan. Luego resta ese valor a la cantidad total de casos del vector.Estructura el balance de casos ausentes y disponibles:
Calcular con los datos disponibles
Si intentamos sumar
horas_cuidado, R responderá conNAporque desconoce el valor de la persona 3. Esto no es un error: R razona con prudencia. Para pedirle que calcule usando únicamente los valores observados, usamosna.rm = TRUE:sum(horas_cuidado, na.rm = TRUE)Vector:
horas_cuidado <- c(6, 0, NA, 8, 4).Tu tarea
Suma únicamente las horas de cuidado observadas usando
sum()con el argumentona.rm = TRUE.Por defecto, R devuelve
NAsi intentas calcular una suma o promedio sobre datos con ausencias, advirtiendo que el total exacto es desconocido.Para calcular sobre las observaciones que sí tienen dato registrado, debes indicarle a la función que remueva los valores ausentes durante la operación.
Añade el argumento de remoción de valores ausentes dentro de la función de suma:
sum(VECTOR, na.rm = TRUE).Casos completos e incompletos
Un caso completo es una persona que tiene información registrada en todas las variables analizadas. La función
complete.cases()evalúa cada fila y devuelveTRUEsi no tiene ningúnNA, yFALSEsi falta algún dato:Tabla disponible
registro_cuidado.Tu tarea
complete.cases(registro_cuidado)para identificar qué filas tienen información completa.sum()ycomplete.cases().En una tabla con varias variables, un caso es completo solo si todas sus columnas tienen información válida.
La función
complete.cases()evalúa cada fila del data frame. Sumar su resultado consum()cuenta cuántas filas no tienen ningúnNA.Evalúa primero el vector lógico de casos completos y luego obtén el total:
Diagnosticar antes de analizar
Antes de analizar un subgrupo debemos aislar las observaciones pertinentes y verificar la integridad de sus datos. Queremos estudiar
edadyhoras_cuidadoentre quienes trabajan (trabaja == "Sí"):Base disponible
encuesta_social_demo.Tu tarea
trabaja == "Sí") y selecciona las columnasedadyhoras_cuidado, guardando el resultado endatos_trabajan.datos_trabajanusandosum()ycomplete.cases().Antes de correr un análisis sobre un subgrupo, debes aislar las observaciones pertinentes y verificar cuántos casos aportan información válida simultánea en todas las variables.
Filtra
encuesta_social_demoportrabaja == "Sí", seleccionaedadyhoras_cuidado, y asigna adatos_trabajan. Luego aplicasum(complete.cases(...))sobre esa subbase.Estructura la preparación y la verificación de integridad:
Checkpoint B: Decidir frente a datos ausentes
Llegaste al desafío final del módulo. Ahora resolverás de forma autónoma, sin nombres de funciones en la consigna.
En
encuesta_vecinalqueremos estudiar la asistencia a reuniones comunitarias (reuniones). Hay 6 vecinos en la muestra.Realiza las siguientes acciones:
reuniones.Observa cuántos casos entraron al cálculo final.
Tu tarea
encuesta_vecinal$reuniones.sum()conna.rm = TRUE.En investigación social, un reporte transparente exige documentar cuántas personas no respondieron y proceder al cálculo descriptivo únicamente con los datos válidos.
Primero cuenta cuántos valores ausentes existen en la columna evaluada con
sum(is.na(...)). Luego ejecuta la suma de esa misma columna agregandona.rm = TRUE.Estructura ambas instrucciones sobre la variable:
¿Cantidad o categoría?
Para elegir el análisis correcto debemos distinguir dos tipos de información:
Categoría: nombres, grupos o etiquetas (ej. carrera, zona).
Cantidad: mediciones numéricas donde tiene sentido sumar o promediar (ej. horas, edad).
Tu tarea
Clasifica cada variable asignando
"categoria"o"cantidad"atipo_carrera,tipo_horasytipo_zona_codigo.Pregunta qué significa cada valor para una persona.
¿El valor indica cuánto tiene el caso o a qué grupo pertenece?
Si una columna clasifica a los individuos en grupos o categorías (incluso usando códigos numéricos), trátala como categoría; si mide una magnitud continua, es cantidad.
¿Cuántas personas respondieron cada cosa?
Para resumir una variable categórica contamos cuántos casos hay en cada grupo mediante una tabla de frecuencias:
table(base$variable)Tu tarea
Construye la tabla de frecuencias de la variable
carreraenencuesta_social_demoy guárdala entabla_carrera.Para resumir una variable cualitativa no calculamos promedios: contamos cuántos individuos corresponden a cada una de las opciones posibles.
La función
table()recibe un vector o columna y devuelve el conteo por categoría. Guarda la tabla entabla_carreray consúltala.Estructura la creación de la tabla y su consulta:
Del conteo a la proporción
Para saber qué fracción del total representa cada categoría convertimos la tabla en proporciones con
prop.table():prop.table(tabla)Cada valor va de 0 a 1 y todas las celdas suman 1.0.
Tu tarea
Aplica
prop.table()atabla_carrerapara calcular la proporción de estudiantes en cada disciplina.Las frecuencias absolutas dependen del tamaño de la muestra; para comparar grupos o interpretar pesos relativos transformamos los conteos en proporciones respecto del total.
La función
prop.table()toma una tabla de frecuencias existente y divide cada casilla por la suma total de casos.Pasa la tabla construida en el ejercicio previo a la función de proporciones:
Cuenta no es lo mismo que porcentaje
Para facilitar la comunicación social, multiplicamos las proporciones por 100 y obtenemos porcentajes directos:
prop.table(tabla) * 100Tu tarea
tabla_carrerael conteo de frecuencias decarrera.Asegúrate de distinguir conteo absoluto (número de personas) de distribución relativa (peso de cada grupo sobre el 100%).
Primero genera la tabla de frecuencias de la variable
carreray asígnala atabla_carrera. Luego pasa esa tabla aprop.table() * 100.Organiza ambos pasos analíticos:
Ver la distribución
Un gráfico de barras muestra visualmente la distribución de una variable categórica:
barplot(tabla)Cada barra representa una categoría y su altura refleja la frecuencia observada.
Tu tarea
Genera el gráfico de barras de
tabla_carrerausando la funciónbarplot().Un gráfico de barras representa visualmente la altura de cada categoría proporcional a su frecuencia en la muestra.
barplot()no recibe la variable cruda directamente, sino la tabla de frecuencias que resume los conteos por grupo.Genera la visualización pasando la tabla creada:
Describe otra variable categórica
En
encuesta_campusregistramos el medio de transporte que utilizan ocho estudiantes para llegar a la universidad:Tu tarea
encuesta_campusy guárdalos entabla_transporte.tabla_transportey calcula sus proporciones conprop.table().Para describir una nueva variable cualitativa en un campus o comunidad, se sigue la misma secuencia: tabla de conteos absolutos y luego cálculo de proporciones.
Extrae la columna correspondiente de
encuesta_campususando$, pásala atable()y guárdala entabla_transporte. Luego aplicaprop.table()sobre esa tabla.Estructura las operaciones de frecuencia y proporción:
Mira la distribución
Para explorar una variable cuantitativa observamos cómo se reparten sus valores mediante un histograma:
hist(base$variable)El eje horizontal muestra intervalos continuos y la altura de cada barra refleja cuántos casos caen en ese rango.
Tu tarea
Genera un histograma de la variable
horas_estudioenencuesta_social_demousandohist().A diferencia de las barras para categorías, una variable numérica continua se visualiza agrupando sus valores en intervalos continuos mediante un histograma.
La función
hist()recibe la columna numérica extraída de la base con$.Genera el histograma indicando la base y la variable numérica:
¿Dónde está el centro?
La media resume el centro repartiendo la suma total de valores por igual entre todos los casos:
mean(base$variable)Se expresa en la misma unidad de medida (horas de estudio).
Tu tarea
Calcula la media de
horas_estudioenencuesta_social_demousando la funciónmean().La media aritmética representa el punto de equilibrio o centro de masa de una distribución cuantitativa.
Pasa la columna numérica a la función
mean()usando el operador$.Calcula el centro de la variable:
Otro centro posible
La mediana es el valor que ocupa la posición central una vez ordenados los datos de menor a mayor:
median(vector)Deja exactamente el 50% de las observaciones por debajo y el 50% por encima.
Tiempos registrados:
minutos_lectura <- c(15, 20, 25, 30, 45, 60, 120).Tu tarea
Calcula la mediana de
minutos_lecturausando la funciónmedian().La mediana divide a la distribución ordenada exactamente en dos mitades (50% de las observaciones por debajo y 50% por encima).
Aplica la función
median()sobre la misma columna numérica que utilizaste para la media.Calcula la mediana pasando la columna con
$:median(BASE$COLUMNA).¿Cuál centro describe mejor?
Compara dos grupos donde solo cambia un valor extremo:
viaje_regular: 20, 22, 24, 25, 26, 28, 30viaje_extremo: 20, 22, 24, 25, 26, 28, 120La media es sensible a valores extremos, mientras que la mediana es resistente (robusta).
Tu tarea
viaje_regular.viaje_extremoy observa cómo la media se distorsiona mientras la mediana permanece estable.Cuando una distribución tiene un valor extremo alejado, la media se ve arrastrada hacia ese extremo mientras que la mediana permanece robusta.
Aplica
mean()ymedian()sobreviaje_regulary luego sobreviaje_extremopara contrastar el comportamiento de ambos centros.Aplica ambas medidas de centro (
meanymedian) a cada uno de los dos vectores:¿Qué tan distintos son los valores?
Dos grupos pueden tener la misma media pero comportarse muy diferente. La desviación estándar mide qué tan dispersos están los datos respecto a su media:
sd(vector)Tu tarea
Observa la dispersión en los grupos de prueba y calcula la desviación estándar de
horas_estudioenencuesta_social_demousandosd().Para conocer una variable no basta el centro: necesitamos medir qué tan dispersos o concentrados están los datos respecto a esa media.
Usa
sd()sobre la variable para la desviación estándar. Para la amplitud total, calcula la diferencia de sus extremos condiff(range(...)).Estructura ambas métricas de dispersión sobre la columna:
Primero prepara, después describe
En investigación preparamos los datos antes de describirlos. Queremos analizar las horas de cuidado de las personas que no trabajan (
trabaja == "No"):Tu tarea
datos_no_trabajan, filtra a las personas que no trabajan (trabaja == "No") y conserva las columnasidyhoras_cuidado.horas_cuidadoconsum(is.na()).horas_cuidadosobre los valores disponibles usandona.rm = TRUE.En investigación social diagnosticamos los valores ausentes antes de resumir cantidades para distinguir con claridad el total de personas (N total = 4) de los datos efectivamente disponibles (N disponible = 3).
Filtra
encuesta_social_democontrabaja == "No"y seleccionaidyhoras_cuidado. Para diagnosticar missing usasum(is.na(datos_no_trabajan$horas_cuidado)), y luego calculamean()ysd()agregandona.rm = TRUE.Sigue esta estructura de preparación, diagnóstico y descriptivos:
Checkpoint C: describe una variable nueva
Checkpoint C — Describir una variable cuantitativa
Describe la variable
minutos_viajedeencuesta_movilidad. Nota que el caso 10 demoró 90 minutos por una contingencia:Tu tarea
Describe completamente
minutos_viajeenencuesta_movilidad: calcula su media, su mediana y su desviación estándar.Integra el protocolo descriptivo completo: primero remover observaciones inválidas o ausentes y luego computar el conjunto de estadísticos de centro y dispersión.
Filtra los valores no ausentes de la columna
horasusando corchetes y!is.na()enhoras_limpias. Luego calculamean(),median()ysd()sobre ese vector depurado.Organiza el script del checkpoint:
Dos valores de la misma persona
Para analizar si dos cantidades se relacionan, debemos observar ambos valores en la misma persona.
Fila 3 de
encuesta_social: 3 horas de estudio y puntaje 58 en métodos.Tu tarea
Guarda en
par_persona_3el vectorc(x, y)con las horas de estudio (3) y el puntaje (58) de la persona 3.Pregunta si los dos valores provienen de la misma persona o de personas distintas.
Al relacionar dos cantidades, cada punto o comparación requiere mantener fijo al caso.
Observa cómo la misma persona combina simultáneamente una edad y una cantidad de horas de estudio en la tabla.
Cada persona se vuelve un punto
En un gráfico de dispersión (scatterplot) cada persona se representa como un punto en el plano:
plot(base$variable_x, base$variable_y)Base
encuesta_social(12 casos):Tu tarea
Genera el gráfico de dispersión con
plot()ubicandohoras_estudioen el eje horizontal ypuntaje_metodosen el eje vertical.Un diagrama de dispersión mapea a cada individuo como una coordenada
(x, y)en un plano cartesiano para observar si existe un patrón conjunto.La función
plot()recibe primero la variable que va en el eje horizontal (X) y luego la que va en el eje vertical (Y), separadas por coma.Pasa ambas columnas a la función gráfica:
¿Hacia dónde va la relación?
La dirección de una relación describe cómo varía una cantidad cuando la otra aumenta:
Positiva: a mayor X, mayor Y (asciende de izquierda a derecha).
Negativa: a mayor X, menor Y (desciende de izquierda a derecha).
Sin dirección clara: la nube de puntos no muestra una tendencia ascendente ni descendente definida.
Nota fundamental: Asociación empírica no demuestra causalidad.
Tu tarea
Observa los tres gráficos del panel. Asigna
"positiva","negativa"o"sin_direccion"a cada objeto:direccion_a,direccion_bydireccion_c.Observa la trayectoria general de los puntos al recorrer el gráfico de izquierda a derecha.
Si a mayores valores de X corresponden mayores valores de Y, la relación es positiva; si los valores de Y descienden, es negativa.
Traza mentalmente una línea que resuma la nube de puntos y evalúa hacia dónde apunta su pendiente.
No basta con la dirección
Dos relaciones pueden ir en la misma dirección pero exhibir diferente dispersión alrededor de una trayectoria.
Tu tarea
Observa los gráficos A y B. Asigna
"A"o"B"agrafico_mas_concentradosegún cuál muestra los puntos más alineados.La dirección indica hacia dónde va el patrón; la fuerza indica qué tan alineados o dispersos están los puntos alrededor de esa tendencia.
Puntos muy concentrados a lo largo de una línea reflejan una relación fuerte; puntos muy dispersos indican una relación débil.
Compara la cercanía de los puntos entre los distintos gráficos para determinar cuál presenta menor dispersión.
Resume el patrón con un número
El coeficiente de correlación de Pearson (r) resume la fuerza y dirección de una relación lineal en un número entre -1 y +1:
cor(base$x, base$y)Cercano a +1 indica fuerte relación positiva; cercano a 0, ausencia de relación lineal.
Base
encuesta_socialdisponible.Tu tarea
Calcula el coeficiente de correlación de Pearson entre
horas_estudioypuntaje_metodosenencuesta_socialusandocor().El coeficiente de correlación de Pearson cuantifica en un único valor entre -1 y +1 la dirección y fuerza de la asociación lineal observada en el gráfico.
Usa la función
cor()pasando las dos columnas numéricas de la base en el mismo orden que utilizaste para graficar.Calcula el coeficiente entre ambas variables:
Prepara los pares antes de correlacionar
Entre las personas que trabajan, queremos estudiar cómo se relacionan las horas de trabajo semanal y las horas de sueño. En
encuesta_social(12 casos), aislamos a quienes trabajan (trabaja == "Sí"):Tu tarea
datos_trabajanfiltrando a quienes trabajan (trabaja == "Sí") y seleccionandoid,horas_trabajoyhoras_sueno.sum(is.na())y genera el gráfico de dispersión conplot().cor(..., use = "complete.obs").Para correlacionar un subgrupo específico con valores ausentes, prepara los datos con
filter()yselect(), diagnostica los pares disponibles y especificause = "complete.obs"encor().Usa
filter()sobreencuesta_socialpara aislar a quienes trabajan conhoras_trabajoyhoras_sueno. Luego genera el gráfico conplot()y calcula la correlación concor(..., use = "complete.obs").Asegúrate de que el gráfico y la correlación usen las variables del objeto filtrado con pares completos:
Otra pregunta, otra base
En
encuesta_lecturaregistramos los minutos dedicados a leer y el puntaje de comprensión de 10 participantes:Tu tarea
plot()entre minutos de lectura y puntaje de comprensión.cor().Ante una nueva pregunta de investigación sobre dos cantidades, primero examina la forma de la nube de puntos y luego calcula el coeficiente numérico de correlación.
Usa
plot()con las dos columnas numéricas decenso_jovenesy a continuación ejecutacor()con esas mismas dos columnas.Estructura la exploración gráfica y analítica:
No todas las relaciones son lineales
No todas las relaciones siguen una línea recta. Si una relación es monótona curva, el orden o jerarquía de los casos se conserva perfectamente.
El coeficiente de Spearman evalúa rangos y orden en lugar de distancias métricas:
cor(x, y, method = "spearman")Vectores:
x_curva <- 1:8,y_curva <- c(2, 5, 11, 20, 36, 65, 118, 215).Tu tarea
Observa el cálculo de Pearson en el editor (r ≈ 0.88) y calcula la correlación de Spearman para comprobar que el orden se preserva al 100% (rs = 1.0).
Pearson asume que la relación entre las variables sigue una trayectoria rectilínea constante.
Si una relación siempre crece pero lo hace en curva acelerada o saturada, la relación es monótona pero no lineal.
Examina si la nube de puntos se curva de manera sistemática en lugar de alinearse en torno a una recta.
Una relación basada en rangos
Cuando una relación conserva el orden de los casos aunque sea curva, Spearman devuelve valores cercanos a 1 porque evalúa rangos:
cor(x, y, method = "spearman")Vectores disponibles
x_curvaey_curva.Tu tarea
Calcula el coeficiente de Spearman entre
x_curvaey_curvaindicando el argumentomethod = "spearman".Spearman transforma los valores continuos en sus posiciones ordinales (rangos), capturando cualquier relación monótona aunque sea curva.
Para calcular Spearman en R, añade el argumento
method = "spearman"dentro de la funcióncor().Ejecuta la correlación especificando el método:
cor(var1, var2, method = "spearman").Elige antes de ejecutar
Criterio de elección según la trayectoria visual:
Aproximadamente recta: Pearson.
Monótona curva: Spearman.
En forma de U o no monótona: ninguno como resumen lineal único.
Tu tarea
Observa los tres gráficos del panel y asigna
"pearson","spearman"o"ninguno"ametodo_a,metodo_bymetodo_c.Revisa primero el diagrama de dispersión antes de elegir qué coeficiente reportar en tu informe.
Observa la forma de cada gráfico: si los puntos se alinean en una trayectoria recta usa Pearson; si suben siguiendo una curva monótona usa Spearman; si el patrón sube y luego baja, ninguno de los dos coeficientes lineales es adecuado.
Fundamenta tu elección en la geometría observada de la nube de puntos.
De la muestra a la inferencia
Para evaluar si la correlación observada en una muestra aporta evidencia creíble sobre una relación en la población usamos
cor.test():cor.test(x, y)Entrega: estimación muestral (
estimate), valor p (p-value) e intervalo de confianza (conf.int).Base
encuesta_socialdisponible.Tu tarea
Aplica la prueba de correlación inferencial con
cor.test()entrehoras_estudioypuntaje_metodosenencuesta_social.Una muestra pequeña puede mostrar una correlación no nula por simple variabilidad de muestreo aleatorio.
La inferencia estadística evalúa si la correlación observada en los datos es compatible con una población donde la correlación real sea cero.
Para contrastar esta pregunta necesitamos una prueba formal de hipótesis con
cor.test().¿Qué dice la hipótesis nula?
En inferencia estadística:
Hipótesis nula (H0): no hay correlación en la población (r = 0).
p-value: mide qué tan compatibles son los datos observados con H0. Un valor pequeño indica que los datos observados serían muy raros si no hubiera relación real.
Tu tarea
Evalúa cada afirmación asignando
TRUEoFALSEaafirmacion_probabilidad_h0eafirmacion_incompatibilidad.La hipótesis nula (H0) siempre representa el punto de partida conservador: no hay efecto ni asociación en la población.
En correlación, H0 postula que el coeficiente poblacional es exactamente cero ($ ho = 0$).
El valor p mide la probabilidad de observar una correlación tan o más extrema que la muestral si la hipótesis nula fuese verdadera.
Magnitud y evidencia son cosas distintas
No confundas magnitud (r) con evidencia (p):
Dos muestras pueden tener la misma correlación (r = 0.50), pero con mayor tamaño muestral (N) el p-value es más pequeño y la estimación es más precisa.
Tu tarea
Compara el Estudio A (n = 10) y el Estudio B (n = 500). Asigna
"Estudio A"o"Estudio B"aestudio_menor_py aestudio_mayor_precision.Un coeficiente alto con una muestra diminuta puede no ser estadísticamente significativo debido a la gran incertidumbre muestral.
Inversamente, con muestras masivas coeficientes minúsculos pueden alcanzar p < 0.05 sin tener relevancia práctica sustantiva.
Reporta siempre ambos elementos por separado: primero la magnitud y dirección del coeficiente, luego el nivel de evidencia del valor p.
Mira, elige y evalúa
En
encuesta_socialqueremos analizar si la edad se asocia con las horas de estudio:Tu tarea
plot()entre edad y horas de estudio.cor.test()entre ambas variables.cor.test()entrega conjuntamente el coeficiente estimado, los grados de libertad y el p-value de la prueba de significancia.Pasa las dos variables numéricas a
cor.test()separadas por coma, manteniendo el orden analítico.Inspecciona la salida de la prueba fijándote en la línea del
p-valuey en el valor del coeficiente al final.Checkpoint D: decide y justifica
Checkpoint D — Decidir y evaluar una correlación
En
encuesta_emprendimientoobservamos que las ventas crecen de forma fuertemente acelerada según los años del negocio:Tu tarea
Evalúa la relación monótona entre
antiguedad_anosyventas_mensualesaplicando la prueba de correlación de Spearman (method = "spearman") concor.test().Revisa la forma del gráfico: si la asociación es monótona pero curva (no lineal), el supuesto de Pearson se viola y debes optar por una correlación basada en rangos.
Emplea la función
cor.test()pasando ambas variables cuantitativas deencuesta_emprendimientoy especifica el método de Spearman mediante el argumentomethod = "spearman".Estructura la prueba inferencial no paramétrica:
Elige las variables relevantes
Para analizar relaciones entre múltiples cantidades numéricas, primero seleccionamos únicamente las columnas cuantitativas relevantes:
Tu tarea
Selecciona las variables
edad,horas_estudioyhoras_ociodesdeencuesta_socialusandoselect()y guarda el data frame enanalisis.Antes de calcular una matriz de correlaciones, debes filtrar la base conservando únicamente las columnas que sean cuantitativas numéricas.
Usa la función
select()indicando la baseencuesta_social_demoy los nombres de las tres variables numéricas pedidas.Estructura la selección de las columnas continuas:
Varias relaciones a la vez
Al aplicar
cor()a una tabla con varias columnas numéricas, R calcula una matriz de correlaciones donde cada celda muestra la correlación entre una fila y una columna:cor(tabla, method = "pearson")Tu tarea
Calcula la matriz de correlaciones de la base
analisisque preparaste en el ejercicio anterior.Cuando pasas un data frame numérico a
cor(), R calcula simultáneamente la correlación entre todos los pares posibles de variables.La salida es una matriz simétrica donde cada celda
(i, j)representa la correlación entre la variable de la fila y la variable de la columna.Pasa directamente el data frame preparado a la función:
cor(OBJETO_DATOS_NUMERICOS).No leas dos veces la misma relación
Propiedades de una matriz de correlaciones:
Diagonal: vale 1.0 porque cada variable se correlaciona consigo misma.
Simetría de espejo: la correlación entre A y B es idéntica a la de B y A.
Tu tarea
En una matriz de 3 variables numéricas, ¿cuántos pares de correlación únicos e informativos existen (sin diagonal ni repeticiones)? Guarda ese número en
pares_unicos.La diagonal principal siempre vale 1.0 porque representa la correlación de cada variable consigo misma.
La mitad superior de la matriz es un espejo exacto de la mitad inferior; basta con examinar uno de los dos triángulos para conocer todos los pares.
Localiza el cruce de las variables que te interesan en el triángulo inferior para evitar lecturas redundantes.
No todos los pares usan los mismos casos
Cuando hay datos ausentes en algunas variables de la matriz:
complete.obs: elimina cualquier fila que tenga unNAen alguna variable.pairwise.complete.obs: calcula cada par de correlación usando todos los casos disponibles para ese par específico.Base
seguimientocon mediciones incompletas:Tu tarea
Calcula la matriz de correlaciones de
seguimientousando el argumentouse = "pairwise.complete.obs".Si alguna columna tiene
NA,cor()devolveráNAen todos sus cruces a menos que especifiques el criterio de tratamiento.El argumento
use = "complete.obs"filtra previamente las filas que tengan ausencias en cualquiera de las variables de la matriz.Configura el argumento dentro de la llamada:
cor(datos, use = "complete.obs").Cuando una variable tiene dos categorías
Una variable binaria (0 = No, 1 = Sí) puede correlacionarse con una cantidad métrica (correlación punto-biserial). El signo indica qué grupo tiene promedios más altos según la categoría codificada con 1:
Tu tarea
Calcula la correlación entre la variable binaria
trabaja_01y elingreso_milesenencuesta_socialusandocor().Una variable binaria codificada como 0 y 1 puede correlacionarse con una continua: el signo indica qué grupo presenta mayor promedio.
Un coeficiente positivo indica que el grupo codificado como 1 tiene valores más altos en la variable continua que el grupo 0.
Identifica qué categoría representa el código 1 antes de interpretar la dirección de la correlación.
Lee una matriz para responder una pregunta
Queremos analizar de forma conjunta tres variables en
encuesta_social:trabaja_01,ingreso_milesyhoras_ocio.Base
encuesta_socialdisponible.Tu tarea
analisis_finalla selección detrabaja_01,ingreso_milesyhoras_ocio.cor().trabaja_01yhoras_ociousandocor.test().Descarta los valores 1.0 de la diagonal principal, ya que representan correlaciones triviales de cada variable consigo misma.
Examina el valor absoluto (magnitud) de los coeficientes restantes para identificar cuál par presenta la asociación más intensa.
Ubica la fila y columna del coeficiente más alto e interpreta su signo para responder la pregunta sustantiva.
Dos variables categóricas
Para estudiar la relación entre dos variables cualitativas, construimos una tabla de contingencia (cruzada):
table(base$variable_fila, base$variable_columna)Distribución en
encuesta_participacion(60 casos):Tu tarea
Cruza
participacion_organizacionytransporte_campusenencuesta_participacioncontable(), guárdala entablay muéstrala en consola.Para analizar si dos características cualitativas están asociadas, cruzamos ambas variables en una tabla de doble entrada o contingencia.
La función
table()recibe las dos columnas como argumentos separados por comas:table(base$var1, base$var2).Estructura la tabla de contingencia bivariada:
Comparar porcentajes
Como los grupos tienen tamaños diferentes (40 que participan vs 20 que no), debemos comparar porcentajes condicionales por fila:
prop.table(tabla, margin = 1) * 100Cada fila suma exactamente 100%.
Tu tarea
Calcula las proporciones por fila de
tablausandoprop.table()con el argumentomargin = 1.Los porcentajes globales dividen por el total general; los porcentajes condicionales por fila comparan la distribución interna de cada grupo.
El argumento
margin = 1enprop.table()asegura que cada fila sume 100%, permitiendo comparar grupos de tamaño desigual.Pasa la tabla con el margen y multiplica por 100:
prop.table(tabla, margin = 1) * 100.¿Qué esperaríamos sin asociación?
Dos variables son independientes si la distribución de una no cambia según la categoría de la otra:
En el total de la muestra, 15 de 60 personas usan Metro (el 25%). Si no hubiera relación, esperaríamos ese mismo 25% en ambos grupos.
Tu tarea
Si el transporte fuera completamente independiente de la participación, ¿qué porcentaje de usuarios de Metro esperaríamos en cada grupo? Revisa el porcentaje global en el texto y guárdalo en
porcentaje_esperado_metro.Si dos variables fueran completamente independientes, la proporción de una característica sería idéntica en todos los grupos de la otra.
Las frecuencias esperadas se calculan multiplicando los totales marginales de fila y columna y dividiendo por el total muestral.
Compara las casillas empíricas con lo que se esperaría si pertenecer a un grupo no alterara la probabilidad del otro.
Medir observado vs esperado
La prueba de Chi-cuadrado (χ2) de independencia compara las frecuencias observadas contra las que esperaríamos si no hubiera asociación:
prueba <- chisq.test(tabla)H0: las variables son independientes en la población.
Tu tarea
Ejecuta la prueba de Chi-cuadrado sobre
tabla, guárdala enpruebay muéstrala en la consola.La prueba de Chi-cuadrado compara las frecuencias realmente observadas en cada celda contra las frecuencias que se esperarían si las variables fueran independientes.
Aplica
chisq.test()a la tabla de contingencia para calcular la discrepancia global ponderada entre lo observado y lo esperado.Estructura la ejecución de la prueba sobre la tabla:
Mira lo que esperaba la prueba
El objeto retornado por
chisq.test()contiene tanto las frecuencias reales (prueba$observed) como las frecuencias esperadas teóricas (prueba$expected).Tu tarea
Consulta primero las frecuencias observadas (
prueba$observed) y luego las frecuencias esperadas (prueba$expected).El objeto retornado por
chisq.test()almacena internamente la matriz completa de frecuencias esperadas bajo independencia.Puedes acceder a esta matriz usando el operador
$sobre el resultado de la prueba:prueba$expected.Asigna el test a un objeto y consulta su componente esperado:
resultado$expected.¿Significativo significa grande?
Un p-value pequeño indica evidencia contra la independencia, pero no mide la fuerza de la asociación:
Tabla 1: Diferencias mínimas del 2% entre grupos con muestra masiva (p = 0.03).
Tabla 2: Diferencias sustantivas del 25% entre grupos con muestra moderada (p = 0.01).
Tu tarea
Compara ambas tablas significativas. Asigna
"Tabla 1"o"Tabla 2"atabla_asociacion_mas_fuertesegún cuál muestra una asociación sustantivamente más intensa.Un valor p significativo (p < 0.05) solo rechaza la hipótesis de independencia: no informa si la relación es débil, moderada o fuerte.
Para evaluar la fuerza sustantiva, examina las diferencias porcentuales entre filas en la tabla condicional.
Complementa siempre el valor p con la magnitud de las brechas porcentuales entre los grupos.
Otra asociación categórica
En
encuesta_comunidadconsultamos a 80 personas sobre suzona_residencia(Norte, Centro, Sur) y su nivel deactividad_comunitaria(Alta, Media, Baja):Tu tarea
zona_residenciayactividad_comunitariay guárdala entabla_comunidad.prop.table().chisq.test()sobre la tabla, guárdala enprueba_comunidady consulta sus frecuencias esperadas.Integra las tres etapas del análisis categórico: conteo conjunto, distribución condicional porcentual y contraste inferencial.
Construye la tabla cruzada con
table(), obtén los porcentajes por fila conprop.table(..., margin = 1) * 100y aplicachisq.test()a la tabla.Organiza los tres pasos guardando la tabla en su objeto antes de calcular las proporciones y la prueba.
¿Qué tipo de problema es?
Antes de analizar debemos identificar el tipo de variables y la técnica adecuada:
Cuantitativo: cantidades medibles continuas (promedios, correlaciones).
Categórico: grupos o clasificaciones cualitativas (tablas cruzadas, Chi-cuadrado).
Preguntas de estudio:
Problema 1: ¿Dedicar más horas de estudio se asocia con mayor autoeficacia académica?
Problema 2: ¿El medio de transporte se asocia con la participación estudiantil?
Tu tarea
Clasifica cada problema asignando
"cuantitativo"o"categorico"aproblema_1yproblema_2.Determina primero qué tipo de escala tiene cada variable involucrada: ¿son ambas cuantitativas, ambas categóricas o una mezcla?
Dos variables cuantitativas se analizan con dispersión y correlación; dos cualitativas se cruzan en tablas de contingencia y Chi-cuadrado.
Selecciona la herramienta metodológica adecuada según la naturaleza métrica de los datos.
Prepara antes de analizar
En
encuesta_vida_universitariaanalizaremos a los estudiantes de jornada diurna:Tu tarea
jornada == "Diurna"), seleccionahoras_estudioyautoeficacia_academica, y guarda el resultado endatos_estudio_diurno.sum(is.na()).Inicia delimitando el subgrupo que responde a la pregunta de investigación y descartando los atributos no pertinentes.
Usa
filter()para aislar la población de interés, encadena conselect()para las variables analíticas y verifica la presencia de datos completos.Guarda el conjunto depurado en un nuevo objeto para alimentar los análisis posteriores.
Tu tarea
plot()entre horas de estudio y autoeficacia.cor.test().Cuando ambas variables son cuantitativas continuas, el procedimiento consiste en observar la forma bivariada de la dispersión y cuantificar su grado de asociación lineal con el coeficiente de correlación.
Usa
plot()sobre las dos columnas de interés de la base preparada y luego calcula su grado de asociación concor().Estructura la inspección gráfica y el coeficiente numérico:
Tu tarea
tabla_participacion.prop.table().chisq.test(), guárdala enprueba_participaciony consulta sus frecuencias esperadas.Para responder una hipótesis sobre dos atributos cualitativos, contrasta la distribución porcentual condicional y evalúa la evidencia con Chi-cuadrado.
Genera la tabla cruzada con
table(), calcula las proporciones conprop.table(..., margin = 1)y sométela achisq.test().Interpreta conjuntamente las brechas entre categorías y el nivel de significancia alcanzado.
Checkpoint E: nueva base, nueva pregunta
Checkpoint E — Integración final: Nueva base, nueva pregunta
En
encuesta_vinculos_barrialesinvestigamos si entre las personas ocupadas, participar en organizaciones vecinales se asocia con la confianza comunitaria:Tu tarea
datos_checkpointfiltrando a quienes están ocupados (ocupado == "Sí") y seleccionandoparticipa_vecinal_01yconfianza_comunitaria.cor.test().Integra el ciclo completo de investigación: delimitar la población objetivo mediante filtrado, seleccionar las variables analíticas pertinentes y evaluar la asociación observada mediante una prueba inferencial adecuada.
Filtra
encuesta_vinculos_barrialespara la subpoblación con empleo (ocupado == "Sí"), selecciona las dos variables focales endatos_checkpointy aplicacor.test()entre ambas columnas.Organiza el flujo del checkpoint con sus dos fases:
Desafío Final: Tu primer mini-estudio social
En un proyecto de bienestar comunitario se recolectaron tres datos clave de un grupo barrial: el nombre del barrio (
barrio), el número de familias participantes (familias) y el total de canastas de apoyo entregadas (canastas).Tu tarea
"La Florida"en un objeto llamadobarrio.25enfamiliasy150encanastas.canastasporfamilias, y guárdalo encanastas_por_familia.canastas_por_familiapara mostrar su valor.Identifica qué datos corresponden a categorías textuales y cuáles a cantidades numéricas. Cada valor debe guardarse en el objeto indicado antes de operar.
Para calcular el promedio de canastas por familia, divide el objeto del total de canastas por el objeto que contiene el número de familias usando el operador
/.Estructura el cálculo final y muestra su resultado en la consola:
Desafío Final: Registro de participación comunitaria
Un equipo social midió las horas dedicadas a voluntariado mensual por 6 líderes comunitarios: 8, 14, 20, 12, 18 y 16 horas.
Tu tarea
horascon los 6 valores:8, 14, 20, 12, 18, 16usandoc().sum()y guárdala entotal_horas.[ ]y guárdalas enprimeros_dos.mean()y guárdalo enpromedio_horas.Un registro comunitario reúne mediciones de varias personas en un vector. A partir de esa estructura base, puedes resumir el conjunto completo o inspeccionar casos concretos.
Guarda los 6 valores en
horasusandoc(). Paratotal_horasypromedio_horasaplica las funciones estadísticas aprendidas (sumymean). Para extraer a los dos primeros líderes, indexa el vector con corchetes pasando las dos posiciones requeridas.Organiza el script completando cada componente:
Desafío Final: Filtrado condicional de hogares prioritarios
Un programa de asistencia social cuenta con los puntajes de vulnerabilidad de 6 hogares: 45, 78, 62, 85, 53 y 90 puntos. Los hogares con puntajes estrictamente superiores a 60 son considerados de atención prioritaria.
Tu tarea
puntajescon los 6 valores:45, 78, 62, 85, 53, 90.es_prioritariopreguntando qué valores depuntajesson mayores a 60 (> 60).es_prioritariodentro de corchetes[ ]para filtrarpuntajesy guarda el resultado enpuntajes_prioritarios.total_prioritarios.Un programa focalizado requiere identificar qué observaciones sobrepasan un umbral de vulnerabilidad, aislar dichos casos y contabilizar cuántos son en total.
Crea
puntajesconc(). Formulaes_prioritariocomparando los puntajes contra el umbral con> 60. Filtra los hogares prioritarios usandopuntajes[es_prioritario]. Para el conteo, recuerda quesum()sobre un vector lógico suma 1 por cadaTRUE.Sigue este esquema general completando las expresiones:
Desafío Final: Exploración de la Encuesta de Juventudes
Dispones del data frame
juventudescon información sobre 6 jóvenes encuestados:id,edad,comuna,horas_pantalla, yparticipa_taller.Tu tarea
juventudesusandonrow()y guárdalo enn_jovenes.horas_pantallade la base usando el operador$y guárdala entiempo_pantalla.tiempo_pantallausandomean()y guárdalo enpromedio_pantalla.head(juventudes, 3).La exploración inicial de un data frame abarca dimensionar la muestra (filas), examinar sus variables cuantitativas y verificar sus primeros registros.
Usa
nrow()sobre la base para el total de casos. Extrae la variable requerida con$y calcula su media conmean(). Por último, usahead()pasando como argumentos la base y el número de filas que deseas visualizar.Sigue este esquema completando los argumentos necesarios:
Desafío Final: Submuestra de investigación urbana
Dispones del data frame
encuesta_urbanaconid,edad,zona,ingreso, ysatisfecho. Se requiere aislar una submuestra de residentes de la zona"Sur"que reporten estar satisfechos (satisfecho == "Sí"), conservando únicamente las columnas de interés:edadeingreso.Tu tarea
filtro_sur_satisfechoque identifique a las personas que son de la zona"Sur"Y que respondieron"Sí"ensatisfecho(zona == "Sur" & satisfecho == "Sí").encuesta_urbanacomo base, filtra las filas utilizando la condición que guardaste enfiltro_sur_satisfechoy luego conserva solo las variablesedadeingreso. Guarda el resultado ensubmuestra_focal.ingreso_promedio_focal.Primero necesitas identificar qué casos cumplen simultáneamente dos condiciones en la población. Luego aíslas esos casos y sus variables para calcular el indicador social pedido.
Une las dos condiciones lógicas usando el operador
&. Para la submuestra, inicia el pipe desde la base completaencuesta_urbana, aplicafilter()con tu condición y encadena haciaselect(). Finalmente aplicamean()sobre la columnaingresode esa submuestra.Sigue la secuencia del desafío completando variables y condiciones:
Desafío Final: Diagnóstico y reporte con datos ausentes
Un censo barrial registró horas de capacitación laboral (
horas_cap) en una muestra con valores ausentes (NA). Se requiere diagnosticar los datos faltantes, evaluar el tamaño muestral efectivo y obtener el promedio observado de forma metodológicamente rigurosa.Tu tarea
horas_capencenso_comunitarioson válidos (no ausentes) usando!is.na()y guárdalo encasos_observados.sum(casos_observados)y guárdalo enn_efectivo.horas_capsobre los valores observados usandona.rm = TRUEy guárdala enmedia_horas_cap.Para reportar una variable con pérdida de datos, debes aislar qué observaciones son válidas (negando la ausencia), cuantificar el tamaño muestral efectivo y obtener la media sobre los datos observados.
Usa el operador de negación
!antes deis.na()para identificar los casos con respuesta enhoras_cap. Calcula su suma enn_efectivo. Luego aplicamean()sobre la variable asegurándote de ignorar losNA.Sigue este esquema para el diagnóstico del censo:
Desafío Final: Informe de frecuencias y porcentajes
Una encuesta de opinión consulta el medio de transporte principal de 10 estudiantes hacia su lugar de estudio:
"Metro","Bus","Bicicleta", o"Caminata".Tu tarea
transporteusandotable()y guárdala entabla_conteo.prop.table()y guárdala entabla_prop.tabla_proppor 100 y redondea a un decimal conround(..., 1)para guardarla entabla_porcentaje.La elaboración de un informe descriptivo categórico pasa de las frecuencias empíricas a proporciones relativas y finalmente a porcentajes estandarizados con formato decimal legible.
Calcula las frecuencias con
table(transporte). Pasa esa tabla aprop.table()paratabla_prop. Paratabla_porcentaje, multiplica la tabla de proporciones por 100 y redondea a un decimal usandoround(..., 1).Sigue esta estructura para el informe:
Desafío Final: Diagnóstico de distribución y medidas de resumen
Se analizan los puntajes de un test de competencias ciudadanas en una muestra escolar (
puntajes_test). Se requiere visualizar la distribución mediante un histograma y calcular las medidas centrales y de dispersión.Tu tarea
puntajes_testusandohist().mean()y guárdala enmedia_puntaje.median()y guárdala enmediana_puntaje.sd()y guárdala endesviacion_puntaje.El diagnóstico descriptivo cuantitativo completo requiere triangular la inspección gráfica de la forma distributiva con las medidas de centro (media, mediana) y dispersión (desviación estándar).
Genera el histograma de
puntajes_testconhist(). Luego almacena en los objetos pedidos la media conmean(), la mediana conmedian()y la desviación estándar consd().Sigue la secuencia diagnóstica completando los objetos:
Desafío Final: Exploración bivariada de variables continuas
Un estudio evalúa la relación entre semanas de preparación previa (
preparacion) y el puntaje obtenido en una prueba de admisión (puntaje_admision) en 8 postulantes registrados endatos_postulacion.Tu tarea
datos_postulacion$preparacion(eje X) ydatos_postulacion$puntaje_admision(eje Y) usandoplot().coef_correlacion.El análisis bivariado de dos métricas cuantitativas comienza verificando gráficamente la hipótesis de asociación y concluye con el cálculo del coeficiente paramétrico de correlación.
Extrae las variables
preparacionypuntaje_admisiondedatos_postulacionusando$. Pásalas aplot()para visualizar y luego acor()para almacenar el resultado encoef_correlacion.Sigue la secuencia del desafío completando las dos instrucciones:
Desafío Final: Evaluación inferencial de una correlación
En un estudio sobre salud estudiantil, se dispone de las variables
horas_suenoynivel_estresen el data frameestudio_salud. Se solicita aplicar una prueba de correlación no paramétrica basada en rangos (Spearman) para contrastar la hipótesis de asociación.Tu tarea
estudio_salud$horas_suenoyestudio_salud$nivel_estresusandocor.test(..., method = "spearman"), y guarda el resultado enprueba_cor.$p.valuey guárdalo envalor_p.Evaluar una correlación a nivel poblacional requiere contrastar formalmente la hipótesis de independencia y extraer el valor p resultante para juzgar la significancia estadística.
Aplica
cor.test()a las variables de sueño y estrés enestudio_saludconmethod = "spearman"y guárdalo enprueba_cor. Luego accede al componente$p.valuede ese objeto y asígnalo avalor_p.Organiza las dos etapas del desafío:
Desafío Final: Matriz de correlaciones multivariable
Una encuesta escolar evalúa cuatro indicadores cuantitativos de rendimiento y autoeficacia:
nota_mat,nota_len,horas_estudioyautoeficaciaen el data framedatos_escuela. Se requiere construir una matriz de correlaciones completa tratando adecuadamente valores perdidos.Tu tarea
datos_escuelausandocor()con el argumentouse = "complete.obs", y guárdala enmatriz_cor.round(..., 2)y guárdala enmatriz_redondeada.Al sintetizar múltiples relaciones simultáneas en una base con datos ausentes, se debe asegurar que todos los coeficientes provengan de los mismos casos observados y presentar la matriz con decimales redondeados.
Pasa la base
datos_escuelaacor()configurando el argumento de exclusión de valores ausentesuse = "complete.obs". Luego aplicaround(..., 2)sobre esa matriz y guárdala enmatriz_redondeada.Sigue este esquema para el cálculo y formateo de la matriz:
Desafío Final: Análisis de contingencia y prueba de Chi-cuadrado
Un equipo social investiga la asociación entre tipo de empleo (
"Formal"vs"Informal") y acceso a cobertura de salud ("Sí"vs"No") en la baseencuesta_empleo.Tu tarea
encuesta_empleo$tipo_empleoyencuesta_empleo$cobertura, y guárdala entabla_cruzada.prop.table(..., margin = 1) * 100, redondeados a 1 decimal conround(), y guárdalos enpct_por_empleo.tabla_cruzadausandochisq.test()y guarda el resultado enresultado_chi.El análisis de asociación entre dos variables categóricas sigue tres pasos: cuantificar las frecuencias conjuntas, evaluar la distribución porcentual condicional por grupo y contrastar la hipótesis de independencia estadística.
Cruza las dos variables de
encuesta_empleocontable(). Para los porcentajes por fila, pasa esa tabla aprop.table()conmargin = 1, multiplica por 100 y redondea conround(..., 1). Finalmente, aplicachisq.test()sobre la tabla cruzada.Organiza el script completando cada operación:
Desafío Final del Curso: Análisis Integrador Autónomo
Como investigador principal de un estudio sobre inserción laboral, recibes la base de datos
egresadospara responder a la pregunta: “¿Existe relación lineal entre las horas de capacitación recibidas (horas_cap) y el salario de ingreso (salario)?”. Debes depurar valores perdidos, cuantificar la relación y contrastar la evidencia estadística.Tu tarea
horas_capysalariousandocomplete.cases(), y guarda esa submuestra depurada enegresados_validos.horas_capysalarioen esa base depurada, y guárdalo encor_salario_cap.cor.test()sobre ambas variables en la muestra depurada, y guárdala entest_final.Como desafío culminante del curso, debes encadenar de forma autónoma el diagnóstico de casos válidos sin pérdida de datos, la cuantificación de la magnitud de la relación y la evaluación formal de significancia inferencial.
Usa
complete.cases()sobre las dos columnas clave deegresadospara filtrar las filas válidas enegresados_validos. Luego calcula el coeficiente de Pearson encor_salario_capy ejecuta la prueba de hipótesis concor.test()guardándola entest_final.Estructura la secuencia integradora del desafío: