[PYTHON] Comment trouver la corrélation pour les variables catégorielles

introduction

Lors de l'analyse des données, vous examinerez la corrélation entre les variables dans les données données. Vous pouvez vérifier le coefficient de corrélation pour la corrélation entre les valeurs numériques, mais que se passe-t-il si l'une ou les deux sont des catégories? Je l'ai recherché, je vais donc le résumer.

Comment vérifier la corrélation

Numérique vs numérique

Dans ce cas, c'est célèbre et vous pouvez vérifier le coefficient de corrélation. La définition du coefficient de corrélation est la suivante.

r=\frac{\sum_{i}(x_{i}-\bar{x})(y_{i}-\bar{y})}{\sqrt{\sum_{i}(x_{i}-\bar{x})^2}\sqrt{\sum_{i}(y_{i}-\bar{y})^2}}

Pour trouver le coefficient de corrélation en python, utilisez la méthode corr () de pandas.DataFrame.

import numpy as np
import pandas as pd

x=np.random.randint(1, 10, 100)
y=np.random.randint(1, 10, 100)

data=pd.DataFrame({'x':x, 'y': y})

data.corr()
corr1.png

Si la valeur est 0, il n'y a pas de corrélation, si elle est proche de 1, il y a une corrélation positive, et si elle est proche de -1, il y a une corrélation négative.

Catégorie vs numérique

Il est représenté par une statistique appelée le rapport de corrélation. La définition est la suivante.

r=\frac{\sum_{Catégorie}Catégorie件数\times(Catégorieの平均-Moyenne générale)^2}{Somme des carrés de l'écart total}

Veuillez consulter ici pour un exemple concret. La molécule représente "la distance entre chaque catégorie". Plus les catégories sont éloignées, plus la molécule est grosse et plus la corrélation est forte. corr_ratio.png

Ce rapport de corrélation signifie également aucune corrélation lorsqu'il est égal à 0 et une forte corrélation positive lorsqu'il s'approche de 1.

En python, il est calculé comme suit (voir ici).

def correlation_ratio(cat_key, num_key, data):
    
    categorical=data[cat_key]
    numerical=data[num_key]
    
    mean=numerical.dropna().mean()
    all_var=((numerical-mean)**2).sum()  #Somme des carrés de l'écart total
    
    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]  
    #Nombre de catégories × (moyenne des catégories-Moyenne générale)^2

    r=sum(categorical_var)/all_var
    
    return r

Catégorie vs catégorie

Nous utiliserons une statistique appelée le nombre d'associations dans Klamer. La définition est

r=\sqrt{\frac{\chi^2}{n(k-1)}}

Cependant, $ \ chi ^ {2} $ est la distribution χ-carrés, n est le nombre d'éléments de données et k est celui avec le plus petit nombre de catégories. Veuillez vous référer à ici pour la distribution χ-square. En gros, c'est une quantité qui exprime à quel point la distribution de chaque catégorie est différente de la distribution globale. Encore une fois, s'il est proche de 0, il n'y a pas de corrélation, et s'il est proche de 1, il y a une corrélation positive.

