R vs Python: duelo entre gigantes

Julia Hellen Ferreira
8 min readMar 15, 2024

--

Olá, pessoal!

Na área de Ciência de Dados, é comum ouvir a seguinte pergunta: “Qual linguagem utilizar para análise de dados, o R ou o Python?”. Existem outras linguagens mas acredito que o R e o Python são os mais famosos devido a facilidade de realizar desde análises simples a criação de modelos mais complexos.

Para responder essa grande questão vou trazer um problema fictício para resolvermos juntos utilizando tanto o R como o Python. Assim, no final você mesmo poderá tirar suas conclusões. Então, pegue seu café e venha acompanhar esse embate!

1 - Base de dados

Quando estamos estudando queremos base de dados interessantes para analisar e muitas vezes isto é um grande desafio, não é mesmo? Por isso, vou trazer um site bem legal que tem diversas bases de dados. No Base de Dados você encontrará dados oficiais dos principais órgãos públicos do Brasil e também dados de organizações internacionais.

Para nossa análise, decidi trazer uma base bem divertida de trabalhar facilitando no entendimento dos comandos que iremos aprender. A base é Oscar que temos informações sobre um dos evento mais relevantes no universo cinematográfico.

1.1 - Descrição

A tabela apresenta informações dos vencedores do Oscar em diversas categorias, incluindo Melhor Diretor, Melhor Ator, Melhor Ator Coadjuvante, Melhor Atriz e Melhor Atriz Coadjuvante. Os dados abrangem desde a edição de 1927 até a edição de 2014 do Oscar, fornecendo informações sobre a demografia dos vencedores ao longo do tempo. A base de dados contém 10 variáveis e 415 observações.

1.2 - Tradução das variáveis

  • name: nome;
  • birth_year: ano do aniversário;
  • birth_date: data de aniversário;
  • birthplace: local do nascimento (naturalidade);
  • race_ethnicity: raça;
  • religion: religião;
  • sexual_orientation: orientação sexual;
  • year_edition: ano da edição;
  • category: categoria;
  • movie: filme.

2 - Problema

Iremos imaginar um cenário em que você trabalha em uma empresa de mídia e seu time é responsável por analisar dados para que os jornalistas apresentem na noite do Oscar de 2015. A ideia é que os jornalistas possam informar ao público curiosidades sobre o evento de forma simples e divertida. Então, um dia seu gerente manda o seguinte e-mail:

Boa tarde, ser humano! Tudo bem?

Estamos preparando o material para o Oscar deste ano (2015) e queríamos que as seguintes perguntas fossem respondidas para que os jornalistas possam levar na transmissão.

1. Em média, qual a idade dos ganhadores do Oscar?

2. Qual foi a pessoa mais jovem a ganhar o Oscar?

3. E quem foi a mais velha?

4. Seria legal a gente legar para o público um recorte racial, o que acha? Mas acho que seria importante ser por categoria!

5. Ah, falando nisso. Sabe me dizer as categorias principais? Não lembro!

6. Qual filme mais ganhou mais estatuetas? Quais foram elas?

7. Quem ganhou mais estatuetas até hoje?

8. Outro ponto, acha que seria importante falar sobre a sexualidade dos ganhadores? Penso muito na representatividade…

9. Liste 10 primeiras e últimas ganhadoras da categoria Melhor Atriz

10. Outra coisa legal seria falar um pouco da naturalidade destes ganhadores mas tô sem ideia de como levar isso.

Bom, é isso! Qualquer dúvida tô por aqui!

Agora que você tem a demanda na mão é hora de começar a trabalhar!

3 - Usando o R

Começando pelo o R, vamos usar o Posit Cloud. No link você encontrará todo o script pronto para uso!

Pacotes

Para esta análise iremos utilizar as seguintes pacotes:

  1. Basedosdados: Pacote responsável por extrair a base de dados;
  2. Dplyr: Realiza análise de dados de forma simplificada;
  3. Ggplot2: Cria gráfico com estética mais bonita.

Instalação

Para instalar os pacotes desejados basta usar o comando:

install.packages("<NOMEDOPACOTE>")
library("<NOMEDOPACOTE>") # chamar o pacote

