Miles Per Gallon - Hypothesis

1. Analysez l’évolution de la consommation des voitures (mpg) par rapport à la puissance du moteur
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. 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. 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. 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. 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. 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. Analysez l’évolution de la consommation des voitures (mpg) par rapport à la puissance du moteur

df.info()


df.nunique()

mpg             129
cylinders         5
displacement     82
horsepower       93
weight          351
acceleration     95
model_year       13
origin            3
name            305
dtype: int64

df.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, x='horsepower', y='mpg')

Corrélation de Pearson entre ces deux variables
pearsonr(x=df['horsepower'], y=df['mpg'])

PearsonRResult(statistic=np.float64(nan), pvalue=np.float64(nan))

→ La corrélation de pearson est de -0.778
Ces deux variables évoluent de manière significatives dans des directions oppsées.
Quand horse power augmente, mpg diminue.

→ La p-value est extrèmemeent faible : 7e-81
Il est impensable de dire que ces deux variables sont décorrelées




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['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
        ...  
333    second
334    second
335    second
336    second
337    second
Name: half, Length: 338, 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     152
second    186
dtype: int64

Variance
df_temp.groupby('half')['mpg'].var()

half
first     35.761197
second    58.022495
Name: mpg, dtype: float64

Conditions pour appliquer un test de Student (TTest ind)
1°) Données normales ou plus de 30 points : OK avec 152/186 points
2°) Observations indépendantes : Oui, les modèles de voitures sont indépendants les unsdes 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 = 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
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.974712842718591), pvalue=np.float64(1.6352499382971174e-11), df=np.float64(336.0))

→ Test de Student : La p-value est inférieure à alpha (0.02): On rejette donc H0 !

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.1437825589430295), pvalue=np.float64(5.683745347453685e-12), df=np.float64(335.486240224964))

→ Test de Welsh : La p-value est inférieure à alpha (0.02): On rejette donc H0 !




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.531915
6    16.550746
8    12.896078
Name: acceleration, dtype: float64

Variances
df.query("`origin` == 'usa' & `model_year` <= 80 ").groupby('cylinders')['acceleration'].var()

cylinders
4    4.760481
6    3.681325
8    4.633252
Name: acceleration, dtype: float64

Nombre de points
df.query("`origin` == 'usa' & `model_year` <= 80 ").groupby('cylinders')['acceleration'].size()

cylinders
4     47
6     67
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 47/67 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éricaine 4 cylindres ont en moyenne la même accélaration que les voitures américaines 6 cylindres

Test de Student
four_cylinders = df.query("`origin` == 'usa' & `model_year` <= 80 & `cylinders` == 4")
six_cylinders = df.query("`origin` == 'usa' & `model_year` <= 80 & `cylinders` == 6")
ttest_ind(four_cylinders['acceleration'], six_cylinders['acceleration'], equal_var=False)

TtestResult(statistic=np.float64(-0.04764277622265472), pvalue=np.float64(0.9621055550215347), df=np.float64(90.81728092025011))

→ Test de Student : La p-value est supérieure à alpha (0.02): On ne peut donc pas rejetter H0




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.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['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: 398, dtype: object

df['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: 398, dtype: bool

df_ford = df[df['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
32   25.0          4          98.0  ...          71     usa                ford pinto
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
126  21.0          6         200.0  ...          74     usa             ford maverick
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
336  23.6          4         140.0  ...          80     usa        ford mustang cobra
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

[51 rows x 9 columns]

Cylinders
df_ford['cylinders'].value_counts(normalize=True)

cylinders
8    0.392157
4    0.352941
6    0.254902
Name: proportion, dtype: float64

Observed frequencies
observed_frequencies = df_ford['cylinders'].value_counts().sort_index()

cylinders
4    18
6    13
8    20
Name: count, dtype: int64

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

[12.75 12.75 25.5 ]

ChiSquare
result = chisquare(f_exp=expected_frequencies, f_obs=observed_frequencies)

Power_divergenceResult(statistic=np.float64(3.352941176470588), pvalue=np.float64(0.18703292871671046))

→ 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
Juste qu'à preuve du contraire, on peut croire l'affirmation du collectionneur




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.query("`cylinders` == 4").groupby('origin')['mpg'].mean())

origin
europe    28.411111
japan     31.595652
usa       27.840278
Name: mpg, dtype: float64

Variances
df.query("`cylinders` == 4").groupby('origin')['mpg'].var())

origin
europe    41.505842
japan     29.547775
usa       20.698496
Name: mpg, dtype: float64

Anova
ma_liste = df.query("`cylinders` == 4").groupby('origin')['mpg'].apply(list)
f_oneway(*ma_liste)

F_onewayResult(statistic=np.float64(9.411845545485601), pvalue=np.float64(0.00012379894210177303))

→ Est-ce que la p-value est inférieure à 0.02 : Oui
Nous devons rejeter l'hypothèse H0 au seuil alpha=0.02




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.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/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.query("`origin` == 'japan'")
europe = df.query("`origin` == 'europe'")
ttest_ind(japan['horsepower'], europe['horsepower'])

TtestResult(statistic=np.float64(nan), pvalue=np.float64(nan), df=np.float64(nan))

→ Est-ce que la p-value est inférieure à 0.02 : Non (0.82)
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 (0.49)
Nous ne pouvons pas rejeter l'hypothèse H0 au seuil alpha=0.02




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

[79 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

[79 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       18  13  20

Chi Square Contingency
chi2_contingency(pd.crosstab(filtered_df['brand'], filtered_df['cylinders']))

Chi2ContingencyResult(statistic=np.float64(1.3859820398747735), pvalue=np.float64(0.5000780864081316), dof=2, expected_freq=array([[10.63291139,  6.02531646, 11.34177215],
       [19.36708861, 10.97468354, 20.65822785]]))