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

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

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

Quais filmes mais bem avaliados?

quantidade = df.groupby('titulo').size().to_frame('tamanho')
quantidade
quantidade = quantidade[quantidade['tamanho'] > 100]
quantidade
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
bem_avaliados = media[['tamanho', 'media']].sort_values(by='media', ascending=False)[:10] \
.style.background_gradient(subset=['media'], cmap='YlOrBr')
bem_avaliados

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()
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'
)
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]
df.groupby('idade_agrup').agg({'classificacao': [np.size, np.mean]}).round(2)
classficacao_media = df.loc[filmes_50.index].groupby(['titulo', 'idade_agrup'])
classficacao_media.classificacao.mean().head(15)
classificacao_media.classificacao.mean().unstack(1).fillna(0)[10:20]
pivot = df.pivot_table(index=['filme_id', 'titulo'],
                      columns=['sexo'],
                      values='classificacao',
                      fill_value=0)
pivot['diff'] = pivot.M - pivot.F
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');

23