Regressão não linear simples

Resíduos não aderentes a normalidade, por determinado teste estatístico, provavelmente a distribuição de dados é não linear.

Exemplo de Teste estatístico para verificar se os resíduos estão aderentes a normalidade.

Shapiro-Wilk: Amostras pequenas (50 observações)

Shapiro-Francia: Amostras maiores.

O teste de Shapiro–Francia é um teste estatístico utilizado justamente para verificar essa hipótese de normalidade.

Hipóteses do teste

O teste trabalha com duas hipóteses:H0: os resıˊduos seguem distribuic¸a˜o normalH_0:\ \text{os resíduos seguem distribuição normal}H1: os resıˊduos na˜o seguem distribuic¸a˜o normalH_1:\ \text{os resíduos não seguem distribuição normal}

Ou seja:

  • H0H_0​ representa a hipótese de normalidade;
  • H1H_1​ representa a hipótese alternativa, indicando violação da normalidade.

Interpretação do p-valor

Após executar o teste, obtém-se um valor chamado p-value.

A regra geral é:

Se:

p-value>0,05p\text{-value} > 0,05

não rejeitamos H0H_0​.

Assim, há evidências de que os resíduos possuem aderência à normalidade.

Se:

p-value0,05p\text{-value} \leq 0,05

rejeitamos H0H_0​.

Nesse caso, conclui-se que os resíduos não seguem distribuição normal.

Normalização/Transformação box-cox (transformação da variável dependente)

O Box-Cox não transforma os resíduos diretamente. Primeiro transformamos YY, ajustamos o modelo com YY^*, e só depois avaliamos se os novos resíduos ficaram mais aderentes à normalidade.

Qual melhor Lambda que maximiza a aderência a normalidade.

Na transformação Box-Cox, quando ainda não existe um modelo ajustado, não avaliamos os termos de erro, pois os resíduos só existem após a estimação do modelo. Nesse caso, a transformação é aplicada diretamente sobre a variável resposta YYY, com o objetivo de aproximar sua distribuição da normalidade e estabilizar sua variância.


O parâmetro λ\lambda da transformação Box-Cox é escolhido de forma a tornar a variável resposta transformada YY^*o mais próxima possível de uma distribuição normal. Assim, antes de ajustar o modelo, buscamos uma escala mais adequada para YY, aumentando a chance de que os resíduos do modelo apresentem melhor comportamento estatístico.

A transformação é:Y=Yλ1λY^* = \frac{Y^\lambda – 1}{\lambda}

quando:λ0\lambda \neq 0

E quando:λ=0\lambda = 0

usa-se:Y=ln(Y)Y^* = \ln(Y)

A ideia é testar vários valores de λ\lambdaλ, por exemplo:[2, 1, 0,5, 0, 0,5, 1, 2][-2,\ -1,\ -0{,}5,\ 0,\ 0{,}5,\ 1,\ 2]

e escolher aquele que maximiza a aderência de YY^* à distribuição normal.

Exemplo de interpretação:

  • λ = 1 → praticamente não transforma Y
  • λ = 0,5 → raiz quadrada de Y
  • λ = 0 → log(Y)
  • λ = -1 → inverso de Y

Regressão linear simples e múltipla

É usada quando a variável resposta é contínua e aproximadamente simétrica.

Erros comuns, importante:

  • Intercepto não significativo não invalida o modelo. Não remover o intercept/alfa do modelo.
    Ele apenas indica que, com a amostra disponível, não há evidência suficiente de que o intercepto seja diferente de zero. Forçar α=0\alpha = 0 sem justificativa pode gerar viés e piorar a interpretação do modelo.
  • R2 ajustado é para comparar modelos.
  • Cuidado com ponderação arbitrária, exemplo transformar variável qualitativa em LabelEncoder int(64), o correto é dummizar, deixar como string.

Alguns exemplos utilizados corretamente.

Prever o valor de um imóvel com base em área, localização e número de quartos.

Nesse caso, a resposta pode assumir vários valores numéricos contínuos.

Funcionamento:

Em modelos OLS a somatória dos termos de erro é igual a zero.
 

Modelo GLMDistribuiçãoTipo da variável dependenteQuando usarForma aproximada da distribuição
Regressão LinearNormalQuantitativa contínuaQuando a resposta é contínua e aproximadamente simétrica🔔 Curva em sino

Olhamos o nível de significância do Beta.

A regressão linear simples busca modelar a relação entre uma variável dependente YY e uma variável independente XX.

A equação geral é:

Yi​=β0​+β1​Xi​+εi​

Onde:

TermoSignificado
(Y_i)Valor observado da variável dependente para a observação (i)
(X_i)Valor da variável independente para a observação (i)
(\beta_0)Intercepto da reta, ou seja, valor esperado de (Y) quando (X = 0)
(\beta_1)Inclinação da reta, ou seja, quanto (Y) varia quando (X) aumenta 1 unidade
(\varepsilon_i)Termo de erro, isto é, a diferença entre o valor observado e o valor estimado

Uma forma mais didática também é escrever:Yi=α+βXi+εiY_i = \alpha + \beta X_i + \varepsilon_i

Nesse caso:

  • α\alpha representa o intercepto da reta, ou seja, α é o ponto onde a reta corta o eixo YY;
  • β\beta representa a inclinação da reta;
  • εi\varepsilon_i​ representa o erro da observação iii.

Então, a nomenclatura:α=β0\alpha = \beta_0β=β1\beta = \beta_1

Valor estimado pelo modelo

O modelo não prevê exatamente YiY_i​. Ele calcula um valor estimado, chamado de Y^i\hat{Y}_i:Y^i=β0+β1Xi\hat{Y}_i = \beta_0 + \beta_1X_i

Onde:Y^i\hat{Y}_i

é o valor previsto pelo modelo.

Termo de erro

O erro é a diferença entre o valor real observado e o valor previsto pelo modelo:εi=YiY^i\varepsilon_i = Y_i – \hat{Y}_i

Substituindo:εi=Yi(β0+β1Xi)\varepsilon_i = Y_i – (\beta_0 + \beta_1X_i)

Esse erro mostra o quanto o modelo errou para cada observação.

Ideia do algoritmo

O algoritmo da regressão linear procura encontrar a melhor reta possível para os dados.

Essa melhor reta é aquela que minimiza a soma dos erros ao quadrado:mini=1n(YiY^i)2\min \sum_{i=1}^{n} (Y_i – \hat{Y}_i)^2

Como:Y^i=β0+β1Xi\hat{Y}_i = \beta_0 + \beta_1X_i

temos:mini=1n(Yiβ0β1Xi)2\min \sum_{i=1}^{n} (Y_i – \beta_0 – \beta_1X_i)^2

Esse método é chamado de Mínimos Quadrados OrdináriosOrdinary Least Squares [OLS].

Fórmula da inclinação da reta

A inclinação β1\beta_1​ pode ser calculada por:β1=i=1n(XiXˉ)(YiYˉ)i=1n(XiXˉ)2\beta_1 = \frac{ \sum_{i=1}^{n}(X_i – \bar{X})(Y_i – \bar{Y}) }{ \sum_{i=1}^{n}(X_i – \bar{X})^2 }

Ela mede o quanto YY tende a mudar quando XX aumenta uma unidade.

Fórmula do intercepto

Depois de calcular β1\beta_1​, calculamos o intercepto β0\beta_0​:β0=Yˉβ1Xˉ\beta_0 = \bar{Y} – \beta_1\bar{X}

Onde:

  • Xˉ\bar{X} é a média dos valores de XX;
  • Yˉ\bar{Y} é a média dos valores de YY.

Interpretação prática

Imagine o modelo:Y^=10+2X\hat{Y} = 10 + 2X

Nesse caso:

  • β0=10\beta_0 = 10
  • β1=2\beta_1 = 2

A interpretação é:

Quando X=0X = 0, o valor esperado de YY é 10.

E:

Quando XX aumenta 1 unidade, espera-se que YY aumente 2 unidades.

Exemplo:X=5X = 5Y^=10+2(5)\hat{Y} = 10 + 2(5)Y^=20\hat{Y} = 20

Se o valor real observado fosse:Y=23Y = 23

então o erro seria:ε=YY^\varepsilon = Y – \hat{Y}ε=2320\varepsilon = 23 – 20ε=3\varepsilon = 3

Ou seja, o modelo subestimou o valor real em 3 unidades.

A Regressão Linear busca encontrar uma reta que melhor representa a relação entre XX e YY. Essa reta é definida por um intercepto e uma inclinação. O intercepto indica o valor esperado de YY quando X=0X = 0, enquanto a inclinação indica quanto YY muda quando XX aumenta uma unidade. O termo de erro representa a diferença entre o valor observado e o valor previsto pelo modelo. O algoritmo estima os coeficientes minimizando a soma dos erros ao quadrado.

Exemplo:

  • Y: tempo de entrega;
  • X: distância;
  • cálculo de α\alpha, β\beta, erro, erro², SQModeloSQ_{Modelo}​, ​, correlação de Pearson e R2R^2;
Tempo entrega YDistância XY estimadoErroErro²(Y^−Yˉ)2
12313,5238-1,52382,3219387,1532
18517,38190,61810,3821250,2132
21721,2400-0,24000,0576143,0428
26925,09800,90200,813565,6419
311230,88520,11480,01325,3585
351434,74320,25680,06592,3816
391638,60130,39870,159029,1742
451944,38840,61160,3740125,1810
502250,1756-0,17560,0308288,1694
552555,9627-0,96270,9267518,1393

Modelo encontrado

A reta estimada ficou:

Y^=7,7367+1,9290X

Ou seja:

α=7,7367 β=1,9290\beta = 1{,}9290

A interpretação é:

A cada aumento de 1 unidade na distância, o tempo de entrega aumenta, em média, aproximadamente 1,9290 unidades.

Tabelas de parâmetros:

ParâmetroFórmula ExcelValor
média X=MÉDIA(B2:B11)13,2000
média Y=MÉDIA(A2:A11)33,2000
beta=INCLINAÇÃO(A2:A11;B2:B11)1,9290
alfa=INTERCEPÇÃO(A2:A11;B2:B11)7,7367
Correlação Pearson=CORREL(A2:A11;B2:B11)0,9986
R² por Pearson²=J6^20,9972
R² por soma dos quadrados=F12/(F12+E12)0,9972

A regressão linear simples encontra a melhor reta para explicar a relação entre XX e YY. O cálculo pode ser visto como um problema de otimização, pois o objetivo é minimizar a soma dos erros ao quadrado:

α,βmin​i=1∑n​(Yi​−Y^i​)2

Como:

Y^i​=α+βXi​

então:

α,βmin​i=1∑n​(Yi​−α−βXi​)2

Nesse exemplo, o modelo apresentou:

R2=0,9972

Isso significa que aproximadamente 99,72% da variação do tempo de entrega foi explicada pela distância.

E como é uma regressão linear simples, com apenas uma variável XX, vale a curiosidade:

R2=r2

onde rr é a correlação de Pearson entre XX e YY.

Python

Utilizando o modelo OLS (Ordinary Least Squares, ou Mínimos Quadrados Ordinários), já tenho como premissa que a variável Y ou dependente é quantitativa, que a somatório dos erro é igual 0 e a somatória dos erros ao quadrado será a mínima possível.

Correspondência entre a saída do Python e a equação da regressão

A regressão linear simples estimada pelo Python aparece no formato:Y^=α+βX\hat{Y} = \alpha + \beta X

No nosso exemplo:tempo^=7,7367+1,9290distancia\widehat{tempo} = 7{,}7367 + 1{,}9290 \cdot distancia

Ou seja:

Saída no PythonNome estatísticoNome didáticoValor no nosso exemploInterpretação
R-squared(R^2)R-quadrado0,997Percentual da variação de (Y) explicado por (X)
Intercept(\alpha) ou (\beta_0)Intercepto / Alfa7,7367Valor estimado de tempo quando a distância é zero
distancia(\beta) ou (\beta_1)Beta / Inclinação1,9290Quanto o tempo aumenta quando a distância cresce 1 unidade

Equação do modelo

A partir da tabela de coeficientes:

VariávelCoeficiente
Intercept7,7367
distancia1,9290

A equação fica:tempo^=7,7367+1,9290distancia\widehat{tempo} = 7{,}7367 + 1{,}9290 \cdot distancia

Onde:α=7,7367\alpha = 7{,}7367 β=1,9290\beta = 1{,}9290

Portanto:tempo^=α+βdistancia\widehat{tempo} = \alpha + \beta \cdot distancia

Interpretação do intercepto

O intercepto é o valor esperado de YYY quando X=0X = 0X=0.

Neste exemplo:α=7,7367\alpha = 7{,}7367

