Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

O que é Data Envelopment Analysis?

+1 voto
16 visitas
perguntada Nov 30 em Matemática por MarcioGama (96 pontos)  
Compartilhe

1 Resposta

+1 voto
respondida Nov 30 por MarcioGama (96 pontos)  
editado 6 dias atrás por MarcioGama

Data envelopment analysis (DEA) é uma técnica para avaliar performance de alguma atividade de alguma organização seja de uma empresa, de um banco, de uma loja, etc. Uma medida de eficiência usada é \( \frac{Produto}{Insumos}\). Com esta técnica podemos encontrar qual organização é mais eficiente dado os dados que possuímos e avaliar a performance de outras comparadas a esta.

A DEA utiliza técnicas de otimização matemática que comportam grande quantidade de dados e variáveis e por isso não sofre limitações de variáveis e também não há necessidade de determinar formas funcionais na análise.

O modelo mais básico de DEA busca achar os pesos dos insumos e dos produtos virtuais de cada organização de forma que a relação \( \frac{Produto\ virtual}{Insumo\ virtual}\) seja máxima.

Considere que:
\(produto \ virtual_{i} = \sum_{m = 1}^{m} v_{m}y_{mi} \), o produto virtual da organização \(i\).
\(insumo \ virtual_{i} = \sum_{s = 1}^{s} u_{s}x_{si} \), o insumo virtual da organização \(i\).
\(u_{i} \ e \ v_{i} \) são os vetores de pesos associados a organização \(i\).
\(X (s \times n)\) e \(Y (m \times n)\) são, respectivamente, a matriz de dados de insumo e produto. Os dados de cada organização são os vetores linha que formam essas duas matrizes.

O problema de maximizar a razão \( \frac{Produto\ virtual}{Insumo\ virtual}\) pode ser resolvido como um problema de programação linear de tal forma:

\[\max_{u,v} \ \theta_{i} = \sum_{m=1}^{m} v_{m}y_{mi} \]\[s.a \sum_{s = 1}^{s} u_{s}x_{si} = 1 \ \]\[v_{i}^TY \le u_{i}^TX\]\[u_{i} \gg 0\]\[v_{i} \gg 0\]

A organização que atinge sua função objetivo igual a um é considerada eficiente e a eficiência das outras unidades é baseada em proporção ao nível dela.

Exemplo prático:

Para exemplificar o problema, vamos investigar a eficiência no setor bancário, considerando como insumo o número de agências e postos de atendimento e como produto o lucro líquido. Os dados foram retirados de Banco Central do Brasil período 06/2018 e os relatórios de resumo (dadosbcb.csv) e quantidade de clientes (dadosbcb2.csv) e a resolução será feita no python.

import numpy as np
from scipy.optimize import linprog
from pulp import *
import pandas as pd

dados_1 = pd.read_csv("dadosbcb.csv", sep = ";")

dados_2 = pd.read_csv("dadosbcb2.csv", sep = ";")

#retiramos as variáveis que não serão usadas.

df1 = dados_1[['Código', 'Instituição financeira','Lucro Líquido', 'Número de Agências', 'Número de Postos de Atendimento']]

df2 = dados_2[['Código', 'Quantidade de Clientes']]

#Alguns ajustes na base de dados

df2 = df2.applymap(lambda x: str(x).replace(".", "")) #retira os pontos nos números na #forma de texto
df2 = df2.applymap(lambda x: int(x) if x.isdigit() else 0) #transforma os textos numéricos #em números

df1 = df1.applymap(lambda x: str(x).replace(".",""))
df1 = df1.applymap(lambda x: int(x) if x.isdigit() else 0)

df1 = df1.set_index('Código')
df2 = df2.set_index('Código')

#selecionamos nos dados apenas alguns bancos [Bradesco, Itau, CEF, Santander, bb]
select = [10045, 10069, 360305, 30379, 49906]

df1 = df1.loc[select, :]
df2 = df2.loc[select, :]

dados = df1.join(df2, how='outer')
#somamos a quantidade de agências e postos de atendimento
dados['Atendimento'] = dados['Número de Agências'] + dados['Número de Postos de Atendimento']

print(dados)


          Instituição financeira Lucro Líquido Número de Agências  \
Código                                                               
10045.0                  BRADESCO       9035428               4741   
10069.0                      ITAU      10128205               3390   
360305.0  CAIXA ECONOMICA FEDERAL       5832657               3390   
30379.0                 SANTANDER       5951379               2685   
49906.0                        BB       5961520               4769   

         Número de Postos de Atendimento Quantidade de Clientes Atendimento  \