Na análise iremos usar os seguintes pacotes:

# Pacotes
install.packages("basedosdados")
install.packages("ggplot2")
library("basedosdados")
library("dplyr")
library("ggplot2")

Leitura da base de dados

# Defina o seu projeto no Google Cloud
set_billing_id("380988119071")
# Para carregar o dado direto no R
query <- bdplyr("world_ampas_oscar.winner_demographics")
df <- bd_collect(query)

Análise dos dados

# Visão geral da base
head(df, 5)
summary(df)

## Acrescentar coluna idade em anos
df$idade_anos = df$year_edition - df$birth_year
head(df, 5)
head(df$idade_anos, 5)

## Renomear as variáveis - Ops, vamos renomear a variavel para inglês para manter o padrão:
df <- dplyr::rename(df, age = idade_anos)
summary(df)

# 1. Em média, qual a idade dos ganhadores do Oscar? 44
# 2. Qual foi a pessoa mais jovem a ganhar o Oscar? 11
# 3. E quem foi a mais velha? 83
summary(df)

## Apesar de saber a idade seria interessente saber quem é a pessoa e a categoria que ela ganhou:
df_mais_menos_jovem <- df %>%
dplyr::filter(age == 11 | age == 83)

# 4. Seria legal a gente legar para o público um recorte racial, o que acha?
# Mas acho que seria importante ser por categoria!Visão geral antes:
df_nome_unicos <- df %>%
dplyr::distinct(name, .keep_all = TRUE)

df_race_counts <- df_nome_unicos %>%
count(race_ethnicity, name = "count") %>%
dplyr::mutate(percentage = (count / sum(count)) * 100)

# 4. Seria legal a gente legar para o público um recorte racial, o que acha?
# Mas acho que seria importante ser por categoria!
df_nome_unicos %>%
group_by(category, race_ethnicity) %>%
summarise(count = n())

# Agrupar os dados pela categoria e calcular a proporção de raça/etnia dentro de cada grupo
df_nome_unicos %>%
group_by(category, race_ethnicity) %>%
summarise(count = n()) %>%
dplyr::mutate(percentage = (count / sum(count)) * 100)

# 5. Ah, falando nisso. Sabe me dizer as categorias principais? Não lembro!
df %>%
group_by(category) %>%
summarise(count = n())

# 6. Qual filme mais ganhou mais estatuetas? Quais foram elas?

filme_mais_premiado <- df %>%
group_by(movie) %>%
summarise(n = n()) %>%
arrange(desc(n)) %>%
top_n(1)

total_estatuetas <- filme_mais_premiado$n

cat("O filme mais premiado é '", filme_mais_premiado$movie, "' com ",total_estatuetas, " prêmios.", sep = "")

# 7. Quem ganhou mais estatuetas até hoje?

resultado <- df %>%
dplyr::group_by(category) %>%
count(name) %>%
dplyr::top_n(1)

resultado

# 8. Outro ponto, acha que seria importante falar sobre a sexualidade dos ganhadores? Penso muito na representatividade…

df_nome_unicos %>%
dplyr::group_by(sexual_orientation) %>%
count()

# 9. Liste 1o primeiras ganhadoras da categoria Melhor Atriz
df %>%
dplyr::filter(category == "Best Actress") %>%
dplyr::arrange(year_edition) %>%
head(10)

df %>%
dplyr::filter(category == "Best Actress") %>%
dplyr::arrange(year_edition) %>%
tail(10)

# 10. Outra coisa legal seria falar um pouco da naturalidade destes ganhadores
# mas tô sem ideia de como levar isso
## Que tal um gráfico mostrando este resultado?

# Contando o número de ocorrências de cada birthplace
birthplace_counts <- table(df_nome_unicos$birthplace)

# Definindo o limite mínimo de ocorrências para não ser agrupado em "Outros"
threshold <- 3
other_mask <- birthplace_counts < threshold
birthplace_counts[other_mask] <- sum(birthplace_counts[other_mask])
birthplace_counts <- birthplace_counts[!other_mask]