Isso significa que, quando a distância é igual a zero, o tempo estimado pelo modelo seria aproximadamente:7,73677{,}7367

Na prática, nem sempre o intercepto tem uma interpretação realista. Ele é principalmente necessário para posicionar a reta no gráfico.

Interpretação do beta

O coeficiente da variável distancia é:β=1,9290\beta = 1{,}9290

Isso significa que, para cada aumento de 1 unidade na distância, o tempo de entrega aumenta, em média, aproximadamente:1,92901{,}9290

unidades de tempo.

Em linguagem simples:

Quanto maior a distância, maior tende a ser o tempo de entrega.

Interpretação do R-quadrado

O R-squared aparece como:R2=0,997R^2 = 0{,}997

Isso significa que aproximadamente:99,7%99{,}7\%

da variação do tempo de entrega é explicada pela distância no modelo linear simples.

Ou seja, nesse exemplo fictício, a distância explica quase totalmente a variação do tempo.

ColunaSignificadoFórmula
tempoValor real observado de (Y)(Y_i)
distanciaVariável explicativa (X)(X_i)
yhatValor estimado pelo modelo(\hat{Y}_i)
erroResíduo do modelo(Y_i – \hat{Y}_i)

A coluna yhat representa os fitted values, ou seja, os valores previstos pela reta de regressão.

Como o modelo estimado foi:tempo^=7,7367+1,9290distancia\widehat{tempo} = 7{,}7367 + 1{,}9290 \cdot distancia

para cada linha, o Python calcula:Y^i=α+βXi\hat{Y}_i = \alpha + \beta X_i

Já a coluna erro representa o resíduo:ei=YiY^ie_i = Y_i – \hat{Y}_i

Ou seja, é a diferença entre o tempo real observado e o tempo estimado pelo modelo.

Exemplo prático

Para a primeira linha, supondo:Y=12Y = 12X=3X = 3

o valor estimado é:Y^=7,7367+1,92903\hat{Y} = 7{,}7367 + 1{,}9290 \cdot 3Y^=13,5237\hat{Y} = 13{,}5237

Então o erro é:e=1213,5237e = 12 – 13{,}5237e=1,5237e = -1{,}5237

Como o erro ficou negativo, significa que o modelo estimou um valor maior do que o valor observado.

Resumo e entendimento para o exemplo:

Pontos importantes sobre significância, intervalos de confiança e intercepto na Regressão OLS

Ao interpretar um modelo de regressão linear estimado por OLS, é comum olhar para os coeficientes, os p-valores e os intervalos de confiança. Porém, alguns cuidados são importantes para evitar interpretações erradas.

Resumo dos pontos principais

PontoInterpretação
Intervalos de confiança aumentam quando elevamos o nível de confiançaUm IC de 99% tende a ser mais largo que um IC de 95%
A significância depende do nível de significância adotadoUm coeficiente pode ser significativo a 5%, mas não a 1%
Em modelos preditivos, p-valor não é tudoMétricas de erro e validação também são essenciais
Amostras pequenas aumentam a incertezaO erro padrão pode crescer e reduzir a significância dos coeficientes
Intercepto não significativo não deve ser removido automaticamenteForçar a reta pela origem pode gerar viés

1. Quanto maior o nível de confiança, maior será o intervalo do coeficiente

O intervalo de confiança de um coeficiente β\beta representa uma faixa provável de valores para o verdadeiro parâmetro populacional.

De forma simplificada:IC=β^±tα/2SE(β^)IC = \hat{\beta} \pm t_{\alpha/2} \cdot SE(\hat{\beta})

Onde:

  • β^\hat{\beta} é o coeficiente estimado pelo modelo;
  • SE(β^)SE(\hat{\beta}) é o erro padrão do coeficiente;
  • tα/2t_{\alpha/2}​ é o valor crítico da distribuição t.

Quando aumentamos o nível de confiança, por exemplo de 95% para 99%, o modelo precisa construir uma faixa mais ampla para aumentar a chance de conter o verdadeiro valor do parâmetro.

2. Um coeficiente pode ser significativo em um nível e deixar de ser em outro

A significância estatística depende diretamente do nível de significância adotado, geralmente representado por α\alphaα.

Por exemplo:IC=95%α=5%IC = 95\% \Rightarrow \alpha = 5\%IC=99%α=1%IC = 99\% \Rightarrow \alpha = 1\%

Isso significa que, ao aumentar o nível de confiança, o teste fica mais rigoroso.

Imagine um coeficiente com:p-valor=0,03p\text{-valor} = 0{,}03

Se adotarmos α=0,05\alpha = 0{,}05α=0,05, esse coeficiente será considerado estatisticamente significativo, pois:0,03<0,050{,}03 < 0{,}05

Mas, se adotarmos α=0,01\alpha = 0{,}01α=0,01, ele deixará de ser significativo, pois:0,03>0,010{,}03 > 0{,}01

Resumo:

Situaçãop-valorNível de significânciaInterpretação
Confiança de 95%0,035%Significativo
Confiança de 99%0,031%Não significativo

Então, um mesmo coeficiente pode ser significativo a 95%, mas não significativo a 99%.

Esse ponto é importante porque mostra que a significância estatística não é uma característica absoluta do coeficiente. Ela depende do critério adotado na análise.

3. Em modelos preditivos, significância estatística não deve ser analisada isoladamente

Em problemas de predição, o objetivo principal não é apenas saber se um coeficiente é estatisticamente diferente de zero, mas avaliar se o modelo consegue prever bem novos dados.

Por isso, além dos p-valores, é importante observar métricas como:

  • erro médio absoluto, MAE;
  • raiz do erro quadrático médio, RMSE;
  • R2R^2;
  • análise dos resíduos;
  • desempenho em dados de teste;
  • validação cruzada, quando aplicável.

Um coeficiente individual pode não ser estatisticamente significativo e, ainda assim, o modelo pode apresentar bom desempenho preditivo.

Por outro lado, um modelo pode ter coeficientes estatisticamente significativos e ainda assim não ser bom para previsão, principalmente se não generalizar bem para novos dados.

Portanto, para fins preditivos, significância estatística é útil, mas não deve ser o único critério de decisão.

4. Amostras pequenas podem dificultar a significância dos parâmetros

O tamanho da amostra tem grande impacto na inferência estatística.

A estatística t de um coeficiente é calculada por:t=β^SE(β^)t = \frac{\hat{\beta}}{SE(\hat{\beta})}

No caso do intercepto, também chamado de α\alpha, temos:tα=α^SE(α^)t_{\alpha} = \frac{\hat{\alpha}}{SE(\hat{\alpha})}

Quando a amostra é pequena, o erro padrão tende a ser maior. Isso reduz o valor da estatística t e pode aumentar o p-valor.

A lógica é:nSEtp-valorn \downarrow \Rightarrow SE \uparrow \Rightarrow t \downarrow \Rightarrow p\text{-valor} \uparrow

Ou seja, com poucas observações, o modelo pode não ter evidência estatística suficiente para indicar que determinado parâmetro é diferente de zero.

5. Intercepto não significativo não significa que ele deve ser removido automaticamente

Um erro comum em modelos regressivos é remover o intercepto apenas porque ele não apresentou significância estatística.

Isso pode ser perigoso.

O intercepto representa o valor esperado de YY quando as variáveis explicativas são iguais a zero. Dependendo do problema, esse ponto pode nem ter interpretação prática, mas ainda assim o intercepto ajuda a ajustar corretamente a reta de regressão.

Remover o intercepto força a reta a passar pela origem:Y=βXY = \beta X

Em vez de permitir:Y=α+βXY = \alpha + \beta X

Essa imposição pode gerar viés no modelo, principalmente quando não existe justificativa teórica para assumir que Y=0Y = 0quando X=0X = 0.

Portanto, intercepto não significativo deve ser analisado com cuidado, e não removido automaticamente.

Em regressão OLS, a interpretação dos coeficientes não deve se limitar ao p-valor. O nível de confiança, o tamanho da amostra, o erro padrão e o objetivo do modelo — explicação ou predição — influenciam diretamente a análise. Além disso, a ausência de significância estatística do intercepto não é, por si só, justificativa para removê-lo do modelo.

Pontos Importantes sobre variáveis categóricas Dummy

Em modelos regressivos, uma variável dummy indica o efeito médio de pertencer a uma determinada categoria em comparação com uma categoria de referência. Quando a dummy assume valor 0, a observação pertence ao grupo base. Quando assume valor 1, pertence ao grupo alternativo. Assim, o coeficiente da dummy representa o incremento ou redução média esperada em YYY ao mudar da categoria de referência para a categoria alternativa, mantendo as demais variáveis constantes.

Uma variável dummy representa uma mudança média em YY quando saímos da categoria de referência e vamos para a categoria alternativa, mantendo as demais variáveis constantes.

Ou seja:

Dummy em regressão: mede quanto YY muda, em média, quando passamos da categoria de referência (0)(0) para a categoria alternativa (1)(1).

  • O alfa nas variáveis Dummys é o valor medio de Y de quem está na categoria de referência.
  • O Beta é o quanto se altera de Y quando se passa da categoria de referencia para categorias alternativa. (0 categoria referencia e 1 categoria alternativa). Não importa qual vai ser 0 ou qual categoria será 1, sempre retorna o mesmo valor.

Por exemplo:Y=α+β1X+β2D+εY = \alpha + \beta_1 X + \beta_2 D + \varepsilon

