- Em tarefas de dados não relacionadas a deep learning, como análise, visualização e resumo de dados, Python tem recursos suficientes, mas a experiência de uso tende a ficar complexa e ineficiente
- Em vários casos de laboratório, observou-se repetidamente que, mesmo para transformações simples de gráficos e cálculos estatísticos, Python tende a exigir mais código e mais tempo do que R
- Mesmo usando pandas, matplotlib e NumPy, a sintaxe, a indexação, os parênteses e a estrutura de encadeamento de métodos frequentemente fazem com que a atenção se prenda mais aos detalhes de implementação (logistics) do que à lógica
- Em contraste, o tidyverse do R expressa o fluxo de processamento de dados em um nível próximo da linguagem natural, o que facilita transformar a lógica do trabalho diretamente em código
- Como linguagem para ciência de dados, Python tem limitações estruturais na separação entre lógica e logística, e isso decorre de problemas de projeto da linguagem e do ecossistema
Comparação da experiência real de uso entre Python e R
- Os membros do laboratório podem escolher livremente a linguagem, mas há muitos usuários de Python, e aparece de forma consistente um padrão em que eles não conseguem responder rapidamente a pedidos simples de análise adicional
- Até mudanças de visualização como boxplot → violin plot, histograma → gráfico de densidade, ou gráfico de linhas → heatmap não são fáceis de fazer de imediato
- No R, tarefas resolvidas em poucas linhas passam a parecer, em Python, algo do tipo “preciso voltar para minha mesa e recodificar isso”
- Mesmo em aulas conjuntas com especialistas em Python, fica evidente uma grande diferença em extensão e complexidade do código necessário em comparação com R
- A reação “por que isso precisa ser tão complexo?” aparece repetidamente em várias situações, e isso parece decorrer não de habilidade individual, mas de uma diferença estrutural na arquitetura da linguagem e das bibliotecas
- Mesmo com a mesma lógica, em Python é preciso combinar indexação, separação de dados, remontagem e vários métodos, o que torna a estrutura prolixa
- O tidyverse do R permite expressão direta com encadeamentos naturais como
filter → group_by → summarize
Por que Python é tão usado, e quais são seus limites
- A posição do Python em ciência de dados se baseia mais em difusão histórica, propósito geral e tamanho do ecossistema do que em adequação intrínseca
- Na área de deep learning, Python é claramente o centro graças ao PyTorch e ao ecossistema de IA
- Porém, em limpeza, exploração, visualização e modelagem estatística de dados, ainda há muito atrito
- Trata-se de uma popularidade “quase como um acidente histórico”, e a estrutura mais pesada da linguagem em relação ao R aparece repetidamente em vários exemplos
O que define uma boa linguagem para ciência de dados
- Em trabalhos centrados em exploração, resumo, ajuste de modelos e visualização de dados, o mais importante é ambiente interativo, baixo custo de configuração e iteração rápida
- Linguagens interpretadas e orientadas a script são mais adequadas do que linguagens compiladas
- Mais do que desempenho, a prioridade é simplicidade do código, redução do risco de erros e minimização da carga cognitiva
- Se necessário, basta reescrever apenas algumas operações em uma linguagem de alto desempenho, como Rust, em vez de tudo
- Na prática, as linguagens realisticamente consideradas são R e Python
- Matlab, Mathematica e afins são comerciais ou têm ecossistemas limitados
- Julia é citada com frequência, mas o autor prefere suspender o julgamento por não tê-la usado o suficiente
O problema de “lógica vs. logística”
- Uma linguagem de análise de dados deve separar o que calcular (lógica) de como calcular (logística)
- Se for preciso se preocupar com tipos de dados, índices, loops e montagem manual, então a pessoa já está presa à logística
- No exemplo do Palmer Penguins, o tidyverse do R expressa o cálculo de média e desvio-padrão com um fluxo próximo da linguagem natural
- Não é necessário desmontar o fluxo de dados para depois montá-lo de novo
- O pandas oferece funcionalidades parecidas, mas a especificação por strings, os parênteses, o encadeamento de métodos e tarefas auxiliares como
reset_index aumentam o trabalho, prejudicando legibilidade e simplicidade
- Ao implementar a mesma tarefa apenas com Python puro
- montar loops → criar chaves de grupo → dividir → calcular média → calcular variância → calcular desvio-padrão → remontar → ordenar etc.
- tudo precisa ser feito manualmente, tornando-se um caso típico em que o código de logística domina a lógica
Conclusão e prévia do conteúdo seguinte
- Em análise de dados, Python revela repetidamente um problema estrutural que leva o usuário a se concentrar mais nos detalhes de implementação do que na lógica
- Isso parece ser resultado da combinação entre características da própria linguagem, limites de projeto das bibliotecas e convenções de todo o ecossistema
- Em um texto posterior, o autor pretende tratar das causas técnicas concretas que fazem Python tornar a análise de dados mais difícil do que R
Discussões adicionais e perspectivas de comparação (incluindo feedback dos leitores)
- Há quem diga que o tidyverse pode ser mais verboso que o R básico, mas continua forte em expressividade, consistência e abstração do processamento de dados
- Por outro lado, também se argumenta que o R tem grandes desvantagens do ponto de vista de desenvolvimento de software, como modularização, testes e implementação de CLI
- Python oferece uma boa experiência para desenvolvedores em aspectos como logging, ambientes virtuais, empacotamento e estrutura de classes, mas
- o matplotlib tem um design pouco intuitivo,
- o pandas tem uma sintaxe inconsistente,
- e o scikit-learn é frequentemente criticado por problemas de projeto
- Algumas opiniões veem Python como uma “linguagem que produz rapidamente código instável e de baixa qualidade”, e afirmam que, para desenvolvimento sustentável, linguagens com tipagem estática são melhores
2 comentários
Com o aumento da complexidade e do volume dos dados, se passa a ser necessário um processamento dividido em etapas, além de tratar dados não estruturados, modelos estruturados e até processamento por meio de LLMs; como há muitos casos de uso, talvez não seja a linguagem mais adequada?
Opiniões no Hacker News
Foram dados vários exemplos de transformações, como trocar um boxplot por um violin plot ou um line plot por um heatmap
Na prática, essa discussão é mais sobre matplotlib do que sobre Python
Se você quer o design do ggplot em Python, basta usar plotnine
O motivo de o código em R parecer mais conciso é a avaliação não padrão (non-standard evaluation) do R
Python não permite esse tipo de extensão no nível da linguagem
Veja também Computing on the language
A avaliação não padrão é conveniente em ambientes interativos, mas ao escrever código de análise mais complexo ela acaba virando uma desvantagem
Até tarefas simples às vezes precisam ser feitas de forma indireta
Acho melhor colocar o operador pipe no começo, como em Elixir
Python também pode imitar uma sintaxe parecida com truques como
getattr, mas no fim isso é mais uma questão de design de API de biblioteca do que da linguagem em siR só é fácil quando existem bibliotecas e receitas prontas; sem isso fica realmente difícil, e na maioria das vezes as pessoas simplesmente não fazem
Ele abstrai a falta de ergonomia do matplotlib e ainda oferece recursos ricos
Tutorial do Seaborn
Fico me perguntando por que, em linguagens de programação, tabelas não são objetos de primeira classe
Na maioria das linguagens, é preciso aprender APIs separadas como pandas ou polars para lidar com tabelas
Em R,
data.framechega perto de ser um objeto de primeira classe, mas na prática usa-se mais otibbledo dplyrAinda não existe uma linguagem de expressão padronizada para trabalhar com dados tabulares
Polars e dplyr compartilham uma filosofia parecida, mas no fim o SQL parece ser a única base comum
Python não é perfeito nisso, mas acho que com R acontece o mesmo
Estruturas como tabelas, matrizes, grafos e máquinas de estado não têm suporte no nível da linguagem, o que limita seu uso
As ferramentas incluídas por padrão em uma linguagem acabam definindo o “caminho bonito” dela
Antigamente até key-value store era algo de biblioteca externa, mas hoje virou praticamente padrão
Imagino que, em algum momento, linguagens mais populares também vão absorver esse tipo de programação orientada a tabelas
Linguagem Q, texto comparando Rye, ferramenta experimental Lil
tibbleedata.tableherdam dedata.frame, então as funções básicas do R continuam funcionando normalmenteA conversão entre os três objetos também é muito simples
Não é fácil projetar uma API padrão que lide com elegância com diferenças tão grandes de escala
Mas o dplyr venceu em documentação e onboarding, e por isso ganhou adoção na indústria
A ideia central do texto é boa, mas é uma pena que o autor tenha revelado muito cedo a base da própria argumentação
R é forte em manipulação de dataframes, mas fraco em gestão de arquivos e manutenção
Se esse tipo de trabalho aparece bastante, Python é melhor; e, se velocidade também importa, a preferência começa a pender para Julia
A escolha da linguagem muda conforme as prioridades
Vejo com frequência estudantes tentando resolver problemas não tabulares, como grafos, com pandas; nesses casos é melhor repensar a escolha da ferramenta
Com numpy, o cálculo de média e variância já vem pronto
Tanto Python quanto R têm dificuldade de aprendizado parecida, mas o ponto forte de Python é a integração com outras aplicações
Para processar arquivos grandes, Python; para analisar dados resumidos, R é mais eficiente
O certo é usar cada linguagem como a ferramenta adequada para o contexto
Como programador de Python, também já usei R, e Python é uma “linguagem que faz quase tudo razoavelmente bem, mas sem ser perfeita”
Se você passa o dia inteiro fazendo análise de dados, faz sentido aprender R
R é uma linguagem projetada de acordo com a forma de pensar dos estatísticos
No começo isso parece estranho, mas essa mudança de mentalidade acaba ajudando
Mesmo assim, eu trabalho principalmente em Python
Dá para fazer ciência de dados com pandas, mas achei a experiência truncada e complexa
Com polars melhorou um pouco, mas quando comecei a usar duckdb tudo mudou
Eu executo consultas SQL diretamente no notebook e faço análises em arquivos parquet
Misturar células de SQL com células de Python deixa o código mais limpo
Ao ver a comparação final entre Python e R no texto, pensei: “isso não ficaria muito melhor em SQL?”
O último exemplo em Python é desnecessariamente verboso
Usando
defaultdictestatistics.stddev, ele ficaria bem mais concisoMuita gente implementa isso sem nem pensar se a correção faz sentido
Na verdade, o nome correto seria sample_std_dev
itertools.groupbyO código não fica menor, mas expressa a intenção com mais clareza
Não vale a pena sacrificar a legibilidade só para encurtar
Tentei implementar o mesmo exemplo em Julia com TidierData.jl, e o resultado ficou quase idêntico à versão em R
A sintaxe de macros como
@chain,@group_bye@summarizeé parecida com a do tidyverse no RNão entendo muito bem a insatisfação do autor
É óbvio que Python não foi otimizado para ciência de dados
Python não é uma DSL, e até MATLAB, que foi feito para computação científica, não é uma linguagem popular
Uma boa linguagem é mais como uma cidade boa para viver do que como um clima perfeito
Python é como “uma cidade nórdica próspera, mas com clima ruim”
Acho que o tema do texto é um tanto caça-cliques, então não parece uma discussão muito produtiva
Gostaria que Julia fosse mais usada
No passado reimplementei em Julia um algoritmo para um artigo de psicometria, e ele rodou três vezes mais rápido que em MATLAB
Link para o artigo relacionado
O exemplo final não parece código Python realista, e sim uma espécie de paródia anti-Python
Implementar desvio padrão na mão é coisa de tarefa de graduação
Na prática, tanto R quanto Python estão rodando esse tipo de loop por baixo dos panos
Mas, em ambientes industriais reais, Python é muito mais fácil para colaborar com equipes de engenharia
Já tive de colocar código em R em produção, e foi bem instável
R é excelente para análise exploratória de dados (EDA), mas inadequado para desenvolvimento de software em larga escala