Pour calculer avec python, procédez comme suit ([here](https://qiita.com/shngt/items/45da2d30acf9e84924b7#%E3%82%AF%E3%83%A9%E3%83%A1%E3] % 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0).

import scipy.stats as st

def cramerV(x, y, data):
    
    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

Obtenez chaque index collectivement

Et, ce seul serait le deuxième breuvage de l'article précédent, j'ai donc créé une méthode pour calculer chaque index collectivement pour DataFrame. Vous n'avez pas à le rechercher un par un!

def is_categorical(data, key):
    
    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 get_corr(data, categorical_keys=None):
    
    keys=data.keys()
        
    if categorical_keys is None:
        
        categorical_keys=keys[[is_categorycal(data, key) for ke in keys]]
        
    corr=pd.DataFrame({})
    corr_ratio=pd.DataFrame({})
    corr_cramer=pd.DataFrame({})

    for key1 in keys:
        for key2 in keys:

            if (key1 in categorical_keys) and (key2 in categorical_keys):

                r=cramerV(key1, key2, data)
                corr_cramer.loc[key1, key2]=r                

            elif (key1 in categorical_keys) and (key2 not in categorical_keys):

                r=correlation_ratio(cat_key=key1, num_key=key2, data=data)
                corr_ratio.loc[key1, key2]=r                

            elif (key1 not in categorical_keys) and (key2 in categorical_keys):

                r=correlation_ratio(cat_key=key2, num_key=key1, data=data)
                corr_ratio.loc[key1, key2]=r                

            else:

                r=data.corr().loc[key1, key2]
                corr.loc[key1, key2]=r                    

    return corr, corr_ratio, corr_cramer

La clé qui est une variable catégorielle est automatiquement déterminée à partir du type de variable, sauf indication contraire.

Appliquons-le aux données titanesques.

data=pd.read_csv(r"train.csv")
data=data.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1)
category=["Survived", "Pclass", "Sex", "Embarked"]

corr, corr_ratio, corr_cramer=get_corr(data, category)
corr
corr2.png
corr_ratio
corr_ratio2.png
corr_cramer
corr_cramer2.png

De plus, il peut être visualisé avec la carte thermique Seaborn.

import seaborn as sns
sns.heatmap(corr_cramer, vmin=-1, vmax=1)

corr_cramer_heatmap.png

finalement

L'explication de chaque statistique est devenue désordonnée, veuillez donc consulter la page mentionnée dans la référence. Même si je le mets ensemble, je finis par l'oublier et le chercher, alors j'essaie de créer une méthode qui automatise le plus possible. La source de cette méthode est également sur github, alors n'hésitez pas à l'utiliser.

référence

[Calculez la relation entre les variables de différentes échelles (Python)](https://qiita.com/shngt/items/45da2d30acf9e84924b7#%E3%82%AF%E3%83%A9%E3%83%A1% E3% 83% BC% E3% 83% AB% E3% 81% AE% E9% 80% A3% E9% 96% A2% E4% BF% 82% E6% 95% B0) Analyse de corrélation Rapport de corrélation Test de Kai-carré / Nombre de relations Cramer

Recommended Posts

Comment trouver la corrélation pour les variables catégorielles
Comment trouver la zone du diagramme de Boronoi
Comment utiliser MkDocs pour la première fois
Comment utiliser le générateur
Comment définir les variables Go
Comment trouver la distance de Maharanobis
Comment utiliser le décorateur
Comment augmenter l'axe
Comment démarrer la première projection
[python] Comment utiliser Matplotlib, une bibliothèque pour dessiner des graphiques
[Pour les débutants] Comment utiliser l'instruction for sous Linux (variables, etc.)
Comment définir plusieurs variables dans une instruction Python for
Je ne savais pas comment utiliser l'instruction [python] for
Comment trouver le coefficient de mise à l'échelle d'une ondelette bipolaire
Comment trouver la somme / somme cumulée pour chaque groupe à l'aide de DataFrame dans Spark [version Python]
Comment définir des variables pouvant être utilisées dans toute l'application Django ~ Utile pour les modèles, etc. ~
Comment calculer le coefficient d'autocorrélation
Comment utiliser la fonction zip
[Pour les non-programmeurs] Comment marcher Kaggle
Comment lire l'ensemble de données SNLI
Comment obtenir la version Python
Comment écraser la sortie sur la console
Comment utiliser le module ConfigParser
Comment exécuter la commande sed plusieurs fois à l'aide de l'instruction for
Comment définir la résolution de sortie pour chaque image clé dans Blender
Comment modifier le niveau de journalisation d'Azure SDK pour Python
Comment obtenir le pilote d'imprimante pour Oki Mac sous Linux
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment trouver l'adresse mémoire de la valeur de la trame de données Pandas
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
[AtCoder] Comment trouver le coefficient binomial nCk mod.p [D --Knight]
Comment trouver lorsque vous ne connaissez pas le répertoire d'installation Java
Comment étudier pour le test G de Deep Learning Association (pour les débutants) [version 2020]
Comment afficher la barre de progression (tqdm)
Visualisez facilement le coefficient de corrélation entre les variables
Comment définir dynamiquement des variables en Python
Comment vérifier la version de Django
Comment créer un fichier * .spec pour pyinstaller.
Comment résoudre le problème d'emballage du bac
Découvrez les dates du tournoi fou
Comment régler l'heure du serveur sur l'heure japonaise
Comment connaître le nombre de processeurs sans utiliser la commande sar
Comment mettre à jour manuellement le cache AMP
[Linux] Comment utiliser la commande echo
[Python] Organisation de l'utilisation des instructions
Comment installer le sous-système Windows pour Linux
Comment accéder à la banque de données de l'extérieur
Comment trouver des fichiers volumineux sous Linux
Comment utiliser l'authentification par empreinte digitale pour KDE
[Django] Comment passer des valeurs directement des balises de modèle aux variables JavaScript
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
[Bash] Passez le contenu du fichier aux variables pour chaque colonne avec while read
Comment trouver le coefficient de la courbe approximative passant par les sommets en Python
Liste de contrôle pour éviter de transformer les éléments de array of numpy avec for
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment attribuer plusieurs valeurs à la barre de couleurs Matplotlib