Imagem gerada com Lexica.art

Comparando medidas de estatística descritiva em Python e R

Francisco Foz
7 min readMar 28, 2023

A discussão entre Python e R dentro da área de dados, talvez esteja no final. Atualmente, Python é a linguagem preferida entre todos os profissionais de dados no Brasil.

De acordo com a pesquisa State of Data Brasil 2022, realizada pela comunidade do Data Hackers e a Bain & Company, a linguagem preferida entre todas as UF e todos os profissionais de dados (em sua maioria) é o Python.

Apenas entre as pessoas estatísticas que a conta vira e R sai na frente (com 67% das UF).

“R vai morrer, ninguém mais vai usar!”

Bom, as coisas não são bem assim. Particularmente, eu também tenho preferência por Python, mas se tem algo que aprendi em tecnologia é: não vire refém de ferramentas.

“Problemas de negócios são agnósticos em relação às ferramentas.”

Por este motivo, tenho lido e estudado sobre estatística e decidi rever alguns conceitos, comparando Python e R, e assim, ter outras perspectivas por ferramentas diferentes.

No texto de hoje irei trazer algumas medidas de estatística descritiva, a partir do conjunto de dados da teses e dissertações sobre Inteligência Artificial depositadas na BDTD.

Bora lá?!

Sumário

Tabelas de frequência

Medidas de tendência central

Medidas de separatrizes

Medidas de dispersão

Considerações finais

Tabelas de frequência

Tabelas de frequência é uma das mais básicas e úteis formas, para se explorar dados e entendê-los.

Em Python, utilizando Pandas, podemos usar um .value_counts() em uma Series e ele irá contar os valores. Posso simplesmente também passar um .value_counts(normalize=True) e desse forma já ter o percentual.

Fiz uma função, pois iria utilizar muito depois:

def tabela_frequencia(df,variavel):
'''
Esta função irá realizar uma tabela de frequência de acordo com a
variavel inserida do conjunto de dados.

df = Conjunto de dados
variavel = Variável do conjunto de dados da armazenadas na BDTD
'''
frequencia = df[variavel].value_counts()
percentual = df[variavel].value_counts(normalize=True).round(4)*100


tabela_freq = pd.DataFrame({'Frequência':frequencia,
'Percentual(%)':percentual})

return tabela_freq

Com isso sei que as instituições que mais publicaram trabalhos sobre foram a UNICAMP, UFSC, UFRGS, ITA e UFPE.

Em R, já usaria a função table() para contar os valores e a prop.table() para contar os valores percentuais.

Também precisei usar a arrange da biblioteca Dplyr para deixar os valores ordenados do maior para o menor.

