Python
# 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.