Métricas de Equidade em Aprendizado de Máquina e seus Fundamentos Éticos e Políticos

Fernando Pasquini Santos - Department of Computer Science, Calvin University

Equidade em Aprendizado de Máquina

  • Referência principal: Fairness and Machine Learning (Barocas, Hardt, Narayanan, 2019)
  • Vamos mostrar alguns conceitos básicos, algumas limitações/dificuldades e depois partir para reflexões…

Nosso exemplo: fazendo alguns estudantes “vencerem na vida”…?

  • 1.000 linhas, onde cada linha representa o perfil de um estudante, com atributos relacionados ao desempenho acadêmico e não acadêmico, necessidade financeira e informações demográficas, e a decisão de concessão de bolsa de estudo.
  • Informações são geralmente consideradas em decisões sobre concessão de bolsas de estudo.
  1. Student_ID: um identificador único para cada estudante.
  2. Sensitive_Attribute: um atributo sensível genérico com dois grupos, usado para análise de equidade (por exemplo, gênero, cor, idade, etc).
  3. GPA: média de notas, variando de 2.0 a 4.0.
  4. Extracurricular_Score: uma pontuação que representa a participação e conquistas do estudante em atividades extracurriculares, variando de 0 a 100.
  5. Community_Service_Hours: o total de horas que o estudante dedicou a atividades de serviço comunitário, variando de 0 a 200.
  6. Financial_Need: indica se o estudante possui necessidade financeira.
  7. Scholarship_Granted: indica se o estudante recebeu bolsa de estudo. (Quem decidiu isso???)
import pandas as pd

df = pd.read_csv('https://cs.calvin.edu/courses/data/202/fsantos/datasets/student_performance.csv')
df.loc[:,'Sensitive_Attribute'] = df['Sensitive_Attribute'].apply(lambda x: 0 if x == 'Group A' else 1)
display(df)
Student_ID GPA Extracurricular_Score Community_Service_Hours Financial_Need Sensitive_Attribute Scholarship_Granted Prob_Class_1
0 1 4.000000 83 106 0 0 1 0.822589
1 3 2.152307 99 134 1 1 1 0.657725
2 13 4.000000 60 194 0 0 1 0.421887
3 20 2.344123 53 136 1 1 1 0.537936
4 44 2.259717 70 87 1 1 1 0.122756
... ... ... ... ... ... ... ... ...
375 744 4.000000 44 149 0 0 0 0.632398
376 114 3.521633 24 194 1 0 0 0.969348
377 443 4.000000 6 193 1 0 0 0.922639
378 668 2.000000 28 49 0 1 0 0.413321
379 702 2.000000 97 160 1 1 0 0.141278

380 rows × 8 columns

Treinando o modelo, considerando o atributo sensível

  • Usando um modelo simples de regressão logística.
  • Dividimos o conjunto de dados em treinamento e teste (80%/20%). Nossas medidas vão avaliar o quão bem o conjunto de treinamento generaliza para o conjunto de teste.
    • Primeira suposição: os dados refletem o “certo” com respeito a quem merece a bolsa de estudo ou não.
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Define features (X) and target variable (y)
X = df[['GPA', 'Extracurricular_Score', 'Community_Service_Hours', 'Financial_Need', 'Sensitive_Attribute']]
y = df['Scholarship_Granted']

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train a Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

Matriz de confusão

Classe Predita: Positiva Classe Predita: Negativa
Classe Real: Positiva Verdadeiro Positivo (VP) Falso Negativo (FN)
Classe Real: Negativa Falso Positivo (FP) Verdadeiro Negativo (VN)

Métricas

