Türkiye Futbol Ligi Şampiyonu Nasıl Tahmin Edilir?

Türkiye futbol lig şampiyonu nasıl tahmin edilir ?

 

Çok basit bir yaklaşımla her futbolcuya, özelliklerinden yola çıkarak bir skor veririz ve sonrasında takımların toplam skorlarını oyuncu sayısına böleriz. Bu hesaplama sonrasında takımları skor ortamalarına göre büyükten küçüğe doğru sıralarsak, yıl sonunda lig puan cetvelindeki sıralama için bir tahmin elde etmiş oluruz.

Tabi unutmayalım ki bu sadece bir başlangıç tahmini.

Futbolcuların özelliklerinden yola çıkarak bir tahmin yapacağız ama bu özellikler neler olmalı?

Diyelim ki ben, istatistik, makine öğrenmesi ve programa konusunda uzmanım. Bu konularda yapamayacağım hiçbir şey yok. Yani teknik anlamda bu işi yapmaya yeterliyim.

Fakat bu aşamada aklımdaki en büyük soru şu olmalı: “futbol konusunda skor hesaplamak için gerekli öznitelikleri çıkartmak konusunda yeterli miyim?”. Yani bu veriden ürün elde etme sürecinde gerekli olan iş bilgisi bende var mı?

Eğer yok ise, öncelikle halka açık veri kaynaklarını taramalıyım ki bir ön fikrim olsun. Sonrasında edindiğim ön fikirler ile birlikte kesinlikle bu işten anlayan bir uzmanla iş birliğine gitmeliyim.

Artık analiz çalışmasına 2 kişi devam ediyoruz 😊 Yani teknik bilgi ile iş bilgisini birleştirmiş olduk. Artık daha güçlü bir analiz yapabiliriz.

Takım olarak yaptığımız araştırmalar sonrasında diyelim ki aşağıdaki özelliklerden yola çıkarak hesaplamaya karar vermiş olalım. (bu özellikleri “Fifa 2018 player data” veri setinden aldım. İnternetten kolayca bulabilirsiniz.)

['crossing', 'finishing', 'heading_accuracy', 'short_passing', 'volleys', 'dribbling', 'curve', 'free_kick_accuracy',  'long_passing', 'ball_control', 'acceleration', 'sprint_speed',  'agility', 'reactions', 'balance', 'shot_power', 'jumping', 'stamina', 'strength', 'long_shots', 'aggression', 'interceptions', 'positioning',  'vision', 'penalties', 'composure', 'marking', 'standing_tackle',  'sliding_tackle', 'gk_diving', 'gk_handling', 'gk_kicking',  'gk_positioning', 'gk_reflexes', 'player_playing_position', 'potential', 'pac', 'sho',  'pas', 'dri', 'def', 'phy', 'age', 'height_cm', 'weight_kg']

Oyuncuların bu özelliklerinden yola çıkarak bir skor tahmini yapmaya karar verdik ama bu özellikleri, oyuncular arasındaki farkları yansıtabilecekleri değer aralıklarında ölçmem gerekiyor. Yani kullanacağım değişkenleri doğru seçmiş olmam yeterli değil.

Messi’nin top kontrolü ile Adapazarıspor’da oynayan X kişisinin top kontrolü arasındaki farkı yansıtabilmem için 'ball_control' değişkeninin değer aralığının yeterli olması gerekmektedir.

Örneğin bu değişken [0,10] değer aralığından değerleri içeriyor ise aradaki farkı yansıta bilir mi? Acaba [0,100] ya da [0,1000] değer aralıkları içinde mi yapmam gerekiyor ölçümlerimi.

 

Ve tabi aklıma şu da gelmeli; 100 yılda bir tane Messi gelmiş dünyaya. Şimdi ben diğer futbolcuları değerlendirirken bu adamı hesaba katacak olursam diğerlerine haksızlık etmiş olmaz mıyım? Messi evet gerçek hayatta var ama çok çok nadir görülen bir yeteneğe sahip. Dolayısı ile normal değil. Ve yine dolayısı ile benim diğer futbolcular için yapacağım değerlendirmeyi kötü yönde etkileyecektir. Öyle ise Messi’yi değerlendirme dışında tutmalıyım.

Ölçüm işine geri dönecek olursam, hazır bir kaynak yok ise elimin altında, bu işte uzman birini bulmalıyım. Bu kişi bu ölçümleri yapmalı ve toplamalı. Ve tabi bir kişi de elde edilen verileri uygun şekilde düzenlemeli ve kayıt altına almalı. Ve istediğimizde kullanıma uygun bir şekilde bize sunmalı.

