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
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
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
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
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'
)
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]
Agora analisando as médias das idades agrupadas:
df.groupby('idade_agrup').agg({'classificacao': [np.size, np.mean]}).round(2)
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)
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]
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)
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');
Top comments (0)