Lors du prétraitement des données, vous souhaiterez peut-être diviser les valeurs continues en plages appropriées et les catégoriser.
Par exemple, si vous disposez de données d'âge telles que [20, 23, 30, 35, 42, 45] Le dernier chiffre de l'âge n'est pas très important, par exemple lorsque les adolescents sont des attributs importants.
Dans le cas de cet exemple, les données sont divisées tous les 10 ans et chaque donnée est divisée en catégories telles que 20, 30 et 40.
Pour ce processus
Utilisez la fonction de coupe de pandas.
Dans la fonction cut, les valeurs continues sont catégorisées en spécifiant principalement les quatre arguments suivants.
x :Tableau unidimensionnel
bins :Un tableau de nombres utilisés comme délimiteurs
labels:Un tableau de chaînes qui spécifie le nom de chaque délimiteur
right :Indique s'il faut faire du côté droit du délimiteur spécifié par bins une section fermée. Spécifiez Vrai ou Faux
Par exemple, si vous souhaitez diviser les [20, 23, 30, 35, 42, 45] précédents en 20, 30 et 40. Précisez comme suit.
x = [20, 23, 30, 35, 42, 45]
pd.cut(x, bins = [19, 29, 39, 49], labels= ['20 ans', '30 s', 'Quarante'])
Dans cet exemple, bins = [19, 29, 39, 49] Par défaut, la fonction cut utilise la valeur spécifiée pour les bacs. Le côté gauche est la section ouverte et le côté droit est la section fermée. Dans cet exemple, il est divisé en trois parties telles que 19 <x <= 29, 29 <x <= 39, 39 <x <= 49.
Si vous souhaitez que le côté gauche soit un intervalle fermé, spécifiez l'argument droit de la fonction de coupe sur False. Écrivez comme suit. Dans cet exemple, cela facilite la lecture intuitive de la signification du code source.
x = [20, 23, 30, 35, 42, 45]
pd.cut(x, bins = [20, 30, 40, 50], labels= ['20 ans', '30 s', 'Quarante'], right=False)
La sortie de la fonction cut donne un objet catégoriel comme suit:
[20 ans, 20 ans,30 s,30 s,Quarante,Quarante]
Categories (3, object): [20 ans<30 s<Quarante]
Les objets catégoriels peuvent accéder à des éléments tels que des tableaux.
x = [20, 23, 30, 35, 42, 45]
result = pd.cut(x, bins = [20, 30, 40, 50], labels= ['20 ans', '30 s', 'Quarante'], right=False)
result[0] #La valeur est'20 ans'devenir
Si vous écrivez un code qui compte le numéro d'un certain modèle
import pandas as pd
x = [191, 184, 173, 162, 175, 183, 151, 160, 170, 182, 190, 192]
#Exemple d'utilisation
pd.cut(x, bins = [150, 160, 170, 180, 190, 200], labels= ['150 unités', '160 unités', '170 unités', '180 unités', '190 unités'], right=False)
#Résultat de sortie
[190 unités,180 unités,170 unités,160 unités,170 unités, ...,160 unités,170 unités,180 unités, 190 unités, 190 unités]
Length: 12
Categories (5, object): [150 unités<160 unités<170 unités<180 unités<190 unités]
Lorsqu'il existe des données catégorielles, traitez-les comme une variable distincte pour chaque valeur Vous souhaiterez peut-être avoir des valeurs de 1 et 0. Par exemple, si les données de la colonne âge sont catégoriques comme suit:
Si vous voulez quelque chose comme le tableau suivant.
Ce tableau comporte des lignes dans leurs 20, 30 et 40 ans. Si l'âge de certaines données est dans les années 20, la valeur dans la colonne dans les années 20 sera 1. Les autres colonnes dans la trentaine et la quarantaine sont 0.
Une telle conversion en est une-Aussi connu sous le nom de codage à chaud.
Cette conversion est
les pandas obtiennent_C'est facile à faire avec la fonction des mannequins.
Dans l'exemple précédent, si les données de source de conversion ont le DataFrame suivant,
df = pd.DataFrame({'age': ['20 ans', '20 ans', '30 s', '30 s', 'Quarante', 'Quarante']})
Vous pouvez obtenir les données converties au format DataFrame en utilisant la fonction get_dummies comme suit.
pd.get_dummies(df['age'])
Si vous spécifiez le DataFrame lui-même dans la fonction get_dummies au lieu d'une colonne spécifique comme indiqué ci-dessous. Toutes les colonnes catégorielles et les colonnes de chaînes incluses dans le DataFrame Vous pouvez obtenir un DataFrame qui contient toutes des variables factices.
pd.get_dummies(df)
Pour faciliter la compréhension de la colonne source Si vous souhaitez conserver le nom de la colonne d'origine dans la colonne convertie Vous pouvez passer un préfixe à la fonction get_dummies.
pd.get_dummies(df['age'], prefix='age')
Ensuite, le préfixe suivant sera ajouté à la colonne des résultats de la conversion.
En résumé, ça ressemble à ça.
import pandas as pd
df = pd.DataFrame({'height': ['190 unités', '180 unités', '170 unités', '160 unités', '170 unités', '180 unités', '150 unités']})
pd.get_dummies(df['height'])
Comparez les données utilisées pour l'apprentissage automatique avec d'autres éléments de données Si des éléments de données contenant des valeurs relativement importantes sont mélangés, lorsqu'ils sont formés tels quels Je suis concerné par les éléments de données contenant de grandes valeurs Il peut ne pas être possible d'apprendre efficacement les paramètres du modèle analytique.
Dans de tels cas, mettez à l'échelle les éléments de données de tous les types numériques afin qu'ils correspondent à une certaine norme.
L'ajustement d'échelle le plus courant est un ajustement avec une moyenne de 0 et une variance de 1.
Par exemple, si vous disposez des données suivantes
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
En ajustant pour que la moyenne soit 0 et que la variance soit 1, les données seront comme suit.
scaled_x = [
-1.5666989, -1.21854359, -0.87038828, -0.52223297, -0.17407766,
0.17407766, 0.52223297, 0.87038828, 1.21854359, 1.5666989
]
Cet ajustement
scikit-Dans le module de prétraitement de learn
Ceci peut être facilement réalisé en utilisant la fonction d'échelle.
scaled_x = preprocessing.scale(x)
#mise à l'échelle convertie par la fonction de mise à l'échelle_x sera le tableau suivant comme auparavant.
scaled_x = [
-1.5666989, -1.21854359, -0.87038828, -0.52223297, -0.17407766,
0.17407766, 0.52223297, 0.87038828, 1.21854359, 1.5666989
]
Cliquez ici pour des exemples d'utilisation
import numpy as np
from sklearn import preprocessing
np.random.seed(0)
#Générer 10 données de distribution normale avec une moyenne de 50 et une variance de 10
data = np.random.normal(50, 10, 10)
preprocessing.scale(data)
#Résultat de sortie
array([ 1.06095671, -0.34936741, 0.2489091 , 1.55402992, 1.16798583,
-1.7736924 , 0.21928426, -0.91965619, -0.86987913, -0.33857068])
Lors de l'utilisation d'un modèle analytique qui suppose une distribution normale de variables explicatives, comme une analyse de régression multiple linéaire Vous souhaiterez peut-être transformer les données pour qu'elles se rapprochent d'une distribution normale.
Dans ce cas
Box-Effectue une conversion appelée conversion Cox.
La conversion Box-Cox convertit les données d'origine xi en yi comme suit:
λ est un paramètre de conversion. La valeur de λ est L'estimation la plus probable est faite pour que les données converties aient une distribution normale, ou n'importe quelle valeur peut être spécifiée.
Comme vous pouvez le voir dans la formule ci-dessus, x converti par conversion Box-Cox doit être un nombre positif. Cela est dû au fait que le journal (x) ne peut pas être calculé.
En utilisant la transformation Box-Cox, les données suivantes avec une distribution χ ^ 2 avec 2 degrés de liberté
Il se rapproche de la distribution normale comme suit.
Cette conversion Box-Cox
Ceci est facilement réalisé en utilisant la fonction boxcox du module stats de scipy.
y, lambda_value = stats.boxcox(x)
La fonction scipy boxcox a deux valeurs de retour. Dans le code ci-dessus, comme valeur de retour de la fonction
Tableau converti en y
Le λ estimé le plus probable est lambda_Il est stocké en valeur.
En résumé, ça ressemble à ça.
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
np.random.seed(0)
x = np.random.chisquare(3, 20000)
#Exemple d'utilisation
y, lambda_value = stats.boxcox(x)
plt.hist(y)
plt.show()
Que sont les données verticales et les données horizontales?
En tant que conversion de structure de données commune lors du prétraitement Il existe une conversion mutuelle entre les données verticales et les données horizontales.
C'est plus facile à comprendre avec un exemple, alors commençons par un exemple.
Voici les données des résultats des tests à l'école.
Ce sont des données horizontales. Parce que dans cette structure de données, par exemple, lorsque les informations augmentent en tant que sujet de test En effet, s'il s'agit d'une base de données, vous devez ajouter des colonnes horizontalement, et après avoir augmenté les colonnes, la table sera étendue horizontalement comme suit.
Données conservées horizontalement, par exemple, lorsqu'une personne les confirme avec un logiciel de calcul de table, etc. Il est souvent utilisé car il est facile à comprendre et il est facile d'effectuer une agrégation etc. intuitivement.
D'autre part, la structure des données doit être modifiée lors de l'ajout de nouvelles informations. (S'il s'agit d'une base de données, vous devez ajouter des colonnes à la table), de sorte que les données qui sont conservées horizontalement dans le système En implémentant une structure de données, lorsque les données requises changent Il est plus probable que cela implique des changements de table et des changements de logique, ce qui peut être inefficace.
Par conséquent, dans un tel cas, la structure de données suivante peut être utilisée.
Ce sont des données verticales. Dans cette structure, lorsque l'information augmente en tant que sujet de test Pas besoin de changer la structure des données (aucun ajout de colonne requis dans la base de données) Tout ce que vous avez à faire est d'augmenter les données verticalement comme suit.
À première vue, il peut sembler difficile d'appréhender la situation avec des données verticales. Lorsqu'il est mis en œuvre dans un système, il est facile de répondre aux changements de structure et de logique des données Il présente l'avantage de réduire les coûts de maintenance.
Dans l'analyse des données, cela dépend de la manière dont les données à acquérir ont été utilisées. Il peut s'agir de données détenues verticalement ou de données détenues horizontalement. Ensuite, selon le modèle d'analyse de données que vous utilisez, vous souhaiterez peut-être transformer la structure de données dans l'un ou l'autre format.
Lors de la conversion de données détenues verticalement en données détenues horizontalement
Utilisez la fonction de pivot des pandas.
Les arguments de la fonction pivot sont les suivants.
index :Colonne DataFrame d'origine utilisée comme valeur de clé à combiner en une seule ligne sous forme de colonne horizontale
columns:La colonne DataFrame d'origine utilisée pour se développer en tant que colonne horizontale
values :Colonne DataFrame d'origine à utiliser comme valeur de la colonne maintenue horizontalement
Plus précisément, si vous disposez des données suivantes,
Si vous utilisez la fonction de pivot comme suit,
df.pivot(index='Nom', columns='Matière', values='But')
Vous pouvez obtenir les résultats de conversion suivants.
Dans le DataFrame converti, la colonne spécifiée pour l'index de la fonction pivot est utilisée pour l'index de ligne. L'attribut de nom de l'index de ligne est "nom" et l'attribut de nom de l'index de colonne est "sujet". Vous souhaitez souvent traiter la valeur utilisée pour l'index comme une colonne DataFrame standard.
Dans ce cas, réinitialisez comme suit_Exécuter l'index.
pivoted_df = df.pivot(index='Nom',columns='Matière', values='But').reset_index()
Ensuite, la valeur d'index peut être traitée comme des données de colonne comme indiqué ci-dessous.
De plus, "sujet" reste comme attribut de nom de l'index de colonne. Cela n'a pas de sens, mais il a comme colonnes dans le DataFrame comme ceci: Remplacez l'objet Index pour le gérer.
pivoted_df.columns = pivoted_df.columns.set_names(None)
Le DataFrame final sera comme suit.
Lorsque le contenu est résumé, cela ressemble à ceci.
import pandas as pd
import numpy as np
data = pd.DataFrame({
'Opportunité': np.append(np.repeat('Opportunité1', 3), np.repeat('Opportunité2', 3)),
'Nom': np.tile(['Ishikawa', 'Kawai', 'Kimura'], 2),
'Degré de contribution': [50, 25, 25, 60, 20, 20]
})
#Exemple d'utilisation
pivoted_data = data.pivot(index='Opportunité', columns='Nom', values='Degré de contribution')
pivoted_data = pivoted_data.reset_index()
pivoted_data.columns = pivoted_data.columns.set_names(None)
pivoted_data
Avant le traitement
Après le traitement
Pour convertir des données maintenues horizontalement en données tenues verticalement
Utilisez la fonction de fonte des pandas.
Les principaux arguments de la fonction melt sont:
frame :DataFrame que vous souhaitez convertir
id_vars :Spécifiez la colonne à utiliser comme clé de conversion en tant que tableau
value_vars:Spécifiez la colonne à utiliser comme valeur après la conversion en tant que tableau
var_name :Après conversion, le nom de la colonne variable pour regrouper les colonnes de données horizontales
value_name:Le nom de la colonne qui sera la valeur après la conversion
Lorsqu'il y a les données suivantes comme données que vous souhaitez convertir
Si vous utilisez la fonction de fusion comme suit,
pd.melt(data, id_vars=['Nom'], value_vars=['langue nationale', 'Anglais', 'Math', 'Science', 'société'], var_name='Matière', value_name='But')
Vous pouvez obtenir les résultats de conversion suivants.
Cliquez ici pour des exemples d'utilisation
import pandas as pd
data = pd.DataFrame({
'Opportunité': ['Opportunité1', 'Opportunité2'],
'Kimura': [25, 20],
'Kawai': [25, 20],
'Ishikawa': [50, 60]
})
#Exemple d'utilisation
pd.melt(data, id_vars=['Opportunité'], value_vars=['Kimura', 'Kawai', 'Ishikawa'], var_name='Nom', value_name='Degré de contribution')
Avant le traitement
Après le traitement
Recommended Posts