# Convertendo os dados para um data frame
birthplace_df <- data.frame(Local = names(birthplace_counts),
Ganhadores = as.numeric(birthplace_counts))

# Ordenando o data frame pela coluna ganhadores
birthplace_df <- birthplace_df[order(birthplace_df$Ganhadores, decreasing = TRUE), ]

# Criando o gráfico de barras horizontais com ggplot2
ggplot(birthplace_df, aes(x = Ganhadores, y = reorder(Local, Ganhadores))) +
geom_bar(stat = "identity", fill = "skyblue") +
labs(title = "Distribuição de Locais de Nascimento",
x = "Ganhadores",
y = "Local de Nascimento") +
theme_minimal()

4 - Usando o Python

Para o Python, iremos usar o Google Colab. Neste link é possível acessar um notebook já pronto com os códigos que vemos abaixo.

Bibliotecas

Para esta análise iremos utilizar as seguintes bibliotecas:

1. Pandas: Biblioteca Python para manipulação e análise de dados;

2. NumPy: Biblioteca para funções matemáticas;

3. Matplotlib.pyplot: Módulo da biblioteca Matplotlib para criação de gráficos de alta qualidade em Python.

Importação

Antes de começar a importar as bibliotecas, vamos entender as formas diferentes que podemos fazer está importação.

import pandas # é usado para carregar uma biblioteca inteira
from pandas import DataFrame # é usado para importar partes específicas de uma biblioteca
from pandas import DataFrame, Series # para importar várias partes de um módulo de uma vez, separando-as por vírgula

Pronto, agora vamos começar importar as bibliotecas que usaremos em nossa análise:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
!pip install basedosdados # rode para instalar no Python/Jupyter
import basedosdados as bd
import datetime

Leitura da base de dados

# Para carregar o dado direto no pandas

df = bd.read_table(dataset_id='world_ampas_oscar',
table_id='winner_demographics',
billing_project_id="380988119071")
df.head(5)

Análise dos dados

⚠️ Como usaremos o Colab, cada trecho do código deve ser executado em uma célula separada.

  • Visão geral da base:
# Visão geral da base
df.describe()
  • Vamos acrescentar coluna idade em anos:

df['idade_anos'] = df['year_edition']- df['birth_year']
df.head(5)
  • Renomear as variáveis — Ops, vamos renomear a variável para inglês para manter o padrão:
df.rename(columns={'idade_anos': 'age'}, inplace = True)
  • # 1. Em média, qual a idade dos ganhadores do Oscar? 44
  • # 2. Qual foi a pessoa mais jovem a ganhar o Oscar? 11
  • # 3. E quem foi a mais velha? 83
df.describe()
  • Apesar de saber a idade seria interessente saber quem é a pessoa e a categoria que ela ganhou:
df[(df["age"] == 83) | (df["age"] == 11)]
  • 4. Seria legal a gente legar para o público um recorte racial, o que acha? Mas acho que seria importante ser por categoria! Visão geral antes:
df_nome_unicos = df.drop_duplicates(subset="name")
df_nome_unicos["race_ethnicity"].value_counts(normalize=True)*100
  • 4. Seria legal a gente legar para o público um recorte racial, o que acha? Mas acho que seria importante ser por categoria!
raca_categoria = df_nome_unicos.groupby(["category", "race_ethnicity"]).size().reset_index(name="total")
raca_categoria = raca_categoria.sort_values(by=["category", "total"], ascending=[True, False])
raca_categoria
  • Agrupar os dados pela categoria e calcular a proporção de raça/etnia dentro de cada grupo
proporcao_racas_por_premios = (df_nome_unicos.groupby("category")["race_ethnicity"].value_counts(normalize=True)*100).round(2)
proporcao_racas_por_premios
  • 5. Ah, falando nisso. Sabe me dizer as categorias principais? Não lembro!
df.groupby("category")["name"].count()
  • 6. Qual filme mais ganhou mais estatuetas? Quais foram elas?
filme_mais_premiado = df.groupby("movie")["category"].count().idxmax()
total_estatuetas = df.groupby("movie")["category"].count().max()
print("O filme mais premiado é '{}' com {} prêmios.".format(filme_mais_premiado, total_estatuetas))
df[df["movie"] == "West Side Story"]
  • 7. Quem ganhou mais estatuetas até hoje?
