import pandas as pd
import numpy as np
from scipy.optimize import curve_fit
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.decomposition import PCA
from joypy import joyplot
import seaborn as sns
import matplotlib.pyplot as plt
'fivethirtyeight') plt.style.use(
Giriş
Temel Bileşenler Analizi ile 2024 Avrupa Futbol Şampiyonası İlk Grup Maçları Sonrası Takım Konumlarının Belirlenmesi başlıklı çalışmada, takımların konumlarını maç istatistiklerine göre ve Temel Bileşenler Analizi ile belirlemiş ve yorumlamıştık. Şimdi, başta Türkiye olmak üzere yarı final yolundaki takımların konumlarını yine aynı yöntemle belirleyeceğiz ancak bu defa logaritma ile ağırlıklandırılmış verileri kullanacağız. Çünkü, oynanan maç sayısındaki farklılıkların etkisini dengelemek için logaritma ile ağırlıklandırma yapılması önemlidir. Özellikle turnuva süresince takımların oynadıkları maç sayıları değişebilir ve bu, istatistiklerin karşılaştırılabilirliğini etkileyebilir. Logaritmik ölçekleme, daha az maç oynayan takımların istatistiklerinin, daha fazla maç oynayan takımların istatistiklerine kıyasla daha dengeli bir şekilde değerlendirilmesini sağlar. Bu sayede, çeyrek final öncesi takımların performanslarını objektif bir şekilde karşılaştırabiliriz ve Temel Bileşenler Analizi ile pozisyonlarını daha doğru bir şekilde belirleyebiliriz. Genel olarak, daha sağlıklı bir analiz yapabiliriz.
Temel Bileşenler Analizi dışında diğer yöntemlerle de analizi güçlendireceğiz.
Kullanılacak Kütüphaneler
Veri Setinin İçe Aktarılması
Veri setine buradan ulaşabilirsiniz.
= pd.read_excel('euro_2024_teams.xlsx', sheet_name='Sheet1').set_index('Team').drop(['Matches Played'], axis=1)
team_stats_df = pd.read_excel('euro_2024_teams.xlsx', sheet_name='Sheet2')
team_values_df = pd.read_excel('euro_2024_teams.xlsx', sheet_name='Sheet4', header=None) player_values_df
Kullanılacak İstatistikler
Won: (Kazanılan Maç Sayısı / Maç Sayısı) * LN(Maç Sayısı):
Kazanılan Maç Sayısı / Maç Sayısı: Takımın kazandığı maçların toplam maç sayısına oranı. Bu, takımın galibiyet yüzdesini gösterir.
LN(Maç Sayısı): Maç sayısının doğal logaritması alınmış halidir. Bu, maç sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın galibiyet oranı ne kadar yüksekse, takımın performansının o kadar iyi olduğunu gösterir. Daha fazla galibiyet, takımın başarılı olduğunu ve rakiplerine karşı üstünlük kurduğunu belirtir.
Goals: (Atılan Gol Sayısı / Maç Sayısı) * LN(Maç Sayısı):
Atılan Gol Sayısı / Maç Sayısı: Takımın maç başına attığı gol sayısı. Bu, takımın maç başına ortalama gol sayısını gösterir.
LN(Maç Sayısı): Maç sayısının doğal logaritması alınmış halidir. Bu, maç sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın maç başına attığı gol sayısının yüksek olması, takımın hücum gücünün ve gol atma yeteneğinin iyi olduğunu gösterir. Bu, takımın saldırgan oyun tarzını ve gol yollarındaki etkinliğini vurgular.
Attempts on Target: (Kaleyi Bulan Şut Sayısı / Şut Sayısı) * LN(Şut Sayısı):
Kaleyi Bulan Şut Sayısı / Şut Sayısı: Takımın kaleyi bulan şutlarının toplam şut sayısına oranı. Bu, takımın şutlarının ne kadarının kaleyi bulduğunu gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Takımın şutlarının kaleyi bulma oranının yüksek olması, takımın şut isabetliliğinin iyi olduğunu gösterir. Kaleyi bulan şutlar, gol olma olasılığı daha yüksek olan şutlardır ve bu da takımın hücum başarısını artırır.
Attacks: (Atak Sayısı / Maç Sayısı) * LN(Maç Sayısı):
Atak Sayısı / Maç Sayısı: Takımın maç başına yaptığı atak sayısı. Bu, takımın maç başına ortalama atak sayısını gösterir.
LN(Maç Sayısı): Maç sayısının doğal logaritması alınmış hali, maç sayısının etkisini dengelemek için kullanılır.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın maç başına yaptığı atak sayısının yüksek olması, takımın hücumda ne kadar aktif ve baskılı olduğunu gösterir. Daha fazla atak, takımın rakip savunmaları zorladığını ve gol atma fırsatları yarattığını belirtir.
Dribbles: (Top Sürme Sayısı / Maç Sayısı) * LN(Maç Sayısı):
Top Sürme Sayısı / Maç Sayısı: Takımın maç başına yaptığı top sürme sayısı. Bu, takımın maç başına ortalama top sürme sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Takımın maç başına yaptığı top sürme sayısının yüksek olması, takımın bireysel oyuncularının top sürme yeteneklerinin iyi olduğunu ve savunmaları geçmekte başarılı olduklarını gösterir. Bu, takımın hücumda daha yaratıcı ve dinamik olduğunu belirtir.
Balls Recovered: (Top Ele Geçirme Sayısı / Maç Sayısı) * LN(Maç Sayısı):
Top Ele Geçirme Sayısı / Maç Sayısı: Takımın maç başına gerçekleştirdiği top ele geçirme sayısı. Bu, takımın maç başına ortalama top ele geçirme sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın maç başına yaptığı top ele geçirme sayısının yüksek olması, takımın savunmada ne kadar etkili olduğunu ve rakipten topu geri alma yeteneğinin iyi olduğunu gösterir. Bu, takımın savunma becerilerini ve rakip atakları durdurma yeteneğini vurgular.
Tackles: (Başarılı Müdahale Sayısı / Müdahale Sayısı) * LN(Maç Sayısı):
Başarılı Müdahale Sayısı / Müdahale Sayısı: Takımın yaptığı başarılı müdahale sayısının toplam müdahale sayısına oranı. Bu, takımın başarılı müdahale yüzdesini gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın başarılı müdahale yüzdesinin yüksek olması, takımın savunmada ne kadar aktif olduğunu ve rakip ataklarını kesme yeteneğinin iyi olduğunu gösterir. Bu, takımın defansif organizasyonunu ve bireysel savunma becerilerini belirtir.
Clearances Attempted: (Denenen uzaklaştırmalar / Maç Sayısı) * LN(Maç Sayısı):
Denenen Uzaklaştırmalar / Maç Sayısı: Takımın maç başına yaptığı denenen uzaklaştırma sayısı. Bu, takımın maç başına ortalama denenen uzaklaştırma sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar az ise o kadar iyi olacaktır. Bir takımın maç başına yaptığı denenen uzaklaştırma sayısının az olması, takımın savunmada daha az baskı altında olduğunu ve rakipten gelen tehlikeleri daha az yaşadığını gösterir. Bu, takımın defansif güvenliğini ve topa sahip olma yeteneğini vurgular.
Saves: (Kurtarış / Maç Sayısı) * LN(Maç Sayısı):
Kurtarış / Maç Sayısı: Takımın kalecisinin maç başına yaptığı kurtarış sayısı. Bu, takımın maç başına ortalama kurtarış sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar az ise o kadar iyi olacaktır. Bir takımın kalecisinin maç başına yaptığı kurtarış sayısının az olması, takımın savunmada ne kadar sağlam olduğunu ve kalecinin daha az tehlikeli şutlarla karşılaştığını gösterir. Bu, takımın defansif organizasyonunu ve rakipten gelen tehlikeleri sınırlama yeteneğini belirtir.
Goals Conceded: (Yenilen Goller / Maç Sayısı) * LN(Maç Sayısı):
Yenilen Goller / Maç Sayısı: Takımın maç başına kalesine yediği gol sayısı. Bu, takımın maç başına ortalama yediği gol sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar az ise o kadar iyi olacaktır. Bir takımın maç başına yediği gol sayısının az olması, takımın savunmada ne kadar etkili olduğunu ve rakiplerin gol atma fırsatlarını sınırladığını gösterir. Bu, takımın defansif gücünü ve kalecinin performansını vurgular.
Fouls Committed: (Yapılan Fauller / Maç Sayısı) * LN(Maç Sayısı):
Yapılan Fauller / Maç Sayısı: Takımın maç başına yaptığı faul sayısı. Bu, takımın maç başına ortalama faul sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar az ise o kadar iyi olacaktır. Bir takımın maç başına yaptığı faul sayısının az olması, takımın savunmada ne kadar temiz oynadığını ve rakiplere gereksiz fauller yapmadığını gösterir. Bu, takımın disiplinli oyun tarzını ve defansif becerilerini belirtir.
Fouls Suffered: (Uğranılan Fauller / Maç Sayısı) * LN(Maç Sayısı):
Uğranılan Fauller / Maç Sayısı: Takımın maç başına maruz kaldığı faul sayısı. Bu, takımın maç başına ortalama maruz kaldığı faul sayısını gösterir.
LN(Maç Sayısı): Şut sayısının doğal logaritması alınmış halidir. Bu, şut sayısının büyüklüğünün etkisini dengelemeye yardımcı olur.
Beklenti: Bir takım için ne kadar çok ise o kadar iyi olacaktır. Bir takımın maç başına uğradığı faul sayısının yüksek olması, takımın hücumda ne kadar aktif ve etkili olduğunu ve rakiplerin takımın hücumlarını durdurmak için faul yapmak zorunda kaldığını gösterir. Bu, takımın hücum gücünü ve rakipler üzerinde yarattığı baskıyı vurgular.
Temel Bileşenler Analizi ile Takım Konumlarının Belirlenmesi
Verilerin Z-Skor ile Normalizasyonu
Z-skor normalizasyonu (ya da Z-skor standardizasyonu), verilerin ortalamasını 0, standart sapmasını 1 yaparak verileri standart bir ölçeğe getirmek için kullanılan bir yöntemdir. Bu yöntem, farklı ölçeklerdeki verileri karşılaştırmak veya belirli analizlerde kullanmak için idealdir.
Z-skoru, her bir veri noktasının, veri setinin ortalamasından ne kadar uzaklaştığını ve bu uzaklığın standart sapmaya göre ne kadar büyük olduğunu gösterir. Bir veri noktasının Z-skoru, o veri noktasının ortalamadan kaç standart sapma uzaklıkta olduğunu belirtir.
Bir veri noktasının Z-skoru şu şekilde hesaplanır:
\(Z=\frac{X-\mu}{\sigma}\)
\(X\): Normalizasyonu yapılacak veri noktası.
\(\mu\): Veri setinin ortalaması.
\(\sigma\): Veri setinin standart sapması.
= StandardScaler()
scaler = scaler.fit_transform(team_stats_df) scaled_team_stats_df
Temel Bileşenler ve Yüklemeler
= PCA(n_components=2)
pca = pca.fit_transform(scaled_team_stats_df)
principal_components
= pd.DataFrame(data=principal_components, columns=['PC1', 'PC2'])
pca_df 'Team'] = team_stats_df.index pca_df[
= pd.DataFrame(pca.components_.T, index=team_stats_df.columns, columns=['PC1', 'PC2']) * np.sqrt(pca.explained_variance_)
loadings
=(12, 8))
plt.figure(figsize=True, cmap='coolwarm', fmt='.2f', linewidths=.5)
sns.heatmap(loadings, annot'PCA Loadings')
plt.title('Principal Components (PC1, PC2)')
plt.xlabel('Original Features')
plt.ylabel( plt.show()
Takım Konumları
Karşılaştırma olması amacıyla bir önceki turnuvada takımların hangi konumlarda olduklarına da bakabiliriz. Bir önceki turnuvanın şampiyonu İtalya olmuştu.
= ['Türkiye','Netherlands']
highlight_teams_red = ['Spain','Germany','Portugal','France','England','Switzerland']
highlight_teams_orange
=(14, 10))
plt.figure(figsize='PC1', y='PC2', data=pca_df, s=100, alpha=0)
sns.scatterplot(x
for i in range(pca_df.shape[0]):
= pca_df['Team'][i]
team_name if team_name in highlight_teams_red:
plt.text(=pca_df.PC1[i]+0.1,
x=pca_df.PC2[i],
y=team_name,
s=dict(color='black', size=12),
fontdict=dict(facecolor='red', alpha=0.5)
bbox
)elif team_name in highlight_teams_orange:
plt.text(=pca_df.PC1[i]+0.1,
x=pca_df.PC2[i],
y=team_name,
s=dict(color='black', size=12),
fontdict=dict(facecolor='orange', alpha=0.5)
bbox
)else:
plt.text(=pca_df.PC1[i]+0.1,
x=pca_df.PC2[i],
y=team_name,
s=dict(color='gray', size=12)
fontdict
)
for i in range(loadings.shape[0]):
0, 0, loadings.PC1[i]*3, loadings.PC2[i]*3, color='blue', alpha=0.5)
plt.arrow(*3.7, loadings.PC2[i]*3.7, loadings.index[i], color='blue', ha='center', va='center')
plt.text(loadings.PC1[i]
'Euro 2024 Team Standings - On the Road to the Semi-Finals')
plt.title('PC1')
plt.xlabel('PC2')
plt.ylabel(True)
plt.grid(
plt.text(0.99,
-0.15,
'Red and Orange teams have qualified to the quarter-finals,\nGray teams have been eliminated.\nLogarithmic weighting used for fair comparison.',
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
) plt.show()
Takımların Skorları ve Sıralamaları
Takımlar ve Normalize Edilmiş Değerleri
0-1 normalizasyonu (ya da min-max normalizasyonu), verilerin belirli bir aralıkta (genellikle 0 ile 1 arasında) ölçeklenmesini sağlayan bir normalizasyon yöntemidir. Bu yöntem, veri setindeki en küçük değeri 0’a, en büyük değeri 1’e ve diğer tüm değerleri de bu aralıkta uygun bir noktaya ölçekler.
0-1 normalizasyonu, bir veri noktasının yeni ölçeklenmiş değerini şu formül ile hesaplar:
\(X' = \frac{X - X_{min}}{X_{max} - X_{min}}\)
\(X\): Normalizasyonu yapılacak veri noktası.
\(X_{min}\): Veri setindeki en küçük değer.
\(X_{max}\): Veri setindeki en büyük değer.
\(X'\): Normalizasyon sonrası veri noktası.
= MinMaxScaler()
min_max_scaler = pd.DataFrame(
normalized_team_stats_df
min_max_scaler.fit_transform(team_stats_df),=team_stats_df.columns,
columns=team_stats_df.index
index
)
=(14, 12))
plt.figure(figsize=True, cmap='coolwarm', fmt='.2f', linewidths=.5)
sns.heatmap(normalized_team_stats_df, annot'Team Statistics')
plt.title('Statistics (Normalized)')
plt.xlabel('')
plt.ylabel( plt.show()
Normalize Edilmiş Değerler ile Hesaplanan Skorlar ve Sıralama
16 turu maçında 2-1 yendiğimiz Avusturya’nın sıralamada bizden sonra geldiğini görüyoruz. Çeyrek final maçındaki rakibimiz Hollanda ise Avusturya’dan sonra gelmektedir. Tüm istatistikleri bir araya getirerek aslında genel bir dengenin resmini ortaya koyduğumuz bu sıralamada Hollanda’nın iki sıra önünde olmamız bizim için avantaj oluşturmaktadır.
= ['Clearances Attempted', 'Saves', 'Goals Conceded', 'Fouls Committed']
neg_columns = normalized_team_stats_df[neg_columns] * (-1)
normalized_team_stats_df[neg_columns]
'Score'] = normalized_team_stats_df.sum(axis=1)
normalized_team_stats_df[= normalized_team_stats_df.sort_values(by='Score')
normalized_team_stats_df
= highlight_teams_red + highlight_teams_orange
highlighted_countries = ['orange' if country in highlighted_countries else 'gray' for country in normalized_team_stats_df.index]
colors
=(10, 12))
plt.figure(figsize'Score'], color=colors)
plt.barh(normalized_team_stats_df.index, normalized_team_stats_df['Teams Ranking by Scores')
plt.title('Score')
plt.xlabel(True)
plt.grid( plt.show()
Türkiye ve Hollanda
Hollanda’dan daha iyi olduğumuz istatistikler:
- Kazanılan maç oranı
- Kaleyi bulan başarılı şut oranı
- Açılan başarılı orta oranı
- Maç başına top sürme sayısı
- Maç başına kazanılan top sayısı
- Maç başına müdahale sayısı
Hollanda’nın bizden daha iyi olduğu istatistikler:
- Başarılı pas oranı
- Maç başına hücum sayısı
- Maç başına topu uzaklaştırma girişimi sayısı (bizim daha fazla, negatif etki)
- Maç başına yenilen gol sayısı (bizim daha fazla, negatif etki)
Hollanda ile eşit olduğumuz istatistikler:
- Maç başına gol sayısı
- Maç başına kurtarış (negatif etki)
- Maç başına yapılan faul (negatif etki)
- Maç başına uğranılan faul sayısı
= normalized_team_stats_df.loc[['Türkiye', 'Netherlands']].T.drop('Score')
turvned_df = range(1, len(turvned_df) + 1)
my_range
=(10, 12))
plt.figure(figsize=my_range, xmin=turvned_df['Türkiye'], xmax=turvned_df['Netherlands'], color='grey', alpha=0.4)
plt.hlines(y'Türkiye'], my_range, color='red', alpha=1, s=100, label='Türkiye')
plt.scatter(turvned_df['Netherlands'], my_range, color='orange', alpha=1, s=100, label='Netherlands')
plt.scatter(turvned_df[
plt.legend()
plt.yticks(my_range, turvned_df.index)'Score-based Comparison of Statistics for Türkiye and Netherlands')
plt.title('Statistics (Normalized)')
plt.xlabel( plt.show()
Oyuncu ve Takımların Piyasa Değeri
16 turu maçları itibarıyla bir takımın mutlaka galip gelmek zorunda olduğunu göz önüne alarak geçmiş istatistiklerden berabere kalan maçları çıkarırsak, 30 maçın 24’ünü (%80’lik ciddi bir oran) piyasa değeri (turnuva başlamadan önceki değerler) yüksek olan takım kazanmış.
Rakibimiz Hollanda’nın piyasa değeri 784.4 milyon € iken bizim piyasa değerimiz 303.3 milyon €. Buna göre, Hollanda’nın kazanması beklenir ancak 30 maçın 6’sında (%20) piyasa değeri daha az olan takım kazanmış. Örneğin, 2-1 yendiğimiz Avusturya’nın piyasa değeri 252.2 milyon € olsa da Hollanda’yı 3-2 yenmişlerdir.
Piyasa değerinin önemini hafifletmeyeceğiz ama bu istatistiğe de yüzde yüz tutunmayacağız.
= team_values_df[team_values_df['Team1 Goals'] != team_values_df['Team2 Goals']]
team_values_df
= []
success
for index, row in team_values_df.iterrows():
if (row['Team1 Goals'] > row['Team2 Goals'] and row['Team1 Value'] > row['Team2 Value']):
'Yes')
success.append(elif (row['Team1 Goals'] < row['Team2 Goals'] and row['Team1 Value'] < row['Team2 Value']):
'Yes')
success.append(else:
'No')
success.append(
'Success'] = success
team_values_df[= team_values_df.groupby('Success').size()
success_counts
= ['#1f77b4', '#ff7f0e']
colors
= plt.subplots(figsize=(8, 6))
fig, ax =success_counts.index, autopct='%1.1f%%', colors=colors, startangle=90, wedgeprops={'edgecolor': 'black'})
ax.pie(success_counts, labels= plt.Circle((0,0),0.70,fc='white')
centre_circle
fig.gca().add_artist(centre_circle)'Do Team Market Values Impact Match Outcomes?', fontsize=12)
ax.set_title(
plt.text(0.99,
-0.15,
'Drawn matches are excluded.',
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
) plt.show()
Takımlara Göre Oyuncuların Piyasa Değerlerinin Dağılımı
Turnuvada ilerledikçe takımların oyuncularına ait piyasa değerinin üstten daha basık, sağa doğru daha yayılmış bir şekilde dağıldığını görüyoruz. Hollanda diğer takımlara pek benzemediği için bizim açımızdan asıl rekabetin yarı final ve finalde olacağını söyleyebiliriz.
= [
columns 'Player_Info_1',
'Player_Info_2',
'Player_Info_3',
'Player_Info_4',
'Player_Info_5',
'Player_Info_6',
'Player_Info_7'
]
= []
data_values
for i in range(0, len(player_values_df), 4):
= player_values_df.iloc[i:i+4, :].values
player_info = player_info[3, 0]
age = player_info[3, 2]
matches_played = player_info[3, 5]
market_value = player_info[3, 6]
country
data_values.append([age, matches_played, market_value, country])
= pd.DataFrame(data_values, columns=['Age', 'Int_Matches_Played', 'Market_Value_M', 'Country'])
player_values_df 'Market_Value_M'] = player_values_df['Market_Value_M'].replace({'€': '', 'm': 'e6', 'k': 'e3'}, regex=True).astype(float)
player_values_df['Market_Value_M'] /= 1_000_000
player_values_df[
= player_values_df.groupby('Country')['Market_Value_M'].agg(['mean', 'std']).reset_index()
market_value_stats_df 'Variation_Coefficient'] = market_value_stats_df['std'] / market_value_stats_df['mean']
market_value_stats_df[= market_value_stats_df.sort_values(by='Variation_Coefficient', ascending=True).set_index('Country')
market_value_stats_df
joyplot(=player_values_df[['Market_Value_M', 'Country']],
data='Country',
by=(10, 20),
figsize='own',
range_style=1
linewidth
)'Distribution of Player Market Values Across Countries')
plt.title('Million (€)')
plt.xlabel(
plt.text(0.99,
-0.05,
'Data source: Transfermarkt',
='bottom',
verticalalignment='right',
horizontalalignment=plt.gca().transAxes,
transform='gray',
color=10,
fontsize='italic'
fontstyle
) plt.show()
Takımların Skorları ile Piyasa Değerleri Varyasyon Katsayısı
Varyasyon katsayısı (coefficient of variation), bir ölçümün ortalamasına göre değişkenliğini ölçen bir istatistiksel terimdir. Matematiksel olarak, varyasyon katsayısı aşağıdaki şekilde tanımlanır.
\(CV = \frac{Standart\ Sapma}{Ortalama}\)
Burada:
- Standart Sapma, veri setindeki değerlerin ortalamadan ne kadar uzaklıkta olduğunu ölçen bir metriktir.
- Ortalama, veri setindeki tüm değerlerin aritmetik ortalamasıdır.
Varyasyon katsayıları ile daha önce hesapladığımız skorların ilişkisine baktığımızda ikinci dereceden bir polinomun uygun olduğunu görüyoruz. Turnuvada yola devam eden 8 takımın genel olarak daha düşük bir varyasyon katsayısına sahip olduğu görülüyor.
Hem Türkiye hem de Hollanda, düşük piyasa değeri varyasyonuna sahipler. Bu durum, her iki takımın da oyuncu kalitesinde (piyasa değeri) daha az dalgalanma olduğunu gösterir. Bunun yanında, her iki takım da aşağı yukarı benzer performans skorlarına sahip, bu da iki takımın da sahada benzer seviyede performans gösterdiğini ifade eder.
= pd.concat([market_value_stats_df, normalized_team_stats_df], axis=1)
combined_df
=(10, 8))
plt.figure(figsize'Variation_Coefficient'], combined_df['Score'], alpha=0.5)
plt.scatter(combined_df['Variation Coefficient')
plt.xlabel('Score')
plt.ylabel(for country in combined_df.index:
= combined_df.loc[country, 'Variation_Coefficient']
x = combined_df.loc[country, 'Score']
y = 'red' if country in highlight_teams_red else ('orange' if country in highlight_teams_orange else 'gray')
label_color
plt.annotate(
country,
(x, y),=8,
fontsize='right',
ha='white',
color=dict(facecolor=label_color, alpha=0.8, edgecolor='none')
bbox
)def func(x, a, b, c):
return a * x**2 + b * x + c
= curve_fit(func, combined_df['Variation_Coefficient'], combined_df['Score'])
popt, pcov = np.linspace(min(combined_df['Variation_Coefficient']), max(combined_df['Variation_Coefficient']), 100)
x_fit *popt), 'r--')
plt.plot(x_fit, func(x_fit, "Relationship between Teams' Market Value Coefficient of Variation and Score", fontsize=12)
plt.title( plt.show()
Gelecek içeriklerde görüşmek dileğiyle.