{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Data and Analysis Plan: Board Game Reccomendation\n", "## Team -1 (example)\n", "\n", "- Piotr Sapiezynski (p.sapiezynski@northeastern.edu)\n", "- Matt Higger (m.higger@ccs.neu.edu)\n", "\n", "\n", " \n", "### Notes:\n", "This is the example DS3000 project. We'll switch from our official \"Data and Analysis Plan\" to pointing out features which are helpful as you write your own by changing the font color to green. \n", "\n", "**Please use the section template given here to ensure you complete the necessary sections**\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "(.5%) Expresses the central motivation of the project in one or two sentences. This may evolve a bit through the project.\n", "\n", "\n", "## Project Goal:\n", "This work will scrape lists of board games from [BoardGameGeek.com](https://boardgamegeek.com/) to reccomend a new board game to users who input a game they already enjoy. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data \n", "\n", "(1%) Gives a summary of the data processing pipeline so a technical expert can easily follow along.\n", " \n", " \n", "This overview section allows you to describe an overview of your data processing pipeline. \n", " \n", "Your pipeline should end by saving one or more csvs of data which will be loaded by the analysis portion of the notebook.\n", "\n", "\n", "### Overview \n", "We will scrape a [list of all boardgames](https://boardgamegeek.com/browse/boardgame) ranked by popularity from BoardGameGeek. \n", "\n", "\n", "\n", "\n", "From this list, for each game, we can obtain:\n", "- title\n", "- year published\n", "- url to specific game page\n", "- description (e.g. \"Vanquish monsters ...\")\n", "\n", "Upon visiting an [individual game's webpage](https://boardgamegeek.com/boardgame/174430/gloomhaven) we can use the top titlebar:\n", "\n", "\n", "\n", "to observe:\n", "- complexity rating\n", "- playtime (mins a typical game lasts)\n", "- min/max number of player required\n", "- reccomended age range\n", "\n", "Most importantly we seek to collect the category and mechanism tags associated with a particular game:\n", "\n", "\n", "Each game has multiple category tags. Our expectation is that games with similar tags are enjoyed by similar players. This tag data will be essential to reccomend a new game to a player who inputs another game they enjoy. To simplify analysis, each tag will have its own column in our output DataFrame. For example:\n", "\n", "| | card game | mystery | social | communication |\n", "|-------|-----------|---------|--------|---------------|\n", "| game0 | True | True | False | False |\n", "| game1 | False | True | True | True |\n", "\n", "Indicates that \n", "- game0 has tags 'card game' and 'mystery'\n", "- game1 has tags ' mystery', 'social' and 'communication'\n", "\n", "### Pipeline Overview\n", "\n", "We will accomplish this task with three functions:\n", "- `get_url()`\n", " - returns html string of a given url\n", "- `clean_top_games()`\n", " - builds dataframe of [a single page of top games](https://boardgamegeek.com/browse/boardgame/page/2) from html string \n", "- `clean_game_meta()`\n", " - collects game meta data (tags, complexity, playtime, min/max players, age range ...) from an [individual game's webpage](https://boardgamegeek.com/boardgame/174430/gloomhaven)\n", " \n", "As well as two short scripts:\n", "- **Scrape list of games:** use `get_url()` and `clean_top_games()` in a loop to collect n pages of top games (100 * n games), populating a DataFrame `df_game`\n", "- **Get meta data per game:** loop through each row of `df_game`, query and process the individual game's webpage via `get_url()` and `clean_game_meta()` using the previously collected url and append the remaining features to `df_game`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pipeline\n", "\n", " \n", "(4%) Obtains, cleans, and merges all data sources involved in the project.\n", " \n", "Documentation counts!\n", " \n", "The majority of this section is code, but do make sure that one can do a quick sanity check that your pipeline worked by printing a few examples (e.g. call `DataFrame.head()` a few times).\n", "\n", "\n", "#### Scrape list of games" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import requests\n", "from bs4 import BeautifulSoup\n", "import json\n", "import time\n", "from tqdm import tqdm\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def get_url(url):\n", " \"\"\" gets the html of a given url\n", " \n", " Args:\n", " url (str): target url\n", " \n", " Returns:\n", " str_html (str): html of given url\n", " \"\"\"\n", " return requests.get(url).text" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def clean_top_games(str_html):\n", " \"\"\" gets DataFrame of games from page of \"All Boardgames\" list\n", " \n", " example page from \"All Boardgames\":\n", " https://boardgamegeek.com/browse/boardgame/page/2\n", " \n", " Args:\n", " str_html (str): string corresponding to html of page\n", " \n", " Returns:\n", " df_game (pd.DataFrame): dataframe where each row\n", " is one board game\n", " \"\"\" \n", " # build soup\n", " soup = BeautifulSoup(str_html)\n", "\n", " # get game data per row (discard first row as its the title)\n", " df_game = pd.DataFrame()\n", " for row_game in soup.find_all('tr')[1:]:\n", " game_dict = dict()\n", " \n", " # each td tag corresponds to a column. we unpack by column\n", " rank, image, title_year, rate_geek, rate_avg, num_vote, shop = row_game.find_all('td')\n", " \n", " # get game id and url from link in image\n", " game_url = 'https://boardgamegeek.com' + image.a.attrs['href']\n", " game_dict['url'] = game_url\n", " game_dict['game_id'] = game_url.split('/')[-2]\n", " \n", " # get title \n", " game_dict['title'] = title_year.a.text.strip()\n", " \n", " # get year\n", " str_year = title_year.span.text\n", " str_year = str_year.replace('(', '').replace(')', '')\n", " game_dict['year'] = int(str_year)\n", " \n", " # try to get description (set empty if fail)\n", " try:\n", " game_dict['description'] = title_year.p.text.strip()\n", " except:\n", " game_dict['description'] = ''\n", " \n", " # add game to total dataframe\n", " df_game = df_game.append(game_dict, ignore_index=True)\n", " \n", " # set game_id as index\n", " df_game.set_index('game_id', inplace=True)\n", " \n", " return df_game" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "scraping page: 100%|██████████| 10/10 [00:04<00:00, 2.14it/s]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
descriptiontitleurlyear
game_id
174430Vanquish monsters with strategic cardplay. Ful...Gloomhavenhttps://boardgamegeek.com/boardgame/174430/glo...2017.0
161936Mutating diseases are spreading around the wor...Pandemic Legacy: Season 1https://boardgamegeek.com/boardgame/161936/pan...2015.0
224517Build networks, grow industries, and navigate ...Brass: Birminghamhttps://boardgamegeek.com/boardgame/224517/bra...2018.0
167791Compete with rival CEOs to make Mars habitable...Terraforming Marshttps://boardgamegeek.com/boardgame/167791/ter...2016.0
233078Build an intergalactic empire through trade, r...Twilight Imperium: Fourth Editionhttps://boardgamegeek.com/boardgame/233078/twi...2017.0
\n", "
" ], "text/plain": [ " description \\\n", "game_id \n", "174430 Vanquish monsters with strategic cardplay. Ful... \n", "161936 Mutating diseases are spreading around the wor... \n", "224517 Build networks, grow industries, and navigate ... \n", "167791 Compete with rival CEOs to make Mars habitable... \n", "233078 Build an intergalactic empire through trade, r... \n", "\n", " title \\\n", "game_id \n", "174430 Gloomhaven \n", "161936 Pandemic Legacy: Season 1 \n", "224517 Brass: Birmingham \n", "167791 Terraforming Mars \n", "233078 Twilight Imperium: Fourth Edition \n", "\n", " url year \n", "game_id \n", "174430 https://boardgamegeek.com/boardgame/174430/glo... 2017.0 \n", "161936 https://boardgamegeek.com/boardgame/161936/pan... 2015.0 \n", "224517 https://boardgamegeek.com/boardgame/224517/bra... 2018.0 \n", "167791 https://boardgamegeek.com/boardgame/167791/ter... 2016.0 \n", "233078 https://boardgamegeek.com/boardgame/233078/twi... 2017.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "num_page = 10\n", "\n", "# scrape the top 100 * num_page games and save to csv\n", "df_game_list = []\n", "for page_idx in tqdm(range(1, num_page + 1), desc='scraping page'):\n", " \n", " # get url of a given page_idx\n", " url = f'https://boardgamegeek.com/browse/boardgame/page/{page_idx}?sort=rank'\n", " str_html = get_url(url)\n", " \n", " # clean game data and store it in list\n", " df_game = clean_top_games(str_html)\n", " df_game_list.append(df_game)\n", " \n", " # pause so we don't overwhelm the website (may not respond if we query too quickly)\n", " time.sleep(1)\n", " \n", "# glue together all rows of all dataframes\n", "df_game = pd.concat(df_game_list)\n", "\n", "# discard games with same titles as others\n", "df_game.drop_duplicates(subset='title', inplace=True)\n", "\n", "# save / print\n", "df_game.to_csv('game.csv')\n", "df_game.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Get metadata per game:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def clean_game_meta(str_html):\n", " \"\"\" given HTML source of a game page, extract game stats\n", " \n", " Args:\n", " str_html (str): html of the page\n", " game_id (int): game identifier\n", " \n", " Returns:\n", " game_dict (dict): dictionary representing metadata and stats about a given game\n", " \"\"\"\n", " soup = BeautifulSoup(str_html)\n", " \n", " # all the content is hidden as json in JavaScript rather than in html \n", " # so we need to hack a bit to get to it\n", " script = soup.find_all('script')[1]\n", " \n", " # the actual content of the page is stored in a JavaScript variable called\n", " # GEEK.geekitemPreload, so let's get its value\n", " for var in script.contents[0].split('\\n\\t'):\n", " if var.startswith('GEEK.geekitemPreload'):\n", " data = json.loads(var.split('GEEK.geekitemPreload = ')[1][:-1])['item']\n", " \n", " game_dict = dict()\n", " game_dict['player_age'] = data['polls']['playerage']\n", "\n", " # not all games have the info on best_players_min\n", " try:\n", " game_dict['best_players_min'] = game_dict['polls']['userplayers']['best'][0]['min']\n", " except:\n", " game_dict['best_players_min'] = None\n", " \n", " # not all games have the info on best_players_max\n", " try:\n", " game_dict['best_players_max'] = data['polls']['userplayers']['best'][0]['max']\n", " except:\n", " game_dict['best_players_max'] = None\n", " \n", " game_dict['recomm_players_min'] = data['polls']['userplayers']['recommended'][0]['min']\n", " game_dict['recomm_players_max'] = data['polls']['userplayers']['recommended'][0]['max']\n", " game_dict['playtime_min'] = data['minplaytime']\n", " game_dict['playtime_max'] = data['maxplaytime']\n", " game_dict['awards'] = len(data['links']['boardgamehonor'])\n", " game_dict['difficulty'] = data['polls']['boardgameweight']['averageweight']\n", " game_dict['category'] = [cat['name'] for cat in data['links']['boardgamecategory']]\n", " game_dict['mechanic'] = [cat['name'] for cat in data['links']['boardgamemechanic']]\n", " \n", " return game_dict" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "scraping per game: 72%|███████▏ | 710/993 [03:05<01:00, 4.67it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "error getting meta data: Ascension: Storm of Souls (removing from df_game)\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "scraping per game: 100%|██████████| 993/993 [04:16<00:00, 3.88it/s]\n" ] } ], "source": [ "for game_id, game_row in tqdm(df_game.iterrows(), desc='scraping per game', total=df_game.shape[0]):\n", " # get game meta data from game specific page\n", " html_str = get_url(game_row['url'])\n", " try:\n", " game_dict = clean_game_meta(html_str)\n", " except:\n", " # failure to get game metadata (\"Ascension: Storm of Souls\")\n", " # drop this game from the database\n", " game_title = game_row['title']\n", " print(f'error getting meta data: {game_title} (removing from df_game)')\n", " df_game.drop(game_id, inplace=True)\n", " continue\n", " \n", " # add this game data to our dataframe \n", " for col, feat in game_dict.items():\n", " if col in ('category', 'mechanic'):\n", " # each game may have multiple 'category' or 'mechanic' groups it belongs to\n", " # we build a unique column for each unique tag\n", " \n", " # get prefix (so we can distinguish category/mechanic tags later)\n", " if col == 'category':\n", " prefix = 'cat: '\n", " else:\n", " prefix = 'mech: '\n", " \n", " # save each group as its own column\n", " for tag in feat:\n", " tag = prefix + tag\n", " df_game.loc[game_id, tag] = True\n", " else:\n", " # column has a single value, update df_game\n", " df_game.loc[game_id, col] = feat\n", " \n", " time.sleep(1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "for col in df_game.columns:\n", " if ('cat: ' in col) or ('mech: ' in col):\n", " df_game.fillna(value={col: False}, inplace=True)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df_game.to_csv('game.csv')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
descriptiontitleurlyearplayer_agebest_players_minbest_players_maxrecomm_players_minrecomm_players_maxplaytime_min...cat: Triviamech: Map Deformationmech: Measurement Movementmech: Auction: Dutch Prioritymech: Single Loser Gamemech: Stacking and Balancingmech: Action Timermech: Physical Removalmech: Inductionmech: Ratio / Combat Results Table
game_id
174430Vanquish monsters with strategic cardplay. Ful...Gloomhavenhttps://boardgamegeek.com/boardgame/174430/glo...2017.014+NaN3.01.04.060...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
161936Mutating diseases are spreading around the wor...Pandemic Legacy: Season 1https://boardgamegeek.com/boardgame/161936/pan...2015.012+NaN4.02.04.060...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
224517Build networks, grow industries, and navigate ...Brass: Birminghamhttps://boardgamegeek.com/boardgame/224517/bra...2018.014+NaN4.02.04.060...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
167791Compete with rival CEOs to make Mars habitable...Terraforming Marshttps://boardgamegeek.com/boardgame/167791/ter...2016.012+NaN3.01.04.0120...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
233078Build an intergalactic empire through trade, r...Twilight Imperium: Fourth Editionhttps://boardgamegeek.com/boardgame/233078/twi...2017.014+NaN6.03.06.0240...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
\n", "

5 rows × 263 columns

\n", "
" ], "text/plain": [ " description \\\n", "game_id \n", "174430 Vanquish monsters with strategic cardplay. Ful... \n", "161936 Mutating diseases are spreading around the wor... \n", "224517 Build networks, grow industries, and navigate ... \n", "167791 Compete with rival CEOs to make Mars habitable... \n", "233078 Build an intergalactic empire through trade, r... \n", "\n", " title \\\n", "game_id \n", "174430 Gloomhaven \n", "161936 Pandemic Legacy: Season 1 \n", "224517 Brass: Birmingham \n", "167791 Terraforming Mars \n", "233078 Twilight Imperium: Fourth Edition \n", "\n", " url year player_age \\\n", "game_id \n", "174430 https://boardgamegeek.com/boardgame/174430/glo... 2017.0 14+ \n", "161936 https://boardgamegeek.com/boardgame/161936/pan... 2015.0 12+ \n", "224517 https://boardgamegeek.com/boardgame/224517/bra... 2018.0 14+ \n", "167791 https://boardgamegeek.com/boardgame/167791/ter... 2016.0 12+ \n", "233078 https://boardgamegeek.com/boardgame/233078/twi... 2017.0 14+ \n", "\n", " best_players_min best_players_max recomm_players_min \\\n", "game_id \n", "174430 NaN 3.0 1.0 \n", "161936 NaN 4.0 2.0 \n", "224517 NaN 4.0 2.0 \n", "167791 NaN 3.0 1.0 \n", "233078 NaN 6.0 3.0 \n", "\n", " recomm_players_max playtime_min ... cat: Trivia \\\n", "game_id ... \n", "174430 4.0 60 ... False \n", "161936 4.0 60 ... False \n", "224517 4.0 60 ... False \n", "167791 4.0 120 ... False \n", "233078 6.0 240 ... False \n", "\n", " mech: Map Deformation mech: Measurement Movement \\\n", "game_id \n", "174430 False False \n", "161936 False False \n", "224517 False False \n", "167791 False False \n", "233078 False False \n", "\n", " mech: Auction: Dutch Priority mech: Single Loser Game \\\n", "game_id \n", "174430 False False \n", "161936 False False \n", "224517 False False \n", "167791 False False \n", "233078 False False \n", "\n", " mech: Stacking and Balancing mech: Action Timer \\\n", "game_id \n", "174430 False False \n", "161936 False False \n", "224517 False False \n", "167791 False False \n", "233078 False False \n", "\n", " mech: Physical Removal mech: Induction \\\n", "game_id \n", "174430 False False \n", "161936 False False \n", "224517 False False \n", "167791 False False \n", "233078 False False \n", "\n", " mech: Ratio / Combat Results Table \n", "game_id \n", "174430 False \n", "161936 False \n", "224517 False \n", "167791 False \n", "233078 False \n", "\n", "[5 rows x 263 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_game.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualizations (sanity check / data exploration)\n", "\n", " \n", "(2.5%) Builds two visualizations (graphs) from the data which characterize the distribution of the data itself in some interesting way. Your visualizations will be graded based on how much information they can effectively communicate with readers. Please make sure your visualizations are sufficiently distinct from each other.\n", "\n", "**Wherever a non-technical reader may misunderstand, write a few sentences which specify how to interpret the graph** It is expected that a non-technical reader can fully digest your graphs based on the images themselves as well as your explanatory text (they won't read your code).\n", " \n", "Notice that the pipeline above takes 20 mins or so to complete. We have manually re-labelled `game.csv` to `game_final.csv` so that:\n", "- we don't overwrite our precious dataset\n", "- we can load it below and continue on with our graphs\n", "\n", "You won't lost any credit for not using a `_final.csv` structure in your code but I'd encourage you to do so to avoid losing your data / time :)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Correlations between category tags" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "df_game = pd.read_csv('game_final.csv')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def plot_corr_matrix(df_game, prefix, limit=10):\n", " # find all columns with a given prefix\n", " column_list = [col for col in df_game.columns if prefix in col]\n", "\n", " # get dataframe corresponding to column_list\n", " df = df_game.loc[:, column_list]\n", " \n", " # get series of tags, sorted in decreasing popularity\n", " series_tag = df.sum(axis=0).sort_values(ascending=False)\n", " \n", " # get limit most popular tags from df\n", " df = df_game.loc[:, series_tag.index[:limit]]\n", "\n", " # rename all columns\n", " df.columns = [col[len(prefix):] for col in df.columns]\n", "\n", " # plot\n", " sns.heatmap(df.corr(), vmin=-1, vmax=1, cmap='coolwarm')\n", " plt.gcf().set_size_inches(10, 10)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0.98, 'Correlation of category tags')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_corr_matrix(df_game, prefix='cat: ')\n", "plt.suptitle('Correlation of category tags')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Higher values, shown in red, indicate that the categories tend to occur in the same game. For example, the final row (or column) describes games with miniatures. Minatures (i.e. little plastic figurines) are often in games with:\n", "- Fantasy\n", "- Fighting\n", "- Science fiction\n", "- Adventure\n", "- Wargame\n", "\n", "However, games with miniatures often do not also belong to the following categories:\n", "- Card Game\n", "- Economic\n", "- City Building" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Duration of gameplay" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'count')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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r2688UZFR0erTp06Di8OAAAAqM34Bk4AAADAkCteM37mzBl9+eWXOnXqlAIDAxUVFaV69epdj9oAAACAWu2KwviMGTO0ePFiXbhwQRaLRZLk5+engQMHasSIEdelQAAAAKC2sjuMZ2Vlad68eerVq5ceeOABhYSEqLCwUGvXrtW8efMUEBCgtLS061gqAAAAULvYHcb/+te/6vHHH9dzzz1nbWvevLni4uLk7++vpUuXEsYBAACAK2D3l/7k5+crISGh0m0JCQk6fPiww4oCAAAA3IHdYTwkJEQ7d+6sdNvOnTsVEhLisKIAAAAAd2D3MpUHHnhAs2bNkre3t+6//37rmvGPPvpImZmZGjBgwPWsEwAAAKh17A7jI0aM0HfffafXXntNkydPtrZbLBbdd999XE0FAAAAuEJ2h3EfHx/NmDFDe/bs0datW3X69GkFBASoffv2Cg8Pv541AgAAALWS3WH8o48+0uHDhzV48OAK4XvRokW66aabdN999zm8QAC1T/2AG+Tne8XfOeYw5y9cVPHpc8bGBwDgErvfDd944w09/PDDlW7z9fXVggULCOMA7OLn66WkZ1cbG//DackqNjY6AAA/sftqKgcPHqxyOUrLli114MABR9UEAAAAuAW7w7iXl5dOnDhR6bbjx4/Lw8PDrv1s3bpVQ4cOVXx8vCIiIrR27doKfbZt26aUlBRFRUUpMTFR8+fPr9Dnm2++0YABAxQdHa0OHTpo0qRJKi0ttfdwAAAAAOPsDuMxMTFavHixLl68aNN+8eJFvfXWW2rbtq1d+/nhhx8UERGhl19+udLt+fn5GjRokG677TZ98MEHGjVqlObMmaO33nrL2ufMmTNKS0tT/fr1tWzZMk2aNEmrV6/WlClT7D0cAAAAwDi714wPHz5cjz32mHr06KGHHnpIjRo10tGjR/W3v/1N33//vd555x279pOYmKjExMQqty9dulRBQUEaP368PDw81LJlS+3du1eLFi1SamqqPDw89OGHH+rMmTOaPHmy/P391apVKz3zzDN65ZVXNGLECNWrV8/ewwIAAACMsfvMeHR0tBYvXqzg4GBlZmbqpZde0uzZsxUSEqK3335b0dHRDikoNzdXnTp1sln2kpCQoKNHjyo/P9/ap127dvL397f26dy5s0pKSvTVV185pA4AAADgeruia4u1a9dOS5cu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AAwhjAMAAACGEMYB4Cq8//77ioiI0JEjR5w25nfffaeIiAitXr36uux/1qxZ2rp1a4X2/v37Ky0t7bqMeTVmz56txx57zCH7up6P6bPPPquxY8c6fL8Aahcv0wUAQE1011136b333lNQUJDpUhwmMzNTderUUfv27W3aX375ZZf5psHjx49r0aJFmj17tkP216hRI7333nv69a9/7ZD9/dzQoUP18MMPa9CgQWratKnD9w+gduDMOABchaCgILVt21Y+Pj6mS7nuWrZsqRYtWpguQ5K0bNkyBQcHq0OHDg7Zn4+Pj9q2bXtd/lN16623KjIy0vrNrQBQGcI4ALf1/PPP65577lFOTo569uyp6OhoJScn68svv1RJSYkyMjL0m9/8Rh06dNBrr72msrIy630rW6YSERGhOXPmaMGCBUpMTFRsbKyefPLJyy5lubRUYtmyZRo7dqzat2+v2NhYjRkzRmfPnq32vhs3btTgwYPVqVMntW3bVg8++KCWL19u3V5SUqIOHTpo8uTJFe77l7/8Re3bt9f58+etXyn9l7/8RREREYqIiND7778vqeIylUvHvn37dg0dOlQxMTFKTEy09l+2bJm6deumdu3aadiwYTp+/LjNuGfOnNHEiROVmJioyMhI3XvvvVq2bFm1x/nzsXv06FGh7WrrqWyZyqXj/eSTT5SUlKQ2bdqoZ8+eysnJsRn3k08+UUpKimJiYtSuXTslJSVVOI77779fH374oUpLS+06PgDuh2UqANzayZMnNW7cOD3xxBNq0KCBpk6dqqeeekodO3aUv7+/pk6dqtzcXGVmZqp58+ZKSUmpdn/Lly9Xq1atNH78eJ08eVKTJk3SqFGj7Do7mpmZqdjYWE2bNk379u3T66+/rvPnz2v69OlV3ufbb79VfHy8UlNT5e3trf/+978aP368SkpK1K9fP/n4+Khnz5764IMP9Mc//lHe3t6SpLKyMq1cuVIPPvig/Pz89N5776l3797q3bu3evbsKUmXXboxevRopaSkqH///nrvvfc0ZswYffPNN9q5c6fGjBmjU6dO6c9//rMmTpyoqVOnSpJKS0s1ePBgHTp0SL///e/VrFkzffrpp3r55ZdVVlamvn37VnusBw8eVLt27RxWT1X27t2r6dOna+jQoapXr55mzpypoUOHasOGDQoICNChQ4c0fPhw3Xff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Dqx0P+Xl5ZbS0lLL2rVrLREREZaioiLrtnPnzll++9vfWvr06WPZsmWL5bbbbrO89dZbl63tscces4SHh1t27dplbSssLLRERUVZpk2bZtNvwIABVe6ntLTUkpubawkPD7fs3LnT2t6vXz+bYywtLbV06tTJMnHiRGvbc889Z+nWrVuFfa5cudISHh5u+f77761t4eHhlgceeMBSXl5ubUtPT7eEh4db/vnPf1rbdu/ebQkPD7esWbPGYrFYLGfOnLG0a9fO8sorr9iMkZOTYwkPD7d88sknVR5beXm5JSoqyjJ79uwK2662Houl4mN66XjfeOMNmzEeeOABy+DBg62327Zta9fcjh492vLAAw9cth8A98KZcQBuKTAwUJGRkdbbt9xyi6QfP2z3c82aNdPu3butt0tKSrRgwQL97W9/0+HDh22WnBw6dMh65trPz09Tp05V7969NWjQIHXo0MG63ONybrnlFrVq1cp6Ozg4WHfccYe++OKLKu9jsViUnZ2t9957T99++63NspkDBw6odevWkqTevXvrueee09GjR9W4cWN9/PHHKigosJ75vxqdOnWyOUN96bHs1KlThbZLS1y++OILnTlzRvfff78uXrxo7demTRvVrVtX//3vf5WYmFjpeKdPn9aFCxfUsGFDh9VTnc6dO9vcvvXWW7Vnzx7r7cjISC1atEienp7q0KFDlevOGzZsqGPHjl12PADuhTXjANxSQECAzW1vb29JUv369Su0X7hwwXp76tSpmjt3rpKSkjRv3jwtX75c48ePlySbfpJ022236dZbb1VJSYn69+9f6ZKKygQHB1faVlBQUOV93n77bU2YMEEdOnTQX/7yFy1fvlxz5sypUNe9996rgIAA69KVZcuWqV27dmrZsqVdtVWmsseyTp06qlu3rrXt0tKcS7UUFRVJkvr27avWrVvb/Jw9e9ZmrfsvXdpHVct9rqae6vxyGYuPj4/N/V5//XUlJiZq7ty56tGjh7p06aKlS5dW2I+vr69d4wFwL5wZB4Ar8Pe//109e/bU8OHDrW379u2rtO+bb76pPXv2KCIiQhkZGYqLi5O/v/9lx7gUVH/ZFhoaWm1d8fHxGjNmjLUtJyenQj8fHx/17NlTK1euVHJysj799FNNnDjxsjU52qWAO336dP3617+usL26yycGBgZKkoqLi69LbVcqJCREr7zyisaPH6/du3frnXfe0bhx43TLLbeoQ4cO1n6nTp2q8mw+APfFmXEAuALnz5+vcEZ29erVFfrt2rVLM2bM0LBhwzRv3jwVFRUpIyPDrjEOHDigvLw86+2ioiLl5OSobdu21dZ16ez+JT+/msvP9e7dW4cPH9Zzzz2nunXr6re//a3N9l+e+b0eYmNj5e/vr++++05RUVEVfsLCwqq8r4+Pj8LCwvTdd99d1xqvlIeHh1q1aqXnn39ekvS///3PZvt3332nZs2amSgNgAvjzDgAXIH4+HitXLlSt956q2688UatXr1a3377rU2fCxcuaOTIkYqMjNSwYcNUp04djR07VqNGjdJdd91lcyWTyoSGhio9PV1/+MMf5Ofnpzlz5sjb27vab4eMj4/XokWLtHDhQt122236+OOP9X//93+V9m3atKk6dOigzz77TI8++qhuuOEGm+3NmzfXsmXL9P7776tly5aqV6+emjdvbt8DZKd69epp5MiRysjIUEFBgTp16iQ/Pz99//332rx5s/r166d27dpVef927dppx44dDq3pahQXF+vxxx/Xgw8+aH2MPvjgA3l7eysuLs6m786dO5WammqiTAAujDAOAFfgT3/6k8rKyjRlyhTVqVNH99xzj/70pz/pySeftPaZMmWKDh8+rNWrV6tOnTqSpAcffFD//ve/9dJLL6lNmzYKCQmpcoyWLVvqkUce0cyZM3X48GG1atVKb775ZrVLN37/+9/r1KlTWrBggUpLSxUfH6/XX39djzzySKX977nnHn322Wfq1atXhW0pKSn6+uuvNWXKFJ04cULt27ev9Bs5r1W/fv3UpEkTLVq0SCtXrpQkNWnSRB07dtTNN99c7X3vu+8+jRgxQkVFRZWusXcWX19f3XbbbVq6dKm+//57eXl5KSIiQvPmzbP5EO727dt14sQJ3XfffcZqBeCaPCyWn10IFQBgVP/+/VWnTh0tXrz4uo4zZMgQFRYWWkNwTVNWVqauXbtq0KBBdl+lxqQ///nP2r1793X5Tw2Amo014wDgRr744gu99dZb+ve//63HH3/cdDlXrU6dOvr973+vt956y+bSiK7oxIkTWrlypUaMGGG6FAAuiGUqAOBGevfurbp16yo1NVUPPPCA6XKuSc+ePVVUVKQjR45cdlmLSYcPH9bIkSPVvn1706UAcEEsUwEAAAAMYZkKAAAAYAhhHAAAADCEMA4AAAAYQhgHAAAADCGMAwAAAIb8f/s32iAMPTwqAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "sns.set(font_scale=1.3)\n", "\n", "fig, axs = plt.subplots(2, 1)\n", "fig.set_size_inches(12, 8)\n", "\n", "# plot histogram min playtime\n", "plt.sca(axs[0])\n", "bins = np.linspace(0, 250, 20)\n", "plt.hist(df_game['playtime_min'], bins=bins)\n", "plt.xlabel('min playtime (mins)')\n", "plt.ylabel('count')\n", "\n", "# plot histogram max playtime\n", "plt.sca(axs[1])\n", "plt.hist(df_game['playtime_max'], bins=bins)\n", "plt.xlabel('max playtime (mins)')\n", "plt.ylabel('count')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis Plan\n", "\n", " \n", "(2%) Discuss what ML tools will be used and the relevant assumptions required to apply each. Either:\n", "\n", "discuss why one algorithm may be chosen over the others\n", "\n", "describe what subset of a whole suite of similar algorithms you’ll apply (its ok to say, ‘we’re going to try all of these because we don’t have reason to think one should be better than another’)\n", "\n", "For example:\n", "\n", "- Project goal: Predicting the movement of stock prices based on how similar companies are doing via regression.\n", " - This is observable: there are plenty of information you could collect about stock prices (though it will need some careful though about what a \"similar\" company is)\n", " - This is sound and simple: seems intuitive that there'd be a relationship to be found between the company's stock prices\n", " \n", "- Project goal: Recommend a movie based on the events of a person's dream last night.\n", " - This is not observable: how will you get enough data on what people dreamed about?\n", " - This is not sound or simple: what kind of movies should we suggest for people with nightmares of falling? Doesn't seem to be a clear relationship between dreams / movies a person would enjoy ....\n", " \n", " \n", "To date, we've covered data collection and processing extensively and are only starting ML this week (Mar 22). The grading will account for this:\n", "- be specific / clear about which data will be used\n", " - give plenty of examples to illustrate things\n", "- be as specific / clear as you can about the ML analysis\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our expectation is that games with similar categories would be enjoyed by similar board gamers. \n", "\n", "In each of the approaches below, a board game is characterized by a boolean vector $x$ which represents all the category and mechanics tags a board game could contain. For example, the fifth game can be represented by:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "cat: Adventure False\n", "cat: Exploration True\n", "cat: Fantasy False\n", "cat: Fighting False\n", "cat: Miniatures False\n", " ... \n", "mech: Stacking and Balancing False\n", "mech: Action Timer False\n", "mech: Physical Removal False\n", "mech: Induction False\n", "mech: Ratio / Combat Results Table False\n", "Name: 4, Length: 250, dtype: bool" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "feat_col = [col for col in df_game.columns if 'mech: ' in col or 'cat: ' in col]\n", "df_feat = df_game.loc[:, feat_col]\n", "df_feat.iloc[4, :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will ask users to rate, on a 1-7 point scale, 10 or more board games. For example, some user might rate:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "example_user_rate = \\\n", "{'Gloomhaven': 7,\n", "'Pandemic Legacy: Season 1': 1,\n", "'Brass: Birmingham': 3,\n", "'Terraforming Mars': 2,\n", "'Twilight Imperium: Fourth Edition': 4,\n", "'Gloomhaven: Jaws of the Lion': 7,\n", "'Through the Ages: A New Story of Civilization': 5,\n", "'Gaia Project': 2,\n", "'Star Wars: Rebellion': 3,\n", "'Twilight Struggle': 4}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For every user, we will use regression to create a function which estimates these ratings from the $x$ vector above. This function can then be applied to all the $x$ values above, including the games for which the user has not indicated a rating. We will \"reccomend\" those games with the highest estimated rating (i.e. the output of the regression function) which the user has not explicitly rated." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.8.10" } }, "nbformat": 4, "nbformat_minor": 4 }