Python-Panda Olimpiyat Veri Seti Manipülasyonu ve Analizi( Data science )

Bu makalede olimpiyat data seti(132 ülkenin yaz&kış olimpiyatlarda aldığı madalya(altın,bronz,gümüş) sayıları kolon açıklamaları aşağıdadır) üzerinde panda paketini kullanarak veri manipulasyonu yapacağız ve ardından makine öğrenmesi modeli kurarak analiz yapacağız.
Yaz Olimpiyatlarında alınan altın madalya sayısı ile son 55 yılın GDP ortalaması ve ülkede yazılan makale sayısı arasında istatistiksel bir ilşki var mı? Varsa hangisi daha önemli GDP mi yoksa bilim mi?
Türkiye yaz&kış olimpiyatlarında altın madalya sayısında kaçıncı sırada
En fazla yaz&kış olimpiyatlarında altın madalya kazanan ülke hangisi?
En fazla toplamda altın madalya kazanan ülke hangisi?

Önce panda başta olmak üzere gerekli paketleri yükleyelim.

In [374]:
import pandas as pd
import os
from pandas_datareader import data, wb
import matplotlib.pyplot as plt
import datetime
import numpy as np
##dataframi excel olarak export edebilmek için
from pandas import ExcelWriter
import xlsxwriter
import warnings
warnings.filterwarnings('ignore')
#warnings.filterwarnings(action='once')

Olimpiyat veri setimizi ve kıta veri setimizi okuyalım

In [418]:
##olimpiyat veri seti
df_olympics = pd.read_csv("olympics.csv",sep = ';',encoding='ISO-8859-1',index_col=0)
names_ids = df_olympics.index.str.split('\s\(') # parantezi ve içindekileri silelim
df_olympics .index = names_ids.str[0] # yeni index atıyalım 
#ülke ve hangi kıtada olduğu
df_continent = pd.read_csv("continent.csv",sep = ';',encoding='ISO-8859-1',index_col=1) 

df_olympics veri setimizin kolonlarının açıklaması asağıda ki şekildedir

Summer:Ülke toplam kaç yaz olimpiyatına katıldı
Yazaltın: yaz olimpiyatlarında kaç altın kazandı
Yazgumus: yaz olimpiyatlarında kaç gümüs kazandı
Yazbronz: yaz olimpiyatlarında kaç bronz kazandı
Topyazmadalya: Yaz olimpiyatlarında toplam madalya sayısı
Winter:Ülke toplam kaç kış olimpiyatına katıldı
Kısaltın: kış olimpiyatlarında toplam kaç altın kazandı
Kısgumus: kış olimpiyatlarında toplam kaç gümüs kazandı
Kısbronz: kış olimpiyatlarında toplam kaç bronz kazandı
Toplamkismadalya: Yaz olimpiyatlarında toplam madalya sayısı
Toplamoyun:Yaz, kış toplam katıldığı olimpiyat sayısı
TolamAltın: Olimpiyatlarda toplam kaç altın kazandı(Yaz&Kış)
ToplamGumus: Olimpiyatlarda toplam kaç gümüş kazandı(Yaz&Kış)
ToplamBronz: Olimpiyatlarda toplam kaç bronz kazandı(Yaz&Kış)
ToplamMadalya: Olimpiyatlarda toplam kaç madalya kazandı(Yaz&Kış)

Okuduğumuz df_olympics dataframe’in önce kolon adlarını değiştirelim ilk 5 satırı

In [419]:
df_olympics.rename(columns={'Summer': 'Yazoyunları','1':'Yazaltın','2':'Yazgumus','3':'Yazbronz',
                            'Total':'Topyazmadalya',
                            'Winter': 'Kisoyunları','1.1':'Kisaltın','2.1':'Kisgumus','3.1':'Kisbronz',
                            'Total.1':'Toplamkismadalya','Games':'Toplamoyun',
                            '1.2':'TolamAltın','2.2':'ToplamGumus','3.2':'ToplamBronz'
                            ,'CombinedTotal':'ToplamMadalya'}, inplace=True)
df_olympics.head()
 



















Out[419]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya
Afghanistan 14 0 0 2 2 0 0 0 0 0 14 0 0 2 2
Algeria 13 5 4 8 17 3 0 0 0 0 16 5 4 8 17
Argentina 24 21 25 28 74 19 0 0 0 0 43 21 25 28 74
Armenia 6 2 6 6 14 7 0 0 0 0 13 2 6 6 14
Australia 26 147 163 187 497 19 5 5 5 15 45 152 168 192 512

df_olympics veri setimizde 131 ülke 15 kolon var

In [420]:
df_olympics.shape  
Out[420]:
(131, 15)

Madalya veri seti ile kıta setini right join yapıp ülkelerin yanına kıtaları getirelim

In [421]:
df=df_olympics.join(df_continent)
df.head()  #
Out[421]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya Continent
Afghanistan 14 0 0 2 2 0 0 0 0 0 14 0 0 2 2 Asia
Algeria 13 5 4 8 17 3 0 0 0 0 16 5 4 8 17 Africa
Argentina 24 21 25 28 74 19 0 0 0 0 43 21 25 28 74 South America
Armenia 6 2 6 6 14 7 0 0 0 0 13 2 6 6 14 Europe
Australia 26 147 163 187 497 19 5 5 5 15 45 152 168 192 512 Oceania

Yaz olimpiyatlarda en fazla altın madalya kazanan ülke

In [422]:
df['Yazaltın'].idxmax()
Out[422]:
'United States'

En fazla yaz oyunlarında altın madalya kaç adet?

In [423]:
df['Yazaltın'].max()
Out[423]:
1022

fonksiyon ile en fazla yaz oyunlarında altın madalya kazanan ülke

In [424]:
def answer_one():
    return df['Yazaltın'].idxmax()
answer_one()
Out[424]:
'United States'

Yaz oyunlarında en fazla altın madalya kazanan 3 ülke

In [425]:
df.sort_values(by='Yazaltın', ascending=False).head(3)
Out[425]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya Continent
United States 27 1022 795 705 2522 23 105 110 90 305 50 1127 905 795 2827 North America
Russia 9 395 319 296 1010 9 78 57 59 194 18 473 376 355 1204 Asia
Great Britain 28 263 295 293 851 23 11 4 16 31 51 274 299 309 882 Europe

Kış oyunlarında en fazla altın madalya kazanan 3 ülke

In [426]:
 df.sort_values(by='Kisaltın', ascending=False).head(3)    
Out[426]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya Continent
Norway 25 56 49 47 152 23 132 125 111 368 48 188 174 158 520 Europe
United States 27 1022 795 705 2522 23 105 110 90 305 50 1127 905 795 2827 North America
Germany 16 191 194 230 615 12 92 88 60 240 28 283 282 290 855 Europe


Turkiye toplam altın madalya sıralamasında kaçıncı sırada?
Turkiye toplam madalya sıralamasında kaçıncı sırada?

In [436]:
df['yazaltın_Rank'] = df['Yazaltın'].rank(ascending=False).astype(int)
df['Toplammadalya_Rank'] = df['Topyazmadalya'].rank(ascending=False).astype(int)
df.loc[['Turkey']]
Out[436]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya Continent yazaltın_Rank Toplammadalya_Rank
Turkey 22 39 24 28 91 17 0 0 0 0 39 39 24 28 91 Asia 27 31


Turkiye toplam yaz oyunları altın madalya sıralamasında 131 ülkeden 27. sırada
Turkiye yaz oyunları toplam madalya sıralamasında 131 ülkeden 31. sırada

 

Toplam yaz&kış madalyada ilk üç ülke hangisi

In [437]:
df.sort_values(by='Toplammadalya_Rank', ascending=True).head(3)
Out[437]:
Yazoyunları Yazaltın Yazgumus Yazbronz Topyazmadalya Kisoyunları Kisaltın Kisgumus Kisbronz Toplamkismadalya Toplamoyun TolamAltın ToplamGumus ToplamBronz ToplamMadalya Continent yazaltın_Rank Toplammadalya_Rank
United States 27 1022 795 705 2522 23 105 110 90 305 50 1127 905 795 2827 North America 1 1
Russia 9 395 319 296 1010 9 78 57 59 194 18 473 376 355 1204 Asia 2 2
Great Britain 28 263 295 293 851 23 11 4 16 31 51 274 299 309 882 Europe 3 3

Hangi kıtada yaz oyunlarında toplam kaç madalya ve aynı şekilde kış oyunlarında toplam kaç madalya kazanılmış ve olimpiyatlara katılan ülke sayıları

In [450]:
df.groupby(['Continent']).agg({'Topyazmadalya': 'sum','Toplamkismadalya':'sum','ToplamMadalya': 'sum','Kisaltın':'count'}).rename(columns={'Topyazmadalya':'Toplamyazmadalya','Kisaltın':'Ulke Sayısı'})
Out[450]:
Toplamyazmadalya Toplamkismadalya ToplamMadalya Ulke Sayısı
Continent
Africa 401 0 401 27
Asia 2797 395 3192 33
Europe 6857 1888 8745 40
North America 3257 504 3761 15
Oceania 617 18 635 5
South America 278 0 278 11

Lineer Model

Bilimle spor, ekonomi ile spor arasında ki ilişkiyi incleleyebilmek için ,ülkelerin GDP ve indexli makale sayısını excelden okuyup dataframe yapıp madalya veri setimizle joinleyelim

In [459]:
#gdp datasını okuyalım
GDP = pd.read_csv('world_bank.csv',sep = ';',encoding='ISO-8859-1',index_col=0)
GDP.rename(columns={'Country Name': 'Country'}, inplace=True)