Onde:D={0,categoria de refereˆncia1,categoria alternativaD = \begin{cases} 0, & \text{categoria de referência} \\ 1, & \text{categoria alternativa} \end{cases}

A interpretação de β2\beta_2​ é:

Quando a observação pertence à categoria alternativa (D=1)(D=1), o valor esperado de YY muda em média β2\beta_2​ unidades em relação à categoria de referência (D=0)(D=0), mantendo XX constante.

Exemplo simples

Imagine um modelo para explicar o tempo de entrega:Tempo=α+β1Dista^ncia+β2Motoboy+εTempo = \alpha + \beta_1 Distância + \beta_2 Motoboy + \varepsilon

Onde:Motoboy={0,carro1,motoboyMotoboy = \begin{cases} 0, & \text{carro} \\ 1, & \text{motoboy} \end{cases}

Se o modelo estimou:β2=8\beta_2 = -8

A interpretação seria:

Entregas feitas por motoboy têm, em média, 8 minutos a menos no tempo de entrega em relação às entregas feitas por carro, considerando a mesma distância.

Se fosse:β2=5\beta_2 = 5

A interpretação seria:

Entregas feitas por motoboy têm, em média, 5 minutos a mais no tempo de entrega em relação às entregas feitas por carro, considerando a mesma distância.

Com 3 categorias se cria 2 Dummies , utilizando One-Hot-encoding.

Modelos Lineares Generalizados (GLM)

O valor da Y (variável dependente) vai dizer qual modelos podemos utilizar.

Modelos são correlacionais, não causais, não sei se as variáveis X causam a Y. Correlação não implica causalidade.

Os GLM (modelos lineares generalizados) ampliam a ideia dos modelos lineares tradicionais, permitindo analisar diferentes tipos de variável resposta, não apenas variáveis contínuas com distribuição Normal.

A lógica central continua sendo a mesma: construir um preditor linear a partir das variáveis explicativas. Porém, os GLMs introduzem dois elementos importantes:

Componente aleatório

Nos modelos lineares clássicos, geralmente assumimos que a variável resposta segue uma distribuição Normal. Já nos GLMs, essa exigência é flexibilizada.

A variável resposta pode seguir distribuições pertencentes à família exponencial, como:

  • Normal: para dados contínuos aproximadamente simétricos;
  • Poisson: para dados de contagem;
  • Binomial: para respostas binárias ou proporções;
  • Gama: para dados contínuos positivos e assimétricos.

Isso torna os GLMs úteis para situações em que a variável resposta não se comporta bem como uma variável Normal.

Função de ligação

A função de ligação conecta a média esperada da variável resposta ao preditor linear do modelo.

De forma geral:

g(μ)=η

Onde:

η=β0​+β1​X1​+β2​X2​+⋯+βp​Xp​

Aqui:

  • μ\muμ representa a média esperada da variável resposta;
  • g(μ)g(\mu)g(μ) é a função de ligação;
  • η\etaη é o preditor linear;
  • β0,β1,,βp\beta_0, \beta_1, \ldots, \beta_pβ0​,β1​,…,βp​ são os coeficientes do modelo;
  • X1,X2,,XpX_1, X_2, \ldots, X_pX1​,X2​,…,Xp​ são as variáveis explicativas.

A função de ligação permite modelar a relação entre a resposta e os preditores de forma adequada à distribuição escolhida. Por exemplo, em modelos de contagem, ela ajuda a garantir que os valores previstos sejam sempre positivos; em modelos binomiais, garante que as probabilidades previstas fiquem entre 0 e 1.

Uma forma simples de resumir é:

O GLM mantém a estrutura linear nos parâmetros, mas permite trabalhar com diferentes distribuições da variável resposta por meio de uma função de ligação adequada.

Exemplos de modelos GLM:

Modelo GLMTipo da variável dependenteTipo de respostaDistribuição usadaFunção de ligação comumExemplo
Regressão LinearQuantitativa contínuaValores numéricos contínuos e aproximadamente simétricosNormalIdentidadeValor de imóvel, altura, temperatura
Regressão LogísticaQualitativa nominal bináriaDuas categorias, como sim/não ou 0/1BinomialLogitAprovação/reprovação, doente/não doente
Regressão de PoissonQuantitativa discretaContagem de eventosPoissonLogNúmero de reclamações, número de atendimentos
Regressão Binomial NegativaQuantitativa discretaContagem com superdispersãoBinomial NegativaLogNúmero de internações com alta variabilidade
Regressão GamaQuantitativa contínua positivaValores positivos e assimétricos à direitaGamaLog ou inversaCusto hospitalar, tempo de internação

OBS:

observação importante:

A Regressão Logística trabalha com uma variável dependente qualitativa nominal binária, porque a resposta representa categorias, como:Y={1,sim0,na˜oY = \begin{cases} 1, & \text{sim} \\ 0, & \text{não} \end{cases}Y={1,0,​simna˜o​

Já modelos como Poisson e Binomial Negativa usam variáveis dependentes quantitativas discretas, pois a resposta é uma contagem:Y=0,1,2,3,Y = 0, 1, 2, 3, \ldotsY=0,1,2,3,…

E modelos como Linear e Gama usam variáveis dependentes quantitativas contínuas, pois a resposta representa medidas numéricas em escala contínua.

Distribuição característica:

Modelo GLMDistribuiçãoTipo da variável dependenteQuando usarForma aproximada da distribuição
Regressão LinearNormalQuantitativa contínuaQuando a resposta é contínua e aproximadamente simétrica🔔 Curva em sino
Regressão LogísticaBinomialQualitativa nominal bináriaQuando a resposta possui duas categorias, como 0/1, sim/não⚫ ⚪ Dois resultados possíveis
Regressão de PoissonPoissonQuantitativa discretaQuando a resposta representa contagem de eventos▂▅█▆▃ Barras de contagem
Regressão Binomial NegativaBinomial NegativaQuantitativa discretaQuando há contagem com variância maior que a média▂▃▆█▅▃ Cauda mais longa
Regressão GamaGamaQuantitativa contínua positivaQuando a resposta é positiva e assimétrica à direita▂█▆▃▂▁ Assimétrica à direita

Unsupervised Machine Learning Análise de Correspondência Simples e Múltipla

https://github.com/samantaleke/Unsupervised_MCA

A ANACOR (Análise de Correspondência simples).

  • Variáveis Qualitativas.
  • Simples 2 variáveis categóricas.

A ACM (Análise de Correspondência Múltipla).

  • Variáveis Qualitativas.
  • Multiplas variáveis categóricas, mais que 2.

OBS: um ponto interessante é que com a Anacor e suas coordenadas, podemos transformar variáveis categóricas em métricas.

Associações estátisticamente significantes, verifica as categorias das associações, análise dessas categorias.

Podemos transformar uma variável métrica em categórica. Exemplo faixas de idade.

Objetivo é analisar pela proximidade a associação entre as variáveis.

Fonte: https://rpubs.com/rcleoni/265601, acesso 11 maio de 2026.

  1. Verificar se existe associação e estatisticamente significantes: teste Qui-Quadrado.

Criando a tabela contingência, para verificar a contagem por variável.

Abaixo será explicado detalhadamente cada item:

ANACOR

Função de cada etapa da ANACOR

EtapaFunção na análise
1. Tabela de contingênciaÉ o ponto de partida. Mostra as frequências observadas entre duas variáveis categóricas, por exemplo, Perfil do Cliente × Canal de Atendimento.
2. Frequências esperadasMostram quais valores seriam esperados se as duas variáveis fossem independentes, ou seja, se não houvesse associação entre elas.
3. Resíduos padronizadosMedem a diferença entre o observado e o esperado em cada célula. Indicam quais combinações ocorreram mais ou menos do que o esperado.
4. Matriz AÉ construída a partir dos resíduos padronizados divididos por n\sqrt{n}n​. Ela organiza os desvios padronizados em uma matriz preparada para a decomposição matemática.
5. Matriz /W=ATAResume a estrutura de associação das categorias das colunas. É a matriz usada para encontrar os autovalores e autovetores.
6. Autovalores λIndicam quanta informação, ou inércia, cada dimensão explica. Quanto maior o autovalor, mais importante é aquela dimensão.
7. AutovetoresIndicam a direção dos eixos fatoriais. Eles ajudam a determinar como as categorias serão posicionadas no espaço.
8. Coordenadas das categoriasTransformam as categorias em pontos no plano. Cada categoria recebe uma coordenada XX e YY, correspondentes às dimensões 1 e 2.
9. Gráfico perceptualRepresenta visualmente as categorias. Categorias próximas no gráfico tendem a estar mais associadas.

Frequências absolutas observadas

Eij=ni+n+jnE_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}

Onde:

EijE_{ij}

representa a frequência esperada da célula da linha iii e coluna jjj;

ni+n_{i+}

representa o total da linha;

n+jn_{+j}

representa o total da coluna;

nn

representa o total geral da tabela.

Exemplo de Frequências Absolutas:

Perfil do ClienteAppSiteTelefoneLoja FísicaTotal
Jovem352051070
Adulto2530152090
Idoso510253070
Total65604560230

Duas variáveis categóricas:

Perfil do Cliente
Canal de Atendimento

Frequência esperada

Para Jovem × App:

EJovem, App=7065230E_{\text{Jovem, App}} = \frac{70 \cdot 65}{230}
EJovem, App=4550230E_{\text{Jovem, App}} = \frac{4550}{230}
EJovem, App19,78E_{\text{Jovem, App}} \approx 19{,}78

Exemplo de Frequências esperadas

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem19,7818,2613,7018,26
Adulto25,4323,4817,6123,48
Idoso19,7818,2613,7018,26

Tabela de resíduos simples

O resíduo simples é calculado por:

rij=OijEijr_{ij} = O_{ij} – E_{ij}

Onde:

OijO_{ij}

é a frequência observada;

EijE_{ij}

é a frequência esperada.

Exemplo do cálculo do resíduo simples

Para Jovem × App:

rJovem, App=3519,78r_{\text{Jovem, App}} = 35 – 19{,}78
rJovem, App=15,22r_{\text{Jovem, App}} = 15{,}22

Resíduos simples

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem15,221,74-8,70-8,26
Adulto-0,436,52-2,61-3,48
Idoso-14,78-8,2611,3011,74

Resíduos padronizados

O resíduo padronizado é calculado por:

zij=OijEijEijz_{ij} = \frac{O_{ij} – E_{ij}}{\sqrt{E_{ij}}}

Ele é mais útil do que o resíduo simples porque coloca os valores em uma escala comparável.

Exemplo do cálculo do resíduo padronizado

Para Jovem × App:

zJovem, App=3519,7819,78z_{\text{Jovem, App}} = \frac{35 – 19{,}78}{\sqrt{19{,}78}}
zJovem, App=15,224,45z_{\text{Jovem, App}} = \frac{15{,}22}{4{,}45}
zJovem, App3,42z_{\text{Jovem, App}} \approx 3{,}42

Exemplo da Tabela de resíduos padronizados

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem3,420,41-2,35-1,93
Adulto-0,091,35-0,62-0,72
Idoso-3,32-1,933,052,75

Os maiores resíduos positivos indicam as associações mais fortes entre categorias.

Neste exemplo, os principais destaques são:

AssociaçãoResíduo padronizadoInterpretação
Jovem × App3,42Jovens usam App mais do que o esperado
Idoso × Telefone3,05Idosos usam Telefone mais do que o esperado
Idoso × Loja Física2,75Idosos usam Loja Física mais do que o esperado
Jovem × Telefone-2,35Jovens usam Telefone menos do que o esperado
Idoso × App-3,32Idosos usam App menos do que o esperado

Teste Qui-quadrado

Ele verifica se existe associação estatística entre as duas variáveis categóricas:

H0:Perfil do cliente e canal de atendimento são independentesH_0: \text{Perfil do cliente e canal de atendimento são independentes}
H1:Perfil do cliente e canal de atendimento não são independentesH_1: \text{Perfil do cliente e canal de atendimento não são independentes}
χ2=(OijEij)2Eij\chi^2 = \sum \frac{(O_{ij} – E_{ij})^2}{E_{ij}}

Onde:

OijO_{ij}

é a frequência observada.

EijE_{ij}

é a frequência esperada.

Exemplo do cálculo de uma célula

Para Jovem × App:

χJovem, App2=(3519,78)219,78\chi^2_{\text{Jovem, App}} = \frac{(35 – 19{,}78)^2}{19{,}78}
χJovem, App2=(15,22)219,78\chi^2_{\text{Jovem, App}} = \frac{(15{,}22)^2}{19{,}78}
χJovem, App211,71\chi^2_{\text{Jovem, App}} \approx 11{,}71

Esse valor representa a contribuição da célula Jovem × App para o Qui-quadrado total.

Contribuições para o Qui-quadrado

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem11,710,175,523,74
Adulto0,011,810,390,52
Idoso11,053,749,337,55

Somando todas as contribuições:

χ255,51\chi^2 \approx 55{,}51

A fórmula dos graus de liberdade é:

gl=(l1)(c1)gl = (l – 1)(c – 1)

Onde:

l=número de linhasl = \text{número de linhas}
c=número de colunasc = \text{número de colunas}

Neste Exemplo:

gl=(31)(41)gl = (3 – 1)(4 – 1)
gl=2×3=6gl = 2 \times 3 = 6

Resultado do teste

EstatísticaValor
Qui-quadrado calculado55,51
Graus de liberdade6
p-valor0,00000000037
Nível de significância0,05

Como o p-valor é muito menor que 0,05:

p<0,05p < 0{,}05

rejeitamos a hipótese nula de independência.

O resultado indica que existe associação estatisticamente significativa entre perfil do cliente e canal de atendimento.

Na prática, isso significa que a escolha do canal de atendimento não parece ocorrer de forma aleatória em relação ao perfil do cliente.

Os maiores responsáveis pelo valor do Qui-quadrado foram:

AssociaçãoContribuição
Jovem × App11,71
Idoso × App11,05
Idoso × Telefone9,33
Idoso × Loja Física7,55
Jovem × Telefone5,52

Essas células mostram onde estão as maiores diferenças entre o observado e o esperado.

Resíduos padronizados ajustados (utilizar esse)

Após o cálculo dos resíduos padronizados, é possível aprofundar a análise utilizando os resíduos padronizados ajustados. Esses resíduos corrigem o efeito dos totais marginais das linhas e colunas, permitindo uma interpretação mais adequada da associação entre cada par de categorias.

A fórmula do resíduo padronizado ajustado é:

zijajustado=zij(1ni+n)(1n+jn)z_{ij}^{ajustado} = \frac{z_{ij}} {\sqrt{ \left(1 – \frac{n_{i+}}{n}\right) \left(1 – \frac{n_{+j}}{n}\right) }}

Como os resíduos padronizados ajustados se aproximam de uma distribuição normal padrão, podemos interpretar assim:

Valor do resíduo ajustadoInterpretação
Maior que 1,96Associação positiva significativa
Menor que -1,96Associação negativa significativa
Entre -1,96 e 1,96Sem associação estatisticamente forte

Considerando nível de significância de 5%

|zijajustado|>1,96|z_{ij}^{ajustado}| > 1{,}96

indica que aquela célula contribui de forma relevante para a associação entre as variáveis.

No Exemplo:

No exemplo analisado, o perfil Jovem apresentou forte associação positiva com o canal App, enquanto o perfil Idoso apresentou associação positiva com Telefone e Loja Física. Por outro lado, clientes idosos apresentaram associação negativa com o uso de App, indicando que esse canal aparece menos do que seria esperado para esse perfil.

Resíduos padronizados ajustados

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem4,840,59-3,38-2,75
Adulto-0,132,10-0,90-1,11
Idoso-4,70-2,754,393,91

Principais associações do exemplo

AssociaçãoResíduo ajustadoInterpretação
Jovem × App5,12Associação positiva forte
Idoso × Telefone4,32Associação positiva forte
Idoso × Loja Física4,01Associação positiva forte
Idoso × App-4,96Associação negativa forte
Jovem × Telefone-3,32Associação negativa forte
Jovem × Loja Física-2,82Associação negativa
Idoso × Site-2,82Associação negativa
Adulto × Site2,08Associação positiva

Exemplo do cálculo: Jovem × App

Primeiro, usamos o resíduo padronizado da célula:

zJovem, App=3,42z_{\text{Jovem, App}} = 3{,}42

Agora calculamos o ajuste da linha e da coluna.

Total da linha Jovem:

ni+=70n_{i+} = 70

Total da coluna App:

n+j=65n_{+j} = 65

Total geral:

n=230n = 230

Então:

zJovem, Appajustado=3,42(170230)(165230)z_{\text{Jovem, App}}^{ajustado} = \frac{3{,}42} {\sqrt{ \left(1 – \frac{70}{230}\right) \left(1 – \frac{65}{230}\right) }}
zJovem, Appajustado=3,42(10,3043)(10,2826)z_{\text{Jovem, App}}^{ajustado} = \frac{3{,}42} {\sqrt{ (1 – 0{,}3043) (1 – 0{,}2826) }}
zJovem, Appajustado=3,420,6957×0,7174z_{\text{Jovem, App}}^{ajustado} = \frac{3{,}42} {\sqrt{ 0{,}6957 \times 0{,}7174 }}
zJovem, Appajustado=3,420,7064z_{\text{Jovem, App}}^{ajustado} = \frac{3{,}42}{0{,}7064}
zJovem, Appajustado4,84z_{\text{Jovem, App}}^{ajustado} \approx 4{,}84

Conclusões: Células com associação positiva.

As células com resíduo ajustado maior que 1,96 são:

AssociaçãoResíduo ajustadoInterpretação
Jovem × App4,84Jovens tendem a utilizar mais o App
Adulto × Site2,10Adultos tendem a utilizar mais o Site
Idoso × Telefone4,39Idosos tendem a utilizar mais o Telefone
Idoso × Loja Física3,91Idosos tendem a utilizar mais a Loja Física

Elaboração do mapa perceptual

Passo a passo em calculo para chegar nos eixos do mapa perceptual.

Tabela observadaResíduos padronizadosMatriz AMatriz WAutovaloresCoordenadasMapa perceptual\text{Tabela observada} \rightarrow \text{Resíduos padronizados} \rightarrow \text{Matriz A} \rightarrow \text{Matriz W} \rightarrow \text{Autovalores} \rightarrow \text{Coordenadas} \rightarrow \text{Mapa perceptual}

Para a elaboração do mapa perceptual da Análise de Correspondência, inicialmente constrói-se a matriz AAA, formada pelos resíduos padronizados divididos pela raiz quadrada do total geral da tabela. Essa matriz representa os desvios padronizados entre as frequências observadas e esperadas.

Em seguida, calcula-se a matriz WWW, definida por:

W=ATAW = A^T A

A partir dessa matriz, os autovalores são obtidos pela solução da equação característica:

det(WλI)=0\det(W – \lambda I) = 0

As raízes dessa equação correspondem aos autovalores, que indicam a quantidade de inércia (variância) explicada por cada dimensão. No exemplo analisado, a primeira dimensão apresentou autovalor igual a 0,2283, explicando 94,60% da inércia total. A segunda dimensão apresentou autovalor igual a 0,0130, explicando 5,40%.

Como a quantidade máxima de dimensões é dada por m=min(I1,J1)m = \min(I – 1, J – 1)m=min(I−1,J−1), e a tabela possui três categorias nas linhas e quatro categorias nas colunas, tem-se:

m=min(31, 41)=2m = \min(3 – 1,\ 4 – 1) = 2

Assim, o mapa perceptual pode ser representado em duas dimensões, correspondentes aos eixos XX e YY. Cada categoria recebe uma coordenada no plano, permitindo visualizar graficamente as associações entre perfis de clientes e canais de atendimento.

Autovalor:

Na Análise de Correspondência, os autovalores indicam a quantidade de inércia explicada por cada dimensão do mapa perceptual. Essa inércia pode ser interpretada como a quantidade de informação associativa representada em cada eixo.

Exemplo:

No exemplo, observa-se proximidade entre Jovem e App, indicando associação entre clientes jovens e uso do aplicativo. O perfil Adulto aparece mais próximo de Site, enquanto o perfil Idoso aparece próximo de Telefone e Loja Física. Portanto, o mapa perceptual confirma visualmente a associação entre Perfil do Cliente e Canal de Atendimento.

1. Construção da matriz A

Primeiro, parte-se da tabela de resíduos padronizados simples, calculados por:

zij=OijEijEijz_{ij} = \frac{O_{ij} – E_{ij}}{\sqrt{E_{ij}}}

Depois, cada resíduo padronizado é dividido pela raiz quadrada do total geral da tabela:

Aij=zijnA_{ij} = \frac{z_{ij}}{\sqrt{n}}

No exemplo Perfil do Cliente × Canal de Atendimento, temos:

n=230n = 230

Logo:

23015,17\sqrt{230} \approx 15{,}17

A matriz AA fica aproximadamente:

Perfil do ClienteAppSiteTelefoneLoja Física
Jovem0,22560,0268-0,1549-0,1275
Adulto-0,00570,0887-0,0410-0,0473
Idoso-0,2192-0,12750,20140,1811

Essa matriz representa os desvios padronizados entre as frequências observadas e esperadas.

2. Construção da matriz W

Após montar a matriz AA, calcula-se sua transposta:

ATA^T

Em seguida, calcula-se a matriz WW:

W=ATAW = A^T A

Como AA tem dimensão 3×43 \times 43×4, então:

AT=4×3A^T = 4 \times 3

e

W=4×4W = 4 \times 4

A matriz WWW fica:

AppSiteTelefoneLoja Física
App0,09900,0335-0,0789-0,0682
Site0,03350,0248-0,0335-0,0307
Telefone-0,0789-0,03350,06630,0582
Loja Física-0,0682-0,03070,05820,0513

3. Determinação dos autovalores

Com base na matriz WW, os autovalores são obtidos por:

det(WλI)=0\det(W – \lambda I) = 0

Onde:

W

é a matriz obtida por ATAA^T A;

λ\lambda

representa os autovalores;

II

é a matriz identidade.

As raízes dessa equação são os autovalores.

No exemplo, os autovalores principais são:

DimensãoAutovalor λ\lambdaλ% da inércia
10,228394,60%
20,01305,40%
Total0,2413100,00%

4. Cálculo dos valores singulares

Os valores singulares são calculados pela raiz quadrada dos autovalores:

σk=λk\sigma_k = \sqrt{\lambda_k}

Assim:

σ1=0,22830,4778\sigma_1 = \sqrt{0{,}2283} \approx 0{,}4778
σ2=0,01300,1141\sigma_2 = \sqrt{0{,}0130} \approx 0{,}1141

A tabela fica:

DimensãoAutovalor λ\lambdaλ% InérciaValor Singular σ\sigmaσ
10,228394,60%0,4778
20,01305,40%0,1141
Total0,2413100,00%

5. Quantidade máxima de dimensões

A quantidade máxima de dimensões é dada por:

m=min(I1, J1)m = \min(I – 1,\ J – 1)

No exemplo:

I = 3

porque existem 3 perfis:

Jovem, Adulto, Idoso\text{Jovem, Adulto, Idoso}

e

J = 4

porque existem 4 canais:

App, Site, Telefone, Loja Física\text{App, Site, Telefone, Loja Física}

Portanto:

m=min(31, 41)m = \min(3 – 1,\ 4 – 1)
m=min(2, 3)m = \min(2,\ 3)

m = 2

Logo, o mapa perceptual terá no máximo duas dimensões, que serão representadas pelos eixos XX e YY.

6. Coordenadas das categorias

Depois dos autovalores e autovetores, são calculadas as coordenadas das categorias no mapa perceptual.

Cada categoria recebe uma posição:

(x, y)

Onde:

x=Dimensão 1x = \text{Dimensão 1}
y=Dimensão 2y = \text{Dimensão 2}

Coordenadas dos perfis

Perfil do ClienteDimensão 1 / XDimensão 2 / Y
Jovem0,53720,1154
Adulto0,1028-0,1402
Idoso-0,66940,0649

Coordenadas dos canais

Canal de AtendimentoDimensão 1 / XDimensão 2 / Y
App0,58030,1156
Site0,2489-0,1825
Telefone-0,58160,0187
Loja Física-0,44130,0433

7. Interpretação do mapa perceptual

No mapa perceptual, categorias próximas indicam associação.

Neste exemplo:

Proximidade no mapaInterpretação
Jovem próximo de AppJovens estão mais associados ao uso do aplicativo
Adulto próximo de SiteAdultos estão mais associados ao uso do site
Idoso próximo de Telefone e Loja FísicaIdosos estão mais associados a canais tradicionais

A Dimensão 1 explica 94,60% da inércia. Portanto, o eixo horizontal é o mais importante. Ele separa principalmente:

Jovem e App\text{Jovem e App}

de:

Idoso, Telefone e Loja Física\text{Idoso, Telefone e Loja Física}

A Dimensão 2 explica apenas 5,40%, ajudando no ajuste visual das categorias, mas com importância menor.

1. Autovalores do nosso exemplo

Para o exemplo Perfil do Cliente × Canal de Atendimento, os autovalores foram:

DimensãoAutovalor λ\lambdaλ% InérciaValor Singular σ\sigmaσ
10,228394,60%0,4778
20,01305,40%0,1141
Total0,2413100,00%

2. Como calcular a % de inércia

Na ANACOR, a ideia é parecida com PCA: cada dimensão explica uma parte da informação total. Mas, em vez de “variância”, usamos o termo inércia, porque estamos analisando a associação entre categorias.

A fórmula é:

%Inércia da dimensão k=λkλ×100\% \text{Inércia da dimensão } k = \frac{\lambda_k}{\sum \lambda} \times 100

Onde:

λk\lambda_k

é o autovalor da dimensão analisada.

E:

λ\sum \lambda

é a soma de todos os autovalores não nulos.

Aplicando no nosso exemplo

A soma dos autovalores é:

λ=0,2283+0,0130=0,2413\sum \lambda = 0{,}2283 + 0{,}0130 = 0{,}2413

Para a Dimensão 1:

%Inércia1=0,22830,2413×100\% \text{Inércia}_1 = \frac{0{,}2283}{0{,}2413} \times 100
%Inércia194,60%\% \text{Inércia}_1 \approx 94{,}60\%

Para a Dimensão 2:

%Inércia2=0,01300,2413×100\% \text{Inércia}_2 = \frac{0{,}0130}{0{,}2413} \times 100
%Inércia25,40%\% \text{Inércia}_2 \approx 5{,}40\%

Somando:

94,60%+5,40%=100%94{,}60\% + 5{,}40\% = 100\%

Ou seja:

A Dimensão 1, representada pelo eixo XX, explica aproximadamente 94,60% da inércia total. Isso significa que quase toda a associação entre Perfil do Cliente e Canal de Atendimento está concentrada nesse primeiro eixo.

A Dimensão 2, representada pelo eixo YY, explica aproximadamente 5,40% da inércia total. Ela ainda participa do mapa perceptual, mas tem peso muito menor na explicação da associação.

Portanto, no nosso exemplo, o eixo XXé muito mais importante para a interpretação do gráfico do que o eixo YY.

Qual categoria é mais representativa? Calcular as massas:

Na ANACOR, as massas mostram o peso relativo de cada categoria na tabela. Em termos simples, elas indicam quais categorias têm maior participação no total da amostra.

A massa é calculada dividindo o total da linha ou da coluna pelo total geral.


1. Tabela observada

Perfil do ClienteAppSiteTelefoneLoja FísicaTotal
Jovem352051070
Adulto2530152090
Idoso510253070
Total65604560230

O total geral é:

n = 230

2. Massas das linhas

A massa da linha é calculada por:

mi=ni+nm_i = \frac{n_{i+}}{n}

Onde:

ni+n_{i+}

é o total da linha, e:

n

é o total geral da tabela.

Tabela de massas das linhas

Perfil do ClienteTotal da linhaMassa
Jovem700,3043
Adulto900,3913
Idoso700,3043
Total2301,0000

A categoria de linha mais representativa é:

Adulto\text{Adulto}

porque possui a maior massa:

0,39130{,}3913

Ou seja, os adultos representam aproximadamente:

39,13%39{,}13\%

do total da amostra.

Tabela de massas das colunas

Canal de AtendimentoTotal da colunaMassa
App650,2826
Site600,2609
Telefone450,1957
Loja Física600,2609
Total2301,0000

A categoria de coluna mais representativa é:

App\text{App}

porque possui a maior massa:

0,28260{,}2826

Ou seja, o canal App representa aproximadamente:

28,26%28{,}26\%

do total de atendimentos.

As massas indicam quais categorias têm maior peso no conjunto de dados.

No exemplo:

Tipo de categoriaCategoria mais representativaMassaPercentual
LinhaAdulto0,391339,13%
ColunaApp0,282628,26%

Portanto, a categoria mais representativa entre os perfis é Adulto, enquanto a categoria mais representativa entre os canais é App.

Mas atenção: massa alta não significa necessariamente maior associação.
A massa mostra o peso da categoria na amostra. Já a associação é analisada pelos resíduos padronizados ajustados e pela posição no mapa perceptual.

AutoVetores:

Indicam a direção dos eixos fatoriais. Eles ajudam a determinar como as categorias serão posicionadas no espaço.

Mapa Perceptual da Anacor:

ACM

O ACM apresenta a mesma lógica da ANACOR.

Também fazemos o teste estatístico Qui-quadrado, lembrando que o qui-quadrado são sempre em pares de variáveis.

Uma das diferenças no python da ANACOR e MCA, é que na ANACOR o input é a matriz de contingência, mas na MCA é o banco de dados com as variáveis categóricas. OBS.: no MCA deve se excluir a coluna ID entra apenas as variáveis.

TécnicaInput mais comum em PythonObjetivo
ANACOR / CAMatriz de contingênciaAnalisar associação entre duas variáveis categóricas
MCABase de dados com várias variáveis categóricasAnalisar associação entre múltiplas variáveis categóricas

Exemplo: MCA aplicada ao perfil de consumo em plataformas de streaming.

https://github.com/samantaleke/Unsupervised_MCA

Autovalores: (inercia=variância)

Na MCA, os autovalores indicam a quantidade de inércia explicada por cada dimensão. No exemplo analisado, a primeira dimensão explicou 21,97% da inércia total, enquanto a segunda dimensão explicou 17,96%. Somadas, as duas primeiras dimensões representam 39,93% da informação associativa presente nos dados. Portanto, o mapa perceptual bidimensional permite visualizar parte importante da estrutura de associação entre as categorias, embora não represente toda a inércia do conjunto de dados.

PCA / Análise Fatorial — Indicador Sintético para Imóveis

Objetivo do projeto

Este projeto tem como objetivo criar um indicador sintético para critério de preço de imóveis, utilizando PCA / Análise Fatorial.

A ideia principal é consolidar várias características dos imóveis em uma única métrica, permitindo criar um ranking de imóveis com base em fatores extraídos das variáveis originais.

EtapaTópicoIdeia principalPlot
0Verificar variáveis métricasGarantir que a PCA use apenas variáveis numéricas.Gráfico de tipos das variáveis
1OutliersVerificar imóveis com características muito fora do padrão.Boxplots por variável
2Correlação de PearsonAvaliar se existe relação linear entre as variáveis.Heatmap de correlação
3Esfericidade de BartlettTestar se a matriz de correlação é diferente da identidade.Gráfico do p-valor vs. 0,05
4Autovalores e KaiserSelecionar fatores com autovalor maior ou igual a 1.Barras dos autovalores
5AutovetoresMostrar as direções matemáticas dos fatores.Heatmap dos autovetores
6Cargas fatoriaisInterpretar o conteúdo de cada fator.Barras das cargas + loading plot
7ComunalidadesVer quanto cada variável continua representada após selecionar fatores.Barras das comunalidades
8Extração dos fatoresGerar o valor de cada fator para cada imóvel.Histograma dos fatores e plano fatorial
9Scores fatoriaisMostrar os pesos das variáveis padronizadas na formação dos fatores.Barras dos scores fatoriais
10RankingCriar o indicador ponderando os fatores pela variância explicada.Top 10 ranking + dispersão indicador vs. preço real

Unsupervised Machine Learning: PCA

Em python no repositório:https://github.com/samantaleke/Unsupervised_PCA

Utiliza somente Variáveis Métricas (quantitativas), pois utiliza método/correlação de Person.

Objetivo é agrupamento em fatores.

Muito utilizado para diminuir a dimensão, a quantidade de variáveis, exemplo, de 200 variáveis métricas diminui para 102 variáveis métricas.

Exemplos de utilização:

  • Criar um indicador/ranking que seja utilizado como critério de preço.

Um método exploratório sem fins preditivos.

Análise de Construtos

  • Identificação de Padrões: agrupando variáveis que medem o mesmo construto subjacente.
  • Redução de quantidade de variáveis: Redução de quantidade de variáveis métricas.
  • Eliminação de Redundância: Remove informações redundantes, mantendo a variabilidade principal dos dados de origem.

Funcionamento

Antes de iniciar

Análise preliminar, verifificar a correlação de Pearson (1) e esfericidade de Bartlett (2), antes de prosseguir com PCA.

  1. Correlação de Pearson.

PCA se basei nas correlações entre variáveis para criar os fatores, correlação de Pearson (relação linear entre 2 variáveis) e se são estatisticamente significantes.

O coeficiente de correlação de Pearson mede a intensidade e a direção da relação linear entre duas variáveis. Ele é calculado pela razão entre a covariância das variáveis e o produto dos seus respectivos desvios-padrão.

Em termos matemáticos:

ρ=[1ρ12ρ1kρ211ρ2kρk1ρk21] \rho = \begin{bmatrix} 1 & \rho_{12} & \cdots & \rho_{1k} \\ \rho_{21} & 1 & \cdots & \rho_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{k1} & \rho_{k2} & \cdots & 1 \end{bmatrix}
ρ12=i=1n(X1iX1)(X2iX2)i=1n(X1iX1)2i=1n(X2iX2)2 \rho_{12} = \frac{ \sum_{i=1}^{n}(X_{1i} – \bar{X}_1)(X_{2i} – \bar{X}_2) }{ \sqrt{\sum_{i=1}^{n}(X_{1i} – \bar{X}_1)^2} \cdot \sqrt{\sum_{i=1}^{n}(X_{2i} – \bar{X}_2)^2} }

De forma simplificada, podemos interpretar a fórmula como: Covariância de 2 variáveis, dividido pelo produto dos 2 desvios padrão.

ρ12=covariância entre X1 e X2desvio-padrão de X1×desvio-padrão de X2 \rho_{12} = \frac{ \text{covariância entre } X_1 \text{ e } X_2 }{ \text{desvio-padrão de } X_1 \times \text{desvio-padrão de } X_2 }

ou seja:

ρ12=Cov(X1,X2)sX1sX2 \rho_{12} = \frac{ \operatorname{Cov}(X_1, X_2) }{ s_{X_1} \cdot s_{X_2} }

A covariância, presente no numerador, indica se duas variáveis tendem a variar na mesma direção ou em direções opostas. Já os desvios-padrão, no denominador, padronizam essa relação, permitindo que o coeficiente fique limitado entre -1 e 1.

Assim:

1ρ1 -1 \leq \rho \leq 1

Interpretação:

Valor de (ρ)Interpretação
Próximo de 1Forte correlação positiva
Próximo de -1Forte correlação negativa
Próximo de 0Baixa ou nenhuma relação linear

No contexto do PCA, essa matriz é usada para entender como as variáveis se relacionam entre si. Quando há variáveis muito correlacionadas, o PCA consegue combinar essas informações em novos componentes principais, reduzindo a dimensionalidade dos dados sem perder muita informação.

2) Adequação Global da análise fatorial com método de Esfericidade de Bartlett

Após a construção da matriz de correlações de Pearson, foi aplicado o teste de esfericidade de Bartlett com o objetivo de avaliar a adequação global dos dados à análise fatorial/PCA.

No teste de esfericidade de Bartlett, a hipótese nula estabelece que a matriz de correlações de Pearson (ρ)(\rho) é igual à matriz identidade (I)(I).

Isso significa que as correlações entre as variáveis fora da diagonal principal são nulas, indicando ausência de associação linear entre elas.

Já a hipótese alternativa afirma que a matriz de correlações é diferente da matriz identidade, ou seja, existe correlação entre pelo menos algumas variáveis, tornando a aplicação do PCA mais adequada.

No teste de esfericidade de Bartlett, as hipóteses são:

  • Hipótese nula H0: A hipótese nula H0H_0H0​ afirma que a matriz de correlações de Pearson é igual à matriz identidade. Portanto, se não rejeitamos H0H_0H0​, entende-se que a matriz de correlações é próxima da identidade, indicando pouca ou nenhuma correlação entre as variáveis. Nesse caso, o PCA não é muito indicado.

  • Hipótese alternativa H1​: A hipótese alternativa H1H_1H1​ afirma que a matriz de correlações de Pearson é diferente da matriz identidade. Portanto, se rejeitamos H0H_0H0​, geralmente com p-valor < 0,05, conclui-se que a matriz de correlações difere significativamente da identidade, indicando que há correlação suficiente entre as variáveis para prosseguir com o PCA.

Ou seja, queremos testar se as variáveis são praticamente não correlacionadas entre si.

H0: ρ=I H_0:\ \rho = I
H0: ρ=[1ρ12ρ1kρ211ρ2kρk1ρk21]=I=[100010001] H_0:\ \rho = \begin{bmatrix} 1 & \rho_{12} & \cdots & \rho_{1k} \\ \rho_{21} & 1 & \cdots & \rho_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{k1} & \rho_{k2} & \cdots & 1 \end{bmatrix} = I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}

H1: ρI H_1:\ \rho \neq I
H1: ρ=[1ρ12ρ1kρ211ρ2kρk1ρk21]I=[100010001] H_1:\ \rho = \begin{bmatrix} 1 & \rho_{12} & \cdots & \rho_{1k} \\ \rho_{21} & 1 & \cdots & \rho_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{k1} & \rho_{k2} & \cdots & 1 \end{bmatrix} \neq I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}

Se não rejeitamos H0H_0H0​: a matriz de correlações é próxima da identidade → PCA não é muito indicado. Se rejeitamos H0H_0H0​, com p-valor < 0,05: a matriz de correlações difere da identidade → há correlação suficiente para prosseguir com o PCA.

Se o resultado for a hipótese H1 (alternativa), ou seja, matriz de correlação de Person é diferente de uma matriz de identidade.

Iniciando PCA (extração dos fatores)

Autovalor

A dimensão da matriz sempre será quantidade de variáveis que tem, e a quantidade de autovalores tambem, ou seja, 4 observações = 4 dimensões de uma matriz e = 4 autovalores = 4 fatores.

A matriz de correlações de Pearson (ρ)(\rho), com dimensão K×KK \times K, possui KK autovalores (λ)(\lambda), que são obtidos a partir da seguinte condição:

det(ρ−λI)=0

Essa expressão representa a equação característica da matriz. Ao resolver essa equação, encontramos suas raízes, que correspondem aos autovalores.

De forma expandida, temos a matriz: 1λρ12ρ1kρ211λρ2kρk1ρk21λ=0\begin{vmatrix} 1-\lambda & \rho_{12} & \cdots & \rho_{1k} \\ \rho_{21} & 1-\lambda & \cdots & \rho_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{k1} & \rho_{k2} & \cdots & 1-\lambda \end{vmatrix} = 0

