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

## Capítulo 6 — Coleta e análise de dados

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

Aula 06 publicada. Mapa, exemplo, EX036.

```mermaid
flowchart TD
  N0["6.1 Validar primeiro"]
  N1["Laboratório 2 — verificação de propriedades STIX"]
  N2["6.2 O que a verificação mostra"]
  N3["Laboratório 3 — medianas do tempo até o bloqueio"]
  N4["6.3 Lendo as medianas"]
  N5["6.4 Descrição versus causa"]
  N6["6.5 Devolvendo a qualidade dos dados"]
  N7["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
  N7 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX036"]
```

### Desenho lógico

```mermaid
flowchart LR
  N0["6.1 Validar primeiro"]
  N1["Laboratório 2 — verificação de propriedades STIX"]
  N2["6.2 O que a verificação mostra"]
  N3["Laboratório 3 — medianas do tempo até o bloqueio"]
  N4["6.3 Lendo as medianas"]
  N5["6.4 Descrição versus causa"]
  N6["6.5 Devolvendo a qualidade dos dados"]
  N7["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX036"]
```

```text
[6.1 Validar primeiro]
    |
    v
[Laboratório 2 — verificação de propriedades STIX]
    |
    v
[6.2 O que a verificação mostra]
    |
    v
[Laboratório 3 — medianas do tempo até o bloqueio]
    |
    v
[6.3 Lendo as medianas]
    |
    v
[6.4 Descrição versus causa]
    |
    v
[6.5 Devolvendo a qualidade dos dados]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX036]
```
<!-- open-cyber-academy:lesson-figures:end ch-06 -->


### Objetivos de aprendizagem

Você vai (1) validar os dados estruturados recebidos antes da análise; (2) calcular e comparar medianas para dados de tempo assimétricos; (3) relatar tamanhos de efeito com incerteza honesta; (4) separar os achados descritivos das afirmações causais.

### 6.1 Validar primeiro

Os membros exportam objetos STIX 2.1 da coleção TAXII do CPSG junto com os registros de bloqueio. Antes de qualquer estatística, Lucía verifica se os objetos trazem as propriedades obrigatórias e identificadores bem formados. Os objetos malformados são contados e relatados à comunidade, não consertados em silêncio. O lote de demonstração de Lucía verifica três objetos, e só um passa. Na exportação completa do estudo, 94% dos indicadores eram válidos. Contar as falhas antes da análise diz ao leitor quanto dos dados do CPSG podia de fato contribuir com tempos. Um objeto inválido que um membro ainda assim bloqueou ou monitorou é contado no Objetivo 3, porque a decisão do membro aconteceu, embora o tempo de publicação dele não seja confiável.

### Laboratório 2 — verificação de propriedades STIX

```python
"""Lab 2 (ch 06): check synthetic STIX 2.1-style objects for common required properties."""
import json, re
objs = json.loads("""[
 {"type":"indicator","spec_version":"2.1","id":"indicator--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f",
  "created":"2026-09-01T10:00:00.000Z","modified":"2026-09-01T10:00:00.000Z",
  "pattern":"[domain-name:value = 'c2.example']","pattern_type":"stix","valid_from":"2026-09-01T10:00:00Z"},
 {"type":"indicator","spec_version":"2.1","id":"indicator-123",
  "created":"2026-09-02T10:00:00.000Z","modified":"2026-09-02T10:00:00.000Z","pattern_type":"stix"},
 {"type":"threat-actor","id":"threat-actor--0f9c3a5e-6b1d-4c39-9a8e-2b9f6a7d1c11",
  "created":"2026-09-03T10:00:00.000Z","modified":"2026-09-03T10:00:00.000Z","name":"SYNTH-CARRION"}
]""")
COMMON = ["type", "spec_version", "id", "created", "modified"]
EXTRA = {"indicator": ["pattern", "pattern_type", "valid_from"], "threat-actor": ["name"]}
for o in objs:
    miss = [k for k in COMMON + EXTRA.get(o["type"], []) if k not in o]
    bad_id = not re.fullmatch(o["type"] + r"--[0-9a-f-]{36}", o.get("id", ""))
    probs = miss + (["id format"] if bad_id else [])
    print(o.get("id"), "OK" if not probs else "PROBLEMS: " + ", ".join(probs))
```

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

```text
indicator--8e2e2d2b-17d4-4cbf-938f-98ee46b3cd3f OK
indicator-123 PROBLEMS: pattern, valid_from, id format
threat-actor--0f9c3a5e-6b1d-4c39-9a8e-2b9f6a7d1c11 PROBLEMS: spec_version
```

### 6.2 O que a verificação mostra

O primeiro indicador passa. O segundo não tem `pattern` nem `valid_from` e tem um identificador que não segue `type--UUID`. O objeto threat-actor não tem `spec_version`, que o STIX 2.1 exige nos objetos de domínio. Apenas os objetos válidos contribuem com valores de `t_pub`. Cada falha tem uma consequência diferente. Sem `valid_from`, o indicador não tem um tempo de publicação confiável e, portanto, não pode contribuir para o tempo até o bloqueio. Um identificador malformado quebra os vínculos entre objetos. A falta de `spec_version` sugere que a ferramenta de publicação é anterior ao STIX 2.1 ou está mal configurada, o que é um retorno útil para essa classe de membros.

### Laboratório 3 — medianas do tempo até o bloqueio

```python
"""Lab 3 (ch 06): median time-to-block (hours) for synthetic sharing-community members vs non-members."""
from statistics import median
members = [2.0, 3.5, 1.0, 6.0, 2.5, 4.0, 3.0]
non_members = [9.0, 14.0, 5.0, 22.0, 11.0, 8.0]
mm, mn = median(members), median(non_members)
print(f"members n={len(members)} median={mm:.1f}h")
print(f"non-members n={len(non_members)} median={mn:.1f}h")
print(f"difference={mn - mm:.1f}h ratio={mn / mm:.2f}")
```

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

```text
members n=7 median=3.0h
non-members n=6 median=10.0h
difference=7.0h ratio=3.33
```

### 6.3 Lendo as medianas

Dados de tempo são assimétricos — alguns casos lentos dominam as médias —, por isso se relatam medianas. A mediana dos membros é de 3,0 horas; a dos não membros, de 10,0 horas: uma diferença de 7,0 horas, razão de 3,33. Com amostras de sete e seis, a incerteza é grande; um intervalo bootstrap ou um teste baseado em postos seria relatado ao lado das medianas. O texto de Lucía põe as medianas de 3,0 e 10,0 horas ao lado do seu intervalo, e não sozinhas em uma frase. Com seis não membros, um porto excepcionalmente lento pode mover a mediana em horas, então o intervalo diz aos membros quanto peso a diferença consegue suportar.

### 6.4 Descrição versus causa

O resultado descreve um bloqueio mais rápido entre os membros nesta amostra. Dados os fatores de confusão discutidos no Capítulo 3, Lucía escreve "está associado a", e não "causa", a menos que o estrato antes e depois mostre uma mudança consistente com a entrada. Os quatro portos que entraram no CPSG em 2025 são o estrato que poderia sustentar uma afirmação mais forte. Se cada um bloqueou mais rápido depois da entrada do que antes, com a mesma equipe e as mesmas ferramentas, a associação fica mais difícil de explicar por porte ou orçamento, embora ainda não prove a causa.

### 6.5 Devolvendo a qualidade dos dados

As contagens da validação são, elas mesmas, uma contribuição. Lucía envia ao CPSG uma nota curta de qualidade de dados listando quantos objetos não tinham propriedades obrigatórias, agrupados por classe de membro publicador, para que os produtores possam corrigir as exportações. A nota segue a mesma regra de agregação que a dissertação. Com 94% dos indicadores válidos na exportação completa, a nota pode dizer aos produtores que cerca de um objeto em cada dezessete não pôde contribuir com um tempo de publicação. Agrupar por classe de membro, e não por membro, mantém a nota dentro da regra de agregação do conselho.

