Este README detalha o processo completo de análise de um dataset do Kaggle, desde a limpeza e engenharia de dados em SQL, passando pela criação de um modelo preditivo em Python, até a construção de um dashboard interativo no Power BI.
Este projeto simula um caso de uso real do dia a dia de um profissional de dados, com o objetivo de analisar o mercado global de vagas em Ciência de Dados para o ano de 2025. O processo abrange três grandes áreas:
- Engenharia de Dados: Tratamento, limpeza e enriquecimento dos dados brutos utilizando SQL para prepará-los para análise e modelagem.
- Machine Learning: Desenvolvimento de um modelo de regressão para prever salários anuais com base nas características das vagas, utilizando Python e Scikit-learn.
- Business Intelligence: Criação de um dashboard dinâmico no Power BI para visualizar os insights e permitir a exploração interativa dos dados.
O dataset utilizado foi o "Data Science Job Postings with Salaries (2025)", disponível na plataforma Kaggle. Ele contém informações sobre vagas de emprego na área de dados, incluindo cargo, senioridade, localização, modalidade, e faixa salarial em euros.
- Link para o Dataset: Data Science Job Postings with Salaries (2025) on Kaggle
O projeto foi estruturado em missões, simulando um ambiente de trabalho ágil e focado em entregas de valor em cada etapa.
A primeira fase consistiu em transformar o arquivo .csv bruto em uma base de dados estruturada e enriquecida. Todas as operações foram realizadas em um banco de dados SQLite.
- Estruturação: O
.csvfoi convertido para uma tabela em um banco de dados SQLite para permitir consultas complexas e performáticas. - Tradução e Padronização: Colunas categóricas como
seniority_levelestatusforam traduzidas do inglês para o português. - Limpeza de Dados Nulos: Valores nulos em colunas-chave foram tratados e substituídos por "Não Informado" para garantir a consistência dos dados.
- Engenharia de Features: Esta foi a etapa mais crítica, onde novas colunas de alto valor foram criadas a partir de dados brutos:
- Salários: A coluna
salary, que era um texto com faixas e símbolos ("€100,472 - €200,938"), foi dissecada para criar três novas colunas numéricas:salario_min,salario_max, esalario_avg. Isso foi feito com uma query SQL complexa, utilizando funções de manipulação de texto.-- Exemplo de código para extração dos salários UPDATE job_postings SET salario_min = CAST( CASE WHEN salary LIKE '%-%' THEN TRIM(SUBSTR(REPLACE(REPLACE(salary, '€', ''), ',', ''), 1, INSTR(REPLACE(REPLACE(salary, '€', ''), ',', ''), '-') - 1)) ELSE TRIM(REPLACE(REPLACE(salary, '€', ''), ',', '')) END AS REAL ), -- (lógica similar para salario_max)
- Localização: As colunas
paiseestadoforam criadas a partir da coluna de textolocation, permitindo análises geográficas. - Habilidades (Skills): A coluna
skillsfoi decodificada para criar múltiplas colunas "flag" (ex:tem_python,tem_sql), que recebem1ou0indicando a presença de cada habilidade.
- Salários: A coluna
Abaixo, uma amostra das 4 primeiras linhas da tabela final, após todo o processo de tratamento e enriquecimento.
| job_title | seniority_level | status | company | location | post_date | headquarter | industry | ownership | company_size | revenue | salary | skills | salario_min | salario_max | salario_avg | estado | pais | tem_python | tem_sql | tem_r | tem_machine_learning | tem_aws | tem_spark | tem_deep_learning | tem_scikit_learning | tem_tensorflow | tem_pytorch | tem_azure | tem_gcp | tem_tableau | tem_pandas | tem_git | tem_java | tem_powerbi |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Cientista de Dados | Sênior | Híbrido | company_003 | Grapevine, TX . Hybrid | 17 days ago | Bentonville, AR, US | Varejo | Pública | €352.44B | Public | "€100,472 - €200,938" | "['spark', 'r', 'python', 'scala', 'machine learning', 'tensorflow']" | 100472.0 | 200938.0 | 150705.0 | TX | US | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Cientista de Dados | Líder | Híbrido | company_005 | Fort Worth, TX . Hybrid | 15 days ago | Detroit, MI, US | Manufatura | Pública | 155,030 | €51.10B | "€118,733" | "['spark', 'r', 'python', 'sql', 'machine learning']" | 118733.0 | 118733.0 | 118733.0 | TX | US | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Cientista de Dados | Sênior | Híbrido | company_008 | Chicago, IL . Scottsdale, AZ . Austin, TX . Hybrid | 8 days ago | San Jose, CA, US | Tecnologia | Pública | 34,690 | €81.71B | "€112,797 - €194,402" | "['sql', 'r', 'python']" | 112797.0 | 194402.0 | 153599.5 | IL | US | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Cientista de Dados | Não Informado | Presencial | company_009 | On-site | 3 days ago | Stamford, CT, US | Finanças | Privada | 1,800 | Private | "€114,172 - €228,337" | [] | 114172.0 | 228337.0 | 171254.5 | NULL | NULL | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Com os dados limpos, o próximo objetivo foi construir um modelo de Machine Learning capaz de prever a média salarial (salario_avg).
- Seleção: Definição das
features(as "pistas", como cargo, senioridade, skills) e dotarget(o alvo,salario_avg). - Pré-processamento: As features categóricas (texto) foram transformadas em um formato numérico que o modelo entende, utilizando a técnica de One-Hot Encoding.
# Transformando colunas de texto em colunas numéricas (0s e 1s) X_encoded = pd.get_dummies(X, drop_first=True).astype(int)
- Divisão: Os dados foram divididos em 80% para treino e 20% para teste com
train_test_split. - Desafio de Depuração: Um desafio real surgiu quando o primeiro modelo (
LinearRegression) falhou, retornando erros absurdos. A investigação revelou que o problema não era um, mas uma combinação de fatores:- Outliers Extremos: Identificação e remoção de vagas com salários anuais na casa dos milhões.
- Valores Nulos (NaN): Tratamento de valores nulos que persistiram nas features e no alvo.
- Instabilidade do Algoritmo: Mesmo com os dados limpos, a
LinearRegressionse mostrou instável. A decisão foi trocar de algoritmo.
- Treinamento: Um modelo mais robusto,
RandomForestRegressor, foi escolhido e treinado. Este modelo, baseado em um "comitê" de árvores de decisão, é menos sensível a outliers e aprende padrões mais complexos. - Otimização: Para extrair a melhor performance, a ferramenta
GridSearchCVfoi utilizada para testar diversas combinações de hiperparâmetros (as "configurações" do modelo) e encontrar a melhor delas.
Após a otimização, o modelo final foi avaliado no conjunto de teste (dados que ele nunca viu antes), alcançando os seguintes resultados:
- Erro Médio Absoluto (MAE): € 28,818.08
- Em média, as previsões do modelo erram o salário anual por aproximadamente €28.8k, um valor razoável dada a ampla variação salarial.
- Coeficiente de Determinação (R²): 62.37%
- O modelo consegue explicar cerca de 62% da variação nos salários com base nas características da vaga, um resultado sólido para dados do mundo real.
A fase final consistiu em consolidar todos os insights em um dashboard interativo. Esta foi minha primeira experiência com Power BI, focada em aprender a ferramenta do zero para criar um produto final profissional.
O dashboard foi construído do zero, focando em clareza e interatividade.
Abaixo, uma imagem da fase inicial de planejamento e construção do layout.
Após a estruturação, foram aplicados design, formatação e otimização para chegar à versão final, que inclui:
- KPIs Principais: Cartões com o total de vagas e as médias salariais.
- Filtros Interativos: Segmentações de dados por cargo, modalidade e indústria.
- Análise de Senioridade: Gráficos mostrando a distribuição de vagas e a média salarial por nível.
- Análise Geográfica: Um mapa interativo mostrando a concentração de vagas por país.
- Análise de Habilidades: Um gráfico de rosca destacando as skills mais requisitadas.
O resultado é uma ferramenta que não apenas apresenta os dados, mas permite que o usuário explore e tire suas próprias conclusões, simulando um ambiente real de Business Intelligence.