resultado = df.groupby(["category", "name"]).size().reset_index(name="total_estatuetas")
resultado = resultado.sort_values(by=["category", "total_estatuetas"], ascending=[True, False])
max_estuetas = resultado.groupby("category")["total_estatuetas"].max().reset_index()
resultado_final = pd.merge(resultado, max_estuetas, on=["category", "total_estatuetas"])
resultado_final
  • 8. Outro ponto, acha que seria importante falar sobre a sexualidade dos ganhadores? Penso muito na representatividade…
df_nome_unicos.groupby("sexual_orientation")["name"].count()
  • 9. Liste 1o primeiras ganhadoras da categoria Melhor Atriz
df[df["category"] == "Best Actress"].sort_values(by="year_edition").head(10)
  • 9. Liste 10 últimas ganhadoras da categoria Melhor Atriz
df[df["category"] == "Best Actress"].sort_values(by="year_edition").tail(10)
  • 10. Outra coisa legal seria falar um pouco da naturalidade destes ganhadores mas tô sem ideia de como levar isso. Que tal um gráfico mostrando este resultado?
# Importando as bibliotecas necessárias
import pandas as pd
import matplotlib.pyplot as plt

# Contando o número de ocorrências de cada birthplace
birthplace_counts = df_nome_unicos['birthplace'].value_counts()

# Agrupando os locais menos frequentes em uma categoria "Outros"
threshold = 3 # Defina o limite mínimo de ocorrências para não ser agrupado em "Outros"
other_mask = birthplace_counts < threshold
birthplace_counts.loc[other_mask] = birthplace_counts[other_mask].sum()
birthplace_counts = birthplace_counts[~other_mask]

# Ordenando o DataFrame pelo número de ganhadores, do menor para o maior
birthplace_counts = birthplace_counts.sort_values(ascending=True)

# Criando o gráfico de barras horizontais ordenado
plt.figure(figsize=(10, 6))
birthplace_counts.plot(kind='barh', color='skyblue')
plt.title('Distribuição de Locais de Nascimento')
plt.xlabel('Ganhadores')
plt.ylabel('Local de Nascimento')
plt.tight_layout()
plt.show()

4 - Raio X: Vantagens e desvantagens

Bom, agora chegou o grande momento de discuti que foi o grande vencedor desta batalha!

Com minha experiência tanto no R como no Python, eu vejo muitas vantagens eu usar o R devido a gramática simples e mais fácil de entender. Em contra partida, o R no universo cooperativo pode acabar não sendo tão utilizado devido a sua exclusividade na área de ciência de dados. Sendo assim, se você trabalha com outros profissionais dificilmente eles saberão a linguagem e terão dificuldades de integrar a outras ferramentas.

Por isso, o Python acaba sendo muito utilizado devido a sua ampla utilização por diversos profissionais. Este ponto positivo é o que torna ele tão atraente nas empresas. Porém, eu sinto que a linguagem é muito engessada e com gramática confusas ou até mesmo ruins de entender.

Vale lembrar que está é a minha visão e outros colegas podem discordar trazendo outras visões. Com tudo isso, qual linguagem você gostou mais?

5 - Inteligência Artificial: vale a pena usar?

Não poderia deixar de fora um dos temas mais badalados do momento: Inteligência Artificial!

Vejo muitos profissionais usando ferramentas baseadas em IA em que geram códigos e mais códigos em uma enorme variedade de linguagens. Parece um sonho perfeito, né? Mas a real que isso pode ser um grande problema.

Vou listar aqui três problemas que já vi e encontrei durante meus estudos:

  • Vazamento de dados. Por isso, nunca coloque dados sensíveis nestas ferramentas!
  • Respostas erradas e até inventadas;
  • Possibilidade de bug no código gerado pela ferramenta.

--

--

Julia Hellen Ferreira
0 Followers

Mestranda em Ciência da Computação, Cientista de Dados na Globo. Apaixonada por insights analíticos, compartilho conhecimento como palestrante nas horas vagas.