Last active
June 21, 2023 06:29
-
-
Save mazieres/0b905a30b1fc9bdbb36237575fe276c8 to your computer and use it in GitHub Desktop.
Python companion to the work described here : https://mazieres.gitlab.io/namograph/index.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Namograph\n", | |
"\n", | |
"## Large-scale diversity estimates through surname origin inference\n", | |
"\n", | |
"by [Antoine Mazières](https://mazieres.gitlab.io/) and [Camille Roth](http://camilleroth.eu/).\n", | |
"\n", | |
"*First published in 2018. Last edited on June 21th, 2023 using Python 3.9.6.*\n", | |
"\n", | |
"Python companion to the paper « [Large-scale diversity estimation through surname origin inference](https://hal.archives-ouvertes.fr/hal-01766665) » published in the [*Bulletin of Sociological Methodology*](https://journals.sagepub.com/doi/abs/10.1177/0759106318778828). This notebook doesn't pretend to show everything that has been tried, but rather a simple way to what worked best so far.\n", | |
"\n", | |
"**To simply use this method on your own data**, check [this notebook](https://gist.github.com/mazieres/a04830b959aee40b3b790017154641d2)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import json\n", | |
"import re\n", | |
"from collections import defaultdict, Counter\n", | |
"from math import log\n", | |
"import time\n", | |
"import gzip\n", | |
"import os\n", | |
"import pickle\n", | |
"import joblib\n", | |
"\n", | |
"from glob import glob\n", | |
"from string import ascii_uppercase, ascii_letters\n", | |
"\n", | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"\n", | |
"from sklearn.feature_extraction.text import HashingVectorizer, TfidfVectorizer, CountVectorizer\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"from sklearn.naive_bayes import MultinomialNB\n", | |
"from sklearn.metrics import f1_score, classification_report, precision_recall_fscore_support, accuracy_score\n", | |
"from sklearn.model_selection import learning_curve\n", | |
"from sklearn.model_selection import ShuffleSplit\n", | |
"\n", | |
"from scipy import cluster\n", | |
"from scipy.cluster.hierarchy import linkage, dendrogram, to_tree\n", | |
"from scipy.spatial.distance import pdist, squareform, euclidean\n", | |
"from scipy.stats.mstats import gmean\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"import matplotlib\n", | |
"\n", | |
"matplotlib.style.use('ggplot')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"reverse_clean_letters = {\n", | |
" \"O\": ['Ó', 'Õ', 'О', 'Ō', 'Ő', 'Ö', 'Ό', 'Ô', 'Ò', 'Ø'],\n", | |
" \"E\": ['Ě', 'Ê', 'Ȩ', 'Ē', 'Ę', 'È', 'Ĕ', 'Ë', 'É', 'Ė'],\n", | |
" \"AE\": ['Æ'],\n", | |
" \"L\": ['Ł', 'Ľ'],\n", | |
" \"I\": ['Î', 'Ï', 'İ', 'Ī', 'Ì', 'Í'],\n", | |
" \"U\": ['Ů', 'Ū', 'Ù', 'Ű', 'Ú', 'Û', 'Ü'],\n", | |
" \"R\": ['Ř'],\n", | |
" \"C\": ['Ç', 'Ć', 'Č'],\n", | |
" \"A\": ['Ą', 'Ä', 'Ã', 'Ӓ', 'Å', 'Â', 'À', 'Á', 'Ă'],\n", | |
" \"T\": ['Ț', 'Т', 'Ť'],\n", | |
" \"Y\": ['Ý'],\n", | |
" \"Z\": ['Ź', 'Ż', 'Ž'],\n", | |
" \"N\": ['Ń', 'Ň', 'Ñ'],\n", | |
" \"S\": ['Š', 'Ş', 'Ș', 'Ś'],\n", | |
" \"D\": ['Đ', 'Ď', 'Ð'],\n", | |
" \"Y\": ['У', 'Ý'],\n", | |
" \"G\": ['Ğ'],\n", | |
" \"K\": ['К'],\n", | |
" \"B\": ['Β'],\n", | |
" \"'\": ['ʾ']\n", | |
"}\n", | |
"\n", | |
"clean_letters = {}\n", | |
"for k, v in reverse_clean_letters.items():\n", | |
" for lett in v:\n", | |
" clean_letters[lett] = k\n", | |
"\n", | |
"def clean_name(name):\n", | |
" name = name.replace('\\\\', '')\n", | |
" name = name.replace('•', '')\n", | |
" \n", | |
" clean = []\n", | |
" for lett in name.upper():\n", | |
" if lett in clean_letters:\n", | |
" lett = clean_letters[lett]\n", | |
" clean.append(lett)\n", | |
" continue\n", | |
" if lett not in ascii_uppercase+\"- '\":\n", | |
" print(\"clean_name Error:\", lett, name.upper())\n", | |
" return None\n", | |
" clean.append(lett)\n", | |
" return ''.join(clean)\n", | |
"\n", | |
"def flatten(li):\n", | |
" return [item for sublist in li for item in sublist]\n", | |
"\n", | |
"def chunks(li, n):\n", | |
" if li == []:\n", | |
" return\n", | |
" yield li[:n]\n", | |
" yield from chunks(li[n:], n)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Data\n", | |
"\n", | |
"In order to learn our model, we used all [PubMed](https://www.ncbi.nlm.nih.gov/pubmed/) data as of March 2017 with the query `1800:2020[dp]`, yielding `26,941,850` records. From each record we extracted all affiliations related to one of the 176 countries present in the [Natural Earth](http://www.naturalearthdata.com/downloads/110m-cultural-vectors/) dataset. This returned `25,628,999` tuples with the author's surname and the country of affiliation.\n", | |
"\n", | |
"```bash\n", | |
"$ wget -c 'https://api.nakala.fr/data/10.34847/nkl.da5f62h8/bb0efe9a9bb47176bd5951c91d42f9865ab55972' -O pubmed_name_country.csv.gz\n", | |
"$ gzip -d pubmed_name_country.csv.gz\n", | |
"$ gshuf -n5 pubmed_name_country.csv \n", | |
"SETO;Japan\n", | |
"SIMUNOVIC;France\n", | |
"IACOBELLI;Italy\n", | |
"SASAKI;Japan\n", | |
"SCHOEHN;France\n", | |
"```\n", | |
"\n", | |
"From this data extraction, we want to build a matrice $RAW$ with as an index the list of unique names encountered in the pubmed dataset, and as columns the countries in which they have been encountered. When two surnames composes an author surname, they are separated by a dash. In this case we consider the two names assigning to both of them the label of the original composed surname. We selected only names appearing more than 1000 times in the dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def handle_dashes(name):\n", | |
" if name.count('-') > 1:\n", | |
" return [name.replace('-', ' ')]\n", | |
" li = [y for y in [x.strip(\" -'\") for x in name.split('-')] if len(y) > 1 and not re.fullmatch(\"[A-Z] [A-Z]\", y)]\n", | |
" if len(li) == 0:\n", | |
" return None\n", | |
" # Handling the dash in many arabic surnames such has it doesn't appear as a composed surname.\n", | |
" if li[0] in ['AL', 'EL']:\n", | |
" return [name.replace('-', ' ')]\n", | |
" return li\n", | |
"\n", | |
"def load_raw_dataset():\n", | |
" names_by_countries = defaultdict(lambda: defaultdict(int))\n", | |
" with open(\"pubmed_name_country.csv\") as fi:\n", | |
" for line in fi:\n", | |
" line = line.strip()\n", | |
" if line == '':\n", | |
" continue\n", | |
" name, country = [x.strip(\" -'\") for x in line.split(';')]\n", | |
" # Getting rid of one-letter names\n", | |
" if len(name) < 2:\n", | |
" continue\n", | |
" # Getting rid of 30-letter-or-more names\n", | |
" if len(name) > 30:\n", | |
" continue\n", | |
" # Getting rid of one-letter-space-one-letter names\n", | |
" two_weird = re.fullmatch(\"[A-Z] [A-Z]\", name)\n", | |
" if two_weird:\n", | |
" continue\n", | |
" # Handling composed surnames\n", | |
" if '-' in name:\n", | |
" nn = handle_dashes(name)\n", | |
" if nn == None or len(nn) == 0: continue\n", | |
" for n in nn:\n", | |
" if len(n) < 2 or len(n) > 30: continue\n", | |
" names_by_countries[country][n] += 1\n", | |
" else:\n", | |
" names_by_countries[country][name] += 1\n", | |
" # Applying threshold of more-than-1000-occurences names\n", | |
" thres = {k:v for k, v in names_by_countries.items() if sum(v.values()) > 1000}\n", | |
" df = pd.DataFrame(thres)\n", | |
" return df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_raw = load_raw_dataset()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"We can look at the number of occurences of a name per country:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"United States 4.0\n", | |
"France 105.0\n", | |
"Malaysia 1.0\n", | |
"Sweden 2.0\n", | |
"Name: MAZIERES, dtype: float64" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_raw.T['MAZIERES'][df_raw.T['MAZIERES'] > 0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Normalization\n", | |
"\n", | |
"The PubMed dataset is very biased because, among other things:\n", | |
"\n", | |
"+ We can assume that the scientific population it represents is more nomadic that the average.\n", | |
"+ Observing academic publications strongly over-represents ~rich countries (ex: North America) and under-represents ~poor countries (ex: Africa).\n", | |
"+ The data source (PubMed) itself may probably reference better and since more time, english written publications.\n", | |
"\n", | |
"To counterbalance these biases, we created the matrice $NORM$ by normalizing the data such as a name's weight in a country depends on the total of observations made in this country." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_norm = df_raw / df_raw.sum(axis=0)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"United States 5.893463e-07\n", | |
"France 9.312746e-05\n", | |
"Malaysia 1.495640e-05\n", | |
"Sweden 5.399335e-06\n", | |
"Name: MAZIERES, dtype: float64" | |
] | |
}, | |
"execution_count": 7, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_norm.T['MAZIERES'][df_norm.T['MAZIERES'] > 0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In order to be able to represent in an consistent way how a name distribute itself among several countries, we created a matrice $NORMNORM$ such as the sum of ever names' countries weights in $NORM$ is equal to one." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_norm_norm = (df_norm.T / df_norm.sum(axis=1)).T" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"United States 0.005166\n", | |
"France 0.816388\n", | |
"Malaysia 0.131113\n", | |
"Sweden 0.047332\n", | |
"Name: MAZIERES, dtype: float64" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_norm_norm.T['MAZIERES'][df_norm_norm.T['MAZIERES'] > 0]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Assuming that this normalization have reduced the biases inherited from PubMed, we can still assume that it carries many biases in the context of a study of surnames origins. Indeed, if surnames where usually freezed by various administrative policies a few centuries back (500 years in Europe, a few thousands in Asia), all migration fluxes since then constitue a bias to reconstruct the geographical origin of a surname, ie. where a surnname has first been coined.\n", | |
"\n", | |
"While it may not be possible to infer the origin of all names in the dataset, we can still presume that names for which presence is highly concentrated in one country have a pretty good chance to come from this country. In order to measure such concentration we used the [Herfindahl-Hirschmann index](https://en.wikipedia.org/wiki/Herfindahl_index) (hhi)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def hhi(v, norm=True):\n", | |
" v = v[~v.isnull()]\n", | |
" h = np.square(v).sum()\n", | |
" if norm == True:\n", | |
" n = len(v)\n", | |
" if n == 1:\n", | |
" return 1\n", | |
" return (h - 1 / n) / (1 - 1 / n)\n", | |
" return h" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_hhi = df_norm_norm.T.apply(hhi, norm=False)\n", | |
"df_hhi.name = 'hhi'\n", | |
"df_max = df_norm_norm.idxmax(axis=1)\n", | |
"df_max.name = 'max_line'\n", | |
"df_max_freq = df_norm.max(axis=1)\n", | |
"df_max_freq.name = 'freq'\n", | |
"hhifreq = pd.concat([df_max, df_hhi, df_max_freq], axis=1)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The matrice $HHIFREQ$ shows for all surnnames its hhi score, the country the most represented in NORM and the corresponding relative frequency of the name in this country. Such as:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>max_line</th>\n", | |
" <th>hhi</th>\n", | |
" <th>freq</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>HULMAN</th>\n", | |
" <td>Botswana</td>\n", | |
" <td>0.375878</td>\n", | |
" <td>0.000543</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>HUDEC</th>\n", | |
" <td>Slovakia</td>\n", | |
" <td>0.855060</td>\n", | |
" <td>0.000777</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>GASPAROVIC</th>\n", | |
" <td>Croatia</td>\n", | |
" <td>0.790233</td>\n", | |
" <td>0.001955</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>BENA</th>\n", | |
" <td>Slovakia</td>\n", | |
" <td>0.331380</td>\n", | |
" <td>0.000194</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>ARTEMIOU</th>\n", | |
" <td>Slovakia</td>\n", | |
" <td>0.833605</td>\n", | |
" <td>0.000291</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" max_line hhi freq\n", | |
"HULMAN Botswana 0.375878 0.000543\n", | |
"HUDEC Slovakia 0.855060 0.000777\n", | |
"GASPAROVIC Croatia 0.790233 0.001955\n", | |
"BENA Slovakia 0.331380 0.000194\n", | |
"ARTEMIOU Slovakia 0.833605 0.000291" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"hhifreq.head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"This allow us to apply a new threshold for selecting highly geographically concentrated surnames (hhi > 0.8) and with a certain relative frequency in this country." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df_thres = hhifreq[(hhifreq['hhi'] > 0.8) & (hhifreq['freq'] > 0.000001)]['max_line']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"HUDEC Slovakia\n", | |
"ARTEMIOU Slovakia\n", | |
"GAZDIKOVA Slovakia\n", | |
"CAPRNDA Slovakia\n", | |
"HOJEROVA Slovakia\n", | |
"Name: max_line, dtype: object" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"df_thres.head(5)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Clustering\n", | |
"\n", | |
"Making the assumption that names origins are predictable from the information contained in the names (letters and combinaisons of letter frequencies, ie. \"consonnance\") somewhat overlaps with the idea that names in our datasets should have relatively similar consonnances if close geographically.\n", | |
"\n", | |
"To verify such statement, we used the n-grams decomposition of the names to build the feature vector of all countries present in our dataset. The matrice $NG$ represents for each country in index, the relative frequency of each n-gram in column, relative to the sum of all the given n-gram on the whole dataset." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def ngrams(seq, depth='max'):\n", | |
" seq = \"^\" + seq + \"$\"\n", | |
" if depth == 'max':\n", | |
" depth = len(seq)\n", | |
" elif not isinstance(depth, int):\n", | |
" print(\"ngrams:Depth must be an int.\")\n", | |
" return False\n", | |
" res = []\n", | |
" step = 1\n", | |
" while step <= depth:\n", | |
" i = 0\n", | |
" while i < len(seq) and i+step <= len(seq):\n", | |
" res.append(seq[i:i+step])\n", | |
" i += 1\n", | |
" step += 1\n", | |
" res.remove(\"^\")\n", | |
" res.remove(\"$\")\n", | |
" if \" \" in res:\n", | |
" res.remove(\" \")\n", | |
" return res" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Here is an example of n-gram decomposition of the name 'ROTH'. We systematically added signs for begining and end of string, in order to keep this information." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['R', 'O', 'T', 'H', '^R', 'RO', 'OT', 'TH', 'H$', '^RO', 'ROT', 'OTH', 'TH$']" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"ngrams('ROTH', depth=3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ngrams_by_countries = defaultdict(lambda: defaultdict(int))\n", | |
"for name, country in zip(df_thres.index, df_thres.values):\n", | |
" for ng in ngrams(name, depth=4):\n", | |
" ngrams_by_countries[country][ng] += 1\n", | |
"df_ng = pd.DataFrame(ngrams_by_countries).fillna(0.0).T\n", | |
"df_ng = (df_ng.T / df_ng.sum(axis=1)).T" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Figure size 640x480 with 0 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "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AAAqOoLoAADAiEnWOtnpAAAAAICKzl/WHQAAAAAAAAAAoLwiiA4AAAAAAAAAgA2C6AAAAAAAAAAA2CCIDgAAAAAAAACAjWJtLLps2TItWrRIqampatasmUaOHKnY2Fjb9hs2bNDcuXN18uRJNWrUSA888IA6duxo/XsoFNK8efP0+eef68yZM7ruuus0atQoXXXVVVabjIwMTZs2TVu3bpXP51OXLl30yCOPqFq1asV5CgAAAAAAAAAAuDLORF+/fr1mzpyp++67T+PGjVOzZs306quvKi0trcj2+/bt09///nf17t1b48aN00033aQ33nhDR44csdp8/PHH+uSTTzR69Gj95S9/UdWqVfXqq6/q3LlzVpt//OMfOnr0qP74xz/q+eef1549e/Tuu+8W4ykDAAAAAAAAAOCNcRB98eLF6tOnj3r16qUmTZpo9OjRqlKlilatWlVk+6VLl6pDhw66++671aRJE91///2KiYnRsmXLJOVnoS9dulRDhgzRTTfdpGbNmunXv/61Tp8+rc2bN0uSkpKStH37dj322GNq2bKlrrvuOo0cOVLr16/XqVOnLuLpAwAAAAAAAABgzyiInpubq4MHD6pt27Y/HsDvV9u2bZWQkFDk7yQkJBRqL0nt27fXN998I0k6ceKEUlNT1a5dO+vfa9SoodjYWOuYCQkJqlmzpq655hqrTdu2beXz+bR///4i/25OTo4yMzOt/509e9b2ef0kqrrLMy/9tvSj+G3LSz8qYp8lqU7dyArVtrz0oyL2uTSPHWjUxHPb6Ohoz21N25dW2/LSD/pcufpRmn1WtSvLvq1h+7rVr3JvVIy2pXnsy73PkqQaBuOO8tC2vPSjIvZZZtf78tC2vPSjot4nlId+VMQ+S+Vj7F9e7hNM2lbU97s89KM0+1wePhv0o/ht6Ufx257PFwqFQl4bnzp1So899pj+/Oc/q1WrVtbj//rXv7R792795S9/ueB3fv7zn+uJJ55Qjx49rMc+/fRTzZ8/X++995727dunF198Ue+++67q1atntRk/frx8Pp+effZZffTRR1qzZo3+/ve/Fzr2qFGjNGzYMN1+++0X/N158+Zp/vz51s/du3fX008/7fWpAgAAAAAAAABgXs6lohg8eLCmT59u/W/06NHKycm5oN3Zs2f1u9/9zjFTvbTb0g/6XJn7QZ8rVz8q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NgWZBP5N6t+b3PyafJ779eunc+fO6dChQ4VqrdkxqZMneR9ohl9nr4t9TF4PkxI7JseV8oOIXgeDklnw59ChQ57rYO7evduqA7hnzx7deOONju3DG3d5yZI22byrXbt2at68uaebQ5ObkLNnz2rlypWS3MtAFVym5iXr1OuSbdPNUE0G3YMGDfL82Q8PxLwE6B944AHt2rVL7dq183RsyezaWbNmTWulldPn33QDV8msNJBJPe22bdsqNzdX6enpjp/Rfv366dSpU1q7dq0kedr4s1atWp5ej2HDhikuLs4K4G/evNn2mD6fT19//bV17nK7Fpqc/2+66SYdOHBAffr00c6dOx0/J0OHDjVaeWOygZ/pGMzkM1pa11nJ+/ncdOmsSfBHMtsQzGs2defOnXXkyBErYcNt5YiUv9x84MCBrpmkDzzwgA4cOOB6PZbMylNIZvvumEz6FuyLWymJrl27Kjs721MdWil/pVWPHj104sQJff31164rQE2u99WrV9fOnTsl5ZevcZooe+KJJ3TixAlNnTpVERERGjJkiK655poi23odnxRnMsZrGSHTOq0Fv99nz551zaYz+V6lpKRo+/btGjRokOskscm58fzAi9P13uT8tWzZMkn5Ae8GDRooISHBSoCzc+WVV2rNmjWKiYlxLMFXv359xzKP5wtfd9q3b+9acsukzrNJibCuXbsWen3dPq8m5T1ef/11x2Odz2Rs7DUJxPT6LcnKev35z3/umMV84sQJa5x04sQJx8/RiRMn1LVrV8+v8xVXXKEDBw7opz/9qeueJqbXb697S5i2lbzv2/Ltt99qz549kmStxnBiUqs7PGbOyspyvV+RvI+rhg0bpuzsbCuhw+21aNCggRW0DSdo2mncuLEVf/rhhx8cPx9ZWVnW9emzzz5zTNo1La08ZMgQffbZZ0pOTlaXLl0cn+Pjjz9eaC8au73D6tWrZ7SptMm9npS/IuTrr7/W8uXLlZWVVWhvkfP96le/0r59+7R06VKtWbPGMSju9fm5qbRB9AYNGqhLly5q1KiR3n33Xdf2L730kuelPQ0aNNDMmTOtYI5TEMpkMG1SFzEmJkYTJkxQ27Zt1bVrV9dZqkceeURHjx6V5Lwx06ZNm4yXbngpfSMV3uQlHLByCsgtXLhQ+/fvl8/n0zXXXGP7d8KDu3/+858KhUJKTk52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ZaOSkpLUqFEjDRs2TJLzzYjJ+dxkMmb//v1q0KCBqlatquzsbMdzRnE8+uijniabfD6f4uPjdc0113jaeEryvuolPT1d27dvt86PTpnMXrPNwrxeC30+nxITEwvVxXVKYvj000/1zDPPyO/3KxgMauzYsWrVqpUeeuihItubBDNNJ/rPnTvnaSO/jz76SL/85S+1bNkytW7dWl9++aV69epVZNvz73vcxq8F27tNbpiWo1q7dq02bNig3NxchUIhjR07tsh2phNkUn62Z1pamtVnp0lUE8nJydq9e7cCgYBr+baC50YvNdG3bt1q1ch2ej2k/OtmOFHps88+c0y4MVlZEZ7MveWWW/TJJ5/o6NGjtm1NS+F49f7772v06NFat26daxDKdKWclH8d3r17t3w+n1VeryjhsqFeJwdMxnamq1CbNGniGiwOM105m5KSoszMTOXk5GjJkiVF3p96zWgv6IMPPtCpU6fUpk0b/eMf/7BtZzpGmT59un744QddeeWVqlevntavX+845jW5b2rbtq2CwaCnBEcpv4TPgQMHFAwGFRsba2WbFzR+/HilpaXplVdeUSgUMio34ub8DWq9HNtkbyGvJeqqV6+uXr16af369Vq/fr2aNm1qe82UzFYCer0OSuZxAJOESMl7VY2//OUvuv3223XXXXdp7ty5+tnPfuZ4XK9xviuuuELffPONp5VZJm3DTMvQFKVSBtGDwaCefPJJvfvuu7rnnnv0/vvvO7Y33XjQJLNPyt8xV8oPOhYs73I+k03MJLPZr/DN0yOPPOJ4Mn344Yf1+eefa8uWLWratKlRXUcvkpOT9d///tfKVnJ6jvv379fkyZNdl8Sa9jlcrmf//v16/vnnXT8fycnJ1gkyKyvLsa2ppKQkhUIh14mNxMRETZo0SSNGjNC+fftcs5BMSif06tVL+/btU0pKimvN98jISPXt29dT+Qbpxw1Rs7KylJKSojfeeMO2rcmmH2vXrrW+d++8845roMHEBx98oB49erhOkElmQTav55kTJ04Uytpxq58b7seMGTMUCoV08803O2YchOva5+bmum6i3Lp1a33xxRc6dOiQHnroIevGtiim30OTmyEpv2RJePDhVBfXpKZ8XFycrrvuOqWkpOj77793rbdrUnveazmqgvth+Hw+T3UwTcokmWx6Y3LDcvToUc/1hE0z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\n", | |
"text/plain": [ | |
"<Figure size 1500x500 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.clf()\n", | |
"plt.rcParams['axes.facecolor']='white'\n", | |
"plt.rcParams['savefig.facecolor']='white'\n", | |
"matplotlib.rcParams['lines.linewidth'] = 0.5\n", | |
"L = linkage(pdist(df_ng.values), method=\"ward\")\n", | |
"plt.figure(figsize=(15,5), facecolor='white')\n", | |
"plt.grid(visible=False)\n", | |
"dend = dendrogram(L, labels=[\"{}\".format(x) for x in df_ng.index], orientation='top', color_threshold=0.4*max(L[:,2]))\n", | |
"plt.tick_params(\n", | |
" labelsize=5,\n", | |
" axis='x',\n", | |
" which='both',\n", | |
" bottom='off',\n", | |
" top='off',\n", | |
" labelbottom='on')\n", | |
"plt.tight_layout()\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"By applying hierarchical clustering on NG we can see that countries regroup particularly well according to major earth geographical/cultural divisions, such as from right to left off the index of the hclust plot : \n", | |
"\n", | |
"+ Subaharan-african\n", | |
"+ Asian\n", | |
"+ Indian subcontinental\n", | |
"+ Arabian\n", | |
"+ Slavic\n", | |
"+ North European\n", | |
"+ Central and SouthEuropean\n", | |
"\n", | |
"However, according to this geographical interpretation of this clustering a few errors of classification emerge that should be either reclassified (Philippines,Japan,Indonesia->Asia ; Ethiopia>SubSaharanAfrica) or deleted if they represent a low number of observations (Papua New Guinea-385;Madagascar-664;Jamaica-346;Chad-282;Armenia-482)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"clusters = {\n", | |
" \"African\": [\"Zimbabwe\",\"Rwanda\",\"Zambia\",\"Malawi\",\"Tanzania\",\"Uganda\",\"Kenya\",\"Dem. Rep. Congo\",\"Congo\",\"South Africa\",\"Gambia\",\"Botswana\",\"Mozambique\",\"Mali\",\"Trinidad and Tobago\",\"Gabon\",\"Cameroon\",\"Benin\",\"Côte d'Ivoire\",\"Burkina Faso\",\"Togo\",\"Senegal\",\"Nigeria\",\"Ghana\",\"Ethiopia\"],\n", | |
" \"Asian\": [\"Vietnam\",\"China\",\"Thailand\",\"Cambodia\",\"Taiwan\",\"Korea\",\"Lao PDR\",\"Japan\",\"Indonesia\",\"Philippines\"],\n", | |
" \"Indian\": [\"Nepal\",\"India\",\"Sri Lanka\",\"Mongolia\",\"Pakistan\",\"Malaysia\",\"Bangladesh\",\"Iran\"],\n", | |
" \"Arabian\": [\"Sudan\",\"Libya\",\"Egypt\",\"Tunisia\",\"Morocco\",\"Algeria\",\"United Arab Emirates\",\"Qatar\",\"Lebanon\",\"Syria\",\"Jordan\",\"Palestine\",\"Saudi Arabia\",\"Kuwait\",\"Iraq\",\"Oman\",\"Yemen\"],\n", | |
" \"Slavic\": [\"Poland\",\"Macedonia\",\"Ukraine\",\"Belarus\",\"Russia\",\"Kazakhstan\",\"Bulgaria\",\"Slovakia\",\"Czech Rep.\",\"Croatia\",\"Bosnia and Herz.\",\"Serbia\",\"Montenegro\"],\n", | |
" \"NorthEuropean\": [\"Norway\",\"Denmark\",\"Sweden\",\"Netherlands\",\"Belgium\",\"Germany\",\"Austria\",\"United Kingdom\",\"Australia\",\"Canada\",\"New Zealand\",\"United States\",\"Ireland\",\"Israel\",\"Switzerland\",\"Luxembourg\",\"France\",\"Iceland\"],\n", | |
" \"CentralSouthEuropean\": [\"Slovenia\",\"Hungary\",\"Turkey\",\"Latvia\",\"Estonia\",\"Finland\",\"Italy\",\"Albania\",\"Romania\",\"Lithuania\",\"Greece\",\"Cyprus\",\"Georgia\",\"Venezuela\",\"Puerto Rico\",\"Costa Rica\",\"Spain\",\"Mexico\",\"Cuba\",\"Colombia\",\"Guatemala\",\"Peru\",\"Chile\",\"Ecuador\",\"Bolivia\",\"Uruguay\",\"Argentina\",\"Panama\",\"Portugal\",\"Brazil\"],\n", | |
"}\n", | |
"\n", | |
"reverse_clusters = {}\n", | |
"for k, v in clusters.items():\n", | |
" for c in v:\n", | |
" reverse_clusters[c] = k" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Learning\n", | |
"\n", | |
"For learning a model, I've tried many classifiers (basically, everything that sklearn offers plus a few others), together with feature selection, etc. In the end, plain naive bayes works well and fast and random forest seems to figure out better tricky names but with a weaker overall performance." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"names, countries = [], []\n", | |
"for k, v in df_thres.items():\n", | |
" if v not in reverse_clusters:\n", | |
" continue\n", | |
" countries.append(reverse_clusters[v])\n", | |
" names.append(\"^{}$\".format(k))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"vectorizer = CountVectorizer(analyzer='char', ngram_range=(1, 4))\n", | |
"Xs_train, Xs_test, y_train, y_test = train_test_split(names, countries, test_size=0.15, random_state=42)\n", | |
"X_train = vectorizer.fit_transform(Xs_train)\n", | |
"X_test = vectorizer.transform(Xs_test)\n", | |
"clf = MultinomialNB(alpha=0.01, fit_prior=True)\n", | |
"clf.fit(X_train, y_train)\n", | |
"y_pred = clf.predict(X_test)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"**Checking performances**" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"prfs = precision_recall_fscore_support(y_test, y_pred)\n", | |
"precision, recall, f1, support = (pd.Series({clf.classes_[idx]:val for idx, val in enumerate(x)}) for x in prfs)\n", | |
"precision.name = 'precision'\n", | |
"recall.name = 'recall'\n", | |
"f1.name = 'f1'\n", | |
"support.name = 'support'\n", | |
"prfs_df = pd.concat([precision, recall, f1, support], axis=1).sort_values('f1', ascending=False)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>precision</th>\n", | |
" <th>recall</th>\n", | |
" <th>f1</th>\n", | |
" <th>support</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <td>0.805153</td>\n", | |
" <td>0.709759</td>\n", | |
" <td>0.754453</td>\n", | |
" <td>28528</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Slavic</th>\n", | |
" <td>0.634462</td>\n", | |
" <td>0.830888</td>\n", | |
" <td>0.719509</td>\n", | |
" <td>9745</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>NorthEuropean</th>\n", | |
" <td>0.771076</td>\n", | |
" <td>0.618756</td>\n", | |
" <td>0.686569</td>\n", | |
" <td>32150</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Asian</th>\n", | |
" <td>0.613152</td>\n", | |
" <td>0.775492</td>\n", | |
" <td>0.684833</td>\n", | |
" <td>6757</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Indian</th>\n", | |
" <td>0.630236</td>\n", | |
" <td>0.720121</td>\n", | |
" <td>0.672187</td>\n", | |
" <td>10258</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Arabian</th>\n", | |
" <td>0.525581</td>\n", | |
" <td>0.715945</td>\n", | |
" <td>0.606169</td>\n", | |
" <td>4735</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>African</th>\n", | |
" <td>0.442462</td>\n", | |
" <td>0.605092</td>\n", | |
" <td>0.511153</td>\n", | |
" <td>4753</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" precision recall f1 support\n", | |
"CentralSouthEuropean 0.805153 0.709759 0.754453 28528\n", | |
"Slavic 0.634462 0.830888 0.719509 9745\n", | |
"NorthEuropean 0.771076 0.618756 0.686569 32150\n", | |
"Asian 0.613152 0.775492 0.684833 6757\n", | |
"Indian 0.630236 0.720121 0.672187 10258\n", | |
"Arabian 0.525581 0.715945 0.606169 4735\n", | |
"African 0.442462 0.605092 0.511153 4753" | |
] | |
}, | |
"execution_count": 23, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"prfs_df" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<Figure size 640x480 with 0 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAr0AAAHqCAYAAAAJR/YKAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABqHklEQVR4nO3dd1QU1+M28GeApYsFEAgKIoKKBbGAXayxByxYYsEofjVGRU2sxBJjjEZNNJZgRNEodlGDir2TKHYjFkTBBggCIiB93z98d3+suyjg4sL4fM7hBObO3rkzE+TZu3fuFaRSqRRERERERCKmpekGEBERERGVNoZeIiIiIhI9hl4iIiIiEj2GXiIiIiISPYZeIiIiIhI9hl4iIiIiEj2GXiIiIiISPYZeIiIiIhI9hl4iIiIiEj0dTTegrHnw4AFu3LiB+/fv4/79+0hKSgIA7Nixo0T1paWlYefOnQgPD0dKSgoqVaoEV1dX9O/fH0ZGRupsOhEREREVgqH3Lbt27cKlS5fUUldqair8/PwQFxcHCwsLNGvWDE+ePMHBgwdx9epVLFiwAMbGxmo5FhEREREVjqH3LY6OjrC1tYW9vT1q1aqFcePGIScnp0R1BQYGIi4uDq6urpg0aRK0tbUBAOvXr0doaCg2btyIcePGqbP5RERERKQCQ+9bPDw81FJPcnIyzp8/Dx0dHYwaNUoeeAFg6NChCAsLw9mzZzFkyBBUrFhRLcckIiIiItX4IFspuXbtGqRSKerWrYtKlSoplEkkEjRp0gT5+fm4evWqZhpIRERE9Alh6C0lMTExAAA7OzuV5bLtsv2IiIiIqPQw9JaSxMREAECVKlVUlpuamgIAEhISPlqbiIiIiD5VHNNbSjIzMwEAenp6Kstl22X7FSYnJ0fpQTqJRAKJRKKGVhIRERF9Ghh6y7jg4GDs2rVL/nOrVq0wceJEDbaIiIiIqPxh6C0l+vr6AICsrCyV5bLtsv0K4+npiZ49e8p/FgQBwJvZIXJzc9XRVCoGQRBgZmaGxMRESKVSTTfnk8R7oHm8B5rF6695Ojo6qFy5sqabQcXE0FtKzMzMAEC+otvbXrx4AQAwNzd/Zz2FDWXIzc0t8fzBVHKyNx05OTn8Y6MhvAeax3ugWbz+RCXDB9lKia2tLQDg4cOHKstl22X7EREREVHpYegtJY0aNYIgCLh9+zZevnypUJaTk4PLly9DS0sLLi4uGmohERER0aeDofcDhYaGwtfXF0FBQQrbK1eujFatWiE3Nxfr1q1DXl6evGzz5s1ITU1FmzZtuBobERER0UfAMb1vuXLlCnbv3i3/Wfaw2KxZs+Tb+vbti8aNGwMAUlNT8ezZMyQnJyvV5e3tjcjISFy4cAG+vr6wt7fH48eP8fjxY1hZWWH48OGlfDZEREREBDD0KklNTUVkZKTS9oLbUlNTi1SXiYkJFi5ciB07diA8PBwXL15ExYoV0a1bN3h5ecHIyEht7SYiIiKiwglSPvpZLiUkJHD2Bg0QBAFWVlaIjY3lU9MawnugebwHmsXrr3kSieS9sy9R2cMxvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RERERCR6DL1EREREJHoMvUREREQkegy9RESkMXv27EGPHj1Qp04d1K5dG+3atcO3336LxMRE+T5ubm6YNWuW2o8dFhYGa2trXL9+Xe11E1HZo6PpBhAR0adp9erV+Omnn+Dj44Nvv/0WUqkUd+/exZ49exAXFwczM7NSPX6DBg2wf/9+ODg4lOpxiKhsYOglIiKNCAgIgJeXF+bMmSPf1qFDB4wdOxb5+fmlfvwKFSqgSZMmpX4cIiobOLyBiIg04uXLl6hatarKMi2twv88Xbp0Cd7e3mjcuDFq1aqFzp07Y9euXfLyjIwM1KpVC3/88YfSa318fNCrVy8Aqoc35Ofnw9/fH+3atYOdnR0aNWqE0aNHIzU1taSnSURlBHt6iYhIIxo2bIi//voLNjY26NSp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YmIiAKBmzZrybRKJRP7969evlV7To0cPAEBISIi6mkFEREREpERtoVdH580zcRUqVJBvK/h9XFyc0msqVqwIAHj8+LG6mkFEREREpERtofezzz4DACQkJMi3WVpawsDAAABw5coVpddERkYCAHJzc9XVDCIiIiIiJWoLvc7OzgCAmzdvyrcJggA3NzcAwOrVqxX2z8nJwbJlywAADg4O6moGEREREZEStYXeDh06QCqVIjQ0VGH7V199BalUilOnTsHd3R2rVq3C4sWL4erqKn/4zcvLS13NICIiIiJSIkjftT5wMcTFxcHa2hpaWlq4e/euwgNt3bt3R2hoqMoV2VxcXHD+/Hno6+uroxmfjISEBOTk5Gi6GZ8cQRBgZWWF2NjYdy6tTaWH90DzeA80i9df8yQSCczNzTXdDComtfX0WlpaIicnB5mZmQqBFwCCg4Mxa9YsWFhYQCqVQiqVomLFihg3bhxOnjzJwEtEREREpUptyxADgJaW6gytp6eH+fPnY/78+UhKSkJubi7Mzc1VLl5BRERERKRuag29RVGlSpWPfUgiIiIi+sSpbXgDEREREVFZpbae3pcvX2L58uUAAB8fH1hZWb1z/9jYWPz5558AgClTpsDIyEhdTSEiIiIiUqC20LtlyxbMnTsXDg4OmD179nv3t7S0xJYtW3D//n1YW1tj5MiR6moKEREREZECtQ1vOHToULHm3BUEAQMHDoRUKsXff/+trmYQERERESlRW+i9du0aAKBly5ZFfk2LFi0UXktEREREVBrUFnqfP38OAO8dy1uQpaUlACA+Pl5dzSAiIiIiUqK20CtbYCIjI6PIr5Htq62tra5mEBEREREpUVvolfXwXrp0qcivke0r6/ElIiIiIioNagu9bdq0gVQqxerVq5GTk/Pe/XNycrB69WoIgoDWrVurqxlERERERErUFnpHjBgBAIiMjMTgwYPfOcwhIyMDgwYNwr179xReS0RERERUGtQ2T2/Lli0xcOBAbNu2DXv27MHFixfh4+ODNm3ayIc+xMbG4syZM1i3bh2ePHkCQRDQr18/tGvXTl3NICIiIiJSorbQCwDr169HYmIijh07hidPnmDOnDkq95NKpQCAzp07Y+PGjepsAhERERGRErUNbwDezOBw+PBh/Pbbb7C2toZUKlX5Vb16daxYsQKhoaHyWR+IiIiI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/4xHjx6hRYsWGDNmDJ/2JCIiItIQjul9S58+fXDz5k3cvXsXEydORJ06dZCYmIjIyEiYmJhg7NixCvunpqbi2bNnSqurbd26Fffu3YOWlha0tbWxZs0alccbN25cqZ0LEREREb3B0PsWXV1dzJkzB8HBwTh37hzCw8NhbGwMd3d3DBgwoNCFK96Wnp4OAMjPz8e5c+cK3Y+hl4iIiKj0CVI+glguJSQkcMoyDRAEAVZWVoiNjeXTuxrCe6B5vAeaxeuveRKJpNgzOZHmcUwvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiR5DLxERERGJHkMvEREREYkeQy8RERERiZ6OphtQFmVnZyM4OBhhYWFITEyEsbExnJ2dMXDgQFSpUqVYdaWlpWHnzp0IDw9HSkoKKlWqBFdXV/Tv3x9GRkaldAZEREREVBB7et+SnZ2NefPmYffu3cjMzETTpk1hamqKU6dOYerUqYiPjy9yXampqZg5cyYOHToEbW1tNGvWDAYGBjh48CBmzpyJtLS0UjwTIiIiIpJhT+9b9uzZg8jISDg6OsLPzw/6+voAgJCQEGzatAlr1qzB3Llzi1RXYGAg4uLi4OrqikmTJkFbWxsAsH79eoSGhmLjxo0YN25c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HEpNTVVaTAWAwraiPoDJv8NlnyCVTbBIRERERCRSHNNLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtEREREosfQS0RERESix9BLRERERKLH0EtE9JEJggBBEDB37ly11uvu7g5BEODu7q7WeomIxIChl4jKhFOnTsnD4NtfhoaGsLW1hYeHB4KCgpCbm6vp5hIRUTnD0EtEZd7r16/x6NEj7Nu3D19++SVatmyJuLg4TTeLiIjKEUEqlUo13QgiolOnTqF9+/YAgLFjx+Lrr7+Wl6WlpeHSpUtYunQpoqOjAQCurq74999/IQiCJppLRETljI6mG0BE9LaqVauifv36CtuaN2+OL7/8Eq6urrh//z4uXryIkJAQ9OrVS0OtJCKi8oTDG4io3KhcuTJmzJgh/zk0NFSDrSEiovKEoZeIyhVXV1f59zExMQAUH4I7deoU8vPzsX79erRv3x4WFhbQ0tKCt7e3Ul1XrlzBmDFjULt2bRgbG8PIyAi1a9fG2LFjce/evSK157///sP48ePRoEEDVK5cGRKJBJaWlujUqRMWL16M2NhYpde8b/aGlJQULFiwAC1atJDXaW5uDicnJ3h6emLNmjWIj49Xel1RZ284d+4chg4diho1akBfXx+VKlWCi4sL/Pz8kJCQUOjr3r7OALBjxw507NgR5ubmMDAwQO3atTF16lQkJSW9sw1ERB8bhzcQUbkikUjk3+fl5SmVZ2Zm4vPPP8exY8cKrSM/Px/ffvstfvvtN7z9WMO9e/dw7949rFu3DqtWrcLo0aNV1pGXl4fvvvtOZR3x8fGIj4/H8ePHERERgcDAwCKf3+3bt9GpUyc8e/ZMYXtiYiISExNx+/Zt7N27F3l5efjmm2+KXC/w5rwnTJiAVatWKWzPysrCtWvXcO3aNaxcuRI7d+5E586d31vX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\n", | |
"text/plain": [ | |
"<Figure size 700x500 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.clf()\n", | |
"matplotlib.style.use('ggplot')\n", | |
"plt.figure(figsize=(7,5), facecolor='white')\n", | |
"plt.xlabel('Precision', fontsize=20, labelpad=20, color='black')\n", | |
"plt.ylabel('Recall', fontsize=20, labelpad=20, color='black')\n", | |
"plt.axis([0.0, 1.1, 0.0, 1.1])\n", | |
"for _, row in prfs_df[['precision', 'recall', 'support']].iterrows():\n", | |
" l, p, r, s = row.name, row['precision'], row['recall'], row['support']\n", | |
" plt.text(p, r, l, fontsize=log(s)*1.2)\n", | |
"plt.xlim((0, 1))\n", | |
"plt.ylim((0, 1))\n", | |
"plt.xticks(fontsize=15)\n", | |
"plt.yticks(fontsize=15)\n", | |
"plt.tight_layout()\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"That's it, you've got yourself a classifier ! However, we used aditionnal steps to make it better that I'm gonna demonstrate using our data." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Correcting the model inferred distributions\n", | |
"\n", | |
"Let's load the raw_count yielded by our crawler, and the confusion matrix for recall scores. Download it here:\n", | |
"\n", | |
"```bash\n", | |
"wget -c 'https://api.nakala.fr/data/10.34847/nkl.da5f62h8/41fb60ec24e7f07494e84aface7ee7745865f147?content-disposition=attachment' -O raw_count_from_crawler.csv\n", | |
"wget -c 'https://api.nakala.fr/data/10.34847/nkl.da5f62h8/c6d0ff34cc2c6cb80ea3d6ddd40fd1a1e6323952?content-disposition=attachment' -O conf_mat_recall.csv\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>African</th>\n", | |
" <th>Arabian</th>\n", | |
" <th>Asian</th>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <th>Indian</th>\n", | |
" <th>NorthEuropean</th>\n", | |
" <th>Slavic</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>assemblee</th>\n", | |
" <td>290.5</td>\n", | |
" <td>335.0</td>\n", | |
" <td>218.0</td>\n", | |
" <td>1566.0</td>\n", | |
" <td>193.0</td>\n", | |
" <td>5599.0</td>\n", | |
" <td>124.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>avocats</th>\n", | |
" <td>1573.0</td>\n", | |
" <td>2698.0</td>\n", | |
" <td>1035.5</td>\n", | |
" <td>5745.5</td>\n", | |
" <td>1391.5</td>\n", | |
" <td>18564.5</td>\n", | |
" <td>1009.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bac_pro</th>\n", | |
" <td>4208.5</td>\n", | |
" <td>6689.5</td>\n", | |
" <td>2424.5</td>\n", | |
" <td>16297.5</td>\n", | |
" <td>2862.5</td>\n", | |
" <td>46416.0</td>\n", | |
" <td>1773.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>baccalaureat</th>\n", | |
" <td>20969.0</td>\n", | |
" <td>33511.5</td>\n", | |
" <td>14223.0</td>\n", | |
" <td>90545.5</td>\n", | |
" <td>15485.0</td>\n", | |
" <td>250686.5</td>\n", | |
" <td>10220.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bep</th>\n", | |
" <td>6548.5</td>\n", | |
" <td>11282.0</td>\n", | |
" <td>3784.0</td>\n", | |
" <td>24626.0</td>\n", | |
" <td>4659.0</td>\n", | |
" <td>63108.0</td>\n", | |
" <td>2803.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>brevet</th>\n", | |
" <td>26964.5</td>\n", | |
" <td>46639.5</td>\n", | |
" <td>17321.0</td>\n", | |
" <td>116343.0</td>\n", | |
" <td>19360.0</td>\n", | |
" <td>321461.0</td>\n", | |
" <td>14859.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bts</th>\n", | |
" <td>4093.5</td>\n", | |
" <td>6609.0</td>\n", | |
" <td>2820.0</td>\n", | |
" <td>18397.0</td>\n", | |
" <td>3011.5</td>\n", | |
" <td>50964.5</td>\n", | |
" <td>2020.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>cap</th>\n", | |
" <td>4832.5</td>\n", | |
" <td>7510.0</td>\n", | |
" <td>2964.5</td>\n", | |
" <td>21310.0</td>\n", | |
" <td>3338.5</td>\n", | |
" <td>56124.5</td>\n", | |
" <td>2283.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>cnrs</th>\n", | |
" <td>451.5</td>\n", | |
" <td>624.5</td>\n", | |
" <td>456.0</td>\n", | |
" <td>2873.5</td>\n", | |
" <td>435.5</td>\n", | |
" <td>7337.5</td>\n", | |
" <td>478.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>comptables</th>\n", | |
" <td>993.0</td>\n", | |
" <td>1211.5</td>\n", | |
" <td>628.5</td>\n", | |
" <td>4106.0</td>\n", | |
" <td>681.5</td>\n", | |
" <td>12952.0</td>\n", | |
" <td>372.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>maires</th>\n", | |
" <td>1409.5</td>\n", | |
" <td>1067.0</td>\n", | |
" <td>944.0</td>\n", | |
" <td>6694.0</td>\n", | |
" <td>872.0</td>\n", | |
" <td>25110.0</td>\n", | |
" <td>526.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>pharmaciens</th>\n", | |
" <td>3219.5</td>\n", | |
" <td>4268.5</td>\n", | |
" <td>2545.0</td>\n", | |
" <td>13767.5</td>\n", | |
" <td>2371.0</td>\n", | |
" <td>45899.5</td>\n", | |
" <td>1351.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>senateurs</th>\n", | |
" <td>55.0</td>\n", | |
" <td>80.5</td>\n", | |
" <td>48.0</td>\n", | |
" <td>315.0</td>\n", | |
" <td>66.0</td>\n", | |
" <td>1127.0</td>\n", | |
" <td>18.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>veterinaires</th>\n", | |
" <td>622.0</td>\n", | |
" <td>564.0</td>\n", | |
" <td>453.5</td>\n", | |
" <td>2845.0</td>\n", | |
" <td>419.5</td>\n", | |
" <td>10512.5</td>\n", | |
" <td>290.5</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>x</th>\n", | |
" <td>960.0</td>\n", | |
" <td>1606.0</td>\n", | |
" <td>1080.0</td>\n", | |
" <td>4256.0</td>\n", | |
" <td>764.0</td>\n", | |
" <td>13819.0</td>\n", | |
" <td>570.0</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" African Arabian Asian CentralSouthEuropean Indian \n", | |
"assemblee 290.5 335.0 218.0 1566.0 193.0 \\\n", | |
"avocats 1573.0 2698.0 1035.5 5745.5 1391.5 \n", | |
"bac_pro 4208.5 6689.5 2424.5 16297.5 2862.5 \n", | |
"baccalaureat 20969.0 33511.5 14223.0 90545.5 15485.0 \n", | |
"bep 6548.5 11282.0 3784.0 24626.0 4659.0 \n", | |
"brevet 26964.5 46639.5 17321.0 116343.0 19360.0 \n", | |
"bts 4093.5 6609.0 2820.0 18397.0 3011.5 \n", | |
"cap 4832.5 7510.0 2964.5 21310.0 3338.5 \n", | |
"cnrs 451.5 624.5 456.0 2873.5 435.5 \n", | |
"comptables 993.0 1211.5 628.5 4106.0 681.5 \n", | |
"maires 1409.5 1067.0 944.0 6694.0 872.0 \n", | |
"pharmaciens 3219.5 4268.5 2545.0 13767.5 2371.0 \n", | |
"senateurs 55.0 80.5 48.0 315.0 66.0 \n", | |
"veterinaires 622.0 564.0 453.5 2845.0 419.5 \n", | |
"x 960.0 1606.0 1080.0 4256.0 764.0 \n", | |
"\n", | |
" NorthEuropean Slavic \n", | |
"assemblee 5599.0 124.5 \n", | |
"avocats 18564.5 1009.0 \n", | |
"bac_pro 46416.0 1773.5 \n", | |
"baccalaureat 250686.5 10220.5 \n", | |
"bep 63108.0 2803.5 \n", | |
"brevet 321461.0 14859.0 \n", | |
"bts 50964.5 2020.5 \n", | |
"cap 56124.5 2283.0 \n", | |
"cnrs 7337.5 478.5 \n", | |
"comptables 12952.0 372.5 \n", | |
"maires 25110.0 526.5 \n", | |
"pharmaciens 45899.5 1351.0 \n", | |
"senateurs 1127.0 18.5 \n", | |
"veterinaires 10512.5 290.5 \n", | |
"x 13819.0 570.0 " | |
] | |
}, | |
"execution_count": 25, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"count = pd.read_csv('raw_count_from_crawler.csv', index_col=0)\n", | |
"count" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>African</th>\n", | |
" <th>Arabian</th>\n", | |
" <th>Asian</th>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <th>Indian</th>\n", | |
" <th>NorthEuropean</th>\n", | |
" <th>Slavic</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>African</th>\n", | |
" <td>2763</td>\n", | |
" <td>165</td>\n", | |
" <td>381</td>\n", | |
" <td>1081</td>\n", | |
" <td>460</td>\n", | |
" <td>1441</td>\n", | |
" <td>157</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Arabian</th>\n", | |
" <td>159</td>\n", | |
" <td>3292</td>\n", | |
" <td>84</td>\n", | |
" <td>577</td>\n", | |
" <td>598</td>\n", | |
" <td>1549</td>\n", | |
" <td>77</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Asian</th>\n", | |
" <td>319</td>\n", | |
" <td>113</td>\n", | |
" <td>5200</td>\n", | |
" <td>831</td>\n", | |
" <td>716</td>\n", | |
" <td>1147</td>\n", | |
" <td>174</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <td>258</td>\n", | |
" <td>128</td>\n", | |
" <td>274</td>\n", | |
" <td>20364</td>\n", | |
" <td>299</td>\n", | |
" <td>3535</td>\n", | |
" <td>324</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Indian</th>\n", | |
" <td>273</td>\n", | |
" <td>487</td>\n", | |
" <td>420</td>\n", | |
" <td>991</td>\n", | |
" <td>7226</td>\n", | |
" <td>1862</td>\n", | |
" <td>191</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>NorthEuropean</th>\n", | |
" <td>643</td>\n", | |
" <td>351</td>\n", | |
" <td>315</td>\n", | |
" <td>3254</td>\n", | |
" <td>609</td>\n", | |
" <td>20183</td>\n", | |
" <td>670</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Slavic</th>\n", | |
" <td>114</td>\n", | |
" <td>60</td>\n", | |
" <td>80</td>\n", | |
" <td>1570</td>\n", | |
" <td>159</td>\n", | |
" <td>2752</td>\n", | |
" <td>8250</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" African Arabian Asian CentralSouthEuropean Indian \n", | |
"African 2763 165 381 1081 460 \\\n", | |
"Arabian 159 3292 84 577 598 \n", | |
"Asian 319 113 5200 831 716 \n", | |
"CentralSouthEuropean 258 128 274 20364 299 \n", | |
"Indian 273 487 420 991 7226 \n", | |
"NorthEuropean 643 351 315 3254 609 \n", | |
"Slavic 114 60 80 1570 159 \n", | |
"\n", | |
" NorthEuropean Slavic \n", | |
"African 1441 157 \n", | |
"Arabian 1549 77 \n", | |
"Asian 1147 174 \n", | |
"CentralSouthEuropean 3535 324 \n", | |
"Indian 1862 191 \n", | |
"NorthEuropean 20183 670 \n", | |
"Slavic 2752 8250 " | |
] | |
}, | |
"execution_count": 26, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"purerawR = pd.read_csv('conf_mat_recall.csv', index_col=0)\n", | |
"purerawR" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>African</th>\n", | |
" <th>Arabian</th>\n", | |
" <th>Asian</th>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <th>Indian</th>\n", | |
" <th>NorthEuropean</th>\n", | |
" <th>Slavic</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>African</th>\n", | |
" <td>132.3</td>\n", | |
" <td>13.7</td>\n", | |
" <td>11.7</td>\n", | |
" <td>223.4</td>\n", | |
" <td>15.8</td>\n", | |
" <td>822.9</td>\n", | |
" <td>4.1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Arabian</th>\n", | |
" <td>7.6</td>\n", | |
" <td>272.7</td>\n", | |
" <td>2.6</td>\n", | |
" <td>119.2</td>\n", | |
" <td>20.6</td>\n", | |
" <td>884.5</td>\n", | |
" <td>2.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Asian</th>\n", | |
" <td>15.3</td>\n", | |
" <td>9.4</td>\n", | |
" <td>160.0</td>\n", | |
" <td>171.7</td>\n", | |
" <td>24.6</td>\n", | |
" <td>655.0</td>\n", | |
" <td>4.6</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <td>12.4</td>\n", | |
" <td>10.6</td>\n", | |
" <td>8.4</td>\n", | |
" <td>4208.6</td>\n", | |
" <td>10.3</td>\n", | |
" <td>2018.6</td>\n", | |
" <td>8.6</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Indian</th>\n", | |
" <td>13.1</td>\n", | |
" <td>40.3</td>\n", | |
" <td>12.9</td>\n", | |
" <td>204.8</td>\n", | |
" <td>248.5</td>\n", | |
" <td>1063.3</td>\n", | |
" <td>5.0</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>NorthEuropean</th>\n", | |
" <td>30.8</td>\n", | |
" <td>29.1</td>\n", | |
" <td>9.7</td>\n", | |
" <td>672.5</td>\n", | |
" <td>20.9</td>\n", | |
" <td>11525.1</td>\n", | |
" <td>17.7</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Slavic</th>\n", | |
" <td>5.5</td>\n", | |
" <td>5.0</td>\n", | |
" <td>2.5</td>\n", | |
" <td>324.5</td>\n", | |
" <td>5.5</td>\n", | |
" <td>1571.5</td>\n", | |
" <td>217.8</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" African Arabian Asian CentralSouthEuropean Indian \n", | |
"African 132.3 13.7 11.7 223.4 15.8 \\\n", | |
"Arabian 7.6 272.7 2.6 119.2 20.6 \n", | |
"Asian 15.3 9.4 160.0 171.7 24.6 \n", | |
"CentralSouthEuropean 12.4 10.6 8.4 4208.6 10.3 \n", | |
"Indian 13.1 40.3 12.9 204.8 248.5 \n", | |
"NorthEuropean 30.8 29.1 9.7 672.5 20.9 \n", | |
"Slavic 5.5 5.0 2.5 324.5 5.5 \n", | |
"\n", | |
" NorthEuropean Slavic \n", | |
"African 822.9 4.1 \n", | |
"Arabian 884.5 2.0 \n", | |
"Asian 655.0 4.6 \n", | |
"CentralSouthEuropean 2018.6 8.6 \n", | |
"Indian 1063.3 5.0 \n", | |
"NorthEuropean 11525.1 17.7 \n", | |
"Slavic 1571.5 217.8 " | |
] | |
}, | |
"execution_count": 27, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Computing the corrected confusion matrix using the proportion\n", | |
"# available from the uncorrected classification guessed by the original\n", | |
"# classifier on the Brevet dataset, in order to correct the PubMed\n", | |
"# population breakdown which diverges significantly from the Brevet\n", | |
"# counts [see endnote 4 in the originally submitted manuscript\n", | |
"norm_brevet = count.T['brevet'] / count.T['brevet'].sum()\n", | |
"rawR = purerawR * norm_brevet\n", | |
"rawR.round(1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>African</th>\n", | |
" <th>Arabian</th>\n", | |
" <th>Asian</th>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <th>Indian</th>\n", | |
" <th>NorthEuropean</th>\n", | |
" <th>Slavic</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>African</th>\n", | |
" <td>0.108128</td>\n", | |
" <td>0.011169</td>\n", | |
" <td>0.009578</td>\n", | |
" <td>0.182528</td>\n", | |
" <td>0.012925</td>\n", | |
" <td>0.672288</td>\n", | |
" <td>0.003386</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Arabian</th>\n", | |
" <td>0.005817</td>\n", | |
" <td>0.208306</td>\n", | |
" <td>0.001974</td>\n", | |
" <td>0.091076</td>\n", | |
" <td>0.015707</td>\n", | |
" <td>0.675567</td>\n", | |
" <td>0.001552</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Asian</th>\n", | |
" <td>0.014684</td>\n", | |
" <td>0.008997</td>\n", | |
" <td>0.153758</td>\n", | |
" <td>0.165045</td>\n", | |
" <td>0.023664</td>\n", | |
" <td>0.629439</td>\n", | |
" <td>0.004414</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <td>0.001969</td>\n", | |
" <td>0.001689</td>\n", | |
" <td>0.001343</td>\n", | |
" <td>0.670433</td>\n", | |
" <td>0.001638</td>\n", | |
" <td>0.321566</td>\n", | |
" <td>0.001362</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Indian</th>\n", | |
" <td>0.008235</td>\n", | |
" <td>0.025408</td>\n", | |
" <td>0.008138</td>\n", | |
" <td>0.128975</td>\n", | |
" <td>0.156493</td>\n", | |
" <td>0.669576</td>\n", | |
" <td>0.003175</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>NorthEuropean</th>\n", | |
" <td>0.002503</td>\n", | |
" <td>0.002363</td>\n", | |
" <td>0.000788</td>\n", | |
" <td>0.054649</td>\n", | |
" <td>0.001702</td>\n", | |
" <td>0.936559</td>\n", | |
" <td>0.001437</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>Slavic</th>\n", | |
" <td>0.002561</td>\n", | |
" <td>0.002332</td>\n", | |
" <td>0.001155</td>\n", | |
" <td>0.152185</td>\n", | |
" <td>0.002565</td>\n", | |
" <td>0.737068</td>\n", | |
" <td>0.102135</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" African Arabian Asian CentralSouthEuropean \n", | |
"African 0.108128 0.011169 0.009578 0.182528 \\\n", | |
"Arabian 0.005817 0.208306 0.001974 0.091076 \n", | |
"Asian 0.014684 0.008997 0.153758 0.165045 \n", | |
"CentralSouthEuropean 0.001969 0.001689 0.001343 0.670433 \n", | |
"Indian 0.008235 0.025408 0.008138 0.128975 \n", | |
"NorthEuropean 0.002503 0.002363 0.000788 0.054649 \n", | |
"Slavic 0.002561 0.002332 0.001155 0.152185 \n", | |
"\n", | |
" Indian NorthEuropean Slavic \n", | |
"African 0.012925 0.672288 0.003386 \n", | |
"Arabian 0.015707 0.675567 0.001552 \n", | |
"Asian 0.023664 0.629439 0.004414 \n", | |
"CentralSouthEuropean 0.001638 0.321566 0.001362 \n", | |
"Indian 0.156493 0.669576 0.003175 \n", | |
"NorthEuropean 0.001702 0.936559 0.001437 \n", | |
"Slavic 0.002565 0.737068 0.102135 " | |
] | |
}, | |
"execution_count": 28, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Matrix for Multinomial Bayesian inference corrections\n", | |
"corrector = (rawR.T / rawR.T.sum()).T\n", | |
"corrector" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 29, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def redress(dataset):\n", | |
" return (count.T[dataset] * corrector.T).sum(axis=1)\n", | |
"\n", | |
"def redressratio(dataset, refdataset=\"brevet\"):\n", | |
" ref_dataset_count = redress(refdataset)\n", | |
" ref_dataset_norm = ref_dataset_count / ref_dataset_count.sum()\n", | |
" dataset_count = redress(dataset)\n", | |
" dataset_norm = dataset_count / dataset_count.sum()\n", | |
" return dataset_norm / ref_dataset_norm" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>African</th>\n", | |
" <th>Arabian</th>\n", | |
" <th>Asian</th>\n", | |
" <th>CentralSouthEuropean</th>\n", | |
" <th>Indian</th>\n", | |
" <th>NorthEuropean</th>\n", | |
" <th>Slavic</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>assemblee</th>\n", | |
" <td>0.804085</td>\n", | |
" <td>0.557258</td>\n", | |
" <td>0.849278</td>\n", | |
" <td>0.914253</td>\n", | |
" <td>0.724993</td>\n", | |
" <td>1.043487</td>\n", | |
" <td>0.719838</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>avocats</th>\n", | |
" <td>1.026600</td>\n", | |
" <td>1.026118</td>\n", | |
" <td>1.047989</td>\n", | |
" <td>0.923827</td>\n", | |
" <td>1.157147</td>\n", | |
" <td>1.016126</td>\n", | |
" <td>1.124734</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bac_pro</th>\n", | |
" <td>1.054336</td>\n", | |
" <td>1.003692</td>\n", | |
" <td>0.989381</td>\n", | |
" <td>0.986271</td>\n", | |
" <td>1.021140</td>\n", | |
" <td>1.003351</td>\n", | |
" <td>0.899460</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>baccalaureat</th>\n", | |
" <td>1.004085</td>\n", | |
" <td>0.943026</td>\n", | |
" <td>1.045487</td>\n", | |
" <td>1.002737</td>\n", | |
" <td>1.014575</td>\n", | |
" <td>1.000612</td>\n", | |
" <td>0.933506</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bep</th>\n", | |
" <td>1.115252</td>\n", | |
" <td>1.146599</td>\n", | |
" <td>1.059234</td>\n", | |
" <td>1.022322</td>\n", | |
" <td>1.124127</td>\n", | |
" <td>0.986978</td>\n", | |
" <td>0.951642</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>brevet</th>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>bts</th>\n", | |
" <td>0.981552</td>\n", | |
" <td>0.923278</td>\n", | |
" <td>1.027909</td>\n", | |
" <td>1.004736</td>\n", | |
" <td>0.987463</td>\n", | |
" <td>1.001437</td>\n", | |
" <td>0.920695</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>cap</th>\n", | |
" <td>1.011165</td>\n", | |
" <td>0.934855</td>\n", | |
" <td>0.985573</td>\n", | |
" <td>1.028319</td>\n", | |
" <td>0.982563</td>\n", | |
" <td>0.994919</td>\n", | |
" <td>0.925589</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>cnrs</th>\n", | |
" <td>0.837519</td>\n", | |
" <td>0.662508</td>\n", | |
" <td>1.105289</td>\n", | |
" <td>1.057363</td>\n", | |
" <td>0.949007</td>\n", | |
" <td>0.994088</td>\n", | |
" <td>1.262002</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>comptables</th>\n", | |
" <td>0.982021</td>\n", | |
" <td>0.749097</td>\n", | |
" <td>0.972916</td>\n", | |
" <td>0.957006</td>\n", | |
" <td>0.929215</td>\n", | |
" <td>1.020817</td>\n", | |
" <td>0.797968</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>maires</th>\n", | |
" <td>0.845592</td>\n", | |
" <td>0.449110</td>\n", | |
" <td>0.842655</td>\n", | |
" <td>0.897893</td>\n", | |
" <td>0.722153</td>\n", | |
" <td>1.050516</td>\n", | |
" <td>0.707819</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>pharmaciens</th>\n", | |
" <td>0.944041</td>\n", | |
" <td>0.752009</td>\n", | |
" <td>1.078519</td>\n", | |
" <td>0.931259</td>\n", | |
" <td>0.932360</td>\n", | |
" <td>1.026966</td>\n", | |
" <td>0.813930</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>senateurs</th>\n", | |
" <td>0.785748</td>\n", | |
" <td>0.642040</td>\n", | |
" <td>0.909125</td>\n", | |
" <td>0.906563</td>\n", | |
" <td>0.989606</td>\n", | |
" <td>1.040090</td>\n", | |
" <td>0.630272</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>veterinaires</th>\n", | |
" <td>0.869147</td>\n", | |
" <td>0.521220</td>\n", | |
" <td>0.922983</td>\n", | |
" <td>0.899550</td>\n", | |
" <td>0.788853</td>\n", | |
" <td>1.045734</td>\n", | |
" <td>0.807517</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>x</th>\n", | |
" <td>0.939215</td>\n", | |
" <td>0.870620</td>\n", | |
" <td>1.370286</td>\n", | |
" <td>0.933111</td>\n", | |
" <td>0.989820</td>\n", | |
" <td>1.019163</td>\n", | |
" <td>0.968917</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" African Arabian Asian CentralSouthEuropean Indian \n", | |
"assemblee 0.804085 0.557258 0.849278 0.914253 0.724993 \\\n", | |
"avocats 1.026600 1.026118 1.047989 0.923827 1.157147 \n", | |
"bac_pro 1.054336 1.003692 0.989381 0.986271 1.021140 \n", | |
"baccalaureat 1.004085 0.943026 1.045487 1.002737 1.014575 \n", | |
"bep 1.115252 1.146599 1.059234 1.022322 1.124127 \n", | |
"brevet 1.000000 1.000000 1.000000 1.000000 1.000000 \n", | |
"bts 0.981552 0.923278 1.027909 1.004736 0.987463 \n", | |
"cap 1.011165 0.934855 0.985573 1.028319 0.982563 \n", | |
"cnrs 0.837519 0.662508 1.105289 1.057363 0.949007 \n", | |
"comptables 0.982021 0.749097 0.972916 0.957006 0.929215 \n", | |
"maires 0.845592 0.449110 0.842655 0.897893 0.722153 \n", | |
"pharmaciens 0.944041 0.752009 1.078519 0.931259 0.932360 \n", | |
"senateurs 0.785748 0.642040 0.909125 0.906563 0.989606 \n", | |
"veterinaires 0.869147 0.521220 0.922983 0.899550 0.788853 \n", | |
"x 0.939215 0.870620 1.370286 0.933111 0.989820 \n", | |
"\n", | |
" NorthEuropean Slavic \n", | |
"assemblee 1.043487 0.719838 \n", | |
"avocats 1.016126 1.124734 \n", | |
"bac_pro 1.003351 0.899460 \n", | |
"baccalaureat 1.000612 0.933506 \n", | |
"bep 0.986978 0.951642 \n", | |
"brevet 1.000000 1.000000 \n", | |
"bts 1.001437 0.920695 \n", | |
"cap 0.994919 0.925589 \n", | |
"cnrs 0.994088 1.262002 \n", | |
"comptables 1.020817 0.797968 \n", | |
"maires 1.050516 0.707819 \n", | |
"pharmaciens 1.026966 0.813930 \n", | |
"senateurs 1.040090 0.630272 \n", | |
"veterinaires 1.045734 0.807517 \n", | |
"x 1.019163 0.968917 " | |
] | |
}, | |
"execution_count": 30, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"redressratio_df = pd.concat([redressratio(dataset) for dataset in count.index], axis=1, keys=count.index).T\n", | |
"redressratio_df" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"That's it ! This is the actual matrix used for plotting Figure 2 in the paper.\n", | |
"\n", | |
"Any questions ? Feel free to ask: [email protected]\n", | |
"\n", | |
"EOF" | |
] | |
} | |
], | |
"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.9.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment