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.
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()
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.
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.
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
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
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
corr_ratio
corr_cramer
De plus, il peut être visualisé avec la carte thermique Seaborn.
import seaborn as sns
sns.heatmap(corr_cramer, vmin=-1, vmax=1)
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.
[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