```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

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'>

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()

--> À priori, pas de dépendance entre les données
```python
sns.displot(df_USA)
```
<seaborn.axisgrid.FacetGrid at 0x1d0b2125730>

--> 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
```