diff --git a/README.md b/README.md index 778c9cb..3964c5d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Browse to http://localhost:8000 and you should see the Jupyterlite interface. ## Development 2 -1. Run the docker task, and make the jupyter-lite-build.tgz. +1. Run `docker run -it --rm -e TARGET_DIR=/dist -v "$(pwd)":/dist $(docker build -q .)` producing the jupyter-lite-build.tgz. 1. Unzip it into the ./notebooks 1. `rm -rf public/notebooks` in Quepid 1. Make sure Quepid's docker-compose.override.yml has a line similar to `- /Users/epugh/Documents/projects/quepid-jupyterlite/notebooks:/srv/app/public/notebooks` diff --git a/jupyterlite/files/README.md b/jupyterlite/files/README.md index cbc3a77..f01c1b7 100644 --- a/jupyterlite/files/README.md +++ b/jupyterlite/files/README.md @@ -7,6 +7,9 @@ The example notebooks are stored under ./examples. Feel free to run them, but p * `./examples/Scoring Comparison.ipynb` is an example of measuring relevance score change. * `./examples/Jaccard and RBO Comparison.ipynb` is an example of comparing query result sets to each other. +* `./examples/Multiple Raters Analysis.ipynb` looks at how judge compare in rating. +* `./examples/Fleiss Kappa.ipynb` calculates a specific measurement of rater agreement. + These notebooks use data from the Haystack Rating Party. diff --git a/jupyterlite/files/examples/Fleiss Kappa.ipynb b/jupyterlite/files/examples/Fleiss Kappa.ipynb new file mode 100644 index 0000000..e9df73b --- /dev/null +++ b/jupyterlite/files/examples/Fleiss Kappa.ipynb @@ -0,0 +1,160 @@ +{ + "metadata": { + "kernelspec": { + "name": "python", + "display_name": "Python (Pyodide)", + "language": "python" + }, + "language_info": { + "codemirror_mode": { + "name": "python", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8" + } + }, + "nbformat_minor": 5, + "nbformat": 4, + "cells": [ + { + "cell_type": "markdown", + "source": "# Fleiss' Kappa \nTo understand how much your raters what? Scott, need some text!\n\nPlease copy this example and customize it for your own purposes!", + "metadata": {}, + "id": "bd7e4efa-eb00-451e-984d-ed6646d8e25f" + }, + { + "cell_type": "markdown", + "source": "## Imports", + "metadata": {}, + "id": "e3412382" + }, + { + "cell_type": "code", + "source": "import pandas as pd\nfrom js import fetch\nimport json\n\nfrom collections import defaultdict\nfrom statsmodels.stats.inter_rater import aggregate_raters\nfrom statsmodels.stats.inter_rater import fleiss_kappa\nfrom IPython.display import display, Markdown", + "metadata": { + "trusted": true + }, + "execution_count": 1, + "outputs": [], + "id": "4972936a" + }, + { + "cell_type": "markdown", + "source": "## Step 0: Configuration", + "metadata": {}, + "id": "6da26c5e" + }, + { + "cell_type": "code", + "source": "QUEPID_BOOK_NUM = 25\n\n# Not needed if running within Quepid JupyterLite\n# QUEPID_API_TOKEN = \"\"", + "metadata": { + "trusted": true + }, + "execution_count": 3, + "outputs": [], + "id": "71803a49-4065-4adf-a69e-cb0fe2d00f22" + }, + { + "cell_type": "markdown", + "source": "## Step 1: Download the Quepid Book", + "metadata": {}, + "id": "420416df-9e6a-41b4-987b-7a03c9dd38b3" + }, + { + "cell_type": "code", + "source": "# Generic GET call to a JSON endpoint \nasync def get_json(url):\n resp = await fetch(url)\n resp_text = await resp.text()\n return json.loads(resp_text)\n\n", + "metadata": { + "trusted": true + }, + "execution_count": 4, + "outputs": [], + "id": "31193536-98eb-4b46-ab98-af04ee07c6d3" + }, + { + "cell_type": "code", + "source": "data = await get_json(f'/api/export/books/{QUEPID_BOOK_NUM}')", + "metadata": { + "trusted": true + }, + "execution_count": 5, + "outputs": [], + "id": "8fef6231-daa8-467f-ac57-13a144e8a356" + }, + { + "cell_type": "markdown", + "source": "## Step 2: Extract and Prepare Data", + "metadata": {}, + "id": "79d985ad-cd11-44a9-a7e1-0851bc99aef3" + }, + { + "cell_type": "code", + "source": "# Initialize a list to hold the tuples of (doc_id, rating, count)\nratings_data = []\n\n# Iterate through each query-doc pair\nfor pair in data['query_doc_pairs']:\n # Initialize a dictionary to count the ratings for this pair\n ratings_count = defaultdict(int)\n \n # Extract judgements and count the ratings\n for judgement in pair['judgements']:\n rating = judgement['rating']\n ratings_count[rating] += 1\n\n # Append the counts to the ratings_data list\n for rating, count in ratings_count.items():\n ratings_data.append((pair['doc_id'], rating, count))\n", + "metadata": { + "trusted": true + }, + "execution_count": 6, + "outputs": [], + "id": "9a8561fd-2dbf-477e-9ac1-4df6d5ebdc91" + }, + { + "cell_type": "markdown", + "source": "## Step 3: Aggregate Raters' Data", + "metadata": {}, + "id": "caf5632b-132a-4e1b-80fe-c8c5ab7f2f3a" + }, + { + "cell_type": "code", + "source": "# Convert ratings_data to a DataFrame\ndf = pd.DataFrame(ratings_data, columns=['doc_id', 'rating', 'count'])\n\n# Use crosstab to create a contingency table\ndata_crosstab = pd.crosstab(index=df['doc_id'], columns=df['rating'], values=df['count'], aggfunc='sum')\n\n# Drop any rows missing judgements\ndata_crosstab = data_crosstab.dropna(how='any')\n\n# Convert the DataFrame to the format expected by aggregate_raters\ndata_for_aggregation = data_crosstab.values\n\n# Aggregate the raters' data\ntable, _ = aggregate_raters(data_for_aggregation)", + "metadata": { + "trusted": true + }, + "execution_count": 7, + "outputs": [], + "id": "a7598308-129b-4628-ad3a-fc3d703f8205" + }, + { + "cell_type": "markdown", + "source": "## Step 4: Compute Fleiss' Kappa", + "metadata": {}, + "id": "25c79fbc" + }, + { + "cell_type": "code", + "source": "kappa = fleiss_kappa(table, method='fleiss')\ndisplay(Markdown(f\"## Fleiss' Kappa: {kappa:.4f}\"))", + "metadata": { + "trusted": true + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "", + "text/markdown": "## Fleiss' Kappa: -0.3333" + }, + "metadata": {} + } + ], + "id": "25a613f9" + }, + { + "cell_type": "markdown", + "source": "_This notebook was last updated 17-FEB-2024_", + "metadata": {}, + "id": "5704579e-2321-4629-8de0-6608b428e2b6" + }, + { + "cell_type": "code", + "source": "", + "metadata": {}, + "execution_count": null, + "outputs": [], + "id": "7203f6cc-c068-4f75-a59a-1f49c5555319" + } + ] +} \ No newline at end of file diff --git a/jupyterlite/files/examples/Multiple Raters Analysis.ipynb b/jupyterlite/files/examples/Multiple Raters Analysis.ipynb new file mode 100644 index 0000000..1a262b4 --- /dev/null +++ b/jupyterlite/files/examples/Multiple Raters Analysis.ipynb @@ -0,0 +1,588 @@ +{ + "metadata": { + "kernelspec": { + "name": "python", + "display_name": "Python (Pyodide)", + "language": "python" + }, + "language_info": { + "codemirror_mode": { + "name": "python", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8" + } + }, + "nbformat_minor": 5, + "nbformat": 4, + "cells": [ + { + "cell_type": "markdown", + "source": "# Analysis of Judgements with Multiple Raters\n\nThis notebook is an example of how we can analyze query / document pairs judgements in the case of multiple judges.\n\n**Why?**\nWhen we have one single rater for our judgements, we have no other choice than trusting the rating of that judge. However when we have multiple judges rating the same pairs, this gives us much more information about the actual rating of the pair. For example if all judges disagree, it might be a good indicator that the pair is hard to judge, for example because the intent is not 100% clear. Conversely, if all judges aree, we can have much higher confidence in this rating.\n\n**Goal**\nAnalyze agreement between raters to measure confidence about each rating, in particular we would like to:\n\n - analyze the distribution of grades\n - measure raters's consistency\n - identify suspicious ratings in other to clean the dataset and make sure we only keep for which we have enough confidence in the rating.\n\n\n**Data**\nFor this we need a dataset with following information:\n \n - pairs \n - Each pair is rated by 3 different judges. In this example we consider a rating grade between 0 and 3:\n - `0`: document relevance is **poor**\n - `1`: document relevance is **fair**\n - `2`: document relevance is **good**\n - `3`: document relevance is **perfect**\n \nThe analysis would also work with other grade scale with minor changes in the code.\n\nTo get this data, we will directly get judgement book from Quepid, via the API. Any external data could also be used.\n\n \n", + "metadata": {}, + "id": "5aa3a7af" + }, + { + "cell_type": "markdown", + "source": "## Setup\nBasic libraries needed in this analysis", + "metadata": {}, + "id": "77cc28f8" + }, + { + "cell_type": "code", + "source": "import pandas as pd\nimport numpy as np\nimport matplotlib.pylab as plt\nimport random\nimport string\nfrom js import fetch\nfrom datetime import datetime\nimport random\nfrom matplotlib import pyplot\nfrom io import StringIO\n%matplotlib inline", + "metadata": { + "trusted": true + }, + "execution_count": 1, + "outputs": [], + "id": "ce97f3d0" + }, + { + "cell_type": "code", + "source": "ratings = ['0-Bad', '1-Fair', '2-Good', '3-Perfect']", + "metadata": { + "trusted": true + }, + "execution_count": 2, + "outputs": [], + "id": "d985176c-95c1-4d29-bc03-06f03cf77ed4" + }, + { + "cell_type": "markdown", + "source": "## Get Ratings From Books API", + "metadata": {}, + "id": "b57a896c-416b-4992-980d-2870de7cc120" + }, + { + "cell_type": "code", + "source": "# You need to get your book_id from Quepid UI. You should be able to see its content if you open /api/books/1.json\nBOOK_ID = 25", + "metadata": { + "trusted": true + }, + "execution_count": 3, + "outputs": [], + "id": "ed1f99f3-ff72-4e9d-81cd-3afef204cbef" + }, + { + "cell_type": "code", + "source": "# Get content of the book in CSV format (could also use JSON)\nres = await fetch(f'/api/books/{BOOK_ID}.csv')\nres_str = await res.text()\ndf = pd.read_csv(StringIO(res_str))\ndf", + "metadata": { + "trusted": true + }, + "execution_count": 4, + "outputs": [ + { + "execution_count": 4, + "output_type": "execute_result", + "data": { + "text/plain": " query docid charlie@flax.co.uk \\\n0 projector screen 325961 NaN \n1 projector screen 47471 NaN \n2 projector screen 126679 NaN \n3 projector screen 254441 NaN \n4 projector screen 325958 NaN \n... ... ... ... \n2415 power supply 1667352 NaN \n2416 power supply 1667804 NaN \n2417 power supply 1667752 NaN \n2418 power supply 1667821 NaN \n2419 power supply 1667357 NaN \n\n epugh@opensourceconnections.com eschramma@cas.org dtaivpp@gmail.com \\\n0 3.0 NaN 3.0 \n1 3.0 NaN 3.0 \n2 3.0 NaN 3.0 \n3 3.0 NaN NaN \n4 3.0 NaN NaN \n... ... ... ... \n2415 0.0 NaN NaN \n2416 0.0 NaN NaN \n2417 0.0 NaN NaN \n2418 0.0 NaN NaN \n2419 0.0 NaN NaN \n\n aarora@opensourceconnections.com cmcollier@gmail.com \\\n0 NaN NaN \n1 NaN NaN \n2 NaN NaN \n3 NaN NaN \n4 NaN NaN \n... ... ... \n2415 NaN NaN \n2416 NaN NaN \n2417 NaN NaN \n2418 NaN NaN \n2419 NaN NaN \n\n ben.w.trent@gmail.com jeff@vin.com cmarino@enterprise-knowledge.com \\\n0 NaN NaN NaN \n1 NaN NaN NaN \n2 NaN NaN NaN \n3 NaN NaN NaN \n4 NaN NaN NaN \n... ... ... ... \n2415 NaN NaN NaN \n2416 NaN NaN NaN \n2417 NaN NaN NaN \n2418 NaN NaN NaN \n2419 NaN NaN NaN \n\n msfroh@gmail.com peter@searchintuition.com maximilian.werk@jina.ai \\\n0 NaN NaN NaN \n1 NaN NaN NaN \n2 NaN NaN NaN \n3 NaN NaN NaN \n4 NaN NaN NaN \n... ... ... ... \n2415 NaN NaN NaN \n2416 NaN NaN NaN \n2417 NaN NaN NaN \n2418 NaN NaN NaN \n2419 NaN NaN NaN \n\n ryan.finley@ferguson.com \n0 NaN \n1 NaN \n2 NaN \n3 NaN \n4 NaN \n... ... \n2415 NaN \n2416 NaN \n2417 NaN \n2418 NaN \n2419 NaN \n\n[2420 rows x 15 columns]", + "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 \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
querydocidcharlie@flax.co.ukepugh@opensourceconnections.comeschramma@cas.orgdtaivpp@gmail.comaarora@opensourceconnections.comcmcollier@gmail.comben.w.trent@gmail.comjeff@vin.comcmarino@enterprise-knowledge.commsfroh@gmail.competer@searchintuition.commaximilian.werk@jina.airyan.finley@ferguson.com
0projector screen325961NaN3.0NaN3.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
1projector screen47471NaN3.0NaN3.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
2projector screen126679NaN3.0NaN3.0NaNNaNNaNNaNNaNNaNNaNNaNNaN
3projector screen254441NaN3.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
4projector screen325958NaN3.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
................................................
2415power supply1667352NaN0.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2416power supply1667804NaN0.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2417power supply1667752NaN0.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2418power supply1667821NaN0.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
2419power supply1667357NaN0.0NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
\n