Métrica Fórmula Interpretação
Acurácia (VP + VN) / Total Proporção de acertos totais
Precisão (Positive Predictive Value) VP / (VP + FP) Entre os classificados como positivos, quantos realmente são
Revocação (Recall ou Sensibilidade) VP / (VP + FN) Entre os positivos reais, quantos foram corretamente identificados
Especificidade VN / (VN + FP) Entre os negativos reais, quantos foram corretamente identificados
Taxa de Falsos Positivos (FPR) FP / (FP + VN) Negativos reais classificados erroneamente como positivos
Taxa de Falsos Negativos (FNR) FN / (FN + VP) Positivos reais classificados erroneamente como negativos
F1 Score 2 × (Precisão × Revocação) / (Precisão + Revocação) Média harmônica entre precisão e revocação
Valor Preditivo Negativo (NPV) VN / (VN + FN) Entre os classificados como negativos, quantos realmente são
Taxa de Prevalência (VP + FN) / Total Proporção de positivos na população real

No nosso caso:

  • Observe como as métricas diferem entre os grupos…

Overall Confusion Matrix:
Predicted 0 Predicted 1
Actual 0 27 10
Actual 1 6 33

Confusion Matrix for Group A:
Predicted 0 Predicted 1
Actual 0 10 6
Actual 1 1 14

Confusion Matrix for Group B:
Predicted 0 Predicted 1
Actual 0 17 4
Actual 1 5 19
Metric Group A Group B
Acceptance Rate 20/31, 64.52% 23/45, 51.11%
Accuracy 77.4% 80.0%
Precision 70.0% 82.6%
Recall 93.3% 79.2%
F1-Score 80.0% 80.9%

Isso é um problema?

Três possíveis sentidos de “inequidade” e/ou “discriminação”:

  1. Atribuir vantagem/desvantagem a alguém com base em critérios errados de relevância
  2. Atribuir vantagem/desvantagem a alguém com base em estereótipos e generalizações
  3. Atribuir vantagem/desvantagem a alguém com base em coisas sobre as quais a pessoa não tem controle

Como o atributo sensível entra na equação?

  • Regressão logística: basicamente uma fórmula linear que combina os atributos para gerar uma pontuação, e então aplica uma função logística para gerar uma probabilidade de aceitação.
  • Algo como: \[P(\text{aceito}) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 \cdot GPA + \beta_2 \cdot Extracurricular\_Score + \beta_3 \cdot Community\_Service\_Hours + \beta_4 \cdot Financial\_Need + \beta_5 \cdot Sensitive\_Attribute)}}\]

No modelo atual:

# Get feature importances from the trained model
feature_importances = model.coef_[0]
print("Feature Importances:")
for feature, importance in zip(X.columns, feature_importances):
    print(f"{feature}: {importance:.4f}")
Feature Importances:
GPA: 1.6254
Extracurricular_Score: 0.0652
Community_Service_Hours: 0.0127
Financial_Need: -0.2453
Sensitive_Attribute: 2.5152

O que fazer, então?

  • Pré-processamento: ajustar o conjunto de dados para que não tenha qualquer correlação com o atributo sensível.
  • Durante o treinamento: incorporar restrições no processo de otimização que constrói o modelo (por exemplo, não permitir que o modelo utilize o atributo sensível).
  • Pós-processamento: ajustar um modelo já treinado para que não tenha correlação com o atributo sensível.

Vamos focar no pós-processamento

Quatro “possibilidades”

  • Elimina-se o atributo sensível do treinamento, e então:
  1. Avestruz com a cabeça na terra: ignorar o atributo sensível, ignorar os grupos, usar o mesmo limiar de decisão para todos;
    1. “Color-blindness argument”
  2. Usar limiares de decisão diferentes para cada grupo. Três critérios:
    1. Maximizar a acurácia (ou “máximo lucro”): cada grupo tem um limiar de decisão que maximiza a acurácia do modelo para aquele grupo;
    2. Paridade demográfica: alcançar uma taxa de aceitação igual em todos os grupos;
    3. Paridade de erro ou acurácia: alcançar taxas iguais de verdadeiros/falsos positivos/negativos em todos os grupos.

1a estratégia: avestruz com a cabeça na terra

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# Define features (X) and target variable (y) - ignore sensitive attribute
X = df[['GPA', 'Extracurricular_Score', 'Community_Service_Hours', 'Financial_Need']]
y = df['Scholarship_Granted']