No contexto do PCA, os autovalores indicam a quantidade de variância explicada por cada componente principal. Quanto maior o autovalor, maior é a parcela de informação dos dados originais representada por aquele componente.

Em outras palavras, os autovalores ajudam a identificar quais componentes concentram mais variabilidade e, portanto, quais são mais importantes para resumir a estrutura dos dados.

Exemplo:

Ou seja, percentual de variância dos dados originais, ou seja, a quantidade de informações está contida naquele Fator

Autovetor

Os autovetores indicam como as variáveis originais se combinam para formar cada componente principal. Cada autovetor está associado a um autovalor e representa uma direção de maior variação dos dados. No PCA, esses vetores mostram quais variáveis têm maior peso em cada componente, permitindo interpretar os padrões de correlação existentes entre elas.

Para cada autovalor eu tenho 1 autovetor. Ou seja, para cada autovalor encontrado, existe um autovetor correspondente que indica a direção do componente principal.

Após a obtenção dos autovalores da matriz de correlações de Pearson (ρ)(\rho), calcula-se o respectivo autovetor associado a cada autovalor (λ)(\lambda)

Os autovetores são obtidos resolvendo o seguinte sistema:(ρλI)v=0(\rho – \lambda I)v = 0

Em forma matricial:

[1λρ12ρ1kρ211λρ2kρk1ρk21λ][v1kv2kvkk]=[000] \begin{bmatrix} 1-\lambda & \rho_{12} & \cdots & \rho_{1k} \\ \rho_{21} & 1-\lambda & \cdots & \rho_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{k1} & \rho_{k2} & \cdots & 1-\lambda \end{bmatrix} \cdot \begin{bmatrix} v_{1k} \\ v_{2k} \\ \vdots \\ v_{kk} \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ \vdots \\ 0 \end{bmatrix}

