Miles Per Gallon - Hypothesis

1. 1. Analysez l’évolution de la consommation des voitures (mpg) par rapport à la puissance du moteur
2. 2. Peut-on affirmer avec un risque d'erreur de 2% que les voitures du Japon, d'Europe, et des États-Unis ont vu leur autonomie moyenne (mpg) augmenter entre la premiere moitiée des années 70s et la seconde moitiée des années 70s ?
3. 3. Un constructeur automobile américain affirme que les voitures américaines à 4 cylindres ont en moyenne la même accélération que les voitures américaines à 6 cylindres. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02).
4. 4. Un collectionneur de voitures affirme que parmi les voitures Ford des années 1970-1982, il y a 25% de 4 cylindres, 25% de 6 cylindres et 50% de 8 cylindres. Testez son affirmation et concluez avec un niveau de confiance de 98%.
5. 5. Les voitures à 4 cylindres ont en moyenne la même consommation d'essence au Japon, en Europe et aux États-Unis, dans les années 1970-1982. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02).
6. 6. Les voitures européennes et japonaises ont en moyenne le même nombre de chevaux. Testez cette affirmation et concluez avec un niveau de confiance de 98 % (alpha = 0,02).
7. 7. Un spécialiste vous dit que les constructeurs Ford et Dodge produisaient dans les années 70-82 des voitures avec un nombre de cylindres équivalent. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02)



1. 1. Analysez l’évolution de la consommation des voitures (mpg) par rapport à la puissance du moteur

df_cleaned.info()
Index: 392 entries, 0 to 397
Data columns (total 9 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   mpg           392 non-null    float64
 1   cylinders     392 non-null    int64  
 2   displacement  392 non-null    float64
 3   horsepower    392 non-null    float64
 4   weight        392 non-null    int64  
 5   acceleration  392 non-null    float64
 6   model_year    392 non-null    int64  
 7   origin        392 non-null    object 
 8   name          392 non-null    object 
dtypes: float64(4), int64(3), object(2)
memory usage: 30.6+ KB
df_cleaned.nunique()
mpg             127
cylinders         5
displacement     81
horsepower       93
weight          346
acceleration     95
model_year       13
origin            3
name            301
dtype: int64
df_cleaned.head()
    mpg  cylinders  displacement  ...  model_year  origin                       name
0  18.0          8         307.0  ...          70     usa  chevrolet chevelle malibu
1  15.0          8         350.0  ...          70     usa          buick skylark 320
2  18.0          8         318.0  ...          70     usa         plymouth satellite
3  16.0          8         304.0  ...          70     usa              amc rebel sst
4  17.0          8         302.0  ...          70     usa                ford torino

[5 rows x 9 columns]
sns.scatterplot(data=df_cleaned, x='horsepower', y='mpg')


Corrélation de Pearson entre ces deux variables
df = sns.load_dataset('mpg')
df_cleaned = df.dropna(subset=['horsepower', 'mpg']
pearsonr(x=df_cleaned['horsepower'], y=df_cleaned['mpg'])
PearsonRResult(statistic=np.float64(-0.7784267838977759), pvalue=np.float64(7.031989029404787e-81))
La corrélation de pearson est de -0.7784267838977759
Ces deux variables évoluent de manière significatives dans des directions opposées.
Quand horse power augmente, mpg diminue.
Tester l'hypothèse
Hypothèse H0: la consommation des voitures (mpg) et la puissance du moteur sont corrélés

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 7.031989029404787e-81

p_value < alpha ⇒
Nous avons suffisament d’évidences pour rejeter H0
⇒ Il y a une chance sur 142207275326856360638293990499473866825971841470215650589020888176195457303707648 d'obtenir une telle corrélation ou plus extrème.
La p-value est extrèmemeent faible : 7.031989029404787e-81
Il est impensable de dire que ces deux variables sont décorrelées



2. 2. Peut-on affirmer avec un risque d'erreur de 2% que les voitures du Japon, d'Europe, et des États-Unis ont vu leur autonomie moyenne (mpg) augmenter entre la premiere moitiée des années 70s et la seconde moitiée des années 70s ?

sns.boxplot(data=df, x='model_year', y='mpg')

df_temp = df.copy()
df_temp['half'] = df_cleaned['model_year'].apply(lambda x: x < 75).replace({True: 'first', False: 'second'})
df_temp = df_temp.query("model_year<=80")
0       first
1       first
2       first
3       first
4       first
        ...  
332    second
333    second
334    second
335    second
337    second
Name: half, Length: 334, dtype: object
sns.boxplot(data=df_temp, x='model_year', y='mpg', hue='half')

sns.boxplot(data=df_temp, x='half', y='mpg', hue='half')


Nombre de points
df_temp.groupby('half').size()
half
first     150
second    184
dtype: int64

Variance
df_temp.groupby('half')['mpg'].var()
half
first     35.998255
second    57.184598
Name: mpg, dtype: float64
Conditions pour appliquer un test de Student (TTest ind)
1°) Données normales ou plus de 30 points : OK avec 150 et 184 points
2°) Observations indépendantes : Oui, les modèles de voitures sont indépendants les uns des autres
3°) Variances similaires entre les 2 groupes : A priori non => Comparatif Test de Student et Test de Welsh
Test de Student (2 échantillons indépendants) - Hypothèse 0
H0: mpg moyen groupe A est égal au mpg moyen groupe B
Groupe A = Tous les modèles 70-74 ('first')
Groupe B = Tous les modèles 75-80 ('second')

Test de Student (equal_var=True)
first_half = df_temp.query("`half` == 'first'")
second_half = df_temp.query("`half` == 'second'")
ttest_ind(first_half['mpg'], second_half['mpg'], equal_var=True)
TtestResult(statistic=np.float64(-6.912631779958917), pvalue=np.float64(2.4451466260288248e-11), df=np.float64(332.0))
Tester l'hypothèse
Hypothèse H0: mpg moyen groupe A est égal au mpg moyen groupe B

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 2.4451466260288248e-11

p_value < alpha ⇒
Nous avons suffisament d’évidences pour rejeter H0
⇒ Il y a une chance sur 40897342897 d'obtenir une telle corrélation ou plus extrème.
Test de Student : La p-value est inférieure à alpha (0.02): On rejette donc H0 !
Les moyennes ne sont pas les mêmes

Test de Welsh
first_half = df_temp.query("`half` == 'first'")
second_half = df_temp.query("`half` == 'second'")
ttest_ind(first_half['mpg'], second_half['mpg'], equal_var=False)
TtestResult(statistic=np.float64(-7.075000003257606), pvalue=np.float64(8.923594936299578e-12), df=np.float64(331.77103612309065))
Test de Welsh : La p-value est inférieure à alpha (0.02): On rejette donc H0 !
Les moyennes ne sont pas les mêmes



3. 3. Un constructeur automobile américain affirme que les voitures américaines à 4 cylindres ont en moyenne la même accélération que les voitures américaines à 6 cylindres. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02).


Moyennes
df.query("`origin` == 'usa' & `model_year` <= 80 ").groupby('cylinders')['acceleration'].mean()
cylinders
4    16.526667
6    16.543939
8    12.896078
Name: acceleration, dtype: float64

Variances
df.query("`origin` == 'usa' & `model_year` <= 80 ").groupby('cylinders')['acceleration'].var()
cylinders
4    4.725182
6    3.734809
8    4.633252
Name: acceleration, dtype: float64

Nombre de points
df_cleaned.query("`origin` == 'usa' & `model_year` <= 80 ").groupby('cylinders')['acceleration'].size()
cylinders
4     45
6     66
8    102
Name: acceleration, dtype: int64
Conditions pour appliquer un test de Student (TTest ind)
1°) Données normales ou plus de 30 points : OK avec 45 et 66 points
2°) Observations indépendantes : Oui, les modèles de voitures sont indépendants les unsdes autres
3°) Variances similaires entre les 2 groupes : Oui
Test de Student (2 échantillons indépendants) - Hypothèse 0
H0: Les voitures américaines 4 cylindres ont en moyenne la même accélaration que les voitures américaines 6 cylindres

Test de Student
four_cylinders = df_cleaned.query("`origin` == 'usa' & `model_year` <= 80 & `cylinders` == 4")
six_cylinders = df_cleaned.query("`origin` == 'usa' & `model_year` <= 80 & `cylinders` == 6")
ttest_ind(four_cylinders['acceleration'], six_cylinders['acceleration'], equal_var=False)
TtestResult(statistic=np.float64(-0.04296857152375279), pvalue=np.float64(0.9658249574717568), df=np.float64(87.08289534031383))
Tester l'hypothèse
Hypothèse H0: Les voitures américaines 4 cylindres ont en moyenne la même accélaration que les voitures américaines 6 cylindres

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 0.9658249574717568

p_value ≥ alpha ⇒
- Nous n’avons pas suffisament d’évidences pour rejeter H0
- Jusqu'à preuve du contraire, l'hypothèse H0 tient la route.
- Nous n'avons pas de preuves suffisament importantes pour rejeter H0 au seuil alpha=0.02
- Jusqu'à preuve du contraire, on peut croire l'hypothèse H0
- Nous ne pouvons pas rejeter l'hypothèse H0 au seuil alpha=0.02
Test de Student : La p-value est supérieure à alpha (0.02): On ne peut donc pas rejeter H0