2420 rows × 15 columns

\n
" + }, + "metadata": {} + } + ], + "id": "30ce3dc2-c049-436c-8049-58c0d8f4e46f" + }, + { + "cell_type": "code", + "source": "if df.shape[0] == 0:\n print('It Looks like your book is empty or does not exists')", + "metadata": { + "trusted": true + }, + "execution_count": 5, + "outputs": [], + "id": "98ad3844-d67f-44a2-8bae-034223de6c68" + }, + { + "cell_type": "code", + "source": "df.dropna(inplace=True)\ndf.shape", + "metadata": { + "trusted": true + }, + "execution_count": 6, + "outputs": [ + { + "execution_count": 6, + "output_type": "execute_result", + "data": { + "text/plain": "(0, 15)" + }, + "metadata": {} + } + ], + "id": "79ce92af-e034-4e7d-bc8d-3a96c0fcd14f" + }, + { + "cell_type": "code", + "source": "df.loc[df['docid'] == '325961']", + "metadata": { + "trusted": true + }, + "execution_count": 7, + "outputs": [ + { + "execution_count": 7, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [query, docid, charlie@flax.co.uk, epugh@opensourceconnections.com, eschramma@cas.org, dtaivpp@gmail.com, aarora@opensourceconnections.com, cmcollier@gmail.com, ben.w.trent@gmail.com, jeff@vin.com, cmarino@enterprise-knowledge.com, msfroh@gmail.com, peter@searchintuition.com, maximilian.werk@jina.ai, ryan.finley@ferguson.com]\nIndex: []", + "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
querydocidcharlie@flax.co.ukepugh@opensourceconnections.comeschramma@cas.orgdtaivpp@gmail.comaarora@opensourceconnections.comcmcollier@gmail.comben.w.trent@gmail.comjeff@vin.comcmarino@enterprise-knowledge.commsfroh@gmail.competer@searchintuition.commaximilian.werk@jina.airyan.finley@ferguson.com
\n
" + }, + "metadata": {} + } + ], + "id": "25006e0e-2013-4384-a34f-8fa920579614" + }, + { + "cell_type": "code", + "source": "raters = list(df.columns[2:])\nraters", + "metadata": { + "trusted": true + }, + "execution_count": 8, + "outputs": [ + { + "execution_count": 8, + "output_type": "execute_result", + "data": { + "text/plain": "['charlie@flax.co.uk',\n 'epugh@opensourceconnections.com',\n 'eschramma@cas.org',\n 'dtaivpp@gmail.com',\n 'aarora@opensourceconnections.com',\n 'cmcollier@gmail.com',\n 'ben.w.trent@gmail.com',\n 'jeff@vin.com',\n 'cmarino@enterprise-knowledge.com',\n 'msfroh@gmail.com',\n 'peter@searchintuition.com',\n 'maximilian.werk@jina.ai',\n 'ryan.finley@ferguson.com']" + }, + "metadata": {} + } + ], + "id": "72d4481e-ae12-4fff-bbbd-1888a894f69a" + }, + { + "cell_type": "code", + "source": "nb_raters = len(raters)", + "metadata": { + "trusted": true + }, + "execution_count": 9, + "outputs": [], + "id": "4c1fc91f-cda6-4e76-8372-3062e6975adb" + }, + { + "cell_type": "markdown", + "source": "We just transform a bit the data so that it's easier to process:", + "metadata": {}, + "id": "d704b517-aea3-4177-bb49-88f8d57ce647" + }, + { + "cell_type": "code", + "source": "df.rename(columns={rn:f'rating_{i}' for i,rn in enumerate(raters)}, inplace=True)\nfor i, rn in enumerate(raters):\n df[f'rater_{i}'] = rn\ndf", + "metadata": { + "trusted": true + }, + "execution_count": 10, + "outputs": [ + { + "execution_count": 10, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [query, docid, rating_0, rating_1, rating_2, rating_3, rating_4, rating_5, rating_6, rating_7, rating_8, rating_9, rating_10, rating_11, rating_12, rater_0, rater_1, rater_2, rater_3, rater_4, rater_5, rater_6, rater_7, rater_8, rater_9, rater_10, rater_11, rater_12]\nIndex: []\n\n[0 rows x 28 columns]", + "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
querydocidrating_0rating_1rating_2rating_3rating_4rating_5rating_6rating_7...rater_3rater_4rater_5rater_6rater_7rater_8rater_9rater_10rater_11rater_12
\n

0 rows × 28 columns

