Tabela Dinâmica no Python

Todo mundo já se complicou tentando fazer uma tabela dinâmica (pivot table) fora do Excel. No Python, você não precisa criar uma função ou fazer algum tipo de manipulação com a tabela para chegar numa visão semelhante ao que fazemos nas tabelas dinâmicas do Excel. Vamos entender então como utilizar a função pivot_table – se você estiver iniciando e não sabe ainda o que é uma tabela dinâmica, recomendo que vá ao Youtube, faça uma pesquisa rápida e volte em seguida.

Ao invés de construirmos um conjunto de dados para trabalharmos em cima, vamos utilizar os dados de uma base com o desempenho dos estudantes (aka suas notas). A base pode ser baixada clicando aqui. Primeiro, vamos importar a base já no formato de um DataFrame:

# carrega biblioteca

import pandas as pd

# carrega os dados

StudentsPerformance = pd.read_csv('StudentsPerformance.csv')

# verifica algumas linhas

StudentsPerformance.head()

Temos varias variáveis aí, como: gênero (feminino / masculino), raça (grupos A, B, C, …), nível de educação dos pais, almoço (padrão, reduzido), curso preparatório para o teste (completou ou não), etc. Primeiro, somente para que o leitor saiba como fazer, é possível obter algumas descritivas deste data frame de diferentes maneiras, aqui vai uma forma:

# estatistica descritiva das notas

print(StudentsPerformance.describe())

# frequencia das variaveis categoricas

print(StudentsPerformance[['gender','race/ethnicity','parental level of education','lunch','test preparation course']].apply(lambda x: x.value_counts()).T.stack())

Novamente, o print() serve somente para que a saída das duas linhas apareça. Não é necessário usá-lo sempre.

Agora, vamos pensar numa análise univariada, bem simples. Por exemplo, você quer saber se a nota média de matemática varia de acordo com o gênero. Isto é, testar a máxima de que meninos possuem notas melhores em matemática do que meninas. Para isso, você pode fazer a pivot table (ou tabela dinâmica) mais simples que existe:

pd.pivot_table(StudentsPerformance,index=["gender"])

Claro, aos que estão acostumados com o groupby, sim, também é possível utilizá-lo e obter o mesmo resultado:

StudentsPerformance.groupby('gender').mean()

Para ambos os casos, é possível obter somente a média das notas de matemática:

# so math score na pivot table

pd.pivot_table(StudentsPerformance, index=["gender"], values = ['math score'])

# so math score no group by

StudentsPerformance.groupby('gender').mean()['math score']

Note que agora você já sabe que o argumento index da função pivot_table serve para se referir aos índices e o values os valores para cada índice. Se você quiser, você pode incluir quantas variáveis quiser para qualquer um dos dois na sua pivot table, basta acrescentar uma vírgula e o nome da variável.

Mas e se você quiser trazer a soma ao invés da média? Bom, para o groupby você só precisa trocar o sum por mean. Na pivot table, você pode fazer uso das funções do pacote Numpy:

import numpy as np

pd.pivot_table(StudentsPerformance, index=["gender"], values=['math score'], aggfunc=[np.sum])

Pelos valores da média, você inicialmente acreditaria que os meninos vão melhores em matemática. Claro, deveríamos fazer outros testes estatísticos para verificar se a diferença é significativa, mas sigamos.

Imagine agora que você não acredita neste resultado, poderia muito bem ser algo como o Paradoxo de Simpson. Por isso, agora resolve fazer uma análise bivariada (ou multivariada) e, além de querer saber a média por gênero, você quer ver a média por nível de educação dos pais. Você quer organizar sua tabela de forma que fique uma matriz cruzada onde os gêneros formam os índices das linhas e o nível de educação dos pais os das colunas. Agora sim, o legal é utilizar uma pivot table. A sintaxe da Pivot Table parece confusa no começo, mas logo você se acostuma. Veja no nosso exemplo:

import pandas as pd

import numpy as np

pd.pivot_table(StudentsPerformance,index=['gender'],values=['math score'],
columns=['parental level of education'],aggfunc=[np.mean])

Agora, você tem uma matriz cruzada formada pelo gênero x nível de educação dos pais. Essa visibilidade é muito mais completa e coerente com a realidade, onde temos várias variáveis causando algum fenômeno.

Eu gostei bastante desta base, por ser bastante similar ao que vemos em microeconomia/microeconometria. Sugiro fortemente que o leitor faça alguns testes incluindo mais variáveis e tentando entender a saída. É possível fazer mais coisas com a base, regressões e outras coisas mais. Fica como lição de casa.

E se você gostou do post, não vá embora sem deixar uma curtida ou um comentário. Dá bastante trabalho fazer o conteúdo do blog e o feedback de quem lê é muito motivador. Se encontrou algum erro ou tem alguma sugestão, dúvida, elogio ou crítica, pode escrever nos comentários ou me enviar uma mensagem diretamente em Sobre o Estatsite. E visite também a conta do Twitter @EstatSite.

Forte abraço e bons estudos!

3 comentários em “Tabela Dinâmica no Python”

  1. Boa Noite. Percebi que quando cria um pivot_table, a média que aparece é diferente da média dos valores individuais na tabela.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *