Dataset oficial do Projeto Final da Formação Full Stack do programa Inova.PCD da Telos.
Conjunto de dados curado para simular uma iniciativa corporativa real de inclusão de pessoas com deficiência (PCD) em uma empresa de tecnologia. Pensado para popular um sistema de gestão de atividades, alimentar dashboards e servir de entrada para análises em Python.
📚 Tudo neste README amarra ao que vocês já viram no curso. Especificamente nos Níveis 7 e 8 (Node + Express + Mongoose + MongoDB Atlas) e no Nível 5 (Pandas pra análise). Se travar, voltem nas aulas — não é matéria nova.
Este dataset apoia o projeto final em 3 fases (uma por semana):
| Semana | Uso |
|---|---|
| Semana 1 — Back-end | Popular MongoDB Atlas via Compass Import (mesmo fluxo da Aula 09 · Nível 8) — 65 tarefas prontas |
| Semana 2 — Front-end | Alimentar dashboard com dados reais (não lista vazia) |
| Semana 3 — Python | Entrada para análise, métricas e visualizações |
O schema foi desenhado para bater diretamente com a model Task esperada no back-end (Node.js + Mongoose):
| Coluna do CSV | Campo da Task (exemplo) |
|---|---|
titulo |
title |
descricao |
desc |
status |
status (enum: pendente/andamento/concluida) |
prioridade |
prio (enum: alta/media/baixa) |
categoria |
story |
data_criacao |
created |
Campos extras (
responsavel,publico_alvo,estimativa_horas,horas_gastas,data_conclusao) não exigem mudança no schema — servem para análise.
💡 Atalho recomendado: deixem o schema da Task com os nomes em português (
titulo,descricao,prioridade, ...). Assim os documentos importados via Compass batem direto com o schema, sem precisar renomear campo nenhum. Só mantenham o mesmo padrão no front e na API.
data/
├── atividades.csv 65 linhas | dataset principal
├── responsaveis.csv 8 linhas | pessoas (para JOIN)
└── status_historico.csv 138 linhas | transições de status no tempo
A "fonte da verdade". Use para popular o banco e fazer análises base.
Colunas (13):
| Coluna | Tipo | Exemplo |
|---|---|---|
id |
int | 1 |
titulo |
string | Auditar contraste de cores no portal RH |
descricao |
string | Validar WCAG AA nos textos e botoes principais |
categoria |
string | Acessibilidade Digital |
status |
enum | pendente / andamento / concluida |
prioridade |
enum | alta / media / baixa |
responsavel |
string | Ana Ribeiro |
papel_responsavel |
string | Dev Front |
publico_alvo |
string | Visual / Auditiva / Motora / Intelectual / Geral |
estimativa_horas |
int | 8 |
horas_gastas |
int | 9 |
data_criacao |
date YYYY-MM-DD |
2025-11-15 |
data_conclusao |
date ou vazio | 2026-01-08 |
Categorias (7 eixos da iniciativa):
Acessibilidade Digital— WCAG, ARIA, leitores de telaInclusao na Empregabilidade— Lei 8.213/91, processo seletivoTecnologia Assistiva— Hardware/software adaptadosComunicacao Inclusiva— Libras, audiodescrição, linguagem acessívelCapacitacao de Equipes— Treinamentos, sensibilizaçãoAdaptacao de Ambiente Fisico— Rampas, banheiros, sinalização tátilPlataforma Interna— Ferramentas, dashboards, automações
Distribuição:
Status: 46% concluída | 34% pendente | 20% andamento
Prioridade: 49% média | 29% baixa | 22% alta
Público-alvo: 43% Geral | 23% Auditiva | 14% Motora | 12% Visual | 8% Intelectual
Período: novembro/2025 a maio/2026
Informações complementares dos 8 colaboradores responsáveis. Coluna nome é chave de junção com atividades.responsavel.
| Coluna | Descrição |
|---|---|
nome |
Nome completo (chave) |
papel |
Cargo |
departamento |
Tecnologia, Produto, Pessoas e Cultura, Marketing |
anos_empresa |
Tempo de casa |
formacao_acessibilidade |
sim / nao |
Log de cada transição de status (pendente → andamento → concluida) com timestamp. Útil para análise de séries temporais.
| Coluna | Descrição |
|---|---|
task_id |
ID da tarefa (FK com atividades.id) |
status_anterior |
Status antes da mudança (vazio na criação) |
status_novo |
Novo status |
data_mudanca |
Quando ocorreu (YYYY-MM-DD) |
⚠️ Único método ensinado no curso. SemmongoimportCLI, sem script Node/Mongoose extra. É o mesmo passo a passo da Aula 09 — Nível 8 (MongoDB Atlas).
- Criar cluster no MongoDB Atlas (free tier M0 — basta e-mail)
- Database Access → criar usuário com senha (anota a senha)
- Network Access → liberar IP (em sala:
0.0.0.0/0pra todo mundo conseguir conectar) - Connect → Compass → copia a connection string (
mongodb+srv://...) - Abre o MongoDB Compass, cola a string, conecta
- Cria o banco (ex: nome da squad) e a collection
tasks - Na collection → ADD DATA → Import JSON or CSV file
- Seleciona
data/atividades.csv, marca CSV com First row is header, confirma
Pronto — 65 documentos importados, mesmo fluxo da aula.
💡 A mesma connection string vai no
.envdo back-end comoMONGO_URI(igual ao que vocês fizeram na Aula 04 — Nível 8 com.enve na Aula 07 — Nível 8 ao conectar via Mongoose).
⚠️ Squad decide os nomes. Nome do banco, nome dos campos no schema da Task — escolhas da squad. Os nomes neste README são só exemplos.
import pandas as pd
ativ = pd.read_csv('data/atividades.csv')
resp = pd.read_csv('data/responsaveis.csv')
print(ativ.head())
print(ativ['status'].value_counts())import pandas as pd
import io
from pyodide.http import pyfetch
resp = await pyfetch('/data/atividades.csv')
df = pd.read_csv(io.StringIO(await resp.string()))const resp = await fetch('/data/atividades.csv');
const texto = await resp.text();
// Parser CSV: PapaParse ou split simples respeitando aspas- Excel/Numbers: duplo clique no
.csv - Google Sheets:
Arquivo > Importar > Upload - Encoding: UTF-8 (padrão)
📚 Vocês já estudaram tudo isso no curso. Esta seção só amarra o dataset ao que vocês fizeram nas aulas:
Aula Pra que serve aqui Nível 7 · Aulas 12–14 Estruturando uma API: rotas, CRUD de usuários, organização da aplicação Nível 8 · Aulas 02, 03 Login + JWT Nível 8 · Aula 04 Variáveis de ambiente ( .env)Nível 8 · Aulas 07, 10, 11 Mongoose: conexão, CRUD, hooks Nível 8 · Aula 09 MongoDB Atlas (cluster + Compass) Nível 8 · Aula 12 CRUD de Filmes — o gabarito mais próximo: troquem Filme → Task
O CSV vem em português. Quando vocês modelarem o schema da Task (igual fizeram com o de Filmes na Aula 12 N8), o caminho mais simples é manter os nomes em português pra bater direto com o CSV importado:
titulo → titulo
descricao → descricao
status → status
prioridade → prioridade
categoria → categoria
data_criacao → data_criacao
Se a squad preferir nomes em inglês (title, desc, prio, story, created), também funciona — só lembrem que os documentos importados via Compass virão com os nomes do CSV, então vocês precisarão renomear (pelo Compass campo a campo, ou via updateMany no mongosh). Discutam em squad qual caminho preferem.
💡 Atalho recomendado: schema em português = zero conversão. Só mantenham o mesmo padrão no front e na API.
Mesma convenção que vocês usaram no CRUD de Filmes (Aula 12 N8) — só trocando "Filme" por "Task":
backend/
├── server.js # Entrypoint: cria o Express, conecta no Mongo, escuta a porta
├── config/
│ └── db.js # Função connectDB() — encapsula mongoose.connect()
├── models/
│ ├── User.js # Schema do usuário (name, email, password)
│ └── Task.js # Schema da tarefa (titulo, descricao, status, prioridade, categoria, user)
├── routes/
│ ├── authRoutes.js # POST /register, POST /login (públicas)
│ └── taskRoutes.js # GET, POST, PUT, DELETE /tasks (protegidas por JWT)
├── controllers/
│ ├── authController.js # Lógica de register e login (bcrypt + JWT) — Aula 02/03 N8
│ └── taskController.js # Lógica do CRUD de tarefas — Aula 12 N8 (CRUD Filmes)
└── middlewares/
└── auth.js # Valida o JWT do header e anexa req.user
Princípio (igual à Aula 14 N7 — Organizando aplicação):
routes/só define URLs e aponta para o controller (zero lógica de negócio)controllers/tem a lógica de negócio (regras, validações, chamadas ao banco)models/define a forma dos dados (schema Mongoose)middlewares/faz validação ANTES da rota (ex: checar JWT)config/isola configurações (conexão DB, variáveis de ambiente)
MONGO_URI=mongodb+srv://<usuario>:<senha>@<cluster>.mongodb.net/<nome-do-banco>?retryWrites=true&w=majority
JWT_SECRET=troque-isso-por-uma-string-longa-e-aleatoria
PORT=3000
⚠️ Nunca commite o.env. Adicione.envno.gitignore.
Usuário loga → backend valida senha → gera token → cliente guarda → manda token em toda request → middleware decodifica ANTES de chegar no controller.
Diagrama mental:
1) POST /login 2) Toda request protegida
email + senha Header: x-auth-token: <jwt>
│ │
▼ ▼
bcrypt.compare() middleware/auth.js
│ │
▼ ▼
jwt.sign({user:{id}}, SECRET) jwt.verify(token, SECRET)
│ │
▼ ▼
Retorna { token } req.user = decoded.user
│
▼
controller executa
Pontos-chave:
- O token é assinado com
JWT_SECRET(variável de ambiente) — qualquer alteração no token invalida a assinatura - O token não é criptografado, é apenas codificado em base64. Nunca coloque senha no payload
- Padrão de payload:
{ user: { id: <ObjectId> } }, expiração1h - Sem token ou token inválido → o middleware retorna
401e o controller nem é chamado
- Distribuição por status
- Distribuição por categoria
- Distribuição por público-alvo
- Taxa de conclusão por categoria
- Horas estimadas vs reais (gap de estimativa)
- Carga de trabalho por responsável
- Departamentos que mais entregam
- Formação em acessibilidade × velocidade de entrega
- Lead time médio mensal
- Tarefas "presas" em andamento por muito tempo
# Taxa de conclusão por categoria
ativ.groupby('categoria')['status'].apply(
lambda s: (s == 'concluida').mean() * 100
).round(1).sort_values(ascending=False)
# JOIN: formação × lead time
ativ = pd.read_csv('data/atividades.csv')
resp = pd.read_csv('data/responsaveis.csv')
df = ativ.merge(resp, left_on='responsavel', right_on='nome')
c = df[df['status'] == 'concluida'].copy()
c['data_criacao'] = pd.to_datetime(c['data_criacao'])
c['data_conclusao'] = pd.to_datetime(c['data_conclusao'])
c['lead_time'] = (c['data_conclusao'] - c['data_criacao']).dt.days
c.groupby('formacao_acessibilidade')['lead_time'].mean()O dataset foi desenhado para casar diretamente com os requisitos do Projeto Final da Formação Full Stack — Inova.PCD.
| Requisito do documento | Como o dataset atende |
|---|---|
| Cenário de "tarefas" (um dos 3 sugeridos) | Tarefas reais de iniciativa de inclusão PCD |
| Atributos: identificação do item | Coluna id |
| Atributos: categoria/tipo | Coluna categoria (7 eixos) |
| Atributos: valores numéricos | estimativa_horas, horas_gastas |
| Atributos: datas (criação, atualização, conclusão) | data_criacao, data_conclusao + status_historico.csv (linha do tempo de atualizações) |
| Atributos: status | Coluna status (enum) |
| "Base personalizada visando adaptar ao contexto" | Tema alinhado ao propósito do programa Inova.PCD |
| "Base pode ser populada ainda mais pelos colaboradores" | Schema documentado, fácil de estender |
| Análise sugerida no documento | Onde está no dataset |
|---|---|
| "Média de tarefas concluídas" | (df['status'] == 'concluida').mean() aplicado a atividades.csv |
| "Visualização básica" | 10 análises sugeridas no README + estrutura compatível com Chart.js e Matplotlib |
O dataset apoia diretamente vários cards do Trello do projeto (tanto na versão sequencial quanto na em paralelo):
| Card do Trello | Como o dataset apoia |
|---|---|
Modelar Banco de Dados (Users e Tasks) |
Schema das colunas valida a model Task escolhida — o import via Compass (Aula 09 N8) carrega o CSV direto na collection |
Implementar CRUD de Tarefas |
65 tarefas reais como volume de teste para o CRUD |
Implementar Script de Análise de Dados em Python |
Entrada direta do script — sem precisar criar dados de teste |
Gerar Primeiras Métricas de Produtividade |
Métricas naturais: taxa de conclusão, lead time, sobrecarga por responsável |
Criar Visualizações de Dados da Plataforma |
10 análises sugeridas no README cobrem distribuições, agregações e séries temporais |
Testar API Completa no Postman/Insomnia |
Dataset populado ajuda nos testes de GET /tasks (lista não-vazia, filtros) |
💡 Importante: o Trello organiza o backlog da squad (tarefas de desenvolvimento). O dataset entrega os dados de domínio que vão ser geridos pela aplicação. São camadas diferentes — e por isso se complementam sem sobreposição.
- Dataset sintético plausível: tarefas fictícias baseadas em práticas reais de iniciativas de inclusão em empresas brasileiras de tecnologia. Não representam empresa específica.
- Período curto (~6 meses): suficiente para análise descritiva, limitado para tendências de longo prazo.
- Nomes de responsáveis são fictícios: não são pessoas reais.
- Lei Brasileira de Inclusão (LBI) — Lei 13.146/2015
- Lei de Cotas — Lei 8.213/91, Art. 93
- WCAG 2.1 — Web Content Accessibility Guidelines (W3C)
- eMAG — Modelo de Acessibilidade em Governo Eletrônico
Dataset distribuído sob licença MIT — uso livre para fins educacionais e comerciais, mantida atribuição.
Mantido por: Telos — Programa Inova.PCD Versão: 1.0 (maio/2026)