# Convert 'Financial_Need' to numerical (0 or 1) if it's not already
if not pd.api.types.is_numeric_dtype(X['Financial_Need']):
    X['Financial_Need'] = X['Financial_Need'].astype(int)

# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Initialize and train a Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)

# Make predictions on the test set
y_pred = model.predict(X_test)

Problema 1: Métricas ainda continuam diferentes

Metric Group A Group B
Acceptance Rate 23/31, 74.19% 24/45, 53.33%
Accuracy 67.7% 77.8%
Precision 60.9% 79.2%
Recall 93.3% 79.2%
F1-Score 73.7% 79.2%

Problema 2: Discriminação por proxy

  • Outros atributos podem refletir os grupos.
  • Por exemplo, vamos identificar o atributo com maior importância:
# Get feature importances from the trained model
feature_importances = model.coef_[0]

# Create a DataFrame to display feature importances
feature_importance_df = pd.DataFrame({'Feature': X.columns, 'Importance': feature_importances})

# Sort the DataFrame by importance
feature_importance_df = feature_importance_df.sort_values(by='Importance', ascending=False)

# Print the feature importances
feature_importance_df
Feature Importance
0 GPA 0.256382
1 Extracurricular_Score 0.065146
2 Community_Service_Hours 0.012244
3 Financial_Need -0.224091
  • Observe como o GPA é afetado pelos grupos:
import plotly.express as px

# Group data by 'Sensitive_Attribute' and calculate the mean GPA for each group
gpa_by_group = df.groupby('Sensitive_Attribute')['GPA'].mean()

# Create a bar plot using Plotly Express
fig = px.bar(gpa_by_group, x=gpa_by_group.index, y='GPA',
             labels={'GPA': 'Mean GPA', 'Sensitive_Attribute': 'Group'},
             title='Mean GPA by Sensitive Attribute')
fig.show()

2a estratégia: diferentes limiares, máxima acurácia

  • Do ponto de vista de quem vai ofertar as bolsas, a ideia é acertar o máximo que puder.

  • E se limiares diferentes forem atribuídos aos grupos de forma a maximizar os acertos?

    • Pode ser pior ainda… pode ficar mais “rígido” para grupos menos representados, e mais “flexível” para grupos mais representados.
# Find the optimal threshold for Group A to minimize errors
best_threshold_A = 0
min_errors_A = float('inf')

# Filter for groups
df_proba_group_A = df_proba[df_proba['Sensitive_Attribute'] == 0]
df_proba_group_B = df_proba[df_proba['Sensitive_Attribute'] == 1]

for threshold in np.linspace(0, 1, 101):  # Test thresholds from 0 to 1
    df_proba_group_A_test = df_proba_group_A.copy()
    df_proba_group_A_test['Predicted_Label'] = (df_proba_group_A['Prob_Class_1'] >= threshold).astype(int)
    errors_A = sum(df_proba_group_A_test['Predicted_Label'] != df_proba_group_A_test['True_Label'])
    if errors_A < min_errors_A:
        min_errors_A = errors_A
        best_threshold_A = threshold

print(f"Best threshold for Group A: {best_threshold_A}")
print(f"Minimum errors for Group A: {min_errors_A}")

# Find the optimal threshold for Group B to minimize errors
best_threshold_B = 0
min_errors_B = float('inf')

for threshold in np.linspace(0, 1, 101):  # Test thresholds from 0 to 1
    df_proba_group_B_test = df_proba_group_B.copy()
    df_proba_group_B_test['Predicted_Label'] = (df_proba_group_B['Prob_Class_1'] >= threshold).astype(int)
    errors_B = sum(df_proba_group_B_test['Predicted_Label'] != df_proba_group_B_test['True_Label'])
    if errors_B < min_errors_B:
        min_errors_B = errors_B
        best_threshold_B = threshold

print(f"Best threshold for Group B: {best_threshold_B}")
print(f"Minimum errors for Group B: {min_errors_B}")
Best threshold for Group A: 0.7000000000000001
Minimum errors for Group A: 6
Best threshold for Group B: 0.24
Minimum errors for Group B: 8
Metric Group A Group B
Acceptance Rate 15/31, 48.39% 32/45, 71.11%
Accuracy 80.6% 82.2%
Precision 80.0% 75.0%
Recall 80.0% 100.0%
F1-Score 80.0% 85.7%

