library(learnr) knitr::opts_chunk$set(echo = FALSE)
knitr::include_graphics("images/factores.jpg")
El presente tutorial pretende ser un vehículo de aprendizaje interactivo para los novatos en el lenguaje R.
Ha sido desarrollado a través del paquete learnr que permite utilizar documentos RMarkdown para generar tutoriales interactivos.
Como se explica en la página de learnr, los tutoriales consisten en contenido (texto, figuras, ilustraciones, ecuaciones, vídeos, etc.) junto con componentes interactivos, como preguntas con múltiples opciones y fragmentos de código de R que los usuarios pueden editar y ejecutar directamente, para verificar y reforzar la comprensión.
Estos tutoriales conservan automáticamente el avance que un usuario realizó, por lo que si un estudiante trabaja en algunos ejercicios o preguntas y vuelve al tutorial más tarde, puede retomarlo exactamente donde lo dejó.
Este tutorial ha sido publicado como el paquete fundamentosr.
El objetivo de aprendizaje del presente tutorial es el siguiente:
En R, los factores se usan para trabajar con variables categóricas, es decir, variables que tienen un conjunto fijo y conocido de valores posibles.
Por definición, las variables categóricas cuentan con un número limitado de factores (o categorías). Ejemplos pueden ser rangos de edades, colores, o días de la semana. Por ejemplo, la variable sexo solo tendría dos factores: hombre o mujer. Pero estos factores o categorías también pueden ser numéricos, como el número de cilindros del motor de un vehículo.
knitr::include_graphics("images/variable_categorica.jpg")
Las variables categóricas pueden ser nominales u ordinales.
Nominal. Una variable puede ser tratada como nominal cuando sus valores representan categorías que no obedecen a una clasificación intrínseca. Por ejemplo, el departamento de la compañía en el que trabaja un empleado. Algunos ejemplos de variables nominales son: región, código postal o confesión religiosa.
Ordinal. Una variable puede ser tratada como ordinal cuando sus valores representan categorías con alguna clasificación intrínseca. Por ejemplo, los niveles de satisfacción con un servicio, que abarquen desde muy insatisfecho hasta muy satisfecho. Entre los ejemplos de variables ordinales se incluyen escalas de actitud que representan el grado de satisfacción o confianza y la calificación obtenida en un examen.
Comúnmente cada uno de los posibles valores de una variable categórica se conoce como un nivel.
Una variable categórica que puede tomar dos valores se denomina una variable binaria o una variable dicotómica
En análisis de datos y estadística las variables categóricas se tratan de manera diferente a las variables continuas o numéricas. Necesitamos, por tanto, tener un objeto en R para este tipo de datos permitiendo trabajar con modelos y gráficas de variables categóricas.
También son útiles cuando quieres mostrar vectores de caracteres en un orden no alfabético. Los factores son más sencillos de gestionar que las cadenas de caracteres. De ahí que, muchas de las funciones de R base automáticamente convierten los caracteres a factores.
Si las observaciones alojadas en un vector corresponden a cantidades, las variables pueden distinguirse entre discretas y continuas.
Discreta: se dice que una variable es discreta cuando no puede tomar ningún valor entre dos consecutivos. Ejemplos de variable discreta son el número de empleados de una fábrica o el número de hijos.
Continua: una variable es continua cuando puede tomar cualquier valor dentro de un intervalo. Ejemplos de variable continua son las temperaturas registradas en un observatorio, el tiempo en recorrer una distancia en una carrera o la estatura.
La forma de convertir este tipo de variables en categóricas viene determinado normalmente por que se puedan englobar en un número limitado de categorías. En muchas ocasiones, eso se logra a partir de la definición de intervalos para la variable que vienen a representar tales categorías o niveles.
La base del tipo de datos factor es el tipo de datos vector. El factor es un tipo de datos compuesto, unidimensional y, en definitiva, se trata de un caso particular del tipo de datos vector para el modelado de variables categóricas.
Podemos imaginar que tenemos una variable que registra los meses del año en que han nacido un grupo de personas (vector de cadenas de caracteres).
# Meses nacimiento grupo de personas meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") meses_nacimiento
El uso para cada elemento de una cadena de caracteres presenta dos inconvenientes fundamentales:
# Meses nacimiento grupo de personas (con errores) meses_nacimiento <- c("Feb","Msr","Jun","Ene","Ago","Feb","Nov","Mer","Ens","Febr") meses_nacimiento
En este ejemplo todo es admitido como cadena de caracteres correcta (no importa que un mes esté mal escrito, no importa que el mismo mes se escriba de formas distintas) pues cada elemento sigue siendo cadena de caracteres y, en principio, es independiente del resto.
# Meses nacimiento grupo de personas meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") sort(meses_nacimiento) sort(meses_nacimiento,decreasing=TRUE)
Por ejemplo, si estuviese interesado en el orden temporal, me sería imposible conseguirlo a través de la ordenación de estas cadenas de caracteres en el tipo de datos vector.
Los inconvenientes del uso de un vector para representar una variable categórica se solucionan mediante la creación de un factor. Para convertir una variable cualitativa o categórica en factorial, tenemos que emplear la función factor().
El factor vendrá determinado por un conjunto de niveles (valores posibles de mi variable categórica mes) que corresponderán al conjunto definido por los doce meses del año. Tras ello crearía el factor mediante el uso de la función factor junto al vector utilizado en los ejemplos anteriores y el vector de los niveles de la variable.
# Niveles: doce meses del año niveles_12meses <- c( "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" ) meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") print("Niveles de variable categórica (mes):") niveles_12meses print("Observaciones para crear el factor:") meses_nacimiento factor_meses<-factor(meses_nacimiento,levels=niveles_12meses) print("Factor creado:") factor_meses str(factor_meses)
Es importante convertir el vector en factor porque así R evalúa el número de niveles que hay en vez de tratar cada observación de modo independiente. Para crear el factor pasamos como primer argumento, de la función factor, el vector de observaciones correspondiente a los meses de nacimiento del grupo de personas meses_nacimiento y como segundo argumento, constituyendo el valor del parámetro levels, el vector que contiene todos los valores posibles de la variable categórica: niveles_12meses.
Al mostrar el factor creado comprobamos que las cadenas de caracteres aparecen sin comillas y que además se detallan los niveles correspondientes al factor. El vector se almacena de forma distinta y permite una operación más eficiente.
Podemos acceder al factor de la misma forma que accedemos a un vector, pero en este caso, si intentamos asignar un valor no establecido dentro de los niveles de la variable, no ocurrirá lo mismo que para el vector.
# Niveles: doce meses del año niveles_12meses <- c( "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" ) meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") print("Niveles de variable categórica (mes):") niveles_12meses print("Observaciones para crear el factor:") meses_nacimiento factor_meses<-factor(meses_nacimiento,levels=niveles_12meses) print("Factor creado:") factor_meses print("Agregamos una nueva observación") factor_meses[length(factor_meses)+1]<-"Jun" factor_meses print("Agregamos una nueva observación que no es un mes") factor_meses[length(factor_meses)+1]<-"Aaa" factor_meses
En el ejemplo, agregamos primero una nueva observación al vector que contiene uno de los niveles del factor y, posteriormente, intentamos agregar una observación que no se corresponde con ninguno de los niveles establecidos para el factor. En este segundo caso, se nos proporciona la advertencia correspondiente y se inserta en el factor el valor NA, eliminando la posibilidad de que este tipo de datos contenga valores diferentes a los niveles establecidos.
Podemos crear un factor desde un vector de observaciones omitiendo los niveles. En este caso la definición de los niveles va a ser implícita y se va a corresponder con el orden por defecto encontrado en las observaciones para los elementos distintos entre sí.
meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") print("Observaciones para crear el factor:") meses_nacimiento factor_meses<-factor(meses_nacimiento) print("Factor creado:") factor_meses print("Niveles de un factor:") levels(factor_meses) print("Estructura del factor:") str(factor_meses)
Si alguna vez se necesita acceso directo al conjunto de niveles válidos, se puede hacer con la función levels().
Hasta el momento, en los ejemplos hemos creado factores sin establecer un orden explícito. Corresponden a variables categóricas nominales.
# Niveles: doce meses del año niveles_12meses <- c( "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" ) meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") print("Niveles de variable categórica (mes):") niveles_12meses print("Observaciones para crear el factor:") meses_nacimiento factor_meses<-factor(meses_nacimiento,levels=niveles_12meses) print("Factor creado:") factor_meses print("Orden entre observaciones") factor_meses[1]>=factor_meses[2]
meses_nacimiento <- c("Feb","Mar","Jun","Ene","Ago","Feb","Nov","Mar","Ene","Feb") print("Observaciones para crear el factor:") meses_nacimiento factor_meses<-factor(meses_nacimiento) print("Factor creado:") factor_meses print("Orden entre observaciones") factor_meses[1]<factor_meses[2]
De ahí que si en ambos casos (creación de factor desde niveles y desde observaciones) trato de comprobar el orden voy a recibir una advertencia dado que no hay orden definido.
Vamos a ver ahora cómo añadir las variables categóricas ordinales. Para ello hay que añadir dos argumentos dentro de la función factor() que indiquen que hay un orden en los factores y cuál es es ese orden. Ello se realiza al proporcionar valor a los parámetros ordered y levels, respectivamente.
Vamos, por ejemplo, a categorizar la satisfacción de un conjunto de clientes con la adquisición de un determinado producto en Decepcionado, Poco satisfecho, Satisfecho y Muy satisfecho. Partiremos de un conjunto de opiniones y las convertiremos en factor estableciendo el orden correspondiente.
#Creación de factor correspondiente a variable categórica ordinal opiniones <- c("Poco satisfecho","Muy satisfecho","Muy satisfecho","Satisfecho","Muy satisfecho","Satisfecho","Decepcionado","Muy satisfecho","Satisfecho","Satisfecho") print("Observaciones para crear el factor:") opiniones factor_opiniones<-factor(opiniones,ordered=TRUE,levels=c("Decepcionado","Poco satisfecho","Satisfecho","Muy satisfecho")) print("Factor creado:") factor_opiniones print("Niveles") levels(factor_opiniones) print("Estructura del factor:") str(factor_opiniones)
Como podemos ver, al introducir el atributo levels dentro de la función factor(), podemos indicar el orden correcto de nuestra variable categórica. Al ver el objeto factor_opiniones, vemos que las categorías ya están ordenadas con el símbolo <.
A continuación vamos a comprobar que existe la ordenación entre las observaciones del factor correspondiente a la variable categórica ordinal correspondiente al ejemplo.
#Creación de factor correspondiente a variable categórica ordinal opiniones <- c("Poco satisfecho","Muy satisfecho","Muy satisfecho","Satisfecho","Muy satisfecho","Satisfecho","Decepcionado","Muy satisfecho","Satisfecho","Satisfecho") print("Observaciones para crear el factor:") opiniones factor_opiniones<-factor(opiniones,ordered=TRUE,levels=c("Decepcionado","Poco satisfecho","Satisfecho","Muy satisfecho")) print("Factor creado:") factor_opiniones cat("El número de usuarios que están al menos satisfechos son",length(factor_opiniones[factor_opiniones>="Satisfecho"])) cat("El número de usuarios que están decepcionados o poco satisfechos son",length(factor_opiniones[factor_opiniones<"Satisfecho"])) cat("El número de usuarios que están decepcionados o poco satisfechos son",length(factor_opiniones[(factor_opiniones=="Poco satisfecho")|(factor_opiniones=="Decepcionado")]))
Podemos comprobar cómo se cumple el orden establecido entre las diferentes categorías. En el último caso, presentamos dos formas diferentes de responder a una misma cuestión a partir de operadores lógicos y relacionales (donde no se tiene en cuenta el orden) y únicamente operadores relacionales (donde sí se tiene en cuenta el orden).
En el ejemplo anterior, podemos comprobar que los nombres de las diferentes categorías son excesivamente largos y, por ello, vamos a cambiar el nombre a los diferentes niveles para facilitar su uso. Si deseamos cambiar el nombre de las categorías tenemos que generar un nuevo vector con los nuevos nombres. Es muy importante que al crear el nuevo vector, los nuevos nombres tienen que estar escritos en el mismo orden.
#Creación de factor correspondiente a variable categórica ordinal opiniones <- c("Poco satisfecho","Muy satisfecho","Muy satisfecho","Satisfecho","Muy satisfecho","Satisfecho","Decepcionado","Muy satisfecho","Satisfecho","Satisfecho") print("Observaciones para crear el factor:") opiniones factor_opiniones<-factor(opiniones,ordered=TRUE,levels=c("Decepcionado","Poco satisfecho","Satisfecho","Muy satisfecho")) print("Factor creado:") factor_opiniones print("Cambio de nombre de los niveles:") levels(factor_opiniones)<-c("D","PS","S","MS") levels(factor_opiniones) print("Factor con niveles con nombre diferente:") factor_opiniones cat("El número de usuarios que están al menos satisfechos son",length(factor_opiniones[factor_opiniones>="S"])) cat("El número de usuarios que están decepcionados o poco satisfechos son",length(factor_opiniones[factor_opiniones<"S"])) cat("El número de usuarios que están decepcionados o poco satisfechos son",length(factor_opiniones[(factor_opiniones=="PS")|(factor_opiniones=="D")]))
Existen algunas funciones predefinidas en R que están vinculadas al tipo de datos factor. Vamos a revisar, en primer lugar, las funciones que están relacionadas con el propio tipo de datos y su coerción, y posteriormente mostrar las posibilidades que brinda R para la representación gráfica básica de este tipo de variables.
En esta sección, vamos a presentar las funciones básicas principales que están relacionadas con el tipo de datos factor.
Función | Descripción |
:--|:--|
is.factor() | comprueba si el objeto es o no un factor
as.factor()| coerción explícita de un objeto a factor
is.ordered()| comprueba si el objeto factor representa a una variable categórica ordinal
as.ordered()| coerción explícita de un objeto a factor ordinal
summary()| Número de ocurrencias de cada nivel
Veamos algunos ejemplos para comprobar cómo se utilizan estas funciones:
#Creación de factor correspondiente a variable categórica nominal genero <- c("M", "H", "M", "M", "M", "H", "M", "M", "H", "H") print("Observaciones para crear el factor:") genero factor_genero<-factor(genero) print("Factor creado:") factor_genero print("¿Es objeto factor?") is.factor(factor_genero) print("¿Ordinal?") is.ordered(factor_genero) print("Resumen de valores:") summary(factor_genero)
En este primer ejemplo creamos un factor correspondiente a una variable categórica nominal (género).
#Creación de factor correspondiente a variable categórica ordinal temperatura <- c("baja", "baja", "alta", "alta", "baja", "alta", "media", "alta", "media") factor_temp <- factor(temperatura, order = TRUE, levels =c("baja", "media", "alta")) print("Factor creado:") factor_temp print("¿Es objeto factor?") is.factor(factor_temp) print("¿Ordinal?") is.ordered(factor_temp) print("Resumen de valores:") summary(factor_temp)
En este primer ejemplo creamos un factor correspondiente a una variable categórica ordinal (temperatura).
Vamos a comprobar el uso de la coerción explícita con el tipo de datos factor.
#Creación de vector numérico que representa el número de hijos de un conjunto de personas hijos<-c(1,2,2,3,4,1,5,2,0,0,1,0,0) print("Vector") hijos print("¿Es factor?") is.factor(hijos) factor_hijos<-as.factor(hijos) print("¿Factor tras coerción?") is.factor(factor_hijos) print("¿Ordinal?") is.ordered(factor_hijos) print("Resumen de valores:") summary(factor_hijos)
Finalmente, vamos a comprobar lo que ocurre si realizamos coerción explícita de factor a vector.
#Creación de factor correspondiente a variable categórica ordinal temperatura <- c("baja", "baja", "alta", "alta", "baja", "alta", "media", "alta", "media") factor_temp <- factor(temperatura, order = TRUE, levels =c("baja", "media", "alta")) print("Factor creado:") factor_temp print("¿Es objeto factor?") is.factor(factor_temp) str(factor_temp) print("¿Ordinal?") is.ordered(factor_temp) print("Resumen de valores:") summary(factor_temp) #Coerción explícita a vector vec_temp<-as.vector(factor_temp) print("Estructura tras coerción explícita a vector") str(vec_temp) #Coerción explícita a vector de enteros vecint_temp<-as.numeric(factor_temp) print("Estructura tras coerción explícita a numérico") str(vecint_temp)
En el ejemplo anterior, si coercionamos explícitamente a vector obtenemos un vector de cadenas de caracteres. Sin embargo, si la coerción explícita es a numérico se obtiene un vector de enteros que se corresponde con la representación interna del factor.
Sabemos que la función plot() en R permite crear un gráfico al recibir dos vectores (de la misma longitud). No obstante, puede recibir también otro tipo de objetos como los factores permitiendo crear diferentes tipos de gráficos:
Gráfico de barras: si recibe como argumento un factor únicamente. Representa las ocurrencias de cada nivel del factor.
Diagrama de cajas: si recibe como argumento un factor y una variable numérica. Representa los valores de la variable numérica más probables para cada nivel del factor.
Veamos un ejemplo para cada tipo de diagrama:
baja,media y alta. Deseamos representar gráficamente el número de ocurrencias para cada valor de temperatura.#Creación de factor correspondiente a variable categórica ordinal temperatura <- c("baja", "baja", "alta", "alta", "baja", "alta", "media", "alta", "media") factor_temp <- factor(temperatura, order = TRUE, levels =c("baja", "media", "alta")) print("Factor creado:") factor_temp print("Resumen de valores:") summary(factor_temp) #Mostremos su gráfica plot(factor_temp,main="Diagrama barras Temperatura")
#Creación de un factor que representa el número de hijos de un conjunto de personas hijos<-c(1,2,2,3,4,1,5,2,0,0,1,0,0,1,2,3,4,5,4,3,5) names(hijos)<-1:length(hijos) print("Factor hijos") factor_hijos<-factor(hijos) factor_hijos #Creación de un vector que representa la edad de la madre con el primer hijo edad_madre<-c(30,29,28,30,27,25,32,30,27,33,27,25,33,34,35,20,22,21,24,24,22) names(edad_madre)<-1:length(edad_madre) print("Vector edad madre") edad_madre #Representación gráfica hijos frente a edad plot(factor_hijos,edad_madre,main="Diagrama de cajas (Hijos-Edad madre)",xlab = "Número de hijos", ylab = "Edad madre con primer hijo")
Para establecer un título para el eje X de la gráfica se usa el parámetro xlab y para el eje Y de la gráfica se utiliza el parámetro ylab.
"Disponemos de un conjunto de películas, su año de estreno y su recaudación en taquilla. Se desea clasificar a las películas de acuerdo a su recaudación de la siguiente forma:
Así mismo, en función del año de estreno se pretenden distinguir entre las que se estrenaron antes de 2010 y las que lo hicieron de 2010 en adelante.
Representa gráficamente el número de películas que pertenece a cada categoría.
Representa gráficamente el rango de taquilla en millones de dólares en función de la categoría de año de estreno."
# Vector de cadenas de caracteres para las películas peliculas_mas_taquilleras<-c("Frozen II","Titanic","El rey leon","Avengers: Endgame","Star Wars: Episodio VII - El despertar de la Fuerza","Jurassic World","Avatar","Furious 7","Avengers: Infinity War", "The Avengers") names(peliculas_mas_taquilleras)<-1:length(peliculas_mas_taquilleras) peliculas_mas_taquilleras # Vector numérico para la recaudación taquilla<-c(1449.058,2187.463,1656.943,2797.8,2068.223,1671.713,2802.013,1516.045,2048.359,1518.812) names(taquilla)<-1:length(taquilla) taquilla cat_taquilla<-character(length(peliculas_mas_taquilleras)) cat_taquilla[taquilla<1500]<-"Taquillazo" cat_taquilla[(taquilla>=1500)&(taquilla<2000)]<-"Blockbuster" cat_taquilla[(taquilla>=2000)&(taquilla<2500)]<-"Histórica" cat_taquilla[taquilla>=2500]<-"Leyenda" names(cat_taquilla)<-1:length(cat_taquilla) cat_taquilla # Vector entero para el año de estreno estreno<-c(2019,1997,2019,2019,2015,2015,2009,2015,2018,2012) names(estreno)<-1:length(estreno) estreno cat_estreno<-character(length(peliculas_mas_taquilleras)) cat_estreno[estreno<2010]<-"Antes de 2010" cat_estreno[estreno>=2010]<-"Desde 2010" names(cat_estreno)<-1:length(cat_estreno) cat_estreno # Creamos un factor con orden para las categorias de taquilla print("Factor taquilla:") factor_taquilla=factor(cat_taquilla,ordered=TRUE,levels=c("Taquillazo","Blockbuster","Histórica","Leyenda")) factor_taquilla # Creamos un factor con la variable categórica nominal del año de estreno print("Factor estreno:") factor_estreno=factor(cat_estreno) factor_estreno plot(factor_taquilla,main="Número de películas para cada categoría de taquilla") plot(factor_estreno,main="Número de películas por categoría de año de estreno") plot(factor_estreno,taquilla,main="Taquilla (millones de $) en función del año de estreno")
Para resolver el ejercicio, en primer lugar se han transformado en categorías las observaciones para cada variable (taquilla y año de estreno), alojadas en vectores. La transformación se ha basado en la creación de nuevos vectores cat_taquilla y cat_estreno a los que se han asignado valores en función de la condición de categoría para las observaciones en los vectores taquilla y estreno respectivamente.
En segundo lugar, se han creado los factores para los vectores de categorías. La variable correspondiente a la taquilla es categórica ordinal (ordenación en función de la recaudación) y la variable correspondiente al año de estreno es categórica nominal (dicotómica: dos posibles valores).
Finalmente, tras crear los factores hemos utilizado la función plot() sobre cada factor de forma independiente. Así mostramos un diagrama de barras para cada variable. Para mostrar el rango de taquilla (como valor numérico) en función del año de estreno como categoría usamos la función plot() para mostrar un diagrama de cajas. En este último caso, proporcionamos en primer lugar el factor y en segundo lugar el vector de valores numéricos con el mismo orden de los valores correspondientes del factor (orden utilizado, en nuestro caso, para la creación de todos los vectores de datos).
"Se necesita construir un factor fac con los niveles 1, 2, 3, 4 y 5, de tal forma que cada nivel debe tener, respectivamente, las siguientes frecuencias (número de ocurrencias):
10, 20, 30, 40 y 50. Asigna los nombres uno, dos, tres, cuatro y cinco a cada nivel en función de su valor y establece un orden en el factor basado en los valores numéricos de los niveles. Representa gráficamente el factor para comprobar visualmente las frecuencias de cada nivel."
# Generamos las observaciones en función de las frecuencias requeridas para los valores numéricos vector_valores<-1:5 vector_frecuencias<-c(10,20,30,40,50) vector_observaciones<-rep(vector_valores,vector_frecuencias) #Barajamos las observaciones: las distribuimos de forma aleatoria vector_observaciones<-sample(vector_observaciones) #Creamos el factor #fac<-as.factor(vector_observaciones) fac<-factor(vector_observaciones,ordered=TRUE) fac str(fac) #Nombres de los niveles levels(fac)<-c("uno","dos","tres","cuatro","cinco") str(fac) #Representamos gráficamente el factor plot(fac,main="Factor frecuencias",xlab="Niveles",ylab="Frecuencias")
Para resolver el ejercicio, primero generamos el vector de observaciones basado en los valores a generar y las frecuencias requeridas para los mismos. La función predefinida rep() para vectores tiene gran utilidad en este sentido. Recibe como primer argumento los valores a generar y como segundo argumento el número de repeticiones para cada uno de los valores. Los valores generados estarían agrupados por valor numérico. Si deseamos que se distribuyan aleatoriamente por el vector, podemos utilizar la función sample(). Esta función, aunque sirve para obtener una muestra, permitirá barajar el vector si no recibe parámetros adicionales al propio vector.
Tras disponer de las observaciones se procede a la creación del factor. Lo creamos con la función factor() recibiendo como parámetros las observaciones y la indicación de que se trata de una variable categórica ordinal (ordered=TRUE). Como orden de los valores numéricos se establece el orden por defecto.
Tras ello, cambiamos los nombres de los niveles indicándolos en el mismo orden (de menor a mayor) en que se albergan en el factor.
Finalmente, representamos el factor en un diagrama de frecuencias.
"Consideramos inicialmente las siguientes respuestas posibles a una pregunta en una encuesta: Algo de acuerdo, Totalmente de acuerdo, Algo en desacuerdo y Totalmente en desacuerdo.
Genera cincuenta posibles respuestas y crea el factor ordenado correspondiente.
Añade una nueva opción de respuesta que sea Ni de acuerdo ni en desacuerdo. Añade diez observaciones que reflejen en las respuestas este nuevo tipo de respuesta.
Simplifica el nombre de las diferentes respuestas:
Totalmente de acuerdo: TA.
Totalmente en desacuerdo: TD.
Realiza una representación gráfica de las observaciones para los cuatro tipos de respuestas diferentes y para los cinco tipos de respuestas diferentes.
Indica cuántas respuestas están total o parcialmente en desacuerdo.
Indica el porcentaje de respuestas que están total o parcialmente de acuerdo para 4 y para 5 respuestas posibles."
#Generamos 50 observaciones en función de los tipos de respuesta posibles_respuestas<-c("Totalmente en desacuerdo","Algo en desacuerdo","Algo de acuerdo","Totalmente de acuerdo") vector_observaciones<-sample(posibles_respuestas,50,replace=TRUE) print("Observaciones generadas:") vector_observaciones #Creamos el factor factor_respuestas<-factor(vector_observaciones,ordered=TRUE,levels=posibles_respuestas) print("Factor creado:") factor_respuestas #Añadimos la nueva respuesta posibles_respuestas<-c("Totalmente en desacuerdo","Algo en desacuerdo","Ni de acuerdo ni en desacuerdo","Algo de acuerdo","Totalmente de acuerdo") nuevas_observaciones<-rep("Ni de acuerdo ni en desacuerdo",10) #Añadimos las nuevas observaciones vector_observaciones<-c(vector_observaciones,nuevas_observaciones) vector_observaciones<-sample(vector_observaciones) #Creamos el nuevo factor nuevo_factor_respuestas<-factor(vector_observaciones,ordered=TRUE,levels=posibles_respuestas) print("Nuevo factor creado:") nuevo_factor_respuestas #Cambiamos los nombres de los niveles en los dos factores levels(factor_respuestas)<-c("TD","AD","AA","TA") levels(nuevo_factor_respuestas)<-c("TD","AD","NAND","AA","TA") print("Niveles de los factores cambiados") summary(factor_respuestas) summary(nuevo_factor_respuestas) #Representación gráfica de ambos factores plot(factor_respuestas,main="Encuesta cuatro respuestas") plot(nuevo_factor_respuestas,main="Encuesta cinco respuestas") #Número de respuestas total o parcialmente en desacuerdo #Igual para ambos factores. Tomamos uno de ellos. cat("Las respuestas que están total o parcialmente en desacuerdo son",sum(factor_respuestas<"AA"),".") #Porcentaje de respuestas total o parcialmente de acuerdo para 4 respuestas porcentaje_4respuestas<-(sum(factor_respuestas>"AD")/length(factor_respuestas))*100 cat("El porcentaje de respuestas total o parcialmente de acuerdo para 4 respuestas es:",porcentaje_4respuestas,"%.") #Porcentaje de respuestas total o parcialmente de acuerdo para 5 respuestas porcentaje_5respuestas<-(sum(nuevo_factor_respuestas>"NAND")/length(nuevo_factor_respuestas))*100 cat("El porcentaje de respuestas total o parcialmente de acuerdo para 5 respuestas es:",porcentaje_5respuestas,"%.")
Para resolver el ejercicio se han generado inicialmente las observaciones para los cuatro tipos diferentes de respuestas. Para ello se ha utilizado la función sample() con reemplazamiento obteniéndose una muestra de cincuenta observaciones. Desde esa muestra se ha creado el factor ordinal utilizando el orden establecido en el vector correspondiente a las cuatro respuestas posibles (posibles_respuestas), que estaba ordenado de menor a mayor (desde totalmente en desacuerdo hasta totalmente de acuerdo).
Para añadir la nueva respuesta se ha incluido inicialmente en el vector de tipos de respuesta. Dado su carácter neutral se ha alojado entre las opciones de respuesta en desacuerdo y las opciones de respuesta de acuerdo. Tras ello, se han generado las nuevas observaciones del nuevo tipo de respuesta (mediante la función de valores repetidos rep()) y se han concatenado con las anteriores, barajando todas las observaciones mediante sample(). El nuevo factor ordinal correspondiente a las cinco respuestas se crea posteriormente con la función factor().
La simplificación de los niveles correspondientes a los tipos de respuesta se aplica mediante la asignación de los tipos simplificados, en el mismo orden de los niveles, a la aplicación de la función levels() sobre los dos factores, de forma independiente. En la representación gráfica de ambos factores, que pasa por el uso de la función plot() con cada uno de los factores, podemos comprobar la nueva denominación de los niveles.
Finalmente, para contestar a las preguntas sobre el número de respuestas, basta tener en cuenta la posibilidad de usar la función de suma sum() tras aplicar la condición sobre el factor. De esta forma, en caso de cumplirse la condición para la respuesta se sumaría uno (coerción implícita de TRUE) y en caso de no cumplirse la condición para la respuesta se sumaría cero (coerción implícita de FALSE). Recordemos que los factores son una especie de vectores más restrictivos y que, por tanto, las funciones predefinidas y operadores de vectores son aplicables a ellos. Para obtener los porcentajes debemos dividir por la totalidad de elementos, que es proporcionada por la longitud del factor.
La utilidad del tipo de datos factor es fundamental para la gestión de variables categóricas tanto nominales como ordinales correspondientes a un mismo tipo de datos simple. En este tutorial has podido experimentar cómo crear, inicializar, establecer y modificar los niveles y operar con factores, así como representar gráficamente y utilizar las funciones predefinidas que dispone R para vectores con el tipo de datos factor.
Felicidades, has completado el tutorial de Factores. Puedes continuar con el siguiente tutorial: Matrices.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.