### Exemplo resolvido

Lucía relata: 3 objetos verificados, 1 válido no lote de demonstração; na exportação real do estudo (sintética), 94% dos indicadores eram válidos. Mediana do tempo até o bloqueio de 3,0 h para os membros contra 10,0 h para os não membros pareados, com as amostras pequenas sinalizadas.

> **Caso sintético.** Todos os objetos, tempos e percentuais são inventados.

### Erros e limites

Consertar dados malformados por palpite cria ficção. Relatar uma razão sem os tamanhos das amostras engana os leitores.

### Exercícios

- **EX036 — Objeto inválido.** Que problemas o laboratório relata para `indicator-123`? *Rubrica:* 3 = pattern, valid_from, formato do id; 2 = dois; 1 = um; 0 = nenhum.
- **EX037 — Problema do ator.** Por que o objeto threat-actor falha? *Rubrica:* 3 = falta spec_version, obrigatório no STIX 2.1; 2 = falta um campo; 1 = falta o nome; 0 = nenhum.
- **EX038 — Escolha da mediana.** Por que relatar medianas, e não médias, para o tempo até o bloqueio? *Rubrica:* 3 = dados assimétricos; valores extremos distorcem a média; 2 = vago; 1 = médias são melhores; 0 = nenhum.
- **EX039 — Citação das medianas.** Cite as duas medianas e a razão do laboratório. *Rubrica:* 3 = 3,0 h, 10,0 h, 3,33; 2 = dois; 1 = um; 0 = nenhum.
- **EX040 — Redação causal.** Reescreva "a filiação ao CPSG corta o tempo de bloqueio em 70%" com a redação adequada. *Rubrica:* 3 = associação + ressalva de tamanho da amostra/incerteza; 2 = apenas associação; 1 = inalterada; 0 = nenhuma.
- **EX041 — Ferramenta de incerteza.** Nomeie um método para expressar a incerteza em torno de uma diferença de medianas. *Rubrica:* 3 = IC bootstrap ou teste de postos (Mann–Whitney) corretamente descrito; 2 = apenas o nome; 1 = teste t sobre médias sem ressalva; 0 = nenhum.
- **EX042 — Tentação de consertar.** Lucía deve inventar um `valid_from` igual a `created` para o indicador quebrado? *Rubrica:* 3 = não; excluir e relatar o problema de qualidade de dados; 2 = não; 1 = sim; 0 = nenhum.

### Síntese

Valide antes de contar, prefira medianas para tempos assimétricos, mostre os tamanhos das amostras e a incerteza e diga "está associado a" até que o desenho sustente mais.

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

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

## Worked answers

<a id="answer-ex036"></a>
**EX036.** `PROBLEMS: pattern, valid_from, id format`.

<a id="answer-ex037"></a>
**EX037.** Falta `spec_version`, que o STIX 2.1 exige em todo objeto de domínio.

<a id="answer-ex038"></a>
**EX038.** Alguns bloqueios muito lentos tornam a distribuição assimétrica; a mediana reflete o caso típico sem ser arrastada pelos valores extremos.

<a id="answer-ex039"></a>
**EX039.** Mediana dos membros 3,0 h (`median=3.0h`), mediana dos não membros 10,0 h (`median=10.0h`), razão 3,33 (`ratio=3.33`).

<a id="answer-ex040"></a>
**EX040.** Exemplo: "Nesta pequena amostra (7 membros, 6 não membros), a filiação esteve associada a uma mediana menor do tempo até o bloqueio (3,0 h contra 10,0 h); a causalidade não está estabelecida."

<a id="answer-ex041"></a>
**EX041.** Um intervalo de confiança bootstrap para a diferença de medianas, reamostrando cada grupo com reposição muitas vezes; ou um teste de postos de Mann–Whitney.

<a id="answer-ex042"></a>
**EX042.** Não. Excluir o objeto da análise de tempos e relatá-lo como achado de qualidade de dados; inventar valores é fabricar dados.
