R vs Python para análise de dados [fechado]

60

Faço programação há cerca de um ano e estou realmente interessado em análise de dados e aprendizado de máquina. Estou participando de alguns cursos on-line e lendo alguns livros.

Tudo o que estou fazendo usa R ou Python e estou procurando sugestões sobre se devo ou não me concentrar em um idioma (e se sim, qual) ou continuar com ambos; eles se complementam?

- Devo mencionar que uso C # na escola, mas estou familiarizado com o Python através do auto-estudo.

The_Cthulhu_Kid
fonte
Aqui é talvez um link interessante: coursera.org/course/compdata
Giorgio

Respostas:

39

Eu uso o Python (para análise de dados de curso, incluindo numpy e scipy) e R próximos um do outro. No entanto, eu uso R exclusivamente para executar análise de dados e Python para tarefas de programação mais genéricas (por exemplo, controle de fluxo de trabalho de um modelo de computador).

Em termos de operações básicas, digamos operações em matrizes e o tipo, R e Python + numpy são muito comparáveis. É na grande biblioteca de funções estatísticas que R tem uma vantagem. Além disso, o matplotlib não parece ser tão bom quanto o ggplot2, mas eu não usei tanto o matplotlib. Além disso, eu focaria primeiro em um idioma e me tornaria bom nos detalhes específicos. Você parece estar primariamente interessado em análise de dados, não em engenharia de software. Eu escolheria R e manteria isso. Dito isso, acho que a escolha de Python + numpy + scipy + scikit é definitivamente uma escolha excelente, mas acho que R é um pouco mais excelente.

Também daria uma olhada ao seu redor o que seus colegas e outras pessoas em seu campo estão usando. Se todos eles usam, digamos, Python, faria sentido manter isso para aprender mais facilmente com eles e trocar código.

Isenção de responsabilidade: observe que eu sou um usuário pesado de R, portanto minha opinião pode ser tendenciosa, embora eu tenha tentado manter minha resposta o mais objetiva possível. Além disso, não usei extensivamente o Python + numpy, apesar de conhecer colegas que fazem toda a análise de dados nele.

ps: Este link pode ser interessante: http://seanjtaylor.com/post/39573264781/the-statistics-software-signal

pps: ou esta citação deste post :

Eu uso R e Python para todas as minhas pesquisas (com Rcpp ou Cython, conforme necessário), mas prefiro evitar escrever em C ou C ++ se puder evitá-lo. R é uma linguagem maravilhosa, em grande parte por causa da incrível comunidade de usuários. Foi criado por estatísticos, o que significa que a análise de dados está no cerne da linguagem; Considero que essa é uma das principais características do idioma e uma grande razão pela qual ele não será substituído tão cedo. O Python geralmente é uma linguagem geral melhor, especialmente quando você considera sua combinação de programação funcional com orientação a objetos. Combinado com os modelos Scipy / Numpy, Pandas e stats, isso fornece uma combinação poderosa. Mas o Python ainda carece de uma comunidade séria de estatísticos / matemáticos.

Paul Hiemstra
fonte
3
Dizendo que R é mais forte que Python, você quer dizer Python + numpy / blaze + scipy ou Python simples?
9000
5
Quero dizer Python + numpy sim, caso contrário, a escolha seria ainda mais fácil. Eu acho que em termos de operações básicas, digamos que operações em matrizes e o tipo, R e Python + numpy são muito comparáveis. É na grande biblioteca de funções estatísticas que R tem uma vantagem. Além disso, o matplotlib não parece ser tão bom quanto o ggplot2, mas eu não usei tanto o matplotlib.
Paul Hiemstra
Dito isso, acho que a escolha de Python + numpy + scipy + scikit é definitivamente uma escolha excelente, mas acho que R é um pouco mais excelente.
Paul Hiemstra
@PaulHiemstra - Você faz alguns comentários interessantes em seus comentários que provavelmente melhorariam sua resposta - se a pergunta for reaberta e você tiver essa oportunidade.
Psr
@ psr eu editei nos meus comentários, aparentemente não há necessidade de a pergunta ser aberta se eu quiser editá-la (talvez apenas eu possa editá-la ...).
Paul Hiemstra
36

Antecedentes: Sou cientista de dados em uma startup em Austin e sou formado em Física. Eu uso o Python diariamente para análise de dados, mas uso R um pouco. Eu também uso C # /. NET e Java (quase todos os dias), usei C ++ fortemente na pós-graduação.