Sanırım artık 4 kişilik bir ekibiz 😊 ve artık ölçümleri yapıp, sonuçları kayıt altına alabiliyoruz.

Veri Analisti
İş Analisti
Raporlama Analisti
Veri Mühendisti

 

Verileri topladık artık analize hazırız 😉

Futbol takımımız 11 kişi den oluşuyor ve 4-4-2 taktiği ile oynuyor olsun.

İş Analisti ile kafa kafaya verip hangi pozisyon için hangi özellikleri değerlendirmeye alacağımıza karar verdik. Hatırlarsanız daha evvel kullanabileceğimiz özellikleri çıkartmıştık ama iş analisti ile biraz çalışınca fark ettik ki, her pozisyon için her özellik önemli olmuyor. Yani elimde çekiç var diye her şey çivi değil! Duruma pozisyona göre kullana bileceğim şeyler değişebilir.

Kaleciyi değerlendiriyorsam adamın/kadının 'finishing' özelliğini dikkate almamalıyım. Çünkü kalecinin kalesinden çıkıp diğer ceza sahasında gol peşinde koşması normal bir durum değildir. Ben bu açıdan kaleciyi değerlendirecek olursam kuracağım tahmin modeline yanlış etkileyecek bir değişken eklemiş olurum ve unutmamak gerekir ki her değişkenin +/- bir etkisi vardır.

Artık pozisyonları nasıl değerlendireceğimi biliyorum. Pozisyonlar için seçtiğim özellikleri [0-1000] aralığında ölçmüş ise, bunları toplayıp özellik sayısına böler isem elimde yine [0-1000] aralığında ortalama bir değer olacaktır. Bu ortalama değer bir futbolcunun pozisyonuna göre kalitesinin bir tahminidir.

Ve sonrasında takımlardaki oyuncuların özellik ortalamalarını her takım için ayı ayrı toplayıp oyuncu sayısına bölersem bu da benim takım kalitesi için bir tahmin edicim olur. Takımları bu değerlere göre  sıralarsam ise, bu da benim sezon sonu lig sıralaması için bir tahmin edicim olur.

Evet 4 kişi kafa kafaya verip, yoğun bir çalışma sonrasında şampiyonun kim olacağına dair bir tahmin yaptık.

Lig başladı ve bitti. Çok büyük ihtimal ile bizim tahmin ettiğimiz lig sıralamasını tutturamamış olmalıyız 😊 Ama kabaca benzer bir sonuç almış olacağızdır.

Peki neden tutturamadık?

Arkadaşlar çünkü futbolcular aslında insan 😊 İnsanlar için yapılan çalışmalarda özellikle uzun süreli tahminlerde farkında olmak gerekir ki, insan bir makine değildir. İnsan, dış şartlardan bağımsız değildir. Yaşadıkları olaylardan, ailelerinden, arkadaşlarından, rakiplerinden etkilenirler.

Futbolcular uzun lig maratonu içerisinde çeşitli sakatlıklarla mücadele ederler. Çeşitli form sorunları yaşarlar. Duygusal problemleri olur. Taktiksel desteğe ihtiyaç duyarlar. Vs.

Kulüpler lig maratonu içerisinde futbolcularının daha başarılı olması için bir sürü personel çalıştırırlar. Doktor, montör, antrenör, teknik direktör, masajcı, vs.

Sonra kulüpler en iyi teknik malzemeleri futbolcularına sağlarlar. Yani elimizde çok kaliteli bir futbol takımı var ama bu yeterli değildir.

Sezon boyunca büyük bir emek verilir ki, oyuncular iyi bir form grafiği sergilesinler.

Aşağıdaki sayfalarda konuyla ilgili python kodunu paylaşıyorum ama sadece bir fikir denemesi ve öğrenme amaçlı olduğunu unutmayın. Zira pek futboldan anlamıyorum 😊







In [1]:
import pandas as pd
In [2]:
data=pd.read_excel('Fifa 2018 player data.xlsx', sheet='Sayfa2')
In [3]:
data.index=data['ID']

data=data.drop('ID', axis=1)

data.head()
Out[3]:
name full_name club club_logo special age league birth_date height_cm weight_kg ... prefers_cb prefers_lb prefers_lwb prefers_ls prefers_lf prefers_lam prefers_lcm prefers_ldm prefers_lcb prefers_gk
ID
20801 Cristiano Ronaldo C. Ronaldo dos Santos Aveiro Real Madrid CF https://cdn.sofifa.org/18/teams/243.png 2228 32 Spanish Primera División 5021985 1850 800 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
158023 L. Messi Lionel Messi FC Barcelona https://cdn.sofifa.org/18/teams/241.png 2158 30 Spanish Primera División 24061987 1700 720 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
190871 Neymar Neymar da Silva Santos Jr. Paris Saint-Germain https://cdn.sofifa.org/18/teams/73.png 2100 25 French Ligue 1 5021992 1750 680 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
176580 L. Suárez Luis Suárez FC Barcelona https://cdn.sofifa.org/18/teams/241.png 2291 30 Spanish Primera División 24011987 1820 860 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
167495 M. Neuer Manuel Neuer FC Bayern Munich https://cdn.sofifa.org/18/teams/21.png 1493 31 German Bundesliga 27031986 1930 920 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� DO�RU

