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).
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. Comment visualiser les données par variable explicative et variable objective Comment trouver la corrélation pour les variables catégorielles
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)
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