3a estratégia: paridade demográfica

  • A mesma quantidade de pessoas de cada grupo é escolhida (Positivos A = Positivos B). (Ou alguma outra proporção - “cotas”)
# Find thresholds to achieve demographic parity
def find_thresholds_for_demographic_parity(df_group_A, df_group_B, lambda_weight=0.5):
    best_threshold_A = 0
    best_threshold_B = 0
    best_combined_metric = float('inf')

    def calculate_accuracy(df, threshold):
        df_test = df.copy()
        df_test['Predicted_Label'] = (df_test['Prob_Class_1'] >= threshold).astype(int)
        accuracy = (df_test['Predicted_Label'] == df_test['True_Label']).mean()
        return accuracy

    # Test thresholds for both groups
    for threshold_A in np.linspace(0, 1, 101):
        for threshold_B in np.linspace(0, 1, 101):
            ppr_A = df_proba_group_A[df_group_A['Prob_Class_1'] >= threshold_A].shape[0]
            ppr_B = df_proba_group_B[df_group_B['Prob_Class_1'] >= threshold_B].shape[0]
            ppr_diff = abs(ppr_A - ppr_B)

            # Calculate accuracy for both groups
            accuracy_A = calculate_accuracy(df_group_A, threshold_A)
            accuracy_B = calculate_accuracy(df_group_B, threshold_B)
            overall_accuracy = (accuracy_A + accuracy_B) / 2

            # Combine PPR difference and accuracy into a single metric
            combined_metric = lambda_weight * ppr_diff - (1 - lambda_weight) * overall_accuracy

            # Update best thresholds if the combined metric improves
            if combined_metric < best_combined_metric:
                best_combined_metric = combined_metric
                best_threshold_A = threshold_A
                best_threshold_B = threshold_B

    return best_threshold_A, best_threshold_B

# Find the thresholds for demographic parity
best_threshold_A, best_threshold_B = find_thresholds_for_demographic_parity(df_proba_group_A, df_proba_group_B)

print(f"Threshold for Group A (Demographic Parity): {best_threshold_A}")
print(f"Threshold for Group B (Demographic Parity): {best_threshold_B}")
Threshold for Group A (Demographic Parity): 0.62
Threshold for Group B (Demographic Parity): 0.63
Metric Group A Group B
Acceptance Rate 18/31, 58.06% 18/45, 40.00%
Accuracy 77.4% 77.8%
Precision 72.2% 88.9%
Recall 86.7% 66.7%
F1-Score 78.8% 76.2%

4a estratégia: paridade de erro ou acurácia

  • Podemos tentar pelo menos evitar que grupos diferentes tenham taxas de erro diferentes…
  • Por exemplo, tentar equalizar a taxa de verdadeiros positivos entre grupos:
# Function to calculate True Positive Rate (TPR) for a given threshold and group
def calculate_tpr(df, threshold):
    df_test = df.copy()
    df_test['Predicted_Label'] = (df_test['Prob_Class_1'] >= threshold).astype(int)
    true_positives = df_test[(df_test['Predicted_Label'] == 1) & (df_test['True_Label'] == 1)].shape[0]
    condition_positives = df_test[df_test['True_Label'] == 1].shape[0]
    tpr = true_positives / condition_positives if condition_positives > 0 else 0
    return tpr

def calculate_accuracy(df, threshold):
    df_test = df.copy()
    df_test['Predicted_Label'] = (df_test['Prob_Class_1'] >= threshold).astype(int)
    accuracy = (df_test['Predicted_Label'] == df_test['True_Label']).mean()
    return accuracy