5 rows × 184 columns

In [4]:
data_turk=data[data['league'].str.contains("Turkish")==True]
In [5]:
data_turk.head()
Out[5]:
name full_name club club_logo special age league birth_date height_cm weight_kg ... prefers_cb prefers_lb prefers_lwb prefers_ls prefers_lf prefers_lam prefers_lcm prefers_ldm prefers_lcb prefers_gk
ID
120533 Pepe Képler Laveran Lima Ferreira Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 1839 34 Turkish Süper Lig 26021983 1880 810 ... DO�RU YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
20775 Quaresma Ricardo Andrade Quaresma Bernardo Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 1962 33 Turkish Süper Lig 26091983 1750 670 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
193532 G. Medel Gary Medel Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 2009 29 Turkish Süper Lig 3081987 1710 710 ... DO�RU YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�
182494 F. Muslera Fernando Muslera Galatasaray SK https://cdn.sofifa.org/18/teams/325.png 1370 31 Turkish Süper Lig 16061986 1900 840 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� DO�RU
165239 S. Nasri Samir Nasri Antalyaspor https://cdn.sofifa.org/18/teams/741.png 1931 30 Turkish Süper Lig 26061987 1750 750 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI�

5 rows × 184 columns

In [6]:
data_poz=data_turk[[ 'rs', 'rw', 'rf', 'ram', 'rcm',
       'rm', 'rdm', 'rcb', 'rb', 'rwb', 'st', 'lw', 'cf', 'cam', 'cm',
       'lm', 'cdm', 'cb', 'lb', 'lwb', 'ls', 'lf', 'lam', 'lcm', 'ldm',
       'lcb', 'gk']]
In [7]:
data_poz.head()
Out[7]:
rs rw rf ram rcm rm rdm rcb rb rwb ... cb lb lwb ls lf lam lcm ldm lcb gk
ID
120533 610.0 580.0 590.0 590.0 630.0 590.0 760.0 830.0 750.0 720.0 ... 830.0 750.0 720.0 610.0 590.0 590.0 630.0 760.0 830.0 NaN
20775 740.0 820.0 800.0 810.0 740.0 810.0 520.0 370.0 500.0 570.0 ... 370.0 500.0 570.0 740.0 800.0 810.0 740.0 520.0 370.0 NaN
193532 620.0 650.0 650.0 680.0 730.0 680.0 800.0 800.0 770.0 760.0 ... 800.0 770.0 760.0 620.0 650.0 680.0 730.0 800.0 800.0 NaN
182494 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN 820.0
165239 740.0 810.0 800.0 810.0 760.0 800.0 600.0 480.0 600.0 640.0 ... 480.0 600.0 640.0 740.0 800.0 810.0 760.0 600.0 480.0 NaN

5 rows × 27 columns

In [8]:
data_poz=data_poz.fillna(0)
In [9]:
data_poz['role']=data_poz.idxmax(axis=1)
data_poz=data_poz[['role']]
In [10]:
data_poz.role.unique() # enteresan bir biçimde left pozisyonlar yok :)
Out[10]:
array(['rcb', 'rw', 'rdm', 'gk', 'ram', 'rs', 'rwb', 'rcm', 'rb', 'rf',
       'rm'], dtype=object)
In [11]:
data_turk=data_turk.merge(data_poz,  how='inner',left_index=True, right_index=True)
In [12]:
data_turk.head()
Out[12]:
name full_name club club_logo special age league birth_date height_cm weight_kg ... prefers_lb prefers_lwb prefers_ls prefers_lf prefers_lam prefers_lcm prefers_ldm prefers_lcb prefers_gk role
ID
120533 Pepe Képler Laveran Lima Ferreira Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 1839 34 Turkish Süper Lig 26021983 1880 810 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� rcb
20775 Quaresma Ricardo Andrade Quaresma Bernardo Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 1962 33 Turkish Süper Lig 26091983 1750 670 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� rw
193532 G. Medel Gary Medel Beşiktaş JK https://cdn.sofifa.org/18/teams/327.png 2009 29 Turkish Süper Lig 3081987 1710 710 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� rdm
182494 F. Muslera Fernando Muslera Galatasaray SK https://cdn.sofifa.org/18/teams/325.png 1370 31 Turkish Süper Lig 16061986 1900 840 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� DO�RU gk
165239 S. Nasri Samir Nasri Antalyaspor https://cdn.sofifa.org/18/teams/741.png 1931 30 Turkish Süper Lig 26061987 1750 750 ... YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� YANLI� rw

