Básicamente existen 7 tipos de datos desde mi perspectiva:
numero = 2.7978
numero
## [1] 2.7978
class(numero)
## [1] "numeric"
Son números enteros
int = -5
int
## [1] -5
class(int)
## [1] "numeric"
El tipo de clase que menciona ser es tipo numeric, por lo tanto, vamos a renombrarlo para convertirlo en integer, a través de la función as.integer
int = as.integer(int)
int
## [1] -5
class(int)
## [1] "integer"
Son números complejos que aceptan decimales
com = 3.14-9.2i
com
## [1] 3.14-9.2i
class(com)
## [1] "complex"
Verdadero (TRUE) o falso (FALSE). Es el resultado de operaciones lógicas.
5>8
## [1] FALSE
5<8
## [1] TRUE
Es una cadena de texto sin significado numérico.
texto = "hola mundo"
texto
## [1] "hola mundo"
class(texto)
## [1] "character"
Una variable factor es una variable categórica. Los vectores de caracteres a menudo se almacenan como factores para explotar funciones para tratar datos categóricos. Es muy importante aclarar que, a pesar de que las variables factor se pueden ordenar, no se pueden considerar variables ordinales, ya que no es posible hacer cálculos como por ejemplo la media, esto a pesar de asignarles valores a las categorías
Supongamos que tenemos 3 tipos de tallas:
hasta aquí, el formato será character, por lo tanto, lo único que hace es tener una serie de caracteres. En un gráfico se pueden ver que hay 3 “Ch”, 6 “G” y 4 “M”.
tallas = c("Ch","M","G","Ch","G","G","M","M","Ch","G","G","G","M")
tallas
## [1] "Ch" "M" "G" "Ch" "G" "G" "M" "M" "Ch" "G" "G" "G" "M"
class(tallas)
## [1] "character"
inventario = table(tallas)
inventario
## tallas
## Ch G M
## 3 6 4
# Observe que lo que se grafica es una table, no es posible graficar directamente plot(tallas), pues tallas es character
plot(inventario)
El siguiente paso es convertir el vector character a factor
tallas_factor = factor(tallas)
# conocer la clase de la variable
class(tallas_factor)
## [1] "factor"
# Los niveles son expuestos, pero no están ordenados de manera lógica, los ordena de manera alfabética: este comando muestra los niveles
levels(tallas_factor)
## [1] "Ch" "G" "M"
# hace un llamado a los datos y al final presenta los levels, sin embargo, obsérvese que no determina un orden
tallas_factor
## [1] Ch M G Ch G G M M Ch G G G M
## Levels: Ch G M
# El tipo de gráfico es diferente, el anterior graficaba un table, para este caso es un factor
plot(tallas_factor)
Finalmente, se reordena el vector tallas mediante levels y ordered
# ordered = TRUE, significa que sí tiene un orden de mayor a menor y lo determina levels de izquierda a derecha
tallas_reord = factor(tallas,
ordered = TRUE,
levels = c("Ch","M","G"))
tallas_reord
## [1] Ch M G Ch G G M M Ch G G G M
## Levels: Ch < M < G
# En levels se observa que tiene el símbolo <, lo que ya da un orden a los datos factor
# Cómo guarda R los niveles del factor, es decir, Ch = 1, M = 2 y G = 3, sin embargo, no permite asignarles el valor que queramos
unclass(tallas_reord)
## [1] 1 2 3 1 3 3 2 2 1 3 3 3 2
## attr(,"levels")
## [1] "Ch" "M" "G"
# El siguiente gráfico, ahora sí lo hace de manera ordenada
plot(tallas_reord)
Supongamos que se realizó una encuesta a 1000 personas para conocer su mes de cumpleaños y las codificaciones automáticas fueron: 111 = Abril; 112 = Agosto; 113 = Diciembre; 114 = Enero; 115 = Febrero; 116 = Julio; 117 = Junio; 118 = Marzo; 119 = Mayo; 120 = Noviembre; 121 = Octubre; 122 = Septiembre. Es decir, se clasificaron únicamente los valores y el orden fue alfabético. Vamos a generar un vector con los 1000 datos aleatorios de los meses para trabajarlo mediante sample
# se fija una semilla
set.seed(1)
mes = sample(111:122, 1000, replace = TRUE, prob = NULL)
# mostramos los primeros 38 datos
mes[1:38]
## [1] 119 114 117 111 112 117 121 112 121 113 111 115 115 120 116 120 117 119 115
## [20] 115 119 119 115 115 112 120 119 122 111 114 113 116 120 120 116 114 122 114
# La clase del vector mes es = integer, lo cual desde luego no es correcto para nuestras necesidades
class(mes)
## [1] "integer"
Lo siguiente es convertir mes a factor y ordenar
meses = factor(mes,
ordered = TRUE,
levels = c(114, 115, 118, 111, 119, 117, 116, 112, 122, 121, 120, 113),
labels = c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"))
meses[1:38]
## [1] Mayo Enero Junio Abril Agosto Junio
## [7] Octubre Agosto Octubre Diciembre Abril Febrero
## [13] Febrero Noviembre Julio Noviembre Junio Mayo
## [19] Febrero Febrero Mayo Mayo Febrero Febrero
## [25] Agosto Noviembre Mayo Septiembre Abril Enero
## [31] Diciembre Julio Noviembre Noviembre Julio Enero
## [37] Septiembre Enero
## 12 Levels: Enero < Febrero < Marzo < Abril < Mayo < Junio < ... < Diciembre
Comprobación de clase, frecuencias y graficación
# se comprueba la clase de meses
class(meses)
## [1] "ordered" "factor"
# se conoce la frecuencia de cada estación a través de table
table(meses)
## meses
## Enero Febrero Marzo Abril Mayo Junio Julio
## 84 92 77 77 92 85 89
## Agosto Septiembre Octubre Noviembre Diciembre
## 70 89 64 94 87
# se grafica meses
plot(meses)
Coerción de factores, un factor puede convertirse en variable numérica mediante la función as.numeric() o unclass():
# Esto significa los valores que asigna R a los valores factor, así por ejemplo 1 = Enero, 2 = Febrero, etc.
as.numeric(meses)[1:38]
## [1] 5 1 6 4 8 6 10 8 10 12 4 2 2 11 7 11 6 5 2 2 5 5 2 2 8
## [26] 11 5 9 4 1 12 7 11 11 7 1 9 1
unclass(meses)[1:38]
## [1] 5 1 6 4 8 6 10 8 10 12 4 2 2 11 7 11 6 5 2 2 5 5 2 2 8
## [26] 11 5 9 4 1 12 7 11 11 7 1 9 1
Finalmente, se recodifican y reordenan las variables de acuerdo a la estación del año, Primavera = (Marzo, Abril y Mayo), Verano = (Junio, Julio y Agosto), Otoño = (Septiembre, Octubre y Noviembre) e Invierno (Diciembre, Enero y Febrero)
estac = factor(meses,
ordered = TRUE,
levels = c("Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre", "Enero", "Febrero"),
labels = c("Primavera", "Primavera", "Primavera", "Verano", "Verano", "Verano", "Otoño", "Otoño", "Otoño", "Invierno", "Invierno", "Invierno"))
estac[1:38]
## [1] Primavera Invierno Verano Primavera Verano Verano Otoño
## [8] Verano Otoño Invierno Primavera Invierno Invierno Otoño
## [15] Verano Otoño Verano Primavera Invierno Invierno Primavera
## [22] Primavera Invierno Invierno Verano Otoño Primavera Otoño
## [29] Primavera Invierno Invierno Verano Otoño Otoño Verano
## [36] Invierno Otoño Invierno
## Levels: Primavera < Verano < Otoño < Invierno
# se comprueba la clase de estac
class(estac)
## [1] "ordered" "factor"
# se conoce la frecuencia de cada estación a través de table
table(estac)
## estac
## Primavera Verano Otoño Invierno
## 246 244 247 263
# se grafica estac
plot(estac)
Los datos ordinales son parecidos a los cualitativos, en el sentido de que son cualidades de objetos o individuos. Su diferencia con los datos cualitativos está en que las características que expresan los datos ordinales tienen un orden, pero más allá de ello el poder asignarles un valor que uno desee. El problema es que R no permite operaciones aritméticas de los datos ordinales con equivalencia numérica, un ejemplo sería Yes = 1 y No = 0, en la que cada categoría (Yes y No) debería ajustarse a un valor (1,0); sin embargo, aquí se analiza una solución:
Supongamos que se realizó una encuesta a 100 usuarios para conocer si aprueban el servicio o no, para ello construiremos un ejemplo con sample
# Definimos el vector de posibilidades a
a1 = c("Yes","No")
# Se genera una "base de datos" w1 con un set.seed()
set.seed(100)
w1 = sample(a1, 100, replace = T, prob = NULL)
w1
## [1] "No" "Yes" "No" "No" "Yes" "Yes" "No" "No" "No" "Yes" "No" "No"
## [13] "No" "No" "Yes" "No" "No" "Yes" "Yes" "Yes" "Yes" "No" "No" "Yes"
## [25] "No" "Yes" "Yes" "No" "No" "Yes" "No" "Yes" "No" "No" "No" "No"
## [37] "No" "No" "Yes" "Yes" "Yes" "Yes" "No" "Yes" "No" "No" "No" "Yes"
## [49] "Yes" "No" "No" "Yes" "Yes" "Yes" "Yes" "Yes" "Yes" "No" "Yes" "Yes"
## [61] "No" "Yes" "Yes" "Yes" "No" "No" "Yes" "Yes" "Yes" "Yes" "Yes" "No"
## [73] "No" "No" "Yes" "Yes" "No" "No" "Yes" "No" "No" "Yes" "Yes" "Yes"
## [85] "No" "No" "Yes" "No" "No" "Yes" "Yes" "Yes" "Yes" "No" "No" "Yes"
## [97] "Yes" "No" "No" "No"
class(w1)
## [1] "character"
Operaciones básicas de los datos
# Al ser de clase character, se puede estimar table
t1 = table(w1)
t1
## w1
## No Yes
## 50 50
Sin embargo, si deseara obtener la media o la desviación estándar por ejemplo, es obvio que no sería posible, pues los datos son character, el resultado es NA = Not available.
# No es posible estimar la media, ya que requiere un valor numérico (numeric) o lógico (logical) y los datos son character
mean(w1)
## Warning in mean.default(w1): argument is not numeric or logical: returning NA
## [1] NA
La primera opción sería cambiar directamente Yes por 1 y No por 0.
# Se realiza a través de factor
x1 = factor(w1, levels = c("No","Yes"), labels= c(0,1), ordered = T)
x1
## [1] 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0
## [38] 0 1 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0
## [75] 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0
## Levels: 0 < 1
# El resultado es un ordered factor, es decir, no son numéricos, aunque lo parezcan
class(x1)
## [1] "ordered" "factor"
# Al no ser numérico o logical x1, no es posible estimar la media
mean(x1)
## Warning in mean.default(x1): argument is not numeric or logical: returning NA
## [1] NA
Cambios para poder estimar la función mean() primer intento no definitivo.
# Se convierten los valores a numeric (primer intento)
y1 = as.numeric(x1)
# El resultado es numérico, hasta este punto todo bien
class(y1)
## [1] "numeric"
# Es posible estimar la media de una variable "ordinal" realizando el tipo de clase de variable a numeric.
mean(y1)
## [1] 1.5
# ¿Una media de 1.5, qué pasó? Recuérdese que los valores eran 1 y 0. Para detectar el problema mostramos los valores de y1, para después analizar los valores de x1.
y1
## [1] 1 2 1 1 2 2 1 1 1 2 1 1 1 1 2 1 1 2 2 2 2 1 1 2 1 2 2 1 1 2 1 2 1 1 1 1 1
## [38] 1 2 2 2 2 1 2 1 1 1 2 2 1 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1 2 2 2 2 2 1 1 1
## [75] 2 2 1 1 2 1 1 2 2 2 1 1 2 1 1 2 2 2 2 1 1 2 2 1 1 1
# El problema fue que en variables factor, R asigna directamente los valores, esto se puede visualizar a través de la siguiente función descodificadora sobre X1, los levels efectivamente son 0 y 1, pero los labels 1 y 2, y el valor numérico lo toma sobre labels.
unclass(x1)
## [1] 1 2 1 1 2 2 1 1 1 2 1 1 1 1 2 1 1 2 2 2 2 1 1 2 1 2 2 1 1 2 1 2 1 1 1 1 1
## [38] 1 2 2 2 2 1 2 1 1 1 2 2 1 1 2 2 2 2 2 2 1 2 2 1 2 2 2 1 1 2 2 2 2 2 1 1 1
## [75] 2 2 1 1 2 1 1 2 2 2 1 1 2 1 1 2 2 2 2 1 1 2 2 1 1 1
## attr(,"levels")
## [1] "0" "1"
Cambios para poder estimar la función mean() segundo intento y definitivo.
# Se convierten los valores primero a character y después a numeric (intento definitivo)
y1 = as.numeric(as.character(x1))
# El resultado primero fue character y después numérico, hasta este punto nuevamente todo bien
class(y1)
## [1] "numeric"
# Ahora sí es posible estimar la media pero sobre los valores deseados.
mean(y1)
## [1] 0.5
# El resultado es el deseado, 0.5 y con los valores numéricos 0 y 1
y1
## [1] 0 1 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0
## [38] 0 1 1 1 1 0 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 1 1 0 1 1 1 0 0 1 1 1 1 1 0 0 0
## [75] 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 1 1 0 0 0
El gran problema, con y1 numérico es que sí estimó la media, pero los gráficos o frecuencias se apuntalan con 0 y 1; caso contrario, si mis datos fueran Yes y No (no numéricos), los gráficos de frecuencias quedan de manera correcta pero no sería posible estimar la media, de ahí el siguiente ejemplo para que este punto quede claro, pero con 1 = Muy insatisfecho, 2 = Insatisfecho, 3 = Neutral, 4 = Satisfecho y 5 = Muy satisfecho
Supongamos que se realizó una encuesta a 100 usuarios para conocer que tan satisfecho están con el servicio, para ello construiremos un ejemplo con sample() y 2 con rep()
# Definimos el vector de posibilidades a
a2 = c("Muy insatisfecho","Insatisfecho", "Neutral", "Satisfecho", "Muy satisfecho")
# Se genera 1 "bases de datos" w2 con un set.seed()
set.seed(100)
# w2 completamente aleatorio
w2 = sample(a2,100,replace = T,prob = NULL)
w2
## [1] "Insatisfecho" "Neutral" "Muy insatisfecho"
## [4] "Insatisfecho" "Satisfecho" "Satisfecho"
## [7] "Insatisfecho" "Neutral" "Insatisfecho"
## [10] "Muy satisfecho" "Satisfecho" "Neutral"
## [13] "Neutral" "Insatisfecho" "Muy insatisfecho"
## [16] "Insatisfecho" "Neutral" "Satisfecho"
## [19] "Satisfecho" "Satisfecho" "Muy satisfecho"
## [22] "Neutral" "Muy insatisfecho" "Neutral"
## [25] "Satisfecho" "Insatisfecho" "Muy satisfecho"
## [28] "Muy satisfecho" "Muy satisfecho" "Muy insatisfecho"
## [31] "Muy satisfecho" "Satisfecho" "Neutral"
## [34] "Muy insatisfecho" "Muy insatisfecho" "Muy insatisfecho"
## [37] "Neutral" "Muy insatisfecho" "Muy insatisfecho"
## [40] "Satisfecho" "Neutral" "Muy satisfecho"
## [43] "Neutral" "Satisfecho" "Neutral"
## [46] "Neutral" "Neutral" "Satisfecho"
## [49] "Neutral" "Muy satisfecho" "Satisfecho"
## [52] "Satisfecho" "Neutral" "Muy insatisfecho"
## [55] "Insatisfecho" "Muy satisfecho" "Neutral"
## [58] "Muy satisfecho" "Satisfecho" "Muy satisfecho"
## [61] "Satisfecho" "Satisfecho" "Muy satisfecho"
## [64] "Muy insatisfecho" "Insatisfecho" "Muy insatisfecho"
## [67] "Insatisfecho" "Satisfecho" "Muy satisfecho"
## [70] "Insatisfecho" "Insatisfecho" "Satisfecho"
## [73] "Muy insatisfecho" "Insatisfecho" "Neutral"
## [76] "Neutral" "Neutral" "Insatisfecho"
## [79] "Insatisfecho" "Muy insatisfecho" "Muy satisfecho"
## [82] "Neutral" "Insatisfecho" "Neutral"
## [85] "Insatisfecho" "Neutral" "Satisfecho"
## [88] "Insatisfecho" "Muy satisfecho" "Muy insatisfecho"
## [91] "Satisfecho" "Insatisfecho" "Neutral"
## [94] "Insatisfecho" "Neutral" "Neutral"
## [97] "Satisfecho" "Muy insatisfecho" "Insatisfecho"
## [100] "Insatisfecho"
class(w2)
## [1] "character"
Ya se sabe que no es posible estimar la media por ser de tipo character, pero sí sus frecuencias a través de table()
# Al ser de clase character, se puede estimar table
t2 = table(w2)
t2
## w2
## Insatisfecho Muy insatisfecho Muy satisfecho Neutral
## 22 16 15 26
## Satisfecho
## 21
Generación de base w3 cargado hacia insatisfecho y muy insatisfecho
# Utilizamos el vector de posibilidades
a2 = c("Muy insatisfecho","Insatisfecho", "Neutral", "Satisfecho", "Muy satisfecho")
# Se genera 1 "bases de datos" w3 con rep
w3 = rep(a2, c(25,35,5,25,10))
# se les da un orden aleatorio
w3 = sample(w3)
w3
## [1] "Muy insatisfecho" "Insatisfecho" "Insatisfecho"
## [4] "Insatisfecho" "Satisfecho" "Satisfecho"
## [7] "Insatisfecho" "Insatisfecho" "Insatisfecho"
## [10] "Insatisfecho" "Satisfecho" "Muy insatisfecho"
## [13] "Insatisfecho" "Neutral" "Muy insatisfecho"
## [16] "Satisfecho" "Muy insatisfecho" "Muy insatisfecho"
## [19] "Satisfecho" "Insatisfecho" "Satisfecho"
## [22] "Satisfecho" "Insatisfecho" "Muy insatisfecho"
## [25] "Muy insatisfecho" "Insatisfecho" "Muy insatisfecho"
## [28] "Insatisfecho" "Muy insatisfecho" "Neutral"
## [31] "Satisfecho" "Insatisfecho" "Muy insatisfecho"
## [34] "Insatisfecho" "Muy insatisfecho" "Neutral"
## [37] "Muy insatisfecho" "Satisfecho" "Satisfecho"
## [40] "Insatisfecho" "Muy satisfecho" "Satisfecho"
## [43] "Insatisfecho" "Muy insatisfecho" "Insatisfecho"
## [46] "Muy insatisfecho" "Insatisfecho" "Satisfecho"
## [49] "Satisfecho" "Satisfecho" "Muy insatisfecho"
## [52] "Muy insatisfecho" "Satisfecho" "Muy satisfecho"
## [55] "Muy satisfecho" "Muy satisfecho" "Muy satisfecho"
## [58] "Satisfecho" "Muy satisfecho" "Muy insatisfecho"
## [61] "Insatisfecho" "Insatisfecho" "Insatisfecho"
## [64] "Satisfecho" "Insatisfecho" "Insatisfecho"
## [67] "Satisfecho" "Muy insatisfecho" "Muy insatisfecho"
## [70] "Muy insatisfecho" "Muy insatisfecho" "Insatisfecho"
## [73] "Insatisfecho" "Satisfecho" "Satisfecho"
## [76] "Muy satisfecho" "Satisfecho" "Insatisfecho"
## [79] "Insatisfecho" "Insatisfecho" "Insatisfecho"
## [82] "Muy satisfecho" "Insatisfecho" "Satisfecho"
## [85] "Muy insatisfecho" "Satisfecho" "Muy insatisfecho"
## [88] "Muy satisfecho" "Insatisfecho" "Satisfecho"
## [91] "Muy insatisfecho" "Neutral" "Satisfecho"
## [94] "Muy insatisfecho" "Insatisfecho" "Neutral"
## [97] "Muy satisfecho" "Insatisfecho" "Insatisfecho"
## [100] "Insatisfecho"
class(w3)
## [1] "character"
t3 = table(w3)
t3
## w3
## Insatisfecho Muy insatisfecho Muy satisfecho Neutral
## 35 25 10 5
## Satisfecho
## 25
Generación de base w4 cargado hacia satisfecho y muy satisfecho
# Utilizamos el vector de posibilidades
a2 = c("Muy insatisfecho","Insatisfecho", "Neutral", "Satisfecho", "Muy satisfecho")
# Se genera 1 "bases de datos" w4 con rep
w4 = rep(a2, c(10,20,10,35,25))
# se les da un orden aleatorio
w4 = sample(w4)
w4
## [1] "Satisfecho" "Muy satisfecho" "Insatisfecho"
## [4] "Satisfecho" "Satisfecho" "Muy satisfecho"
## [7] "Neutral" "Muy satisfecho" "Satisfecho"
## [10] "Muy insatisfecho" "Satisfecho" "Insatisfecho"
## [13] "Satisfecho" "Muy satisfecho" "Muy insatisfecho"
## [16] "Muy satisfecho" "Satisfecho" "Satisfecho"
## [19] "Insatisfecho" "Neutral" "Muy insatisfecho"
## [22] "Muy insatisfecho" "Insatisfecho" "Muy satisfecho"
## [25] "Satisfecho" "Muy satisfecho" "Satisfecho"
## [28] "Satisfecho" "Satisfecho" "Satisfecho"
## [31] "Satisfecho" "Neutral" "Muy insatisfecho"
## [34] "Satisfecho" "Neutral" "Muy satisfecho"
## [37] "Muy satisfecho" "Muy satisfecho" "Muy satisfecho"
## [40] "Satisfecho" "Muy satisfecho" "Muy satisfecho"
## [43] "Satisfecho" "Satisfecho" "Insatisfecho"
## [46] "Insatisfecho" "Muy satisfecho" "Muy satisfecho"
## [49] "Muy satisfecho" "Muy insatisfecho" "Satisfecho"
## [52] "Neutral" "Muy satisfecho" "Insatisfecho"
## [55] "Satisfecho" "Insatisfecho" "Satisfecho"
## [58] "Insatisfecho" "Muy satisfecho" "Satisfecho"
## [61] "Insatisfecho" "Insatisfecho" "Neutral"
## [64] "Muy satisfecho" "Insatisfecho" "Satisfecho"
## [67] "Insatisfecho" "Satisfecho" "Insatisfecho"
## [70] "Muy satisfecho" "Muy satisfecho" "Satisfecho"
## [73] "Muy satisfecho" "Insatisfecho" "Muy insatisfecho"
## [76] "Satisfecho" "Neutral" "Muy satisfecho"
## [79] "Insatisfecho" "Insatisfecho" "Satisfecho"
## [82] "Satisfecho" "Neutral" "Satisfecho"
## [85] "Muy satisfecho" "Insatisfecho" "Muy insatisfecho"
## [88] "Satisfecho" "Insatisfecho" "Muy insatisfecho"
## [91] "Satisfecho" "Satisfecho" "Muy satisfecho"
## [94] "Muy insatisfecho" "Neutral" "Satisfecho"
## [97] "Satisfecho" "Neutral" "Insatisfecho"
## [100] "Satisfecho"
class(w4)
## [1] "character"
t4 = table(w4)
t4
## w4
## Insatisfecho Muy insatisfecho Muy satisfecho Neutral
## 20 10 25 10
## Satisfecho
## 35
El siguiente paso es agrupar las bases
#concatenarlo mediante cbind()
w = cbind(w2, w3, w4)
# La clase por lo pronto es "matrix" "array", por lo tanto, no es posible estimar las medias cuando los datos son character
class(w)
## [1] "matrix" "array"
str(w)
## chr [1:100, 1:3] "Insatisfecho" "Neutral" "Muy insatisfecho" ...
## - attr(*, "dimnames")=List of 2
## ..$ : NULL
## ..$ : chr [1:3] "w2" "w3" "w4"
No existe una forma “natural” de procesar datos ordinales, pues R no permite la interacción entre cualitativo y cuantitativo, es uno u otro como ya se ha demostrado, para los que hemos utilizado SPSS entenderán a lo que me refiero por la facilidad y las ventajas que una variable ordinal representa, categórica para obtener frecuencias y numérica cuando de trata de obtener medias, varianzas y otras mediciones. Sin embargo, la librería likert ayuda a graficar este tipo de variables en R, pero son necesarias 2 condiciones, que sea un data.frame y que los datos sean factor. Lo siguiente es cambiar la clase de matrix a data.frame
#cambiar la clase a data.frame, importante utilizar stringsAsFactors = TRUE, sin embargo, los ordena por orden alfabético
x = data.frame(w,stringsAsFactors = TRUE)
#Los encabezados los renombramos a palabras con sentido
colnames(x)= c("Limpieza","Precio","Tiempo")
head(x)
## Limpieza Precio Tiempo
## 1 Insatisfecho Muy insatisfecho Satisfecho
## 2 Neutral Insatisfecho Muy satisfecho
## 3 Muy insatisfecho Insatisfecho Insatisfecho
## 4 Insatisfecho Insatisfecho Satisfecho
## 5 Satisfecho Satisfecho Satisfecho
## 6 Satisfecho Satisfecho Muy satisfecho
# El resultado por un lado es la nueva clase data.frame y con variables factor pero ordenados por orden alfabético, es decir, Insatisfecho = 1, cuando el que debería ser el 1 es Muy insatisfecho
class(x)
## [1] "data.frame"
str(x)
## 'data.frame': 100 obs. of 3 variables:
## $ Limpieza: Factor w/ 5 levels "Insatisfecho",..: 1 4 2 1 5 5 1 4 1 3 ...
## $ Precio : Factor w/ 5 levels "Insatisfecho",..: 2 1 1 1 5 5 1 1 1 1 ...
## $ Tiempo : Factor w/ 5 levels "Insatisfecho",..: 5 3 1 5 5 3 4 3 5 2 ...
Ordenar los datos de manera “conveniente”
# Se realiza a través de factor (se podría omitir labels porque R le da los valores de manera automática del 1 al 5, esto siempre y cuando en la "base de datos" existan todos los valores), para este caso los valores son: 1 = Muy insatisfecho, 2 = Insatisfecho, 3 = Neutral, 4 = Satisfecho y 5 = Muy satisfecho
x$Limpieza = factor(x$Limpieza,levels = a2, ordered = T)
x$Limpieza
## [1] Insatisfecho Neutral Muy insatisfecho Insatisfecho
## [5] Satisfecho Satisfecho Insatisfecho Neutral
## [9] Insatisfecho Muy satisfecho Satisfecho Neutral
## [13] Neutral Insatisfecho Muy insatisfecho Insatisfecho
## [17] Neutral Satisfecho Satisfecho Satisfecho
## [21] Muy satisfecho Neutral Muy insatisfecho Neutral
## [25] Satisfecho Insatisfecho Muy satisfecho Muy satisfecho
## [29] Muy satisfecho Muy insatisfecho Muy satisfecho Satisfecho
## [33] Neutral Muy insatisfecho Muy insatisfecho Muy insatisfecho
## [37] Neutral Muy insatisfecho Muy insatisfecho Satisfecho
## [41] Neutral Muy satisfecho Neutral Satisfecho
## [45] Neutral Neutral Neutral Satisfecho
## [49] Neutral Muy satisfecho Satisfecho Satisfecho
## [53] Neutral Muy insatisfecho Insatisfecho Muy satisfecho
## [57] Neutral Muy satisfecho Satisfecho Muy satisfecho
## [61] Satisfecho Satisfecho Muy satisfecho Muy insatisfecho
## [65] Insatisfecho Muy insatisfecho Insatisfecho Satisfecho
## [69] Muy satisfecho Insatisfecho Insatisfecho Satisfecho
## [73] Muy insatisfecho Insatisfecho Neutral Neutral
## [77] Neutral Insatisfecho Insatisfecho Muy insatisfecho
## [81] Muy satisfecho Neutral Insatisfecho Neutral
## [85] Insatisfecho Neutral Satisfecho Insatisfecho
## [89] Muy satisfecho Muy insatisfecho Satisfecho Insatisfecho
## [93] Neutral Insatisfecho Neutral Neutral
## [97] Satisfecho Muy insatisfecho Insatisfecho Insatisfecho
## 5 Levels: Muy insatisfecho < Insatisfecho < Neutral < ... < Muy satisfecho
x$Precio = factor(x$Precio,levels = a2, ordered = T)
x$Precio
## [1] Muy insatisfecho Insatisfecho Insatisfecho Insatisfecho
## [5] Satisfecho Satisfecho Insatisfecho Insatisfecho
## [9] Insatisfecho Insatisfecho Satisfecho Muy insatisfecho
## [13] Insatisfecho Neutral Muy insatisfecho Satisfecho
## [17] Muy insatisfecho Muy insatisfecho Satisfecho Insatisfecho
## [21] Satisfecho Satisfecho Insatisfecho Muy insatisfecho
## [25] Muy insatisfecho Insatisfecho Muy insatisfecho Insatisfecho
## [29] Muy insatisfecho Neutral Satisfecho Insatisfecho
## [33] Muy insatisfecho Insatisfecho Muy insatisfecho Neutral
## [37] Muy insatisfecho Satisfecho Satisfecho Insatisfecho
## [41] Muy satisfecho Satisfecho Insatisfecho Muy insatisfecho
## [45] Insatisfecho Muy insatisfecho Insatisfecho Satisfecho
## [49] Satisfecho Satisfecho Muy insatisfecho Muy insatisfecho
## [53] Satisfecho Muy satisfecho Muy satisfecho Muy satisfecho
## [57] Muy satisfecho Satisfecho Muy satisfecho Muy insatisfecho
## [61] Insatisfecho Insatisfecho Insatisfecho Satisfecho
## [65] Insatisfecho Insatisfecho Satisfecho Muy insatisfecho
## [69] Muy insatisfecho Muy insatisfecho Muy insatisfecho Insatisfecho
## [73] Insatisfecho Satisfecho Satisfecho Muy satisfecho
## [77] Satisfecho Insatisfecho Insatisfecho Insatisfecho
## [81] Insatisfecho Muy satisfecho Insatisfecho Satisfecho
## [85] Muy insatisfecho Satisfecho Muy insatisfecho Muy satisfecho
## [89] Insatisfecho Satisfecho Muy insatisfecho Neutral
## [93] Satisfecho Muy insatisfecho Insatisfecho Neutral
## [97] Muy satisfecho Insatisfecho Insatisfecho Insatisfecho
## 5 Levels: Muy insatisfecho < Insatisfecho < Neutral < ... < Muy satisfecho
x$Tiempo = factor(x$Tiempo,levels = a2, ordered = T)
x$Tiempo
## [1] Satisfecho Muy satisfecho Insatisfecho Satisfecho
## [5] Satisfecho Muy satisfecho Neutral Muy satisfecho
## [9] Satisfecho Muy insatisfecho Satisfecho Insatisfecho
## [13] Satisfecho Muy satisfecho Muy insatisfecho Muy satisfecho
## [17] Satisfecho Satisfecho Insatisfecho Neutral
## [21] Muy insatisfecho Muy insatisfecho Insatisfecho Muy satisfecho
## [25] Satisfecho Muy satisfecho Satisfecho Satisfecho
## [29] Satisfecho Satisfecho Satisfecho Neutral
## [33] Muy insatisfecho Satisfecho Neutral Muy satisfecho
## [37] Muy satisfecho Muy satisfecho Muy satisfecho Satisfecho
## [41] Muy satisfecho Muy satisfecho Satisfecho Satisfecho
## [45] Insatisfecho Insatisfecho Muy satisfecho Muy satisfecho
## [49] Muy satisfecho Muy insatisfecho Satisfecho Neutral
## [53] Muy satisfecho Insatisfecho Satisfecho Insatisfecho
## [57] Satisfecho Insatisfecho Muy satisfecho Satisfecho
## [61] Insatisfecho Insatisfecho Neutral Muy satisfecho
## [65] Insatisfecho Satisfecho Insatisfecho Satisfecho
## [69] Insatisfecho Muy satisfecho Muy satisfecho Satisfecho
## [73] Muy satisfecho Insatisfecho Muy insatisfecho Satisfecho
## [77] Neutral Muy satisfecho Insatisfecho Insatisfecho
## [81] Satisfecho Satisfecho Neutral Satisfecho
## [85] Muy satisfecho Insatisfecho Muy insatisfecho Satisfecho
## [89] Insatisfecho Muy insatisfecho Satisfecho Satisfecho
## [93] Muy satisfecho Muy insatisfecho Neutral Satisfecho
## [97] Satisfecho Neutral Insatisfecho Satisfecho
## 5 Levels: Muy insatisfecho < Insatisfecho < Neutral < ... < Muy satisfecho
head(x)
## Limpieza Precio Tiempo
## 1 Insatisfecho Muy insatisfecho Satisfecho
## 2 Neutral Insatisfecho Muy satisfecho
## 3 Muy insatisfecho Insatisfecho Insatisfecho
## 4 Insatisfecho Insatisfecho Satisfecho
## 5 Satisfecho Satisfecho Satisfecho
## 6 Satisfecho Satisfecho Muy satisfecho
str(x)
## 'data.frame': 100 obs. of 3 variables:
## $ Limpieza: Ord.factor w/ 5 levels "Muy insatisfecho"<..: 2 3 1 2 4 4 2 3 2 5 ...
## $ Precio : Ord.factor w/ 5 levels "Muy insatisfecho"<..: 1 2 2 2 4 4 2 2 2 2 ...
## $ Tiempo : Ord.factor w/ 5 levels "Muy insatisfecho"<..: 4 5 2 4 4 5 3 5 4 1 ...
Uso de la librería likert para este punto es muy importante tener instalada likert(), ggplot2() y xtable().
# activación de likert
library(likert)
## Warning: package 'likert' was built under R version 4.1.3
## Loading required package: ggplot2
## Loading required package: xtable
## Warning: package 'xtable' was built under R version 4.1.3
library(ggplot2)
library(xtable)
Aplicación de likert
# Definimos una nueva variable con la función de likert
xlik = likert(x)
# Se obtiene el resumen donde por fin es posible medir las frecuencias categóricas y estimar los promedios y desviaciones estándar de cada variable
summary(xlik)
## Item low neutral high mean sd
## 3 Tiempo 30 10 60 3.45 1.328590
## 1 Limpieza 38 26 36 2.97 1.298445
## 2 Precio 60 5 35 2.60 1.363300
# La clase de las variables es likert
class(xlik)
## [1] "likert"
str(xlik)
## List of 6
## $ results :'data.frame': 3 obs. of 6 variables:
## ..$ Item : chr [1:3] "Limpieza" "Precio" "Tiempo"
## ..$ Muy insatisfecho: num [1:3] 16 25 10
## ..$ Insatisfecho : num [1:3] 22 35 20
## ..$ Neutral : num [1:3] 26 5 10
## ..$ Satisfecho : num [1:3] 21 25 35
## ..$ Muy satisfecho : num [1:3] 15 10 25
## $ items :'data.frame': 100 obs. of 3 variables:
## ..$ Limpieza: Ord.factor w/ 5 levels "Muy insatisfecho"<..: 2 3 1 2 4 4 2 3 2 5 ...
## ..$ Precio : Ord.factor w/ 5 levels "Muy insatisfecho"<..: 1 2 2 2 4 4 2 2 2 2 ...
## ..$ Tiempo : Ord.factor w/ 5 levels "Muy insatisfecho"<..: 4 5 2 4 4 5 3 5 4 1 ...
## $ grouping: NULL
## $ factors : NULL
## $ nlevels : int 5
## $ levels : chr [1:5] "Muy insatisfecho" "Insatisfecho" "Neutral" "Satisfecho" ...
## - attr(*, "class")= chr "likert"
Gráficos
plot(xlik,type = "bar", centered = T, group.order = colnames(x))
Barras centrado likert:
plot(xlik,type = "bar", centered = F, group.order = colnames(x), legend.position = "right")
Barras sin centrar de likert:
plot(xlik,type = "density", centered = F, group.order = colnames(x), legend.position = "right")
Densidad likert:
# Finalmente, en este gráfico se pueden visualizar la frecuencia de las variables cualitativas (Muy insatisfecho, ..., Muy Satisfecho) y las numércias como la media y la desviación estándar.
plot(xlik,type = "heat")
Gráfico de calor likert:
Finalmente se logró en un gráfico, el de calor (heat) conocer las variables categóricas, obsérvense la parte inferior y en la primer columna los promedios y desviaciones estándar, lo que llamo variable ordinal con valores.