Zusammenhang zwischen Elite-Schachspielern und Alkoholkonsum

Im Folgenden werde ich probieren die These: " Die besten Schachspieler repräsentieren Nationen, in denen durchschnittlich sehr viel Alkohol konsumiert wird." zu überprüfen.

Dazu habe ich folgende Daten zusammengeführt.

  • CSV Quelle: github/plotly
  • RDF Quelle: DBpedia

Zum Schluss werde ich eine Auswertung präsentieren!

In [150]:
import requests

r = requests.get('https://github.com/plotly/datasets/raw/master/2010_alcohol_consumption_by_country.csv')

f = open('alcohol.csv', 'wb')
f.write(r.content)
f.close()

Ich habe ein CSV File zum durschnittlichen Alkoholkonsum im Jahr 2010 in Litern/pro Kopf in den jeweiligen Ländern ausgewählt. Zudem habe ich mich für die dynamische Umsetzung entschieden.

In [151]:
%load_ext sql
The sql extension is already loaded. To reload it, use:
  %reload_ext sql

Durch das Laden der SQL-Extensions wird mir das Verwenden von SQL Befehlen in den darauffolgenden Zeilen ermöglicht.

In [152]:
%sql sqlite:///shop.db
Out[152]:
'Connected: @shop.db'

Verbindung zu einer SQLite Datanbank; hier die Shop.db

In [153]:
%sql drop table if exists alcohol;
 * sqlite:///shop.db
Done.
Out[153]:
[]

Kontrolle ob eine Datenbank mit diesem Namen schon existiert.In den nächsten Schritten wird die CSV Datenbank zu einer Tabelle umgewandelt.

In [154]:
import sqlite3
import pandas  
conn = sqlite3.connect('shop.db') 
pandas.read_csv('alcohol.csv').to_sql('alcohol', conn, index = False) 
Während das Pandas verwendet wird um die CSV Datei einzulesen,wird die SQlite dazu verwendet um eine Verbindung(connection) herzustellen.
In [165]:
%%sql

select * from alcohol;
 * sqlite:///shop.db
Done.
Out[165]:
location alcohol
Belarus 17.5
Moldova 16.8
Lithuania 15.4
Russia 15.1
Romania 14.4
Ukraine 13.9
Andorra 13.8
Hungary 13.3
Czech Republic 13.0
Slovakia 13.0
Portugal 12.9
Serbia 12.6
Grenada 12.5
Poland 12.5
Latvia 12.3
Finland 12.3
South Korea 12.3
France 12.2
Australia 12.2
Croatia 12.2
Ireland 11.9
Luxembourg 11.9
Germany 11.8
Slovenia 11.6
United Kingdom 11.6
Denmark 11.4
Bulgaria 11.4
Spain 11.2
Belgium 11.0
South Africa 11.0
New Zealand 10.9
Gabon 10.9
Namibia 10.8
Switzerland 10.7
Saint Lucia 10.4
Austria 10.3
Estonia 10.3
Greece 10.3
Kazakhstan 10.3
Canada 10.2
Nigeria 10.1
Netherlands 9.9
Uganda 9.8
Rwanda 9.8
Chile 9.6
Argentina 9.3
Burundi 9.3
United States 9.2
Cyprus 9.2
Sweden 9.2
Venezuela 8.9
Paraguay 8.8
Brazil 8.7
Sierra Leone 8.7
Montenegro 8.7
Belize 8.5
Cameroon 8.4
Botswana 8.4
Saint Kitts and Nevis 8.2
Guyana 8.1
Peru 8.1
Panama 8.0
Niue 8.0
Palau 7.9
Norway 7.7
Tanzania 7.7
Georgia 7.7
Uruguay 7.6
Angola 7.5
Laos 7.3
Japan 7.2
Mexico 7.2
Ecuador 7.2
Dominica 7.1
Iceland 7.1
Thailand 7.1
Bosnia and Herzegovina 7.1
Sao Tome and Principe 7.1
Malta 7.0
Albania 7.0
Bahamas 6.9
Dominican Republic 6.9
Mongolia 6.9
Cape Verde 6.9
Barbados 6.8
Burkina Faso 6.8
Italy 6.7
Trinidad and Tobago 6.7
China 6.7
Macedonia 6.7
Saint Vincent and the Grenadines 6.6
Equatorial Guinea 6.6
Suriname 6.6
Vietnam 6.6
Lesotho 6.5
Haiti 6.4
Cook Islands 6.4
Colombia 6.2
Ivory Coast 6.0
Bolivia 5.9
Swaziland 5.7
Zimbabwe 5.7
Seychelles 5.6
Cambodia 5.5
Puerto Rico 5.4
Netherlands Antilles 5.4
Philippines 5.4
Costa Rica 5.4
Armenia 5.3
Cuba 5.2
Nicaragua 5.0
Jamaica 4.9
Ghana 4.8
Liberia 4.7
Uzbekistan 4.6
Chad 4.4
United Arab Emirates 4.3
Kyrgyzstan 4.3
India 4.3
Turkmenistan 4.3
Kenya 4.3
Ethiopia 4.2
Honduras 4.0
Guinea-Bissau 4.0
Zambia 4.0
Republic of the Congo 3.9
Guatemala 3.8
Central African Republic 3.8
North Korea 3.7
Sri Lanka 3.7
Mauritius 3.6
Samoa 3.6
Democratic Republic of the Congo 3.6
Nauru 3.5
Gambia 3.4
Federated States of Micronesia 3.3
El Salvador 3.2
Fiji 3.0
Papua New Guinea 3.0
Kiribati 3.0
Tajikistan 2.8
Israel 2.8
Sudan 2.7
Malawi 2.5
Lebanon 2.4
Azerbaijan 2.3
Mozambique 2.3
Togo 2.3
Nepal 2.2
Brunei 2.1
Benin 2.1
Singapore 2.0
Turkey 2.0
Madagascar 1.8
Solomon Islands 1.7
Tonga 1.6
Tunisia 1.5
Tuvalu 1.5
Qatar 1.5
Vanuatu 1.4
Djibouti 1.3
Malaysia 1.3
Syria 1.2
Maldives 1.2
Mali 1.1
Eritrea 1.1
Algeria 1.0
Iran 1.0
Oman 0.9
Brunei 0.9
Morocco 0.9
Jordan 0.7
Bhutan 0.7
Guinea 0.7
Burma 0.7
Afghanistan 0.7
Senegal 0.6
Indonesia 0.6
Timor-Leste 0.6
Iraq 0.5
Somalia 0.5
Egypt 0.4
Niger 0.3
Yemen 0.3
Comoros 0.2
Saudi Arabia 0.2
Bangladesh 0.2
Kuwait 0.1
Libya 0.1
Mauritania 0.1
Pakistan 0.1

Wiedergabe in einer Tabelle. Die CSV Datei wurde erfolgreich importiert! Es handelt sich hier um den durchschnittlichen Alkoholkonsum der jeweiligen Länder, gemessen in Litern/pro Kopf und pro Jahr in 2010.

Als nächstes widmen wir uns den RDF Daten, die ich aus der DBpedia erhalten habe.Ich verwende dabei den SparQLWrapper.Der SparQL Endpoint besitzt eine URL.

In [166]:
from SPARQLWrapper import SPARQLWrapper, JSON, CSV

sparql = SPARQLWrapper("http://dbpedia.org/sparql")
In [167]:
sparql.setQuery("""
SELECT distinct ?name ?country ?value ?title ?birthday
WHERE {
      ?x a dbo:ChessPlayer .
      ?x  dbo:country ?federation.
      ?x dbo:birthDate ?birthday.
      ?federation rdfs:label ?country .
      ?x dbo:title ?title.
      ?x rdfs:label ?name.
      ?x <http://dbpedia.org/property/peakrating> ?value.

FILTER (?value > 2650).
FILTER(lang(?name) = "en")
FILTER(lang(?country) = "en")



} 
ORDER BY ?value
Limit 20
""") 

sparql.setReturnFormat(JSON)

players = sparql.query().convert()

for res in players["results"]["bindings"]:
    print(res["name"]["value"],' ',
          res["value"]["value"],'',
          res["country"]["value"],'',
          res["title"]["value"],'',
         res["birthday"]["value"])
Viorel Iordăchescu   2651  Moldova  Grandmaster  1977-04-20
Viorel Iordăchescu   2651  Moldova  Grandmaster  1977-4-20
Erwin l'Ami   2651  Netherlands  Grandmaster  1985-04-05
Erwin l'Ami   2651  Netherlands  Grandmaster  1985-4-5
Luka Lenič   2651  Slovenia  Grandmaster(2007)  1988-05-13
Luka Lenič   2651  Slovenia  Grandmaster(2007)  1988-5-13
Axel Bachmann   2652  Paraguay  Grandmaster  1989-11-04
Axel Bachmann   2652  Paraguay  Grandmaster  1989-11-4
Jan Gustafsson   2652  Germany  Grandmaster(2003)  1979-06-25
Jan Gustafsson   2652  Germany  Grandmaster(2003)  1979-6-25
Anton Filippov   2652  Uzbekistan  Grandmaster  1986-12-06
Anton Filippov   2652  Uzbekistan  Grandmaster  1986-6-12
Murtas Kazhgaleyev   2653  Kazakhstan  Grandmaster(1998)  1973-11-17
Alexandr Fier   2653  Brazil  Grandmaster  1988-03-11
Alexandr Fier   2653  Brazil  Grandmaster  1988-3-11
Bartłomiej Macieja   2653  Poland  Grandmaster  1977-10-04
Bartłomiej Macieja   2653  Poland  Grandmaster  1977-10-4
Vladimir Baklan   2655  Ukraine  Grandmaster  1978-02-25
Vladimir Baklan   2655  Ukraine  Grandmaster  1978-2-25
Kamil Mitoń   2655  Poland  Grandmaster  1984-04-12