#Citation veri setini okuyalım 
ScimEn = pd.read_excel('scimagojr-3.xlsx',index_col=1)

##üç veri setini joinliyelim
df_genel1 = pd.merge(df, GDP, how='left',left_index=True, right_index=True)
df_genel1['GDPortalama']=df_genel1.iloc[:,23:78].mean(axis=1) 
df_genel2=pd.merge(df_genel1,ScimEn, how='left',left_index=True, right_index=True)

Kıtalardaki toplam altın madalya ve Yaz olimpiyatları arasında boxplot çizelim. Avrupa’nın daha üstün olduğu görülmektedir.

In [460]:
%matplotlib inline
df.boxplot('Topyazmadalya',by='Continent')
Out[460]:
<matplotlib.axes._subplots.AxesSubplot at 0x1284d450>

iki tane lineer model kuracağız. Hemen hemen her ülke kış olimpiyatlarından ziyade yaz olimpiyatlarına katıldığı için yaz olimpiyatlarında alınan altın madalya sayısı bağımlı değişkenimiz olsun. 1960’dan beri 55 yıllık gdp ortalamasını ve makale sayısı bağımsız değişkenlerimiz olmak üzere model kuralım ve çıktılarını aşağıda yorumlayalım.

GDPortlama ile kurduğumuz ilk modelimizin çıktısı aşağıdadır. Sonuçlara baktığımızda GDPortalama ile yaz olimpiyatlarında alınan altın madalya arasında istatistiksel olarak anlamlı bir ilişki var. R2 değeride %82. Atın madalyada ki varyasyonun %82’si GDP ortalaması ile açıklanabilir.

In [461]:
from sklearn import linear_model as lm
import statsmodels.api as sm
from statsmodels.formula.api import  ols

model=ols("Yazaltın~GDPortalama",data=df_genel2).fit()
aov_table=sm.stats.anova_lm(model)
print(aov_table)
print(model.summary())  
                df        sum_sq       mean_sq           F        PR(>F)
GDPortalama    1.0  1.193914e+06  1.193914e+06  584.928473  1.417875e-48
Residual     123.0  2.510588e+05  2.041128e+03         NaN           NaN
                            OLS Regression Results                            
==============================================================================
Dep. Variable:               Yazaltın   R-squared:                       0.826
Model:                            OLS   Adj. R-squared:                  0.825
Method:                 Least Squares   F-statistic:                     584.9
Date:                Mon, 22 Oct 2018   Prob (F-statistic):           1.42e-48
Time:                        03:46:40   Log-Likelihood:                -652.69
No. Observations:                 125   AIC:                             1309.
Df Residuals:                     123   BIC:                             1315.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
===============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------
Intercept       5.5864      4.242      1.317      0.190      -2.809      13.982
GDPortalama  1.015e-10    4.2e-12     24.185      0.000    9.32e-11     1.1e-10
==============================================================================
Omnibus:                       55.468   Durbin-Watson:                   1.930
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             1370.585
Skew:                           0.777   Prob(JB):                    2.41e-298
Kurtosis:                      19.147   Cond. No.                     1.06e+12
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.06e+12. This might indicate that there are
strong multicollinearity or other numerical problems.

İkinci modelimiz aşağıda Citations(Makale sayısı) . Sonuçlara baktığımızda Citations ile yaz olimpiyatları arasında istatistiksel olarak anlamlı bir ilişki var. R2 değeride %67. Buda altın madalyada ki varyasyonun %67’si bilimde gelişmişlik ile açıklanabilir.

In [458]:
model=ols("Yazaltın~Citations",data=df_genel2).fit()
aov_table=sm.stats.anova_lm(model)
print(aov_table)
print(model.summary())  
              df         sum_sq        mean_sq           F        PR(>F)
Citations    1.0  981289.810758  981289.810758  262.259254  2.200217e-32
Residual   124.0  463968.133686    3741.678497         NaN           NaN
                            OLS Regression Results                            
==============================================================================
Dep. Variable:               Yazaltın   R-squared:                       0.679
Model:                            OLS   Adj. R-squared:                  0.676
Method:                 Least Squares   F-statistic:                     262.3
Date:                Mon, 22 Oct 2018   Prob (F-statistic):           2.20e-32
Time:                        03:46:16   Log-Likelihood:                -696.10
No. Observations:                 126   AIC:                             1396.
Df Residuals:                     124   BIC:                             1402.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      8.4921      5.719      1.485      0.140      -2.828      19.812
Citations      0.0009   5.72e-05     16.194      0.000       0.001       0.001
==============================================================================
Omnibus:                       66.311   Durbin-Watson:                   1.862
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             1812.502
Skew:                           1.077   Prob(JB):                         0.00
Kurtosis:                      21.455   Cond. No.                     1.05e+05
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.05e+05. This might indicate that there are
strong multicollinearity or other numerical problems.


yazar: Melik Masarifoğlu
http://analitikmadeni.com/