Découvrez ce guide complet sur comment faire l’analyse de données avec Python ! Que vous soyez un débutant ou un pro, cette vidéo vous fournira des conseils pratiques et des techniques avancées
Librairies: Pandas, Seaborn, Jupyter notebook,etc
Cliquez ici pour téléchargez le notebook (Jupyter Notebook) et l’ensemble de donnée de ce tutoriel .
Tableau des matières
La vidéo de ce tutoriel
Le Blog du tutoriel
1. Installer Python et des librairies nécessaires¶
Dans ce tutoriel nous allons utiliser Python et certaines librairies comme Jupyter notebook, Pandas et seaborn. Si vous ne les avez pas installés sur votre ordinateur pausez cette vidéo, j’ai déjà fait une vidéo complète sur le sujet.
Cliquez sur le lien: Vidéo sur comment installer Python et des librairies pour l’analyse de données pour voir comment installer Python et des librairies pour l’analyse de donnée sur Windows et mac. Ensuite revenez continuer. Si vous avez déjà les logiciels mentionné alors continuez de me suivre.
2. Charger des données avec Pandas¶
Pour commencer voici le lien pour télécharger l’ensemble de donnée que nous allons utiliser dans ce tuto: Donnée Milliardaires
- Maintenant ouvrons le jupyter notebook depuis notre terminal en faisant entrant jupyter notebook puis en faisant ENTREE.
- Naviguons jusqu’au dossier où nous voulons charger notre ensemble de données et cliquons sur UPLOAD pour charger notre ensemble de donnée.
- Ensuite créons un notebook en cliquant sur NEW et en choisissant Python 3.
3. Importer des librairies¶
import pandas as pd
import seaborn as sns
import re
from dateutil.relativedelta import relativedelta
import numpy as np
4. Créer le dataframe¶
df = pd.read_excel('donnee_milliardaires.xlsx',sheet_name='Sauvegarde')
df.head()
rang | categorie | prenomNom | pays | ville | source | domaine | luiMeme | genre | nom | … | revenuFinal | anneeNaissance | moisNaissance | jourNaissance | cpi_pays | pib_pays | esperance_ de_vie_pays | tax_revenue_pays | total_taux_imposition_pays | population_pays | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Mode & Commerce | Bernard Arnault & family | France | Paris | LVMH | Fashion & Retail | False | H | Arnault | … | 211000 | 1949 | 3 | 5 | 110.05 | $2,715,518,274,227 | 82.5 | 24.2 | 60.7 | 67059887 |
1 | 2 | Automobile | Elon Musk | États-Unis | Austin | Tesla, SpaceX | Automotive | True | H | Musk | … | 180000 | 1971 | 6 | 28 | 117.24 | $21,427,700,000,000 | 78.5 | 9.6 | 36.6 | 328239523 |
2 | 3 | Technologie | Jeff Bezos | États-Unis | Medina | Amazon | Technology | True | H | Bezos | … | 114000 | 1964 | 1 | 12 | 117.24 | $21,427,700,000,000 | 78.5 | 9.6 | 36.6 | 328239523 |
3 | 4 | Technologie | Larry Ellison | États-Unis | Lanai | Oracle | Technology | True | H | Ellison | … | 107000 | 1944 | 8 | 17 | 117.24 | $21,427,700,000,000 | 78.5 | 9.6 | 36.6 | 328239523 |
4 | 5 | Finance & Investissements | Warren Buffett | États-Unis | Omaha | Berkshire Hathaway | Finance & Investments | True | H | Buffett | … | 106000 | 1930 | 8 | 30 | 117.24 | $21,427,700,000,000 | 78.5 | 9.6 | 36.6 | 328239523 |
5 rows × 21 columns
df.shape
(481, 21)
df.dtypes
rang int64 categorie object prenomNom object pays object ville object source object domaine object luiMeme bool genre object nom object prenom object revenuFinal int64 anneeNaissance int64 moisNaissance int64 jourNaissance int64 cpi_pays float64 pib_pays object esperance_ de_vie_pays float64 tax_revenue_pays float64 total_taux_imposition_pays float64 population_pays int64 dtype: object
5. Nettoyage de données¶
5.1. Données manquantes¶
df[df.isna()].count()
rang 0 categorie 0 prenomNom 0 pays 0 ville 0 source 0 domaine 0 luiMeme 0 genre 0 nom 0 prenom 0 revenuFinal 0 anneeNaissance 0 moisNaissance 0 jourNaissance 0 cpi_pays 0 pib_pays 0 esperance_ de_vie_pays 0 tax_revenue_pays 0 total_taux_imposition_pays 0 population_pays 0 dtype: int64
5.2. Suprimer les doublons¶
df[df.duplicated()].count()
rang 6 categorie 6 prenomNom 6 pays 6 ville 6 source 6 domaine 6 luiMeme 6 genre 6 nom 6 prenom 6 revenuFinal 6 anneeNaissance 6 moisNaissance 6 jourNaissance 6 cpi_pays 6 pib_pays 6 esperance_ de_vie_pays 6 tax_revenue_pays 6 total_taux_imposition_pays 6 population_pays 6 dtype: int64
df = df.drop_duplicates()
df.shape
(475, 21)
5.3. Remplacer des valeurs¶
df['genre'].value_counts()
genre H 407 F 68 Name: count, dtype: int64
df['genre'] = df['genre'].replace(to_replace=[r'^F$',r'^H$'],value=['femme','homme'],regex=True, inplace=False)
df['genre'].value_counts()
genre homme 407 femme 68 Name: count, dtype: int64
5.4. Ajuster le type de la colonne pib_pays¶
df.dtypes
rang int64 categorie object prenomNom object pays object ville object source object domaine object luiMeme bool genre object nom object prenom object revenuFinal int64 anneeNaissance int64 moisNaissance int64 jourNaissance int64 cpi_pays float64 pib_pays object esperance_ de_vie_pays float64 tax_revenue_pays float64 total_taux_imposition_pays float64 population_pays int64 dtype: object
df['pib_pays'].head(2)
0 $2,715,518,274,227 1 $21,427,700,000,000 Name: pib_pays, dtype: object
df['pib_pays'].astype('float64')
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In[20], line 1 ----> 1 df['pib_pays'].astype('float64') File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/generic.py:6643, in NDFrame.astype(self, dtype, copy, errors) 6637 results = [ 6638 ser.astype(dtype, copy=copy, errors=errors) for _, ser in self.items() 6639 ] 6641 else: 6642 # else, only a single dtype is given -> 6643 new_data = self._mgr.astype(dtype=dtype, copy=copy, errors=errors) 6644 res = self._constructor_from_mgr(new_data, axes=new_data.axes) 6645 return res.__finalize__(self, method="astype") File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/internals/managers.py:430, in BaseBlockManager.astype(self, dtype, copy, errors) 427 elif using_copy_on_write(): 428 copy = False --> 430 return self.apply( 431 "astype", 432 dtype=dtype, 433 copy=copy, 434 errors=errors, 435 using_cow=using_copy_on_write(), 436 ) File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/internals/managers.py:363, in BaseBlockManager.apply(self, f, align_keys, **kwargs) 361 applied = b.apply(f, **kwargs) 362 else: --> 363 applied = getattr(b, f)(**kwargs) 364 result_blocks = extend_blocks(applied, result_blocks) 366 out = type(self).from_blocks(result_blocks, self.axes) File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/internals/blocks.py:758, in Block.astype(self, dtype, copy, errors, using_cow, squeeze) 755 raise ValueError("Can not squeeze with more than one column.") 756 values = values[0, :] # type: ignore[call-overload] --> 758 new_values = astype_array_safe(values, dtype, copy=copy, errors=errors) 760 new_values = maybe_coerce_values(new_values) 762 refs = None File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:237, in astype_array_safe(values, dtype, copy, errors) 234 dtype = dtype.numpy_dtype 236 try: --> 237 new_values = astype_array(values, dtype, copy=copy) 238 except (ValueError, TypeError): 239 # e.g. _astype_nansafe can fail on object-dtype of strings 240 # trying to convert to float 241 if errors == "ignore": File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:182, in astype_array(values, dtype, copy) 179 values = values.astype(dtype, copy=copy) 181 else: --> 182 values = _astype_nansafe(values, dtype, copy=copy) 184 # in pandas we don't store numpy str dtypes, so convert to object 185 if isinstance(dtype, np.dtype) and issubclass(values.dtype.type, str): File ~/miniconda3/envs/data-env/lib/python3.11/site-packages/pandas/core/dtypes/astype.py:133, in _astype_nansafe(arr, dtype, copy, skipna) 129 raise ValueError(msg) 131 if copy or arr.dtype == object or dtype == object: 132 # Explicit copy, or required since NumPy can't view from / to object. --> 133 return arr.astype(dtype, copy=True) 135 return arr.astype(dtype, copy=copy) ValueError: could not convert string to float: '$2,715,518,274,227 '
list_pib = df['pib_pays'].to_list()
list_pib_nouv = []
for el in list_pib:
el = re.sub(r'[^\d]+','',el)
list_pib_nouv.append(el)
print(list_pib[0],list_pib_nouv[0])
$2,715,518,274,227 2715518274227
df['pib_pays'] = pd.Series(list_pib_nouv)
df['pib_pays'] = df['pib_pays'].astype('float64')
df['pib_pays'].dtypes
dtype('float64')
df['pib_pays'].head()
0 2.715518e+12 1 2.142770e+13 2 2.142770e+13 3 2.142770e+13 4 2.142770e+13 Name: pib_pays, dtype: float64
5.5. Ajouter la colonne âge¶
df.columns
Index(['rang', 'categorie', 'prenomNom', 'pays', 'ville', 'source', 'domaine', 'luiMeme', 'genre', 'nom', 'prenom', 'revenuFinal', 'anneeNaissance', 'moisNaissance', 'jourNaissance', 'cpi_pays', 'pib_pays', 'esperance_ de_vie_pays', 'tax_revenue_pays', 'total_taux_imposition_pays', 'population_pays'], dtype='object')
df['dateNaissance'] = df['jourNaissance'].astype('str') + '-' + df['moisNaissance'].astype('str') + '-' + df['anneeNaissance'].astype('str')
df['dateNaissance'].head()
0 5-3-1949 1 28-6-1971 2 12-1-1964 3 17-8-1944 4 30-8-1930 Name: dateNaissance, dtype: object
df['dateNaissance'] = pd.to_datetime(df['dateNaissance'],format='%d-%m-%Y')
df['dateNaissance'].dtypes
dtype('<M8[ns]')
df['today'] = pd.to_datetime('now')
df['age'] = df.apply(lambda x: relativedelta(x.today,x.dateNaissance).years, axis=1)
df['age'].head()
0 75 1 52 2 60 3 79 4 93 Name: age, dtype: int64
6. Analyse des données¶
6.1. Lister le top 5 des milliardaires¶
df.columns
Index(['rang', 'categorie', 'prenomNom', 'pays', 'ville', 'source', 'domaine', 'luiMeme', 'genre', 'nom', 'prenom', 'revenuFinal', 'anneeNaissance', 'moisNaissance', 'jourNaissance', 'cpi_pays', 'pib_pays', 'esperance_ de_vie_pays', 'tax_revenue_pays', 'total_taux_imposition_pays', 'population_pays', 'dateNaissance', 'today', 'age'], dtype='object')
df = df.sort_values(by='revenuFinal',ascending=False)
df[['prenomNom','revenuFinal']].head()
prenomNom | revenuFinal | |
---|---|---|
0 | Bernard Arnault & family | 211000 |
1 | Elon Musk | 180000 |
2 | Jeff Bezos | 114000 |
3 | Larry Ellison | 107000 |
4 | Warren Buffett | 106000 |
6.2. Le nombre de milliardaires par intervalle d’âge¶
df['age'].max(),df['age'].min()
(97, 32)
df_intervals = df['age'].value_counts().rename_axis('age').reset_index(name='counts')
bins = [30,45,60,75,90,105]
labels=['[30-45]','[45-60]','[60-75]','[75-90]','[90-105]']
df_intervals = df_intervals['counts'].groupby(pd.cut(df_intervals['age'], bins=bins, labels=labels)).sum()
/var/folders/xq/kk04cqfx4xd55xcsbgb8rkqc0000gp/T/ipykernel_10078/3983198760.py:4: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning. df_intervals = df_intervals['counts'].groupby(pd.cut(df_intervals['age'], bins=bins, labels=labels)).sum()
df_intervals
age [30-45] 26 [45-60] 122 [60-75] 180 [75-90] 125 [90-105] 22 Name: counts, dtype: int64
6.3. Visualisation des données¶
df5 = df[['prenomNom','revenuFinal']].head()
sns.barplot(df5, x='prenomNom',y='revenuFinal', width=.5)
<Axes: xlabel='prenomNom', ylabel='revenuFinal'>
sns.barplot(df_intervals, color='green')
<Axes: xlabel='age', ylabel='counts'>
Merci d’avoir lu ce blog jusqu’au bout !