Auswahl meiner Spalten

Der Spaltenname Name besteht aus Vor-und Nachname. Bei Value handelt es sich um das höchste Rating (peakrating), dass jener Spieler besitzt,bzw. besessen hat. In diesem Zusammenhang war es ebenfalls wichtig das Geburtsdatum Birthday zu verwenden.Dies liegt daran, dass das Fide Ratingsystem erst seit 1970 existiert. Spieler, die in dieser Query sehr früh geboren sind, könnten deshalb ein geschätztes Rating besitzen. Durch den verwendeten Filter von einem Peakrating von über 2650 ist die Wahrscheinlichkeit sehr hoch, dass es sich bei sehr vielen Spielern in der Kategorie Titel um einem Großmeister handelt.Die Vorraussetzungen für diesen Titel sind ein Rating von über 2500 und 3 Großmeisternormen. Um diese Query später mit meinem CSV-File zu verbinden ist natürlich das Land ebenfalls sehr wichtig. Bei dem Land handelt es sich jedoch nicht um das Land dessen, Staatsangehörigkeit der Spieler besitzt, sondern um die Federation für die er an internationalen Wettkämpfen teilnimmt.

Es wurde ein Limit auf 20 Spieler festgesetzt. Damit die Tabelle übersichtlicher aussieht, wurden im Print-Befehlt der Python-for-Schleife Abstände eingefügt.

Feststellungen aus der Query

1) In der DBpedia steht leider nicht nach jedem Titel bspw. Grandmaster das Jahr in welchem der Titel diesem Spieler anerkannt wurde, nachdem er die notwendigen Bedingungen dafür erfüllt hatte.

2) Es wird das Geburtsdatum in zwei unterschiedlichen Schreibweisen präsentiert. Ich habe mich mehrere Stunden lang damit befasst, dies zu korrigieren jedoch ohne Erfolg. **Somit kann man festhalten, dass die noch zu erledigen ist!

3) Im Schach gibt es sowohl Titel für Damen als auch Titel für Herren. Aufgrund der Tatsache, dass die Anforderungen für Titel für Herren höher sind, ist es möglich für Damen auch Herrentitel zu erreichen. Dies ist umgekehrt nicht möglich! Ebenso handelt es sich bei den Ländern um Federationen, die die/der SchachspielerIN repräsentiert. So kann es auch im Verlauf eines Schachspielers durchaus sein, dass er mehrere Federationen repräsentiert hat. Bei DBpedia werden alle Federationen aufgezählt, anstatt das die aktuellste dargestellt wird. So kommst es dazu, dass es möglich ist,dass durch diese Query ein Name mehrmals vorkommt.

Extrembeispiel: Alissa Michailowna Galljamowa

Die ehmalige Doppel Vize-Weltmeisterin verfügt sowohl über den Damen-Großmeistertitel abgekürzt WGM und über den männlichen Internationalen Meistertitel IM.Zudem hat sie 3 Federationen repräsentiert: Russland,Ukraine und die Sowjetunion . Dadurch kommt ihr Name häufiger in der Query zum Vorschein.

In [168]:
f = open("schach.csv", "w")
f.write("name;value;country;title;birthday\n")
for res in players["results"]["bindings"]:
    f.write(res["name"]["value"] + ";" + res["value"]["value"] + ";" + res["country"]["value"] + ";" + res["title"]["value"] + ";" + res["birthday"]["value"] + "\n")
f.close()

Das CSV-File schach-csv wird zum Schreiben geöffnet.Anschließend wird name,value,country,title,birthday eingefügt.Aus dem RDF-File wird ein CSV-File. Anschließend kann man damit ähnlich wie bei dem Alkohol-CSV-File arbeiten.

In [169]:
%%sql
drop table if exists schach;
 * sqlite:///shop.db
Done.
Out[169]:
[]

Es wird wieder überprüft ob die schach Datei schon existiert.

In [170]:
pandas.read_csv('schach.csv', delimiter=";").to_sql('schach', conn, index = False)

Anschließend wird die CSV-Datei über das Pandas wieder eingelesen.Durch Select wird sie mit einem Limit von 20 Resultaten in einer Tabelle wiedergegeben.

In [171]:
%%sql

select * from schach limit 20;
 * sqlite:///shop.db
Done.
Out[171]:
name value country title birthday
Viorel Iordăchescu 2651 Moldova Grandmaster 1977-04-20
Viorel Iordăchescu 2651 Moldova Grandmaster 1977-4-20
Erwin l'Ami 2651 Netherlands Grandmaster 1985-04-05
Erwin l'Ami 2651 Netherlands Grandmaster 1985-4-5
Luka Lenič 2651 Slovenia Grandmaster(2007) 1988-05-13
Luka Lenič 2651 Slovenia Grandmaster(2007) 1988-5-13
Axel Bachmann 2652 Paraguay Grandmaster 1989-11-04
Axel Bachmann 2652 Paraguay Grandmaster 1989-11-4
Jan Gustafsson 2652 Germany Grandmaster(2003) 1979-06-25
Jan Gustafsson 2652 Germany Grandmaster(2003) 1979-6-25
Anton Filippov 2652 Uzbekistan Grandmaster 1986-12-06
Anton Filippov 2652 Uzbekistan Grandmaster 1986-6-12
Murtas Kazhgaleyev 2653 Kazakhstan Grandmaster(1998) 1973-11-17
Alexandr Fier 2653 Brazil Grandmaster 1988-03-11
Alexandr Fier 2653 Brazil Grandmaster 1988-3-11
Bartłomiej Macieja 2653 Poland Grandmaster 1977-10-04
Bartłomiej Macieja 2653 Poland Grandmaster 1977-10-4
Vladimir Baklan 2655 Ukraine Grandmaster 1978-02-25
Vladimir Baklan 2655 Ukraine Grandmaster 1978-2-25
Kamil Mitoń 2655 Poland Grandmaster 1984-04-12

Zum Schluss werden die beiden Files duch den join Befehl zusammengeführt. Alles funktioniert! Jedoch wurde nach Alkohol in Litern sortiert. Um die Stärke der Spieler zu kennzeichnen, war es mir jedoch wichtig diese nach dem Rating zu ordnen.

In [172]:
%%sql

Select name,value,title,birthday,location,alcohol
from alcohol join schach on alcohol.location = schach.country
order by value;
 * sqlite:///shop.db
Done.
Out[172]:
name value title birthday location alcohol
Viorel Iordăchescu 2651 Grandmaster 1977-04-20 Moldova 16.8
Viorel Iordăchescu 2651 Grandmaster 1977-4-20 Moldova 16.8
Luka Lenič 2651 Grandmaster(2007) 1988-05-13 Slovenia 11.6
Luka Lenič 2651 Grandmaster(2007) 1988-5-13 Slovenia 11.6
Erwin l'Ami 2651 Grandmaster 1985-04-05 Netherlands 9.9
Erwin l'Ami 2651 Grandmaster 1985-4-5 Netherlands 9.9
Jan Gustafsson 2652 Grandmaster(2003) 1979-06-25 Germany 11.8
Jan Gustafsson 2652 Grandmaster(2003) 1979-6-25 Germany 11.8
Axel Bachmann 2652 Grandmaster 1989-11-04 Paraguay 8.8
Axel Bachmann 2652 Grandmaster 1989-11-4 Paraguay 8.8
Anton Filippov 2652 Grandmaster 1986-12-06 Uzbekistan 4.6
Anton Filippov 2652 Grandmaster 1986-6-12 Uzbekistan 4.6
Bartłomiej Macieja 2653 Grandmaster 1977-10-04 Poland 12.5
Bartłomiej Macieja 2653 Grandmaster 1977-10-4 Poland 12.5
Murtas Kazhgaleyev 2653 Grandmaster(1998) 1973-11-17 Kazakhstan 10.3
Alexandr Fier 2653 Grandmaster 1988-03-11 Brazil 8.7
Alexandr Fier 2653 Grandmaster 1988-3-11 Brazil 8.7
Vladimir Baklan 2655 Grandmaster 1978-02-25 Ukraine 13.9
Vladimir Baklan 2655 Grandmaster 1978-2-25 Ukraine 13.9
Kamil Mitoń 2655 Grandmaster 1984-04-12 Poland 12.5

Auswertung

Anhand der ausgewählten Stichprobe lässt sich die These bestätigen, da ersichtlich wird, dass die meisten Schachspieler ein Land repräsentieren, welches entweder einen Wert, der nah an 10l oder höher als 10l pro Jahr besitzt.