DEV Community

Cover image for Python para Análise de Dados
IgorLeonel
IgorLeonel

Posted on

Python para Análise de Dados

De forma geral, a Análise de Dados é um processo de inspeção, coleta, limpeza, transformação de dados, etc. com o objetivo de descobrir informações úteis e solucionar problemas. As Análises de Dados podem ser classificados como: descritiva, preditiva, prescritiva e diagnóstica. Mas para este post irei focar na Análise Descritiva.
 

Análise Descritiva

 
Com a análise descritiva é possível entender o que está acontecendo no negócio atualmente, tendo como principal objetivo resumir, sumarizar e explorar o comportamento dos dados.
 
Neste post irei usar o DataSet do MovieLens 100k e responder as seguintes perguntas:

  • Quais são os 20 filmes mais avaliados?
  • Quais filmes são mais bem avaliados?
  • Como estão as classificações dos filmes em relação as idades?
  • Quais filmes homens e mulheres mais avaliam?
# Importando a biblioteca Pandas
import pandas as pd
Enter fullscreen mode Exit fullscreen mode

Observação: A base de dados já foi importada e mesclada com o Merge
 

# Mesclando o DataFrame 'filme_classificacao' com os 'usuarios'
filme_classificacao = pd.merge(filmes, classificacao)
df = pd.merge(filme_classificacao, usuarios)
df
Enter fullscreen mode Exit fullscreen mode

Observação: O DataFrame df possui 10000 linhas, e para exportar a imagem com dataframe-image, a quantidade de linhas precisa diminuir, então criei um novo DataFrame com apenas 10 linhas

Alt Text

Quais são os 20 filmes mais avaliados?

avaliados = df['titulo'].value_counts().sort_values(ascending=False)[:20].to_frame('avaliados') \
.style.background_gradient(cmap='Blues')
avaliados
Enter fullscreen mode Exit fullscreen mode

Alt Text
Alt Text

Quais filmes mais bem avaliados?

quantidade = df.groupby('titulo').size().to_frame('tamanho')
quantidade
Enter fullscreen mode Exit fullscreen mode

Alt Text
Observações: Dentro do DataFrame existe alguns filmes com apenas uma avaliação com classificação máxima (5), isto dificulta nossa análise, então, selecionei os filmes com mais de 100 avaliações feitas por usuários.

quantidade = quantidade[quantidade['tamanho'] > 100]
quantidade
Enter fullscreen mode Exit fullscreen mode

Alt Text
Em seguida, criei um novo DataFrame com as médias para cada filme e mesclei com o Merge

media = df.groupby('titulo')['classificacao'].mean().to_frame('media').round(2)
media = pd.merge(
    left=quantidade,
    right=media,
    left_index=True,
    right_index=True
)
media
Enter fullscreen mode Exit fullscreen mode

Alt Text
Agora, os mais bem avaliados:

bem_avaliados = media[['tamanho', 'media']].sort_values(by='media', ascending=False)[:10] \
.style.background_gradient(subset=['media'], cmap='YlOrBr')
bem_avaliados
Enter fullscreen mode Exit fullscreen mode

Alt Text
Alt Text

Como estão as classificações dos filmes em relação as idades?

 
Primeiro vamos plotar um gráfico para ver a distribuição entre as idades dos usuários e usar a tabela frequência!

usuarios.idade.plot.hist(bins=30)
plt.title('Distribuição das idades dos usuários')
plt.xlabel('Idades')
plt.ylabel('Quantidades de usuários')
plt.show()
Enter fullscreen mode Exit fullscreen mode

Alt Text

frequencia = df.idade.value_counts().to_frame('frequencia')
frequencia = frequencia.reset_index().rename(columns={'index':'idade'}).sort_values(by='idade')
frequencia.index = range(len(frequencia))
frequencia[:28].style.background_gradient(
    subset='frequencia',
    cmap='Greys'
)
Enter fullscreen mode Exit fullscreen mode

Alt Text
Observa-se que as pessoas com 27 anos foram as que mais classificaram filmes.
 
Para visualizarmos as médias das classificações entre as idades, é necessário usar a distribuição de frequência, onde o mesmo, mostra um resumo dos dados agrupados em cada faixa. No nosso caso, as idades contém muitos valores elencados, então para isso, usaremos as classes para reduzir a quantidade desses valores agrupando-os em intervalos.
 
Amplitude Total: 66
 
Para escolher a quantidade de classes, usei a Fórmula de Sturges.
 
Classes: 8
 
Amplitude do intervalo: 9
 

labels = ['7-16', '17-26', '27-36', '37-46', '47-56', '48-57', '58-67', '68-77']
df['idade_agrup'] = pd.cut(df.idade, range(0, 81, 10), right=False, labels=labels)
df[['idade', 'idade_agrup']].drop_duplicates()[:15]
Enter fullscreen mode Exit fullscreen mode

Alt Text
 
Agora analisando as médias das idades agrupadas:

df.groupby('idade_agrup').agg({'classificacao': [np.size, np.mean]}).round(2)
Enter fullscreen mode Exit fullscreen mode

Alt Text
Vejamos como os filmes são avaliados em cada faixa etária:

classficacao_media = df.loc[filmes_50.index].groupby(['titulo', 'idade_agrup'])
classficacao_media.classificacao.mean().head(15)
Enter fullscreen mode Exit fullscreen mode

Alt Text
Observe-se que tanto a faixa etária quanto título são índices aqui; como consequência irá produzir uma lista muito grande e para transformar em uma tabela mais visual irei utilizar o unstack

classificacao_media.classificacao.mean().unstack(1).fillna(0)[10:20]
Enter fullscreen mode Exit fullscreen mode

Alt Text
 
Quais filmes homens e mulheres mais avaliam?
 
Para isso, usarei o pivot_table:

pivot = df.pivot_table(index=['filme_id', 'titulo'],
                      columns=['sexo'],
                      values='classificacao',
                      fill_value=0)
Enter fullscreen mode Exit fullscreen mode

Alt Text
Diferença entra as médias:

pivot['diff'] = pivot.M - pivot.F
Enter fullscreen mode Exit fullscreen mode

Alt Text
 

pivot.reset_index('filme_id', inplace=True)
divergencia = pivot[pivot.filme_id.isin(filmes_50.index)]['diff']
divergencia.sort_values().plot(kind='barh', figsize=[9, 15])
plt.title('Média masculina vs. feminino')
plt.ylabel('Título')
plt.xlabel('Diferença de avaliação média');
Enter fullscreen mode Exit fullscreen mode

Alt Text

Top comments (0)