This commit is contained in:
Gašper Dobrovoljc committed 2025-06-10 09:46:43 +02:00
commit 0f562fbdea
10 files changed
+131236

No files matched your search

+2
View File
@@ -0,0 +1,2 @@
.DS_Store
+880
View File
@@ -0,0 +1,880 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"## Priprava podatkov, osnovne statistike in vizualizacija\n",
"\n",
"Podatkovno rudarjenje, naloga, 14. 3. 2025\n",
"**Gašper Dobrovoljc**"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"Neizogiben del vsakega projekta na področju podatkovnega rudarjenja je iskanje,\n",
"urejanje in priprava podatkov. V tej nalogi boste spoznali primer podatkovne\n",
"zbirke in uporabili postopke za pretvorbo podatkov v ustrezno obliko ter pregled in\n",
"prikaz osnovnih statistik."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Podatki\n",
"\n",
"V nalogi boste pregledali in pripravili podatke gledanosti Hollywoodskih filmov\n",
"zbirke [MovieLens](https://grouplens.org/datasets/movielens/) v obdobju **1995-2016**.\n",
"\n",
"Iste podatke boste uporabili v vseh nalogah, zato jih dodobra spoznajte. Gre za podatkovno zbirko za\n",
"vrednotenje priporočilnih sistemov, ki vsebuje gledalce ter njihove ocene za posamezni film na lestvici 1 do 5. \n",
"Poleg osnovne matrike uporabnikov in ocen vsebuje še dodatne podatke o filmih (npr. žanr, datum, oznake,\n",
"igralci).\n",
"\n",
"Podatki so v mapi `./podatki/ml-latest-small`. Podatkovna zbirka vsebuje naslednje datoteke:\n",
"\n",
"* ratings.csv: podatki o uporabnikih in ocenah,\n",
"* movies.csv: podatki o žanrih filmov,\n",
"* cast.csv: podatki o igralcih,\n",
"* tags.csv: podatki o oznakah (ang. \\emph{tags}),\n",
"* links.csv: povezave na sorodne podatkovne zbirke.\n",
"\n",
"\n",
"Pred pričetkom reševanja naloge si dobro oglejte podatke in datoteko **README.txt**. Podrobnosti o zbirki lahko preberete na [spletni strani](http://files.grouplens.org/datasets/movielens/ml-latest-small-README.html).\n",
"\n",
"Pripravite metode za nalaganje podatkov v ustrezne podatkovne strukture. Te vam bodo prišle\n",
"prav tudi pri nadaljnjih nalogah.\n",
"Bodite pozorni na velikost podatkov."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"Zapišite kodo za branje datotek in pripravo ustreznih matrik (in drugih struktur) podatkov, ki jih boste uporabi pri odgovarjanju na spodnja vprašanja.\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:28.566485Z",
"start_time": "2025-04-05T14:29:27.852608Z"
}
},
"cell_type": "code",
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"ratings = pd.read_csv('./podatki/ml-latest-small/ratings.csv')\n",
"movies = pd.read_csv('./podatki/ml-latest-small/movies.csv')\n",
"cast = pd.read_csv('./podatki/ml-latest-small/cast.csv')\n",
"\n",
"ratings['timestamp'] = pd.to_datetime(ratings['timestamp'], unit='s')"
],
"outputs": [],
"execution_count": 1
},
{
"metadata": {
"lang": "sl"
},
"cell_type": "markdown",
"source": [
"### Vprašanja\n",
"\n",
"Glavni namen podatkovnega rudarjenja je *odkrivanje znanj iz podatkov*,\n",
"torej odgovarjanje na vprašanja z uporabo računskih postopkov.\n",
"\n",
"Z uporabo principov, ki ste jih spoznali na vajah in predavanjih, odgovorite na\n",
"spodnja vprašanja. Pri vsakem vprašanju dobro premislite, na kakšen način boste\n",
"najbolje podali, prikazali oz. utemeljili odgovor. Bistven del so odgovori na\n",
"vprašanja in ne implementacija vaše rešitve."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1. vprašanje (15%):\n",
"Kateri filmi so v povprečju najbolje ocenjeni? Pripravite seznam\n",
"filmov ter njihovih povprečnih ocen in izpišite 10 filmov z vrha seznama.\n",
"Opazite pri takem ocenjevanju kakšno težavo? Kako bi jo lahko rešili? Kakšni so\n",
"rezultati tedaj?\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:28.595228Z",
"start_time": "2025-04-05T14:29:28.575470Z"
}
},
"source": [
"average_ratings = ratings.groupby(['movieId'])['rating'].mean().reset_index()\n",
"\n",
"sorted_ratings = average_ratings.sort_values(by='rating', ascending=False)\n",
"\n",
"sorted_ratings.merge(movies, on='movieId').head(10)"
],
"outputs": [
{
"data": {
"text/plain": [
" movieId rating title \\\n",
"0 163949 5.0 The Beatles: Eight Days a Week - The Touring Y... \n",
"1 71180 5.0 Padre padrone (1977) \n",
"2 51471 5.0 Amazing Grace (2006) \n",
"3 52617 5.0 Woman on the Beach (Haebyeonui yeoin) (2006) \n",
"4 53887 5.0 O Lucky Man! (1973) \n",
"5 54251 5.0 Dorian Blues (2004) \n",
"6 54328 5.0 My Best Friend (Mon meilleur ami) (2006) \n",
"7 55555 5.0 Edge of Heaven, The (Auf der anderen Seite) (2... \n",
"8 56869 5.0 Drained (O cheiro do Ralo) (2006) \n",
"9 57038 5.0 To the Left of the Father (Lavoura Arcaica) (2... \n",
"\n",
" genres \n",
"0 Documentary \n",
"1 Drama \n",
"2 Drama|Romance \n",
"3 Comedy|Drama \n",
"4 Comedy|Drama|Fantasy|Musical \n",
"5 Comedy \n",
"6 Comedy \n",
"7 Drama \n",
"8 Comedy \n",
"9 Drama "
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>movieId</th>\n",
" <th>rating</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>163949</td>\n",
" <td>5.0</td>\n",
" <td>The Beatles: Eight Days a Week - The Touring Y...</td>\n",
" <td>Documentary</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>71180</td>\n",
" <td>5.0</td>\n",
" <td>Padre padrone (1977)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>51471</td>\n",
" <td>5.0</td>\n",
" <td>Amazing Grace (2006)</td>\n",
" <td>Drama|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>52617</td>\n",
" <td>5.0</td>\n",
" <td>Woman on the Beach (Haebyeonui yeoin) (2006)</td>\n",
" <td>Comedy|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>53887</td>\n",
" <td>5.0</td>\n",
" <td>O Lucky Man! (1973)</td>\n",
" <td>Comedy|Drama|Fantasy|Musical</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>54251</td>\n",
" <td>5.0</td>\n",
" <td>Dorian Blues (2004)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>54328</td>\n",
" <td>5.0</td>\n",
" <td>My Best Friend (Mon meilleur ami) (2006)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>55555</td>\n",
" <td>5.0</td>\n",
" <td>Edge of Heaven, The (Auf der anderen Seite) (2...</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>56869</td>\n",
" <td>5.0</td>\n",
" <td>Drained (O cheiro do Ralo) (2006)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>57038</td>\n",
" <td>5.0</td>\n",
" <td>To the Left of the Father (Lavoura Arcaica) (2...</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 2
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Izpisani so filmi z oceno 5.0, ki imajo zelo malo ocen. To lahko rešimo s filtrom, ki ne upošteva filmov s premalo ocenami. Po uporabi filtra so filmi, ki so izpisani dobro poznani.**"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:28.781014Z",
"start_time": "2025-04-05T14:29:28.761913Z"
}
},
"cell_type": "code",
"source": [
"minimum_ratings = 50\n",
"\n",
"ratings_count = ratings.groupby('movieId')['rating'].count().reset_index()\n",
"\n",
"popular_ratings = ratings_count[ratings_count['rating'] >= minimum_ratings]\n",
"\n",
"filtered_ratings = ratings[ratings['movieId'].isin(popular_ratings['movieId'])]\n",
"\n",
"average_ratings = filtered_ratings.groupby(['movieId'])['rating'].mean().reset_index()\n",
"\n",
"sorted_ratings = average_ratings.sort_values(by='rating', ascending=False)\n",
"\n",
"sorted_ratings.merge(movies, on='movieId').head(10)"
],
"outputs": [
{
"data": {
"text/plain": [
" movieId rating title \\\n",
"0 858 4.487500 Godfather, The (1972) \n",
"1 318 4.487138 Shawshank Redemption, The (1994) \n",
"2 969 4.420000 African Queen, The (1951) \n",
"3 913 4.387097 Maltese Falcon, The (1941) \n",
"4 1221 4.385185 Godfather: Part II, The (1974) \n",
"5 50 4.370647 Usual Suspects, The (1995) \n",
"6 1228 4.350000 Raging Bull (1980) \n",
"7 1252 4.335526 Chinatown (1974) \n",
"8 904 4.315217 Rear Window (1954) \n",
"9 1203 4.304054 12 Angry Men (1957) \n",
"\n",
" genres \n",
"0 Crime|Drama \n",
"1 Crime|Drama \n",
"2 Adventure|Comedy|Romance|War \n",
"3 Film-Noir|Mystery \n",
"4 Crime|Drama \n",
"5 Crime|Mystery|Thriller \n",
"6 Drama \n",
"7 Crime|Film-Noir|Mystery|Thriller \n",
"8 Mystery|Thriller \n",
"9 Drama "
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>movieId</th>\n",
" <th>rating</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>858</td>\n",
" <td>4.487500</td>\n",
" <td>Godfather, The (1972)</td>\n",
" <td>Crime|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>318</td>\n",
" <td>4.487138</td>\n",
" <td>Shawshank Redemption, The (1994)</td>\n",
" <td>Crime|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>969</td>\n",
" <td>4.420000</td>\n",
" <td>African Queen, The (1951)</td>\n",
" <td>Adventure|Comedy|Romance|War</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>913</td>\n",
" <td>4.387097</td>\n",
" <td>Maltese Falcon, The (1941)</td>\n",
" <td>Film-Noir|Mystery</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1221</td>\n",
" <td>4.385185</td>\n",
" <td>Godfather: Part II, The (1974)</td>\n",
" <td>Crime|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>50</td>\n",
" <td>4.370647</td>\n",
" <td>Usual Suspects, The (1995)</td>\n",
" <td>Crime|Mystery|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>1228</td>\n",
" <td>4.350000</td>\n",
" <td>Raging Bull (1980)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>1252</td>\n",
" <td>4.335526</td>\n",
" <td>Chinatown (1974)</td>\n",
" <td>Crime|Film-Noir|Mystery|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>904</td>\n",
" <td>4.315217</td>\n",
" <td>Rear Window (1954)</td>\n",
" <td>Mystery|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>1203</td>\n",
" <td>4.304054</td>\n",
" <td>12 Angry Men (1957)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2. vprašanje (15%):\n",
"Posamezni film pripada enemu ali več žanrom. \n",
"Koliko je vseh žanrov? Prikaži porazdelitev žanrov z uporabo ustrezne\n",
"vizualizacije.\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:29.076125Z",
"start_time": "2025-04-05T14:29:28.895988Z"
}
},
"cell_type": "code",
"source": [
"genres = movies['genres'].str.split('|').explode()\n",
"genre_counts = genres.value_counts()\n",
"\n",
"genre_counts.plot.bar(\n",
" title='Porazdelitev žanrov filmov',\n",
" xlabel='Žanr',\n",
" ylabel='Število filmov',\n",
")"
],
"outputs": [
{
"data": {
"text/plain": [
"<Axes: title={'center': 'Porazdelitev žanrov filmov'}, xlabel='Žanr', ylabel='Število filmov'>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAIzCAYAAADhxwYjAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbJZJREFUeJzt3Qm8jOX///HLvi8hS1GUspaifSVbQmjVgtCOwjeihVCRSil8K30LLV/SoiLJHhEiJVuIiFDJmt39f7yv/++e75w5czjnzDXnzDn36/l4jHPOPWPue2buue/PfV2f63Pl8DzPMwAAAAGWM7M3AAAAILMREAEAgMAjIAIAAIFHQAQAAAKPgAgAAAQeAREAAAg8AiIAABB4BEQAACDwCIgABN6rr75q1q5da3/fs2ePGTBggNm/f39mbxaADERABOC4NmzYYHLkyGFGjRqV5v87a9Ys+3/103fXXXeZihUrmkSigv0dOnSwP3v16mWDowIFCpjsbO/evebuu+82ZcuWtZ9R165do37WTz31lF0GZHcEREAc6ISik4h/y58/vzn77LNN586dzbZt2zJ78xLKP//8Y0+64UFTRnvwwQfNH3/8YQOEd955xwwcONBkd88++6zdTx944AH7mtu0aZPZmwRkqtyZu3oge+vfv7+pVKmSOXDggJk7d67597//bb744gvz008/mYIFC5ogGjlypDl27FiSgKhfv37297p162bKNuXOndsMGTLEXHfddfYzO+WUU0x2N2PGDHPJJZeYvn37hpaphUxdhXny5MnUbQMyAwEREEdNmjQxF1xwgf1drQ8lS5a0J95PP/3U3Hbbbel+Xp24FGRlxW6dRD3Z6rPKzLmuM/oz3b59u6levXqSZX5rJhBEdJkBGeiaa66xP9evX29/HjlyxCbwnnnmmSZfvnw2t+axxx4zBw8eTPL/tLxZs2ZmypQpNsDSSfP111+397399tv2eUuXLm2fQyc5tUSF8/NAot2U0+PbuXOn/btYsWKmePHipl27dnZZNKtWrTI33XSTKVGihD2Jars+++yzE74H4TlEylk5+eST7e9qJfK3Sdub2vV899139v+MHj062br0fum+iRMnprg92paU3hu/G+/XX3+13WpVqlSx770C25tvvtluf7Su0m+++cZ0797dvrZChQqZVq1a2S651H6mv/zyi31+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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 4
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Odgovor: **Vseh žanrov je 19.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 3. vprašanje (20%):\n",
"Število ocen (ogledov) se za posamezni film razlikuje. Ali\n",
"obstaja povezava med gledanostjo in povprečno oceno filma? Opišite postopek, ki\n",
"ste ga uporabili pri odgovarjanju na vprašanje.\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:29.298337Z",
"start_time": "2025-04-05T14:29:29.159887Z"
}
},
"source": [
"average_ratings = ratings.groupby('movieId').agg(\n",
" count=('movieId', 'count'),\n",
" rating=('rating', 'mean'),\n",
")\n",
"\n",
"average_ratings.plot.scatter(\n",
" 'rating', 'count',\n",
" title='Povezava med številom ocen in povprečno oceno filma',\n",
" xlabel='Povprečna ocena',\n",
" ylabel='Število ocen',\n",
")\n",
"\n",
"correlation = average_ratings['count'].corr(average_ratings['rating'])\n",
"\n",
"print(f'Korelacija med številom ocen in povprečno oceno je {correlation}')"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Korelacija med številom ocen in povprečno oceno je 0.13082726621823262\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAHICAYAAACoOCtxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAeAJJREFUeJztnQec03T/x7/HsTnujr333ggCshSQIYqIoo8iCiLiXwV8FHDgoyIuUHEiiBNRQVQUVJyogDKUPWVvZCPcwbG5/l+fH6amvbRN2rRN28/79SpHkzT5JU2TT74zyeVyuYQQQgghJE7JFe0BEEIIIYSEE4odQgghhMQ1FDuEEEIIiWsodgghhBAS11DsEEIIISSuodghhBBCSFxDsUMIIYSQuIZihxBCCCFxDcUOITbz4Ycfyh9//KH+f/z4cXn66afl5MmT0R4WIY5g4cKF8vHHH7vfv//++7Js2bKojonEPxQ7hJhg+/btkpSUpC7MgahcubJcf/31cujQIbn77rvV3wIFCkRknEZjue2229zv58yZo/YDf0nwtGvXTr2IderWrSsPP/yw/PzzzzJ9+nR55plnpHbt2tEeVtyxadMm6dy5s6Slpanf/IwZM9T1C//H9SzRzuXc0R5AvIKTql+/fu73+fLlk4oVK6qT77HHHpNSpUpFdXwkfLRt21auueYaad26tZw7d05Wr17tMf/bb7+VRYsWyRNPPBG1MRISLXDzfeONN6R3795y9uxZJXgKFiwY7WHFHX379pVt27YpMZmeni4XX3yx/PTTT5KoUOyEmSeffFKqVKkip06dknnz5qkfOW52a9as4Q88jhk9erSULFlSunbtmuN7xvc/bty4iIidDRs2SK5cNODazY8//hjtIcQ0V155pTz11FOSN29eufTSS6M9nLgDbnO4C//3v//JoEGD3NNvvfVWuemmm9TDd6JBsRNmcLODogZ33HGHFCtWTF566SX58ssvpVevXtEeHgkTKSkp8vjjj0d7GAl5UYsEuEkTkaysLClUqFBQnx0wYIDt4yEXOHjwoPoLi46e5ORk9UpE+MgXYTp06KD+wrwI4ObAE061atXUjQkxFo888oicPn3a/Zlu3bpJ1apVDdfXsmVLt5jS+Oijj6Rp06YqTqRo0aJKye/atcs9X/PbGr30vtuJEyeq8cJCgbHB1w7LlB4rYzOzPl8g7gQCYufOnWqb+H+5cuWUhQTAVYR148JbqVIlmTJlSo51HD16VO677z6pUKGC2n716tXlueeek+zs7BzLYXswt+NiAXMwppkBZvmRI0dKjRo1JH/+/ErctmnTRmbNmuXeD23M+uOugbG88sorUq9ePfV5uDv/7//+T44cORLUMfeO2fHFZ5995j5nihcvLrfccov89ddftn8Hvm6YQ4cOdX8vtWrVkjFjxojL5cqxLM7t5s2bK2tZkSJFlFXA28ry3XffKVcixlG4cGG56qqrZO3atYb7gn3s0aOH+n+JEiVk2LBhcv78+YBj9o5z0GKhPv30U+U2KF++vPr+Lr/8ctm8eXPA9cHKh8+vX79e/vOf/0hqaqo6d/773/8qq7Aeu68Z2C6e/idPnqyOPcaNc+HXX381HOOff/4pN998szr+OLfNXnc0ELwPyw4+j++oYcOG8uqrrwb13Vg5d4I974H2vWAcWBbbgdVEDz53++23q98sxoLf8HvvveexjNXzxOz4vL8n/P7AAw88oLZXuXJl9d4oZscb/RhxLcNvHL8jxCFmZGSo8wzXUVzH8d0gXEN/7oV6rQ8bLhIWJk6ciF+ba/HixR7TX331VTV9woQJ6n3fvn3V++uvv941btw4V58+fdT7Hj16uD/zwQcfqGmLFi3yWNf27dvV9BdeeME97emnn3YlJSW5brzxRtf48eNdI0eOdBUvXtxVuXJl15EjR9QyW7ZscX344YceL3wO67rhhhvc62rWrJnrtttuc7388suusWPHujp37qyWef3114Mam5n1+QLHKX/+/K66deu67rrrLnWsWrVqpT6PY122bFnXAw88oNZbr149V3Jysmvr1q3uz2dlZbkaNmzoKlasmOuRRx5Rxx/HGsfqv//9r3u57Oxs16WXXurKlSuX65577lHr69Chg/qsti1/YN1Y54ABA1xvv/2268UXX3T16tXLNXr0aDV/wYIFrk6dOql16Y+/xh133OHKnTu3+jzG+NBDD7kKFSqkjt2ZM2csH/NKlSqpY6cxe/ZstQz+ep+r2Aa+m4cffthVoEABj3PGju/ACBxvHF8cM+w7zoWrr75arfO+++7zWPaJJ55Q07FN7CN+SzfffLM6Rho4NljXFVdcocbx3HPPqf1IT093bdu2Lce+YJy3336764033nD17NlTrR+/m0Bcdtll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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 5
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Povezava med gledanostjo in povprečno oceno je zelo šibka. Pri odgovoru sem izračunal Pearsonovo korelacijo med številom ocen in povprečno oceno.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 4. vprašanje (30%):\n",
"Vsaka ocena je bila vnešena na določen datum (stolpec\n",
"*timestamp*). Ali se popularnost posameznih filmov s časom spreminja?\n",
"Problem reši tako, da za dani film ocene razporediš po času ter v vsaku časovni\n",
"točki izračunaš povprečje za zadnjih 30, 50, ali 100 ocen. Nariši graf, kako se\n",
"ocena spreminja in ga prikaži za dva zanimiva primera filmov.\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:29.499045Z",
"start_time": "2025-04-05T14:29:29.348339Z"
}
},
"cell_type": "code",
"source": [
"window_sizes = [30, 50, 100]\n",
"\n",
"def rating_history(movie_id):\n",
" movie_ratings = ratings[ratings['movieId'] == movie_id].sort_values(by='timestamp')\n",
"\n",
" for window in window_sizes:\n",
" plt.plot(\n",
" movie_ratings['timestamp'],\n",
" movie_ratings['rating'].rolling(window=window).mean(),\n",
" label=f'Povprečje zadnjih {window} ocen',\n",
" )\n",
"\n",
" plt.title(movies[movies['movieId'] == movie_id]['title'].values[0])\n",
" plt.xlabel('Datum')\n",
" plt.xticks(rotation=90)\n",
" plt.ylabel('Ocena')\n",
" plt.grid(True)\n",
" plt.legend()\n",
" plt.show()\n",
"\n",
"rating_history(858)\n",
"rating_history(318)"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHcCAYAAAAqQ4tyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAA1UFJREFUeJzsnQWYW2X2xt9k3Gc67XTq7qVGqZcCFaBQYHFnscX1zyKLLSy6wLK4y+JOkbaUKi0tFeru3pGOuyX5P+93c2OTzGRmMhOZ8+MJ8Zt7k3S+N+e85xyDxWKxQBAEQRAEIUQw+nsHBEEQBEEQfImIG0EQBEEQQgoRN4IgCIIghBQibgRBEARBCClE3AiCIAiCEFKIuBEEQRAEIaQQcSMIgiAIQkgh4kYQBEEQhJBCxI0gCIIgCCGFiBtBCEH++c9/wmAwON1WU1ODe++9F126dIHRaMQ555zj09fKyclBsML9v/XWW1vktUpKSpCWloZPP/0UwcYvv/yC+Ph4HDt2zN+7Igh1IuJGEFqIffv2qQW0b9++iI2NVaeBAwfilltuwcaNG5v99d9//30899xzOP/88/G///0Pd911V4Oe/9RTT2HmzJkIBk466SQlWOo7UZi1NC+99BISEhJw8cUX227LyMjA/fffj5NPPlndx31bvHix2+dXV1fjscceQ8+ePREVFaXOn3jiCSVeHfnrX/9a57EfOXJEPa6srAyvvfYapk2bhg4dOqjXHz58ON544w2YTCanbZ522mno3bs3nn766WZ5bwTBV4T7bEuCIHjk559/xkUXXYTw8HBcdtllGDp0qIqebN++Hd99951aSCh+unXr1mz7sHDhQnTq1Akvvvhio55PcUNh5KuIT3Py4IMP4rrrrrNdX716NV5++WX84x//wIABA2y3DxkypEX3i8KE4obCMiwszHb7jh078Oyzz6JPnz447rjj8Mcff3jcxuWXX46vv/4a11xzDUaOHIkVK1bg4YcfxsGDB/H222/bHnfDDTdgypQpTs/lKMEbb7wR3bt3V98FsnfvXtx2222YPHky7r77biQmJmLu3Lm4+eab1bYphB3hdu+55x4lsCiEBCEg4eBMQRCaj927d1vi4uIsAwYMsBw9erTW/dXV1ZaXXnrJcvDgQZ+95qOPPsqBuE63nXzyyZZBgwY1eps8hquuusrjax07dszSnJSWljb6uV9//bXax0WLFrm9n/fdcsstlubmu+++U6/F74QjRUVFltzc3Hr3ddWqVeq+hx9+2On2//u//7MYDAbLhg0b6nz9pUuXquc/+eSTttv4uW3evLnWY6+++mr12F27djndnpWVZQkLC7O89957Xh61ILQ8kpYShGbm3//+N0pLS/HBBx+osL8rjObcfvvtygvjGmmZOHEi4uLikJycjLPPPhvbtm2r9fzff/8dJ5xwAqKjo9GrVy+89dZbTvfv379fpSEWLVqELVu22NISetrj+eefx7hx45CamoqYmBgcf/zx+Oabb5y2wcfzGPgrXn8+0x6OFBQUqNu4r0lJSbj66qtVysOVTz75RL0GX6tNmzYqPXPo0KFaaaXBgwdjzZo1OPHEE1UKj1GX5oZpN74u0z2DBg1SHhNXmM5h1KR9+/a2xzHl5+32GTXh5+QIIyB8L+pj6dKl6twxpaVfp0b78ssv63z+Z599pj67Sy+91HZb27Zt1TG48pe//EWdu37n6BdixOuHH36od38FwV9IWkoQWiAlRZ/C6NGjvX7O/Pnzcfrppys/BX0h5eXleOWVVzB+/HisXbtWLZBk06ZNyivRrl079Tj6Lh599FG18Orwvo8//hhPPvmkMrPqfgk9PcM0yVlnnaXSZVVVVfjiiy9wwQUXqP0+44wz1GP4fKZ5Ro0ahb/97W/qNtcF+sILL0SPHj3U9rmP7777rloImW7R4T4whcLHcns0pvK4KGDWrVunhJFObm6ueg+4cDMV43hMzQFFIlOETMdQbDCNdd5556l0D4UfycrKwpgxY2wGZL63c+bMwbXXXouioiLceeeddb7G8uXLMWLEiEbvY2VlpTqnMHSE4o9QDNaVEvvqq6+UkNW/P3WRmZlpEz+uUJwGi/9KaKX4IVokCK2GwsJCFdo/55xzat2Xn5+vUgL6qayszHbfsGHDLGlpabZUBWHKwWg0Wq688krbbdxudHS05cCBA7bbtm7dqtIGrv+8J02a5DYt5fi6pKqqyjJ48GDLKaec0qC01DXXXON0+1/+8hdLamqq7fr+/fvVfjmmRMimTZss4eHhTrdzX7nNN9980+ILvElLRUZGOqWL+H7z9ldeecV227XXXmvp0KGDJScnx+n5F198sSUpKanWe+mafmTqiCmkxu7rt99+q+77+OOPnW7n+8Tb+bl54qefflKPef311y31UVlZaRk4cKClR48ear9deeqpp9S2mKIShEBE0lKC0Izw1zxh+awrTL3wl79+YsWKXjmzfv16leJxTFUwFTB16lTMnj1bXWclC42fNPh27drV9jhGZE499VSv99ExCpCfn4/CwkKVDmP0pSHQqOoIt8Hoi/4eMCpiNptV1IZl4/opPT1dGWmZNnOEKR+mtloKmm8do1F8v2mupeGWUAN9++23mDFjhrrseAx8v/m+1fWe5eXlqeelpKQ0eh+nT5+uTOc09PL9PHDggIrG0EDN9CYjfHWlpCIiItT7Xx+MSm3duhWvvvqq2q4r+jEEc/m/ENpIWkoQmhG9moTpIFfojSkuLlapDqZddLhgkX79+tV6DoULBQ39L3wuFzMKA1f4XF0E1QfTTywlpqDS0x7EtU9OfTgKLMcFkIKJImHXrl1qcXe3v4QLryOs5omMjERL4br/+jFw/wlTaPQVsSLJsSrJkezs7HpfRwsUNQ76qmbNmqUEClNmugikr4spP3ciWv/+0SNDEaan2DzBdgHvvPMO/vWvfykxVdcxNPQ7IggthYgbQWhGaKyliXjz5s217tM9ODT8+gsaVOm3oefl9ddfV/tKkUHzM3/pNwTH0mZ3CyGjNlwM6VFx91jXhdnVV9LceLP/hEL0qquucvvYukrLGYXj8etiqbHQ/MvvEyMr3BZ7JfG9Ynn5pEmT3D6H/hiau+mrqosPP/wQ9913n4rCPfTQQx4fpx+DOz+OIAQCIm4EoZmhKZfm2lWrVilDbn3ovW7Y+8QV9sXhgsIKKv6K56LGiIgr7p7rDqZZuB1GgxgB0KG4caWpv9KZ8qFQoOmYjQyDDaYOGYljOtC1f4w3ML3D94D9jJoKPwvHCidG6Si+PO0XuyFTPFLIeoKRHZq8zz33XFuK1BM8Bn4P+Z4IQiAinhtBaGY48oDVLCwfZgqqvjQFoyfDhg1TZddMg+jw1/qvv/5qSxUw0sA0A3+Vs6JHh6W7FCvewG1woXTsRMtIkrtKGAoqx/1pKFw0+Xps/uZ6zLxOf04gw31nKoiC0F0kzpuRBGPHjsWff/7p0/1iapIVaPzeXHLJJW73i9V3LO3Wq6pcWbJkiapKYwSPQogNJuuCVVk8FkEIVCRyIwjNDD0mTPFw4aEXRu9QzAWdv4B5HxeTzp07O/keWAbNBYRlxnopONNcjiMDKBTYi4XmXZYwsxScj+Ovem9GOjCq9J///Ee11WfvE3pG+Kudpeuuz2f5LxdJPr5jx44qAtOQ8nZGLejteeCBB5SAohGakRC+B99//70qMadRtj6YOqHRmNEl1147zc0zzzyjjM887uuvv16lhGgUppGY7w0v1wV7FbGsfufOnbWiV3xvCHsRET6O5enEMUVEvw3ff742zdrssUPTM7047joGs/cNvxeeUlL0eDGiQ5HLDtTsfuyaanNMt/E7wu8Gx4YIQsDi73ItQWgtsMz4pptusvTu3VuVb8fExFj69+9vufHGGy3r16+v9fj58+dbxo8frx6XmJhomTFjhirzduW3336zHH/88aqUuWfPnqos2F2HYk+l4Ow026dPH0tUVJTanw8++MDt87dv32458cQT1f7wPr0s3FOHYm6Ht+/bt69WOfOECRNUaTlPfE12B96xY0e9+0pYms3t/vLLL5bm7lDcrVu3WuXvLH/mY7t06WKJiIiwpKenWyZPnmx5++23vSqxbtu2reVf//qX233wdHLk2WefVe8Zv0MpKSmWs846y7Ju3TqPrzlmzBjVVqCmpsbt/XxP6nptfr6OvPHGG5bY2FjVVVkQAhUD/+dvgSUIguAtjFww8kMPUzDCKiRGneiV8mRiDmQ4VJNtDBo7o0wQWgLx3AiCEDTwtxjHRugpnGCEVU0szWYn6GCDKVCKMqYWBSGQkciNIAiCIAghhURuBEEQBEEIKUTcCIIgCIIQUoi4EQRBEAQhpBBxIwiCIAhCSNHqmvixRfnRo0dVsysZ+iYIgiAIwQHrnzgwmE0s6+ui3erEDYVNly5d/L0bgiAIgiA0gkOHDjl1dHdHqxM3entyvjmJiYk+2251dbWa+zNt2jQ1VTmUCNVjk+MKPkL12OS4gotQPa5APzaOG2Fwwt2YkYAVN5zZwsZQd9xxB/773/96fBzve+ONN9SgQE6l5SyUp59+Wk029gY9FUVh42txw6F03GagfSGaSqgemxxX8BGqxybHFVyE6nEFy7F5YykJCHGzevVqvPXWW07D2dzBAYP333+/GhQ3btw4NXyOg/N4oBzmJwiCIAiC4PdqKbYh57Tad955BykpKXU+dvny5Rg/fryaXty9e3cVNuOk5WCdMSMIgiAIgu/xe+TmlltuwRlnnIEpU6bUOy+G0ZpPPvlEiZlRo0Zh7969mD17Nq644gqPz6msrFQnx5ydHnrjyVfo2/LlNgOFUD02Oa7gI1SPTY4ruAjV4wr0Y2vIPvl1thQHxz355JMqLUXPDCfNDhs2rE7Pzcsvv4x77rlHlYTV1NTgxhtvVB4cT/zzn//EY4895jbFxbyiIAihS3i433+/CYLQALiue6KLine truncated
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHcCAYAAAAqQ4tyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAA98BJREFUeJzsnQV8G+X/xz/Ruq+duxsbAwYTBmMCDHd3d7cf7s4P/gyG/3B3xhzmG2Pu7lJZ3dvY//V5Lpdc0iRN2rRN2+e9V9bI5XJ57nLP576qczgcDkgkEolEIpG0EPRNvQESiUQikUgk4USKG4lEIpFIJC0KKW4kEolEIpG0KKS4kUgkEolE0qKQ4kYikUgkEkmLQoobiUQikUgkLQopbiQSiUQikbQopLiRSCQSiUTSopDiRiKRSCQSSYtCihtJs0Cn0+H2229Hc6Apt7Vbt244/fTTEemceOKJ4tZcufrqq8VYN8ftjo+Pb7TPu/XWWzFhwgQ0N/Ly8hAXF4dp06Y19aZI6ogUN5ImZf369Tj//PPRtWtXREdHo2PHjuJk+Pbbbzf1prU6KDYozNRbTEwMjjjiCLz55puw2+1obRw6dAhPPfUU1qxZg0jl008/9dhn/m5NIcR2796Njz76CP/5z388np8yZQouuOACdOnSRWwbBZc/Zs+ejdGjRyM2NhYpKSniXLFnz54ay5WWluLuu+9Gp06dEBUVhf79+4vPqY0bbrhBbIP3BUFaWhquv/56PP744yF9Z0nkYGzqDZC0XpYsWYKxY8eKkxxPMu3atcP+/fvxzz//4K233sIdd9zR1JvY6uDk8OKLL4r7ubm5+Prrr3HPPffg8OHDeP7559HaxM3TTz8thMHQoUM9Xvvwww8jQvCNGTMGX3zxhcdznJSHDx+OG2+80fVcY1prVPgb7t69u/iNa3n55ZdRUlIitjEzM9Pv+6dOnYqzzjoLw4YNw0svvYTi4mKxToqd1atXIz09XSxns9lw8sknY8WKFbjtttvQu3dvzJw5U1iNCgoKaogrFS5PcciLKl/cfPPN+L//+z/8/fffOOmkk+o1FpImgI0zJZKmYNKkSY709HRHQUFBjdeys7M9HvNQve222xzNgabc1q5duzpOO+20Or33hBNOcAwcONDjuYqKCrHOhIQEh9VqDdNWKp/FWySzfPlysS//97//OZoTcXFxjquuusrna3yerzc01dXVjjZt2jgee+yxGq/t2bPHYbfba93WAQMGOHr16uWoqqpyPbdmzRqHXq933Hvvva7nvv/+e7GfPv74Y4/3n3feeY7o6Oga5xLCzx8xYoTj2muvDfibGTRokOOKK64I4ZtLIgXplpI0GTt37sTAgQORnJxc47WMjAyf7/n1118xaNAgYXrme2fMmOHx+t69e8UVW9++fYVbheZlmsC1puzCwkIYDAZxVaZCK4VerxfLK/pE4ZZbbhEWJZXt27fjvPPOE8/xio+WjosvvhhFRUUNsq1a18PixYtx7733iitWxgOcc845wqJSG5999hmMRiMeeOABhAq/4zHHHCOutHNycjxe+/LLL3HUUUeJbU9NTRXjQMubNx988AF69uwpluPV+sKFC31+VlVVFZ588kn06tVLjFnnzp3x4IMPiud9xTT98MMPGDBggFjviBEjhIuTvP/++2Id3Ha62rzHk89xv6xcuRIjR44U76eF4b333nMtM2/ePPG9yTXXXONy73Bf+Iu5KSsrw3333Se2m9vP/fraa695HE/a7a/t+GhIDh48iLPPPltYdHg83X///cICooWWKbokuW0cy7Zt2+Kmm24S1pDaWLRokfhNjR8/vsZrdEFzDAKRn5+PTZs2iWPcbDa7nh8yZIhwOX377beu59TjicefFj6urKzEb7/9VmP9tHZt2LChVmskXeR//PFHjX0oiXykuJE0GTzJcYLhSSYYeMKkGOBJ65VXXhEnLgoNBv+pLF++XLi7uAzFC03Lf/31l5jQysvLxTIUU5xUFixY4LFunnDVk6r2xHn88ceL+9XV1cL8TbcZXWbvvPOOMP3v2rVLCKaG2FYt/My1a9cKAUDRxZNubYHLFBacnB9++GG8+uqrqAsUBxwbrQjlpHDllVcKF8Abb7wh4h247XSTaMfi448/FhMixSDHYdSoUTjzzDNriCBOpHyeYuCMM84QMVecfP/73//ioosuqrFN3C8UEldddZWIi9m8ebOIm+A+4Vhy7Cnmli5dimuvvbbG+zlBT5o0SYgzbhdFKsf0k08+Ea9zAn3mmWfEfe5jToa88fv5gpMft5/be8opp4gxobjhNlCQehPM8dFQqG4cimmO9wknnIDXX39dHCtauN+4/dxndAfxOPrqq6/Eey0WS8DP4HHNY+bII4+s0zaqgpbC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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 6
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Odgovor: **Da, popularnost filmov se s časom spreminja, kar lahko vidimo pri filmu Godfather, ki mu popularnost pade in nato spet nekoliko naraste. Prav tako je zanimiv film Shawshank Redemption, ki mu ocena pade iz 4.7 in ostane približno 4.4.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 5. vprašanje (20%):\n",
"Kako bi ocenili popularnost posameznih igralcev? Opišite postopek\n",
"ocenitve ter izpišite 10 najbolj popularnih igralcev.\n",
"\n",
"Kodo lahko razdelite v več celic."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-05T14:29:29.590481Z",
"start_time": "2025-04-05T14:29:29.503188Z"
}
},
"source": [
"split_cast = cast.copy()\n",
"\n",
"split_cast['cast'] = split_cast['cast'].str.strip('|').str.split('|')\n",
"\n",
"movie_ratings = ratings.groupby(['movieId'])['rating'].mean().reset_index()\n",
"\n",
"cast_ratings = split_cast.explode('cast').merge(movie_ratings, on='movieId')\n",
"\n",
"actor_popularity = cast_ratings.groupby('cast').agg(\n",
" movie_count=('movieId', 'nunique'),\n",
" rating=('rating', 'mean'),\n",
").reset_index()\n",
"\n",
"actor_popularity['score'] = actor_popularity['movie_count'] * actor_popularity['rating']\n",
"\n",
"actor_popularity.sort_values(by='score', ascending=False).head(10)"
],
"outputs": [
{
"data": {
"text/plain": [
" cast movie_count rating score\n",
"44934 Robert De Niro 66 3.340872 220.497546\n",
"36804 Michael Caine 56 3.313227 185.540725\n",
"38514 Morgan Freeman 54 3.311041 178.796198\n",
"7007 Bruce Willis 56 3.071296 171.992554\n",
"9661 Christopher Walken 51 3.201777 163.290608\n",
"49726 Steve Buscemi 49 3.306117 161.999727\n",
"5528 Bill Murray 47 3.290502 154.653596\n",
"44278 Richard Jenkins 50 3.088702 154.435119\n",
"52217 Tom Hanks 45 3.382483 152.211715\n",
"1004 Alec Baldwin 47 3.192583 150.051396"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>cast</th>\n",
" <th>movie_count</th>\n",
" <th>rating</th>\n",
" <th>score</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>44934</th>\n",
" <td>Robert De Niro</td>\n",
" <td>66</td>\n",
" <td>3.340872</td>\n",
" <td>220.497546</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36804</th>\n",
" <td>Michael Caine</td>\n",
" <td>56</td>\n",
" <td>3.313227</td>\n",
" <td>185.540725</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38514</th>\n",
" <td>Morgan Freeman</td>\n",
" <td>54</td>\n",
" <td>3.311041</td>\n",
" <td>178.796198</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7007</th>\n",
" <td>Bruce Willis</td>\n",
" <td>56</td>\n",
" <td>3.071296</td>\n",
" <td>171.992554</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9661</th>\n",
" <td>Christopher Walken</td>\n",
" <td>51</td>\n",
" <td>3.201777</td>\n",
" <td>163.290608</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49726</th>\n",
" <td>Steve Buscemi</td>\n",
" <td>49</td>\n",
" <td>3.306117</td>\n",
" <td>161.999727</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5528</th>\n",
" <td>Bill Murray</td>\n",
" <td>47</td>\n",
" <td>3.290502</td>\n",
" <td>154.653596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44278</th>\n",
" <td>Richard Jenkins</td>\n",
" <td>50</td>\n",
" <td>3.088702</td>\n",
" <td>154.435119</td>\n",
" </tr>\n",
" <tr>\n",
" <th>52217</th>\n",
" <td>Tom Hanks</td>\n",
" <td>45</td>\n",
" <td>3.382483</td>\n",
" <td>152.211715</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1004</th>\n",
" <td>Alec Baldwin</td>\n",
" <td>47</td>\n",
" <td>3.192583</td>\n",
" <td>150.051396</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 7
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Popularnost posameznih igralcev bi ocenil s številom filmov, v katerih so igrali pomnoženo s povprečno oceno teh filmov.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### Bonus vprašanje (5%):\n",
"\n",
"Kateri je tvoj najljubši film? Zakaj?"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Moj najljubši film je Kako izuriti svojega zmaja. Ima zelo dobro zgodbo, ki jo spremlja izjemna glasbena podlaga in animacija.**"
}
],
"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.9"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"nbTranslate": {
"displayLangs": [
"sl"
],
"hotkey": "alt-t",
"langInMainMenu": true,
"sourceLang": "sl",
"targetLang": "en",
"useGoogleTranslate": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+831
View File
@@ -0,0 +1,831 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"## Iskanje strukture v podatkih\n",
"\n",
"Podatkovno rudarjenje, naloga, 13. april 2025\n",
"**Gašper Dobrovoljc**"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"Z modeliranjem skušamo poiskati strukturo v podatkih. Z metodami nenadzorovanga modeliranja skušamo poiskati skupine podobnih podatkov oz. skupine primerov.\n",
"\n",
"V nalogi boste uporabili modeliranje verjetnostnih porazdelitev za iskanje osamelcev ter metode za iskanje skupin podobnih primerov (gručenje)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Podatki\n",
"\n",
"Opis podatkovne zbirke MovieLens ostaja enak prvi nalogi."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:49.004377Z",
"start_time": "2025-04-13T19:29:48.481942Z"
}
},
"cell_type": "code",
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"ratings = pd.read_csv('./podatki/ml-latest-small/ratings.csv')\n",
"movies = pd.read_csv('./podatki/ml-latest-small/movies.csv')\n",
"\n",
"ratings['timestamp'] = pd.to_datetime(ratings['timestamp'], unit='s')"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Vprašanja\n",
"\n",
"Z uporabo principov, ki ste jih spoznali na vajah in predavanjih, odgovorite na\n",
"spodnja vprašanja. Pri vsakem vprašanju dobro premislite, na kakšen način boste\n",
"najbolje podali, prikazali oz. utemeljili odgovor. Bistven del so odgovori na\n",
"vprašanja in ne toliko implementacija vaše rešitve."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1. Iskanje osamelcev (50%) \n",
"O ocenah katerih filmov so si uporabniki najmanj enotni? Povedano drugače, za katere filme so pripadajoče ocene najbolj razpršene?\n",
"\n",
"Formuliraj problem kot modeliranje verjetnostne porazdelitve. Premisli o naslednjih vprašanjih, naredi ustrezne poizkuse in odgovori."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:49.021962Z",
"start_time": "2025-04-13T19:29:49.009148Z"
}
},
"cell_type": "code",
"source": [
"ratings_agg = ratings.groupby('movieId')['rating'].agg(['count', 'var'])\n",
"ratings_agg = ratings_agg[ratings_agg['count'] >= 5]\n",
"\n",
"ratings_agg.merge(movies, on='movieId').sort_values(by='var', ascending=False)"
],
"outputs": [
{
"data": {
"text/plain": [
" movieId count var \\\n",
"2042 3973 5 4.550000 \n",
"1305 2365 5 4.200000 \n",
"1428 2570 5 3.500000 \n",
"2515 6535 6 3.366667 \n",
"1993 3813 6 3.366667 \n",
"... ... ... ... \n",
"2167 4356 6 0.041667 \n",
"239 346 6 0.000000 \n",
"1348 2417 5 0.000000 \n",
"1510 2749 5 0.000000 \n",
"483 829 7 0.000000 \n",
"\n",
" title \\\n",
"2042 Book of Shadows: Blair Witch 2 (2000) \n",
"1305 King Kong vs. Godzilla (Kingukongu tai Gojira)... \n",
"1428 Walk on the Moon, A (1999) \n",
"2515 Legally Blonde 2: Red, White & Blonde (2003) \n",
"1993 Interiors (1978) \n",
"... ... \n",
"2167 Gentlemen Prefer Blondes (1953) \n",
"239 Backbeat (1993) \n",
"1348 Heartburn (1986) \n",
"1510 Morning After, The (1986) \n",
"483 Joe's Apartment (1996) \n",
"\n",
" genres \n",
"2042 Crime|Horror|Mystery|Thriller \n",
"1305 Action|Sci-Fi \n",
"1428 Drama|Romance \n",
"2515 Comedy \n",
"1993 Drama \n",
"... ... \n",
"2167 Comedy|Musical|Romance \n",
"239 Drama|Musical \n",
"1348 Comedy|Drama \n",
"1510 Drama|Mystery \n",
"483 Comedy|Fantasy|Musical \n",
"\n",
"[3496 rows x 5 columns]"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>movieId</th>\n",
" <th>count</th>\n",
" <th>var</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2042</th>\n",
" <td>3973</td>\n",
" <td>5</td>\n",
" <td>4.550000</td>\n",
" <td>Book of Shadows: Blair Witch 2 (2000)</td>\n",
" <td>Crime|Horror|Mystery|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1305</th>\n",
" <td>2365</td>\n",
" <td>5</td>\n",
" <td>4.200000</td>\n",
" <td>King Kong vs. Godzilla (Kingukongu tai Gojira)...</td>\n",
" <td>Action|Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1428</th>\n",
" <td>2570</td>\n",
" <td>5</td>\n",
" <td>3.500000</td>\n",
" <td>Walk on the Moon, A (1999)</td>\n",
" <td>Drama|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2515</th>\n",
" <td>6535</td>\n",
" <td>6</td>\n",
" <td>3.366667</td>\n",
" <td>Legally Blonde 2: Red, White &amp; Blonde (2003)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1993</th>\n",
" <td>3813</td>\n",
" <td>6</td>\n",
" <td>3.366667</td>\n",
" <td>Interiors (1978)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2167</th>\n",
" <td>4356</td>\n",
" <td>6</td>\n",
" <td>0.041667</td>\n",
" <td>Gentlemen Prefer Blondes (1953)</td>\n",
" <td>Comedy|Musical|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>239</th>\n",
" <td>346</td>\n",
" <td>6</td>\n",
" <td>0.000000</td>\n",
" <td>Backbeat (1993)</td>\n",
" <td>Drama|Musical</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1348</th>\n",
" <td>2417</td>\n",
" <td>5</td>\n",
" <td>0.000000</td>\n",
" <td>Heartburn (1986)</td>\n",
" <td>Comedy|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1510</th>\n",
" <td>2749</td>\n",
" <td>5</td>\n",
" <td>0.000000</td>\n",
" <td>Morning After, The (1986)</td>\n",
" <td>Drama|Mystery</td>\n",
" </tr>\n",
" <tr>\n",
" <th>483</th>\n",
" <td>829</td>\n",
" <td>7</td>\n",
" <td>0.000000</td>\n",
" <td>Joe's Apartment (1996)</td>\n",
" <td>Comedy|Fantasy|Musical</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>3496 rows × 5 columns</p>\n",
"</div>"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 2
},
{
"metadata": {
"lang": "sl"
},
"cell_type": "markdown",
"source": [
"\n",
"Odgovor: **Za izračun razpršenosti ocen za določen film lahko uporabimo varianco.**"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1.1. vprašanje:\n",
"\n",
"Katera je ustrezna naključna spremenljivka (količina) v podatkih, ki odgovarja na vprašanje?"
]
},
{
"metadata": {
"lang": "sl"
},
"cell_type": "markdown",
"source": "Odgovor: **Ustrezna naključna spremenljivka je varianca ocen filma.**"
},
{
"metadata": {
"lang": "sl"
},
"cell_type": "markdown",
"source": [
"#### 1.2. vprašanje:\n",
"Nariši njeno porazdelitev, npr., s pomočjo histograma."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:49.178991Z",
"start_time": "2025-04-13T19:29:49.097436Z"
}
},
"cell_type": "code",
"source": [
"ratings_agg['var'].plot.hist(bins=50)\n",
"plt.title('Porazdelitev varianc ocen')\n",
"plt.xlabel('Varianca ocen')\n",
"plt.ylabel('Število filmov')\n",
"plt.show()"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 3
},
{
"metadata": {
"lang": "sl"
},
"cell_type": "markdown",
"source": [
"#### 1.3. vprašanje:\n",
"\n",
"Ali porazdelitev spominja na kakšno znano porazdelitev? Ali je porazdelitev morda normalna ali katera druga?"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Porazdelitev ni normalna, spominja na beta porazdelitev.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1.4. vprašanje:\n",
"\n",
"Oceni parametre te porazdelitve s pomočjo postopkov, ki smo jih spoznali na vajah. Izmed porazdelitev, ki smo jih spoznali na vajah, izberi tisto, ki se podatkom najbolj prilega. "
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:49.841898Z",
"start_time": "2025-04-13T19:29:49.230253Z"
}
},
"source": [
"from scipy.stats import beta, norm, t\n",
"epsilon = 1e-4\n",
"\n",
"normalized = np.clip(ratings_agg['var'] / 5.0, epsilon, 1 - epsilon)\n",
"interval = np.linspace(0, 1, 100)\n",
"\n",
"a, b, loc, scale = beta.fit(normalized, floc=0, fscale=1)\n",
"beta_pdf = beta.pdf(interval, a, b, loc=loc, scale=scale)\n",
"plt.plot(interval, beta_pdf, label='Beta porazdelitev')\n",
"print(f\"beta: a = {a:.4f}, b = {b:.4f}\")\n",
"\n",
"mean, std_dev = norm.fit(normalized)\n",
"norm_pdf = norm.pdf(interval, mean, std_dev)\n",
"plt.plot(interval, norm_pdf, label='Normalna porazdelitev')\n",
"\n",
"df, loc, scale = t.fit(normalized)\n",
"t_pdf = t.pdf(interval, df, loc=loc, scale=scale)\n",
"plt.plot(interval, t_pdf, label='Studentova porazdelitev')\n",
"\n",
"normalized.plot.hist(bins=50, density=True, label='')\n",
"plt.xlabel('Variance ocen')\n",
"plt.ylabel('Gostota verjetnosti')\n",
"plt.legend()\n",
"plt.show()"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"beta: a = 2.9284, b = 12.9440\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 4
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Od porazdelitev, ki smo jih spoznali na vajah, se najbolj prilega beta porazdelitev.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1.5. vprašanje:\n",
"\n",
"Izpiši filme z vrednostjo naključne spremenljivke, ki spada v zgornjih 5% statistično značilnih primerov. "
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:49.866278Z",
"start_time": "2025-04-13T19:29:49.859062Z"
}
},
"source": [
"threshold = ratings_agg['var'].quantile(0.95)\n",
"\n",
"ratings_agg[ratings_agg['var'] >= threshold].sort_values('var', ascending=False).merge(movies, on='movieId')"
],
"outputs": [
{
"data": {
"text/plain": [
" movieId count var \\\n",
"0 3973 5 4.550000 \n",
"1 2365 5 4.200000 \n",
"2 2570 5 3.500000 \n",
"3 3813 6 3.366667 \n",
"4 6535 6 3.366667 \n",
".. ... ... ... \n",
"172 1241 11 1.800000 \n",
"173 5530 6 1.800000 \n",
"174 3678 5 1.800000 \n",
"175 32596 5 1.800000 \n",
"176 5108 5 1.800000 \n",
"\n",
" title \\\n",
"0 Book of Shadows: Blair Witch 2 (2000) \n",
"1 King Kong vs. Godzilla (Kingukongu tai Gojira)... \n",
"2 Walk on the Moon, A (1999) \n",
"3 Interiors (1978) \n",
"4 Legally Blonde 2: Red, White & Blonde (2003) \n",
".. ... \n",
"172 Dead Alive (Braindead) (1992) \n",
"173 Simone (S1m0ne) (2002) \n",
"174 Man with the Golden Arm, The (1955) \n",
"175 Sahara (2005) \n",
"176 John Q (2002) \n",
"\n",
" genres \n",
"0 Crime|Horror|Mystery|Thriller \n",
"1 Action|Sci-Fi \n",
"2 Drama|Romance \n",
"3 Drama \n",
"4 Comedy \n",
".. ... \n",
"172 Comedy|Fantasy|Horror \n",
"173 Comedy|Drama|Fantasy|Sci-Fi \n",
"174 Drama \n",
"175 Action|Adventure|Comedy \n",
"176 Crime|Drama|Thriller \n",
"\n",
"[177 rows x 5 columns]"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>movieId</th>\n",
" <th>count</th>\n",
" <th>var</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3973</td>\n",
" <td>5</td>\n",
" <td>4.550000</td>\n",
" <td>Book of Shadows: Blair Witch 2 (2000)</td>\n",
" <td>Crime|Horror|Mystery|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2365</td>\n",
" <td>5</td>\n",
" <td>4.200000</td>\n",
" <td>King Kong vs. Godzilla (Kingukongu tai Gojira)...</td>\n",
" <td>Action|Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2570</td>\n",
" <td>5</td>\n",
" <td>3.500000</td>\n",
" <td>Walk on the Moon, A (1999)</td>\n",
" <td>Drama|Romance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3813</td>\n",
" <td>6</td>\n",
" <td>3.366667</td>\n",
" <td>Interiors (1978)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6535</td>\n",
" <td>6</td>\n",
" <td>3.366667</td>\n",
" <td>Legally Blonde 2: Red, White &amp; Blonde (2003)</td>\n",
" <td>Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>172</th>\n",
" <td>1241</td>\n",
" <td>11</td>\n",
" <td>1.800000</td>\n",
" <td>Dead Alive (Braindead) (1992)</td>\n",
" <td>Comedy|Fantasy|Horror</td>\n",
" </tr>\n",
" <tr>\n",
" <th>173</th>\n",
" <td>5530</td>\n",
" <td>6</td>\n",
" <td>1.800000</td>\n",
" <td>Simone (S1m0ne) (2002)</td>\n",
" <td>Comedy|Drama|Fantasy|Sci-Fi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>174</th>\n",
" <td>3678</td>\n",
" <td>5</td>\n",
" <td>1.800000</td>\n",
" <td>Man with the Golden Arm, The (1955)</td>\n",
" <td>Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>175</th>\n",
" <td>32596</td>\n",
" <td>5</td>\n",
" <td>1.800000</td>\n",
" <td>Sahara (2005)</td>\n",
" <td>Action|Adventure|Comedy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>176</th>\n",
" <td>5108</td>\n",
" <td>5</td>\n",
" <td>1.800000</td>\n",
" <td>John Q (2002)</td>\n",
" <td>Crime|Drama|Thriller</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>177 rows × 5 columns</p>\n",
"</div>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 5
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Filme, ki so v zgornjih 5% značilnih primerov lahko najdemo z izračunom standardnega odklona ocene za vsak film. Nato izračunamo 95% mejo in filtriramo filme po njej.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 2. Gručenje filmov (50%)\n",
"\n",
"Priporočilni sistemi pogosto odkrivajo skupine predmetov (v našem primeru filme), za katere velja visoka medsebojna podobnost.\n",
"\n",
"Poiščite 100 najbolj gledanih filmov. Ali med njimi obstajajo skupine?\n",
"Uporabite ustrezen algoritem za gručenje. Na film lahko gledamo kot vektor, kjer je \n",
"število komponent enako številu uporabnikov. \n",
"\n",
"Vektorji vsebujejo tudi *neznane vrednosti*.\n",
"Primer vektorjev za deset filmov prikazuje spodnja tabela.\n",
"\n",
"Algoritme gručenja lahko izvajamo v izvornem prostoru (koordinatni sistem filmi-uporabniki) ali pa filme primerjamo z merami podobnosti, ki smo jih spoznali na vajah. \n",
"Premisli, kateri način je primernejši glede na obliko podatkov."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"| x |Movie | $u_0$ |$u_1$ | $u_2$ | $\\cdots$ |\n",
"|------------|-------------------------------------------|:-----:|:----:|:------|:--------:|\n",
"|$\\vec{x_0}$ | Fight Club (1999) | ? | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_1}$ | Twelve Monkeys (a.k.a. 12 Monkeys) (1995) | ? | ? | 2.5 | $\\cdots$ |\n",
"|$\\vec{x_2}$ | Independence Day (a.k.a. ID4) (1996) | ? | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_3}$ | Dances with Wolves (1990) | 4.0 | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_4}$ | Fargo (1996) | ? | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_5}$ | Speed (1994) | ? | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_6}$ | Apollo 13 (1995) | ? | 2.0 | ? | $\\cdots$ |\n",
"|$\\vec{x_7}$ | Seven (a.k.a. Se7en) (1995) | ? | ? | ? | $\\cdots$ |\n",
"|$\\vec{x_8}$ | Sixth Sense, The (1999) | 3.0 | ? | 4.0 | $\\cdots$ |\n",
"|$\\vec{x_9}$ | Aladdin (1992) | ? | ? | ? | $\\cdots$ |\n",
"|$\\cdots$ | $\\cdots$ | $\\cdots$ | $\\cdots$ | $\\cdots$ | $\\cdots$ |"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"Pri tem odgovori na naslednja vprašanja."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 2.1. vprašanje:\n",
"\n",
"Utemelji izbiro algoritma in mere podobnosti."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Za gručenje bi bil najbolj primeren algoritem hierarhično gručenje. Zaradi mankajočih podatkov se za mero podrobnosti uporabi Jaccardov index.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 2.2. vprašanje:\n",
"\n",
"Koliko skupin filmov je med izbranimi? Ali poznamo kvantitativne ocene za različne možnosti razvrščanja v skupine?"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Med izbranimi filmi je 14 skupin. Poznamo koeficient silhuete in mero skupne deljene informacije.**"
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 2.3. vprašanje:\n",
"\n",
"Prikaži rezultate z uporabo ustrezne vizualizacije."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-13T19:29:50.446389Z",
"start_time": "2025-04-13T19:29:49.900462Z"
}
},
"source": [
"import scipy.cluster.hierarchy as hr\n",
"\n",
"top_100 = ratings.groupby(['movieId'])[\"rating\"].size().sort_values(ascending=False).head(100)\n",
"\n",
"matrix = ratings.pivot(index='movieId', columns='userId', values='rating')\n",
"\n",
"linkage = hr.linkage(matrix.loc[top_100.index].notna().astype(bool), method='average', metric='jaccard')\n",
"\n",
"labels = movies.loc[movies['movieId'].isin(top_100.index), 'title'].tolist()\n",
"plt.figure(figsize=(25, 50))\n",
"plt.axvline(x=0.57, color='k', linestyle='--')\n",
"hr.dendrogram(linkage, labels=labels, leaf_font_size=22, orientation='right')\n",
"plt.show()"
],
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 2500x5000 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAADEoAAA81CAYAAAAa9p9LAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Qm4lOP/x/Fv+77v+yKVimgjoUWLECURiqKUhBAJ0U4bQpYWSkVEiyRJSvsu7aRN+6ZN22n7X5/7dz3zn3POzJx96fR+Xddc5z5nnnmee555ZuKc7+f+prp06dIlAwAAAAAAAAAAAAAAAAAAAAAASAFSJ/UEAAAAAAAAAAAAAAAAAAAAAAAA4gtBCQAAAAAAAAAAAAAAAAAAAAAAkGIQlAAAAAAAAAAAAAAAAAAAAAAAACkGQQkAAAAAAAAAAAAAAAAAAAAAAJBiEJQAAAAAAAAAAAAAAAAAAAAAAAApBkEJAAAAAAAAAAAAAAAAAAAAAACQYhCUAAAAAAAAAAAAAAAAAAAAAAAAKUbapJ4AAAAAAAAAEMjFixdtz549li1bNkuVKlVSTwcAAAAAAAAAAAAAkIQuXbpkJ06csMKFC1vq1KF7RhCUAAAAAAAAQLKkkESxYsWSehoAAAAAAAAAAAAAgGRk586dVrRo0ZDbEJQAAAAAAABAsqROEt4vubJnz57U0wEAAAAAAAAQz06ePOlWA/YWTsmSJUtSTwkAAADJ2PHjx91ie97fkkMhKAEAAAAAAIBkKVWqVO6rQhIEJQAAAAAAAICUJ02aNL6xfgdIUAIAAAAx+VtyKKmjtScAAAAAAAAAAAAAAAAAAAAAAIDLAEEJAAAAAAAAAAAAAAAAAAAAAACQYhCUAAAAAAAAAAAAAAAAAAAAAAAAKQZBCQAAAAAAAAAAAAAAAAAAAAAAkGKkTeoJAAAAAAAAAAAAAAAAAACuPOnSpbM333zTNwYAAADiS6pLly5dire9AQAAAAAAAPHk+PHjliNHDjt27Jhlz549qacDAAAAAAAAAAAAALhM/oacOtFmBQAAAAAAwhk9erSlSpXK3TRG4hs7dqw7/1mzZrV9+/Yl9XRShP3791u2bNm4rgEAAAAAAAAAAAAASYagBAAAAADEwq5du+ydd96xRo0aWalSpVyRdZYsWdy4YcOGNmTIENu5c2dSTzNF6dmzpy9UkFzmEZNbly5dknTeCLzSxMsvv+zGXbt2tYIFCwZ9v48aNcoeffRRq1y5suXMmdO1gM+dO7dVq1bNvbZr1qyJ8fHnzZtnjz32mF111VWWOXNmy5Mnj1WtWtV69eoV49DG3r173bWpx2s/2p/226ZNG3ec6AgLC7OVK1fa8OHD7cknn3T7Sp8+ve8a1v6jo0CBAu58Srdu3dxKHgAAAAAAAAAQyMWLF239+vXupjEAAAAQX9LG254AAAAA4Apw6tQp69Gjhw0bNszOnj0b6f7t27e726xZs+y1116zTp06Wd++fV3RMoDkZfDgwS6QoHacwYIs999/v02aNMkuXboU6b4jR464YIFuQ4cOdeGC999/3zJkyBDyuOfPn3efDSNGjAj389OnT9u///5rq1atcvtRN4YmTZpE+TymTp1qbdu2dfPxt3XrVncbM2aMdejQwX1upUmTJuh+atas6Y4dH5577jkXJjtw4IA7z3369ImX/QIAAAAAAABIWfR70UqVKrnxf//95xalAgAAAOIDQQkAAAAAiCYVVKtoecWKFb6f3XLLLda4cWMrVqyYW3FdXSR++uknmz9/vgtSvPvuu248bdq0oKvV4/L14IMPWsuWLaO1rVb3R/Jx+PBh9/4UBRzUJSKQdevW+UIS1113ndWpU8f90U7bHzp0yIWiFFTQSmfqxLBnzx77/vvvQ3Y+eeqpp2zkyJFunCNHDnviiSesSpUqdvLkSffY6dOnu8BEixYt7Oeff7bbbrst6L7mzJljDzzwgOsGIXfddZfdc8897o+JCj2oE4Y6Onz66aduTh9//HHQfV24cCHc9/rMUuhjx44dFlM6PzqvCkm89957LoiiThcAAAAAAAAAAAAAACQGghIAAAAAEA1nzpxxgYjVq1e770uVKuVWew9UwNy9e3dbsGCBPfbYY241dwUr9NjFixdbxowZk2D2SCjly5e3pk2bJvU0EAsKDGh1MoUHOnbsGHQ7BQVU8N+5c2e79tprA4YeZs+e7cIJ6jjzww8/2NixY+3RRx8NuL+ZM2f6QhKFChWy3377za6++mrf/TrWBx98YM8++6wLWz3++OO2YcMGS58+faR9efd7IQk9TvP0PPLII66TRO3atV3Q65NPPnHhi3r16gWcm35+7733WtWqVa1atWpWuHBh69mzp/Xq1ctiQ8ceMmSIO886trrsAAAA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 truncated
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 6
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 2.4. vprašanje:\n",
"\n",
"Komentiraj smiselnost dobljenih rezultatov."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": "Odgovor: **Dobljeni rezultati niso smiselni. Kažejo, da podatki o ogledih filmov niso podobni za podobne filme (pričakovali bi, da se filmi grupirajo recimo po žanrih)**"
}
],
"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.9"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"nbTranslate": {
"displayLangs": [
"sl"
],
"hotkey": "alt-t",
"langInMainMenu": true,
"sourceLang": "sl",
"targetLang": "en",
"useGoogleTranslate": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+696
View File
@@ -0,0 +1,696 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"## Napovedovanje vrednosti\n",
"\n",
"Podatkovno rudarjenje, naloga, `27. april 2025`\n",
"**`Gašper Dobrovoljc`**"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"Spoznali bomo praktično uporabo enostavnih metod nadzorovanega modeliranja oz.\n",
"napovedovanja. Skupna lastnost vseh omenjenih metod je, da s pomočjo\n",
"naključnih spremenljivk (atributov) modelirajo vrednosti posebne spremenljivke,\n",
"ki ji pravimo *razred* (v kontekstu uvrščanja v razrede, klasifikacije)\n",
"ali *odziv* (v kontekstu regresije). Osnovne razlike med kontekstoma smo\n",
"spoznali na predavanjih in vajah.\n",
"\n",
"Praktična cilja, ki ju bomo zasledovali sta:\n",
"* modeliranje ocen posameznega uporabnika (odziva) s pomočjo vseh ostalih uporabnikov,\n",
"* primerjava metod nadzorovanega modeliranja."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Podatki\n",
"\n",
"Opis podatkovne zbirke MovieLens ostaja enak prvi nalogi."
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Predpriprava podatkov\n",
"\n",
"Za potrebe te naloge bomo podatke pripravili na naslednji način:\n",
"1. Izberi $m$ filmov z vsaj 100 ogledi.\n",
"2. Izberi $n$ uporabnikov, ki si je ogledalo vsaj 100 filmov.\n",
"3. Pripravi matriko $X$ velikosti $m \\times n$, kjer vrstice predstavljajo filme, stolpci pa uporabnike. Neznane vrednosti zamenjaj z $0$.\n",
"\n",
"Za vsakega od izbranih $n$ uporabnikov bo zgrajen regresijski model, \n",
"katerega cilj bo napoved ocen za filme. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<table>\n",
" <tr style=\"background-color: white;\">\n",
" <td style=\"border-right: 1px solid #000;\"></td>\n",
" <td></td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$y^{(0)}$</td>\n",
" <td colspan=3 style=\"text-align:center;\">$X^{(0)}$</td>\n",
" </tr>\n",
" <tr style=\"border-bottom: 1px solid #000;\">\n",
" <td style=\"border-right: 1px solid #000;\"></td>\n",
" <td>Film/uporabnik</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$u_0$</td>\n",
" <td>$u_1$</td>\n",
" <td>$u_2$</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_1}$</td>\n",
" <td>Twelve Monkeys (a.k.a. 12 Monkeys) (1995)</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">0</td>\n",
" <td>0</td>\n",
" <td>2.5</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_2}$</td>\n",
" <td>Dances with Wolves (1990) </td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">4</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_3}$</td>\n",
" <td>Apollo 13 (1995)</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">0</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_4}$</td>\n",
" <td>Sixth Sense, The (1999)</td><td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">3</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
"</table>\n",
"\n",
"<table>\n",
" <tr style=\"background-color: white;\">\n",
" <td style=\"border-right: 1px solid #000;\"></td>\n",
" <td></td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$y^{(1)}$</td>\n",
" <td colspan=3 style=\"text-align:center;\">$X^{(1)}$</td>\n",
" </tr>\n",
" <tr style=\"border-bottom: 1px solid #000;\">\n",
" <td style=\"border-right: 1px solid #000;\"></td>\n",
" <td>Film/uporabnik</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$u_1$</td>\n",
" <td>$u_0$</td>\n",
" <td>$u_2$</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_1}$</td>\n",
" <td>Twelve Monkeys (a.k.a. 12 Monkeys) (1995)</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">0</td>\n",
" <td>0</td>\n",
" <td>2.5</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_2}$</td>\n",
" <td>Dances with Wolves (1990) </td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">0</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_3}$</td>\n",
" <td>Apollo 13 (1995)</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">${f_4}$</td>\n",
" <td>Sixth Sense, The (1999)</td><td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">0</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"border-right: 1px solid #000;\">$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td style=\"border-right: 1px solid #000; border-left: 1px solid #000;\">$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" <td>$\\cdots$</td>\n",
" </tr>\n",
"</table>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Razdelitev podatkov za model uporabnika $u_0$ (zgorja matrika) in uporabnika $u_1$ (spodaj matrika).\n"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:12.001788Z",
"start_time": "2025-04-27T16:16:11.631245Z"
}
},
"cell_type": "code",
"source": [
"import pandas as pd\n",
"\n",
"ratings = pd.read_csv('./podatki/ml-latest-small/ratings.csv')\n",
"movies = pd.read_csv('./podatki/ml-latest-small/movies.csv')"
],
"outputs": [],
"execution_count": 1
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:12.098867Z",
"start_time": "2025-04-27T16:16:12.082840Z"
}
},
"cell_type": "code",
"source": [
"movie_rating_count = ratings.groupby('movieId')['rating'].count().reset_index()\n",
"movie_rating_count = movie_rating_count[movie_rating_count['rating'] >= 100]\n",
"\n",
"user_rating_count = ratings.groupby('userId')['rating'].count().reset_index()\n",
"user_rating_count = user_rating_count[user_rating_count['rating'] >= 100]\n",
"\n",
"filtered_ratings = ratings[ratings['movieId'].isin(movie_rating_count['movieId'])]\n",
"filtered_ratings = filtered_ratings[filtered_ratings['userId'].isin(user_rating_count['userId'])]\n",
"\n",
"matrix = filtered_ratings.pivot_table(index='movieId', columns='userId', values='rating', fill_value=0)"
],
"outputs": [],
"execution_count": 2
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Vprašanja"
]
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### 1. Regresija (100%) \n",
"Za vsakega uporabnika postavite regresijski model. Uporabite eno ali več metod za učenje regresijskih modelov (linearna regresija, Ridge, Lasso, itd.).\n",
"\n",
"Za vsakega od $n$ uporabnikov izberite ustrezni stolpec v matriki podatkov. Za uporabnika $i$ imamo torej:\n",
"\n",
"* Vektor odziva $y^{(i)}$,\n",
"* Matriko podatkov $X^{(i)}$, ki vsebuje vse stolpce *razen* $i$.\n",
" \n",
"Za lažjo predstavo si oglej zgornji tabeli. Nekajkrat (npr., trikrat) ponovite postopek preverjanja s pomočjo učne in testne množice:\n",
"\n",
"\n",
"* Množico filmov, ki si jih je uporabnik ogledal, *naključno* razdelite v razmerju 75% (učna množica) in 25% (testna množica).\n",
"* Naučite regresijski model na učni množici (izberite ustrezne vrstice v $X$ in $y$).\n",
"* Ovrednotite model na testni množici (ponovno izberite ustrezne vrstice v $X$ in $y$).\n",
"\n",
"Oceno vrednotenja nato delite s številom poizkusov, da dobite končno oceno.\n",
"\n",
"Poročajte o uspešnosti vašega modela. Pri tem se osredotočite na naslednja vprašanja:\n",
"* Utemeljite ustrezno mero vrednotenja. Ali model dobro napoveduje ocene?\n",
"* Z izbrano mero ocenite modele za vseh $n$ uporabnikov.\n",
"\n",
"Kodo za odgovore lahko razdelite v več celic."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:12.948299Z",
"start_time": "2025-04-27T16:16:12.110729Z"
}
},
"source": [
"import numpy as np\n",
"from sklearn.linear_model import LinearRegression, Ridge, Lasso\n",
"from sklearn.metrics import mean_squared_error\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"def eval_user(user_id, model_cls, model_kwargs=None, num_trials=3):\n",
" if model_kwargs is None:\n",
" model_kwargs = {}\n",
"\n",
" y = matrix[user_id].values\n",
" x_others = matrix.drop(columns=user_id).values\n",
"\n",
" rated_indices = np.where(y > 0)[0]\n",
"\n",
" rmse_list = []\n",
"\n",
" for _ in range(num_trials):\n",
" train_idx, test_idx = train_test_split(rated_indices, test_size=0.25, random_state=None)\n",
"\n",
" x_train = x_others[train_idx]\n",
" y_train = y[train_idx]\n",
"\n",
" x_test = x_others[test_idx]\n",
" y_test = y[test_idx]\n",
"\n",
" model = model_cls(**model_kwargs)\n",
" model.fit(x_train, y_train)\n",
"\n",
" y_pred = model.predict(x_test)\n",
" rmse = mean_squared_error(y_test, y_pred)\n",
" rmse_list.append(rmse)\n",
"\n",
" return np.mean(rmse_list)"
],
"outputs": [],
"execution_count": 3
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:14.998843Z",
"start_time": "2025-04-27T16:16:12.962010Z"
}
},
"cell_type": "code",
"source": [
"from tqdm import tqdm\n",
"\n",
"user_rmse_results = {}\n",
"\n",
"models = {\n",
" \"Linear\": (LinearRegression, {}),\n",
" \"Ridge\": (Ridge, {\"alpha\": 1.0}),\n",
" \"Lasso\": (Lasso, {\"alpha\": 0.1, \"max_iter\": 10000}),\n",
"}\n",
"\n",
"for model_name, (model_cls, model_kwargs) in models.items():\n",
" print(f\"Evaluating model: {model_name}\")\n",
" model_rmse = {}\n",
"\n",
" for user_id in tqdm(matrix.columns):\n",
" avg_rmse = eval_user(user_id, model_cls, model_kwargs)\n",
" if avg_rmse is not None:\n",
" model_rmse[user_id] = avg_rmse\n",
"\n",
" user_rmse_results[model_name] = model_rmse"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating model: Linear\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 263/263 [00:00<00:00, 369.67it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating model: Ridge\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 263/263 [00:00<00:00, 526.27it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Evaluating model: Lasso\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 263/263 [00:00<00:00, 328.20it/s]\n"
]
}
],
"execution_count": 4
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:15.018908Z",
"start_time": "2025-04-27T16:16:15.015890Z"
}
},
"cell_type": "code",
"source": [
"for model_name, result in user_rmse_results.items():\n",
" rmse_values = list(result.values())\n",
" avg_rmse = np.mean(rmse_values)\n",
" print(f\"{model_name} – Povprečni RMSE za vse uporabnike: {avg_rmse:.4f}\")"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Linear – Povprečni RMSE za vse uporabnike: 0.7776\n",
"Ridge – Povprečni RMSE za vse uporabnike: 0.7747\n",
"Lasso – Povprečni RMSE za vse uporabnike: 0.8388\n"
]
}
],
"execution_count": 5
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Ustrezna mera vrednotenja je koren povprečne kvadratne napake (RMSE), ker večja odstopanja bolj kaznuje."
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"#### Bonus vprašanje (15%)\n",
"Ustvarite novega uporabnika, ki predstavlja vaše ocene\n",
"filmov. Ocenite nekaj filmov po lastnem okusu in preverite, kako modeli ocenijo neizbrane filme.\n",
"Ali se vam zdijo napovedi primerne?\n",
"\n",
"Kodo za odgovore lahko razdelite v več celic."
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-04-27T16:16:15.055360Z",
"start_time": "2025-04-27T16:16:15.041567Z"
}
},
"cell_type": "code",
"source": [
"ratings = {\n",
" 75: 4.0,\n",
" 1: 4.8,\n",
" 316: 4.5,\n",
" 364: 4.9,\n",
" 541: 4.7,\n",
" 124: 3.7,\n",
" 3114: 4.7,\n",
" 4306: 5.0,\n",
" 5349: 4.7\n",
"}\n",
"\n",
"ratings_series = pd.Series(0, index=matrix.index, dtype=float)\n",
"for movie_id, rating in ratings.items():\n",
" if movie_id in ratings_series.index:\n",
" ratings_series.loc[movie_id] = rating\n",
"\n",
"matrix2 = matrix.copy()\n",
"matrix2[\"me\"] = ratings_series\n",
"\n",
"y_me = matrix2[\"me\"].values\n",
"x_other = matrix2.drop(columns=\"me\").values\n",
"\n",
"unrated_idx = np.where(y_me == 0)[0]\n",
"\n",
"rated_idx = np.where(y_me > 0)[0]\n",
"x_train = x_other[rated_idx]\n",
"y_train = y_me[rated_idx]\n",
"\n",
"x_test = x_other[unrated_idx]\n",
"\n",
"model = Ridge(alpha=1.0)\n",
"model.fit(x_train, y_train)\n",
"\n",
"y_pred = model.predict(x_test)\n",
"\n",
"(pd.DataFrame({\n",
" \"movieId\": matrix.index[unrated_idx],\n",
" \"predictedRating\": y_pred,\n",
"})\n",
" .merge(movies, on=\"movieId\")\n",
" .sort_values(by=\"predictedRating\", ascending=False)\n",
" .head(10))"
],
"outputs": [
{
"data": {
"text/plain": [
" movieId predictedRating \\\n",
"106 2571 4.935168 \n",
"30 356 4.903377 \n",
"129 4993 4.884689 \n",
"24 296 4.876314 \n",
"117 2959 4.859066 \n",
"133 5952 4.856036 \n",
"25 318 4.847719 \n",
"111 2762 4.834292 \n",
"40 527 4.832231 \n",
"114 2858 4.825916 \n",
"\n",
" title \\\n",
"106 Matrix, The (1999) \n",
"30 Forrest Gump (1994) \n",
"129 Lord of the Rings: The Fellowship of the Ring,... \n",
"24 Pulp Fiction (1994) \n",
"117 Fight Club (1999) \n",
"133 Lord of the Rings: The Two Towers, The (2002) \n",
"25 Shawshank Redemption, The (1994) \n",
"111 Sixth Sense, The (1999) \n",
"40 Schindler's List (1993) \n",
"114 American Beauty (1999) \n",
"\n",
" genres \n",
"106 Action|Sci-Fi|Thriller \n",
"30 Comedy|Drama|Romance|War \n",
"129 Adventure|Fantasy \n",
"24 Comedy|Crime|Drama|Thriller \n",
"117 Action|Crime|Drama|Thriller \n",
"133 Adventure|Fantasy \n",
"25 Crime|Drama \n",
"111 Drama|Horror|Mystery \n",
"40 Drama|War \n",
"114 Drama|Romance "
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>movieId</th>\n",
" <th>predictedRating</th>\n",
" <th>title</th>\n",
" <th>genres</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>106</th>\n",
" <td>2571</td>\n",
" <td>4.935168</td>\n",
" <td>Matrix, The (1999)</td>\n",
" <td>Action|Sci-Fi|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>356</td>\n",
" <td>4.903377</td>\n",
" <td>Forrest Gump (1994)</td>\n",
" <td>Comedy|Drama|Romance|War</td>\n",
" </tr>\n",
" <tr>\n",
" <th>129</th>\n",
" <td>4993</td>\n",
" <td>4.884689</td>\n",
" <td>Lord of the Rings: The Fellowship of the Ring,...</td>\n",
" <td>Adventure|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>296</td>\n",
" <td>4.876314</td>\n",
" <td>Pulp Fiction (1994)</td>\n",
" <td>Comedy|Crime|Drama|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>117</th>\n",
" <td>2959</td>\n",
" <td>4.859066</td>\n",
" <td>Fight Club (1999)</td>\n",
" <td>Action|Crime|Drama|Thriller</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>5952</td>\n",
" <td>4.856036</td>\n",
" <td>Lord of the Rings: The Two Towers, The (2002)</td>\n",
" <td>Adventure|Fantasy</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>318</td>\n",
" <td>4.847719</td>\n",
" <td>Shawshank Redemption, The (1994)</td>\n",
" <td>Crime|Drama</td>\n",
" </tr>\n",
" <tr>\n",
" <th>111</th>\n",
" <td>2762</td>\n",
" <td>4.834292</td>\n",
" <td>Sixth Sense, The (1999)</td>\n",
" <td>Drama|Horror|Mystery</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>527</td>\n",
" <td>4.832231</td>\n",
" <td>Schindler's List (1993)</td>\n",
" <td>Drama|War</td>\n",
" </tr>\n",
" <tr>\n",
" <th>114</th>\n",
" <td>2858</td>\n",
" <td>4.825916</td>\n",
" <td>American Beauty (1999)</td>\n",
" <td>Drama|Romance</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 6
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Napovedi se mi zdijo smiselne, saj bi predlagane filme ocenil podobno kot predvidene ocene."
},
{
"cell_type": "markdown",
"metadata": {
"lang": "sl"
},
"source": [
"### Zapiski\n",
"\n",
"Implementacijo, opis in vrednotenje metod za nadzorovanjo učenje vsebujejo knjižnice `sklearn` ali `Orange`."
]
}
],
"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.9"
},
"latex_envs": {
"LaTeX_envs_menu_present": true,
"autocomplete": true,
"bibliofile": "biblio.bib",
"cite_by": "apalike",
"current_citInitial": 1,
"eqLabelWithNumbers": true,
"eqNumInitial": 1,
"hotkeys": {
"equation": "Ctrl-E",
"itemize": "Ctrl-I"
},
"labels_anchors": false,
"latex_user_defs": false,
"report_style_numbering": false,
"user_envs_cfg": false
},
"nbTranslate": {
"displayLangs": [
"sl"
],
"hotkey": "alt-t",
"langInMainMenu": true,
"sourceLang": "sl",
"targetLang": "en",
"useGoogleTranslate": true
}
},
"nbformat": 4,
"nbformat_minor": 2
}
+147
View File
@@ -0,0 +1,147 @@
Summary
=======
This dataset (ml-latest-small) describes 5-star rating and free-text tagging activity from [MovieLens](http://movielens.org), a movie recommendation service. It contains 100004 ratings and 1296 tag applications across 9125 movies. These data were created by 671 users between January 09, 1995 and October 16, 2016. This dataset was generated on October 17, 2016.
Users were selected at random for inclusion. All selected users had rated at least 20 movies. No demographic information is included. Each user is represented by an id, and no other information is provided.
The data are contained in the files `links.csv`, `movies.csv`, `ratings.csv` and `tags.csv`. More details about the contents and use of all these files follows.
This is a *development* dataset. As such, it may change over time and is not an appropriate dataset for shared research results. See available *benchmark* datasets if that is your intent.
This and other GroupLens data sets are publicly available for download at <http://grouplens.org/datasets/>.
Usage License
=============
Neither the University of Minnesota nor any of the researchers involved can guarantee the correctness of the data, its suitability for any particular purpose, or the validity of results based on the use of the data set. The data set may be used for any research purposes under the following conditions:
* The user may not state or imply any endorsement from the University of Minnesota or the GroupLens Research Group.
* The user must acknowledge the use of the data set in publications resulting from the use of the data set (see below for citation information).
* The user may redistribute the data set, including transformations, so long as it is distributed under these same license conditions.
* The user may not use this information for any commercial or revenue-bearing purposes without first obtaining permission from a faculty member of the GroupLens Research Project at the University of Minnesota.
* The executable software scripts are provided "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of them is with you. Should the program prove defective, you assume the cost of all necessary servicing, repair or correction.
In no event shall the University of Minnesota, its affiliates or employees be liable to you for any damages arising out of the use or inability to use these programs (including but not limited to loss of data or data being rendered inaccurate).
If you have any further questions or comments, please email <[email protected]>
Citation
========
To acknowledge use of the dataset in publications, please cite the following paper:
> F. Maxwell Harper and Joseph A. Konstan. 2015. The MovieLens Datasets: History and Context. ACM Transactions on Interactive Intelligent Systems (TiiS) 5, 4, Article 19 (December 2015), 19 pages. DOI=<http://dx.doi.org/10.1145/2827872>
Further Information About GroupLens
===================================
GroupLens is a research group in the Department of Computer Science and Engineering at the University of Minnesota. Since its inception in 1992, GroupLens's research projects have explored a variety of fields including:
* recommender systems
* online communities
* mobile and ubiquitious technologies
* digital libraries
* local geographic information systems
GroupLens Research operates a movie recommender based on collaborative filtering, MovieLens, which is the source of these data. We encourage you to visit <http://movielens.org> to try it out! If you have exciting ideas for experimental work to conduct on MovieLens, send us an email at <[email protected]> - we are always interested in working with external collaborators.
Content and Use of Files
========================
Formatting and Encoding
-----------------------
The dataset files are written as [comma-separated values](http://en.wikipedia.org/wiki/Comma-separated_values) files with a single header row. Columns that contain commas (`,`) are escaped using double-quotes (`"`). These files are encoded as UTF-8. If accented characters in movie titles or tag values (e.g. Misérables, Les (1995)) display incorrectly, make sure that any program reading the data, such as a text editor, terminal, or script, is configured for UTF-8.
User Ids
--------
MovieLens users were selected at random for inclusion. Their ids have been anonymized. User ids are consistent between `ratings.csv` and `tags.csv` (i.e., the same id refers to the same user across the two files).
Movie Ids
---------
Only movies with at least one rating or tag are included in the dataset. These movie ids are consistent with those used on the MovieLens web site (e.g., id `1` corresponds to the URL <https://movielens.org/movies/1>). Movie ids are consistent between `ratings.csv`, `tags.csv`, `movies.csv`, and `links.csv` (i.e., the same id refers to the same movie across these four data files).
Ratings Data File Structure (ratings.csv)
-----------------------------------------
All ratings are contained in the file `ratings.csv`. Each line of this file after the header row represents one rating of one movie by one user, and has the following format:
userId,movieId,rating,timestamp
The lines within this file are ordered first by userId, then, within user, by movieId.
Ratings are made on a 5-star scale, with half-star increments (0.5 stars - 5.0 stars).
Timestamps represent seconds since midnight Coordinated Universal Time (UTC) of January 1, 1970.
Tags Data File Structure (tags.csv)
-----------------------------------
All tags are contained in the file `tags.csv`. Each line of this file after the header row represents one tag applied to one movie by one user, and has the following format:
userId,movieId,tag,timestamp
The lines within this file are ordered first by userId, then, within user, by movieId.
Tags are user-generated metadata about movies. Each tag is typically a single word or short phrase. The meaning, value, and purpose of a particular tag is determined by each user.
Timestamps represent seconds since midnight Coordinated Universal Time (UTC) of January 1, 1970.
Movies Data File Structure (movies.csv)
---------------------------------------
Movie information is contained in the file `movies.csv`. Each line of this file after the header row represents one movie, and has the following format:
movieId,title,genres
Movie titles are entered manually or imported from <https://www.themoviedb.org/>, and include the year of release in parentheses. Errors and inconsistencies may exist in these titles.
Genres are a pipe-separated list, and are selected from the following:
* Action
* Adventure
* Animation
* Children's
* Comedy
* Crime
* Documentary
* Drama
* Fantasy
* Film-Noir
* Horror
* Musical
* Mystery
* Romance
* Sci-Fi
* Thriller
* War
* Western
* (no genres listed)
Links Data File Structure (links.csv)
---------------------------------------
Identifiers that can be used to link to other sources of movie data are contained in the file `links.csv`. Each line of this file after the header row represents one movie, and has the following format:
movieId,imdbId,tmdbId
movieId is an identifier for movies used by <https://movielens.org>. E.g., the movie Toy Story has the link <https://movielens.org/movies/1>.
imdbId is an identifier for movies used by <http://www.imdb.com>. E.g., the movie Toy Story has the link <http://www.imdb.com/title/tt0114709/>.
tmdbId is an identifier for movies used by <https://www.themoviedb.org>. E.g., the movie Toy Story has the link <https://www.themoviedb.org/movie/862>.
Use of the resources listed above is subject to the terms of each provider.
Cross-Validation
----------------
Prior versions of the MovieLens dataset included either pre-computed cross-folds or scripts to perform this computation. We no longer bundle either of these features with the dataset, since most modern toolkits provide this as a built-in feature. If you wish to learn about standard approaches to cross-fold computation in the context of recommender systems evaluation, see [LensKit](http://lenskit.org) for tools, documentation, and open-source code examples.
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff