[PYTHON] Stellen Sie das Verhältnis von Topcoder, Codeforces und TOEIC nach Bewertung grafisch dar (Pandas + Seaborn).

Ich habe versucht, das Verhältnis der Anzahl der Personen mit verschiedenen Bewertungen als gestapeltes Balkendiagramm darzustellen. Ich zeichne mit Python (Matplotlib + Pandas + Seaborn).

Da es sich um eine Grafikzeichnungsmethode bis zur Mitte handelt, fahren Sie mit [hier] fort (#Beispiel), wenn Sie nur das Ergebnis wünschen.

Zielgruppe dieses Artikels

Motivation und Ergebnisse

Wie zeichnet man ein Diagramm?

Schöne Grafikzeichnung mit Python-Seaborn erleichtert die Datenanalyse und -visualisierung Teil 1 Ich habe auf diesen Artikel verwiesen.

Zeichnen Sie das Diagramm grundsätzlich gemäß dem folgenden Ablauf.

  1. Bereiten Sie eine Rangdefinition vor (Bewertungsbereich)
  2. Generieren Sie ein Array aus der Datenquelle mit der Bewertung jedes Benutzers als Element (oder manuell).
  3. Erstellen Sie einen Pandas-Datenrahmen
  4. Zeichnen Sie ein gestapeltes Balkendiagramm (als Bild speichern).

Bereiten Sie die Definition des Ranges vor

Farbe spielt eine wichtige Rolle in den Bewertungssystemen Topcoder und Codeforces. Bereiten Sie daher ein Array vor, das die drei Elemente "Bewertungsbereich", "Name dieses Ranges" und "Farbe" als einen Rang definiert, und verwenden Sie es zum Zeichnen von Diagrammen.

In Topcoder haben wir beispielsweise die folgenden Definitionen vorbereitet.

# (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'),
]

Das linke Ende zeigt den Wert der Untergrenze -1 des Ranges. Das heißt, Grau ist (-1..899], Grün ist (899..1199] und so weiter. Diese Definition wird verwendet, da es bequem ist, die Daten später mit pandas.cut zu verarbeiten. Der Rest ist mit Rangnamen und Farbinformationen aufgereiht.

Beim Zeichnen eines Diagramms ist nur ein Array mit Rangnamen und Farbinformationen erforderlich. Daher muss die Karte entsprechend ausgeschnitten werden.

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)

Generieren Sie ein Array mit der Bewertung als Element aus der Datenquelle

Datenquellen gibt es in verschiedenen Formaten. Sie reichen von relativ wohlgeformten Formaten wie JSON und XML bis zu Webseiten und Tweets. In letzter Zeit denke ich, dass es viele Akquisitionen über die Web-API gibt, daher wird hier nur das Beispiel von Codeforces gezeigt.

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)

Schließlich haben wir eine Reihe von Bewertungen, die mit Bewertungsnummern gefüllt sind. Bereiten Sie für andere Datenquellen einen Parser vor, bereiten Sie Werte manuell vor oder rufen Sie sie auf eine Weise ab, die für jedes Format geeignet ist.

Erstellen Sie einen Pandas-Datenrahmen

Fügen Sie die Daten in eine Klasse ein, die als Datenrahmen bezeichnet wird und viele Analyse- und Zeichenfunktionen bietet. Es ist sehr praktisch, die Zusammenfassung der Daten mit der Beschreibungsfunktion anzuzeigen.

Ich würde es gerne sofort machen, aber die Daten, die diesmal aus der Datenquelle extrahiert werden, sind ein Array, das die folgenden Bewertungswerte als Elemente enthält. [1600, 2700, 100, 1200, ... ]

Um die Zieldaten zu zeichnen, müssen sie in ein Array konvertiert werden, das das Verhältnis für jeden Rangwert darstellt, wie unten gezeigt. [0.1, 0.15, 0.3, 0.25, ... ] (Rang 0 ist 10%, Rang 1 ist 15%, ...)

Ich denke, es gibt verschiedene Konvertierungsmethoden, aber diesmal habe ich die folgenden Schritte ausgeführt.

  1. 1600, 2700, 100, 1200, ...
  2. 3, 8, 0, 1, ...
  3. {0: 300, 1: 800, 2: 2000, 3: 12000, ...} (Zähler nach Rang)
  4. [300, 800, 2000, 1200, ...](Anzahl der Personen pro Sprosse)
  5. [0,1, 0,15, 0,3, 0,25, ...](Verhältnis nach Rang)

Konvertierungsdetails

Natürlich können Sie selbst eine Schleife schreiben, um 1-> 2 zu konvertieren, aber Es gibt eine Funktion namens pandas.cut, die diese Art von Prozess vereinfacht.

Wenn Sie ein Array vorbereiten, das die Kriterien für Rang [a, b, c, d] darstellt, Der Wert zwischen (a, b] ist 0, zwischen (b, c] ist 1, zwischen (c, d] ist 2, Wird die Konvertierung durchführen.

Als Einschränkung werden Personen mit dem höchsten Rang in dieser Datendefinition nicht berücksichtigt. Daher muss am Ende ein großer Wert (INT_MAX usw.) als Schutz hinzugefügt werden.

Mit Python Counter können problemlos 2-> 3- und 3-> 4-Konvertierungen durchgeführt werden.

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)

Führen Sie schließlich beim Erstellen des Datenrahmens eine 4-> 5-Konvertierung durch. Indem Sie dem Div die Summe geben, wird jeder in einen Prozentsatz umgewandelt. Zur Vereinfachung des Zeichnens von Diagrammen wird es am Ende mit .T transponiert.

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

Zeichnen Sie ein gestapeltes Balkendiagramm (als Bild speichern)

Sobald Sie den Prozentsatz für jeden Rang haben, müssen Sie nur noch ziehen. Sie können den Datenrahmen separat zeichnen.

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

Wenn Sie Seaborn importiert haben, haben Sie das anorganische Diagramm von Matplotlib bereits verlassen. Es gibt jedoch einige Teile, die nicht für den Zweck geeignet sind, sie so zu betrachten, wie sie sind. Daher nehmen wir die folgenden Anpassungen vor.

import seaborn as sns

sns.set_context('talk', 1.2)  #Erhöhen Sie die Schriftgröße
sns.set_palette(color)        #Rangfarbe einstellen

#Kehren Sie die Reihenfolge der Legende um
handles, labels = sns.plt.gca().get_legend_handles_labels()
sns.plt.gca().legend(reversed(handles), reversed(labels), loc='lower left')

#Obergrenze 1.Auf 0 setzen, um Ränder zu entfernen
sns.plt.yticks(np.arange(0.0, 1.1, 0.1))  # 0.Wird in Schritten von 1 angezeigt. 1.1 bis 0.Enthält nicht 0
sns.plt.ylim(0.0, 1.0)  #Hier 1.Zeichne bis 0

Zeigen Sie abschließend show (), um es auf dem Bildschirm anzuzeigen, oder savefig, um es als Bild zu speichern.

sns.plt.show()  #Bildschirmanzeige
# sns.plt.savefig("image.png ")  #Bild speichern

Durch Kombinieren der obigen Schritte können Sie ein Diagramm zeichnen.

Tatsächliches Zeichnungsbeispiel

Topcoder API ist verfügbar, ich habe ein höfliches Beispiel, aber die bestplatzierten Mitglieder des Algorithmus Als ich darauf zugegriffen habe, wurden 400 zurückgegeben.

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

Wenn Sie in testType eine entsprechende Zeichenfolge eingeben, werden übrigens Kandidaten zurückgegeben. Die Hälfte gibt jedoch 400 zurück.

  "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."
  }

Ich kann es nicht ändern, also habe ich es aus den folgenden XML-Daten extrahiert. http://apps.topcoder.com/wiki/display/tc/Algorithm+Data+Feeds

Es gibt zwei Arten von Daten: aktive Benutzer (die innerhalb von 180 Tagen an bewerteten Wettbewerben teilgenommen haben) und alle Benutzer.

Graph

Berücksichtigung aktiver Benutzer

Zunächst bin ich besorgt, dass die Anzahl der aktiven Benutzer geringer ist als erwartet. Betrachtet man das Verhältnis, so sind fast 60% der Gesamtzahl Div.2 und 40% Div.1. Aufgrund der geringen Anzahl aktiver Benutzer und der geringen Anzahl von Unterschmutz (da die Registrierung schwierig ist) scheint die Bewertungsformel mit der Formel übereinzustimmen.

Gelb lag ungefähr unter den oberen 20% und rote Codierer unter den oberen 3,9%. Das Ziel ist 0,29%. Dies ist die Dicke, die in der Grafik visuell bestätigt werden kann. Wenn Ihre Augen müde sind, können Sie es vermissen. Es ist nur eine Person über den Wolken.

Einzeilige Zusammenfassung

Das Verhältnis von Topcoder ist wunderschön.

