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.
--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
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.
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)
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.
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.
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
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.
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.
--Utilisateurs actifs (5469) --Tous les utilisateurs (69096 personnes)
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.
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.
--Utilisateurs actifs (9640 personnes) --Tous les utilisateurs (71606 personnes)
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.
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.
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.
La différence de 50 points était étonnamment grande.
** 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
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.
équilibre…….
À 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.
--Tous grades (58166 personnes) --Seulement le rang de fou (29584 personnes)
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.
(^^)
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.
--topcoder: codeur moyen gris --Codeforces: élève (vert clair) inférieur
--topcoder: codeur inférieur bleu --Codeforces: Spécialiste (vert foncé) Moyen
--topcoder: codeur haut bleu vers bas jaune --Codeforces: Expert (bleu) Moyen
--topcoder: codeur moyen jaune --Codeforces: Expert (bleu) haut-candidat maître (violet) bas
--topcoder: codeur top-rouge jaune --Codeforces: Candidate Master (violet) Moyen à élevé
--topcoder: cible supérieure rouge --Codeforces: Grandmaster (orange) -Grand maître légendaire (rouge foncé)
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