4. 4. Un collectionneur de voitures affirme que parmi les voitures Ford des années 1970-1982, il y a 25% de 4 cylindres, 25% de 6 cylindres et 50% de 8 cylindres. Testez son affirmation et concluez avec un niveau de confiance de 98%.

Test d'hypothèse nulle
H0:
parmi les voitures Ford des années 1970-1982, il y a :
- 25 % de 4 cylindres
- 25 % de 6 cylindres
- 50 % de 8 cylindres
df_cleaned.head()
    mpg  cylinders  displacement  ...  model_year  origin                       name
0  18.0          8         307.0  ...          70     usa  chevrolet chevelle malibu
1  15.0          8         350.0  ...          70     usa          buick skylark 320
2  18.0          8         318.0  ...          70     usa         plymouth satellite
3  16.0          8         304.0  ...          70     usa              amc rebel sst
4  17.0          8         302.0  ...          70     usa                ford torino

[5 rows x 9 columns]
df_cleaned['name']
0      chevrolet chevelle malibu
1              buick skylark 320
2             plymouth satellite
3                  amc rebel sst
4                    ford torino
                 ...            
393              ford mustang gl
394                    vw pickup
395                dodge rampage
396                  ford ranger
397                   chevy s-10
Name: name, Length: 392, dtype: object
df_cleaned['name'].str.contains('ford')
0      False
1      False
2      False
3      False
4       True
       ...  
393     True
394    False
395    False
396     True
397    False
Name: name, Length: 392, dtype: bool
df_ford = df_cleaned[df_cleaned['name'].str.contains('ford')]
      mpg  cylinders  displacement  ...  model_year  origin                      name
4    17.0          8         302.0  ...          70     usa               ford torino
5    15.0          8         429.0  ...          70     usa          ford galaxie 500
17   21.0          6         200.0  ...          70     usa             ford maverick
25   10.0          8         360.0  ...          70     usa                 ford f250
36   19.0          6         250.0  ...          71     usa           ford torino 500
40   14.0          8         351.0  ...          71     usa          ford galaxie 500
43   13.0          8         400.0  ...          71     usa  ford country squire (sw)
48   18.0          6         250.0  ...          71     usa              ford mustang
61   21.0          4         122.0  ...          72     usa       ford pinto runabout
65   14.0          8         351.0  ...          72     usa          ford galaxie 500
74   13.0          8         302.0  ...          72     usa     ford gran torino (sw)
80   22.0          4         122.0  ...          72     usa           ford pinto (sw)
88   14.0          8         302.0  ...          73     usa          ford gran torino
92   13.0          8         351.0  ...          73     usa                  ford ltd
100  18.0          6         250.0  ...          73     usa             ford maverick
104  12.0          8         400.0  ...          73     usa              ford country
112  19.0          4         122.0  ...          73     usa                ford pinto
130  26.0          4         122.0  ...          74     usa                ford pinto
136  16.0          8         302.0  ...          74     usa          ford gran torino
139  14.0          8         302.0  ...          74     usa     ford gran torino (sw)
155  15.0          6         250.0  ...          75     usa             ford maverick
159  14.0          8         351.0  ...          75     usa                  ford ltd
166  13.0          8         302.0  ...          75     usa           ford mustang ii
168  23.0          4         140.0  ...          75     usa                ford pinto
174  18.0          6         171.0  ...          75     usa                ford pinto
190  14.5          8         351.0  ...          76     usa          ford gran torino
193  24.0          6         200.0  ...          76     usa             ford maverick
200  18.0          6         250.0  ...          76     usa         ford granada ghia
206  26.5          4         140.0  ...          76     usa                ford pinto
214  13.0          8         302.0  ...          76     usa                 ford f108
228  18.5          6         250.0  ...          77     usa              ford granada
232  16.0          8         351.0  ...          77     usa          ford thunderbird
236  25.5          4         140.0  ...          77     usa       ford mustang ii 2+2
245  36.1          4          98.0  ...          78     usa               ford fiesta
254  20.2          6         200.0  ...          78     usa      ford fairmont (auto)
255  25.1          4         140.0  ...          78     usa       ford fairmont (man)
264  18.1          8         302.0  ...          78     usa               ford futura
282  22.3          4         140.0  ...          79     usa           ford fairmont 4
286  17.6          8         302.0  ...          79     usa           ford ltd landau
290  15.5          8         351.0  ...          79     usa  ford country squire (sw)
314  26.4          4         140.0  ...          80     usa             ford fairmont
351  34.4          4          98.0  ...          81     usa            ford escort 4w
352  29.9          4          98.0  ...          81     usa            ford escort 2h
365  20.2          6         200.0  ...          81     usa           ford granada gl
373  24.0          4         140.0  ...          82     usa      ford fairmont futura
389  22.0          6         232.0  ...          82     usa            ford granada l
393  27.0          4         140.0  ...          82     usa           ford mustang gl
396  28.0          4         120.0  ...          82     usa               ford ranger

[48 rows x 9 columns]

Cylinders
df_ford['cylinders'].value_counts(normalize=True)
cylinders
8    0.416667
4    0.333333
6    0.250000
Name: proportion, dtype: float64

Observed frequencies
observed_frequencies = df_ford['cylinders'].value_counts().sort_index()
cylinders
4    16
6    12
8    20
Name: count, dtype: int64

Expected frequencies
expected_frequencies = np.array([0.25, 0.25, 0.5]) * observed_frequencies.sum()
[12. 12. 24.]

ChiSquare
result = chisquare(f_exp=expected_frequencies, f_obs=observed_frequencies)
Power_divergenceResult(statistic=np.float64(2.0), pvalue=np.float64(0.36787944117144245))
Tester l'hypothèse
Hypothèse H0: Parmi les voitures Ford des années 1970-1982, il y a : 25% de 4 cylindres, 25% de 6 cylindres, 50% de 8 cylindres

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 0.36787944117144245

p_value ≥ alpha ⇒
- Nous n’avons pas suffisament d’évidences pour rejeter H0
- Jusqu'à preuve du contraire, l'hypothèse H0 tient la route.
- Nous n'avons pas de preuves suffisament importantes pour rejeter H0 au seuil alpha=0.02
- Jusqu'à preuve du contraire, on peut croire l'hypothèse H0
- Nous ne pouvons pas rejeter l'hypothèse H0 au seuil alpha=0.02
Est-ce que la p-value est inférieure à 0.02 : Non
Nous n'avons pas de preuves suffisament importantes pour rejeter H0 au seuil alpha=0.02
Jusqu'à preuve du contraire, on peut croire l'affirmation du collectionneur



5. 5. Les voitures à 4 cylindres ont en moyenne la même consommation d'essence au Japon, en Europe et aux États-Unis, dans les années 1970-1982. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02).


Moyennes
df_cleaned.query("`cylinders` == 4").groupby('origin')['mpg'].mean())
origin
europe    28.106557
japan     31.595652
usa       28.013043
Name: mpg, dtype: float64

Variances
df_cleaned.query("`cylinders` == 4").groupby('origin')['mpg'].var())
origin
europe    39.577623
japan     29.547775
usa       20.853798
Name: mpg, dtype: float64

Anova
ma_liste = df_cleaned.query("`cylinders` == 4").groupby('origin')['mpg'].apply(list)
f_oneway(*ma_liste)
F_onewayResult(statistic=np.float64(9.538999089626689), pvalue=np.float64(0.00011134953247209682))
Tester l'hypothèse
Hypothèse H0: Les voitures à 4 cylindres ont en moyenne la même consommation d'essence au Japon, en Europe et aux États-Unis, dans les années 1970-1982

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 0.00011134953247209682

p_value < alpha ⇒
Nous avons suffisament d’évidences pour rejeter H0
⇒ Il y a une chance sur 8980 d'obtenir une telle corrélation ou plus extrème.



6. 6. Les voitures européennes et japonaises ont en moyenne le même nombre de chevaux. Testez cette affirmation et concluez avec un niveau de confiance de 98 % (alpha = 0,02).


Analyse des données
df_cleaned.groupby('origin')['horsepower'].describe()
        count        mean        std   min    25%    50%    75%    max
origin                                                                
europe   68.0   80.558824  20.157871  46.0  69.75   76.5   90.0  133.0
japan    79.0   79.835443  17.819199  52.0  67.00   75.0   95.0  132.0
usa     245.0  119.048980  39.897790  52.0  88.00  105.0  150.0  230.0
Test d'hypothèse nulle
Test de Student avec H0: Les voitures du Japon et de l'Europe ont en moyenne le même nombre de chevaux
Conditions pour appliquer un test de Student (TTest ind)
1°) Données normales ou plus de 30 points : OK avec 68 et 79 points
2°) Observations indépendantes : Oui, les modèles de voitures sont indépendants les unsdes autres
3°) Variances similaires entre les 2 groupes : Oui (20 et 18)

Test de Student
japan = df_cleaned.query("`origin` == 'japan'")
europe = df_cleaned.query("`origin` == 'europe'")
ttest_ind(japan['horsepower'], europe['horsepower'])
TtestResult(statistic=np.float64(-0.23093695241338838), pvalue=np.float64(0.8176893173506833), df=np.float64(145.0))
Tester l'hypothèse
Hypothèse H0: Les voitures européennes et japonaises ont en moyenne le même nombre de chevaux

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 0.8176893173506833

p_value ≥ alpha ⇒
- Nous n’avons pas suffisament d’évidences pour rejeter H0
- Jusqu'à preuve du contraire, l'hypothèse H0 tient la route.
- Nous n'avons pas de preuves suffisament importantes pour rejeter H0 au seuil alpha=0.02
- Jusqu'à preuve du contraire, on peut croire l'hypothèse H0
- Nous ne pouvons pas rejeter l'hypothèse H0 au seuil alpha=0.02



7. 7. Un spécialiste vous dit que les constructeurs Ford et Dodge produisaient dans les années 70-82 des voitures avec un nombre de cylindres équivalent. Testez cette affirmation et concluez avec un niveau de confiance de 98% (alpha = 0,02)

filtered_df = df_cleaned[df_cleaned['name'].str.contains('ford|dodge', case=False, na=False)]
      mpg  cylinders  displacement  ...  model_year  origin                 name
4    17.0          8         302.0  ...          70     usa          ford torino
5    15.0          8         429.0  ...          70     usa     ford galaxie 500
10   15.0          8         383.0  ...          70     usa  dodge challenger se
17   21.0          6         200.0  ...          70     usa        ford maverick
25   10.0          8         360.0  ...          70     usa            ford f250
..    ...        ...           ...  ...         ...     ...                  ...
389  22.0          6         232.0  ...          82     usa       ford granada l
391  36.0          4         135.0  ...          82     usa    dodge charger 2.2
393  27.0          4         140.0  ...          82     usa      ford mustang gl
395  32.0          4         135.0  ...          82     usa        dodge rampage
396  28.0          4         120.0  ...          82     usa          ford ranger

[76 rows x 9 columns]

Nouvelle colonne 'Brand'
filtered_df['brand'] = filtered_df['name'].apply(lambda x: 'ford' if 'ford' in x else 'dodge')
      mpg  cylinders  displacement  ...  origin                 name  brand
4    17.0          8         302.0  ...     usa          ford torino   ford
5    15.0          8         429.0  ...     usa     ford galaxie 500   ford
10   15.0          8         383.0  ...     usa  dodge challenger se  dodge
17   21.0          6         200.0  ...     usa        ford maverick   ford
25   10.0          8         360.0  ...     usa            ford f250   ford
..    ...        ...           ...  ...     ...                  ...    ...
389  22.0          6         232.0  ...     usa       ford granada l   ford
391  36.0          4         135.0  ...     usa    dodge charger 2.2  dodge
393  27.0          4         140.0  ...     usa      ford mustang gl   ford
395  32.0          4         135.0  ...     usa        dodge rampage  dodge
396  28.0          4         120.0  ...     usa          ford ranger   ford

[76 rows x 10 columns]

Tableau de contingence
pd.crosstab(filtered_df['brand'], filtered_df['cylinders'])
cylinders   4   6   8
brand                
dodge      12   4  12
ford       16  12  20

Chi Square Contingency
chi2_contingency(pd.crosstab(filtered_df['brand'], filtered_df['cylinders']))
Chi2ContingencyResult(statistic=np.float64(1.4056122448979598), pvalue=np.float64(0.49519377793169383), dof=2, expected_freq=array([[10.31578947,  5.89473684, 11.78947368],
       [17.68421053, 10.10526316, 20.21052632]]))
Tester l'hypothèse
Hypothèse H0: les constructeurs Ford et Dodge produisaient dans les années 70-82 des voitures avec un nombre de cylindres équivalent

Si p_value < alpha: Nous avons suffisament d’évidences pour rejeter H0
sinon: Nous n’avons pas suffisament d’évidences pour rejeter H0

alpha = 0.02
p_value = 0.49519377793169383

p_value ≥ alpha ⇒
- Nous n’avons pas suffisament d’évidences pour rejeter H0
- Jusqu'à preuve du contraire, l'hypothèse H0 tient la route.
- Nous n'avons pas de preuves suffisament importantes pour rejeter H0 au seuil alpha=0.02
- Jusqu'à preuve du contraire, on peut croire l'hypothèse H0
- Nous ne pouvons pas rejeter l'hypothèse H0 au seuil alpha=0.02