# Code complet du projet
import matplotlib.pyplot as plt
import scipy.stats
from scipy import stats
import numpy as np
import pylab
import pandas as pd
import seaborn as sns
import statistics
import statsmodels.api as smi
import openpyxl
# Importation du fichier CSV
matches = pd.read_csv("matches_football.csv", header=0, sep=",")
# Analyse descriptive des variables quantitatives
print(matches.describe())
# Histogramme pour Score1
plt.hist(matches['Score1'], bins=20, color='blue', edgecolor='black')
plt.title('Histogramme de Score1')
plt.xlabel('Score1')
plt.ylabel('Fréquence')
plt.show()
# Boîte à moustaches pour Score1
plt.boxplot(matches['Score1'])
plt.title('Boîte à moustaches de Score1')
plt.ylabel('Score1')
plt.show()
# Fréquence des équipes dans Équipe1
print(matches['Équipe1'].value_counts())
# Nuage de points entre Score1 et Tirs_Équipe1
plt.scatter(matches['Tirs_Équipe1'], matches['Score1'], color='red')
plt.title('Nuage de points : Score1 vs Tirs_Équipe1')
plt.xlabel('Tirs_Équipe1')
plt.ylabel('Score1')
plt.show()
# Calcul de la corrélation
correlation = matches['Score1'].corr(matches['Tirs_Équipe1'])
print(f"Corrélation entre Score1 et Tirs_Équipe1 : {correlation}")
# Tableau de contingence entre Équipe1 et Équipe2
contingency_table = pd.crosstab(matches['Équipe1'], matches['Équipe2'])
print(contingency_table)
# Nuage de points avec distinction par Équipe1
sns.scatterplot(x='Tirs_Équipe1', y='Score1', hue='Équipe1', data=matches)
plt.title('Nuage de points : Score1 vs Tirs_Équipe1 par Équipe1')
plt.show()
# Test de normalité pour Score1
shapiro_test = stats.shapiro(matches['Score1'])
print(f"Test de Shapiro-Wilk pour Score1 : {shapiro_test}")
# Test d'une moyenne pour Score1
t_test = stats.ttest_1samp(matches['Score1'], popmean=2)
print(f"Test t pour une moyenne de Score1 : {t_test}")
# Test de comparaison de 2 moyennes
t_test_2means = stats.ttest_ind(matches['Score1'], matches['Score2'])
print(f"Test t pour la comparaison de Score1 et Score2 : {t_test_2means}")
# Test du chi-deux pour l'indépendance entre Équipe1 et Équipe2
chi2_test = stats.chi2_contingency(contingency_table)
print(f"Test du chi-deux pour l'indépendance entre Équipe1 et Équipe2 : {chi2_test}")
# Test de corrélation de Pearson
pearson_test = stats.pearsonr(matches['Score1'], matches['Tirs_Équipe1'])
print(f"Test de corrélation de Pearson entre Score1 et Tirs_Équipe1 : {pearson_test}")
# Test d'une proportion
proportion_test = stats.binomtest(sum(matches['Score1'] > matches['Score2']), n=len(matches), p=0.5)
print(f"Test d'une proportion pour Score1 > Score2 : {proportion_test}")
# Test de comparaison de deux proportions
prop1 = sum(matches[matches['Équipe1'] == 'Bayern Munich']['Score1'] > matches[matches['Équipe1'] == 'Bayern Munich']['Score2'])
prop2 = sum(matches[matches['Équipe1'] == 'Real Madrid']['Score1'] > matches[matches['Équipe1'] == 'Real Madrid']['Score2'])
proportion_test_2 = stats.ttest_ind([prop1], [prop2])
print(f"Test de comparaison de deux proportions : {proportion_test_2}")
# Test de Mann-Whitney
mannwhitney_test = stats.mannwhitneyu(matches['Score1'], matches['Score2'])
print(f"Test de Mann-Whitney pour Score1 et Score2 : {mannwhitney_test}")
# ANOVA pour comparer les moyennes de Score1 par Équipe1
anova_test = stats.f_oneway(*[matches[matches['Équipe1'] == team]['Score1'] for team in matches['Équipe1'].unique()])
print(f"Test ANOVA pour Score1 par Équipe1 : {anova_test}")
# Intervalle de confiance pour la moyenne de Score1
confidence_interval = stats.t.interval(0.95, len(matches['Score1'])-1, loc=matches['Score1'].mean(), scale=stats.sem(matches['Score1']))
print(f"Intervalle de confiance à 95% pour la moyenne de Score1 : {confidence_interval}")
# Classification ascendante hiérarchique
from scipy.cluster.hierarchy import linkage, dendrogram
Z = linkage(matches[['Score1', 'Score2']], method='ward')
dendrogram(Z, labels=matches['Équipe1'].values)
plt.title('Dendrogramme des équipes')
plt.show()
# Régression linéaire
X = smi.add_constant(matches['Tirs_Équipe1'])
model = smi.OLS(matches['Score1'], X)
results = model.fit()
print(results.summary())
# Visualisation de la régression
plt.scatter(matches['Tirs_Équipe1'], matches['Score1'], color='blue')
plt.plot(matches['Tirs_Équipe1'], results.predict(X), color='red')
plt.title('Régression linéaire : Score1 vs Tirs_Équipe1')
plt.xlabel('Tirs_Équipe1')
plt.ylabel('Score1')
plt.show()Score1 Score2 Cartons_Équipe1 Cartons_Équipe2 Tirs_Équipe1 \
count 100.000000 100.000000 100.000000 100.000000 100.00000
mean 2.260000 2.330000 2.380000 2.300000 12.52000
std 1.761657 1.798175 1.768295 1.789419 4.34725
min 0.000000 0.000000 0.000000 0.000000 5.00000
25% 1.000000 1.000000 1.000000 1.000000 9.00000
50% 2.000000 2.000000 2.000000 2.000000 13.00000
75% 4.000000 4.000000 4.000000 4.000000 16.00000
max 5.000000 5.000000 5.000000 5.000000 20.00000
Tirs_Équipe2 Possession_Équipe1 Possession_Équipe2
count 100.000000 100.00000 100.00000
mean 12.270000 54.60000 45.40000
std 4.694409 8.82604 8.82604
min 5.000000 40.00000 30.00000
25% 9.000000 47.75000 37.75000
50% 12.000000 53.00000 47.00000
75% 16.250000 62.25000 52.25000
max 20.000000 70.00000 60.00000
Équipe1
Paris Saint-Germain 16
Lyon 13
Real Madrid 13
Chelsea 12
Manchester City 9
Bayern Munich 8
Barcelona 8
Liverpool 8
Juventus 7
Arsenal 6
Name: count, dtype: int64
Corrélation entre Score1 et Tirs_Équipe1 : 0.06394277524768552
Équipe2 Arsenal Barcelona Bayern Munich Chelsea Juventus \
Équipe1
Arsenal 0 0 0 0 1
Barcelona 0 0 0 1 3
Bayern Munich 0 2 0 1 1
Chelsea 2 1 0 0 3
Juventus 1 1 0 0 0
Liverpool 0 2 1 2 1
Lyon 2 1 0 4 1
Manchester City 2 2 0 1 0
Paris Saint-Germain 2 3 1 1 2
Real Madrid 0 1 1 0 0
Équipe2 Liverpool Lyon Manchester City Paris Saint-Germain \
Équipe1
Arsenal 0 3 1 0
Barcelona 0 1 1 0
Bayern Munich 0 1 0 0
Chelsea 1 1 2 1
Juventus 0 2 1 0
Liverpool 0 1 0 0
Lyon 1 0 3 1
Manchester City 1 0 0 2
Paris Saint-Germain 3 2 2 0
Real Madrid 2 1 3 5
Équipe2 Real Madrid
Équipe1
Arsenal 1
Barcelona 2
Bayern Munich 3
Chelsea 1
Juventus 2
Liverpool 1
Lyon 0
Manchester City 1
Paris Saint-Germain 0
Real Madrid 0
Test de Shapiro-Wilk pour Score1 : ShapiroResult(statistic=np.float64(0.8872299125740722), pvalue=np.float64(3.7189460197895377e-07))
Test t pour une moyenne de Score1 : TtestResult(statistic=np.float64(1.4758834645870682), pvalue=np.float64(0.14314877695451098), df=np.int32(99))
Test t pour la comparaison de Score1 et Score2 : TtestResult(statistic=np.float64(-0.2780741933972919), pvalue=np.float64(0.7812455664280495), df=np.float64(198.0))
Test du chi-deux pour l'indépendance entre Équipe1 et Équipe2 : Chi2ContingencyResult(statistic=np.float64(95.99564624003726), pvalue=np.float64(0.1221968708715778), dof=81, expected_freq=array([[0.54, 0.78, 0.18, 0.6 , 0.72, 0.48, 0.72, 0.78, 0.54, 0.66],
[0.72, 1.04, 0.24, 0.8 , 0.96, 0.64, 0.96, 1.04, 0.72, 0.88],
[0.72, 1.04, 0.24, 0.8 , 0.96, 0.64, 0.96, 1.04, 0.72, 0.88],
[1.08, 1.56, 0.36, 1.2 , 1.44, 0.96, 1.44, 1.56, 1.08, 1.32],
[0.63, 0.91, 0.21, 0.7 , 0.84, 0.56, 0.84, 0.91, 0.63, 0.77],
[0.72, 1.04, 0.24, 0.8 , 0.96, 0.64, 0.96, 1.04, 0.72, 0.88],
[1.17, 1.69, 0.39, 1.3 , 1.56, 1.04, 1.56, 1.69, 1.17, 1.43],
[0.81, 1.17, 0.27, 0.9 , 1.08, 0.72, 1.08, 1.17, 0.81, 0.99],
[1.44, 2.08, 0.48, 1.6 , 1.92, 1.28, 1.92, 2.08, 1.44, 1.76],
[1.17, 1.69, 0.39, 1.3 , 1.56, 1.04, 1.56, 1.69, 1.17, 1.43]]))
Test de corrélation de Pearson entre Score1 et Tirs_Équipe1 : PearsonRResult(statistic=np.float64(0.06394277524768552), pvalue=np.float64(0.527363458543289))
Test d'une proportion pour Score1 > Score2 : BinomTestResult(k=44, n=100, alternative='two-sided', statistic=0.44, pvalue=0.27125302407383545)
Test de comparaison de deux proportions : TtestResult(statistic=np.float64(nan), pvalue=np.float64(nan), df=np.float64(0.0))
Test de Mann-Whitney pour Score1 et Score2 : MannwhitneyuResult(statistic=np.float64(4905.0), pvalue=np.float64(0.8144998136759327))
Test ANOVA pour Score1 par Équipe1 : F_onewayResult(statistic=np.float64(2.405165705792146), pvalue=np.float64(0.017121429464961146))
Intervalle de confiance à 95% pour la moyenne de Score1 : (np.float64(1.910449090479784), np.float64(2.6095509095202156))
OLS Regression Results
==============================================================================
Dep. Variable: Score1 R-squared: 0.004
Model: OLS Adj. R-squared: -0.006
Method: Least Squares F-statistic: 0.4023
Date: Sat, 08 Feb 2025 Prob (F-statistic): 0.527
Time: 16:24:28 Log-Likelihood: -197.81
No. Observations: 100 AIC: 399.6
Df Residuals: 98 BIC: 404.8
Df Model: 1
Covariance Type: nonrobust
================================================================================
coef std err t P>|t| [0.025 0.975]
--------------------------------------------------------------------------------
const 1.9356 0.541 3.577 0.001 0.862 3.009
Tirs_Équipe1 0.0259 0.041 0.634 0.527 -0.055 0.107
==============================================================================
Omnibus: 94.074 Durbin-Watson: 2.183
Prob(Omnibus): 0.000 Jarque-Bera (JB): 8.406
Skew: 0.138 Prob(JB): 0.0149
Kurtosis: 1.607 Cond. No. 40.8
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.