5 rows × 185 columns

In [13]:
data_turk_gk=data_turk.query('role=="gk"')

data_turk_gk['skor']=(data_turk_gk['gk_diving']+data_turk_gk['gk_handling']+
data_turk_gk['gk_kicking']+data_turk_gk['gk_positioning']+data_turk_gk['gk_reflexes'])/5

data_turk_bek=data_turk.query('role=="rwb" | role=="rb"')

data_turk_bek['skor']=(data_turk_bek['volleys']+data_turk_bek['dribbling']+
data_turk_bek['acceleration']+data_turk_bek['sprint_speed']+data_turk_bek['reactions']+
data_turk_bek['stamina']+data_turk_bek['aggression']+data_turk_bek['positioning']+ 
data_turk_bek['marking']+data_turk_bek['standing_tackle']+
data_turk_bek['sliding_tackle']+ data_turk_bek['crossing'])/12

data_turk_win=data_turk.query('role=="rw"')

data_turk_win['skor']=(data_turk_win['dribbling']+data_turk_win['acceleration']+
data_turk_win['sprint_speed']+data_turk_win['reactions']+ 
data_turk_win['stamina']+data_turk_win['aggression']+data_turk_win['balance']+ 
data_turk_win['crossing'])/8

data_turk_cbek=data_turk.query('role=="rcb"')

data_turk_cbek['skor']=(data_turk_cbek['jumping']+data_turk_cbek['stamina']+
data_turk_cbek['strength']+data_turk_cbek['positioning']+ data_turk_cbek['marking']+
data_turk_cbek['standing_tackle']+data_turk_cbek['sliding_tackle'])/7

data_turk_os=data_turk.query('role=="rdm" | role=="ram" | role=="rcm"') 

data_turk_os['skor']=(data_turk_os['finishing']+data_turk_os['short_passing']+
data_turk_os['dribbling']+data_turk_os['curve']+ data_turk_os['free_kick_accuracy']+ 
data_turk_os['long_passing']+data_turk_os['ball_control']+data_turk_os['agility']+ 
data_turk_os['balance']+data_turk_os['shot_power']+data_turk_os['stamina']+ 
data_turk_os['strength']+data_turk_os['long_shots']+data_turk_os['vision']+ 
data_turk_os['composure'])/15

data_turk_for=data_turk.query('role=="rs" | role=="rf"') 

data_turk_for['skor']=(data_turk_for['finishing']+data_turk_for['heading_accuracy']+
data_turk_for['dribbling']+data_turk_for['curve']+ data_turk_for['acceleration']+ 
data_turk_for['sprint_speed']+ data_turk_for['reactions']+data_turk_for['agility']+ 
data_turk_for['shot_power']+ data_turk_for['jumping']+data_turk_for['aggression']+
data_turk_for['strength']+data_turk_for['interceptions']+
data_turk_for['sliding_tackle'])/14
In [14]:
frames = [data_turk_gk, data_turk_bek, data_turk_cbek,data_turk_os,data_turk_for,
data_turk_win]

data_turk_allPo = pd.concat(frames)
In [15]:
data_turk_club=data_turk_allPo.groupby(['club'])['skor'].mean()
data_turk_club.sort_values()
Out[15]:
club
Evkur Yeni Malatyaspor    61.407579
Atiker Konyaspor          63.509568
Alanyaspor                63.801724
Medicana Sivasspor        64.828120
Gençlerbirliği SK         64.860417
Kasimpaşa SK              65.004190
Akhisar Belediyespor      65.726524
Göztepe                   65.975595
Kardemir Karabükspor      66.075379
Antalyaspor               66.107738
Bursaspor                 66.559278
Osmanlıspor               67.030998
Kayserispor               67.345988
İstanbul Başakşehir FK    67.966226
Fenerbahçe SK             68.508826
Galatasaray SK            69.284841
Trabzonspor               69.700571
Beşiktaş JK               71.754938
Name: skor, dtype: float64

 

Arkadaşlar, müşteri analizi diyorduk peki lig şampiyonunu tahmin etmek nereden çıktı?

Şimdi şöyle düşünelim; futbolcular müşteriler, takımlar markalar, lig de Türkiye pazarı olsun.

Şimdilik burada bırakalım ilerleyen bölümlerde buraya tekrar döneceğiz 😊

Comments are closed.