
O Titanic Dataset é praticamente um clássico nos estudos de ciência de dados. Mas aqui não quero apenas repetir o que todo mundo faz. Então, resolvi explorar os dados do naufrágio mais famoso da história com dois objetivos: entender melhor como analisar um CSV cru e mostrar o impacto do uso (ou não) do Pandas. Assim, você vai ver o esforço necessário para extrair algo simples como a idade média dos passageiros quando estamos só com Python puro. Depois, vamos comparar com a praticidade oferecida pela biblioteca mais amada pelos analistas. O que se aprende no caminho é tão valioso quanto o resultado final.
Mas, além do artigo Titanic Dataset, aqui no blog também temos diversos outros artigos sobre kubernetes, desenvolvimento, gestão, devops, etc. Veja alguns exemplos: Diferenças entre Paradigmas, Axiomas e Hipóteses, Desenvolver na empresa ou comprar pronto, Fuja da otimização prematura, entre outros.
Sumário
O Titanic
O Titanic afundou em 15 de abril de 1912 deixando vários mortos. Temos livros, filmes, e arquivos csv que contam essa história. Resolvi explorar esses dados utilizando meu VSCode com Python e extrair alguns dados. E mais do que isso, a ideia é demonstrar o processo para extração de tais dados.
Para começar utilizei o Kaggle, uma rede social de dados muito interessante, onde encontrei o arquivo CSV para fazer esse trabalho. Esse arquivo possui quase 500 linhas com informações de cada passageiro que embarcou. Entre as informações temos: se sobreviveu, se estava em primeira classe, nome, sexo, idade, cabine, local de embarque, entre outros. A ideia é fazer uma análise simples com esses dados utilizando o pandas e sem utiliza-lo.
O objetivo é descobrir a idade do passageiro mais jovem, mais velho, a média de idades, quantos sobreviveram e quantos não sobreviveram ao naufrágio.
Ambiente
Para fazer esses desafio utilizei o querido VSCode, com as extensões Jupyter e Python, em meu ambiente windows, mas funcionaria perfeitamente no WSL2 ou diretamente no Linux. Para a montagem do ambiente utilizei o Python na versão 3.13.5