# Function to find thresholds for equal opportunity while balancing accuracy
def find_thresholds_balanced_equal_opportunity(df_group_A, df_group_B, lambda_weight=0.5):
    best_threshold_A = 0
    best_threshold_B = 0
    best_combined_metric = float('inf')

    # Test thresholds for both groups
    for threshold_A in np.linspace(0, 1, 101):
        for threshold_B in np.linspace(0, 1, 101):
            # Calculate TPR for both groups
            tpr_A = calculate_tpr(df_group_A, threshold_A)
            tpr_B = calculate_tpr(df_group_B, threshold_B)
            tpr_diff = abs(tpr_A - tpr_B)

            # Calculate accuracy for both groups
            accuracy_A = calculate_accuracy(df_group_A, threshold_A)
            accuracy_B = calculate_accuracy(df_group_B, threshold_B)
            overall_accuracy = (accuracy_A + accuracy_B) / 2

            # Combine TPR difference and accuracy into a single metric
            combined_metric = lambda_weight * tpr_diff - (1 - lambda_weight) * overall_accuracy

            # Update best thresholds if the combined metric improves
            if combined_metric < best_combined_metric:
                best_combined_metric = combined_metric
                best_threshold_A = threshold_A
                best_threshold_B = threshold_B

    return best_threshold_A, best_threshold_B

# Find thresholds balancing equal opportunity and accuracy
best_threshold_A, best_threshold_B = find_thresholds_balanced_equal_opportunity(
    df_proba_group_A, df_proba_group_B, lambda_weight=0.5
)

print(f"Threshold for Group A (Equal Opportunity): {best_threshold_A}")
print(f"Threshold for Group B (Equal Opportunity): {best_threshold_B}")
Threshold for Group A (Equal Opportunity): 0.7000000000000001
Threshold for Group B (Equal Opportunity): 0.5
Metric Group A Group B
Acceptance Rate 15/31, 48.39% 24/45, 53.33%
Accuracy 80.6% 77.8%
Precision 80.0% 79.2%
Recall 80.0% 79.2%
F1-Score 80.0% 79.2%

Outras abordagens…

Equidade por contrafactuais

“Se esta mesma pessoa não fosse do gênero X, ou da cor Y, ou da idade Z, o resultado seria diferente?”

Desafios:

  • É possível saber como seria o “mundo alternativo”?
  • Como simular a mesma pessoa com tudo igual, exceto um aspecto identitário fundamental?
  • Esbarra em limites filosóficos e técnicos da modelagem de identidades humanas…

Equidade por causalidade

Uso de modelos causais para avaliar se o atributo sensível está realmente influenciando o resultado de forma indevida.

Desafios:

  • Conseguimos modelar corretamente todas as causas relevantes?
  • Quais variáveis ocultas não estamos considerando?
  • Bem mais sofisticado e difícil de levar adiante.
  • Por exemplo, path analysis, do-calculus
  • Para aprofundar, há um grande estudo de caso sobre admissões de homens e mulheres na UC Berkeley - veja aqui

Uma grande limitação: grupos

  • A teoria racial brasileira historicamente desafia o modelo de grupos discretos que está por trás de quase toda a literatura de fairness (que nasceu no contexto jurídico-político dos EUA — categorias protegidas por lei, e um histórico de segregação mais acentuada).

  • Oracy Nogueira (1955): distinção entre

    • racismo de origem (EUA): a raça é definida por ascendência, categórica e binária — “uma gota de sangue”; o grupo é discreto e estável.
    • racismo de marca (Brasil): a discriminação incide sobre a aparência fenotípica — cor de pele, traços, cabelo — de forma gradiente e negociável (compensável por outros atributos: renda, instrução, ocupação).
      • por exemplo, a exigência de “boa aparência” em anúncios de emprego — discriminação fenotípica explícita sem nunca mencionar raça.
  • Implicação: se o atributo sensível “real” (cor) é contínuo, qualquer agrupamento em “Grupo A / Grupo B” já é uma escolha de fronteira que pode estar escondendo discriminação que acontece dentro dos grupos definidos.

  • Alguns trabalho recentes atacando esse pressuposto diretamente… por exemplo, Shilova, V., Malherbe, E., Palma, G., Risser, L., & Loubes, J.-M. (2025). Fairness-Aware Grouping for Continuous Sensitive Variables: Application for Debiasing Face Analysis with respect to Skin Tone. arXiv:2507.11247

Sociedade da competição

Pressuposto: um mundo de recursos limitados e, portanto, de competição em todos os lugares e todas as áreas.

  • em empregos/admissões
  • em provas/testes/avaliações
  • em honras/medalhas/etc
  • em dinheiro/crédito

“O mundo é feito de ganhadores e perdedores”

“Ao vencedor as batatas…”

  • Justiça, então, seria garantir que a competição é justa (“fair game”)
    • Mas quem define as regras? Ou, então: é realmente preciso competir? Há um vazio fundamental sobre a compreensão do lugar de cada um na sociedade…

Automação e burocracia

Por que buscamos?

  1. Automação permite escalar o sistema
  2. Regras e procedimentos formais, em teoria, reduzem a arbitrariedade e tornam o raciocínio explícito.
    • Supõem de que o processo apenas envolve conhecimento explícito (e não tácito)
    • Passam a impressão de que as regras são justas e imparciais…

Automação e burocracia

No caso do uso de Machine Learning: “decisão baseada em dados”

  • Parece algo formal, mas o raciocínio acaba sendo uma caixa-preta (opacidade epistêmica)
  • Dados introduzem problemas:
    • Arbitrariedade na anotação dos dados (target labeling)
    • Arbitrariedade na seleção dos atributos/features
    • Limite da indução
  • Taxa de erros: maior ou menor?
  • Responsabilização e possibilidade de recursos?

O problema do mérito

“All Americans have not only the right, but the solemn responsibility to ascend as far as their talents and determination will take them.” - Bill Clinton, 1995

“Equidade significa poder competir apenas em torno daquilo que temos controle ou responsabilidade”.

Parece justo, mas é extremamente problemático

  1. Não é simples identificar o que está e o que não está sob o controle de um indivíduo.
    • Por exemplo, o caso de uma gravidez: a pessoa tem certo controle, mas, no geral, concordamos que isso ainda não deveria afetar seus méritos.
  2. Também não é simples medir o que está e o que não está sob o controle de um indivíduo
  1. Coloca um peso infinito sobre o indivíduo

  1. Faz os “bem-sucedidos” ignorarem a influência de fatores fora de seu controle que garantiram seus lugares.

“Pessoas que, com um pouco de esforço e talento, vencem em uma meritocracia, carregam uma dívida pessoal que é ofuscada pela competição. […] Dessa forma, mesmo uma meritocracia justa — em que não há trapaça, suborno ou privilégios especiais para os ricos — induz uma impressão equivocada: a de que chegamos onde estamos por conta própria. Os anos de trabalho árduo exigidos dos candidatos a universidades de elite praticamente os forçam a acreditar que seu sucesso é resultado exclusivo de suas próprias ações — e, se falharem, não têm a quem culpar senão a si mesmos. Esse é um fardo pesado para os jovens carregarem. Além disso, isso corrói as sensibilidades cívicas. Pois, quanto mais nos pensamos como pessoas autossuficientes e conquistadoras de si mesmas, mais difícil será aprender a gratidão e a humildade. E sem esses sentimentos, é difícil se importar com o bem comum.” (Sandel, p. 23)

  1. Cria uma cultura de violência e neuroticismo
  • Uma cultura de esforço para “subida social” formenta sentimentos de ganância e possessividade - “lei do mais forte”
    • O que gera também o pavor de ter sua própria posição/bens roubados
    • E uma ansiedade em justificar porque uns merecem algo e outros não…
      • Especialmente usando estatística (“preconceito formalizado”)
  • Assim, fomenta o discurso de ódio entre grupos
    • Justiça passa a ser “garantir que perdedores reconheçam o lugar deles e fiquem lá”
    • Teorias de bode expiatório: “o mundo está errado por causa de grupos que não estão onde deveriam estar”
    • Ex.: linchamentos públicos nos EUA entre 1883 e 1941

