
23 Eki 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.
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
##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ı
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()
df_olympics veri setimizde 131 ülke 15 kolon var
df_olympics.shape
Madalya veri seti ile kıta setini right join yapıp ülkelerin yanına kıtaları getirelim
df=df_olympics.join(df_continent)
df.head() #
Yaz olimpiyatlarda en fazla altın madalya kazanan ülke
df['Yazaltın'].idxmax()
En fazla yaz oyunlarında altın madalya kaç adet?
df['Yazaltın'].max()
fonksiyon ile en fazla yaz oyunlarında altın madalya kazanan ülke
def answer_one():
return df['Yazaltın'].idxmax()
answer_one()
Yaz oyunlarında en fazla altın madalya kazanan 3 ülke
df.sort_values(by='Yazaltın', ascending=False).head(3)
Kış oyunlarında en fazla altın madalya kazanan 3 ülke
df.sort_values(by='Kisaltın', ascending=False).head(3)
Turkiye toplam altın madalya sıralamasında kaçıncı sırada?
Turkiye toplam madalya sıralamasında kaçıncı sırada?
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']]
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
df.sort_values(by='Toplammadalya_Rank', ascending=True).head(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ı
df.groupby(['Continent']).agg({'Topyazmadalya': 'sum','Toplamkismadalya':'sum','ToplamMadalya': 'sum','Kisaltın':'count'}).rename(columns={'Topyazmadalya':'Toplamyazmadalya','Kisaltın':'Ulke Sayısı'})
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
#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.
%matplotlib inline
df.boxplot('Topyazmadalya',by='Continent')
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.
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())
İ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.
model=ols("Yazaltın~Citations",data=df_genel2).fit()
aov_table=sm.stats.anova_lm(model)
print(aov_table)
print(model.summary())