Ou seja, para cada autovalor encontrado, existe um autovetor correspondente que indica a direção do componente principal.

De forma expandida, o sistema pode ser representado como:

{(1λ)v1k+ρ12v2k++ρ1kvkk=0ρ21v1k+(1λ)v2k++ρ2kvkk=0ρk1v1k+ρk2v2k++(1λ)vkk=0 \begin{cases} (1-\lambda)v_{1k} + \rho_{12}v_{2k} + \cdots + \rho_{1k}v_{kk} = 0 \\ \rho_{21}v_{1k} + (1-\lambda)v_{2k} + \cdots + \rho_{2k}v_{kk} = 0 \\ \vdots \\ \rho_{k1}v_{1k} + \rho_{k2}v_{2k} + \cdots + (1-\lambda)v_{kk} = 0 \end{cases}

No contexto do PCA, os autovetores representam as combinações lineares das variáveis originais que formam os componentes principais.

Em outras palavras, eles indicam o peso de cada variável em cada componente. Assim, ajudam a entender quais variáveis contribuem mais para cada dimensão extraída pelo PCA.

Fatores

Para formar os fatores por combinação linear das variáveis originais, calculam-se os scores fatoriais. Em geral, pode-se obter até KKK scores, onde KKK corresponde ao número de variáveis do conjunto de dados. Esses scores são determinados com base nos autovalores e autovetores da matriz de correlações, representando os pesos utilizados na construção de cada fator.

Como, em resumo o valor do autovalor dividido pela raiz quadrada do respectivo autovetor.

sj=vjλj s_j = \frac{v_j}{\sqrt{\lambda_j}}

De forma expandida:

s1=[s11s21sk1]=[v11λ1v21λ1vk1λ1] s_1 = \begin{bmatrix} s_{11}\\ s_{21}\\ \vdots\\ s_{k1} \end{bmatrix} = \begin{bmatrix} \dfrac{v_{11}}{\sqrt{\lambda_1}}\\ \dfrac{v_{21}}{\sqrt{\lambda_1}}\\ \vdots\\ \dfrac{v_{k1}}{\sqrt{\lambda_1}} \end{bmatrix}

Como neste exemplo foram utilizadas três variáveis — Atendimento, Preço e Qualidade — podem ser gerados até três scores fatoriais, um para cada componente principal.

Os scores fatoriais são obtidos pela divisão de cada elemento do autovetor pela raiz quadrada do respectivo autovalor.

VariávelScore Fatorial 1Score Fatorial 2Score Fatorial 3
Atendimento0,3430,8036,136
Preço-0,3352,6841,437
Qualidade0,3401,839-4,776

Esses valores foram obtidos a partir dos autovetores e autovalores do exemplo.

O Score Fatorial 1 é o mais importante para a interpretação inicial, pois está associado ao maior autovalor e, portanto, ao componente que explica a maior parte da variância dos dados.

Nesse primeiro fator, observamos que:

  • Atendimento possui peso positivo;
  • Qualidade possui peso positivo;
  • Preço possui peso negativo.

Assim, o primeiro fator representa um contraste entre Atendimento/Qualidade e Preço. Em outras palavras, ele resume a principal estrutura dos dados: quanto maiores os valores associados a atendimento e qualidade, menor tende a ser o peso associado ao preço.

A ideia é:F1=s11ZAtendimento+s21ZPrec¸o+s31ZQualidadeF_1 = s_{11}Z_{\text{Atendimento}} + s_{21}Z_{\text{Preço}} + s_{31}Z_{\text{Qualidade}}

Onde:

  • ZZZ representa a variável padronizada;
  • s11,s21,s31s_{11}, s_{21}, s_{31}s11​,s21​,s31​ são os scores fatoriais do Fator 1.
VariávelScore Fatorial 1Score Fatorial 2Score Fatorial 3
Atendimento0,3430,8036,202
Preço-0,3352,6861,452
Qualidade0,3401,840-4,826

Fórmula do Fator 1

Como o primeiro fator é formado pela combinação linear das variáveis padronizadas, temos:F1=0,343ZAtendimento0,335ZPrec¸o+0,340ZQualidadeF_1 = 0{,}343 \cdot Z_{\text{Atendimento}} – 0{,}335 \cdot Z_{\text{Preço}} + 0{,}340 \cdot Z_{\text{Qualidade}}

F2=0,803ZAtendimento+2,686ZPreço+1,840ZQualidade F_2 = 0{,}803 \cdot Z_{\text{Atendimento}} + 2{,}686 \cdot Z_{\text{Preço}} + 1{,}840 \cdot Z_{\text{Qualidade}}
F3=6,202ZAtendimento+1,452ZPreço4,826ZQualidade F_3 = 6{,}202 \cdot Z_{\text{Atendimento}} + 1{,}452 \cdot Z_{\text{Preço}} – 4{,}826 \cdot Z_{\text{Qualidade}}
VariávelValor padronizado
Z_Atendimento0,935
Z_Preço-0,935
Z_Qualidade1,154

Aplicando no Fator 1:

F1​=0,343(0,935)−0,335(−0,935)+0,340(1,154) F11,026F_1 \approx 1{,}026

Ou seja, a Observação 1 teria score aproximado de 1,026 no primeiro fator.

Após calcular os scores fatoriais, cada fator pode ser representado como uma combinação linear das variáveis padronizadas. No exemplo analisado, o primeiro fator foi formado pelos pesos de Atendimento, Preço e Qualidade. Como Atendimento e Qualidade possuem pesos positivos, enquanto Preço possui peso negativo, esse fator representa principalmente um contraste entre percepção de qualidade/atendimento e preço. Assim, cada observação passa a ter um novo valor no fator, calculado a partir da soma ponderada das variáveis padronizadas.

Carga Fatorial

Auxilia também na análise exploratória.

Correlação das observações com os fatores.

VariávelFator 1Fator 2Fator 3Comunalidades
Atendimento0,9930,0710,0971,000
Preço-0,9710,2390,0231,000
Qualidade0,9840,164-0,0761,000
MedidaFator 1Fator 2Fator 3
Autovalores2,8950,0890,016
Variância explicada96,51%2,96%0,52%
Variância acumulada96,51%99,48%100,00%

No Fator 1 concentra quase toda a informação dos dados, pois apresenta autovalor igual a 2,895 e explica aproximadamente 96,51% da variância total.

As maiores cargas fatoriais do Fator 1 aparecem em:

Atendimento=0,993

Preç​o=−0,971

Qualidade=0,984

Isso indica que o primeiro fator está fortemente associado a Atendimento e Qualidade, mas em sentido contrário ao Preço.

Como o Fator 2 e o Fator 3 possuem autovalores menores que 1, eles explicam pouca variância individualmente. Pelo critério de Kaiser, manteríamos apenas o Fator 1, pois:λ1=2,895>1\lambda_1 = 2{,}895 > 1λ2=0,089<1\lambda_2 = 0{,}089 < 1λ3=0,016<1\lambda_3 = 0{,}016 < 1

Portanto, as cargas fatoriais indicaram que o primeiro fator possui forte associação positiva com Atendimento e Qualidade, enquanto a variável Preço apresentou associação negativa. Isso sugere que o Fator 1 resume uma dimensão relacionada à percepção de qualidade e atendimento em oposição ao preço. Como esse fator apresentou autovalor igual a 2,895 e explicou 96,51% da variância total, ele concentrou a maior parte da informação dos dados. Pelo critério de Kaiser, apenas esse fator seria mantido, pois foi o único com autovalor superior a 1.

Comunalidade

Quando você trabalha com todos os fatores possíveis, ou seja, quantidade de variáveis, não tenho nenhum tipo de perda de informação das variáveis originais.

Então nós dissemos que as comunalidade seriam a perda da variância se acaso retirar Fatores, quanto de informação perderiamos.

Ou seja,

FatorAutovalorVariância explicada
Fator 12,89596,51%
Fator 20,0892,96%
Fator 30,0160,52%

Se manter apenas o Fator 1, a variância total explicada pelo modelo fica:

96,51%

E a parte que fica fora do modelo é:

100%−96,51%=3,49%

Ou seja, deixaria de explicar aproximadamente:

2,96%+0,52%=3,48%

Essa diferença é pequena, por isso manter só o Fator 1 faz sentido nesse exemplo.

Calcular o Fator e Score fatorial em cada observação

  • Scores fatoriais / coeficientes do fator: são os pesos usados na fórmula.
  • Valor do fator em cada linha: é o resultado da fórmula aplicada em cada observação.

No exemplo, mantendo apenas o Fator 1, a fórmula fica:

F1​=0,343⋅ZAtendimento​−0,335⋅ZPrec​o​+0,340⋅ZQualidade​

Ou seja, para cada linha da base, primeiro padronizamos as variáveis e depois aplicamos os pesos do fator.

1. Padronização das variáveis

Antes de calcular o fator, cada variável precisa ser transformada em valor padronizado ZZZ:Z=xxˉsZ = \frac{x – \bar{x}}{s}

Onde:x=valor observadox = \text{valor observado}xˉ=meˊdia da variaˊvel\bar{x} = \text{média da variável}s=desvio-padra˜o da variaˊvels = \text{desvio-padrão da variável}

VariávelMédiaDesvio-padrão
Atendimento6,5001,604
Preço6,5001,604
Qualidade7,3751,408

2. Fórmula do Fator 1

Após a padronização, aplicamos os pesos do Fator 1:

F1=0,343ZAtendimento0,335ZPreço+0,340ZQualidade F_1 = 0{,}343 \cdot Z_{\text{Atendimento}} – 0{,}335 \cdot Z_{\text{Preço}} + 0{,}340 \cdot Z_{\text{Qualidade}}

3. Exemplo calculado em uma linha

Para a Observação 1, os valores originais eram:

ObservaçãoAtendimentoPreçoQualidade
1859

Os valores padronizados ficam aproximadamente:

VariávelValor padronizado
Z_Atendimento0,935
Z_Preço-0,935
Z_Qualidade1,154

Aplicando na fórmula:F1=0,343(0,935)0,335(0,935)+0,340(1,154)F_1 = 0{,}343(0{,}935) – 0{,}335(-0{,}935) + 0{,}340(1{,}154) F1=0,321+0,313+0,392F_1 = 0{,}321 + 0{,}313 + 0{,}392F11,027F_1 \approx 1{,}027

Portanto, a Observação 1 tem valor aproximado de 1,027 no Fator 1.

Resultado para todas as observações:

ObservaçãoZ_AtendimentoZ_PreçoZ_QualidadeFator 1
10,935-0,9351,1541,027
20,3120,3120,4440,153
31,559-1,5591,1541,449
4-0,312-0,312-0,266-0,093
50,312-0,3120,4440,362
6-0,9350,935-0,977-0,966
7-1,5591,559-1,687-1,631
8-0,3120,312-0,266-0,302

O valor do fator em cada linha representa uma nova pontuação criada a partir das variáveis originais padronizadas.

Essa pontuação resume o comportamento conjunto das variáveis em um único indicador.

No exemplo, o Fator 1 resume principalmente a relação positiva entre Atendimento e Qualidade e a relação oposta com Preço.

Seleção de fatores

Depois de calcular autovalores, cargas fatoriais, comunalidades e fatores, o próximo passo é decidir quantos fatores manter na análise.

Nem sempre usamos todos os fatores. A decisão pode ser feita observando a magnitude dos autovalores.

No nosso exemplo, os autovalores foram aproximadamente:

FatorAutovalorVariância explicada
Fator 12,89596,51%
Fator 20,0892,96%
Fator 30,0160,52%

Pelo critério de Kaiser, mantemos apenas os fatores com autovalor maior que 1:

λ>1\lambda > 1

No exemplo acima:λ1=2,895>1\lambda_1 = 2{,}895 > 1 λ2=0,089<1\lambda_2 = 0{,}089 < 1λ3=0,016<1\lambda_3 = 0{,}016 < 1

Portanto, apenas o Fator 1 seria mantido.

O Fator 1 sozinho explica aproximadamente:96,51%96{,}51\%

da variância total dos dados.

Isso significa que ele já resume quase toda a informação presente nas três variáveis originais. Os Fatores 2 e 3 explicam parcelas muito pequenas da variância e, por isso, não teriam tanta representatividade nesse exemplo.

Comunalidade após escolher alguns fatores

No exemplo acima, ao manter apenas o Fator 1, as comunalidades deixam de ser iguais a 1,000, pois os demais fatores foram retirados da análise.

Nesse caso, a comunalidade de cada variável representa a parcela da sua variância explicada somente pelo primeiro fator.

No exemplo analisado, o Fator 1 explicou 98,6% da variância de Atendimento, 94,3% da variância de Preço e 96,8% da variância de Qualidade, indicando que um único fator já representa muito bem as três variáveis originais.

Agora se escolher 2 fatores, ou seja, Fator 1 e Fator 2, a comunalidade de cada variável será a soma dos quadrados das cargas fatoriais desses dois fatores.

A fórmula fica:hi2=cargai12+cargai22h_i^2 = carga_{i1}^2 + carga_{i2}^2

Ou seja:Comunalidade=(carga no Fator 1)2+(carga no Fator 2)2\text{Comunalidade} = (\text{carga no Fator 1})^2 + (\text{carga no Fator 2})^2

as cargas fatoriais eram aproximadamente:

VariávelFator 1Fator 2
Atendimento0,9930,071
Preço-0,9710,239
Qualidade0,9840,164

Então, as comunalidades com 2 fatores ficam:

VariávelCálculoComunalidade
Atendimento0,9932+0,07120{,}993^2 + 0{,}071^20,9932+0,07120,991
Preço(0,971)2+0,2392(-0{,}971)^2 + 0{,}239^2(−0,971)2+0,23921,000
Qualidade0,9842+0,16420{,}984^2 + 0{,}164^20,9842+0,16420,995

Em percentual:

VariávelComunalidade com 2 fatores
Atendimento99,1%
Preço100,0%
Qualidade99,5%

Comparando:

VariávelComunalidade com 1 fatorComunalidade com 2 fatores
Atendimento0,9860,991
Preço0,9431,000
Qualidade0,9680,995

Criação de ranking

Ponderação dos fatores e respectivas variâncias explicadas.

Dar maior peso aos fatores que explicam maior quantidade de variância dos dados.

A lógica é:

Cada observação recebe um valor em cada fator. Depois, esses fatores são combinados em uma única pontuação final, usando como peso a variância explicada por cada fator.

Ou seja, fatores que explicam mais variância recebem maior peso no ranking.

Fórmula geral

Se forem mantidos dois fatores, por exemplo:Rankingi=F1iVar(F1)+F2iVar(F2)Ranking_i = F_{1i} \cdot Var(F_1) + F_{2i} \cdot Var(F_2)

Onde:F1iF_{1i}

é o valor da observação ii no Fator 1, e:F2iF_{2i}

é o valor da observação ii no Fator 2.

Já:Var(F1)Var(F_1)

e:Var(F2)Var(F_2)

são as variâncias explicadas por cada fator.

No exemplo

Como o Fator 1 explica:96,51%96{,}51\%

e o Fator 2 explica:2,96%2{,}96\%

a fórmula do ranking com dois fatores seria:Rankingi=F1i0,9651+F2i0,0296Ranking_i = F_{1i} \cdot 0{,}9651 + F_{2i} \cdot 0{,}0296

Unsupervised Machine Learning: Clustering

Exemplo em python está no repositório: https://github.com/samantaleke/Unsupervised_clustering

  • Método hierarquico aglomerativo.
  • Método não hierarquico K-means.
  1. Técnicas de cluster são técnicas não supervisionadas e exploratórias, sem fins para criação de modelo preditivo, não se faz previsão. Apenas criação de grupos.
  2. Se novas observações entrarem na amostra, ou sairem, deve se executar novamente a criação de clusters.
  3. Tanto o Método Hierárquico Aglomerativo quanto o Método Não Hierárquico K-means são técnicas de análise de agrupamentos (clusterização) projetadas para funcionar com variáveis quantitativas (numéricas/contínuas).
  4. A diferença essencial, é que no K-means você precisa informar quantos clusters irá se formar, ao contrário do método hierárquico que agente escolhe após o dendograma.
  5. Escalas das medidas das variáveis deve ser pequena (exemplo 1 a 10) , se não estiver , deve se realizar a normalização, exemplo por z-score. Pois essas grandes amplitudes podem dominar os clusters.

Método hierarquico aglomerativo. (para análise)

O método hierárquico aglomerativo é uma técnica de aprendizado não supervisionado que agrupa dados “de baixo para cima”.

Método muito utilizado em analise exploratória e a quantidade de cluster é definida ao longo da analise.

Método não hierarquico K-means.

Deve se definir antes quantos grupos de cluster serão encontrados.

Método que se baseia na minimização.

Método hierarquico aglomerativo. (distância)

O quanto os grupos são diferentes entre si.

ANTES de iniciar:

  1. Verificar se as suas variáveis possuem unidade de medidas/ amplitudes muito distintas, muito grandes.
  2. Se for, deve-se utilizar a padronização em todas varáveis. Como? Ex. Z-score, passando a ter médias 0 e desvio padrão 1.

deve-se fazer o passo 1 e 2, pois impactam muito nos resultados da clusterização, onde variáveis com grandes amplitydes/distancia acabam dominando na clusterização.

Depois escolher entre:

Medida de dissimilaridade: se eu quero que os grupos sejam mais homogêneos internamente e heterogêneo entre si, tenho que decidir qual medida diga quais são as observações parecidas e quais são diferentes.

Método de encadeamento.

Qual o padrão de agrupamento.

Exemplo calculo:

Decidir a medida de distancia (dissimilaridade): QUANTO Maior a distância mais diferentes são entre 2 pontos.

Exemplo: Para calcular a distância, normalmente utiliza-se uma das medidas: euclidiana, euclidiana quadrática ou distância de Manhattan, distância de Chebychev, distância de Canberra (proporção), ou até a correlação de Pearson entre as observações.

Exemplo, conforme a tabela abaixo, que já estão na mesma escala de 0 a 10, ou seja, não precisa normalizar.

Seguem as distâncias:

Distância Euclidiana Quadrática:

d2(x,y)=i=1p(xiyi)2d^2(x,y) = \sum_{i=1}^{p} (x_i – y_i)^2
d2(x,y)=(x1y1)2+(x2y2)2++(xpyp)2d^2(x,y) = (x_1 – y_1)^2 + (x_2 – y_2)^2 + \cdots + (x_p – y_p)^2
d2(Ana,Bruno)=i=1p(xiyi)2 d^2(Ana, Bruno) = \sum_{i=1}^{p}(x_i – y_i)^2
d2(Ana,Bruno)=(8,56,0)2+(8,05,5)2+(7,56,5)2d^2(Ana, Bruno) = (8{,}5 – 6{,}0)^2 + (8{,}0 – 5{,}5)^2 + (7{,}5 – 6{,}5)^2
d2(Ana,Bruno)=(2,5)2+(2,5)2+(1,0)2d^2(Ana, Bruno) = (2{,}5)^2 + (2{,}5)^2 + (1{,}0)^2
d2(Ana,Bruno)=6,25+6,25+1,00 d^2(Ana, Bruno) = 6{,}25 + 6{,}25 + 1{,}00
d2(Ana,Bruno)=13,50d^2(Ana, Bruno) = 13{,}50

Ou seja, distância euclidiana quadrática entre Ana e Bruno é 13,50.

Escolho a metrica de distância/dissimilaridade, muito utilizada a euclidiana e vou unindo os pares com menores distâncias, criando os clusters.

Agora entra o método de encadeamento.

Ligação Simples (Single Linkage)/(vizinho mais próximo): Define a distância entre dois clusters como a menor distância entre qualquer ponto do primeiro cluster e qualquer ponto do segundo cluster.

Ligação Completa (Complete Linkage): Define a distância entre dois clusters como a maior distância entre qualquer ponto do primeiro cluster e qualquer ponto do segundo cluster.

Ligação Média (Average Linkage): Calcula a distância entre dois clusters como a média das distâncias entre todos os pares de pontos (um de cada cluster).

O método de Ward é uma técnica de análise de agrupamento hierárquico (clustering) que minimiza a variância dentro dos clusters. Ele agrupa observações maximizando a homogeneidade interna, ideal para variáveis quantitativas e para criar grupos de tamanhos similares. O processo aglomerativo une, a cada etapa, os dois grupos que resultam no menor aumento da soma dos quadrados.

Por fim, vai unindo todas as observações, no exemplo acima todas as pessoas, até o fim, criando um Dendograma:

Estabelecer um corte, quantas barras verticais cortou ?

veja que verifico logo abaixo da minha linha de corte, quantas | barras tem logo abaixo, no caso são 3 | barras, exemplificada com X em vermelho.

Em Python posso criar uma variável categórica com o valor do cluster a qual aquela observação pertence:

cluster_euclidi_min = AgglomerativeClustering(n_clusters = 3, metric = 'euclidean', linkage = 'single')
indica_cluster = cluster_euclidi_min.fit_predict(df)
df['cluster'] = indica_cluster
df['cluster'] = df['cluster'].astype('category')

Método não hierarquico K-means

Utiliza critério de minimização. Busca minimização a distância de cada observação até o centróide daquela observação.

  • K Clusters deve ser escolhidos antes, os centróides, cada centróide vai gerar 1 cluster.
  • Depois o k-means aloca as observações mais próximas desses centróides.

A solução final indica que a soma dos quadrados das distâncias entre cada observação e o centro do cluster ao qual ela foi alocada, conhecida como WCSS, foi minimizada. Essa solução é alcançada quando os centróides não se alteram mais significativamente entre as iterações.

WCSS=k=1KxiCkxiμk2 WCSS = \sum_{k=1}^{K} \sum_{x_i \in C_k} \left\| x_i – \mu_k \right\|^2

Onde:

  • xix_ixi​ é a observação iii;
  • μk\mu_kμk​ é o centróide do cluster kkk;
  • zikz_{ik}zik​ indica se a observação iii pertence ao cluster kkk;
  • KKK é o número de clusters.

Como funciona o K-means?

  1. Inicialização dos centróides
    O algoritmo começa escolhendo K centróides iniciais, que representam os centros provisórios dos grupos. Esses pontos podem ser escolhidos aleatoriamente no espaço dos dados.
  2. Atribuição dos pontos aos clusters
    Em seguida, cada ponto do conjunto de dados é associado ao centróide mais próximo, de acordo com uma medida de distância, como a distância euclidiana. Assim, são formados os primeiros K clusters.
  3. Atualização dos centróides
    Depois que os pontos são atribuídos aos clusters, o algoritmo recalcula a posição de cada centróide. O novo centróide passa a ser a média dos pontos pertencentes ao respectivo grupo.
  4. Repetição do processo
    As etapas de atribuição dos pontos e atualização dos centróides são repetidas várias vezes. A cada iteração, os grupos tendem a ficar mais ajustados.
  5. Critério de parada
    O processo termina quando os centróides deixam de mudar significativamente ou quando o algoritmo atinge um número máximo de iterações definido previamente.
  6. Resultado final
    Ao final, cada ponto estará associado a um dos K clusters, de forma que os pontos dentro de um mesmo grupo sejam mais semelhantes entre si do que em relação aos pontos de outros grupos.

Conforme o mesmo exemplo de Métodos Hierarquicos Aglomerativos, abaixo estão a formação de clusters com K-means.

Como escolher quantos clusters ?

A definição do número de clusters, representado por K, é uma etapa importante no uso do algoritmo K-means. Como o modelo exige que esse valor seja informado previamente, algumas técnicas podem ajudar a identificar uma quantidade adequada de grupos.

Método Cotovelo (Elbow):

O Método do Cotovelo avalia diferentes valores de K e calcula, para cada um deles, a soma dos quadrados das distâncias dentro dos clusters, conhecida como WCSS.

À medida que o número de clusters aumenta, a WCSS tende a diminuir, pois os grupos ficam menores e os pontos ficam mais próximos de seus respectivos centróides. No entanto, chega um momento em que aumentar o número de clusters gera pouca melhoria adicional.

No gráfico, esse ponto costuma aparecer como uma “dobra” ou “cotovelo”. Esse valor de K é considerado uma boa escolha, pois representa um equilíbrio entre simplicidade e qualidade do agrupamento.

O ponto onde a curva “dobra”.

No Método do Cotovelo, quanto menor o WCSS, mais próximos os pontos estão dos centróides de seus respectivos clusters.

Método da Silhueta

O Método da Silhueta avalia o quanto cada observação está bem alocada dentro do seu cluster. Para isso, são consideradas duas medidas principais:

  • a: distância média da observação em relação aos pontos do cluster ao qual ela pertence;
  • b: distância média da observação em relação ao cluster mais próximo ao qual ela não pertence.

Com essas duas informações, calcula-se o coeficiente de silhueta para cada observação. Depois, obtém-se a média dos coeficientes de todas as observações.

Esse procedimento é repetido para diferentes valores de K. Em geral, quanto maior o coeficiente médio de silhueta, melhor tende a ser a separação entre os clusters.

Análise:

Entender quais variáveis ajudaram mais a diferenciar os grupos formados. Ou qual variavel mais influenciou na separação de pelo menos um dos Clusters.

A ANOVA pode ser utilizada como uma análise complementar para verificar quais variáveis mais diferenciam os clusters formados pelo K-means. Em geral, quanto maior a estatística F, maior a diferença entre as médias dos clusters em relação à variabilidade interna dos grupos.

*No exemplo há apenas 5 estudantes, com uma amostra tão pequena, o p-valor não deve ser interpretado com muita força estatística.

Uma forma de fazer essa análise é comparar a variabilidade existente entre os clusters com a variabilidade existente dentro dos clusters. A lógica é simples: uma variável tende a ser mais relevante para separar os grupos quando apresenta médias bem diferentes entre os clusters e, ao mesmo tempo, menor dispersão dentro de cada grupo.

Para isso, pode-se utilizar a análise de variância [ANOVA], por meio da estatística F:

F=Variabilidade entre os gruposVariabilidade dentro dos gruposF = \frac{\text{Variabilidade entre os grupos}}{\text{Variabilidade dentro dos grupos}}

Na prática, quanto maior o valor da estatística F, maior tende a ser a capacidade daquela variável em diferenciar os agrupamentos.

Os graus de liberdade utilizados nesse teste são:

GLentre grupos=K1GL_{\text{entre grupos}} = K – 1

GLdentro dos grupos=nK GL_{\text{dentro dos grupos}} = n – K

Em que:

  • KK representa o número de clusters;
  • nn representa o tamanho da amostra.

Assim, após formar os clusters, é possível avaliar quais variáveis mais contribuíram para a separação dos grupos. As variáveis com maiores valores da estatística F, principalmente quando acompanhadas de significância estatística, tendem a ser as mais discriminantes na formação dos clusters.

Variável mais discriminante: teoria
Estatística F: 20.6000
p-valor: 0.0463

A variável teoria apresentou a maior estatística F, com valor de 20,60, e p-valor de 0,0463. Como esse p-valor é menor que 0,05, essa foi a única variável com diferença estatisticamente significativa entre os clusters, considerando o nível de significância de 5%.

A variável projeto também apresentou uma estatística F elevada, com valor de 17,08, mas seu p-valor foi 0,0553, ligeiramente acima de 0,05. Portanto, neste exemplo, ela ficou próxima da significância estatística, mas não seria considerada significativa pelo critério tradicional de 5%.

A variável prática apresentou estatística F menor, igual a 7,43, e p-valor de 0,1186, indicando menor evidência de diferença entre os clusters em comparação com as demais variáveis.

Unsupervised Machine Learning

O aprendizado de máquina não supervisionado são algoritmos que pode encontrar padrões ocultos nos dados não rotulados. Ele basicamente agrupa pontos de dados que se assemelham, ou pode redizir a dimensionalidade dos dados, encontrar associações entre dados. Muito utilizado para redução de dimensionalidade, detectar anomalias, encontrar padrões, principalmente exploratória. Não existe variável resposta.

Otimização Linear – Problema da Mistura

Em busca da mistura com menos custo, ou seja, minimizar o preço.

Notação matemática:

A variável de decisão xj é a quantidade do ingrediente j.xamp;=(x1,x2,,xn)T\begin{aligned} \text{A variável de decisão } x_j \text{ é a quantidade do ingrediente } j. \\ x &amp;= (x_1, x_2, \dots, x_n)^T \end{aligned}
O ingrediente j tem custo Cj.camp;=(C1,C2,,Cn)T\begin{aligned} \text{O ingrediente } j \text{ tem custo } C_j. \\ c &amp;= (C_1, C_2, \dots, C_n)^T \end{aligned}
Cada ingrediente j possui proporção Aij do componente i.Aamp;=(A11amp;A12amp;amp;A1nA21amp;A22amp;amp;A2namp;amp;amp;Am1amp;Am2amp;amp;Amn)\begin{aligned} \text{Cada ingrediente } j \text{ possui proporção } A_{ij} \text{ do componente } i. \\ A &amp;= \begin{pmatrix} A_{11} &amp; A_{12} &amp; \dots &amp; A_{1n} \\ A_{21} &amp; A_{22} &amp; \dots &amp; A_{2n} \\ \vdots &amp; \vdots &amp; \ddots &amp; \vdots \\ A_{m1} &amp; A_{m2} &amp; \dots &amp; A_{mn} \end{pmatrix} \end{aligned}
Cada componente i possui limite mínimo Ri e máximo Si.Ramp;=(R1,R2,,Rm)TSamp;=(S1,S2,,Sm)T\begin{aligned} \text{Cada componente } i \text{ possui limite mínimo } R_i \text{ e máximo } S_i. \\ R &amp;= (R_1, R_2, \dots, R_m)^T \\ S &amp;= (S_1, S_2, \dots, S_m)^T \end{aligned}
  • objetivo é achar as proporções dos ingredientes que respeitem os limites e chegue ao menor custo.
Objetivo: encontrar as proporções x que minimizam o custominamp;cTxsujeito aamp;RAxSamp;x0\begin{aligned} \text{Objetivo: encontrar as proporções } x \text{ que minimizam o custo} \\ \min \quad &amp; c^T x \\ \text{sujeito a} \quad &amp; R \leq A x \leq S \\ &amp; x \geq 0 \end{aligned}

Modelo:

minamp;c1x1+c2x2++cnxns.a:amp;x1+x2++xn=1amp;a1,1x1+a1,2x2++a1,nxnr1amp;a2,1x1+a2,2x2++a2,nxnr2amp;amp;am,1x1+am,2x2++am,nxnrmamp;a1,1x1+a1,2x2++a1,nxns1amp;a2,1x1+a2,2x2++a2,nxns2amp;amp;am,1x1+am,2x2++am,nxnsmamp;x1,x2,,xn0\begin{aligned} \min \quad &amp; c_1 x_1 + c_2 x_2 + \dots + c_n x_n \\[6pt] \text{s.a:} \quad &amp; x_1 + x_2 + \dots + x_n = 1 \\[6pt] &amp; a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n \ge r_1 \\ &amp; a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n \ge r_2 \\ &amp; \vdots \\ &amp; a_{m,1}x_1 + a_{m,2}x_2 + \dots + a_{m,n}x_n \ge r_m \\[6pt] &amp; a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n \le s_1 \\ &amp; a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n \le s_2 \\ &amp; \vdots \\ &amp; a_{m,1}x_1 + a_{m,2}x_2 + \dots + a_{m,n}x_n \le s_m \\[6pt] &amp; x_1, x_2, \dots, x_n \ge 0 \end{aligned}

Exemplos de aplicações:

Exemplo 1)

