{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Board Game Review Prediction\n",
"> Using Linear Regression/Random Forest Regression with Game information, it can predict Average game User rates. This data is from boardgamegeek, re-organized in scrapper\n",
"\n",
"- toc: true \n",
"- badges: true\n",
"- comments: true\n",
"- author: Chanseok Kang\n",
"- categories: [Python, Machine_Learning]\n",
"- image: images/bgr_heatmap.png"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Required Packages"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"import sys\n",
"import numpy as np\n",
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import pandas as pd\n",
"import sklearn\n",
"\n",
"plt.rcParams['figure.figsize'] = (8, 8)\n",
"\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Version Check"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python: 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]\n",
"Numpy: 1.18.1\n",
"Matplotlib: 3.1.3\n",
"Seaborn: 0.10.0\n",
"Pandas: 1.0.1\n",
"Scikit-learn: 0.22.1\n"
]
}
],
"source": [
"print('Python: {}'.format(sys.version))\n",
"print('Numpy: {}'.format(np.__version__))\n",
"print('Matplotlib: {}'.format(mpl.__version__))\n",
"print('Seaborn: {}'.format(sns.__version__))\n",
"print('Pandas: {}'.format(pd.__version__))\n",
"print('Scikit-learn: {}'.format(sklearn.__version__))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset Load\n",
"More data information is in [here](https://raw.githubusercontent.com/ThaWeatherman/scrapers/master/boardgamegeek/games.csv)"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" type | \n",
" name | \n",
" yearpublished | \n",
" minplayers | \n",
" maxplayers | \n",
" playingtime | \n",
" minplaytime | \n",
" maxplaytime | \n",
" minage | \n",
" users_rated | \n",
" average_rating | \n",
" bayes_average_rating | \n",
" total_owners | \n",
" total_traders | \n",
" total_wanters | \n",
" total_wishers | \n",
" total_comments | \n",
" total_weights | \n",
" average_weight | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 12333 | \n",
" boardgame | \n",
" Twilight Struggle | \n",
" 2005.0 | \n",
" 2.0 | \n",
" 2.0 | \n",
" 180.0 | \n",
" 180.0 | \n",
" 180.0 | \n",
" 13.0 | \n",
" 20113 | \n",
" 8.33774 | \n",
" 8.22186 | \n",
" 26647 | \n",
" 372 | \n",
" 1219 | \n",
" 5865 | \n",
" 5347 | \n",
" 2562 | \n",
" 3.4785 | \n",
"
\n",
" \n",
" 1 | \n",
" 120677 | \n",
" boardgame | \n",
" Terra Mystica | \n",
" 2012.0 | \n",
" 2.0 | \n",
" 5.0 | \n",
" 150.0 | \n",
" 60.0 | \n",
" 150.0 | \n",
" 12.0 | \n",
" 14383 | \n",
" 8.28798 | \n",
" 8.14232 | \n",
" 16519 | \n",
" 132 | \n",
" 1586 | \n",
" 6277 | \n",
" 2526 | \n",
" 1423 | \n",
" 3.8939 | \n",
"
\n",
" \n",
" 2 | \n",
" 102794 | \n",
" boardgame | \n",
" Caverna: The Cave Farmers | \n",
" 2013.0 | \n",
" 1.0 | \n",
" 7.0 | \n",
" 210.0 | \n",
" 30.0 | \n",
" 210.0 | \n",
" 12.0 | \n",
" 9262 | \n",
" 8.28994 | \n",
" 8.06886 | \n",
" 12230 | \n",
" 99 | \n",
" 1476 | \n",
" 5600 | \n",
" 1700 | \n",
" 777 | \n",
" 3.7761 | \n",
"
\n",
" \n",
" 3 | \n",
" 25613 | \n",
" boardgame | \n",
" Through the Ages: A Story of Civilization | \n",
" 2006.0 | \n",
" 2.0 | \n",
" 4.0 | \n",
" 240.0 | \n",
" 240.0 | \n",
" 240.0 | \n",
" 12.0 | \n",
" 13294 | \n",
" 8.20407 | \n",
" 8.05804 | \n",
" 14343 | \n",
" 362 | \n",
" 1084 | \n",
" 5075 | \n",
" 3378 | \n",
" 1642 | \n",
" 4.1590 | \n",
"
\n",
" \n",
" 4 | \n",
" 3076 | \n",
" boardgame | \n",
" Puerto Rico | \n",
" 2002.0 | \n",
" 2.0 | \n",
" 5.0 | \n",
" 150.0 | \n",
" 90.0 | \n",
" 150.0 | \n",
" 12.0 | \n",
" 39883 | \n",
" 8.14261 | \n",
" 8.04524 | \n",
" 44362 | \n",
" 795 | \n",
" 861 | \n",
" 5414 | \n",
" 9173 | \n",
" 5213 | \n",
" 3.2943 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id type name \\\n",
"0 12333 boardgame Twilight Struggle \n",
"1 120677 boardgame Terra Mystica \n",
"2 102794 boardgame Caverna: The Cave Farmers \n",
"3 25613 boardgame Through the Ages: A Story of Civilization \n",
"4 3076 boardgame Puerto Rico \n",
"\n",
" yearpublished minplayers maxplayers playingtime minplaytime \\\n",
"0 2005.0 2.0 2.0 180.0 180.0 \n",
"1 2012.0 2.0 5.0 150.0 60.0 \n",
"2 2013.0 1.0 7.0 210.0 30.0 \n",
"3 2006.0 2.0 4.0 240.0 240.0 \n",
"4 2002.0 2.0 5.0 150.0 90.0 \n",
"\n",
" maxplaytime minage users_rated average_rating bayes_average_rating \\\n",
"0 180.0 13.0 20113 8.33774 8.22186 \n",
"1 150.0 12.0 14383 8.28798 8.14232 \n",
"2 210.0 12.0 9262 8.28994 8.06886 \n",
"3 240.0 12.0 13294 8.20407 8.05804 \n",
"4 150.0 12.0 39883 8.14261 8.04524 \n",
"\n",
" total_owners total_traders total_wanters total_wishers total_comments \\\n",
"0 26647 372 1219 5865 5347 \n",
"1 16519 132 1586 6277 2526 \n",
"2 12230 99 1476 5600 1700 \n",
"3 14343 362 1084 5075 3378 \n",
"4 44362 795 861 5414 9173 \n",
"\n",
" total_weights average_weight \n",
"0 2562 3.4785 \n",
"1 1423 3.8939 \n",
"2 777 3.7761 \n",
"3 1642 4.1590 \n",
"4 5213 3.2943 "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Load the data\n",
"games = pd.read_csv('./dataset/games.csv')\n",
"games.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exploratory Data Analysis"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" id | \n",
" yearpublished | \n",
" minplayers | \n",
" maxplayers | \n",
" playingtime | \n",
" minplaytime | \n",
" maxplaytime | \n",
" minage | \n",
" users_rated | \n",
" average_rating | \n",
" bayes_average_rating | \n",
" total_owners | \n",
" total_traders | \n",
" total_wanters | \n",
" total_wishers | \n",
" total_comments | \n",
" total_weights | \n",
" average_weight | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 81312.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81309.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
" 81312.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 72278.150138 | \n",
" 1806.630668 | \n",
" 1.992018 | \n",
" 5.637703 | \n",
" 51.634788 | \n",
" 49.276833 | \n",
" 51.634788 | \n",
" 6.983975 | \n",
" 161.886585 | \n",
" 4.212144 | \n",
" 1.157632 | \n",
" 262.502509 | \n",
" 9.236423 | \n",
" 12.688890 | \n",
" 42.719144 | \n",
" 49.290031 | \n",
" 16.488009 | \n",
" 0.908083 | \n",
"
\n",
" \n",
" std | \n",
" 58818.237742 | \n",
" 588.517834 | \n",
" 0.931034 | \n",
" 56.076890 | \n",
" 345.699969 | \n",
" 334.483934 | \n",
" 345.699969 | \n",
" 5.035138 | \n",
" 1145.978126 | \n",
" 3.056551 | \n",
" 2.340033 | \n",
" 1504.536693 | \n",
" 39.757408 | \n",
" 60.764207 | \n",
" 239.292628 | \n",
" 284.862853 | \n",
" 115.980285 | \n",
" 1.176002 | \n",
"
\n",
" \n",
" min | \n",
" 1.000000 | \n",
" -3500.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 25% | \n",
" 21339.750000 | \n",
" 1984.000000 | \n",
" 2.000000 | \n",
" 2.000000 | \n",
" 8.000000 | \n",
" 10.000000 | \n",
" 8.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 50% | \n",
" 43258.000000 | \n",
" 2003.000000 | \n",
" 2.000000 | \n",
" 4.000000 | \n",
" 30.000000 | \n",
" 30.000000 | \n",
" 30.000000 | \n",
" 8.000000 | \n",
" 2.000000 | \n",
" 5.265620 | \n",
" 0.000000 | \n",
" 7.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" 1.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 75% | \n",
" 128836.500000 | \n",
" 2010.000000 | \n",
" 2.000000 | \n",
" 6.000000 | \n",
" 60.000000 | \n",
" 60.000000 | \n",
" 60.000000 | \n",
" 12.000000 | \n",
" 16.000000 | \n",
" 6.718777 | \n",
" 0.000000 | \n",
" 51.000000 | \n",
" 2.000000 | \n",
" 3.000000 | \n",
" 7.000000 | \n",
" 9.000000 | \n",
" 2.000000 | \n",
" 1.916700 | \n",
"
\n",
" \n",
" max | \n",
" 184451.000000 | \n",
" 2018.000000 | \n",
" 99.000000 | \n",
" 11299.000000 | \n",
" 60120.000000 | \n",
" 60120.000000 | \n",
" 60120.000000 | \n",
" 120.000000 | \n",
" 53680.000000 | \n",
" 10.000000 | \n",
" 8.221860 | \n",
" 73188.000000 | \n",
" 1395.000000 | \n",
" 1586.000000 | \n",
" 6402.000000 | \n",
" 11798.000000 | \n",
" 5996.000000 | \n",
" 5.000000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" id yearpublished minplayers maxplayers playingtime \\\n",
"count 81312.000000 81309.000000 81309.000000 81309.000000 81309.000000 \n",
"mean 72278.150138 1806.630668 1.992018 5.637703 51.634788 \n",
"std 58818.237742 588.517834 0.931034 56.076890 345.699969 \n",
"min 1.000000 -3500.000000 0.000000 0.000000 0.000000 \n",
"25% 21339.750000 1984.000000 2.000000 2.000000 8.000000 \n",
"50% 43258.000000 2003.000000 2.000000 4.000000 30.000000 \n",
"75% 128836.500000 2010.000000 2.000000 6.000000 60.000000 \n",
"max 184451.000000 2018.000000 99.000000 11299.000000 60120.000000 \n",
"\n",
" minplaytime maxplaytime minage users_rated average_rating \\\n",
"count 81309.000000 81309.000000 81309.000000 81312.000000 81312.000000 \n",
"mean 49.276833 51.634788 6.983975 161.886585 4.212144 \n",
"std 334.483934 345.699969 5.035138 1145.978126 3.056551 \n",
"min 0.000000 0.000000 0.000000 0.000000 0.000000 \n",
"25% 10.000000 8.000000 0.000000 0.000000 0.000000 \n",
"50% 30.000000 30.000000 8.000000 2.000000 5.265620 \n",
"75% 60.000000 60.000000 12.000000 16.000000 6.718777 \n",
"max 60120.000000 60120.000000 120.000000 53680.000000 10.000000 \n",
"\n",
" bayes_average_rating total_owners total_traders total_wanters \\\n",
"count 81312.000000 81312.000000 81312.000000 81312.000000 \n",
"mean 1.157632 262.502509 9.236423 12.688890 \n",
"std 2.340033 1504.536693 39.757408 60.764207 \n",
"min 0.000000 0.000000 0.000000 0.000000 \n",
"25% 0.000000 1.000000 0.000000 0.000000 \n",
"50% 0.000000 7.000000 0.000000 0.000000 \n",
"75% 0.000000 51.000000 2.000000 3.000000 \n",
"max 8.221860 73188.000000 1395.000000 1586.000000 \n",
"\n",
" total_wishers total_comments total_weights average_weight \n",
"count 81312.000000 81312.000000 81312.000000 81312.000000 \n",
"mean 42.719144 49.290031 16.488009 0.908083 \n",
"std 239.292628 284.862853 115.980285 1.176002 \n",
"min 0.000000 0.000000 0.000000 0.000000 \n",
"25% 0.000000 0.000000 0.000000 0.000000 \n",
"50% 1.000000 1.000000 0.000000 0.000000 \n",
"75% 7.000000 9.000000 2.000000 1.916700 \n",
"max 6402.000000 11798.000000 5996.000000 5.000000 "
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"games.describe()"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['id', 'type', 'name', 'yearpublished', 'minplayers', 'maxplayers',\n",
" 'playingtime', 'minplaytime', 'maxplaytime', 'minage', 'users_rated',\n",
" 'average_rating', 'bayes_average_rating', 'total_owners',\n",
" 'total_traders', 'total_wanters', 'total_wishers', 'total_comments',\n",
" 'total_weights', 'average_weight'],\n",
" dtype='object')\n",
"(81312, 20)\n"
]
}
],
"source": [
"print(games.columns)\n",
"print(games.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our purpose is to predict `average_rating`. But some rows contain 0 rating. So we should remove that."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"