sábado, 25 de mayo de 2024

Escalamiento tipo Likert

Analisis de datos para la planificacion estrategica. Usos del paquete likert

Una de las escala psicométricas más empleadas en el contexto de las ciencias sociales para evaluar las conductas, creencias, valores, opiniones, actitudes y,o, ideales de una persona o una población es la creada por Rensis Likert (1903-1981). A las personas se les pregunda sobre su grado de acuerdo o satisfacción con un contenido que se le presenta. Por ejemplo Por favor, dígame si está muy de acuerdo (1), de acuerdo (2), en desacuerdo (3) o muy en desacuerdo (4), con las siguientes afirmaciones. La democracia permite que se solucionen los problemas que tenemos. R cuenta con numerosos paquetes que nos permiten trabajar y visualizar este tipo de escala. En este post usaré específicamente el paquete Likert para analizar data sobre Venezuela obtenida de Latinobarómetro. Es un ejemplo básico


Obtención de los datos

Lo primero que debemos hacer es subir la data. La tenemos en formato .csv y la podemos subir a la consonla de R empleando el asistente de importación de RStudio o, simplemente, empleando cualquiera de las funciones para importar .csv.

# subo la data

mini1995 <- read.csv("~/latinobarometro_1995.csv",
                     dec= ",", header = TRUE)

Estoy imporantando un marco de datos que se encuentra ubicado en el directorio desde el que estoy operando en R. Si tiene dudas sobre cuál es el directorio de trabajo, escriba en la consola getwd() y presiones enter. De inmediato obtendrá la información sobre el diretorio de trabajo. Si la data que usted desea trabajar no está ubicada en ese directorio, será bueno que le indique a R la ubicación completa. Así, por ejemplo, si tengo la data en una carpeta denominada latinbarometro y esa carpeta está en una unidad extraible D: usted podría indicarle a R el camino hacia la data, o cambiar su directorio de trabajo:

# Opcion 1: indicar el camino completo

mini1995 <- read.csv("d:/latinobarometro/latinbarometro_1995.csv")


# Opcion 2: cambiar directorio de trabajo y obtener la data
setwd("d:/latinobarometro")

mini1995 <- read.csv("~/latinobarometro_1995.csv",
                     dec= ",", header = TRUE)

Una vez que he obtenido la data, es necesario explorarla, de esta manera sabremos si los datos obtenidos son correctos. Esto es, evaluar si hay datos perdidos, si las categorias de las variables son consistentes, si hay valores extremos, si las categorías y lo nombres de las variables no contienen errores de transcripción, etc.

Exploración de la data

Quiero saber qué variables y casos tengo y la información sobre el tipo de data

