```python import numpy as np import pandas as pd import matplotlib import matplotlib.pyplot as plt import seaborn as sns import scipy from scipy.stats import pearsonr, ttest_ind, ttest_1samp print("pandas version:", pd.__version__) print("matplotlib version:", matplotlib.__version__) print("seaborn version:", sns.__version__) print("scipy version", scipy.__version__) ``` pandas version: 2.2.2 matplotlib version: 3.8.4 seaborn version: 0.13.2 scipy version 1.13.1 ### Data ```python df = sns.load_dataset('healthexp') df.head() ``` <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>Year</th> <th>Country</th> <th>Spending_USD</th> <th>Life_Expectancy</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1970</td> <td>Germany</td> <td>252.311</td> <td>70.6</td> </tr> <tr> <th>1</th> <td>1970</td> <td>France</td> <td>192.143</td> <td>72.2</td> </tr> <tr> <th>2</th> <td>1970</td> <td>Great Britain</td> <td>123.993</td> <td>71.9</td> </tr> <tr> <th>3</th> <td>1970</td> <td>Japan</td> <td>150.437</td> <td>72.0</td> </tr> <tr> <th>4</th> <td>1970</td> <td>USA</td> <td>326.961</td> <td>70.9</td> </tr> </tbody> </table> </div> 1. Spending_USD et Life_Expectancy semblent être corrélées. - Quelle est la corrélation de Pearson entre ces deux variables aux États-Unis, de 2000 à 2020 ? - Quelle serait la probabilité d'obtenir une corrélation au moins aussi importante que celle-ci, si en réalité les deux variables n'étaient pas corrélées ? 2. Dans les vidéos précédentes, il semblait également que l'Allemagne et la Grande-Bretagne avaient la même durée de vie moyenne de 1970 à 2020. - Peut-on tester cela avec l'une des techniques vues dans les précédentes vidéos ? 3. Un politicien américain affirme que depuis 1970, la durée de vie aux États-Unis augmente en moyenne de 0,3 an. Testez cette affirmation et donnez votre conclusion avec un niveau de confiance de 98 % (alpha = 0,02). (Vous pouvez utiliser la fonction `.diff()` de pandas pour calculer la différence d'une ligne à l'autre dans votre DataFrame). ### 1. Corrélation entre *Spending_USD* et *Life_Expectancy* ```python df_pearson = df.query("`Country` == 'USA' & `Year` <= 2020 & `Year` >= 2000") df_pearson.info() sns.scatterplot(data=df_pearson, x="Spending_USD", y="Life_Expectancy") plt.show() pears = pearsonr(df_pearson["Spending_USD"], df_pearson["Life_Expectancy"]) print(pears) print("La corrélation de Pearson entre les variables 'Spending_USD' et 'Life_Expectency' aux États-Unis entre 2000 et 2020 est de",pears.statistic.round(2)) ``` <class 'pandas.core.frame.DataFrame'> Index: 21 entries, 153 to 273 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Year 21 non-null int64 1 Country 21 non-null object 2 Spending_USD 21 non-null float64 3 Life_Expectancy 21 non-null float64 dtypes: float64(2), int64(1), object(1) memory usage: 840.0+ bytes ![png](exo_Hypothèses_1_Health_Expectation_5_1.png) PearsonRResult(statistic=0.6210674528998252, pvalue=0.002658154480579908) La corrélation de Pearson entre les variables 'Spending_USD' et 'Life_Expectency' aux États-Unis entre 2000 et 2020 est de 0.62 ```python print("H0 : \"les deux variables ne sont pas corrélées\"") print() alpha = 0.02 p_value = pears.pvalue print("La probabilité d'obtenir une corrélation au moins aussi importante que celle-ci, si en réalité les deux variables ne sont pas corrélées est de", p_value.round(4),"\n") print("On a donc 1 chance sur", (1/p_value).round(0), "d'obtenir les résultats comme ceux-ci si les 2 variables étaient non corrélées\n") if p_value < alpha: print("Nous avons suffisamment d'évidences pour rejeter H0") else: print("Nous n'avons pas suffisamment d'évidences pour rejeter H0") ``` H0 : "les deux variables ne sont pas corrélées" La probabilité d'obtenir une corrélation au moins aussi importante que celle-ci, si en réalité les deux variables ne sont pas corrélées est de 0.0027 On a donc 1 chance sur 376.0 d'obtenir les résultats comme ceux-ci si les 2 variables étaient non corrélées Nous avons suffisamment d'évidences pour rejeter H0 ### 2. Durée de vie moyenne entre l'Allemagne et la Grande-Bretagne ```python df_temp = df.query("`Country` == 'Germany' | `Country` == 'Great Britain'") sns.scatterplot(data=df_temp, x='Year', y='Life_Expectancy', hue="Country") ``` <Axes: xlabel='Year', ylabel='Life_Expectancy'> ![png](exo_Hypothèses_1_Health_Expectation_8_1.png) Hypothèse : l'Allemagne et la Grande-Bretagne ont la même durée de vie moyenne de 1970 à 2020 Le test de Student 2 groupes indépendants permet de tester si 2 moyennes sont identiques. Conditions: - Données indépentantes et identiquement distribuées -> **les données ne sont pas indépendantes (la population n'a pas complètement changé entres plusieurs dates), c'est souvent le cas des séries temporelles --> on ne peut pas appliquer le test de Student. Attention le test de Student ne compare que les moyennes et pas l'évolution** - Données suivent une loi normale ou > 30 points dans chaque groupe Pour analyser que 2 séries temporelles se superposent bien, il faut utiliser d'autres outils (DTW, ARIMA, etc..) ### 3. La durée de vie aux États-Unis augmente en moyenne de 0,3 an ? ```python df_USA = df.query("`Country` == 'USA'")["Life_Expectancy"].diff().dropna() df_USA.describe() ``` count 50.000000 mean 0.122000 std 0.338237 min -1.800000 25% 0.000000 50% 0.100000 75% 0.200000 max 0.700000 Name: Life_Expectancy, dtype: float64 - Conditions pour utiliser un test de student à 1 échantillon : - Données indépendantes les unes des autres - Issues d'une distribution normale ou plus de 30 points ```python df1 = df.query("`Country` == 'USA'") df1["Life_Expectancy"] = df1["Life_Expectancy"].diff() sns.scatterplot(df1, x="Year", y="Life_Expectancy") plt.show() ``` C:\Users\steph\AppData\Local\Temp\ipykernel_17152\3293721324.py:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df1["Life_Expectancy"] = df1["Life_Expectancy"].diff() ![png](exo_Hypothèses_1_Health_Expectation_14_1.png) --> À priori, pas de dépendance entre les données ```python sns.displot(df_USA) ``` <seaborn.axisgrid.FacetGrid at 0x1d0b2125730> ![png](exo_Hypothèses_1_Health_Expectation_16_1.png) --> Forme en cloche --> distrubution nomrale (en plus il ya plus de 30 données) **--> On peut appliquer le test de Student à 1 échantillon** ```python ttest_1samp(df_USA, popmean=0.3) ``` TtestResult(statistic=-3.7212105613188773, pvalue=0.0005112013249193949, df=49) ```python print("H0 : \"La durée de vie aux États-Unis augmente en moyenne de 0,3 an\"") print() alpha = 0.02 p_value = ttest_1samp(df_USA, popmean=0.3).pvalue print("Nous avons donc 1 chance sur", (1/p_value).round(), "d'obtenir une différence au moins aussi grande entre l'augmentation de vie moyenne mesurée de", df_USA.mean().round(2), "et celle 0.3 pronostiquée par le politicien\n") if p_value < alpha: print("Nous avons suffisamment d'évidences pour rejeter l'hypothèse du politicien") else: print("Nous n'avons pas suffisamment d'évidences pour rejeter H0") ``` H0 : "La durée de vie aux États-Unis augmente en moyenne de 0,3 an" Nous avons donc 1 chance sur 1956.0 d'obtenir une différence au moins aussi grande entre l'augmentation de vie moyenne mesurée de 0.12 et celle 0.3 pronostiquée par le politicien Nous avons suffisamment d'évidences pour rejeter l'hypothèse du politicien ```python ```