Modelo: Alocação de Entregas com Capacidade

Contexto

Uma organização precisa distribuir entregas para centros regionais.
Cada centro deve ser atendido por exatamente um veículo.
Cada veículo tem um limite máximo de atendimentos.

O objetivo é minimizar a distância total percorrida.

from pulp import LpProblem, LpMinimize, LpVariable, lpSum, LpStatus, value, PULP_CBC_CMD
# Criar problema
modelo = LpProblem("Delivery_Allocation_Model", LpMinimize)
veiculos = ['V1', 'V2', 'V3']
locais = ['Norte', 'Sul', 'Leste', 'Oeste', 'Centro']
# Variável binária: y[v,l] = 1 se veículo v atende local l
y = LpVariable.dicts(
"assign",
[(v, l) for v in veiculos for l in locais],
cat="Binary"
)
# Matriz de custos (distâncias)
custo = {
('V1', 'Norte'): 15, ('V1', 'Sul'): 20,
('V1', 'Leste'): 10, ('V1', 'Oeste'): 25,
('V1', 'Centro'): 5,
('V2', 'Norte'): 18, ('V2', 'Sul'): 15,
('V2', 'Leste'): 12, ('V2', 'Oeste'): 22,
('V2', 'Centro'): 8,
('V3', 'Norte'): 20, ('V3', 'Sul'): 25,
('V3', 'Leste'): 15, ('V3', 'Oeste'): 18,
('V3', 'Centro'): 10,
}
# -------------------------
# Função Objetivo
# -------------------------
modelo += lpSum(custo[(v, l)] * y[(v, l)] for v in veiculos for l in locais)
# -------------------------
# Restrição 1:
# Cada local deve ser atendido exatamente uma vez
# -------------------------
for l in locais:
modelo += lpSum(y[(v, l)] for v in veiculos) == 1
# -------------------------
# Restrição 2:
# Capacidade máxima de atendimentos por veículo
# -------------------------
limite_atendimentos = {'V1': 3, 'V2': 2, 'V3': 3}
for v in veiculos:
modelo += lpSum(y[(v, l)] for l in locais) <= limite_atendimentos[v]
# Resolver
modelo.solve(PULP_CBC_CMD(msg=False))
# Resultados
print("Status:", LpStatus[modelo.status])
print("Distância total mínima:", value(modelo.objective))
for v in veiculos:
atendimentos = [l for l in locais if value(y[(v, l)]) > 0.5]
print(f"{v} atende: {', '.join(atendimentos) if atendimentos else 'Nenhum'}")
Status: Optimal
Distância total mínima: 63.0
V1 atende: Norte, Leste, Centro
V2 atende: Sul
V3 atende: Oeste

