<a id="ch-05"></a>

## Capítulo 5 — Estudo principal e validação independente

<!-- open-cyber-academy:lesson-figures:start ch-05 -->
### Mapa da aula

Aula 05 publicada. Mapa, exemplo, EX029.

```mermaid
flowchart TD
  N0["5.1 Dupla codificação"]
  N1["Laboratório 3 — concordância"]
  N2["5.2 Lendo o kappa"]
  N3["5.3 Arbitragem"]
  N4["5.4 Validação independente"]
  N5["5.5 Compartilhando resultados em formato padrão"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
  N6 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX029"]
```

### Desenho lógico

```mermaid
flowchart LR
  N0["5.1 Dupla codificação"]
  N1["Laboratório 3 — concordância"]
  N2["5.2 Lendo o kappa"]
  N3["5.3 Arbitragem"]
  N4["5.4 Validação independente"]
  N5["5.5 Compartilhando resultados em formato padrão"]
  N6["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX029"]
```

```text
[5.1 Dupla codificação]
    |
    v
[Laboratório 3 — concordância]
    |
    v
[5.2 Lendo o kappa]
    |
    v
[5.3 Arbitragem]
    |
    v
[5.4 Validação independente]
    |
    v
[5.5 Compartilhando resultados em formato padrão]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX029]
```
<!-- open-cyber-academy:lesson-figures:end ch-05 -->


### Objetivos de aprendizagem

Você vai (1) organizar a dupla codificação cega de um corpus; (2) calcular a concordância entre avaliadores com o kappa de Cohen; (3) arbitrar divergências sem contaminar os dados; (4) providenciar a validação por uma equipe que não construiu o pipeline.

### 5.1 Dupla codificação

Dois codificadores treinados rotulam, de forma independente, cada evento amostrado com a característica central do Diamond a que se refere um julgamento-chave — adversário, capacidade, infraestrutura ou vítima — e com os códigos de desfecho. Nenhum codificador vê o trabalho do outro até que ambos terminem. No laboratório, dez eventos são codificados; na amostra completa de 340 julgamentos, o mesmo procedimento chegou a um kappa de 0,74 depois de uma revisão do livro de códigos. A independência importa porque codificadores que discutem os primeiros itens convergem para os hábitos um do outro, o que infla a concordância sem melhorar o livro de códigos.

### Laboratório 3 — concordância

```python
"""Lab 3 (ch 05): Cohen's kappa for two coders labelling synthetic events with a Diamond core feature."""
from collections import Counter
a = ["infra", "cap", "infra", "victim", "adv", "infra", "cap", "victim", "infra", "cap"]
b = ["infra", "cap", "cap",   "victim", "adv", "infra", "cap", "infra",  "infra", "cap"]
n = len(a)
po = sum(x == y for x, y in zip(a, b)) / n
ca, cb = Counter(a), Counter(b)
pe = sum(ca[k] * cb[k] for k in set(a) | set(b)) / n ** 2
kappa = (po - pe) / (1 - pe)
print(f"observed agreement={po:.2f} expected={pe:.2f} kappa={kappa:.3f}")
print("disagreements:", [i for i, (x, y) in enumerate(zip(a, b)) if x != y])
```

Execute com `python3 lab_kappa.py`. Saída verificada:

```text
observed agreement=0.80 expected=0.31 kappa=0.710
disagreements: [2, 7]
```

### 5.2 Lendo o kappa

Uma concordância bruta de 0,80 parece forte, mas o acaso sozinho produziria 0,31, dada a frequência com que cada rótulo aparece. O kappa remove esse componente de acaso e dá 0,710, convencionalmente descrito como substancial. As divergências nos itens 2 e 7 envolvem ambas a infraestrutura contra outra característica — uma pista de que a definição de infraestrutura no livro de códigos precisa de um exemplo sobre hospedagem compartilhada. A revisão de Tomas acrescentou esse exemplo, e a concordância na amostra completa de 340 julgamentos chegou a um kappa de 0,74. O valor da concordância ao acaso importa para a tese: se um rótulo dominasse, a concordância bruta poderia ser alta enquanto o kappa continuava baixo, e relatar apenas o valor bruto teria exagerado o quanto o livro de códigos funciona.

### 5.3 Arbitragem

Uma terceira pessoa resolve as divergências usando o livro de códigos, e os dois códigos originais são preservados. Mudar o livro de códigos no meio do estudo exige uma nota de versão e, quando possível, a recodificação dos itens anteriores com a nova definição. A única revisão do livro de códigos feita por Tomas, o exemplo de hospedagem compartilhada para a infraestrutura, é o caso que essa regra cobre. Ela traz uma nota de versão no arquivo, e os itens codificados sob a primeira versão foram recodificados, para que o kappa da amostra completa seja calculado sob uma única definição. As decisões do árbitro são registradas com a regra do livro de códigos em que se apoiaram, para que um leitor posterior possa ver se um dos codificadores foi vencido sistematicamente.

### 5.4 Validação independente

Uma equipe separada refaz a análise a partir dos dados e do código arquivados, sem ajuda. A concordância nos números principais é a validação. A divergência não é fracasso; é informação que precisa ser relatada. No estudo de Tomas, o laboratório parceiro reproduziu o escore de Brier com três casas decimais, mas encontrou um arquivo mesclado de forma errada. Ele o corrigiu e documentou a correção na tese, e não em uma nota privada. Esse erro nunca teria aparecido nas reexecuções dele, porque o pipeline mesclava os arquivos do mesmo jeito errado todas as vezes.