O problema da otimização

  • Normalmente, pessoas querem “maximizar a utilidade/eficiência”, então acham que precisam escolher A MELHOR pessoa.

    • Assim, acaba-se confiando em métodos algoritmos complexos (veja este exemplo).
    • No entanto, será que é sempre possível identificar A MELHOR?
  • Nessa tentativa de maximização, os processos de tomada de decisão frequentemente acabam recorrendo a critérios e medições infundadas.

    • Divinação estatística”, apofenia…
    • Neuroticismo em torno de indicadores, corrida por métricas, etc. (por exemplo, “Dark Academia: How Universities Die”, por Peter Fleming)
      • “Inevitável em um mundo cada vez mais competitivo” - a crise como justificativa para a coerção.
  • E se não houver uma pessoa claramente melhor? E se todos forem suficientemente qualificados?

    • Randomização e sorteio: um ponto defendido tanto por BHN quanto por Sandel (com as devidas e cuidadosas considerações, é claro).

      • Há um argumento forte de que, às vezes, a randomização é a melhor forma de evitar discriminação. Reconhecer os limites do nosso conhecimento e abrir espaço para a incerteza é uma das melhores maneiras de evitar olhar para aquilo que não deveríamos considerar.

Uma outra perspectiva: além da escassez, da competição e do mérito

Walter Brueggemann, “The Liturgy of Abundance, The Myth of Scarcity”

  • E se o ponto de partida fosse de que há abundância no mundo e não precisamos competir em tudo?

  • E se a ideia de “boa vida” significasse mais do que o bem individual, mas também dependesse do bem de todos (bem comum)?

“Para muitos de nós, nosso primeiro pensamento ao considerar um sistema do qual fazemos parte é: ‘Como posso chegar ao topo?’, em vez de: ‘Como posso ajudar aqueles que estão na base?’”

O princípio da solidariedade

“A solidariedade é uma palavra que com muita frequência é esquecida ou silenciada, porque é incômoda… Ela implica criar uma nova mentalidade, que pense em termos de comunidade e da prioridade da vida de todos sobre a apropriação dos bens por parte de poucos.” — Fratelli Tutti, §116, Papa Francisco

Enquanto a meritocracia enfatiza a ascensão individual e o merecimento, a solidariedade enfatiza:

  • A natureza compartilhada da vida e das oportunidades. (“Destino Universal dos Bens”, Compêndio, §171);
  • A responsabilidade dos fortes para com os fracos, e opção preferencial pelos pobres;
  • Que a graça, e não o mérito, é a postura fundamental.

E se, ao invés do esforço para garantir que uma pessoa seja a realmente avaliada como a melhor, o esforço fosse para garantir que ninguém seja deixado para trás?

Ideias?

E se repensássemos nossos modelos não como filtros de mérito, mas como mediações de cuidado?

Pergunta tradicional (filtro de mérito) Nova pergunta (mediação de cuidado) O que isso mudaria na prática do sistema
Quem é o melhor? Quem está precisando de apoio? Mudança do foco de performance para vulnerabilidade; introdução de variáveis de necessidade
Quem merece essa oportunidade? Como garantir que todos tenham acesso digno? Uso de políticas de inclusão, reserva, sorteio justo quando há empate ou incerteza
Como evitar que o sistema erre? Como minimizar sofrimento causado por decisões injustas? Sistemas com canais de recurso, explicabilidade, reversibilidade; preocupação com impacto social
Como prever com máxima precisão? Como agir com justiça mesmo quando a previsão falha? Adoção de zonas de incerteza, human-in-the-loop, decisões prudenciais em vez de puramente técnicas

O espírito da esperança

“Quem tem esperança não dirige sua atenção para a essência, nem para o ter-sido ou o presente das coisas (presentiam rerum), mas para seu futuro, para suas futuras possibilidades. O pensamento esperançoso se articula não em conceitos, mas em antecipações ou pressentimentos. É a esperança a primeira a nos abrir o campo de possibilidades, antes de considerarmos um objetivo concreto. […] Sem esperança, estamos presos ao passado ou ao pessimamente existente. Somente a esperança gera ações significativas que trazem o novo para o mundo.” - Byung-Chul Han, *O espírito da esperança: contra a sociedade do medo”, p. 100-1