library(psych)
library(dplyr)
##
## Anexando pacote: 'dplyr'
## Os seguintes objetos são mascarados por 'package:stats':
##
## filter, lag
## Os seguintes objetos são mascarados por 'package:base':
##
## intersect, setdiff, setequal, union
url_dados <- "https://raw.githubusercontent.com/leocbc/ANALISE-MULTIVARIADA/refs/heads/main/Custo_Producao.csv"
dados <- read.table(url_dados, header = TRUE, sep = ",")
rownames(dados) <- paste0("Fazenda_", sprintf("%03d", 1:nrow(dados)))
head(dados)
## Produtividade Biomassa Taxa_Crescimento Indice_Vegetacao
## Fazenda_001 53.37271 110.69127 21.77163 0.8388293
## Fazenda_002 48.01798 96.31255 19.43039 0.8023331
## Fazenda_003 56.48213 113.82338 21.97190 0.8329807
## Fazenda_004 65.27728 131.81623 24.43041 0.8696821
## Fazenda_005 47.20840 95.73037 19.16719 0.7952746
## Fazenda_006 48.28148 97.19406 19.20484 0.7922280
## Preco_Mercado Demanda Custo_Producao Margem_Liquida
## Fazenda_001 355.6173 4861.088 253.9277 11.833838
## Fazenda_002 357.5530 4917.523 259.4792 11.658089
## Fazenda_003 366.4904 5028.467 261.7047 12.965791
## Fazenda_004 366.8936 5017.950 261.0472 12.555920
## Fazenda_005 329.4327 4534.427 232.5025 5.145736
## Fazenda_006 336.0138 4604.867 236.8394 6.552871
Se houver uma coluna de identificação/nome que não é uma variável para a análise, é importante removê-la ou selecioná-la.
Assumindo que a primeira coluna do nosso arquivo é apenas um ID e as demais são variáveis para a análise fatorial (exceto se for uma variável categórica que precisa ser excluída), vamos assumir que as colunas 2 em diante são as variáveis para a Análise Fatorial.
Para isso precisamos excluir a primeira coluna (coluna 1) do arquivo original. Para tal, será criado um novo objeto chamado “dados_fa” que contém os dados originais menos a primeira coluna:
dados_fa <- scale(dados)
head(dados_fa)
## Produtividade Biomassa Taxa_Crescimento Indice_Vegetacao
## Fazenda_001 0.4188891 0.6143774 0.6629551 0.84554804
## Fazenda_002 -0.1612954 -0.1539453 -0.1735645 0.06492359
## Fazenda_003 0.7557939 0.7817405 0.7345128 0.72045244
## Fazenda_004 1.7087474 1.7431835 1.6129332 1.50546711
## Fazenda_005 -0.2490134 -0.1850540 -0.2676065 -0.08605354
## Fazenda_006 -0.1327454 -0.1068422 -0.2541554 -0.15121708
## Preco_Mercado Demanda Custo_Producao Margem_Liquida
## Fazenda_001 0.2896149 0.2170924 0.2224834 0.5222592
## Fazenda_002 0.4194305 0.5014291 0.6851405 0.4637494
## Fazenda_003 1.0188084 1.0603975 0.8706129 0.8991048
## Fazenda_004 1.0458528 1.0074079 0.8158221 0.7626522
## Fazenda_005 -1.4664269 -1.4287273 -1.5630679 -1.7043199
## Fazenda_006 -1.0250703 -1.0738273 -1.2016302 -1.2358617
Se a primeira coluna não for um ID, use: dados_fa <- dados (ou simplesmente use o arquivo de dados original: “dados”)
cor_matriz <- cor(dados_fa)
cor_matriz
## Produtividade Biomassa Taxa_Crescimento Indice_Vegetacao
## Produtividade 1.00000000 0.99349090 0.98929881 0.96841692
## Biomassa 0.99349090 1.00000000 0.99423749 0.97429093
## Taxa_Crescimento 0.98929881 0.99423749 1.00000000 0.97288507
## Indice_Vegetacao 0.96841692 0.97429093 0.97288507 1.00000000
## Preco_Mercado 0.08868103 0.08379236 0.07476817 0.08022891
## Demanda 0.09016990 0.08726120 0.07909273 0.08480233
## Custo_Producao 0.06565588 0.06201749 0.05306437 0.06163231
## Margem_Liquida 0.08641484 0.08352154 0.07530675 0.08127321
## Preco_Mercado Demanda Custo_Producao Margem_Liquida
## Produtividade 0.08868103 0.09016990 0.06565588 0.08641484
## Biomassa 0.08379236 0.08726120 0.06201749 0.08352154
## Taxa_Crescimento 0.07476817 0.07909273 0.05306437 0.07530675
## Indice_Vegetacao 0.08022891 0.08480233 0.06163231 0.08127321
## Preco_Mercado 1.00000000 0.98985430 0.97771857 0.98361751
## Demanda 0.98985430 1.00000000 0.98546902 0.98924438
## Custo_Producao 0.97771857 0.98546902 1.00000000 0.98039092
## Margem_Liquida 0.98361751 0.98924438 0.98039092 1.00000000
cortest.bartlett(cor_matriz, n = nrow(dados_fa))
## $chisq
## [1] 4554.171
##
## $p.value
## [1] 0
##
## $df
## [1] 28
Bartlett testa a hipótese nula de que a matriz de correlação é uma matriz identidade (o que significa que as variáveis não estão correlacionadas). Se o resultado do Bartlett for significativo (p < 0,05), rejeita-se a hipótese nula, indicando que as variáveis estão correlacionadas e a AF é possível.
Se o p-valor for SIGNIFICATIVO (p < 0,05), a matriz de correlação não é uma matriz identidade, indicando que as variáveis são correlacionadas e a Análise Fatorial é APROPRIADA.
O KMO mede a adequação amostral. Valores acima de 0.6 são geralmente considerados aceitáveis, com valores acima de 0.8 sendo muito bons.
KMO(dados_fa)
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = dados_fa)
## Overall MSA = 0.87
## MSA for each item =
## Produtividade Biomassa Taxa_Crescimento Indice_Vegetacao
## 0.87 0.79 0.87 0.97
## Preco_Mercado Demanda Custo_Producao Margem_Liquida
## 0.88 0.81 0.92 0.91
O KMO avalia se o grau de correlação é alto o suficiente para justificar a AF.
Procure pelo “cotovelo” (ponto de inflexão) no gráfico, onde a curva se achata. O número de fatores é geralmente o ponto ANTES do cotovelo.
modelo_fa <- principal(dados_fa, nfactors = ncol(dados_fa), rotate = "varimax")
plot(modelo_fa$values, type = "b", main = "Scree Plot",
ylab = "Autovalor (Eigenvalue)", xlab = "Número do Fator")
Neste exemplo, a analise sugeriu 2 fatores (NÚMERO_DE_FATORES = 2)
Apenas conte quantos autovalores no gráfico acima (eigenvalues) são maiores que 1.
NUMERO_DE_FATORES <- 2
Usaremos o método de fatoramento Principal (pa) com rotação Varimax:
af_resultado <- fa(
r = dados_fa,
nfactors = NUMERO_DE_FATORES,
rotate = "varimax", # Rotação ortogonal (fatores não correlacionados)
fm = "pa" # Método de fatoramento (Principal Axis Factoring)
)
print(af_resultado)
## Factor Analysis using method = pa
## Call: fa(r = dados_fa, nfactors = NUMERO_DE_FATORES, rotate = "varimax",
## fm = "pa")
## Standardized loadings (pattern matrix) based upon correlation matrix
## PA1 PA2 h2 u2 com
## Produtividade 0.37 0.92 0.99 0.0127 1.3
## Biomassa 0.37 0.93 1.00 0.0025 1.3
## Taxa_Crescimento 0.36 0.93 0.99 0.0079 1.3
## Indice_Vegetacao 0.36 0.91 0.95 0.0481 1.3
## Preco_Mercado 0.95 -0.29 0.98 0.0174 1.2
## Demanda 0.96 -0.29 1.00 0.0045 1.2
## Custo_Producao 0.94 -0.31 0.98 0.0245 1.2
## Margem_Liquida 0.95 -0.29 0.98 0.0157 1.2
##
## PA1 PA2
## SS loadings 4.13 3.74
## Proportion Var 0.52 0.47
## Cumulative Var 0.52 0.98
## Proportion Explained 0.53 0.47
## Cumulative Proportion 0.53 1.00
##
## Mean item complexity = 1.2
## Test of the hypothesis that 2 factors are sufficient.
##
## df null model = 28 with the objective function = 23.29 with Chi Square = 4554.17
## df of the model are 13 and the objective function was 0.08
##
## The root mean square of the residuals (RMSR) is 0
## The df corrected root mean square of the residuals is 0
##
## The harmonic n.obs is 200 with the empirical chi square 0.01 with prob < 1
## The total n.obs was 200 with Likelihood Chi Square = 14.63 with prob < 0.33
##
## Tucker Lewis Index of factoring reliability = 0.999
## RMSEA index = 0.025 and the 90 % confidence intervals are 0 0.077
## BIC = -54.24
## Fit based upon off diagonal values = 1
## Measures of factor score adequacy
## PA1 PA2
## Correlation of (regression) scores with factors 1 1
## Multiple R square of scores with factors 1 1
## Minimum correlation of possible factor scores 1 1
print(af_resultado$loadings, cutoff = 0.5, sort = TRUE)
##
## Loadings:
## PA1 PA2
## Preco_Mercado 0.949
## Demanda 0.956
## Custo_Producao 0.939
## Margem_Liquida 0.949
## Produtividade 0.922
## Biomassa 0.928
## Taxa_Crescimento 0.928
## Indice_Vegetacao 0.906
##
## PA1 PA2
## SS loadings 4.131 3.736
## Proportion Var 0.516 0.467
## Cumulative Var 0.516 0.983
A análise fatorial realizada com oito variáveis agronômicas e econômicas revelou a presença de dois fatores principais, capazes de explicar 98,3% da variação total observada nos dados. O teste KMO apresentou valor 0,87, considerado excelente, indicando que os dados possuem estrutura adequada para a aplicação da técnica. O teste de Esfericidade de Bartlett também foi altamente significativo (p < 0,001), confirmando que a matriz de correlação não é identidade e que existe padrão de correlações suficiente para justificar o modelo fatorial.
A inspeção do scree plot e dos autovalores indicou a retenção de dois fatores, que correspondem claramente a dois blocos distintos de variáveis.
O Fator 1 concentra as variáveis Preço de Mercado, Demanda, Custo de Produção e Margem Líquida, todas com cargas fatoriais acima de 0,93. Esse fator representa um componente latente associado ao desempenho econômico/comercial do sistema produtivo, refletindo condições de mercado, custos operacionais e retorno econômico.
O Fator 2 agrupa as variáveis Produtividade, Biomassa, Taxa de Crescimento e Índice de Vegetação, todas com cargas superiores a 0,90. Este fator representa o desempenho fisiológico-produtivo da cultura, sintetizando vigor vegetativo, crescimento e potencial produtivo.
As comunalidades foram extremamente altas (0,95 a 1,00), indicando que os dois fatores extraídos explicam praticamente toda a variabilidade das variáveis observadas. A rotação Varimax proporcionou uma separação clara entre fatores, sem cargas cruzadas relevantes.
A interpretação geral revela a existência de dois processos independentes no sistema avaliado: (1) um processo econômico, associado à precificação, custos e retorno financeiro; (2) um processo fisiológico, associado à produtividade e ao desenvolvimento da planta.
Esta estrutura evidencia a dissociação entre desempenho agronômico e condições de mercado, indicando que alterações fisiológicas da planta não necessariamente se refletem diretamente na dinâmica econômica, e vice-versa.
scores = as.data.frame(af_resultado$scores)
head(scores)
## PA1 PA2
## Fazenda_001 0.4399124 0.4915143
## Fazenda_002 0.4264779 -0.3310207
## Fazenda_003 1.1646988 0.3621425
## Fazenda_004 1.3849309 1.2834696
## Fazenda_005 -1.4605494 0.3544512
## Fazenda_006 -1.0778914 0.2686192
Para filtrar apenas os scores maiores, vamos usar a função “filter” do pacote “dplyr”:
Escores altos do primeiro fator:
scores %>%
filter(abs(PA1) > 2)
## PA1 PA2
## Fazenda_010 3.766451 -0.7917876
## Fazenda_021 2.557976 0.6959308
## Fazenda_024 -2.054415 -0.7242215
## Fazenda_035 2.158719 0.1058505
## Fazenda_063 -3.471664 0.1806600
## Fazenda_086 -2.025251 0.3373912
## Fazenda_175 2.067191 -0.4457752
## Fazenda_183 -2.431297 -0.2322413
Escores altos do segundo fator:
scores %>%
filter(abs(PA2) > 2)
## PA1 PA2
## Fazenda_014 0.02748629 -2.207754
## Fazenda_038 -0.48230877 -2.074263
## Fazenda_072 -0.99375424 2.093663
## Fazenda_075 -1.76533304 -2.308413
## Fazenda_114 1.45323710 2.367102
## Fazenda_124 1.45439336 -2.142752
## Fazenda_126 -0.55412694 2.717554
## Fazenda_157 0.46116950 2.031499
## Fazenda_168 0.54835459 2.124811
## Fazenda_180 0.03803844 3.212254