### 5.5 Compartilhando resultados em formato padrão

Quando os achados incluem indicadores ou relações estruturados, os objetos STIX 2.1 permitem que outros os interpretem; porém, resultados de pesquisa agregados costumam ser mais bem compartilhados como tabelas e código do que como indicadores. Os resultados de Tomas são uma tabela de calibração, um mapeamento de expressões para probabilidades e código; nenhum deles é um indicador. Embrulhar a tabela de calibração em objetos STIX acrescentaria trabalho de parsing para os leitores sem acrescentar significado; por isso, o arquivo dele publica CSV com um esquema e reserva o STIX para um eventual trabalho futuro que produza objetos de ameaça.

### Exemplo resolvido

Na amostra completa de 340 julgamentos (sintética), os codificadores chegam a um kappa de 0,74 depois de uma revisão do livro de códigos. A equipe de validação de um laboratório parceiro reproduz o escore de Brier com três casas decimais, mas encontra um arquivo mesclado de forma errada; Tomas o corrige e documenta a correção.

> **Caso sintético.** O tamanho da amostra, o kappa e o laboratório parceiro são inventados.

### Erros e limites

O kappa depende da prevalência dos rótulos; relate também a concordância bruta. Uma validação feita por amigos que ajudaram a construir o pipeline não é independente.

### Exercícios

- **EX029 — Citação do kappa.** Cite a concordância observada, a concordância esperada e o kappa do laboratório. *Rubrica:* 3 = 0,80, 0,31, 0,710; 2 = dois; 1 = um; 0 = nenhum.
- **EX030 — Por que o kappa.** Por que relatar o kappa além dos 80% de concordância bruta? *Rubrica:* 3 = corrige a concordância ao acaso dada a frequência dos rótulos; 2 = "mais rigoroso"; 1 = nenhum motivo; 0 = nenhum.
- **EX031 — Sinal do livro de códigos.** O que as duas divergências sugerem sobre o livro de códigos? *Rubrica:* 3 = definição de infraestrutura ambígua; acrescentar exemplo/esclarecer; 2 = livro de códigos pouco claro; 1 = codificadores descuidados; 0 = nenhum.
- **EX032 — Registro da arbitragem.** O que precisa ser preservado quando uma terceira pessoa arbitra? *Rubrica:* 3 = os dois códigos originais + o código arbitrado + a justificativa/versão do livro de códigos; 2 = código final + um original; 1 = apenas o final; 0 = nenhum.
- **EX033 — Teste de independência.** Um validador que coescreveu o script de parsing é independente? Explique. *Rubrica:* 3 = não; compartilha pressupostos/erros; é preciso uma equipe separada; 2 = não; 1 = sim; 0 = nenhum.
- **EX034 — Achado da validação.** O laboratório parceiro encontra um arquivo mesclado de forma errada. O que a tese precisa dizer? *Rubrica:* 3 = relatar o erro, a correção e o efeito nos resultados; 2 = mencionar a correção; 1 = escondê-lo; 0 = nenhum.
- **EX035 — Adequação do STIX.** Quando o STIX 2.1 seria uma escolha ruim para compartilhar os resultados deste estudo? *Rubrica:* 3 = estatísticas agregadas/livros de códigos não são indicadores; tabelas/código servem melhor; 2 = parcial; 1 = usar sempre STIX; 0 = nenhum.

### Síntese

Codifique às cegas e em dobro, corrija o acaso, arbitre com transparência, valide de forma independente e relate cada correção.

### Continue estudando — capítulo 05 de 08

[← Capítulo 04 (rascunho)](#ch-04) · [Índice de capítulos do curso](../SUBJECTS.md) · [Capítulo 06 (rascunho) →](#ch-06)

## Worked answers

<a id="answer-ex029"></a>
**EX029.** Concordância observada 0,80, esperada 0,31, kappa 0,710.

<a id="answer-ex030"></a>
**EX030.** Parte da concordância acontece por acaso, dada a frequência de cada rótulo; o kappa remove essa concordância esperada, para que o valor reflita a consistência real dos codificadores.

<a id="answer-ex031"></a>
**EX031.** As duas divergências envolvem a infraestrutura, então sua definição é ambígua; acrescentar ao livro de códigos uma regra de esclarecimento e um exemplo (por exemplo, hospedagem compartilhada).

<a id="answer-ex032"></a>
**EX032.** Os códigos originais dos dois codificadores, o código arbitrado, a justificativa e a versão do livro de códigos usada.

<a id="answer-ex033"></a>
**EX033.** Não. Por ter escrito o parser, ele compartilha os pressupostos do código e pode deixar passar os mesmos erros; a validação precisa de uma equipe que não o construiu.

<a id="answer-ex034"></a>
**EX034.** Descrever a mesclagem errada, como foi corrigida e se algum número relatado mudou, e em quanto.

<a id="answer-ex035"></a>
**EX035.** Quando os resultados são estatísticas agregadas e regras de codificação, e não indicadores ou relações; tabelas, livros de códigos e código servem melhor aos leitores.