str(mini1995)
## Classes 'tbl_df', 'tbl' and 'data.frame':    1200 obs. of  25 variables:
##  $ enc      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ p1       : chr  "MUY MALA" "MUY MALA" "REGULAR" "MALA" ...
##  $ p4       : chr  "REGULAR" "REGULAR" "REGULAR" "REGULAR" ...
##  $ p11      : chr  "BASTANTE ORGULLOSO" "MUY ORGULLOSO" "MUY ORGULLOSO" "MUY ORGULLOSO" ...
##  $ p12      : chr  "ESTA EN RETROCESO" "ESTA ESTANCADO" "ESTA ESTANCADO" "ESTA ESTANCADO" ...
##  $ p20      : chr  "DEMOCRACIA ES PREFERIBLE" "DEMOCRACIA ES PREFERIBLE" "DEMOCRACIA ES PREFERIBLE" "DEMOCRACIA ES PREFERIBLE" ...
##  $ p21      : chr  "MAS BIEN SATISFECHO" "MAS BIEN SATISFECHO" "NO MUY SATISFECHO" "MUY SATISFECHO" ...
##  $ p22      : chr  "DEMOCRACIA NO SOLUCIONA PROB." "DEMOCRACIA SOLUCIONA PROB." "DEMOCRACIA SOLUCIONA PROB." "DEMOCRACIA NO SOLUCIONA PROB." ...
##  $ p27b     : chr  "POCA CONFIANZA" "MUCHA CONFIANZA" "MUCHA CONFIANZA" "POCA CONFIANZA" ...
##  $ p27d     : chr  "POCA CONFIANZA" "POCA CONFIANZA" "POCA CONFIANZA" "POCA CONFIANZA" ...
##  $ p27i     : chr  "POCA CONFIANZA" "NINGUNA CONFIANZA" "POCA CONFIANZA" "POCA CONFIANZA" ...
##  $ p27j     : chr  "POCA CONFIANZA" "ALGO DE CONFIANZA" "POCA CONFIANZA" "MUCHA CONFIANZA" ...
##  $ p27m     : chr  "POCA CONFIANZA" "ALGO DE CONFIANZA" "ALGO DE CONFIANZA" "MUCHA CONFIANZA" ...
##  $ p31      : int  97 5 98 98 7 10 10 98 5 6 ...
##  $ p35      : chr  "MANO DURA NO VIENE MAL" "MANO DURA NO ES BUENA" "MANO DURA NO VIENE MAL" "NS" ...
##  $ s1       : int  1 1 1 1 1 1 2 2 2 1 ...
##  $ s2       : int  32 35 20 74 50 72 18 63 34 32 ...
##  $ s3       : int  10 5 5 10 7 3 11 4 7 8 ...
##  $ s6       : chr  "CASADO/CONVIVIENTE" "CASADO/CONVIVIENTE" "SOLTERO" "CASADO/CONVIVIENTE" ...
##  $ s10      : chr  "INDEPENDIENTE" "ASALARIADO PRIVADO" "ASALARIADO PRIVADO" "ASALARIADO PRIVADO" ...
##  $ s20      : int  3 4 5 1 3 0 6 3 6 4 ...
##  $ s24      : chr  "REGULAR" "REGULAR" "REGULAR" "REGULAR" ...
##  $ edad     : chr  "25-34" "35-44" "18-24" "65 y mas" ...
##  $ educacion: chr  "BASICA COMPLETA" "SECUND. INCOMPLETA" "SECUND. COMPLETA" "ANALFABETA" ...
##  $ sexo     : chr  "MASCULINO" "MASCULINO" "MASCULINO" "MASCULINO" ...
##  - attr(*, "spec")=List of 2

##   ..$ default: list()
##   .. ..- attr(*, "class")= chr  "collector_guess" "collector"
##   ..- attr(*, "class")= chr "col_spec"

La función str() me indica que el marco de daos mini1995 es de tipo tbl_df, tbl y data.frame (marco de datos). Tiene 1200 observaciones y 25 variables. Me indica el nombre de las variables, ejmplo: p1, p4, p11, p20, etc., y me ofrece información sobre el tipo de variables e igualmente me colaca algunas de las categegorías de cada variable. La mayoria de las variables son de tipo ch, caracter, o lo que equivale a decir nominales. Otras como la s1, s2, y s3, son de tipo numérico, concretamente son discretas, lo que en R se indica como int.

Luego de la información sobre las variables, la función str nos indica el tipo de atributo asociado con las variables. Si esta última información no se despliega cuando usted emplee str no tiene motivos para preocupars, porque deseamos conocer las características de las variables.

Este resumen me permitir saber desde ya que no se está trabajando con todo el marco de datos de Latinobarómetro 1995. Por un lado, en ese marco hay aproximadamente 9 mil casos y por el otro, hay más de 200 variables. Observo, además, que debo transformar algunas variables de nominales a ordinales y,o, de intervalo.

Para este ejercicio voy a seleccionar sólo una variable y la voy a explorar y a analizar tomando en cuenta las variables demográficas. Voy a tomar la variable p11. Para saber a qué se refiere esta variable, revise el cuestionario que acompaña a cada marco de datos.

# exploro las categorias de la variable p11
table(mini1995$p11)
## 
## BASTANTE ORGULLOSO      MUY ORGULLOSO     NADA ORGULLOSO 
##                174                970                  7 
##                 NR                 NS     POCO ORGULLOSO 
##                  6                  4                 39
# exploro las categorias de las variables demograficas

sapply(mini1995[, c(20, 22:25)], table)
## $s10
## 
## ASALARIADO PRIVADO ASALARIADO PUBLICO         ESTUDIANTE 
##                173                171                110 
##      INDEPENDIENTE   RESPONSABLE CASA   RETIRADO/PENSION 
##                325                290                 49 
## TEMPOR. NO TRABAJA 
##                 82 
## 
## $s24
## 
##     BUENO      MALO MUY BUENO  MUY MALO   REGULAR 
##       403       124        88        15       570 
## 
## $edad
## 
##    18-24    25-34    35-44    45-44    55-64 65 y mas 
##      285      332      252      161       89       81 
## 
## $educacion
## 
##          ANALFABETA     BASICA COMPLETA   BASICA INCOMPLETA 
##                 119                 220                  69 
##                  NA    SECUND. COMPLETA  SECUND. INCOMPLETA 
##                  18                 277                 276 
##   SUPERIOR COMPLETA SUPERIOR INCOMPLETA 
##                 113                 108 
## 
## $sexo
## 
##  FEMENINO MASCULINO 
##       604       596

