[PYTHON] Représentez graphiquement le ratio de topcoder, Codeforces et TOEIC par note (Pandas + seaborn)

J'ai essayé de visualiser le rapport du nombre de personnes de différentes évaluations sous forme de graphique à barres empilées. Je dessine avec Python (matplotlib + Pandas + seaborn).

Puisqu'il s'agit d'une méthode de dessin de graphe jusqu'au milieu, si vous ne voulez que le résultat, veuillez passer à ici.

Public cible de cet article

--Je veux dessiner un graphe en Python --Je participe à topcoder / Codeforces et je ne peux pas m'empêcher de m'inquiéter de ma position «J'ai reçu le TOEIC, mais je ne peux pas saisir le niveau de score. ――Je veux fixer le prochain objectif ――Je suis un maniaque du beat

Motivation et résultats

Comment dessiner un graphique

Un superbe dessin graphique avec python -seaborn améliore l'analyse et la visualisation des données, partie 1 J'ai fait référence à cet article.

En gros, dessinez le graphique selon le flux suivant.

  1. Préparez une définition du rang (plage de notation)
  2. Générez un tableau à partir de la source de données avec l'évaluation de chaque utilisateur en tant qu'élément (ou manuellement)
  3. Créez un bloc de données Pandas
  4. Dessinez un graphique à barres empilées (enregistrer en tant qu'image)

Préparer la définition du rang

La couleur joue un rôle important dans les systèmes de notation topcoder et Codeforces. Par conséquent, préparez un tableau qui définit les trois éléments «plage de classement», «nom de ce rang» et «couleur» comme un seul rang, et utilisez-le pour le dessin graphique.

Par exemple, dans topcoder, nous avons préparé les définitions suivantes.

# (border, name, color)
rank_info = [
    (0-1, 'Gray', '#9D9FA0'),
    (900-1, 'Green', '#69C329'),
    (1200-1, 'Blue', '#616BD5'),
    (1500-1, 'Yellow', '#FCD617'),
    (2200-1, 'Red', '#EF3A3A'),
    (3000-1, 'Target', '#000000'),
]

L'extrémité gauche montre la valeur de la limite inférieure -1 du rang. Autrement dit, le gris est (-1..899], le vert est (899..1199], et ainsi de suite. Cette définition est utilisée car il est pratique de traiter les données ultérieurement avec pandas.cut. Les autres sont alignés avec des noms de rang et des informations de couleur.

Lorsque vous dessinez un graphique, un tableau contenant uniquement les noms de rang et les informations de couleur est nécessaire, il est donc nécessaire de découper à l'aide de la carte le cas échéant.

rank_borders = map(lambda x: x[0], rank_info)
names = map(lambda x: x[1], rank_info)
color = map(lambda x: x[2], rank_info)

Générer un tableau avec une note en tant qu'élément à partir de la source de données

Les sources de données sont disponibles dans une variété de formats. Ils vont des formats relativement bien formés tels que JSON et XML aux pages Web et aux tweets. Récemment, je pense qu'il y a beaucoup d'acquisitions via Web API, donc ici seul l'exemple de Codeforces est montré.

url = 'http://codeforces.com/api/user.ratedList?activeOnly=true'
response = urllib2.urlopen(url).read()
data = json.loads(response)

if data['status'] == 'OK':
    res = data['result']

    ratings = map(lambda x: x['rating'], res)

Enfin, nous avons une gamme de notes, qui regorge de numéros de notation. Pour les autres sources de données, préparez un analyseur, préparez les valeurs manuellement ou obtenez-les d'une manière qui convient à chaque format.

Créer un bloc de données Pandas

Placez les données dans une classe appelée bloc de données, qui a beaucoup de fonctions d'analyse et de dessin. Il est très pratique de voir le résumé des données avec la fonction de description.

Je voudrais le faire immédiatement, mais les données extraites de la source de données cette fois-ci sont un tableau qui a les valeurs de notation suivantes comme éléments. [1600, 2700, 100, 1200, ... ]

Afin de dessiner les données cibles, il est nécessaire de les convertir en un tableau qui représente le rapport pour chaque valeur de rang comme indiqué ci-dessous. [0.1, 0.15, 0.3, 0.25, ... ] (Le rang 0 est 10%, le rang 1 est 15%, ...)

Je pense qu'il existe différentes méthodes de conversion, mais cette fois, j'ai suivi les étapes suivantes.

  1. 1600, 2700, 100, 1200, ...
  2. [3, 8, 0, 1, ...](classement par rang)
  3. {0: 300, 1: 800, 2: 2000, 3: 12000, ...} (compteur par rang)
  4. [300, 800, 2000, 1200, ...](Nombre de personnes par échelon)
  5. [0,1, 0,15, 0,3, 0,25, ...](rapport par rang)

Détails de la conversion

Bien sûr, vous pouvez écrire vous-même une boucle pour convertir 1-> 2, mais Il existe une fonction appelée pandas.cut qui facilite ce type de traitement.

Si vous préparez un tableau qui représente les critères de rang [a, b, c, d], La valeur entre (a, b] est 0, entre (b, c] est 1, entre (c, d] est 2, Fera la conversion.

En guise de mise en garde, les personnes ayant le rang le plus élevé ne seront pas comptées dans cette définition de données, il est donc nécessaire d'ajouter une grande valeur (INT_MAX, etc.) en tant que garde à la fin.

De plus, les conversions 2-> 3 et 3-> 4 peuvent être facilement effectuées en utilisant le [Counter] de Python (http://docs.python.jp/2/library/collections.html).

import pandas as pd

# 1->2->3
bins = rank_borders + [sys.maxint]
ranks = Counter(pd.cut(ratings, bins, labels=range(len(rank_info)))).items()

# 3->4
num_list = map(lambda x: x[1], ranks)

Enfin, lors de la création de la trame de données, effectuez une conversion 4-> 5. En donnant le total à la div, chacun sera converti en pourcentage. Pour faciliter le dessin du graphe, il est transposé avec .T à la fin.

df = pd.DataFrame(num_list, columns=[''], index=rank_list).div(len(ratings)).T

Dessiner un graphique à barres empilées (enregistrer en tant qu'image)

Une fois que vous avez le pourcentage pour chaque rang, il ne vous reste plus qu'à dessiner. Vous pouvez dessiner le bloc de données séparément.

df.plot(kind='bar', stacked=True)

Si vous avez importé seaborn, vous avez déjà quitté le graphe inorganique de matplotlib. Cependant, il y a certaines parties qui ne sont pas bonnes pour le regarder tel quel, c'est pourquoi nous apportons les ajustements suivants.

import seaborn as sns

sns.set_context('talk', 1.2)  #Augmenter la taille de la police
sns.set_palette(color)        #Définir la couleur du rang

#Inverser l'ordre de la légende
handles, labels = sns.plt.gca().get_legend_handles_labels()
sns.plt.gca().legend(reversed(handles), reversed(labels), loc='lower left')

#Limite supérieure 1.Définir sur 0 pour éliminer les marges
sns.plt.yticks(np.arange(0.0, 1.1, 0.1))  # 0.Affiché par incréments de 1. 1.1 à 0.N'inclut pas 0
sns.plt.ylim(0.0, 1.0)  #Ici 1.Dessiner jusqu'à 0

Enfin, show () pour l'afficher à l'écran ou savefig pour l'enregistrer en tant qu'image.

sns.plt.show()  #Écran d'affichage
# sns.plt.savefig("image.png ")  #Enregistrer l'image

En combinant les étapes ci-dessus, vous pouvez dessiner un graphique.

Exemple de dessin réel

Topcoder L'API est disponible, poliment échantillonnés, mais les membres les mieux classés de l'algorithme Quand j'ai accédé, 400 ont été retournés.

  "error": {
    "name": "Not Found",
    "value": 404,
    "description": "The URI requested is invalid or the requested resource does not exist.",
    "details": "No results found"
  }

En passant, si vous entrez une chaîne de caractères appropriée dans testType, il renverra des candidats. Cependant, la moitié retournera 400.

  "error": {
    "name": "Bad Request",
    "value": 400,
    "description": "The request was invalid. An accompanying message will explain why.",
    "details": "challengeType should be an element of design,development,specification,architecture,bug_hunt,test_suites,assembly,ui_prototypes,conceptualization,ria_build,ria_component,test_scenarios,copilot_posting,content_creation,reporting,marathon_match,first2finish,code,algorithm."
  }

Je ne peux pas m'en empêcher, alors je l'ai extrait des données XML suivantes. http://apps.topcoder.com/wiki/display/tc/Algorithm+Data+Feeds

Il existe deux types de données, les utilisateurs actifs (qui ont participé à des concours notés dans les 180 jours) et tous les utilisateurs.

Graphique

--Utilisateurs actifs (5469) active.png --Tous les utilisateurs (69096 personnes) all.png

Prise en compte des utilisateurs actifs

Tout d'abord, je suis préoccupé par le fait que le nombre d'utilisateurs actifs est plus petit que prévu. En regardant le ratio, près de 60% du total est la division 2 et 40% est la division 1. En raison du petit nombre d'utilisateurs actifs et du petit nombre de sous-saletés (car l'enregistrement est difficile), il semble que la formule de notation soit conforme à la formule.

Le jaune était à peu près parmi les 20% supérieurs et les codeurs rouges dans les 3,9% supérieurs. La cible est de 0,29%, épaisseur qui peut être confirmée visuellement sur le graphique. Si vos yeux sont fatigués, vous risquez de le manquer. C'est juste une personne au-dessus des nuages.

Résumé d'une ligne

Le rapport de topcoder est magnifique.

Codeforces Comme mentionné précédemment, l'API est disponible (http://codeforces.com/api/help). Si vous demandez user.ratedList, la liste sera renvoyée au format JSON. Encore une fois, les utilisateurs actifs et tous les utilisateurs sont séparés, mais la condition active est "Avez-vous participé à un concours avec un tarif le mois dernier?", Ce qui semble être plus strict que topcoder.

Graphique

--Utilisateurs actifs (9640 personnes) active.png --Tous les utilisateurs (71606 personnes) all.png

Considération

J'ai l'impression qu'il y a un certain nombre de sous-saletés, mais même si vous les excluez, il y a beaucoup d'utilisateurs actifs. Même si les conditions sont strictes, je ressens l'élan de ce nombre.

Comme vous pouvez le voir, le standard Div.1 était considérablement plus élevé que le topcoder, et il se situait dans le top 10% (violet ~). Il se peut qu'il y ait plus de débutants que de topcoder, ou que les meilleurs se distinguent parce qu'ils participent du monde entier en termes de temps. De plus, il n'y a que 2,4% au-dessus du violet, mais il y a aussi 5 rangs. Pour ce qui est de la motivation des débutants, je pense qu'il faut la diviser un peu plus bas.

Résumé d'une ligne

Jeu des dieux des rangs supérieurs (besoin de se classer autant ...?)

TOEIC Nous avons obtenu les dernières 206 données de la page Web suivante. http://www.toeic.or.jp/toeic/about/data/data_avelist/data_dist01_09.html Ce sont des données aimables que le ratio est déjà écrit. Je ne l'ai pas utilisé pour créer des graphiques.

De plus, chacun des trois types d'écoute, de lecture et de total est représenté graphiquement.

Graphique

Considération

Il y a de nombreux participants. S'il y a autant de participants au concours pro à chaque fois ... Le serveur tombe en panne! Je prie juste pour le développement du monde professionnel compétitif.

Le graphique est par incréments d'environ 50 points, mais il a une belle distribution. Je ne connais pas la méthode de notation détaillée, mais il est naturel que la distribution-> score soit décidée au lieu de la distribution score->.

Cependant, il semble que la lecture soit plus uniforme au milieu que l'écoute, et le haut l'est moins. L'écoute 470 ~ est 4,1%, la lecture 470 ~ est 1,1%. Certes, j'entends souvent que Reading a un score plus bas. L'écoute est certainement parfaite pour ceux qui peuvent l'entendre, mais est-ce parce que la lecture est peu probable en raison de contraintes de temps?

En regardant le total, 145 points valent environ 20% et tous les 50 points sont augmentés de 10%. 600 points est la position à 50%.

Je vois souvent "990 points" dans les librairies, le fait est que je veux connaître le nombre de personnes avec un score parfait, mais je ne le savais pas car les données ne sont pas publiées. Au moins, il semble être dans le top 3,6%. Bien sûr, c'est la seule histoire.

Résumé d'une ligne

La différence de 50 points était étonnamment grande.

Classement IIDX SP

** C'est un bonus **

En parlant de notes, il n'y a pas d'autre endroit que Beatmania IIDX (impression individuelle). Les études précédentes suivantes peuvent préoccuper de nombreuses personnes. http://clickagain.sakura.ne.jp/top/tokusyuu/dani_dd/dani_tokusyuu2.html http://esports-runner.com/beatmaniaiidx/dani_transition2/

C'est pourquoi j'ai fait un graphique. Il est créé avec deux types, la valeur actuelle du dernier travail (Copula) et le résultat final du travail précédent (Pendual). De plus, ce n'est que le rang SP.

Quant au nombre de personnes dans le dernier travail, @ 2500bpm a tweeté chaque jour sur Twitter, alors je l'ai utilisé. https://twitter.com/2500bpm Le résultat des travaux précédents étant sur le site officiel, le nombre de personnes à chaque rang est compté et extrait. http://p.eagate.573.jp/game/2dx/22/p/ranking/dani.html

Graphique

Considération

Comme la plupart des utilisateurs le savent, le dépeuplement des rangs inférieurs est incroyable. Jusqu'à 4 étapes sont compressées. Il semble qu'il y ait beaucoup de gens dans le 8e dan, probablement parce qu'il y a beaucoup de gens qui n'ont pas reçu le 9e dan ou plus tard dans ce travail. Il semble que le ratio diminuera progressivement à mesure que l'opération se poursuivra. Par rapport au travail précédent, vous pouvez voir que Chuden a réussi à assouplir les boulettes dix dan.

Résumé d'une ligne

équilibre…….

Classement BMS SP

À propos, jetons également un coup d'œil à BMS. Le nombre de personnes est publié dans LR2IR, donc j'ai utilisé ceci. En raison de ses caractéristiques, BMS peut être frauduleux ou sous-sale, il est donc à titre indicatif uniquement.

J'ai créé deux types, tous les grades et uniquement les grades fous.

Graphique

--Tous grades (58166 personnes) bms.png --Seulement le rang de fou (29584 personnes) insane.png

Considération

Tous les rangs sont étonnamment répartis uniformément. Il peut y avoir des utilisateurs de différents niveaux et l'équilibre entre les rangs peut être bon. Environ la moitié des gens sont devenus fous. Je pense que beaucoup de gens partent de la folie, mais il semble que le rang normal se joue aussi fermement.

Le rang de folie a une distribution dans laquelle le nombre de personnes diminue à mesure que le niveau de difficulté augmente. Étant donné que le nombre de ★ 05 est petit, ★ 06 peut être facile à accepter.

Le ratio du rang le plus élevé (^^) est de 0,07%. Le ratio de ★★ est de 1,2%. Je ne le recommande pas, mais si vous êtes intéressé, vous voudrez peut-être regarder la vidéo.

Résumé d'une ligne

(^^)

Comparaison entre les notes

Comparons l'autorité de l'industrie de différentes compétitions. Le rang est défini comme suit.

Comme chacun a des normes différentes, il ne peut être aidé de les comparer, Vous pouvez avoir une idée des autres évaluations. Ce n'est qu'un guide et nous ne garantissons pas son exactitude.

Top 80%: Débutants

--topcoder: codeur moyen gris --Codeforces: élève (vert clair) inférieur

Top 40% ou moins: intermédiaire

--topcoder: codeur inférieur bleu --Codeforces: Spécialiste (vert foncé) Moyen

Dans le top 20%: avancé

--topcoder: codeur haut bleu vers bas jaune --Codeforces: Expert (bleu) Moyen

Top 10%: Super avancé

--topcoder: codeur moyen jaune --Codeforces: Expert (bleu) haut-candidat maître (violet) bas

Top 5%: classement

--topcoder: codeur top-rouge jaune --Codeforces: Candidate Master (violet) Moyen à élevé

Dans le top 1%: Dieu

--topcoder: cible supérieure rouge --Codeforces: Grandmaster (orange) -Grand maître légendaire (rouge foncé)

Résumé

Avec Python + matplotlib + Pandas + seaborn, vous pouvez facilement dessiner de beaux graphiques comme décrit ci-dessus. Bien sûr, numpy et scipy peuvent être utilisés, de sorte qu'une analyse détaillée peut être effectuée. Si vous avez des inquiétudes, pourquoi ne pas faire un graphique rapide?

Recommended Posts

Représentez graphiquement le ratio de topcoder, Codeforces et TOEIC par note (Pandas + seaborn)
Pandas du débutant, par le débutant, pour le débutant [Python]
Calcul des indicateurs techniques par TA-Lib et pandas
Analyse des données financières par pandas et leur visualisation (2)
Analyse des données financières par pandas et leur visualisation (1)
relation entre la série de nombres de Fibonacci et le nombre d'or
Trouver le diamètre du graphique par recherche de priorité de largeur (mémoire Python)
Mémo de visualisation par pandas, seaborn
Composants liés du graphique
Le pouvoir des pandas: Python
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
Bases de Seaborn pour les débutants ① Graphique agrégé du nombre de données (Countplot)
Trouvez le ratio de la superficie du lac Biwa par la méthode de Monte Carlo