Eu acho que o principal problema com o uso de Python para números (acima de R) é o tamanho da comunidade de usuários. Como o idioma existe para sempre, muitas pessoas fizeram coisas que você provavelmente deseja fazer. Isso significa que, quando se deparar com um problema difícil, você pode simplesmente fazer o download do pacote e começar a trabalhar. E R "simplesmente funciona": você fornece um conjunto de dados e sabe quais estatísticas de resumo são úteis. Você fornece alguns resultados e sabe o que deseja. Todas as tramas comuns que você gostaria de fazer estão lá, mesmo algumas bem esotéricas que você terá que procurar na Wikipedia. Tão bom quanto scipy / numpy / pandas / statsmodels / etc. são para Python, eles não estão no nível da biblioteca padrão R.

A principal vantagem do Python sobre o R é que é uma linguagem de programação real na família C. Ele é dimensionado facilmente, portanto é possível que qualquer coisa que você tenha na sua caixa de areia possa ser usada na produção. O Python possui Orientação a Objetos, ao contrário de R, onde parece uma espécie de reflexão tardia (porque é). Há outras coisas que o Python também faz bem: processamento de threads e paralelo é bastante fácil, e não tenho certeza se esse é o caso em R. E aprender Python também oferece uma poderosa ferramenta de script. Também existem IDEs (gratuitos) realmente bons para Python, muito melhores se você estiver disposto a pagar (menos de US $ 100), e não tenho certeza se esse é o caso do R - o único R IDE que conheço é O R Studio, que é muito bom, mas não é tão bom quanto o PyDev + Eclipse, na minha experiência.

Vou acrescentar isso como um incentivo: como você ainda está na escola, deve pensar em empregos. Você encontrará mais ofertas de emprego para desenvolvedores Python altamente qualificados do que para desenvolvedores R altamente qualificados. Em Austin, empregos para desenvolvedores do Django estão meio que caindo do céu. Se você conhece R muito bem, existem alguns lugares onde você pode capitalizar essa habilidade (Revolution Analytics, por exemplo), mas muitas lojas parecem usar o Python. Mesmo no campo da análise / ciência de dados, mais pessoas parecem estar se voltando para o Python.

E não subestime que você possa trabalhar com / para pessoas que apenas conhecem (digamos) Java. Essas pessoas poderão ler o seu código Python facilmente. Isso não será necessariamente o caso se você fizer todo o seu trabalho em R. (isso vem da experiência).

Finalmente, isso pode parecer superficial, mas acho que a documentação e as convenções de nomenclatura do Python (que são religiosamente respeitadas, ao que parece) são muito mais agradáveis ​​do que o R utilitário. Isso será muito debatido, tenho certeza, mas a ênfase no Python é a legibilidade. Isso significa que argumentos para funções Python têm nomes que você pode ler, e isso significa alguma coisa. Em R, os nomes dos argumentos geralmente são truncados - eu achei isso menos verdadeiro no Python. Isso pode parecer pedante, mas me deixa louco escrever coisas como 'xlab' quando você poderia facilmente nomear um argumento 'x_label' (apenas um exemplo) --- isso tem um efeito enorme quando você está tentando aprender um nova API de módulo / pacote. Ler o documento R é como ler as páginas de manual do Linux - se é isso que faz o seu barco flutuar, mais poder para você.

Dito tudo isso, sugiro o seguinte (que também é meu fluxo de trabalho típico): como você conhece Python, use isso como sua primeira ferramenta. Quando você achar que o Python está faltando, aprenda R o suficiente para fazer o que você deseja e, em seguida:

  1. Escreva scripts em R e execute-os no Python usando o módulo de subprocesso, ou
  2. Instale o módulo RPy.

Use Python para saber o que é bom em Python e preencha as lacunas com uma das opções acima. Esse é o meu fluxo de trabalho normal - geralmente uso R para plotar coisas e Python para trabalhos pesados.

Para resumir: devido à ênfase do Python na legibilidade (pesquise no Google por "Pythonic"), a disponibilidade de bons IDEs gratuitos, o fato de ele estar na família C de idiomas, maior a possibilidade de você capitalizar o conjunto de habilidades e o melhor estilo de documentação geral da linguagem, sugiro que você faça do Python o seu objetivo e conte com o R somente quando necessário.


Ok, esta é (de longe) a minha resposta mais popular de todos os tempos em um site de pilha, e nem é a número 1 :) Espero que isso tenha ajudado algumas pessoas ao longo do caminho.

De qualquer forma, cheguei à seguinte conclusão depois de vários anos no campo:

Esta é provavelmente a pergunta errada a ser feita.