\n
" + }, + "metadata": {} + } + ], + "id": "e81fbcd6-f2aa-476b-9b81-2ae7a950fe99" + }, + { + "cell_type": "markdown", + "source": "We flatten the data to have 1 rating per row:", + "metadata": {}, + "id": "c0396b4d-eb54-4786-939e-b8ad69d335ab" + }, + { + "cell_type": "code", + "source": "df_overall = pd.concat([\n df[['query','docid',f'rating_{i}', f'rater_{i}']].rename(\n columns={f'rating_{i}':'rating', f'rater_{i}':'rater'}) for i in range(nb_raters)]).reset_index(drop=True)\ndf_overall.sort_values(by=['docid'], inplace=True)\ndf_overall", + "metadata": { + "trusted": true + }, + "execution_count": 11, + "outputs": [ + { + "execution_count": 11, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [query, docid, rating, rater]\nIndex: []", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n
querydocidratingrater
\n
" + }, + "metadata": {} + } + ], + "id": "97b0bc0c-a20e-49b2-a65a-ef09eb7e6a58" + }, + { + "cell_type": "markdown", + "source": "### Rating distribution per query\nHe we just want to plot the distribution of ratings for each query:\n", + "metadata": {}, + "id": "ff2dcb29-e376-4621-9ecf-f3374e71f464" + }, + { + "cell_type": "code", + "source": "df_overall[['query', 'rating']].groupby('query').agg(['count', 'mean', 'std'])", + "metadata": { + "trusted": true + }, + "execution_count": 12, + "outputs": [ + { + "execution_count": 12, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [(rating, count), (rating, mean), (rating, std)]\nIndex: []", + "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
rating
countmeanstd
query
\n
" + }, + "metadata": {} + } + ], + "id": "50d46a70" + }, + { + "cell_type": "code", + "source": "fig, axes = plt.subplots()\nqueries = df_overall['query'].unique()\ndataset = [df_overall[df_overall['query'] == q][\"rating\"] for q in queries]\n\nnb_queries = len(queries)\n\naxes.violinplot(dataset = dataset, showmeans=True, bw_method=0.05)\naxes.set_xlabel('query')\naxes.set_ylabel('ratings')\naxes.yaxis.grid(True)\naxes.set_xticks(range(1,nb_queries+1))\naxes.set_xticklabels(queries,rotation=45)\nplt.title('Rating distribution per query')\nplt.show()", + "metadata": { + "trusted": true + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "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x7F8+fL45je/GYsXL44rrrgivva1r8WHH344XduelSZyFo2NjdHf3x8vvfRSZFkW+Xw+nn322bjxxhuna9v8f5P12D3j4XLkyJEYGRmJ6urqMePV1dUxMDAw7pqBgYFx5w8NDfkfwycwkbP4Td/+9rfjxIkTccstt0zFFueMiZzFz3/+81i/fn384Ac/iPLyc/IXvydpImfR19cXe/bsiddffz2ef/75eOSRR+LZZ5+NL3/5y9Ox5VlrImexcuXK2LFjR7S0tERFRUXU1NREVVVVdHR0TMeW+T8m67F7xsOF2eOHP/xhbN68OZ5++um46KKLZno7c8rIyEjcdtttsXnz5rjiiitmejtz3ujoaJSUlMSOHTtixYoVceONN8bDDz8c27dv94+raXbgwIG45557YuPGjdHT0xOdnZ3xzjvvxNq1a2d6a0zQjP+zbMGCBVFWVhb5fH7MeD6fj5qamnHX1NTUjDu/srIy5s+fP2V7ne0mcha/8tRTT8WaNWvimWeeOe2pQIpX7FkcP348Xnvttdi/f3985StfiYiPHjyzLIvy8vL4yU9+Etdff/207H22mcjfi4ULF8bixYujqqqqMPa5z30usiyLd999Ny6//PIp3fNsNZGzaG9vj5UrV8b9998fERGf//zn41Of+lR84QtfiIceeigWLlw45fvmI5P12D3jz7hUVFTEsmXLoqurqzA2OjoaXV1d0djYOO6axsbGMfMjInbt2nXG+ZydiZxFRMSTTz4Zra2t8eSTT8ZNN900HVud9Yo9i8rKyvjZz34Wvb29hcvatWvjs5/9bPT29hZ+CSrFm8jfi5UrV8Yvf/nLOHHiRGHsrbfeitLS0liyZMmU73m2mshZfPDBB1FaOvahrqysLCIiMr+qb1pN2mN3UW/lnSJPPfVUlsvlsm3btmUHDhzI/vIv/zI7//zzs4GBgSzLsmz9+vXZn//5nxfm/+ojVffff3928ODBrKOjw8ehJ0mxZ7Fjx46svLw86+joyA4fPly4HDt2bKbuwqxR7Fn8Jp8qmjzFnsXx48ezJUuWZF/60peyN954I/uXf/mX7PLLL8/WrFkzU3dh1ij2LLZu3ZqVl5dnjz32WPaf//mf2Z49e7Lly5dnK1asmKm7MGscP348279/f7Z///4sIrKHH344279/f/Zf//VfWZZN3WP3OREuWZZl3/3ud7OLL744q6ioyFasWJH9+7//e+HPVq9enX3xi18cM/+nP/1ptnTp0qyioiK79NJLs61bt07vhmexYs7ii1/8YhYRp11Wr149/RufhYr9e/F/CZfJVexZHDx4MGtqasrmz5+fLVmyJGtra8s++OCDad717FTsWTz66KPZlVdemc2fPz9buHBh9md/9mfZu+++O827nn1++tOffuz//6fqsbskyzxXBgCkYcbf4wIAcLaECwCQDOECACRDuAAAyRAuAEAyhAsAkAzhAgAkQ7gAAMkQLgBAMoQLAJAM4QIAJOP/AS5p4xpT3jdYAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "ename": "", + "evalue": "zero-size array to reduction operation minimum which has no identity", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[13], line 7\u001b[0m\n\u001b[1;32m 3\u001b[0m dataset \u001b[38;5;241m=\u001b[39m [df_overall[df_overall[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquery\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m q][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrating\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m q \u001b[38;5;129;01min\u001b[39;00m queries]\n\u001b[1;32m 5\u001b[0m nb_queries \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(queries)\n\u001b[0;32m----> 7\u001b[0m \u001b[43maxes\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mviolinplot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshowmeans\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbw_method\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.05\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 8\u001b[0m axes\u001b[38;5;241m.\u001b[39mset_xlabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mquery\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 9\u001b[0m axes\u001b[38;5;241m.\u001b[39mset_ylabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mratings\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/__init__.py:1412\u001b[0m, in \u001b[0;36m_preprocess_data..inner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1409\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 1410\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minner\u001b[39m(ax, \u001b[38;5;241m*\u001b[39margs, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 1411\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43max\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mmap\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msanitize_sequence\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1414\u001b[0m bound \u001b[38;5;241m=\u001b[39m new_sig\u001b[38;5;241m.\u001b[39mbind(ax, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 1415\u001b[0m auto_label \u001b[38;5;241m=\u001b[39m (bound\u001b[38;5;241m.\u001b[39marguments\u001b[38;5;241m.\u001b[39mget(label_namer)\n\u001b[1;32m 1416\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m bound\u001b[38;5;241m.\u001b[39mkwargs\u001b[38;5;241m.\u001b[39mget(label_namer))\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/axes/_axes.py:7938\u001b[0m, in \u001b[0;36mAxes.violinplot\u001b[0;34m(self, dataset, positions, vert, widths, showmeans, showextrema, showmedians, quantiles, points, bw_method)\u001b[0m\n\u001b[1;32m 7935\u001b[0m kde \u001b[38;5;241m=\u001b[39m mlab\u001b[38;5;241m.\u001b[39mGaussianKDE(X, bw_method)\n\u001b[1;32m 7936\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m kde\u001b[38;5;241m.\u001b[39mevaluate(coords)\n\u001b[0;32m-> 7938\u001b[0m vpstats \u001b[38;5;241m=\u001b[39m \u001b[43mcbook\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mviolin_stats\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_kde_method\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpoints\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpoints\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7939\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantiles\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantiles\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7940\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mviolin(vpstats, positions\u001b[38;5;241m=\u001b[39mpositions, vert\u001b[38;5;241m=\u001b[39mvert,\n\u001b[1;32m 7941\u001b[0m widths\u001b[38;5;241m=\u001b[39mwidths, showmeans\u001b[38;5;241m=\u001b[39mshowmeans,\n\u001b[1;32m 7942\u001b[0m showextrema\u001b[38;5;241m=\u001b[39mshowextrema, showmedians\u001b[38;5;241m=\u001b[39mshowmedians)\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/cbook/__init__.py:1447\u001b[0m, in \u001b[0;36mviolin_stats\u001b[0;34m(X, method, points, quantiles)\u001b[0m\n\u001b[1;32m 1444\u001b[0m stats \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 1446\u001b[0m \u001b[38;5;66;03m# Calculate basic stats for the distribution\u001b[39;00m\n\u001b[0;32m-> 1447\u001b[0m min_val \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1448\u001b[0m max_val \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mmax(x)\n\u001b[1;32m 1449\u001b[0m quantile_val \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mpercentile(x, \u001b[38;5;241m100\u001b[39m \u001b[38;5;241m*\u001b[39m q)\n", + "File \u001b[0;32m<__array_function__ internals>:200\u001b[0m, in \u001b[0;36mamin\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2946\u001b[0m, in \u001b[0;36mamin\u001b[0;34m(a, axis, out, keepdims, initial, where)\u001b[0m\n\u001b[1;32m 2829\u001b[0m \u001b[38;5;129m@array_function_dispatch\u001b[39m(_amin_dispatcher)\n\u001b[1;32m 2830\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mamin\u001b[39m(a, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, keepdims\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue, initial\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue,\n\u001b[1;32m 2831\u001b[0m where\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue):\n\u001b[1;32m 2832\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2833\u001b[0m \u001b[38;5;124;03m Return the minimum of an array or minimum along an axis.\u001b[39;00m\n\u001b[1;32m 2834\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2944\u001b[0m \u001b[38;5;124;03m 6\u001b[39;00m\n\u001b[1;32m 2945\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 2946\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_wrapreduction\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mminimum\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmin\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2947\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeepdims\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minitial\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwhere\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwhere\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/numpy/core/fromnumeric.py:86\u001b[0m, in \u001b[0;36m_wrapreduction\u001b[0;34m(obj, ufunc, method, axis, dtype, out, **kwargs)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m reduction(axis\u001b[38;5;241m=\u001b[39maxis, out\u001b[38;5;241m=\u001b[39mout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mpasskwargs)\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mufunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreduce\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpasskwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mValueError\u001b[0m: zero-size array to reduction operation minimum which has no identity" + ], + "output_type": "error" + } + ], + "id": "70b93e5d-425d-4925-97fd-1b062f7c373f" + }, + { + "cell_type": "markdown", + "source": "### Rating distribution per rater\n\nAssuming raters have seen the same pairs and that they had the same guidelines, their ratings should be overall calibrated. This is what we want to check here. \nWe could easily detect outlier raters that rate very different to others, for example because they haven't really understood the guidelines.", + "metadata": {}, + "id": "fa14bfdd-ea38-4fcc-9532-4019306410b1" + }, + { + "cell_type": "code", + "source": "fig, axes = plt.subplots()\nraters = df_overall['rater'].unique()\ndataset = [df_overall[df_overall['rater'] == r][\"rating\"] for r in raters]\n\naxes.violinplot(dataset = dataset, showmeans=True, bw_method=0.05)\naxes.set_xlabel('rater')\naxes.set_ylabel('ratings')\naxes.yaxis.grid(True)\naxes.set_xticks(range(1,nb_raters+1))\naxes.set_xticklabels(raters)\nplt.title('Rating distribution per rater')\nplt.show()", + "metadata": { + "trusted": true + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "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x7F8+fL45je/GYsXL44rrrgivva1r8WHH344XduelSZyFo2NjdHf3x8vvfRSZFkW+Xw+nn322bjxxhuna9v8f5P12D3j4XLkyJEYGRmJ6urqMePV1dUxMDAw7pqBgYFx5w8NDfkfwycwkbP4Td/+9rfjxIkTccstt0zFFueMiZzFz3/+81i/fn384Ac/iPLyc/IXvydpImfR19cXe/bsiddffz2ef/75eOSRR+LZZ5+NL3/5y9Ox5VlrImexcuXK2LFjR7S0tERFRUXU1NREVVVVdHR0TMeW+T8m67F7xsOF2eOHP/xhbN68OZ5++um46KKLZno7c8rIyEjcdtttsXnz5rjiiitmejtz3ujoaJSUlMSOHTtixYoVceONN8bDDz8c27dv94+raXbgwIG45557YuPGjdHT0xOdnZ3xzjvvxNq1a2d6a0zQjP+zbMGCBVFWVhb5fH7MeD6fj5qamnHX1NTUjDu/srIy5s+fP2V7ne0mcha/8tRTT8WaNWvimWeeOe2pQIpX7FkcP348Xnvttdi/f3985StfiYiPHjyzLIvy8vL4yU9+Etdff/207H22mcjfi4ULF8bixYujqqqqMPa5z30usiyLd999Ny6//PIp3fNsNZGzaG9vj5UrV8b9998fERGf//zn41Of+lR84QtfiIceeigWLlw45fvmI5P12D3jz7hUVFTEsmXLoqurqzA2OjoaXV1d0djYOO6axsbGMfMjInbt2nXG+ZydiZxFRMSTTz4Zra2t8eSTT8ZNN900HVud9Yo9i8rKyvjZz34Wvb29hcvatWvjs5/9bPT29hZ+CSrFm8jfi5UrV8Yvf/nLOHHiRGHsrbfeitLS0liyZMmU73m2mshZfPDBB1FaOvahrqysLCIiMr+qb1pN2mN3UW/lnSJPPfVUlsvlsm3btmUHDhzI/vIv/zI7//zzs4GBgSzLsmz9+vXZn//5nxfm/+ojVffff3928ODBrKOjw8ehJ0mxZ7Fjx46svLw86+joyA4fPly4HDt2bKbuwqxR7Fn8Jp8qmjzFnsXx48ezJUuWZF/60peyN954I/uXf/mX7PLLL8/WrFkzU3dh1ij2LLZu3ZqVl5dnjz32WPaf//mf2Z49e7Lly5dnK1asmKm7MGscP348279/f7Z///4sIrKHH344279/f/Zf//VfWZZN3WP3OREuWZZl3/3ud7OLL744q6ioyFasWJH9+7//e+HPVq9enX3xi18cM/+nP/1ptnTp0qyioiK79NJLs61bt07vhmexYs7ii1/8YhYRp11Wr149/RufhYr9e/F/CZfJVexZHDx4MGtqasrmz5+fLVmyJGtra8s++OCDad717FTsWTz66KPZlVdemc2fPz9buHBh9md/9mfZu+++O827nn1++tOffuz//6fqsbskyzxXBgCkYcbf4wIAcLaECwCQDOECACRDuAAAyRAuAEAyhAsAkAzhAgAkQ7gAAMkQLgBAMoQLAJAM4QIAJOP/AS5p4xpT3jdYAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + }, + { + "ename": "", + "evalue": "zero-size array to reduction operation minimum which has no identity", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[14], line 5\u001b[0m\n\u001b[1;32m 2\u001b[0m raters \u001b[38;5;241m=\u001b[39m df_overall[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrater\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39munique()\n\u001b[1;32m 3\u001b[0m dataset \u001b[38;5;241m=\u001b[39m [df_overall[df_overall[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrater\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m==\u001b[39m r][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrating\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;28;01mfor\u001b[39;00m r \u001b[38;5;129;01min\u001b[39;00m raters]\n\u001b[0;32m----> 5\u001b[0m \u001b[43maxes\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mviolinplot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mshowmeans\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbw_method\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.05\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 6\u001b[0m axes\u001b[38;5;241m.\u001b[39mset_xlabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrater\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 7\u001b[0m axes\u001b[38;5;241m.\u001b[39mset_ylabel(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mratings\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/__init__.py:1412\u001b[0m, in \u001b[0;36m_preprocess_data..inner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1409\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 1410\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21minner\u001b[39m(ax, \u001b[38;5;241m*\u001b[39margs, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 1411\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1412\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[43max\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mmap\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43msanitize_sequence\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1414\u001b[0m bound \u001b[38;5;241m=\u001b[39m new_sig\u001b[38;5;241m.\u001b[39mbind(ax, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 1415\u001b[0m auto_label \u001b[38;5;241m=\u001b[39m (bound\u001b[38;5;241m.\u001b[39marguments\u001b[38;5;241m.\u001b[39mget(label_namer)\n\u001b[1;32m 1416\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m bound\u001b[38;5;241m.\u001b[39mkwargs\u001b[38;5;241m.\u001b[39mget(label_namer))\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/axes/_axes.py:7938\u001b[0m, in \u001b[0;36mAxes.violinplot\u001b[0;34m(self, dataset, positions, vert, widths, showmeans, showextrema, showmedians, quantiles, points, bw_method)\u001b[0m\n\u001b[1;32m 7935\u001b[0m kde \u001b[38;5;241m=\u001b[39m mlab\u001b[38;5;241m.\u001b[39mGaussianKDE(X, bw_method)\n\u001b[1;32m 7936\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m kde\u001b[38;5;241m.\u001b[39mevaluate(coords)\n\u001b[0;32m-> 7938\u001b[0m vpstats \u001b[38;5;241m=\u001b[39m \u001b[43mcbook\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mviolin_stats\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdataset\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m_kde_method\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpoints\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpoints\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 7939\u001b[0m \u001b[43m \u001b[49m\u001b[43mquantiles\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquantiles\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7940\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mviolin(vpstats, positions\u001b[38;5;241m=\u001b[39mpositions, vert\u001b[38;5;241m=\u001b[39mvert,\n\u001b[1;32m 7941\u001b[0m widths\u001b[38;5;241m=\u001b[39mwidths, showmeans\u001b[38;5;241m=\u001b[39mshowmeans,\n\u001b[1;32m 7942\u001b[0m showextrema\u001b[38;5;241m=\u001b[39mshowextrema, showmedians\u001b[38;5;241m=\u001b[39mshowmedians)\n", + "File \u001b[0;32m/lib/python3.11/site-packages/matplotlib/cbook/__init__.py:1447\u001b[0m, in \u001b[0;36mviolin_stats\u001b[0;34m(X, method, points, quantiles)\u001b[0m\n\u001b[1;32m 1444\u001b[0m stats \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 1446\u001b[0m \u001b[38;5;66;03m# Calculate basic stats for the distribution\u001b[39;00m\n\u001b[0;32m-> 1447\u001b[0m min_val \u001b[38;5;241m=\u001b[39m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmin\u001b[49m\u001b[43m(\u001b[49m\u001b[43mx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1448\u001b[0m max_val \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mmax(x)\n\u001b[1;32m 1449\u001b[0m quantile_val \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mpercentile(x, \u001b[38;5;241m100\u001b[39m \u001b[38;5;241m*\u001b[39m q)\n", + "File \u001b[0;32m<__array_function__ internals>:200\u001b[0m, in \u001b[0;36mamin\u001b[0;34m(*args, **kwargs)\u001b[0m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2946\u001b[0m, in \u001b[0;36mamin\u001b[0;34m(a, axis, out, keepdims, initial, where)\u001b[0m\n\u001b[1;32m 2829\u001b[0m \u001b[38;5;129m@array_function_dispatch\u001b[39m(_amin_dispatcher)\n\u001b[1;32m 2830\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mamin\u001b[39m(a, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, out\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m, keepdims\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue, initial\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue,\n\u001b[1;32m 2831\u001b[0m where\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39m_NoValue):\n\u001b[1;32m 2832\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 2833\u001b[0m \u001b[38;5;124;03m Return the minimum of an array or minimum along an axis.\u001b[39;00m\n\u001b[1;32m 2834\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 2944\u001b[0m \u001b[38;5;124;03m 6\u001b[39;00m\n\u001b[1;32m 2945\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 2946\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_wrapreduction\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mminimum\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mmin\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2947\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkeepdims\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minitial\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minitial\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwhere\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mwhere\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/numpy/core/fromnumeric.py:86\u001b[0m, in \u001b[0;36m_wrapreduction\u001b[0;34m(obj, ufunc, method, axis, dtype, out, **kwargs)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m reduction(axis\u001b[38;5;241m=\u001b[39maxis, out\u001b[38;5;241m=\u001b[39mout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mpasskwargs)\n\u001b[0;32m---> 86\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mufunc\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreduce\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mpasskwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mValueError\u001b[0m: zero-size array to reduction operation minimum which has no identity" + ], + "output_type": "error" + } + ], + "id": "f954846d-54a9-4cf1-a9da-ab0faaa46df9" + }, + { + "cell_type": "markdown", + "source": "## Ratings Analysis\n\nWe now focus on the ratings themselves. We first plot the overall rating distributions", + "metadata": {}, + "id": "6168e768" + }, + { + "cell_type": "markdown", + "source": "### Overall rating distribution", + "metadata": {}, + "id": "92f38adf" + }, + { + "cell_type": "code", + "source": "from matplotlib.ticker import MaxNLocator\nplt.hist(df_overall['rating'])\nplt.title('Overall ratings')\nplt.xticks(range(len(ratings)), ratings,\n rotation=60) \nNone\nplt.ylabel('nb_ratings')\nplt.gca().yaxis.set_major_locator(MaxNLocator(integer=True))\n\nplt.grid()", + "metadata": { + "trusted": true + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "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TF9//bWsVqvGjBmj2rVrS5KOHTum0qVL688//1TlypXl4uJiz5JRjKSlpWnNmjVav369zpw5o2rVqqlPnz567LHH7F0aipmZM2fqiy++0MWLF5Wenq5JkybpmWeekXQ9vJUsWVJ33XWXbU8GUBSWLVumpUuXKioqSo6Ojjl2trz33nuKi4vTiy++eFvf2wQ1O8vMzJSjo6MmTJig1atX6/7779exY8d07Ngx9ezZU+PHj1dAQIC9y0Qx8PdDS9euXZO7u7sk6fz581q1apW+/vprXbp0SY0aNdK8efP40YBClf35+MEHH2j8+PHq16+f6tevr++//17vvvuuGjVqpDVr1sjHx4crkGEXX331ldq3b6/169fr8ccfz7Gsf//+Sk1N1SeffHJbYxDU7Cg7eZ8+fVr33HOPvvrqKzVr1kxPPfWUTpw4oT/++EPXrl3TSy+9pF69eumuu+6yd8koBjZu3Ki1a9fKxcVFPj4+GjRokMqXLy9JiomJ0aJFi1S3bl0NHz7czpWiuKhVq5aee+45jRw50tZ24MAB9e/fX8HBwZo1a5Ydq0NxlpGRoT59+ujs2bMaOnSoHnnkEfn5+WnVqlV69tlndfDgQdWqVeu2xiComcC4ceN09uxZffLJJ9q1a5c6dOigH374QampqQoKClJKSopefvllTZgwwd6l4j8qe8/F5s2bNXToUN19992qWrWqPvnkE1WoUEF9+/bV6NGjbbv02XuBopKQkKCOHTtq2LBheuqppyT934/cyZMna/369frmm2/yddsDoCCcPXtWzz//vH755Re5ubnpl19+UfXq1dWxY0dNmTLltrfPwXw7S0tLU82aNVWnTh1J0rx589S7d29Vr15dKSkp6tOnj0JDQ/XQQw/ZuVL8l2U/z3PUqFHq27evpk6dqkWLFmnVqlVq2LChIiIitGXLFvXp00e9e/e2c7UoTjw9PeXu7q45c+aoVatW8vX1tf1gaNu2rVasWKGUlBSCGgpd9g/akydPavPmzdq4caPq16+v5s2b6/PPP9fnn3+u33//XVarVa1atbrtPWnZCGp25urqql69eunixYuSrn9henl5Sbr+gPZdu3apbdu2nCCLQrdhwwa5u7srPDxcGRkZeuWVVzR79mx169ZN7du31759++Tl5aXevXuzNw1FxtnZWfPmzVO/fv00cuRIdejQQT16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\n" + }, + "metadata": {} + } + ], + "id": "078955ba" + }, + { + "cell_type": "markdown", + "source": "### Agreements between raters\nIn this section we want to check how much raters agree or disagree.\n\n - If all raters agreeing on a rating will give us confidence about the rating\n - If all raters disagree, for example, 1 rating `Poor` another one rating `Fair` and the third one rating `Perfect`, then something draws our attention. Either the intent was not clear or raters did not rate as expected. ", + "metadata": {}, + "id": "cf354a46-d693-47e5-8148-fbef8e8d8b25" + }, + { + "cell_type": "code", + "source": "vals = []\nlabs = []\ncols = []\nfor agent,col in (('rating_0','blue'),\n ('rating_1','red'),\n ('rating_2', 'green')\n ):\n vals.append(df[agent])\n labs.append(agent)\n cols.append(col)\nplt.hist(vals, color=cols, label=labs)\n\nplt.legend()\nplt.title('Overall ratings')\nplt.xticks(range(len(ratings)), ratings, rotation=60) \nNone", + "metadata": { + "trusted": true + }, + "execution_count": 16, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "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0EFr1qzRwoULdfr0aW3fvl3Tpk2zLpOTkyNJGjVqVJ4jOdLVASCvu9iGDBmit956S8OGDVODBg3k7e0ti8WiiIgI6zbyQ17b/vXXX9W8eXNVq1ZNs2fPVmBgoFxdXfXpp59qzpw5/2r7fx9Zy2UYxk2tb9asWerVq5c+/vhjff7553r22WcVGRmpb775xnqhPQD7IjgBTqBt27ZasmSJvvrqKzVu3Piq97dt26ajR4+qf//+Nu1dunTRsmXLtGnTJh04cECGYVhP00myTl1QrFgxhYWF3XR9q1at0pNPPqlZs2ZZ29LS0nThwoWbXqdZa9euVXp6umJjY1WxYkVr+98vzpZ01ahQfrjzzjv1008/yTAMm/X/8ssvefavWbOmatasqRdeeEFff/21GjVqpKioKE2dOjXfawNwNU7VAU7gueeeU/HixdW/f3+dO3fO5r3z589rwIAB8vDw0HPPPWfzXlhYmEqVKqWVK1dq5cqVuv/++21Od/n5+alp06ZavHixTp06ddV2//jjD1P1FSlS5KpRmNdee03Z2dlmd/Gm5Y4K/XX7SUlJeuutt67q6+npme9hLjw8XCdOnLCZviEtLU1Lliyx6ZecnKysrCybtpo1a8rFxUXp6en5WhOAa2PECXACISEhWrZsmbp166aaNWteNXP42bNn9f7776ty5co2yxUrVkyPPfaYVqxYoZSUFL366qtXrXvBggVq3Lixatasqb59+6pSpUo6ffq04uPj9fvvv2vPnj3/WF/btm31zjvvyNvbW9WrV1d8fLw2btyo0qVL59vP4FpatGghV1dXtWvXTv3799elS5e0ZMkS+fn5XRUG69atq0WLFmnq1KmqUqWK/Pz89PDDD/+r7ffv31+vv/66unbtqqFDh6ps2bJavny5dULN3FGozZs3a/DgwXr88cdVtWpVZWVl6Z133lGRIkXUsWPHf1UDAPMIToCTePzxx1WtWjVFRkZaw1Lp0qXVrFkzjRs3zjov09916dJF0dHRslgs6ty581XvV69eXd99951efPFFLV26VOfOnZOfn5/uueceTZw40VRt8+bNU5EiRbR8+XKlpaWpUaNG2rhx4zWvm8pPoaGhWrVqlV544QWNGjVKAQEBGjhwoHx9ffXUU0/Z9J04caKOHTumGTNm6OLFi3rooYf+dXAqUaKENm/erCFDhmjevHkq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\n" + }, + "metadata": {} + } + ], + "id": "cf6869d0-3498-4d44-9bf6-d55e580916d1" + }, + { + "cell_type": "code", + "source": "def nb_distinct_ratings(r):\n return len({r['rating_0'], r['rating_1'], r['rating_2']})\ndf['nb_distinct_ratings'] = df.apply(nb_distinct_ratings, axis=1)\ndf['nb_distinct_ratings'].hist()\nplt.xticks([1, 2, 3], ['3 Agree', '2 Agree', 'All disagree'],\n rotation=45) \nplt.ylabel('nb cases')\nplt.title('Agents agreements')", + "metadata": { + "trusted": true + }, + "execution_count": 17, + "outputs": [ + { + "execution_count": 17, + "output_type": "execute_result", + "data": { + "text/plain": "Text(0.5, 1.0, 'Agents agreements')" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm0AAAHpCAYAAADQwgvtAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFw0lEQVR4nO3deVxUZf//8feArCqiqeCCu7kvpWmWW4lSauZCYpYWbllhbuVSuaZpi2tqlmt36e0eepuZuLUomWtpomlq5gIqKqMgCDPn94c/5usELhg6HHk9H48eMRfXOfM5cDnz5jrnXGMxDMMQAAAAcjQ3VxcAAACAWyO0AQAAmAChDQAAwAQIbQAAACZAaAMAADABQhsAAIAJENoAAABMgNAGAABgAoQ2AAAAEyC0AQAAmAChDchFZsyYIYvFovr167u6lEzNmDFD8+fPd3UZuImFCxdq8uTJri4DyJUsfPYokHs8/vjjOnXqlI4dO6ZDhw6pQoUKri7JSfXq1VW4cGFt3rzZ1aXgBlq3bq19+/bp2LFjri4FyHWYaQNyiaNHj2rr1q2aOHGiihQpogULFri6pPtGUlKSq0sAkAsQ2oBcYsGCBSpYsKBatWql0NDQG4a2+Ph4denSRX5+fvL399dLL72kX3/9VRaLJcOpywMHDig0NFSFChWSt7e36tatq1WrVjn1mT9/viwWi7Zs2aIBAwaoSJEiyps3r9q1a6ezZ886+pUpU0a///67vv/+e1ksFlksFjVt2lSSlJqaqlGjRqlixYry9vbWAw88oIYNGyoqKuqmx3z+/Hm9+eabqlGjhvLlyyc/Pz89/fTT+vXXXzP0/euvv9SmTRvlzZtXRYsWVf/+/fXdd9/JYrE4zfw1bdpU1atX186dO9W4cWP5+vrq7bffliSlpKRoxIgRqlChgry8vBQUFKRBgwYpJSUlw/N99dVXqlOnjnx8fFSoUCF16tRJf//9t1Of9Of67bff1KRJE/n6+qpChQpatmyZJOn7779X/fr15ePjo0qVKmn9+vUZnufkyZPq1q2bAgIC5OXlpWrVqmnu3LlOfTZv3iyLxaIlS5Zo7NixKlmypLy9vdWsWTMdPnzYqZ5vvvlGf/31l+N3VKZMGcf3P/nkE1WrVk2+vr4qWLCg6tatq4ULF970dwTg9uVxdQEA7o0FCxaoffv28vT01PPPP69PP/1U27dv1yOPPOLoY7fb9cwzz+iXX37Rq6++qsqVK2vlypV66aWXMuzv999/1+OPP64SJUpoyJAhyps3r5YsWaK2bdtq+fLlateunVP/Pn36qGDBghoxYoSOHTumyZMnKyIiQosXL5YkTZ48WX369FG+fPn0zjvvSJICAgIkSSNHjtS4cePUo0cP1atXT1arVTt27NCuXbvUvHnzGx7zkSNHFBkZqeeee05ly5ZVXFycPvvsMzVp0kT79+9X8eLFJUmJiYl68skndfr0afXt21eBgYFauHChNm3alOl+4+Pj9fTTT6tTp0568cUXFRAQILvdrjZt2uinn35Sr169VKVKFe3du1eTJk3SH3/8ocjISMf2Y8eO1bBhw9SxY0f16NFDZ8+e1SeffKLGjRtr9+7d8vf3d/S9cOGCWrdurU6dOum5557Tp59+qk6dOmnBggXq16+fevfurc6dO+ujjz5SaGio/v77b+XPn1+SFBcXp0cffVQWi0UREREqUqSIvv32W3Xv3l1Wq1X9+vVzOq7x48fLzc1Nb775phISEvThhx/qhRde0LZt2yRJ77zzjhISEnTixAlNmjRJkpQvXz5J0qxZs/TGG28oNDRUffv2VXJysn777Tdt27ZNnTt3vuHvCEAWGADuezt27DAkGVFRUYZhGIbdbjdKlixp9O3b16nf8uXLDUnG5MmTHW02m8148sknDUnGvHnzHO3NmjUzatSoYSQnJzva7Ha78dhjjxkVK1Z0tM2bN8+QZAQHBxt2u93R3r9/f8Pd3d24ePGio61atWpGkyZNMtRfq1Yto1WrVlk+7uTkZMNmszm1HT161PDy8jJGjx7taJswYYIhyYiMjHS0XblyxahcubIhydi0aZOjvUmTJoYkY+bMmU77/fLLLw03Nzfjxx9/dGqfOXOmIcnYsmWLYRiGcezYMcPd3d0YO3asU7+9e/caefLkcWpPf66FCxc62g4cOGBIMtzc3Iyff/7Z0f7dd99l+B11797dKFasmHHu3Dmn5+rUqZNRoEABIykpyTAMw9i0aZMhyahSpYqRkpLi6DdlyhRDkrF3715HW6tWrYzSpUsb//Tss88a1apVy9AOIPtwehTIBRYsWKCAgAA98cQTkiSLxaKwsDAtWrRINpvN0W/t2rXy8PBQz549HW1ubm56/fXXnfZ3/vx5bdy4UR07dtSl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\n" + }, + "metadata": {} + } + ], + "id": "fbbb3ed9-dcab-4c20-8a08-fa689b62db5d" + }, + { + "cell_type": "markdown", + "source": "Some suspicious cases we will further investigate later on:", + "metadata": {}, + "id": "7fb17be1-df26-44fc-82d3-88c5255ca5ee" + }, + { + "cell_type": "code", + "source": "print('All disagree:')\ndf[df['nb_distinct_ratings']==3]", + "metadata": { + "trusted": true + }, + "execution_count": 18, + "outputs": [ + { + "name": "stdout", + "text": "All disagree:\n", + "output_type": "stream" + }, + { + "execution_count": 18, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [query, docid, rating_0, rating_1, rating_2, rating_3, rating_4, rating_5, rating_6, rating_7, rating_8, rating_9, rating_10, rating_11, rating_12, rater_0, rater_1, rater_2, rater_3, rater_4, rater_5, rater_6, rater_7, rater_8, rater_9, rater_10, rater_11, rater_12, nb_distinct_ratings]\nIndex: []\n\n[0 rows x 29 columns]", + "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
querydocidrating_0rating_1rating_2rating_3rating_4rating_5rating_6rating_7...rater_4rater_5rater_6rater_7rater_8rater_9rater_10rater_11rater_12nb_distinct_ratings
\n

0 rows × 29 columns

\n
" + }, + "metadata": {} + } + ], + "id": "7d9b3876-17b5-42a0-97de-d9007b777aad" + }, + { + "cell_type": "markdown", + "source": "Some cases where all raters agree, we can have good confidence in the rating:", + "metadata": {}, + "id": "b4a60ac4-4c2b-4477-b7c9-285fb29f843c" + }, + { + "cell_type": "code", + "source": "print('All agree:')\ndf[df['nb_distinct_ratings']==1].sample(5)", + "metadata": { + "trusted": true + }, + "execution_count": 19, + "outputs": [ + { + "name": "stdout", + "text": "All agree:\n", + "output_type": "stream" + }, + { + "ename": "", + "evalue": "a must be greater than 0 unless no samples are taken", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[19], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mAll agree:\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m \u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mnb_distinct_ratings\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m5\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/pandas/core/generic.py:5773\u001b[0m, in \u001b[0;36mNDFrame.sample\u001b[0;34m(self, n, frac, replace, weights, random_state, axis, ignore_index)\u001b[0m\n\u001b[1;32m 5770\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m weights \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 5771\u001b[0m weights \u001b[38;5;241m=\u001b[39m sample\u001b[38;5;241m.\u001b[39mpreprocess_weights(\u001b[38;5;28mself\u001b[39m, weights, axis)\n\u001b[0;32m-> 5773\u001b[0m sampled_indices \u001b[38;5;241m=\u001b[39m \u001b[43msample\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj_len\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5774\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtake(sampled_indices, axis\u001b[38;5;241m=\u001b[39maxis)\n\u001b[1;32m 5776\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ignore_index:\n", + "File \u001b[0;32m/lib/python3.11/site-packages/pandas/core/sample.py:150\u001b[0m, in \u001b[0;36msample\u001b[0;34m(obj_len, size, replace, weights, random_state)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 148\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid weights: weights sum to zero\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrandom_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchoice\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj_len\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mweights\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mastype(\n\u001b[1;32m 151\u001b[0m np\u001b[38;5;241m.\u001b[39mintp, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 152\u001b[0m )\n", + "File \u001b[0;32mmtrand.pyx:928\u001b[0m, in \u001b[0;36mnumpy.random.mtrand.RandomState.choice\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: a must be greater than 0 unless no samples are taken" + ], + "output_type": "error" + } + ], + "id": "8b065a8e-c76c-4e8b-ab5e-e1ec25db6a60" + }, + { + "cell_type": "markdown", + "source": "Not perfect but 2 / 3 raters agreed on the rating value:", + "metadata": {}, + "id": "294c4445-1c81-4c73-96ac-6001f3f83ff2" + }, + { + "cell_type": "code", + "source": "print('Majority agree:')\ndf[df['nb_distinct_ratings']==2]", + "metadata": { + "trusted": true + }, + "execution_count": 20, + "outputs": [ + { + "name": "stdout", + "text": "Majority agree:\n", + "output_type": "stream" + }, + { + "execution_count": 20, + "output_type": "execute_result", + "data": { + "text/plain": "Empty DataFrame\nColumns: [query, docid, rating_0, rating_1, rating_2, rating_3, rating_4, rating_5, rating_6, rating_7, rating_8, rating_9, rating_10, rating_11, rating_12, rater_0, rater_1, rater_2, rater_3, rater_4, rater_5, rater_6, rater_7, rater_8, rater_9, rater_10, rater_11, rater_12, nb_distinct_ratings]\nIndex: []\n\n[0 rows x 29 columns]", + "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
querydocidrating_0rating_1rating_2rating_3rating_4rating_5rating_6rating_7...rater_4rater_5rater_6rater_7rater_8rater_9rater_10rater_11rater_12nb_distinct_ratings
\n

0 rows × 29 columns

\n
" + }, + "metadata": {} + } + ], + "id": "2b300fa0-4876-46c6-9526-91afe73b1d7a" + }, + { + "cell_type": "markdown", + "source": "### Big discrepancies\n\nThos cases are the most suspicious ones. Some raters rated as `3-Perfect` some other rated as '1-Fair' or '0-Bad' (or at least a difference of 2 grades).\nThere can be several reasons for that:\n - there is an issue with the pair: query not clear, document not clear\n - guidelines not well specified: a very common case is when the guidelines are not 100% clear to the raters. For example, what happens if the image of the results is relevant but the text is not? Or if some document fields are missing?\n - no clear intent. Was the intent of the query clear enough? This can cause confusion to the raters. It's important to give an opportunity to the rater to say `I don't know how to rate this pair!`\n", + "metadata": {}, + "id": "a2b7880d-4707-4cf0-ad2e-20f5ee1f912e" + }, + { + "cell_type": "code", + "source": "def big_discrepancy(r):\n \"\"\"returns 1 if there is at least one 2 grades between 1 rating and another, 0 otherwise\"\"\"\n ratings = [r[f'rating_{i}'] for i in range(nb_raters)]\n return 1 if max(ratings) - min(ratings) >=2 else 0\ndf['big_discrepancy'] = df.apply(big_discrepancy, axis=1)\ndf[df['big_discrepancy']==1].sample(2)", + "metadata": { + "trusted": true + }, + "execution_count": 21, + "outputs": [ + { + "ename": "", + "evalue": "a must be greater than 0 unless no samples are taken", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[21], line 6\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;241m1\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mmax\u001b[39m(ratings) \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mmin\u001b[39m(ratings) \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;241m0\u001b[39m\n\u001b[1;32m 5\u001b[0m df[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbig_discrepancy\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m df\u001b[38;5;241m.\u001b[39mapply(big_discrepancy, axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m----> 6\u001b[0m \u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mbig_discrepancy\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m==\u001b[39;49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/lib/python3.11/site-packages/pandas/core/generic.py:5773\u001b[0m, in \u001b[0;36mNDFrame.sample\u001b[0;34m(self, n, frac, replace, weights, random_state, axis, ignore_index)\u001b[0m\n\u001b[1;32m 5770\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m weights \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 5771\u001b[0m weights \u001b[38;5;241m=\u001b[39m sample\u001b[38;5;241m.\u001b[39mpreprocess_weights(\u001b[38;5;28mself\u001b[39m, weights, axis)\n\u001b[0;32m-> 5773\u001b[0m sampled_indices \u001b[38;5;241m=\u001b[39m \u001b[43msample\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj_len\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mweights\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5774\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtake(sampled_indices, axis\u001b[38;5;241m=\u001b[39maxis)\n\u001b[1;32m 5776\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ignore_index:\n", + "File \u001b[0;32m/lib/python3.11/site-packages/pandas/core/sample.py:150\u001b[0m, in \u001b[0;36msample\u001b[0;34m(obj_len, size, replace, weights, random_state)\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 148\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mInvalid weights: weights sum to zero\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 150\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mrandom_state\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mchoice\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj_len\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msize\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msize\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreplace\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreplace\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mp\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mweights\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mastype(\n\u001b[1;32m 151\u001b[0m np\u001b[38;5;241m.\u001b[39mintp, copy\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 152\u001b[0m )\n", + "File \u001b[0;32mmtrand.pyx:928\u001b[0m, in \u001b[0;36mnumpy.random.mtrand.RandomState.choice\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: a must be greater than 0 unless no samples are taken" + ], + "output_type": "error" + } + ], + "id": "a784ae64-cb70-43dd-8bca-459a60663987" + }, + { + "cell_type": "markdown", + "source": "### Overall confusion between raters\nConfusion analysis allows to understand the types of disagreements between raters. \nIn a health rating setup we would expect to have most of the confusions between `0` and `1` or `1` and `2`.\n", + "metadata": {}, + "id": "9df4a62c-df0d-46fd-bfa0-c96c9158542c" + }, + { + "cell_type": "code", + "source": "y1 = []\ny2 = []\nfor i,r in df.iterrows():\n #12\n y1.append(r['rating_0'])\n y2.append(r['rating_1'])\n\n ", + "metadata": { + "trusted": true + }, + "execution_count": 22, + "outputs": [], + "id": "6d8a99b9-f823-4829-aed8-9e376a0dfa73" + }, + { + "cell_type": "code", + "source": "from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\ncm = confusion_matrix(y1, y2, labels=range(len(ratings)))\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm,\n display_labels=ratings)\nplt.figure(figsize=(8,8))\ndisp.plot(xticks_rotation=45, colorbar=False, cmap=plt.cm.Blues, ax=plt.gca(), values_format='d')\nplt.xlabel('');plt.ylabel('')\nplt.gca().xaxis.tick_top()", + "metadata": { + "trusted": true + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": "
", + "image/png": "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vj369u0bd95550eep02bNrmvP81r0vbt26Np06axbNmyaNq0aYPHioqKIiKiRYsWe3GkaRDE7JX8/Pzo27dvzJ8/P/eZrfX19TF//vyYMGFClJWVfeofEk2bNo333nsvIiJeeumleOutt2Lq1Km5e5Wef/75Btv36NEjHnzwwQbrnn322f08Ig5He3OeRUQsXrw4Tj755Bg3blxu3YevuvD5l2VZXHTRRXHffffFggUL4thjj23w+O7OqXPOOSeuvPLKWLFixW7vI46IOO6443L3m3/xi1+MiF3vi1i6dGnu46t69OgR9957b2RZlguhxYsXR3FxcXTs2DHKysqiefPmsWTJkujUqVNERLz99tvx8ssv5/5iRuNVX18fNTU1e3x9+rhf2CN2vZ/m7rvvjqOPPjpKSkr2ax69e/eOurq6ePPNN+OUU0752G1OPPHEmD9/flxzzTUf+3h+fn7U1dXt1zwON26ZYK9NnDgxfvazn8Xs2bNjzZo1MXbs2NixY0ecd955ux2TZVm8/vrr8frrr8f69evj9ttvj3nz5sWwYcMiIqJTp06Rn58ft956a/zlL3+JBx98MK677roG+xgzZkz86U9/isrKyli7dm3cddddPjf2c2z79u252x4iItavXx9VVVWfeJvDx+natWs8//zzMW/evHj55ZfjP/7jP2Lp0qWf8YxpzMaPHx+//vWv46677ori4uLc69EHv5TvzqWXXhrl5eUxZMiQmDZtWixfvjzWr18f8+bNi0cffTR3Ba6wsDDGjh0blZWV8dhjj8WLL74YF154Ybz77rtxwQUXRETEuHHjYtOmTXHRRRfFSy+9FA888EBcffXVMXHixGjSpEkUFRXFBRdcEJWVlfH73/8+XnjhhRg9enQ0aeJHdWMzadKkWLRoUWzYsCFWr14dkyZNigULFsTIkSP3aX8jR46M1q1bx7Bhw+Kpp56K9evXx4IFC+J73/tevPLKK3u1r27dusXIkSNj1KhRMXfu3Fi/fn0899xzMWXKlHjkkUdy81+6dGmMGzcuVq1aFS+99FLMmDEjtmzZEhG7PjN5yZIlsWHDhtiyZUvU19fv03EdVg7xPcwcpm699dasU6dOWX5+fta/f//s2Wef3e22H7yp7oOloKAg69atW/bDH/4w+9vf/pbb7q677so6d+6cFRQUZOXl5dmDDz6YRUS2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QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASUs6iEePHh3Dhw8/1NMAAOAQalRBvGjRohg6dGh06NAh8vLy4v777//EMZ07d468vLwGS8eOHT/V802bNi1mzZq1f5MGAOCw1qiCeMeOHdGrV6+YPn36Xo279tprY/PmzbllxYoVn2pcaWlptGrVareP19bW7tU8AAA4/DQ71BP4sDPPPDPOPPPMvR5XXFwc7dq1a7Curq4uvvvd78bvf//7eP3116NTp04xbty4uPjii3PbjB49Ot55553clejBgwfH8ccfH82aNYtf//rXccIJJ8STTz65X8cEAEDj1qiC+LNUX18fHTt2jHvuuSeOOuqoePrpp+O73/1utG/fPkaMGLHbcbNnz46xY8fG4sWLd7tNTU1N1NTU5L6vrq7+TOcOAMDB06humdhXl19+eRQVFeWWW265JZo3bx7XXHNNnHTSSXHsscfGyJEj47zzzovf/va3e9xX165d48Ybb4zu3btH9+7dP3abKVOmRGlpaW455phjDsRhAQBwEBw2QTx58uQG0btx48bcY5WVlVFVVZVbRo0aFRER06dPj759+0abNm2iqKgobr/99gbjPk7fvn0/cS6TJk2KrVu35pZNmzbt38EBAHDIHDa3TIwZM6bBrQ4dOnTIfd26devo0qVLg+3nzJkTl112Wdx8881RXl4excXFcdNNN8WSJUv2+DyFhYWfOJeCgoIoKCjYyyMAAKAxOmyCuKysLMrKyj719osXL46TTz45xo0bl1u3bt26AzE1AAAOY40qiLdv3x5//vOfc9+vX78+qqqqoqysLDp16rRX++ratWv88pe/jHnz5sWxxx4bv/rVr2Lp0qVx7LHHftbTBgDgMNao7iF+/vnno3fv3tG7d++IiJg4cWL07t07rrrqqr3e17/+67/GWWedFWeffXYMGDAg3nrrrQZXiwEAICIiL8uy7FBP4nBXXV0dpaWl8cZbW6OkpORQTwcAIHnV1dXR9qjS2Lr1k/usUV0hBgCAg00QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEEMAEDSBDEAAEkTxAAAJE0QAwCQNEG8G4MHD45LLrnkUE8DAIAD7IAG8ZQpU6Jfv35RXFwcRx99dAwfPjzWrl37qcbW1tbGTTfdFH369InCwsIoLS2NXr16xZVXXhmvvfbagZw2AAAJOaBBvHDhwhg/fnw8++yz8cQTT8TOnTvj9NNPjx07duxxXE1NTZx22mkxefLkGD16dCxatChWr14dt9xyS2zZsiVuvfXWAzltAAAS0uxA7vyxxx5r8P2sWbPi6KOPjmXLlsU//uM/7nbcj3/84/jDH/4Qzz//fPTu3Tu3vlOnTjFo0KDIsiy3rqamJiorK2POnDlRXV0dJ510Uvz4xz+Ofv365bZZuHBhVFZWxsqVK6OsrCzOPffcuP7666NZs12Hv2PHjhg7dmzMnTs3iouL47LLLvus/gkAAGjkDuo9xFu3bo2IiLKysj1u95vf/CZOO+20BjH8YXl5ebmv/+3f/i3uvffemD17dixfvjy6dOkSFRUV8de//jUiIl599dX46le/Gv369YuVK1fGjBkz4o477ojrr78+t4/KyspYuHBhPPDAA/H444/HggULYvny5budX01NTVRXVzdYAAA4PB20IK6vr49LLrkkBg4cGMcff/wet3355Zeje/fuDdZ94xvfiKKioigqKoqTTz45InZd2Z0xY0bcdNNNceaZZ0bPnj3jZz/7WbRo0SLuuOOOiIi47bbb4phjjon//u//ji9/+csxfPjwuOaaa+Lmm2+O+vr62L59e9xxxx3xox/9KIYMGRInnHBCzJ49O/72t7/tdn5TpkyJ0tLS3HLMMcfs578OAACHykEL4vHjx8cLL7wQc+bMya2bPHlyLnKLiopi48aNux1/2223RVVVVZx//vnx7rvvRkTEunXrYufOnTFw4MDcds2bN4/+/fvHmjVrIiJizZo1UV5e3uCq8sCBA2P79u3xyiuvxLp166K2tjYGDBiQe7ysrOwjQf5hkyZNiq1bt+aWTZs27f0/CAAAjcIBvYf4AxMmTIiHH344Fi1aFB07dsytHzNmTIwYMSL3fYcOHSIiomvXrh/5NIr27dtHxCffbnEwFBQUREFBwaGeBgAAn4EDeoU4y7KYMGFC3HffffH73/8+jj322AaPl5WVRZcuXXLLB29yO+ecc+KJJ56IFStW7HH/xx13XOTn58fixYtz63bu3BlLly6Nnj17RkREjx494plnnmnwRrzFixdHcXFxdOzYMY477rho3rx5LFmyJPf422+/HS+//PJ+Hz8AAI3fAb1CPH78+LjrrrvigQceiOLi4nj99dcjIqK0tDRatGix23GXXnppPPLIIzFkyJC4+uqr45RTTokjjzwyXn755Xj00UejadOmERFRWFgYY8eOjcrKyigrK4tOnTrFjTfeGO+++25ccMEFERExbty4+MlPfhIXXXRRTJgwIdauXRtXX311TJw4MZo0aRJFRUVxwQUXRGVlZRx11FFx9NFHx7//+79Hkyb+nyUAACk4oEE8Y8aMiNj1f337sJkzZ8bo0aN3O+6II46I+fPnx09+8pOYOXNmTJo0Kerr6+PYY4+NM888My699NLctlOnTo36+vr49re/Hdu2bYuTTjop5s2bF0ceeWRERHzhC1+I3/3ud1FZWRm9evWKsrKyuOCCC+LKK6/M7eOmm26K7du3x9ChQ6O4uDi+//3v5z4RAwCAz7e87MP3ErBPqquro7S0NN54a2uUlJQc6ukAACSvuro62h5VGlu3fnKfuS8AAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJImiAEASJogBgAgaYIYAICkCWIAAJJ22Abxu+++G9/85jejpKQk8vLy4p133jnUUwIA4DC0V0E8Y8aMOPHEE6OkpCRKSkqivLw8Hn300T2O6dy5c+Tl5UVeXl4UFhZGnz594p577tmvSUdEzJ49O5566ql4+umnY/PmzVFaWrrf+xw8eHBccskl+70fAAAOH3sVxB07doypU6fGsmXL4vnnn4+vfOUrMWzYsPjjH/+4x3HXXnttbN68OVasWBH9+vWLs88+O55++ul9mnBtbW1ERKxbty569OgRxx9/fLRr1y7y8vL2aX8AAKRtr4J46NCh8dWvfjW6du0a3bp1ix/+8IdRVFQUzz777B7HFRcXR7t27aJbt24xffr0aNGiRTz00EMREbFp06YYMWJEtGrVKsrKymLYsGGxYcOG3NjRo0fH8OHD44c//GF06NAhunfvHoMHD46bb745Fi1aFHl5eTF48OCIiKipqYnLLrssvvCFL0RhYWEMGDAgFixY0GAuixcvjsGDB0fLli3jyCOPjIqKinj77bdj9OjRsXDhwpg2bVruivaH5wEAwOdTs30dWFdXF/fcc0/s2LEjysvLP/0TNmsWzZs3j9ra2ti5c2dUVFREeXl5PPXUU9GsWbO4/vrr44wzzohVq1ZFfn5+RETMnz8/SkpK4oknnoiIiPbt28cVV1wRL7zwQsydOze33YQJE+LFF1+MOXPmRIcOHeK+++6LM844I1avXh1du3aNqqqqGDJkSJx//vkxbdq0aNasWTz55JNRV1cX06ZNi5dffjmOP/74uPbaayMiok2bNh97DDU1NVFTU5P7vrq6ep/+DQEAOPT2OohXr14d5eXl8f7770dRUVHcd9990bNnz081tra2Nm6++ebYunVrfOUrX4m777476uvr4+c//3nuloeZM2dGq1atYsGCBXH66adHRERhYWH8/Oc/z4VvRETLli0jPz8/2rVrFxERGzdujJkzZ8bGjRujQ4cOERFx2WWXxWOPPRYzZ86MyZMnx4033hgnnXRS3Hbbbbn9/N3f/V3u6/z8/GjZsmVun7szZcqUuOaaaz7VMQMA0Ljt9adMdO/ePaqqqmLJkiUxduzYOPfcc+PFF1+MyZMnR1FRUW7ZuHFjbszll18eRUVF0bJly7jhhhti6tSp8bWvfS1WrlwZf/7zn6O4uDg3rqysLN5///1Yt25dbvwJJ5zQIIY/zurVq6Ouri66devWYB4LFy7M7euDK8T7a9KkSbF169bcsmnTpv3eJwAAh8ZeXyHOz8+PLl26RERE3759Y+nSpTFt2rSYMmVKjBgxIrfdB1dpIyIqKytj9OjRUVRUFG3bts1dDd6+fXv07ds37rzzzo88z4dvVygsLPzEeW3fvj2aNm0ay5Yti6ZNmzZ4rKioKCIiWrRosRdHunsFBQVRUFDwmewLAIBDa5/vIf5AfX191NTURFlZWZSVlX3sNq1bt85F9If16dMn7r777jj66KOjpKRkv+bRu3fvqKurizfffDNOOeWUj93mxBNPjPnz5+/2dof8/Pyoq6vbr3kAAHB42atbJiZNmhSLFi2KDRs2xOrVq2PSpEmxYMGCGDly5D49+ciRI6N169YxbNiweOqpp2L9+vWxYMGC+N73vhevvPLKXu2rW7duMXLkyBg1alTMnTs31q9fH88991xMmTIlHnnkkdz8ly5dGuPGjYtVq1bFSy+9FDNmzIgtW7ZExK7PTF6yZEls2LAhtmzZEvX19ft0XAAAHD72KojffPPNGDVqVHTv3j2GDBkSS5cujXnz5sVpp522T0/esmXLWLRoUXTq1CnOOuus6NGjR1xwwQXx/vvv79MV45kzZ8aoUaPi+9//fnTv3j2GDx8eS5cujU6dOkXErmh+/PHHY+XKldG/f/8oLy+PBx54IJo123Wh/LLLLoumTZtGz549o02bNg3ugwYA4PMpL8uy7FBP4nBXXV0dpaWl8cZbW/f71g8AAPZfdXV1tD2qNLZu/eQ+2+tPmQAAgM8TQQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJA0QQwAQNIEMQAASRPEAAAkTRADAJC0Zod6Ap8HWZZFRMS26upDPBMAACL+f5d90Gl7Iog/A9u2bYuIiC7HHnOIZwIAwIdt27YtSktL97hNXvZpspk9qq+vj9deey2Ki4sjLy/vUE8HACB5WZbFtm3bokOHDtGkyZ7vEhbEAAAkzZvqAABImiAGACBpghgAgKQJYgAAkiaIAQBImiAGACBpghgAgKT9PybyXbgKvDJVAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ], + "id": "1a4f7484-185c-42a3-8931-32a28a6d6964" + }, + { + "cell_type": "markdown", + "source": "This work has been provided by Wallapop Search team (http://www.wallapop.com/).\n\n_This notebook was last updated 17-FEB-2024_", + "metadata": {}, + "id": "7c08fac4-ea2e-4aae-92e8-cde6739dc131" + }, + { + "cell_type": "code", + "source": "", + "metadata": {}, + "execution_count": null, + "outputs": [], + "id": "349421e4-dab9-42ef-afba-c2d9df1a9929" + } + ] +} \ No newline at end of file