alt text

https://www.polymetrix.mx

Introducción

Este proyecto muestra los principales tipos de datos puntuales (datapoint): 1) numeric, 2) integer, 3) complex, 4) logical, 5) character, 6) factor y 7) Ordinales. Omite los objetos más complejos como vectores, listas, arreglos, matrices y dataframes, pues son un conjunto de datos puntuales, es decir, agrupa varios datapoints.

Tipos de datos

Básicamente existen 7 tipos de datos desde mi perspectiva:

  1. integer que, son los números enteros,
  2. numeric que son números reales,
  3. complex números complejos,
  4. logical verdadero o falso,
  5. character que son palabras de texto,
  6. factor que son las variables categóricas y
  7. ordinales que son parecidos a los cualitativos, sin embargo, en R no existen.

    1) numeric

    Son números con decimales, se pueden realizar todas las principales operaciones conocidas, por ejemplo:
numero = 2.7978
numero
## [1] 2.7978
class(numero)
## [1] "numeric"

2) integer

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"

3) complex

complex

Son números complejos que aceptan decimales

com = 3.14-9.2i
com
## [1] 3.14-9.2i
class(com)
## [1] "complex"

4) logical

logical

Verdadero (TRUE) o falso (FALSE). Es el resultado de operaciones lógicas.

5>8
## [1] FALSE
5<8
## [1] TRUE

5) character

character

Es una cadena de texto sin significado numérico.

texto = "hola mundo"
texto
## [1] "hola mundo"
class(texto)
## [1] "character"

6) factor

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

Ejemplo 1 factor

Supongamos que tenemos 3 tipos de tallas:

  1. Ch = chica,
  2. M = mediana y
  3. G = Grande

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)

Ejemplo 2 factor

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)

7) ordinal

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:

Ejemplo 1 ordinal

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

Ejemplo 2 ordinal

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

Likert al rescate

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.