Perguntar "eu deveria aprender essa tecnologia em particular" é uma pergunta ruim. Por quê?

  1. Mudanças tecnológicas. Você sempre terá que aprender outra tecnologia. Se você trabalha no Twitter, eles administram o Scala. Alguns lugares são lojas Python. Alguns lugares não se importam. Você não será contratado porque conhece ou não conhece alguma tecnologia em particular - se você não pode aprender uma nova tecnologia, pode (e deve ser) demitido. É como, se uma nova chave inglesa, e você é um encanador, e não consegue descobrir como a nova chave inglesa funciona, você provavelmente é um encanador péssimo.
  2. Dada a escolha de "Eu aprendo esta tecnologia" ou "Eu gasto mais tempo resolvendo problemas reais", você deve sempre escolher a última, sem exceção.

Como cientista de dados, seu trabalho é resolver problemas . Esse pouco de sabedoria quase sempre se perde em todas as conferências ou reuniões em que você participa - todas as palestras sobre "big data" que eu já vi focaram-se na tecnologia, não na solução de problemas. A solução real de problemas geralmente é relegada a alguns slides no final:

[Discussão = "Aprendizado profundo na Cool New Startup"] ... [45 minutos de diagramas e techno-babel durante os quais saio e verifico meu telefone] ... E, depois de implementar nosso cluster Hadoop e [Ben zone out novamente] podemos executar nossa rotina de aprendizado profundo, [acorde: é por isso que vim!], cujos detalhes são proprietários. Questões?

Isso dá uma má impressão de que o campo é sobre tecnologia e simplesmente não é verdade. Se você é realmente bom em Scala, ou Python, ou R, mas é muito ruim em resolver problemas, você será um péssimo cientista de dados .

Paco Nathan esteve em Austin há alguns meses, durante uma conferência de "big data" de um dia, e disse algo como "Química não é sobre tubos de ensaio". Isso resume tudo - a ciência de dados não é sobre Scala, ou Hadoop, ou Spark, ou qualquer outra tecnologia que surja. No final do dia, quero contratar pessoas que pensam, não pessoas que usam o Stack Overflow para aprender kits de ferramentas.

Da mesma forma, se você for a uma entrevista de emprego e eles não o contratarem apenas porque você não conhece alguma linguagem de programação, essa empresa é péssima . Eles não entendem o que significa "cientista de dados" e provavelmente é melhor para você se não der certo.

Finalmente, se suas habilidades de resolução de problemas são marginais (seja honesto consigo mesmo), ou você realmente gosta do lado técnico, ou aprender tecnologia é o que você realmente ama (mais uma vez, seja honesto), aprenda bastante tecnologia. Você sempre poderá encontrar funções do tipo "engenheiro de dados" que se encaixam no seu conjunto de habilidades. Isso não é uma coisa ruim, os engenheiros de dados lubrificam as rodas e possibilitam que você faça seu trabalho como cientista de dados. (A diferença é semelhante ao arquiteto de software e à equipe de desenvolvimento.)

BenDundee
fonte
3
Eu direi, no entanto, que se eu estivesse trabalhando em um pregão, e o operador principal veio a mim com um csv de preços das opções e queria que eu os ajustasse com uma distribuição log-linear e recuperasse a média e o desvio padrão, Eu nem consideraria Python. Eu acho que é como três linhas de código para fazer isso em R.
BenDundee
12

Então, eu fiz principalmente a análise de dados no Matlab, mas fiz alguns no Python (e mais usei o Python para fins gerais) e também comecei um pouco de R. Eu irei contra a corrente aqui e sugiro que você use Pitão. O motivo é que você está fazendo uma análise de dados de uma perspectiva de Machine Learning, não de estatísticas (onde R é dominante) ou processamento de sinal digital (onde Matlab é dominante).

Obviamente, existe uma forte sobreposição entre Machine Learning e Stats. Mas sobreposição não é identidade. O Machine Learning usa idéias do CS que eu não gostaria de implementar no R. Claro, você pode calcular uma árvore de abrangência mínima no R. No entanto, pode parecer uma bagunça feia. O pessoal do aprendizado de máquina presumirá que você tenha acesso fácil a tabelas de hash, árvores de pesquisa binária e assim por diante. É mais fácil para mim implementar um algoritmo de estatísticas novamente quando necessário, do que tentar calçar o que é basicamente uma linguagem específica de domínio em uma linguagem de programação geral.

Os benefícios colaterais do Python para análise de dados também são muito maiores. Você aprenderá uma linguagem de programação real ao mesmo tempo, que pode lidar com scripts, criar aplicativos maiores, etc. R é realmente uma linguagem de nicho da comunidade de estatísticas, até o Matlab é muito mais usado.

Acho que examinaria alguns dos documentos primeiro e veria em que idioma eles publicam o código. Se não estiver no R, não o use.