Sem utilização do Pandas
Talvez você se pergunte, mas porque fazer isso sem o Pandas? A resposta é simples: para demonstrar o uso sem bibliotecas e o esforço envolvido. Claro que é mais prático o uso dele, mas o conhecimento é importante para qualquer profissional de dados.
titanicCsv = open(r'C:\temp\titanic\archive\titanic.csv', 'r')
linhas = titanicCsv.readlines()
colunas = linhas[0].split(',')
titanicCsv.close()Essa parte inicial carrega o arquivo CSV que baixei do Kaggle, lê as linhas e colunas (que já transformei em lista) e já fechei o handle do arquivo, por boa prática.
import re
def tratar_linha(linha):
match = re.compile(r'"(.*)(,)(\s.*)"')
return match.sub(r'"\3 \1"', linha).replace("\"","").replace("\n","");
for i, linha in enumerate(linhas):
linhas[i] = tratar_linha(linha).split(',')Note que nos dados os nomes estão separados por vírgula, mas usando aspas duplas como delimitador. Precisei utilizar uma expressão regular para organizar isso sem bagunçar as colunas. A variável linhas, passa a ser um lista com os nomes corretos.
Transformando os dados
titanic_dados = {}
for coluna in colunas:
titanic_dados[coluna] = []
for linha in linhas[1:]:
for i, dado in enumerate(linha):
coluna = colunas[i]
titanic_dados[coluna].append(dado)As linhas organizadas facilitam certo nível de manipulação. Mas veja que não facilita para a extração de uma média, por exemplo. É mais fácil ter um dicionário com um item Idade e todas as idades juntas nele. Com isso consigo extrair médias. Esse código coloca em titanic_dados essa estrutura.
for indice, dado in enumerate(titanic_dados["Age"]):
if titanic_dados["Age"][indice] != "":
titanic_dados["Age"][indice] = float(dado)
else:
titanic_dados["Age"][indice] = -1Mesmo após fazer o que comentei, tenho um problema: idade é um texto e não um número. Então, basta converter todas as posições da idade para float que está ok. Porém há colunas vazias e, para corrigir isso, no momento, substitui temporariamente por -1.
def media(lista):
soma = sum(lista)
quantidade = len(lista)
return soma / quantidadeVeja que não estou usando o Pandas e nenhuma outra biblioteca. Nesse caso não há nem modo de extrair a média e, por isso, criei uma função para tal.
lista_idades = []
for i, dados in enumerate(titanic_dados["Age"]):
if titanic_dados["Age"][i] != -1:
lista_idades.append(titanic_dados["Age"][i])
valor_da_media = media(lista_idades)
for i, dados in enumerate(titanic_dados["Age"]):
if titanic_dados["Age"][i] == -1:
titanic_dados["Age"][i] = valor_da_mediaAgora estou fazendo a extração da média e colocando na variável valor_da_media. Veja que não considerei as idades com o valor -1. Mas, na parte de baixo, para ser mais didático, substitui os valores -1 da titanic_dados pela média. Essa técnica é bastante usada em cenários como esse.
Vendo o resultado
print("Maior idade de passageiro:", max(titanic_dados["Age"]))
print("Menor idade de passageiro:", min(titanic_dados["Age"]))
print("Media de idade de passageiro:", media(titanic_dados["Age"]))
morreram = 0
sobreviveram = 0
for i in titanic_dados["Survived"]:
if i == '0':
morreram+=1
elif i == '1':
sobreviveram+=1
print("Morreram:", morreram)
print("Sobreviveram:", sobreviveram)Com isso tenho plenas condições de obter todos os dados que desejo. Primeiramente tenho as idades máximas, mínimas e médias. E na parte inferior do código extraio a quantidade de sobreviventes e não sobreviventes.
Utilizando o Pandas
Agora estou usando o Pandas. Boa parte dos problemas que indiquei na parte sem a biblioteca não existem e a manipulação é muito facilitada.
import pandas as pd
df = pd.read_csv(r'C:\temp\titanic\archive\titanic.csv')Para começar faço a importação do Pandas. Veja que para fazer isso precisei usar a linha de comando pip install pandas. Utilizei a função de leitura de CSV, mas ele pode ler arquivos excel, arquivos html, tamanho fixo, parquet, tabela de sql, json, xml, entre outros. Armazenei o dataframe do pandas na variável df.
print(df['Age'].min());
print(df['Age'].mean());
print(df['Age'].max());
print("Morreram:", (df['Survived'] == 0).sum())
print("Sobreviveram:" , (df['Survived'] == 1).sum())Realmente é muito mais fácil com a biblioteca, onde facilmente extraio as idades mínimas, médias e máximas. Para extrair os sobreviventes precisei fazer uma pequena manipulação, mas foi bastante simples.
Conclusão de Titanic Dataset
Analisar o Titanic foi só o pretexto. O verdadeiro objetivo era mostrar que até os dados mais simples podem dar trabalho quando abrimos mão das ferramentas certas. Claro que é possível fazer tudo na unha, mas por que reinventar o leme se já temos navios modernos? Com Pandas, o processo se torna mais limpo, rápido e elegante. Mas entender o que está por trás das abstrações é o que separa quem só copia código de quem realmente sabe o que está fazendo. Titanic Dataset
Ele atua/atuou como Dev Full Stack C# .NET / Angular / Kubernetes e afins. Ele possui certificações Microsoft MCTS (6x), MCPD em Web, ITIL v3 e CKAD (Kubernetes) . Thiago é apaixonado por tecnologia, entusiasta de TI desde a infância bem como amante de aprendizado contínuo.