En el primer caso solo deseo explorar una sola variable, la p11. Empleo la funcion table(). En el segundo caso, deseo explorar mas de dos variables. Empleo la funcion sapply. Esta funcion le está diciendo a R: “del marco de datos mini1995, busca la variables 20, y luego de la 22 a la 25 y aplícales la función table”.

Me doy cuenta de que debo arreglar las categorías de las variables s24 y educacion para que aparezcan en un orden lógico, pues se trata de variables ordinales en las que el orden cuenta.

Limpieza de variables

mini1995$s24 <- factor(mini1995$s24, levels = c("MUY MALO",
                                                "MALO",
                                                "REGULAR",
                                                "BUENO",
                                                "MUY BUENO"))

Le he dicho a R que aplique la función factor() en la variable s24 del marco de datos mini1995. Esta función transformará la variable s24 de nominal a ordinal, y además ordenará las categorías siguiendo un orden lógico de muy malo a muy bueno. Hago lo mismo con los intervalos de la variable educacion

mini1995$educacion <- factor(mini1995$educacion,
                             levels = c("ANALFABETA",
                                        "BASICA INCOMPLETA",
                                        "BASICA COMPLETA",
                                       "SECUND. INCOMPLETA",
                                      "SECUND. COMPLETA",
                                      "SUPERIOR INCOMPLETA",
                                      "SUPERIOR COMPLETA"))

Verifico el resultado

table(mini1995$s24)
## 
##  MUY MALO      MALO   REGULAR     BUENO MUY BUENO 
##        15       124       570       403        88
table(mini1995$educacion)
## 
##          ANALFABETA   BASICA INCOMPLETA     BASICA COMPLETA 
##                 119                  69                 220 
##  SECUND. INCOMPLETA    SECUND. COMPLETA SUPERIOR INCOMPLETA 
##                 276                 277                 108 
##   SUPERIOR COMPLETA 
##                 113

Analizamos esta data empleando el paquete likert

Uso del paquete Likert

Para trabajar con el paquee libre, las variables que deseamos analizar deben tener categorías similares, por ejemplo: muy bueno, bueno, regular, malo, muy malo. Si las categorías difieren, entonces lo recomendable es emplear el paquete HH.

En nuestro marco de dato de Latinobarómetro 1995, en esta ocasión trabajaré con

# subo el paquete

library(likert)
# extraigo algunas variables

items1 <- mini95B[,c("p27b", "p27m", "p27j",
                     "p27d", "p27i")]


# renombro las variables
names(items1)<- c("Fuerzas Armadas", "Gobierno",
                  "Partidos Políticos","Poder Judicial",
                  "Congreso")

# transformo el tibble en data.frame
items1 <-data.frame(items1)
l1 <- likert(items1)
 
l1
##                 Item NINGUNA CONFIANZA POCA CONFIANZA ALGO DE CONFIANZA
## 1    Fuerzas.Armadas          15.60102       28.81500          23.95567
## 2           Gobierno          42.89384       30.13699          16.18151
## 3 Partidos.Políticos          55.44218       28.48639           9.94898
## 4     Poder.Judicial          38.61893       31.96931          16.45354
## 5           Congreso          45.29915       32.39316          13.24786
##   MUCHA CONFIANZA
## 1       31.628303
## 2       10.787671
## 3        6.122449
## 4       12.958227
## 5        9.059829
summary(l1)
##                 Item      low neutral     high     mean        sd
## 1    Fuerzas.Armadas 44.41603       0 55.58397 2.716113 1.0718495
## 4     Poder.Judicial 70.58824       0 29.41176 2.037511 1.0337106
## 2           Gobierno 73.03082       0 26.96918 1.948630 1.0101956
## 5           Congreso 77.69231       0 22.30769 1.860684 0.9639753
## 3 Partidos.Políticos 83.92857       0 16.07143 1.667517 0.8882204
title <- "¿Cuanta confianza tiene Ud. en...?"

plot(l1, center=1.5, wrap=30) + ggtitle(title)

No hay comentarios.: