Faites correspondre la distribution de chaque groupe en Python

but de fond

Lors de la création d'un modèle d'apprentissage automatique avec certaines données de table, il y avait une variable que je voulais éliminer la différence entre les classes, j'ai donc implémenté ce processus.

Méthode

Le sous-échantillonnage est effectué pour chaque attribut dans chaque section spécifiée. Cette fois, nous avons utilisé des données titanesques de mer pour faire correspondre le nombre de personnes à chaque âge d'adolescent entre les groupes «oui» et «non» avec vivant. ..

environnement

OS:Windows10 conda:4.8.3 python:3.8.3 pandas:0.25.3 matplotlib:3.3.1 seaborn:0.11.0

la mise en oeuvre

L'acquisition des données

Obtenez les données comme suit.

load_dataset.py


import seaborn as sns
data = sns.load_dataset("titanic")

Confirmation des données avant correction

Concernant les données acquises, la répartition par âge de chaque adolescent par vivant (statut de survie) est la suivante.

display_gragh.py


import matplotlib.pyplot as plt
sns.set_style(style='darkgrid')
fig, ax = plt.subplots(1,1, figsize=(4,4))
ax.set_xticks(range(0,100,10))
ax.set_ylim(0,150)
ax.set_ylabel('the number of people')
sns.distplot(data['age'][data['alive']=='yes'], kde=False, rug=False, bins=range(0,100,10),
             label='alive', ax=ax)
sns.distplot(data['age'][data['alive']=='no'], kde=False, rug=False, bins=range(0,100,10),
             label='dead', ax=ax)
ax.legend()
plt.show()

image.png

Appariement de la distribution par âge

J'ai créé la fonction suivante pour la correspondance des données.

import pandas as pd
def adjust_number(data, target_column, attribute, period):
    '''
    target_column:Nom de colonne à ajuster
    attribute    :Attribut à ajuster (Ajuster le nombre de colonnes cibles entre ces attributs)
    period       :Largeur de section à régler
    '''

    ##Réglage de la section initiale
    #La limite inférieure commence à 0 si la valeur minimale du groupe de données cible est égale ou supérieure à 0, et commence à partir de la valeur minimale si elle est inférieure à 0.
    lower = 0 if data[target_column].min() >= 0 else data[target_column].min()

    #La limite supérieure est la limite inférieure + la largeur de la section-À partir de 1
    upper = lower+period-1

    data_adjusted = pd.DataFrame() #Pour stocker les données ajustées
    maximum = data[target_column].max() #Obtenir la valeur maximale du groupe de données à ajuster

    #Répétez jusqu'à ce que la limite inférieure dépasse la valeur maximale
    while lower <= maximum:
        #Extraire les données de la section cible
        data_in_range = data[(lower<=data.loc[:,target_column]) & (data.loc[:,target_column]<=upper)]
        
        #S'il n'y a pas de données dans la section cible ou s'il existe un attribut pour lequel il n'y a pas de données dans la section cible, passez à la section suivante
        #(En raison du sous-échantillonnage, si le nombre de données d'un attribut est égal à 0, tout sera égal à 0)
        if len(data_in_range) == 0 or set(data[attribute]) != set(data_in_range[attribute]):
            lower += period
            upper += period
            continue
    
        else:
            #Acquérir le nombre de données pour chaque attribut dans la section cible
            counts = data_in_range[attribute].value_counts()
        
            #Sous-échantillonnage pour chaque attribut
            sample = pd.DataFrame()
            for att in counts.index:            
                sample = data_in_range[data_in_range[attribute]==att].sample(n=counts.min(), random_state=42)
                
                #Concaténer les données ajustées de la section cible aux données ajustées stockées
                data_adjusted = pd.concat([data_adjusted, sample],axis=0, ignore_index=True)
        
        #Vers la section suivante
        lower += period
        upper += period
    
    return data_adjusted

La répartition par âge de chaque adolescent après le traitement avec cette fonction (après appariement des âges) est la suivante. Il est affiché à nouveau avant la correction.

data_adjusted = adjust_number(data, target_column='age', attribute='alive', period=10)

fig, ax = plt.subplots(1,1, figsize=(4,4))
ax.set_xticks(range(0,100,10))
ax.set_ylim(0,150)
ax.set_ylabel('the number of people')
sns.distplot(data_adjusted['age'][data_adjusted['alive']=='yes'], kde=False, rug=False, bins=range(0,100,10),
             label='alive', ax=ax)
sns.distplot(data_adjusted['age'][data_adjusted['alive']=='no'], kde=False, rug=False, bins=range(0,100,10),
             label='dead', ax=ax)
ax.legend()
plt.show()

▼ Après correction ▼ Avant correction image.png     image.png

J'ai pu le corriger en toute sécurité.

Application 1 (changer la largeur de la section)

Même si j'ai changé la largeur de section de 10 à 5 (correspondant au nombre de personnes tous les 5 ans), cela a fonctionné sans problème.

data_adjusted = adjust_number(data, target_column='age', attribute='alive', period=5)

▼ Après correction ▼ Avant correction image.png     image.png

Application 2 (modification de la cible d'ajustement)

Il n'y a pas de problème même si l'objectif d'ajustement est changé en tarif.

data_adjusted = adjust_number(data, target_column='fare', attribute='alive', period=30)

▼ Après correction ▼ Avant correction image.png     image.png

Application 3 (modifier l'attribut cible)

Il n'y a pas de problème même si l'attribut cible est changé en sexe (genre).

data_adjusted = adjust_number(data, target_column='age', attribute='sex', period=10)

▼ Après correction ▼ Avant correction image.png     image.png

C'est tout. Merci pour votre visite.

Recommended Posts

Faites correspondre la distribution de chaque groupe en Python
Vérifiez la nature atrophique de la distribution de probabilité en Python
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
Obtenez l'index de chaque élément de la matrice de confusion en Python
Vérifiez le comportement du destroyer en Python
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Statut de chaque système de traitement Python en 2020
Essayez de transcrire la fonction de masse stochastique de la distribution binomiale en Python
Sortie du nombre de cœurs de processeur en Python
Distribution logistique en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Récupérer l'appelant d'une fonction en Python
Afficher le résultat du traitement de la géométrie en Python
le zen de Python
Copiez la liste en Python
Découvrez la fraction de la valeur saisie en python
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Comparez la somme de chaque élément dans deux listes avec la valeur spécifiée en Python
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Comment obtenir le nombre de chiffres en Python
[python] Récupère la liste des classes définies dans le module
Comprenez attentivement la distribution exponentielle et dessinez en Python
Tracer et comprendre la distribution normale multivariée en Python
L'histoire de FileNotFound en Python open () mode = 'w'
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Implémenter la solution de l'algèbre de Riccati en Python
Comprendre attentivement la distribution de Poisson et dessiner en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Utilisons les données ouvertes de "Mamebus" en Python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
[Python] Affiche toutes les combinaisons d'éléments de la liste
Regrouper par éléments consécutifs d'une liste en Python
Obtenez l'URL de la destination de la redirection HTTP en Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Vers la retraite de Python2
Trouver des erreurs en Python
Écrire une distribution bêta en Python
Jugement d'équivalence d'objet en Python
Générer une distribution U en Python
Implémentation du tri rapide en Python
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Sortie de la table spécifiée de la base de données Oracle en Python vers Excel pour chaque fichier
Comment compter le nombre d'occurrences de chaque élément de la liste en Python avec poids
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)
Essayez de gratter les données COVID-19 Tokyo avec Python
Découvrez la largeur apparente d'une chaîne en python