Codeforces Wie bereits erwähnt, ist die API verfügbar (http://codeforces.com/api/help). Wenn Sie user.ratedList anfordern, wird die Liste im JSON-Format zurückgegeben. Auch hier sind aktive Benutzer und alle Benutzer getrennt, aber die aktive Bedingung lautet "Haben Sie letzten Monat an einem Wettbewerb mit einer Rate teilgenommen?", Was strenger zu sein scheint als Topcoder.

Graph

Erwägung

Ich habe das Gefühl, dass es eine bestimmte Anzahl von Unterschmutz gibt, aber selbst wenn Sie sie ausschließen, gibt es viele aktive Benutzer. Obwohl die Bedingungen streng sind, spüre ich die Dynamik dieser Zahl.

Wie Sie sehen können, war der Div.1-Standard erheblich höher als der Topcoder und lag in den Top 10% (lila ~). Es kann sein, dass mehr Anfänger als Topcoder teilnehmen oder dass die Top-Ränge auffallen, weil sie zeitlich aus der ganzen Welt teilnehmen. Es gibt auch nur 2,4% über Lila, aber es gibt auch 5 Ränge. In Bezug auf die Motivation für Anfänger denke ich, dass es etwas weiter unten geteilt werden sollte.

Einzeilige Zusammenfassung

Spiel der Götter der oberen Ränge (müssen so viel rangieren ...?)

TOEIC Wir haben die neuesten 206 Daten von der folgenden Webseite erhalten. http://www.toeic.or.jp/toeic/about/data/data_avelist/data_dist01_09.html Es sind freundliche Daten, dass das Verhältnis bereits geschrieben ist. Ich habe es nicht zum Zeichnen verwendet.

Darüber hinaus wird jede der drei Arten des Hörens, Lesens und der Gesamtzahl grafisch dargestellt.

Graph

Erwägung

Es gibt viele Teilnehmer. Wenn jedes Mal so viele Teilnehmer am Wettbewerb teilnehmen ... Der Server fällt aus! Ich bete nur für die Entwicklung der wettbewerbsorientierten Berufswelt.

Das Diagramm ist in Schritten von etwa 50 Punkten, hat aber eine schöne Verteilung. Ich kenne die detaillierte Bewertungsmethode nicht, aber es ist natürlich, dass die Verteilung-> Punktzahl anstelle der Punktzahl-> Verteilung festgelegt wird.

Es scheint jedoch, dass das Lesen in der Mitte gleichmäßiger ist als das Hören, und die Oberseite ist weniger. Das Hören von 470 ~ beträgt 4,1%, das Lesen von 470 ~ 1,1%. Natürlich höre ich oft, dass Reading eine niedrigere Punktzahl hat. Zuhören ist sicher perfekt für diejenigen, die es hören können, aber liegt es daran, dass Lesen aus zeitlichen Gründen unwahrscheinlich ist?

Insgesamt sind 145 Punkte etwa 20% und alle 50 Punkte werden um 10% erhöht. 600 Punkte ist die 50% Position.

Ich sehe oft "990 Punkte" in Buchhandlungen. Der Punkt ist, dass ich die Anzahl der Personen mit einer perfekten Punktzahl wissen möchte, aber ich wusste es nicht, weil die Daten nicht veröffentlicht werden. Zumindest scheint es in den oberen 3,6% zu sein. Dies ist natürlich die einzige Geschichte.

Einzeilige Zusammenfassung

Der Unterschied von 50 Punkten war überraschend groß.

IIDX SP Rang

** Es ist ein Bonus **

Apropos Bewertungen, es gibt keinen anderen Ort als Beatmania IIDX (individueller Eindruck). Es gibt die folgenden früheren Studien, die für viele Menschen von Belang sein können. http://clickagain.sakura.ne.jp/top/tokusyuu/dani_dd/dani_tokusyuu2.html http://esports-runner.com/beatmaniaiidx/dani_transition2/

Deshalb habe ich ein Diagramm erstellt. Es wird mit zwei Typen erstellt, dem aktuellen Wert der neuesten Arbeit (Copula) und dem Endergebnis der vorherigen Arbeit (Pendual). Außerdem ist es nur SP-Rang.

Was die Anzahl der Personen in der neuesten Arbeit angeht, hat @ 2500bpm jeden Tag auf Twitter getwittert, also habe ich das verwendet. https://twitter.com/2500bpm Da das Ergebnis der vorherigen Arbeit auf der offiziellen Website zu finden ist, wird die Anzahl der Personen in jedem Rang gezählt und extrahiert. http://p.eagate.573.jp/game/2dx/22/p/ranking/dani.html

Graph

Erwägung

Wie die meisten Benutzer wissen, ist die Entvölkerung der unteren Ränge erstaunlich. Bis zu 4 Schritte werden komprimiert. Es scheint, dass es im 8. Dan viele Menschen gibt, wahrscheinlich weil es viele Menschen gibt, die den 9. Dan oder später in dieser Arbeit nicht erhalten haben. Es scheint, dass das Verhältnis mit fortschreitender Operation allmählich abnimmt. Im Vergleich zur vorherigen Arbeit können Sie sehen, dass Chuden die Zehn-Dan-Knödel erfolgreich gelockert hat.

Einzeilige Zusammenfassung

Balance…….

BMS SP Rang

Schauen wir uns übrigens auch BMS an. Die Anzahl der Personen ist in LR2IR veröffentlicht, daher habe ich diese verwendet. Aufgrund seiner Eigenschaften kann BMS betrügerisch oder unterverschmutzt sein, daher dient es nur als Referenz.

Ich habe zwei Typen erstellt, alle Ränge und nur verrückte Ränge.

Graph

Erwägung

Alle Ränge sind überraschend gleichmäßig verteilt. Es kann Benutzer verschiedener Ebenen geben, und das Gleichgewicht zwischen den Rängen kann gut sein. Etwa die Hälfte der Menschen ist verrückt geworden. Ich denke, dass viele Leute vom Wahnsinn ausgehen, aber es scheint, dass der normale Rang auch fest gespielt wird.

Der Wahnsinnsrang hat eine Verteilung, bei der die Anzahl der Personen mit zunehmendem Schwierigkeitsgrad abnimmt. Da die Anzahl von ★ 05 gering ist, kann ★ 06 leicht zu akzeptieren sein.

Das Verhältnis des höchsten Ranges (^^) beträgt 0,07%. Die Quote von ★★ beträgt 1,2%. Ich empfehle es nicht, aber wenn Sie interessiert sind, möchten Sie vielleicht das Video sehen.

Einzeilige Zusammenfassung

(^^)

Vergleich zwischen Bewertungen

Vergleichen wir die Branchenautorität verschiedener Wettbewerbe. Der Rang wird wie folgt eingestellt.

Da jeder unterschiedliche Standards hat, kann es nicht geholfen werden, diese zu vergleichen. Sie können ein Gefühl für andere Bewertungen bekommen. Es ist nur eine Anleitung und wir übernehmen keine Garantie für die Richtigkeit.

Top 80%: Anfänger

--topcoder: Grauer mittlerer Codierer

Top 40% oder weniger: Mittelstufe

--topcoder: Blauer unterer Codierer

Innerhalb der Top 20%: Fortgeschrittene

--topcoder: Blauer oberer bis gelber unterer Codierer

Top 10%: Super Advanced

--topcoder: Gelber mittlerer Codierer

Top 5%: Rangliste

--topcoder: Gelber top-roter Codierer --Codeforces: Candidate Master (lila) Mittel bis hoch

Innerhalb der obersten 1%: Gott

--topcoder: Rotes Top-Ziel

Zusammenfassung

Mit Python + Matplotlib + Pandas + Seaborn können Sie ganz einfach schöne Grafiken zeichnen, wie oben beschrieben. Natürlich können Numpy und Scipy verwendet werden, so dass eine detaillierte Analyse durchgeführt werden kann. Wenn Sie Bedenken haben, warum erstellen Sie kein schnelles Diagramm?

Recommended Posts

Stellen Sie das Verhältnis von Topcoder, Codeforces und TOEIC nach Bewertung grafisch dar (Pandas + Seaborn).
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Berechnung der technischen Indikatoren durch TA-Lib und Pandas
Analyse von Finanzdaten durch Pandas und deren Visualisierung (2)
Analyse von Finanzdaten durch Pandas und deren Visualisierung (1)
Beziehung der Fibonacci-Zahlenreihe und des Goldenen Schnitts
Ermitteln Sie den Durchmesser des Diagramms anhand der Suche nach Breitenpriorität (Python-Speicher).
Visualisierungsnotiz von Pandas, Seaborn
Verknüpfte Komponenten des Diagramms
Die Kraft der Pandas: Python
Praxis der Datenanalyse durch Python und Pandas (Tokyo COVID-19 Data Edition)
Seaborn-Grundlagen für Anfänger ① Aggregiertes Diagramm der Anzahl der Daten (Countplot)
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode