{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns"
],
"metadata": {
"id": "SHZ00Nm0lEdm"
},
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "G0qlWsRrk4DV",
"outputId": "f880bcf9-be1e-4523-eb5c-6cd5e1a75eeb"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"--2023-01-09 18:45:34-- https://files.grouplens.org/datasets/movielens/ml-latest-small.zip\n",
"Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152\n",
"Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 978202 (955K) [application/zip]\n",
"Saving to: ‘ml-latest-small.zip’\n",
"\n",
"ml-latest-small.zip 100%[===================>] 955.28K 4.10MB/s in 0.2s \n",
"\n",
"2023-01-09 18:45:35 (4.10 MB/s) - ‘ml-latest-small.zip’ saved [978202/978202]\n",
"\n",
"Archive: ml-latest-small.zip\n",
" creating: ml-latest-small/\n",
" inflating: ml-latest-small/links.csv \n",
" inflating: ml-latest-small/tags.csv \n",
" inflating: ml-latest-small/ratings.csv \n",
" inflating: ml-latest-small/README.txt \n",
" inflating: ml-latest-small/movies.csv \n"
]
}
],
"source": [
"!wget https://files.grouplens.org/datasets/movielens/ml-latest-small.zip\n",
"!unzip ml-latest-small.zip"
]
},
{
"cell_type": "markdown",
"source": [
"### Loading the data"
],
"metadata": {
"id": "xNGwDVaHoIHy"
}
},
{
"cell_type": "code",
"source": [
"movies = pd.read_csv('ml-latest-small/movies.csv')\n",
"ratings = pd.read_csv('ml-latest-small/ratings.csv')\n"
],
"metadata": {
"id": "C0L0UiZdnjDw"
},
"execution_count": 5,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### Investigating the data"
],
"metadata": {
"id": "1iDomU7ToLzX"
}
},
{
"cell_type": "code",
"source": [
"movies.sample(5)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "tXM3A7pSn9yM",
"outputId": "7a77efc9-4b8a-429d-d6e8-fb7c892293f3"
},
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" movieId title genres\n",
"2086 2772 Detroit Rock City (1999) Comedy\n",
"82 93 Vampire in Brooklyn (1995) Comedy|Horror|Romance\n",
"5288 8743 Biggles (1986) Adventure|Fantasy|Sci-Fi\n",
"1254 1667 Mad City (1997) Action|Drama\n",
"6050 40478 Night of the Lepus (1972) Horror|Sci-Fi|Thriller"
],
"text/html": [
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" movieId | \n",
" title | \n",
" genres | \n",
"
\n",
" \n",
" \n",
" \n",
" 2086 | \n",
" 2772 | \n",
" Detroit Rock City (1999) | \n",
" Comedy | \n",
"
\n",
" \n",
" 82 | \n",
" 93 | \n",
" Vampire in Brooklyn (1995) | \n",
" Comedy|Horror|Romance | \n",
"
\n",
" \n",
" 5288 | \n",
" 8743 | \n",
" Biggles (1986) | \n",
" Adventure|Fantasy|Sci-Fi | \n",
"
\n",
" \n",
" 1254 | \n",
" 1667 | \n",
" Mad City (1997) | \n",
" Action|Drama | \n",
"
\n",
" \n",
" 6050 | \n",
" 40478 | \n",
" Night of the Lepus (1972) | \n",
" Horror|Sci-Fi|Thriller | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"source": [
"ratings.sample(5)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"id": "0YLXE3XioD-k",
"outputId": "e8de47f3-cda4-4126-d250-f713757d6bd9"
},
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" userId movieId rating timestamp\n",
"39958 274 5076 3.0 1172275318\n",
"31813 219 4643 2.5 1194932356\n",
"100472 610 81520 4.0 1479543207\n",
"99812 610 4232 3.5 1479542821\n",
"22462 153 1954 0.5 1525552646"
],
"text/html": [
"\n",
" \n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" userId | \n",
" movieId | \n",
" rating | \n",
" timestamp | \n",
"
\n",
" \n",
" \n",
" \n",
" 39958 | \n",
" 274 | \n",
" 5076 | \n",
" 3.0 | \n",
" 1172275318 | \n",
"
\n",
" \n",
" 31813 | \n",
" 219 | \n",
" 4643 | \n",
" 2.5 | \n",
" 1194932356 | \n",
"
\n",
" \n",
" 100472 | \n",
" 610 | \n",
" 81520 | \n",
" 4.0 | \n",
" 1479543207 | \n",
"
\n",
" \n",
" 99812 | \n",
" 610 | \n",
" 4232 | \n",
" 3.5 | \n",
" 1479542821 | \n",
"
\n",
" \n",
" 22462 | \n",
" 153 | \n",
" 1954 | \n",
" 0.5 | \n",
" 1525552646 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 7
}
]
},
{
"cell_type": "code",
"source": [
"ratings.info()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "VWQCoAqsoTfm",
"outputId": "f3e90847-3c34-4d20-f830-ca3b73023239"
},
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"\n",
"RangeIndex: 100836 entries, 0 to 100835\n",
"Data columns (total 4 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 userId 100836 non-null int64 \n",
" 1 movieId 100836 non-null int64 \n",
" 2 rating 100836 non-null float64\n",
" 3 timestamp 100836 non-null int64 \n",
"dtypes: float64(1), int64(3)\n",
"memory usage: 3.1 MB\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"ratings.describe()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "8ZFMA9uyoYO_",
"outputId": "d51c594d-7f56-44bc-d330-f9f104e26e0d"
},
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" userId movieId rating timestamp\n",
"count 100836.000000 100836.000000 100836.000000 1.008360e+05\n",
"mean 326.127564 19435.295718 3.501557 1.205946e+09\n",
"std 182.618491 35530.987199 1.042529 2.162610e+08\n",
"min 1.000000 1.000000 0.500000 8.281246e+08\n",
"25% 177.000000 1199.000000 3.000000 1.019124e+09\n",
"50% 325.000000 2991.000000 3.500000 1.186087e+09\n",
"75% 477.000000 8122.000000 4.000000 1.435994e+09\n",
"max 610.000000 193609.000000 5.000000 1.537799e+09"
],
"text/html": [
"\n",
" \n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" userId | \n",
" movieId | \n",
" rating | \n",
" timestamp | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 100836.000000 | \n",
" 100836.000000 | \n",
" 100836.000000 | \n",
" 1.008360e+05 | \n",
"
\n",
" \n",
" mean | \n",
" 326.127564 | \n",
" 19435.295718 | \n",
" 3.501557 | \n",
" 1.205946e+09 | \n",
"
\n",
" \n",
" std | \n",
" 182.618491 | \n",
" 35530.987199 | \n",
" 1.042529 | \n",
" 2.162610e+08 | \n",
"
\n",
" \n",
" min | \n",
" 1.000000 | \n",
" 1.000000 | \n",
" 0.500000 | \n",
" 8.281246e+08 | \n",
"
\n",
" \n",
" 25% | \n",
" 177.000000 | \n",
" 1199.000000 | \n",
" 3.000000 | \n",
" 1.019124e+09 | \n",
"
\n",
" \n",
" 50% | \n",
" 325.000000 | \n",
" 2991.000000 | \n",
" 3.500000 | \n",
" 1.186087e+09 | \n",
"
\n",
" \n",
" 75% | \n",
" 477.000000 | \n",
" 8122.000000 | \n",
" 4.000000 | \n",
" 1.435994e+09 | \n",
"
\n",
" \n",
" max | \n",
" 610.000000 | \n",
" 193609.000000 | \n",
" 5.000000 | \n",
" 1.537799e+09 | \n",
"
\n",
" \n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 10
}
]
},
{
"cell_type": "markdown",
"source": [
"As the timestamp is not useful for our task, we drop it from our dataset"
],
"metadata": {
"id": "znX4JdJjokbG"
}
},
{
"cell_type": "code",
"source": [
"ratings1 = ratings.drop('timestamp', axis=1)"
],
"metadata": {
"id": "1TvD38Njojfu"
},
"execution_count": 11,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"### Building the rating matrix from the dataset"
],
"metadata": {
"id": "7cBnwsw6pSOv"
}
},
{
"cell_type": "code",
"source": [
"rating_matrix = ratings1.pivot(index='userId',columns='movieId',values='rating').fillna(0)"
],
"metadata": {
"id": "15ULmzG4pbDo"
},
"execution_count": 12,
"outputs": []
},
{
"cell_type": "code",
"source": [
"rating_matrix"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 455
},
"id": "GvG6MTXdqe8e",
"outputId": "7fa62fae-2a48-4a5a-8a36-a0af08ee443a"
},
"execution_count": 13,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"movieId 1 2 3 4 5 6 7 8 \\\n",
"userId \n",
"1 4.0 0.0 4.0 0.0 0.0 4.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"5 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"... ... ... ... ... ... ... ... ... \n",
"606 2.5 0.0 0.0 0.0 0.0 0.0 2.5 0.0 \n",
"607 4.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"608 2.5 2.0 2.0 0.0 0.0 0.0 0.0 0.0 \n",
"609 3.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"610 5.0 0.0 0.0 0.0 0.0 5.0 0.0 0.0 \n",
"\n",
"movieId 9 10 ... 193565 193567 193571 193573 193579 193581 \\\n",
"userId ... \n",
"1 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"5 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"... ... ... ... ... ... ... ... ... ... \n",
"606 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"607 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"608 0.0 4.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"609 0.0 4.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"610 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 \n",
"\n",
"movieId 193583 193585 193587 193609 \n",
"userId \n",
"1 0.0 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 \n",
"5 0.0 0.0 0.0 0.0 \n",
"... ... ... ... ... \n",
"606 0.0 0.0 0.0 0.0 \n",
"607 0.0 0.0 0.0 0.0 \n",
"608 0.0 0.0 0.0 0.0 \n",
"609 0.0 0.0 0.0 0.0 \n",
"610 0.0 0.0 0.0 0.0 \n",
"\n",
"[610 rows x 9724 columns]"
],
"text/html": [
"\n",
" \n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
" \n",
" movieId | \n",
" 1 | \n",
" 2 | \n",
" 3 | \n",
" 4 | \n",
" 5 | \n",
" 6 | \n",
" 7 | \n",
" 8 | \n",
" 9 | \n",
" 10 | \n",
" ... | \n",
" 193565 | \n",
" 193567 | \n",
" 193571 | \n",
" 193573 | \n",
" 193579 | \n",
" 193581 | \n",
" 193583 | \n",
" 193585 | \n",
" 193587 | \n",
" 193609 | \n",
"
\n",
" \n",
" userId | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 1 | \n",
" 4.0 | \n",
" 0.0 | \n",
" 4.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 4.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 5 | \n",
" 4.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 606 | \n",
" 2.5 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 2.5 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 607 | \n",
" 4.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 608 | \n",
" 2.5 | \n",
" 2.0 | \n",
" 2.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 4.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 609 | \n",
" 3.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 4.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" 610 | \n",
" 5.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 5.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" ... | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" 0.0 | \n",
"
\n",
" \n",
"
\n",
"
610 rows × 9724 columns
\n",
"
\n",
"
\n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"source": [
"### Analysis the sparsity of the rating matrix\n",
"\n",
"We do it in 2 ways:\n",
"\n",
"First, without using the matrix. For this, we keep in mind that sparsity=ratings/(users*items)"
],
"metadata": {
"id": "wBBLH1oSrc5l"
}
},
{
"cell_type": "code",
"source": [
"number_ratings = len(ratings)\n",
"number_users = len(ratings['userId'].unique())\n",
"number_films = len(ratings['movieId'].unique())\n",
"sparsity = number_ratings/(number_users*number_films)\n",
"\n",
"print(f'Sparsity: {sparsity}')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tuD9RDNKq1AB",
"outputId": "1c865a5e-73c4-4142-a4ac-efc012f1638e"
},
"execution_count": 14,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Sparsity: 0.016999683055613623\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"Second, directly from the matrix"
],
"metadata": {
"id": "h3abD7agub3L"
}
},
{
"cell_type": "code",
"source": [
"def calculate_sparsity(A):\n",
" \"\"\"\n",
" Calculates the sparsity of the matrix A\n",
" \"\"\"\n",
" sparsity = np.count_nonzero(A)/np.size(A)\n",
" return sparsity"
],
"metadata": {
"id": "Xx0J9GypufzB"
},
"execution_count": 15,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(f'Sparsity: {calculate_sparsity(np.array(rating_matrix))}')"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "n94d4D9zwBmO",
"outputId": "7375cda2-60c3-49d6-af66-ff5ee0b4c107"
},
"execution_count": 16,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Sparsity: 0.016999683055613623\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"### Distribution of popularity of the movies"
],
"metadata": {
"id": "WmPoV4Nixbp0"
}
},
{
"cell_type": "code",
"source": [
"movies = ratings['movieId'].unique()\n",
"\n",
"popularity=[]\n",
"\n",
"for movie in movies:\n",
" rates = ratings[ratings['movieId']== movie]\n",
" popularity.append(len(rates))"
],
"metadata": {
"id": "BBeKHHeVxowt"
},
"execution_count": 17,
"outputs": []
},
{
"cell_type": "code",
"source": [
"plt.figure(figsize = (10, 8)) \n",
"plt.hist(popularity)\n",
"plt.title('Distribution of movies by number of ratings received')\n",
"plt.xlabel('Popularity (Number of rates received)')\n",
"plt.ylabel('Number of movies')"
],
"metadata": {
"id": "4VSRkhxgydym",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 530
},
"outputId": "e53f2b78-4ac1-4bbc-a5b1-9dccb813b4b7"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0, 0.5, 'Number of movies')"
]
},
"metadata": {},
"execution_count": 36
},
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
}
]
}