Código                                                                        
10045.0                             1403               40799226        6144   
10069.0                              994               33658835        4384   
360305.0                             796               17587336        4186   
30379.0                             1234               16301435        3919   
49906.0                             1248               13870273        6017   

Em seguida, resolvemos o problema de programação Linear.

#criamos uma umpy array com os dados de interesse
conj = np.array(dados[['Instituição financeira', 'Lucro Líquido', 'Atendimento']])

#função que resolve o problema de maximização e retorna os valores da função objetivo e #dos pesos
def DEA(dados,i):
    prob = LpProblem("DEA", LpMaximize)
    u = LpVariable('u', 0, None)
    v = LpVariable('v',0, None)
    prob += u*dados[i][2]
    prob += v*dados[i][2] == 1
    for j in range(0, len(dados)):
        prob += u*dados[j][3] <= v*dados[j][2] 

    prob.solve()
    return [dados[i][0], dados[i][4]*u.varValue, u.varValue, v.varValue]

 resultado = []
#calculando os valores para todos os bancos
for i in range(0, len(conj)):
    resultado.append(DEA(conj, i))

print(resultado)
#[nome do banco, função objetivo, u, v]
[['BRADESCO', 0.6365544862566, 7.045095e-08, 0.00016276042],
 ['ITAU', 0.99999999529049, 9.8734178e-08, 0.00022810219],
 ['CAIXA ECONOMICA FEDERAL', 0.60312216418452, 1.0340436e-07, 0.00023889154],
 ['SANTANDER', 0.65732540652954, 1.1044926e-07, 0.00025516713],
 ['BB', 0.42885952172248004, 7.1937949e-08, 0.00016619578]]

Com os resultados obtidos podemos considerar que o Itau é o banco eficiente. O valor da função objetivo dos outros bancos podem ser interpretados como o ajuste que devem ser feitos em seus insumos para se tornarem tão eficientes quanto o Itau. Por exemplo, o número de agência que tornaria a Caixa eficiente é \(0.6 \times 4186 = 2511 \), deixando o lucro fixo.

Por último, traçamos a fronteira eficiente. Neste caso, a fronteira eficiente passa pelo Banco Itau e o valor encontrado na função objetivo multiplicado por seus insumos os colocariam na fronteira eficiente.

fig = plt.figure(1, figsize=(7,7 ), frameon=False, dpi=100)
ax = plt.gca()

for i in range(0, len(conj)):
    plt.plot(conj[i][2], conj[i][5], 'o', label = conj[i][0])

plt.plot([conj[1][2], 0], [conj[1][6], 0], label = 'fronteira eficiente')

plt.legend()

plt.savefig('fronteira_eficiente')

A imagem será apresentada aqui.

Foi usado como referência para essa resolução o livro Data Envelopment
Analysis: A Comprehensive Text with Models, Applications,
References and DEA-Solver Software Hardcover" - November 14,
2006 - William W. Cooper, Lawrence M. Seiford, Kaoru Tone

comentou 6 dias atrás por Stuart Mill (504 pontos)  
Muito boa resposta, Márcio, o exemplo e aplicação no Python também foram muito elucidativos e práticos.

Uma dúvida, ao montar o problema se otimização, qual o significado da notação " \' " na segunda restrição? Ou foi um erro no LaTeX? Imagino que essa seja a restrição de que o produto virtual seja menor ou igual ao insumo virtual para todo i = 1, ... , n. É isso?
comentou 6 dias atrás por MarcioGama (96 pontos)  
Foi um erro do Latex. Era para ser transposto. Vou arrumar.

Exatamente, essa restrição pede que para todas as organizações observadas o produto virtual seja menor ou igual ao insumo virtual com um detalhe que talvez não fique claro: essa relação deve ser mantida com os pesos u, v encontrados para a organização em foco e não o "u" e "v" de cada um dos i.
comentou 3 horas atrás por Pedro Campelo (46 pontos)  
Márcio, Parabéns pela resposta. Ela ficou muito clara e completa com o exemplo empírico.

Fiquei na dúvida sobre o gráfico da questão. É um gráfico de risco e retorno?
Talvez seria interessante colocar os labels no gráfico, bastaria adicionar:

    plt.ylabel('ylabel')
    plt.xlabel('xlabel')
comentou 2 horas atrás por MarcioGama (96 pontos)  
Obrigado pelo comentário, Pedro.

Bem lembrado, vou por label no gráfico para ficar mais simples de entender. Na verdade esse gráfico apenas está mostrando o número de clientes no eixo x e o lucro no eixo y. A linha representa a fronteira eficiente onde o pessoal que ficou de fora dela deveria "andar" em sua direção.
...