tabela_frequencia <- function(df, variavel) {
# Esta função irá realizar uma tabela de frequência de acordo com a
# variavel inserida do conjunto de dados

# df = Conjunto de dados
# variavel = Variável do conjunto de dados da armazenadas na BDTD

# Calcula a frequência e percentual da variável
frequencia <- table(df[[variavel]])
percentual <- round(prop.table(frequencia) * 100, 2)
# Cria um dataframe com os resultados
tabela_freq <- data.frame(cbind('Frequência' = frequencia,
'Percentual'= percentual))
tabela_freq <- arrange(tabela_freq,desc(Percentual))
return(tabela_freq)

O resultado é o mesmo, apenas com as diferenças das estruturas de cada linguagem.

Medidas de tendência central

As medidas estatísticas que provavelmente grande parte das pessoas conhecem: média, mediana e moda.

Vou extrair as medidas a partir da frequência de trabalhos publicados por ano:

MÉDIA

Em Python, utilizamos o .mean() para poder extrair a média aritmética de uma Series, utilizando Pandas.

freq_ano['Frequência'].mean()

Em R, utilizamos a função mean() em um vetor para extrair a média.

freq_ano$Frequência %>% mean()

Usei o pipe %>% apenas porque gosto de deixar mais claro as operações com as funções, mas se fizesse mean(freq_ano$Frequência) seria igual.

Se você quiser saber mais sobre o pipe, veja esse capítulo do curso R:

MEDIANA

Em Python, utilizamos o .median() para poder extrair a mediana aritmética de uma Series, utilizando Pandas.

freq_ano['Frequência'].median()

Em R, também é igual e utilizamos a função median() em um vetor para extrair a mediana.

freq_ano$Frequência %>% mean()

MODA

Em Python, utilizo o .mode() para poder extrair a moda de uma Series, utilizando Pandas.

freq_ano['Frequência'].mode()

Posso passar um [0], para pegar apenas o valor int e não uma Series.

freq_ano['Frequência'].median()[0]

Em, R não temos uma função que possa diretamente pegar a moda. Existe a mode() no Desctools, mas se ela houver mais do que uma, ela retornará apenas a primeira.

Para isso, faço uma função que conte os valores, depois filtre a partir dos valores máximos que tenho dela:

Moda <- function(x){
tabela <- table(x)
moda <- as.numeric(names(tabela)[tabela == max(tabela)])
return(moda)
}

freq_ano$Frequência %>% Moda()

Com isso consigo obter a moda.

Medidas de separatrizes

Medidas de separatrizes são muito importantes para entendermos os limites da distribuição dos dados.

Tanto em R quanto Python, utilizamos a função quantile() para dividir de acordo com o percentual necessário.

QUARTIS

Em Python, podemos usar o .quantile() e passar os percentuais que quero dividir.

Por exemplo:

freq_ano['Frequência'].quantile([0.25,0.5,0.75])

Assim, dividirá em 25%, 50% e 75% dos dados.

Em R, também usamos a função quantile():

quantile(freq_ano$Frequência, c(0.25,0.5,0.75))

DECIS

Em Python, para os decis, podemos fazer um for para não ficar tendo que escrever todos os percentuais:

freq_ano['Frequência'].quantile([i/10 for i in range(0,11)])

Em R, podemos usar a função seq() para poder limitar o intervalos dos valores:

quantile(freq_ano$Frequência, seq(0.1, 0.9, 0.1))

A função seq() irá colocar um valor inicial, um final e um “passo” gerando um vetor para a quantile separar.

CENTIS

A lógica é a mesma para as duas linguagens, apenas modificamos a grandeza dos números.

Python:

freq_ano['Frequência'].quantile([i/100 for i in range(0,101)])

R:

quantile(freq_ano$Frequência, seq(0.01, 0.99, 0.01))

Medidas de dispersão

Medidas de dispersão são importantes para entendermos como nossos dados estão distribuídos em relação a uma medida de tendência central.

DESVIO MÉDIO ABSOLUTO

Em Python, utilizamos a função .mad() para se obter o desvio médio absoluto em uma Series, usando o Pandas.

tabela_frequencia(bdtd_IA,'publicationDates')[['Frequência']].mad()

Em R, usamos a função MeanAD() da biblioteca Desctools para se obter o desvio médio absoluto.

tabela_frequencia(bdtd_IA,'publicationDates')$Frequência %>% MeanAD()

VARIÂNCIA

Em Python, utilizamos a função .var() para obter a variância de uma Series, usando o Pandas.

tabela_frequencia(bdtd_IA,'publicationDates')[['Frequência']].var()

Em R, também utilizamos uma função var():

tabela_frequencia(bdtd_IA,'publicationDates')$Frequência %>% var()

DESVIO PADRÃO

Em Python, utilizamos a função std() para se obter o desvio padrão de uma Series, utilizando o Pandas.

tabela_frequencia(bdtd_IA,'publicationDates')[['Frequência']].std()

Em R, utilizamos a função sd() para se obter o desvio padrão de um vetor.

tabela_frequencia(bdtd_IA,'publicationDates')$Frequência %>% sd()

OUTRAS FUNÇÕES:

A função de “resumo estatístico” básico do Python Pandas é .describe() , que é mais completo que o summary() do R, pois tem a contagem de valores e o desvio padrão além das medidas de separatrizes e médias.

Visualizações, principalmente boxplots e histogramas, são basicamente iguais nas duas.

Em Python, utilizamos do matplotlib e seaborn para auxiliar na plotagem:

freq_instituicao_ano = bdtd_IA[['institutions','publicationDates']].value_counts().to_frame('frequencia').reset_index()

instituicoes_mais_freq = ['UNICAMP','UFSC','UFRGS','ITA','UFPE']

freq_instituicoes_mais_freq_ano = freq_instituicao_ano.query('institutions == @instituicoes_mais_freq')
ax = sns.boxplot(x='institutions',y='frequencia',data=freq_instituicoes_mais_freq_ano)
ax.set_title('Variação de trabalhos publicados por ano por instituição',size=20)
ax = ax

E em R, utilizamos o ggplot2 para criar o gráfico:

freq_instituicao_ano <- bdtd_IA %>% 
count(institutions, publicationDates) %>%
rename(frequencia = n) %>%
select(institutions, publicationDates, frequencia)

instituicoes_mais_freq <- c("UNICAMP", "UFSC", "UFRGS", "ITA", "UFPE")

freq_instituicoes_mais_freq_ano <- freq_instituicao_ano %>%
filter(institutions %in% instituicoes_mais_freq)

# Plotar o boxplot
ggplot(freq_instituicoes_mais_freq_ano,
aes(x = institutions, y = frequencia,fill=institutions)) +
stat_boxplot(geom = 'errorbar', width = 0.4) +
geom_boxplot() +
ggtitle('Variação de trabalhos publicados por ano por instituição')

Considerações finais

Python ou R?

Bom, eu ainda continuo a preferir Python, principalmente por conta da sintaxe e das operações de manipulação e transformação de dados.

Python realmente é mais fluido de se escrever código.

Mas eu estava estudando estatística então não importava muito mesmo a ferramenta.

Aliás, fica a dica para você onde estudar:

Lá tem cursos de estatística com Python e também com R.

Caso você não seja aluna(o) ainda, confira meu cupom de desconto especial aqui.

Além disso, linguagem é ferramenta e ferramenta depende do problema e de gosto, portanto não defenda que uma seja melhor que a outra.

Falei de Python e R, também tem o SQL

Que é a linguagem mais utilizada pelos profissionais Analistas de Dados, no qual descobri a partir dessa pesquisa:

E também já ouvi falar de Julia, principalmente para projetos maiores de machine learning, mas nunca dei um Hello World.

E você?!

Qual é a sua linguagem de programação preferida?

Se você chegou até aqui e curtiu, dê palmas, compartilhe e se inscreva para me acompanhar.

Ainda há muito a se explorar.

Francisco Foz
Francisco Foz

Written by Francisco Foz

Bibliotecário | Analista de dados | Disseminando informações para produzir conhecimento.

No responses yet

Write a response