[PYTHON] Visualisez les données et saisissez la corrélation en même temps

introduction

Lors de l'analyse des données, je pense que vous utiliserez des graphiques pour visualiser les données. À ce moment-là, il serait pratique que les statistiques montrant la corrélation entre les deux variables puissent être affichées en même temps. Par conséquent, nous avons permis d'afficher les statistiques appropriées sur le graphique approprié en fonction du contenu de la variable (catégorie ou valeur numérique).

Avis jusqu'à présent

Voici un résumé des méthodes graphiques appropriées pour chaque contenu variable et les statistiques qui représentent les corrélations que j'ai couvertes jusqu'à présent. Veuillez consulter le lien ci-dessous pour plus de détails. sns_corr_summary.png Comment visualiser les données par variable explicative et variable objective Comment trouver la corrélation pour les variables catégorielles

Mettez les bonnes statistiques sur le bon graphique

Modifiez la méthode précédemment créée «Dessinez le bon graphe en fonction du contenu de la variable (catégorie ou nombre)» et mettez les bonnes statistiques sur le graphe de droite (voir: [pandas DataFrame a raison] J'ai créé une méthode pour sélectionner et visualiser automatiquement divers graphiques](https://qiita.com/mr160/items/d89ec84bfab865562a88)).

import matplotlib.pyplot as plt
import seaborn as sns
import scipy.stats as st

def visualize_data(data, target_col, categorical_keys=None):
     
    keys=data.keys()
        
    if categorical_keys is None:
        
        categorical_keys=keys[[is_categorical(data, key) for key in keys]]
   
    for key in keys:
        
        if key==target_col:
            continue
            
        length=10
        subplot_size=(length, length/2)
        
        if (key in categorical_keys) and (target_col in categorical_keys):

            r=cramerV(key, target_col, data)
            
            fig, axes=plt.subplots(1, 2, figsize=subplot_size)
            sns.countplot(x=key, data=data, ax=axes[0])
            sns.countplot(x=key, data=data, hue=target_col, ax=axes[1])
            plt.title(r)
            plt.tight_layout()
            plt.show()

        elif (key in categorical_keys) and not (target_col in categorical_keys):

            r=correlation_ratio(cat_key=key, num_key=target_col, data=data)
            
            fig, axes=plt.subplots(1, 2, figsize=subplot_size)
            sns.countplot(x=key, data=data, ax=axes[0])
            sns.violinplot(x=key, y=target_col, data=data, ax=axes[1])
            plt.title(r)
            plt.tight_layout()
            plt.show()

        elif not (key in categorical_keys) and (target_col in categorical_keys):

            r=correlation_ratio(cat_key=target_col, num_key=key, data=data)
            
            fig, axes=plt.subplots(1, 2, figsize=subplot_size)            
            sns.distplot(data[key], ax=axes[0], kde=False)
            g=sns.FacetGrid(data, hue=target_col)
            g.map(sns.distplot, key, ax=axes[1], kde=False)
            axes[1].set_title(r)
            axes[1].legend()            
            plt.tight_layout()
            plt.close()
            plt.show()

        else:

            r=data.corr().loc[key, target_col]
            
            sg=sns.jointplot(x=key, y=target_col, data=data, height=length*2/3)
            plt.title(r)
            plt.show()            

De plus, la méthode suivante est utilisée en chemin.

def is_categorical(data, key):  #Déterminer s'il s'agit d'une variable catégorielle
    
    col_type=data[key].dtype
    
    if col_type=='int':
        
        nunique=data[key].nunique()
        return nunique<6
    
    elif col_type=="float":
        return False
    
    else:
        return True

def correlation_ratio(cat_key, num_key, data):  #Trouvez le rapport de corrélation
    
    categorical=data[cat_key]
    numerical=data[num_key]
    
    mean=numerical.dropna().mean()
    all_var=((numerical-mean)**2).sum()
    
    unique_cat=pd.Series(categorical.unique())
    unique_cat=list(unique_cat.dropna())
    
    categorical_num=[numerical[categorical==cat] for cat in unique_cat]
    categorical_var=[len(x.dropna())*(x.dropna().mean()-mean)**2 for x in categorical_num]    

    r=sum(categorical_var)/all_var
    
    return r

def cramerV(x, y, data):  #Trouvez le nombre de liens
    
    table=pd.crosstab(data[x], data[y])
    x2, p, dof, e=st.chi2_contingency(table, False)
    
    n=table.sum().sum()
    r=np.sqrt(x2/(n*(np.min(table.shape)-1)))

    return r

Essayez de l'appliquer aux données titanesques (seuls les résultats partiels sont affichés).

train_data=pd.read_csv("train.csv")
train_data=train_data.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1)

categories=["Survived", "Pclass", "Sex", "Embarked"]
visualize_data(train_data, "Survived", categories)
countplot_corr.png distplot_corr.png

finalement

J'ai essayé de résumer les méthodes que j'ai élaborées jusqu'à présent. Vous pouvez maintenant visualiser les données et comprendre la corrélation à la fois. Le code source est sur github, alors n'hésitez pas à l'utiliser!

Recommended Posts

Visualisez les données et saisissez la corrélation en même temps
Tracez plusieurs cartes et données en même temps avec matplotlib de Python
wxPython: dessin simultané d'animation et de dessin graphique
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ②
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ①
Parcourir .loc et .iloc en même temps dans pandas DataFrame
Boucle les variables en même temps dans le modèle
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Procédure pour changer le nom de la table et le nom de la colonne du modèle Django en même temps
Fonction intégrée Python ~ divmod ~ Obtenons le quotient et le reste de la division en même temps
[Python 3.8 ~] Réécrire des tableaux etc. en même temps que la définition [astuces]
[Statistiques] Visualisez et comprenez la méthode Hamiltonian Monte Carlo avec animation.
À propos des données de séries chronologiques et du surentraînement
python Remarque: enumerate () -Obtenir l'index et l'élément de la liste en même temps et tourner pour l'instruction
Configurer un serveur qui traite plusieurs connexions en même temps
[Python] Comment ouvrir deux fichiers ou plus en même temps
Visualisez facilement le coefficient de corrélation entre les variables
Appelez le débogueur python à tout moment
Comprendre l'arbre de décision et classer les documents
Visualisez les données d'exportation du journal Piyo
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Python open et io.open sont les mêmes
Visualisons la relation entre le salaire moyen et l'industrie avec des données XBRL et seaborn! (7/10)
Assurez-vous que le prétraitement au moment de la création du modèle de prédiction et de la prédiction est aligné
Conversion de type de plusieurs colonnes de pandas DataFrame avec un type en même temps
Transformez plusieurs listes avec l'instruction for en même temps en Python
Visualisez les données d'itinéraires ferroviaires et résolvez les problèmes d'itinéraires les plus courts (Python + Pandas + NetworkX)
[Python] Mémo de conversion entre les données temporelles et les données numériques
Visualisez de manière interactive les données avec Treasure Data, Pandas et Jupyter.
Lissage des séries temporelles et des données de forme d'onde 3 méthodes (lissage)
Au moment de la mise à jour de python avec ubuntu
Comprendre l'espace de noms TensorFlow et les variables partagées principales
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Il est temps de réfléchir sérieusement à la définition et aux compétences des data scientists