Exemplo 2)

custo mínimo para 1Kg de ração com as restrições abaixo de quantidade mínima de proteína e sódio.

Modelo com valores respectivos para Frango/Osso/Trigo, com:

  • mistura total = 1 kg
  • proteína mínima
  • sódio máximo
  • x1,x2,x30x_1, x_2, x_3 \ge 0x1​,x2​,x3​≥0

Atenção: os coeficientes como exemplo na tabela (proteína: 0.6/0.2/0.1 e sódio: 0.1/0.05/0.02; limites proteína ≥ 0.4 e sódio ≤ 0.08).

import numpy as np
from scipy.optimize import linprog
# -------------------------
# Variáveis de decisão
# x1 = kg Frango, x2 = kg Osso, x3 = kg Trigo
# -------------------------
# Função objetivo: minimizar custo
# min 5x1 + 4x2 + 6x3
c = np.array([5, 4, 6], dtype=float)
# Restrições do tipo A_ub @ x <= b_ub
# 1) Proteína mínima: 0.6x1 + 0.2x2 + 0.1x3 >= 0.4
# Convertemos para <= multiplicando por -1:
# -0.6x1 -0.2x2 -0.1x3 <= -0.4
# 2) Sódio máximo: 0.1x1 + 0.05x2 + 0.02x3 <= 0.08
A_ub = np.array([
[-0.6, -0.2, -0.1], # proteína (convertida)
[ 0.1, 0.05, 0.02], # sódio
], dtype=float)
b_ub = np.array([
-0.4, # proteína mínima
0.08, # sódio máximo
], dtype=float)
# Restrição de igualdade: x1 + x2 + x3 = 1 (mistura total)
A_eq = np.array([[1, 1, 1]], dtype=float)
b_eq = np.array([1], dtype=float)
# Limites (não negatividade): x1, x2, x3 >= 0
bounds = [(0, None), (0, None), (0, None)]
# Resolver
res = linprog(
c=c,
A_ub=A_ub, b_ub=b_ub,
A_eq=A_eq, b_eq=b_eq,
bounds=bounds,
method="highs"
)
# Resultados
if res.success:
x1, x2, x3 = res.x
print("✅ Solução ótima encontrada (custo mínimo)")
print(f"x1 (Frango) = {x1:.4f} kg")
print(f"x2 (Osso) = {x2:.4f} kg")
print(f"x3 (Trigo) = {x3:.4f} kg")
print(f"Custo mínimo = R$ {res.fun:.4f}")
# Checagem das restrições (opcional)
proteina = 0.6*x1 + 0.2*x2 + 0.1*x3
sodio = 0.1*x1 + 0.05*x2 + 0.02*x3
print("\n🔎 Checagem:")
print(f"Total = {x1 + x2 + x3:.4f} (deve ser 1)")
print(f"Proteína = {proteina:.4f} (>= 0.4)")
print(f"Sódio = {sodio:.4f} (<= 0.08)")
else:
print("❌ Não foi possível encontrar solução.")
print("Motivo:", res.message)
✅ Solução ótima encontrada (custo mínimo)
x1 (Frango) = 0.5000 kg
x2 (Osso) = 0.5000 kg
x3 (Trigo) = 0.0000 kg
Custo mínimo = R$ 4.5000
🔎 Checagem:
Total = 1.0000 (deve ser 1)
Proteína = 0.4000 (>= 0.4)
Sódio = 0.0750 (<= 0.08)