library(dplyr)
library(readxl)
library(psych)
library(ggplot2)Oficina de Psicometria — Grupo Soberba
Disciplina MPS5839 — Fundamentos de Psicometria
Introdução
Este documento apresenta uma Análise Fatorial Exploratória (AFE) de uma escala do tipo Likert composta por 20 itens (q1 a q20), com cinco opções de resposta: Discordo Totalmente (1), Discordo em partes (2), Nem concordo, nem discordo (3), Concordo em partes (4) e Concordo totalmente (5).
Os itens q5, q6, q11, q12, q13, q19 e q20 possuem pontuação reversa e foram recodificados antes da análise.
Preparação dos Dados
Carregamento de pacotes
Importação e inspeção dos dados
df <- read_excel("df.xlsx")
head(df)# A tibble: 6 × 26
`Carimbo de data/hora` Consentimento `Qual sua profissão?` `Qual sua idade?`
<dttm> <chr> <chr> <chr>
1 2026-03-31 04:45:27 Aceito partici… Enfermeira 29
2 2026-03-31 07:55:37 Aceito partici… Médico 32
3 2026-03-31 10:41:00 Aceito partici… Não sou da área da s… <NA>
4 2026-03-31 10:44:32 Aceito partici… Médico 34
5 2026-03-31 10:57:56 Aceito partici… Nutricionista 27
6 2026-03-31 11:01:29 Aceito partici… TI 45
# ℹ 22 more variables: `Com qual gênero se identifica?` <chr>,
# `Qual a sua formação?` <chr>, q1 <chr>, q2 <chr>, q3 <chr>, q4 <chr>,
# q5 <chr>, q6 <chr>, q7 <chr>, q8 <chr>, q9 <chr>, q10 <chr>, q11 <chr>,
# q12 <chr>, q13 <chr>, q14 <chr>, q15 <chr>, q16 <chr>, q17 <chr>,
# q18 <chr>, q19 <chr>, q20 <chr>
Conversão das respostas para valores numéricos
As respostas em texto foram convertidas para uma escala numérica de 1 a 5. Em seguida, os casos com valores ausentes (NA) foram removidos.
df <- df %>%
mutate(across(q1:q20, ~ case_match(
.,
"Concordo totalmente" ~ 5,
"Concordo em partes" ~ 4,
"Nem concordo, nem discordo" ~ 3,
"Discordo em partes" ~ 2,
"Discordo Totalmente" ~ 1
)))
df <- na.omit(df)Inversão dos itens reversos
Para os itens com pontuação reversa (q5, q6, q11, q12, q13, q19 e q20), a pontuação foi invertida pela fórmula \(6 - x\), de modo que um valor original de 5 passa a 1 e vice-versa.
df <- df %>%
mutate(across(c(q5, q6, q11, q12, q13, q19, q20), ~ 6 - .))Verificação da estrutura dos dados
head(df)# A tibble: 6 × 26
`Carimbo de data/hora` Consentimento `Qual sua profissão?` `Qual sua idade?`
<dttm> <chr> <chr> <chr>
1 2026-03-31 07:55:37 Aceito partici… Médico 32
2 2026-03-31 10:44:32 Aceito partici… Médico 34
3 2026-03-31 10:57:56 Aceito partici… Nutricionista 27
4 2026-03-31 11:01:29 Aceito partici… TI 45
5 2026-03-31 11:10:34 Aceito partici… Biólogo 26
6 2026-03-31 11:13:27 Aceito partici… Educador físico 24
# ℹ 22 more variables: `Com qual gênero se identifica?` <chr>,
# `Qual a sua formação?` <chr>, q1 <dbl>, q2 <dbl>, q3 <dbl>, q4 <dbl>,
# q5 <dbl>, q6 <dbl>, q7 <dbl>, q8 <dbl>, q9 <dbl>, q10 <dbl>, q11 <dbl>,
# q12 <dbl>, q13 <dbl>, q14 <dbl>, q15 <dbl>, q16 <dbl>, q17 <dbl>,
# q18 <dbl>, q19 <dbl>, q20 <dbl>
str(df %>% select(q1:q20))tibble [64 × 20] (S3: tbl_df/tbl/data.frame)
$ q1 : num [1:64] 5 3 4 3 4 2 2 3 4 4 ...
$ q2 : num [1:64] 5 2 1 2 2 2 4 1 4 2 ...
$ q3 : num [1:64] 5 2 3 2 3 1 1 2 2 5 ...
$ q4 : num [1:64] 5 3 1 1 3 1 1 1 2 5 ...
$ q5 : num [1:64] 1 2 1 1 2 1 2 2 2 1 ...
$ q6 : num [1:64] 1 4 1 1 2 2 2 1 1 2 ...
$ q7 : num [1:64] 5 2 1 3 3 3 2 2 3 5 ...
$ q8 : num [1:64] 5 3 1 3 3 2 1 3 4 5 ...
$ q9 : num [1:64] 5 3 2 1 3 1 1 1 1 4 ...
$ q10: num [1:64] 5 4 2 2 4 1 1 1 3 4 ...
$ q11: num [1:64] 1 2 2 4 3 4 5 5 4 4 ...
$ q12: num [1:64] 1 1 1 1 2 1 2 1 1 2 ...
$ q13: num [1:64] 1 3 5 1 3 2 2 1 2 5 ...
$ q14: num [1:64] 5 3 1 3 4 4 1 2 4 2 ...
$ q15: num [1:64] 5 3 1 1 4 1 1 1 1 1 ...
$ q16: num [1:64] 5 4 1 1 3 1 1 1 1 2 ...
$ q17: num [1:64] 5 4 3 2 4 4 3 1 4 3 ...
$ q18: num [1:64] 5 2 2 3 4 4 2 5 4 3 ...
$ q19: num [1:64] 1 2 3 1 3 1 2 2 2 2 ...
$ q20: num [1:64] 1 4 4 2 3 1 2 1 2 1 ...
- attr(*, "na.action")= 'omit' Named int [1:11] 1 3 9 25 36 37 38 41 44 46 ...
..- attr(*, "names")= chr [1:11] "1" "3" "9" "25" ...
cat("Número de observações:", nrow(df), "\n")Número de observações: 64
cat("Número de itens:", 20, "\n")Número de itens: 20
cat("Razão observações/itens:", round(nrow(df) / 20, 1))Razão observações/itens: 3.2
Análise Fatorial Exploratória
Etapa 1 — Matriz de correlações policóricas
Como os itens são ordinais (escala Likert), utilizamos correlações policóricas em vez de correlações de Pearson. A correlação policórica estima a associação entre duas variáveis latentes contínuas subjacentes às categorias observadas, sendo mais adequada para dados ordinais.
cor_poly <- polychoric(df %>% select(q1:q20))Etapa 2 — Verificação da fatorabilidade
Antes de extrair fatores, é necessário verificar se a matriz de correlações é adequada para fatoração. Para isso, utilizamos dois indicadores:
- KMO (Kaiser-Meyer-Olkin): avalia a proporção da variância dos itens que pode ser explicada por fatores latentes. Valores acima de 0.70 são considerados aceitáveis; acima de 0.80, bons.
- Teste de esfericidade de Bartlett: testa se a matriz de correlações é significativamente diferente de uma matriz identidade (i.e., se há correlações a serem exploradas). Espera-se \(p < 0.05\).
KMO(cor_poly$rho)Kaiser-Meyer-Olkin factor adequacy
Call: KMO(r = cor_poly$rho)
Overall MSA = 0.07
MSA for each item =
q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 q16
0.04 0.05 0.11 0.13 0.07 0.07 0.09 0.06 0.11 0.09 0.03 0.04 0.03 0.07 0.10 0.10
q17 q18 q19 q20
0.04 0.03 0.05 0.06
cortest.bartlett(cor_poly$rho, n = nrow(df))$chisq
[1] 1856.356
$p.value
[1] 7.323473e-271
$df
[1] 190
Nota: O valor de KMO obtido foi muito baixo, o que é esperado em amostras reduzidas (n = r nrow(df), correspondendo a uma razão de aproximadamente r round(nrow(df)/20, 1) observações por item). A literatura recomenda um mínimo de 5 a 10 observações por item para estimativas estáveis. Cabe ressaltar que o objetivo desta análise é primariamente didático e metodológico, a ênfase recai sobre a compreensão e aplicação correta dos procedimentos da AFE, e não sobre a generalização dos resultados. Ainda assim, os achados devem ser interpretados com cautela diante dessa limitação amostral.
Etapa 3 — Determinação do número de fatores
Utilizamos dois métodos complementares para determinar o número de fatores a serem extraídos:
- Análise Paralela: compara os autovalores observados com autovalores obtidos de dados aleatórios. Retemos apenas os fatores cujos autovalores excedem os simulados.
- MAP de Velicer (Minimum Average Partial): identifica o número de fatores que minimiza a correlação parcial média residual.
fa.parallel(cor_poly$rho, n.obs = nrow(df), fa = "fa", cor = "poly",
main = "Análise Paralela")Parallel analysis suggests that the number of factors = 3 and the number of components = NA
vss(cor_poly$rho, n.obs = nrow(df), rotate = "oblimin")
Very Simple Structure
Call: vss(x = cor_poly$rho, rotate = "oblimin", n.obs = nrow(df))
VSS complexity 1 achieves a maximimum of 0.65 with 2 factors
VSS complexity 2 achieves a maximimum of 0.73 with 2 factors
The Velicer MAP achieves a minimum of 0.04 with 2 factors
BIC achieves a minimum of 873.61 with 2 factors
Sample Size adjusted BIC achieves a minimum of 1091.42 with 8 factors
Statistics by number of factors
vss1 vss2 map dof chisq prob sqresid fit RMSEA BIC SABIC complex
1 0.51 0.00 0.049 170 1626 7.6e-236 23.8 0.51 0.37 919 1454 1.0
2 0.65 0.72 0.043 151 1502 5.6e-221 13.4 0.72 0.37 874 1349 1.2
3 0.53 0.70 0.046 133 1436 3.1e-217 12.4 0.74 0.39 883 1301 1.5
4 0.56 0.73 0.048 116 1367 1.5e-212 10.4 0.79 0.41 885 1250 1.6
5 0.43 0.66 0.054 100 1318 1.4e-211 10.9 0.77 0.44 902 1217 2.0
6 0.44 0.62 0.062 85 1250 2.2e-206 10.7 0.78 0.46 896 1164 2.3
7 0.47 0.63 0.067 71 1211 7.5e-207 9.4 0.81 0.50 915 1139 2.5
8 0.36 0.54 0.079 58 1150 1.2e-202 10.3 0.79 0.54 909 1091 2.6
eChisq SRMR eCRMS eBIC
1 341 0.118 0.125 -366
2 139 0.076 0.085 -489
3 97 0.063 0.075 -457
4 64 0.051 0.065 -419
5 46 0.044 0.060 -369
6 34 0.038 0.056 -319
7 24 0.031 0.051 -271
8 15 0.025 0.045 -226
Ambos os métodos convergiram para uma solução de 2 fatores.
Etapa 4 — Extração dos fatores e rotação
Extraímos 2 fatores utilizando o método Weighted Least Squares (WLS), adequado para matrizes policóricas, com rotação oblíqua (oblimin), que permite correlação entre os fatores.
afe <- fa(cor_poly$rho,
nfactors = 2,
rotate = "oblimin",
fm = "wls",
n.obs = nrow(df))
print(afe, cut = 0.40, sort = TRUE)Factor Analysis using method = wls
Call: fa(r = cor_poly$rho, nfactors = 2, n.obs = nrow(df), rotate = "oblimin",
fm = "wls")
Standardized loadings (pattern matrix) based upon correlation matrix
item WLS1 WLS2 h2 u2 com
q4 4 0.79 0.616 0.38 1.0
q3 3 0.73 0.534 0.47 1.0
q9 9 0.70 0.482 0.52 1.0
q10 10 0.66 0.443 0.56 1.1
q16 16 0.65 0.421 0.58 1.0
q15 15 0.64 0.444 0.56 1.1
q7 7 0.62 0.440 0.56 1.2
q2 2 0.50 0.271 0.73 1.3
q8 8 0.48 0.283 0.72 1.4
q1 1 0.202 0.80 1.8
q17 17 0.119 0.88 1.3
q6 6 0.67 0.454 0.55 1.1
q5 5 0.65 0.439 0.56 1.0
q20 20 0.58 0.338 0.66 1.0
q14 14 -0.57 0.387 0.61 1.3
q19 19 0.53 0.330 0.67 1.5
q12 12 0.50 0.251 0.75 1.0
q13 13 0.43 0.198 0.80 1.1
q11 11 0.113 0.89 1.3
q18 18 0.092 0.91 1.2
WLS1 WLS2
SS loadings 4.19 2.66
Proportion Var 0.21 0.13
Cumulative Var 0.21 0.34
Proportion Explained 0.61 0.39
Cumulative Proportion 0.61 1.00
With factor correlations of
WLS1 WLS2
WLS1 1.00 -0.06
WLS2 -0.06 1.00
Mean item complexity = 1.2
Test of the hypothesis that 2 factors are sufficient.
df null model = 190 with the objective function = 33.45 with Chi Square = 1856.36
df of the model are 151 and the objective function was 27.86
The root mean square of the residuals (RMSR) is 0.08
The df corrected root mean square of the residuals is 0.09
The harmonic n.obs is 64 with the empirical chi square 145.87 with prob < 0.6
The total n.obs was 64 with Likelihood Chi Square = 1509.34 with prob < 1.7e-222
Tucker Lewis Index of factoring reliability = -0.054
RMSEA index = 0.375 and the 90 % confidence intervals are 0.361 0.395
BIC = 881.35
Fit based upon off diagonal values = 0.92
Measures of factor score adequacy
WLS1 WLS2
Correlation of (regression) scores with factors 0.94 0.90
Multiple R square of scores with factors 0.89 0.80
Minimum correlation of possible factor scores 0.77 0.61
Nota: A solução com dois fatores explicou 34% da variância total, sendo 21% pelo Fator 1 e 13% pelo Fator 2. O Fator 1 agrupou nove itens diretos da escala — q4, q3, q9, q10, q16, q15, q7, q2 e q8 — com cargas variando de 0.48 a 0.79. São os itens que mais contribuíram para a estrutura fatorial, com comunalidades entre 0.27 e 0.62. O Fator 2 agrupou sete itens, a maioria com pontuação reversa: q6, q5, q20, q19, q12 e q13, com cargas entre 0.43 e 0.67. O item q14 também apareceu neste fator, porém com carga negativa (-0.57), o que indica que ele funciona na direção oposta aos demais, provavelmente por ser um item direto que compartilha variância de método com os reversos. Quatro itens não se encaixaram bem em nenhum dos fatores: q1, q17, q11 e q18. Todos apresentaram comunalidades muito baixas (abaixo de 0.20) e nenhuma carga acima de 0.40, o que significa que contribuem pouco para a estrutura da escala. Em versões futuras do instrumento, esses itens seriam candidatos a revisão ou exclusão. A correlação entre os dois fatores ficou próxima de zero (r = -0.06), o que sugere que a divisão em dois fatores não reflete necessariamente dois construtos distintos, mas sim um efeito de método ou seja, um artefato comum em escalas que combinam itens diretos e reversos. Quanto ao ajuste do modelo, o RMSR (0.08) e o índice de ajuste baseado em valores off-diagonal (0.92) foram satisfatórios. Já o TLI e o RMSEA ficaram fora dos parâmetros ideais, mas esses indicadores são reconhecidamente pouco confiáveis em amostras pequenas como a nossa (n = 64), de modo que não devem ser tomados como evidência definitiva de mau ajuste.
Etapa 5 — Avaliação da solução fatorial
Diagrama fatorial
fa.diagram(afe, simple = TRUE, main = "Estrutura Fatorial — 2 Fatores")Comunalidades
A comunalidade (\(h^2\)) indica a proporção da variância de cada item explicada pelos fatores. Valores abaixo de 0.20 sugerem itens com baixa representação na solução fatorial.
comunalidades <- data.frame(
Item = names(afe$communalities),
h2 = round(afe$communalities, 3)
)
comunalidades[order(comunalidades$h2), ] Item h2
q16 q16 0.107
q9 q9 0.132
q5 q5 0.173
q14 q14 0.183
q11 q11 0.208
q19 q19 0.213
q4 q4 0.255
q3 q3 0.278
q10 q10 0.280
q6 q6 0.301
q7 q7 0.315
q12 q12 0.327
q20 q20 0.347
q18 q18 0.352
q15 q15 0.386
q13 q13 0.389
q17 q17 0.424
q8 q8 0.501
q2 q2 0.535
q1 q1 0.559
Correlação entre fatores
round(afe$Phi, 3) WLS1 WLS2
WLS1 1.000 -0.058
WLS2 -0.058 1.000
Uma correlação próxima de zero entre os fatores sugere que a separação em dois fatores pode refletir um efeito de método (method effect) decorrente dos itens reversos, e não dois construtos substantivamente distintos.
Etapa 6 — Confiabilidade
Ômega (escala total)
O coeficiente ômega é mais robusto que o alfa para dados ordinais e estruturas multidimensionais.
omega(df %>% select(q1:q20), nfactors = 2)Omega
Call: omegah(m = m, nfactors = nfactors, fm = fm, key = key, flip = flip,
digits = digits, title = title, sl = sl, labels = labels,
plot = plot, n.obs = n.obs, rotate = rotate, Phi = Phi, option = option,
covar = covar)
Alpha: 0.77
G.6: 0.85
Omega Hierarchical: 0.13
Omega H asymptotic: 0.17
Omega Total 0.81
Schmid Leiman Factor loadings greater than 0.2
g F1* F2* h2 h2 u2 p2 com
q1 0.29 -0.21 0.16 0.84 0.16 2.43
q2 0.35 0.13 0.87 0.07 1.19
q3 0.21 0.70 0.53 0.53 0.47 0.08 1.19
q4 0.24 0.76 0.63 0.63 0.37 0.09 1.19
q5- 0.23 -0.67 0.51 0.51 0.49 0.10 1.24
q6- -0.63 0.43 0.43 0.57 0.07 1.19
q7 0.24 0.53 -0.21 0.38 0.38 0.62 0.14 1.72
q8 0.41 0.23 0.23 0.77 0.15 1.79
q9 0.67 0.49 0.49 0.51 0.08 1.18
q10 0.58 0.36 0.36 0.64 0.07 1.19
q11- -0.20 0.05 0.95 0.13 1.54
q12- -0.52 0.31 0.31 0.69 0.10 1.25
q13- -0.32 0.12 0.88 0.13 1.41
q14 -0.47 0.27 0.27 0.73 0.13 1.46
q15 0.46 0.25 0.25 0.75 0.12 1.35
q16 0.51 0.28 0.28 0.72 0.10 1.22
q17 0.21 0.07 0.93 0.16 2.14
q18 -0.23 0.06 0.94 0.11 1.29
q19- -0.23 -0.43 0.24 0.24 0.76 0.02 1.58
q20- -0.50 0.28 0.28 0.72 0.08 1.19
With Sums of squares of:
g F1* F2* h2
0.56 3.09 2.12 2.21
general/max 0.18 max/min = 1.46
mean percent general = 0.1 with sd = 0.04 and cv of 0.34
Explained Common Variance of the general factor = 0.1
The degrees of freedom are 151 and the fit is 2.87
The number of observations was 64 with Chi Square = 155.36 with prob < 0.39
The root mean square of the residuals is 0.06
The df corrected root mean square of the residuals is 0.07
RMSEA index = 0.014 and the 90 % confidence intervals are 0 0.063
BIC = -472.63
Compare this with the adequacy of just a general factor and no group factors
The degrees of freedom for just the general factor are 170 and the fit is 5.72
The number of observations was 64 with Chi Square = 313.48 with prob < 1.4e-10
The root mean square of the residuals is 0.14
The df corrected root mean square of the residuals is 0.15
RMSEA index = 0.114 and the 90 % confidence intervals are 0.095 0.136
BIC = -393.53
Measures of factor score adequacy
g F1* F2*
Correlation of scores with factors 0.37 0.89 0.85
Multiple R square of scores with factors 0.14 0.79 0.72
Minimum correlation of factor score estimates -0.72 0.58 0.43
Total, General and Subset omega for each subset
g F1* F2*
Omega total for total scores and subscales 0.81 0.81 0.71
Omega general for total scores and subscales 0.13 0.09 0.07
Omega group for total scores and subscales 0.60 0.72 0.65
Nota: O alfa (0.77) e o ômega total (0.81) mostram boa consistência interna. No entanto, o ômega hierárquico foi muito baixo (0.13), indicando que não há um fator geral forte por trás dos 20 itens. A variância confiável está nos fatores de grupo, não em um construto comum
Discussão
A análise fatorial exploratória identificou uma estrutura de dois fatores. O Fator 1 agrupou predominantemente os itens diretos da escala, enquanto o Fator 2 agrupou os itens com pontuação reversa. A correlação praticamente nula entre os fatores (r ≈ 0.06) sugere que essa separação reflete um efeito de método. Os itens q1, q11, q17 e q18 apresentaram comunalidades muito baixas (\(h^2\) < 0.20), indicando fraca representação na solução fatorial. Em análises futuras, esses itens podem ser candidatos a revisão ou exclusão.
É importante ressaltar que o tamanho amostral (n = 64) representa uma limitação significativa desta análise. Com uma razão de aproximadamente 3.2 observações por item, os resultados devem ser considerados preliminares e interpretados com cautela. Recomenda-se a replicação com amostras maiores para validação da estrutura fatorial.
Referências
- Fabrigar, L. R., Wegener, D. T., MacCallum, R. C., & Strahan, E. J. (1999). Evaluating the use of exploratory factor analysis in psychological research. Psychological Methods, 4(3), 272–299.
- Hair, J. F., Black, W. C., Babin, B. J., & Anderson, R. E. (2019). Multivariate data analysis (8th ed.). Cengage.
- Podsakoff, P. M., MacKenzie, S. B., Lee, J. Y., & Podsakoff, N. P. (2003). Common method biases in behavioral research. Journal of Applied Psychology, 88(5), 879–903.
- Weijters, B., Baumgartner, H., & Schillewaert, N. (2013). Reversed item bias: An integrative model. Psychological Methods, 18(3), 320–334.