Nir Friedman
fonte
1
Muito obrigado. Definitivamente, estou mais interessado no lado ML das coisas.
The_Cthulhu_Kid
1
Apenas um pequeno adendo: tenho certeza de que o R também pode fazer isso de alguma maneira, mas o Python é conhecido por sua capacidade de chamar C ou compilar funções no C usando o Cython com sobrecarga mínima. Portanto, você geralmente pode ficar mais rápido com menos esforço, uma consideração importante para analisar dados reais. Outra observação exótica (final): Java possui algumas boas bibliotecas de aprendizado de máquina (como WEKA). No entanto, o que é legal é que você pode chamá-los como bem de Python, usando Jython :-)
Nir Friedman
7

Como cientista da velha escola (mais de 50 anos) que tem e continua a usar várias dessas ferramentas, adicionarei meus dois centavos. Trabalhei com colegas que ainda escrevem todo código no Fortran, desde trabalhos triviais de análise de dados pontuais até códigos que dominam alguns dos supercomputadores do mundo. Os dialetos recentes do Fortran (F90, F95, F2003, F2008) são IMHO, alguns dos idiomas mais bem projetados existentes. Décadas de experiência com computação de alto desempenho levaram a um desenvolvimento de linguagem bastante impressionante.

Eu só usei Python às vezes e o revisitarei (principalmente por causa do Sage), mas eu uso um conjunto de linguagens testadas pelo tempo que funcionam bem para mim. Fortran, C, Perl, R e Scheme (com tcl para scripts do VMD). Acho a combinação de R e Fortran e C muito confortável. Em contraste com outros comentários feitos sobre o modelo de objeto em R, é um bom modelo de objeto para trabalho interativo, baseado no conceito CLOS de funções genéricas e envio de métodos. Ao trabalhar de maneira interativa com um novo pacote, muitas vezes você pode confiar em funções genéricas como "imprimir" e "plot" para fazer algo produtivo.

A API para Fortran e C é muito fácil de usar. Se você está acostumado a trabalhar no Fortran e C para modelagem e análise de dados, essa é uma grande vantagem. A capacidade de gerar código R dinamicamente e avaliá-lo, embora não seja tão limpa quanto os sistemas macro em Lisp e C, é muito útil ao trabalhar com conjuntos de dados dinâmicos.

Algumas limitações de R para dados reais incluem a abordagem de chamada por valor. Embora existam motivos de CS para chamada por valor, a programação do mundo real com grandes dados numéricos requer alguma forma de chamada por referência (observe a importância dos blocos comuns do Fortran no código mais antigo ou dos dados do módulo no código mais recente). A abordagem adotada pelo PDL (Perl Data Language) é especialmente elegante nesse sentido. (Os PDLs são essencialmente chamados por referência, a menos que você solicite uma cópia. A sub-PDLs faz referência a uma subseção de um PDL pai, em uma sintaxe muito mais limpa do que o Fortran ou C fornece).

É bom aprender muitas línguas. O Python é sem dúvida uma linguagem importante, mas o R também está no seu domínio. Mas quando a borracha realmente precisar seguir o caminho da ciência, Fortran e C (e C ++ para alguns) serão difíceis de substituir.

John Daschbach
fonte
1

Um recurso importante do R é que é uma biblioteca de pacotes, tanto quanto uma linguagem de programação. Todo gravador de pacotes tem acesso, em princípio, ao que está em todos os outros pacotes. Isso reduz drasticamente a necessidade de reinventar, re-documentar e re-aprender. Isso se aplica aos autores de pacotes e aos usuários. Obviamente, essa infraestrutura tem um custo. Os autores de pacotes devem acomodar padrões que se tornam cada vez mais exigentes com o passar do tempo. Parte disso pode se espalhar para o que os usuários encontram.

Python, como eu entendo, não possui um sistema de gerenciamento de pacotes. Não há equivalente à Rede Abrangente de Arquivamento R da R ( http://cran.r-project.org ) e nenhum equivalente direto às visualizações da tarefa R ( http://cran.csiro.au/web/views/ ). Portanto, é, em uma extensão que não é o caso de R, uma ferramenta para programadores que trabalham praticamente por conta própria e não como parte de um esforço comunitário para desenvolver o que já está disponível.

Para análise de dados e aprendizado de máquina, a demanda certamente é, em grande parte, aproveitar e aproveitar as habilidades que já existem. Para tarefas de programação mais genéricas, o Python pode ter vantagens. Você fará esse tipo de trabalho o suficiente para justificar o esforço envolvido no aprendizado de Python?

John Maindonald
fonte
3
O Python possui um sistema de gerenciamento de pacotes chamado pip. Ele não faz parte da biblioteca padrão, mas será fornecido com o Python padrão, começando com o Python 3.4, que será lançado no próximo mês (março de 2014).
Cody Piersall
2
O equivalente Python do Comprehensive R Archive Network é PyPI: pypi.python.org/pypi
Wilfred Hughes