{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Coloque um cabeçalho nesse notebook com o seu nome e resumindo o que descobriu ao explorar esses dados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Formação Data Science Alura - Análise exploratória do MovieLens\n", "\n", "Na formação de Data Scienda www.alura.com.br um dos conjuntos de dados que utilizamos é o de avaliações para filmes no site MovieLens. Neste projeto faremos uma análise exploratória desses dados." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dicas para o projeto completo:\n", "\n", "- todo gráfico deve ter um título, labels e legendas que fazem sentido\n", "- configure um tamanho adequado para os gráficos\n", "- utilize as versões dos arquivos de dados disponíveis no github" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: conferindo as versões utilizadas\n", "\n", "- Devemos usar pandas 0.24.0 ou mais recente\n", "- Devemos usar seaborn 0.9.0 ou mais recente\n", "- Devemos usar scipy 1.2.0 ou mais recente" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install pandas==\"0.24.0\" --quiet\n", "!pip install seaborn==\"0.9.0\" --quiet\n", "!pip install scipy==\"1.2.0\" --quiet" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import scipy\n", "\n", "print(\"Usando pandas %s\" % pd.__version__)\n", "print(\"Usando seaborn %s\" % sns.__version__)\n", "print(\"Usando scipy %s\" % scipy.__version__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: carregue os filmes\n", "\n", "- os dados `https://raw.githubusercontent.com/alura-cursos/formacao-data-science/master/movies.csv` devem ser carregado em `filmes`\n", "- renomeie as colunas para `filmeId`, `titulo` e `generos`\n", "- configure o indice (`index`) para ser o `filmeId`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filmes.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "print(\"Carregamos %d filmes\" % len(filmes))\n", "if(len(filmes) != 9742):\n", " print(\"ERRO! O conjunto de dados que estamos trabalhando nesse projeto possui 9742 elementos.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos extrair o ano dos filmes (código já pronto): " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ano_de_lancamento = filmes.titulo.str.extract(\"\\((\\d{4})\\)\")\n", "filmes['ano_de_lancamento'] = ano_de_lancamento.astype(float)\n", "filmes.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: carregando as notas\n", "\n", "- os dados `https://raw.githubusercontent.com/alura-cursos/formacao-data-science/master/ratings.csv` devem ser carregado em `notas`\n", "- renomeie as colunas para `usuarioId`, `filmeId`, `nota` e `momento`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "notas.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: gere uma nova feature, a média dos votos por filme\n", "\n", "- crie uma nova coluna chamada `nota_media` dentro do dataframe `filmes`\n", "\n", "Dicas:\n", "- como filmeId já é o indice de seu dataframe filmes, se você possui uma série com o número de votos por filme, basta atribuir uma nova coluna normalmente que será usado o mesmo índice" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filmes.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: remova os filmes com menos de 50 avaliações\n", "\n", "- conte o número de notas por filme\n", "- adicione uma coluna nova chamada `total_de_notas` a `filmes` que representa o número de avaliações que aquele filme teve no conjunto de dados\n", "- remova os que tem 49 ou menos de `filmes`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solução" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução para calcular o total de votos por filme\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução para criar a nova coluna e filtrar os filmes\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filmes.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Visualizando os dados gerais" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Visualize as notas médias\n", "\n", "- histograma\n", "- cummulative distribution function\n", "\n", "Dicas:\n", "\n", "- lembre-se de colocar um título nas imagens além de nomes nos eixos x e y\n", "- para gerar a versão cumulativa lembre-se de usar os parâmetros `hist_kws` e `kde_kws` para definir `'cumulative'=True`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução histograma\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução cumulativa\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Visualize o total de votos\n", "\n", "- histograma\n", "- cummulative distribution function" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução histograma\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução cumulativa\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: 20% dos filmes do dataframe tem nota maior que? \n", "\n", "- lembre-se da função `quantile` do pandas" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"20 porcento dos filmes tem nota maior que de %.2f\" % nota_limite_dos_20_porcento)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vamos separar a coluna `generos` em diversas colunas.\n", "\n", "- O código já está pronto." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filmes['generos'] = filmes['generos'].str.replace('-', '')\n", "generos = filmes['generos'].str.get_dummies()\n", "print(\"Temos %d generos distintos\" % generos.shape[1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "filmes = filmes.join(generos).drop(columns=['generos'], axis=1)\n", "filmes.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: visualização de quantos filmes existem por genero\n", "\n", "- Para cada um dos generos você deve agrupar o número de filmes\n", "- Ordene as barras, na esquerda o genero com mais filmes, na direita o que tem menos filmes\n", "\n", "Dica:\n", "\n", "- Para fazer a soma de uma ou mais colunas individualmente você pode usar `seu_dataframe.sum()`\n", "- Não precisa usar o dataframe `filmes`, somente o dataframe `generos`\n", "- Em certas situações é mais fácil usar as funções de plotagem do pandas ao invés do seaborn" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quais são os 5 generos com mais filmes?\n", "\n", "Dica:\n", "\n", "- `sort_values()` pode ordenar uma Series do pandas" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(top5_generos_em_quantidade_de_filmes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: visualização de votos por genero\n", "\n", "- o código que gera os votos por genero já está pronto\n", "- ordene as categorias da mais visualizada para a menos visualizada\n", "- gere a visualização por genero" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "votos_por_genero_por_filme = pd.DataFrame((generos.values.T * filmes['total_de_votos'].values).T, columns = generos.columns)\n", "votos_por_genero_por_filme.head()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucão\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta : votos por filme por genero\n", "\n", "Queremos entender a quantidade de votos em relação a quantidade de filmes existentes naquele genero.\n", "\n", "Por exemplo: \n", "- se temos 1000 votos de `Ação` e 10 filmes desse genero, foram 100 votos por filme nesse genero.\n", "- se o gênero `Documentário` tem 2 filmes e 500 votos, ele tem 250 votos por filme nesse gênero.\n", "\n", "Queremos entender isso, a \"popularidade\" média de um filme em cada categoria, isto é, o número de votos dividido pelo número de filmes, organizado para cada categoria.\n", "\n", "- Você já possui o número de votos por genero\n", "- Calcule o número de votos por genero dividido pelo total de filmes por genero\n", "- Ordene do maior para o menor\n", "- Plote um gráfico para visualizarmos esses dados" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao código\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução com visualização \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Olhando as 3 últimas visualizações o que você conclui sobre os generos `Action` e `War`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução (texto livre):\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Crie 2 boxplots no mesmo plot comparando a coluna `total_de_votos` dos filmes de categoria `Horror` e `Adventure` \n", "\n", "Dica:\n", "\n", "- as vezes é mais fácil usar o boxplot do matplotlib ao invés do seaborn\n", "- plt.boxplot suporta o parâmetro labels com uma lista de nomes para cada boxplot plotado" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução:\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: mostre agora um boxplot para cada uma das categorias\n", "\n", "Dica:\n", "- use generos.columns para acessar todos os gêneros\n", "- já removemos os hífens dos nomes das colunas quando criamos as colunas de gêneros\n", "- plt (pyplot) do matplotlib suporta a função xticks(rotation=90) para rotacionar os labels" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: desejo criar um filme com somente um dos gêneros: `Horror` ou `Adventure`. Quero ter uma chance maior de ter um faturamento que pague minhas contas, mesmo que não seja um super sucesso absurdo de vendas. Qual dos 2 gêneros você sugere?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução:\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: nossa análise foi até então visual. Aplique um teste estatístico para verificar se existe significância estatística na distribuição dos votos dos filmes de `Adventure` e `Horror`. Sua recomendação continua a mesma? Explique.\n", "\n", "Passos:\n", "\n", "- visualize a distribuição de ambas através de histogramas\n", "- se suspeitar normalidade na distribuição, faça um teste de normalidade para ambas\n", "- aplique um teste adequado de comparação das distribuições\n", "- explique o resultado encontrado\n", "- utilize p=0.05" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao histograma de aventura\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao histograma de horror\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao teste de normalidade ou justificativa para nao utiliza-lo\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução com o teste desejado\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução (explique sua conclusão):\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Faça os mesmos boxplots para as notas médias (`nota_media`) dos gêneros `Adventure` e `Horror`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quero fazer um filme que seja sucesso de crítica, com pessoas dando notas altas, mesmo que não tenha um número muito grande de pessoas assistindo. Qual gênero você recomenda se tenho que escolher somente um entre `Adventure` e `Horror`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução:\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: nossa análise foi até então visual. Aplique um teste estatístico para verificar se existe significância estatística na distribuição das notas dos filmes de `Adventure` e `Horror`.\n", "\n", "Passos:\n", "\n", "- visualize a distribuição de ambas através de histogramas\n", "- se suspeitar normalidade na distribuição, faça um teste de normalidade para ambas\n", "- aplique um teste adequado de comparação das distribuições\n", "- explique o resultado encontrado\n", "- utilize p=0.05" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao histograma de aventura\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao histograma de horror\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao teste de normalidade ou justificativa para nao utiliza-lo\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução com o teste desejado\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sua recomendação para maior sucesso de crítica em nota alta entre `Horror` e `Adventure` continua a mesma? Explique.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução:\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quero fazer um filme que seja primeiro sucesso de crítica, com pessoas dando notas altas. Em segundo lugar quero que seja popular (mais pessoas assistam). Com as informações visuais e estatísticas, supondo poder escolher somente um, qual dois 2 gêneros você recomenda agora? `Horror` ou `Adventure`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução:\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quais são os top 5 filmes dos 2 generos mais assistidas?\n", "\n", "- utilize os 2 generos mais votados em `votos_por_genero`\n", "- utilize a `nota_media` para definir o top 5 filmes\n", "- o resultado são 5, não 10 filmes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "votos_por_genero" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução: calculando os 2 generos mais votados\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução: encontrando os top 5 filmes desses generos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quais são os 2 generos com maior valor de correlação com a `nota_media`? E os 2 com menor valor de correlação com a `nota_media`?\n", "\n", "- O pandas possui a função `corr` para calcular correlação entre todas as colunas" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Quais são os 2 generos com maior correlação com `total_de_votos`? E quais os 2 com menor correlação com `total_de_votos`?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Visualize graficamente o relacionamento entre ano de lançamento e nota média\n", "\n", "- Use o gráfico `lineplot`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solucao\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Interprete a correlação entre `ano_de_lancamento` e a `nota_media`?\n", "\n", "- Calcule a correlação numericamente (use o `corr` do pandas)\n", "- Correlação não implica causalidade, qual \"problema\" na coleta dos dados pode gerar esse tipo de correlação?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução (código)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução (explicação)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: analise um pairplot\n", "\n", "- crie uma variável chamada `infos` baseada nas colunas `ano_de_lancamento`, `nota_media` e `total_de_votos` de `filmes`\n", "- faça o pairplot usando seaborn\n", "- coloque uma regressão linear para cada pequeno plot dentro dele" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: analise um pairplot dos filmes de `Animation`\n", "\n", "- use o dataframe `filmes`\n", "- em um único pairplot separe com cores distintas os filmes da categoria `Animation` dos outros\n", "- use uma palete como `husl`\n", "- use marcadores distintos para cada um dos dois grupos\n", "- faça o pairplot usando seaborn e coloque uma regressão linear para cada pequeno plot dentro dele\n", "- tanto em x quanto y use somente três variáveis: `total_de_votos`, `ano_de_lancamento`, `nota_media`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Analise a regressão em relação ao ano de lançamento.\n", "\n", "- Como parece se comportar a `nota_media` de filmes de `Animation` mais antigos e mais recentes? (ano_de_lancamento x nota_media). Essa correlação parece ser baixa, mas parece ser linear?\n", "- E o `ano_de_lancamento` x `total_de_votos`?\n", "- E das outras categorias? Compare isso com os outros filmes.\n", "- O que leva você levantar como hipótese para esse resultado?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solução:\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pergunta: Explore\n", "\n", "- compartilhe conosco 2 visualizações extras que julgar interessante\n", "- explique o que encontrou\n", "- use quantas células (texto ou código) julgar necessário" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solução" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }