[PYTHON] Vérifiez la corrélation avec le Titanic de Kaggle (kaggle③)

introduction

Voici l’histoire de la participation au concours Kaggle </ b> pour la première fois. Dans Last "Learning with Kaggle's Titanic" J'ai parcouru toutes les étapes pour apprendre et soumettre, mais j'ai perdu les exemples de données (76%). Cette fois, je voudrais scruter les données afin d'augmenter le score dans le "Titanic competition".

table des matières

  1. À propos de la corrélation
  2. Échelle variable
  3. Coefficient de corrélation
  4. Examiner le coefficient de corrélation du Titanic
  5. Résultat

référence Histoire

1. À propos de la corrélation

La dernière fois a récupéré les données d'entraînement de manière appropriée et les a entraînées en utilisant "pclass", "sex", "Age" et "fare". Cette fois, je souhaite sélectionner les données liées à l'apprentissage en fonction des motifs.

Un diagramme de dispersion est utile pour vérifier la corrélation. Le diagramme de dispersion est le suivant. 20191221_02.png

Si le diagramme de dispersion ressemble à celui ci-dessus, vous pouvez voir qu'il y a une pertinence de l'élévation de l'épaule droite. Par exemple, si l'axe horizontal est la hauteur et l'axe vertical est le poids, plus la personne est grande, plus le poids est lourd, donc le diagramme de dispersion est comme indiqué ci-dessus. (Je pense que ce sera.)

Cependant, le diagramme de dispersion est efficace lorsque l'axe horizontal et l'axe vertical sont des variables quantitatives. Lors de la création d'un diagramme de dispersion du «sexe» du Titanic (variable qualitative) et de la «survie» (variable qualitative) Il existe deux types de sexe sur l'axe horizontal, «masculin» et «féminin», et deux types de survie sur l'axe vertical, «0» et «1». Seuls quatre points sont dispersés, ce qui n'est pas très significatif. La méthode d'examen de la corrélation dépend du type de données (variable quantitative, variable qualitative).

2. Échelle variable

Plus tôt, les termes variables quantitatives et qualitatives sont apparus. Les données (variables) à traiter sont classées dans les échelles suivantes en fonction de leurs propriétés.

Type de variable Type d'échelle Signification Exemple
variables qualitatives échelle nominale échelle utilisée pour distinguer sexe, préfecture
Echelle d'ordre Echelle qui n'a de sens que pour les relations d'amplitude Rang, intensité sismique
Variable quantitative Échelle d'intervalle Les échelles sont régulièrement espacées et les intervalles sont significatifs td> Température, AD
Échelle proportionnelle Intervalles et rapports significatifs (0 est l'origine) Hauteur, prix

Le diagramme de dispersion est efficace lorsque les deux cibles de comparaison sont des «variables quantitatives». Je pense qu'il est également efficace pour les «variables quantitatives» et les «échelles d'ordre». Pas très efficace si l'on est une échelle nominale. Par exemple, si la «survie (0, 1)» et le «tarif» du Titanic sont tracés sur un nuage de points, ce sera comme suit.

20191221_03.png

L'axe horizontal (survie) est une valeur binaire de 0 et 1, et la corrélation n'est pas claire. Pour les échelles nominales, les nuages de points ne seront probablement pas très efficaces.

En plus du diagramme de dispersion, la corrélation est parfois exprimée sous forme de «coefficient de corrélation». Jetons un coup d'oeil ici.

3. Coefficient de corrélation

Le coefficient de corrélation est utilisé comme indicateur de la relation entre les deux ensembles de données. numpy a une fonction pour trouver le coefficient de corrélation.

numpy.corrcoef(x, y)[0, 1]

Le corrcoef de numpy est correctement appelé "coefficient de corrélation de facteur de produit de Pearson". Le «coefficient de corrélation du facteur de produit de Pearson» est utilisé pour la corrélation entre les «variables quantitatives» décrites plus loin. Les coefficients de corrélation comprennent également le «nombre d'associations de Kramer» et le «rapport de corrélation», qui sont utilisés selon l'échelle. J'ai résumé l'échelle de la variable et le coefficient de corrélation correspondant.

Variable 1 Variable 2 Coefficient de corrélation utilisé Variable Titanic
Échelle de nom Échelle de nom Nombre d'associations Klamer Sexe, numéro de ticket, numéro de chambre, Port d'embarquement
Echelle de commande Ratio de corrélation de rang Classe de ticket
Variables quantitatives Rapport de corrélation Âge, fratrie, parch, tarif

L'échantillon de code "Nombre d'associations de Klamer" et "Rapport de corrélation" est le suivant. Je pense que le «rapport de corrélation de rang» est presque le même que le rapport de corrélation.

import numpy 
import pandas 
######################################
#Nombre d'associations Klamer
# Cramer's coefficient of association
# 0.5  >= :Très forte corrélation
# 0.25 >= :Corrélation forte
# 0.1  >= :Corrélation légèrement faible
# 0.1 < :Aucune corrélation
######################################
def cramersV(x, y):
    """
    Calc Cramer's V.

    Parameters
    ----------
    x : {numpy.ndarray, pandas.Series}
    y : {numpy.ndarray, pandas.Series}
    """
    table = numpy.array(pandas.crosstab(x, y)).astype(numpy.float32)
    n = table.sum()
    colsum = table.sum(axis=0)
    rowsum = table.sum(axis=1)
    expect = numpy.outer(rowsum, colsum) / n
    chisq = numpy.sum((table - expect) ** 2 / expect)
    return numpy.sqrt(chisq / (n * (numpy.min(table.shape) - 1)))

######################################
#Rapport de corrélation
# Correlation ratio
# 0.5  >= :Très forte corrélation
# 0.25 >= :Corrélation forte
# 0.1  >= :Corrélation légèrement faible
# 0.1 < :Aucune corrélation
######################################
def CorrelationV(x, y):
    """
    Calc Correlation ratio 

    Parameters
    ----------
    x : nominal scale {numpy.ndarray, pandas.Series}
    y : ratio   scale {numpy.ndarray, pandas.Series}
    """
    variation = ((y - y.mean()) ** 2).sum()
    inter_class = sum([((y[x == i] - y[x == i].mean()) ** 2).sum() for i in numpy.unique(x)])
    correlation_ratio = inter_class / variation
    return 1 - correlation_ratio

Le coefficient de corrélation est un nombre de -1 à 1. Le poids de la valeur change en fonction de chaque formule. La ligne directrice pour la valeur du coefficient de corrélation est la suivante.

〇 Nombre d'associations et rapport de corrélation de Kramer

valeur Corrélation
0.5 >= Très fortement corrélé
0.25 >= Il existe une forte corrélation
0.1 >= Il y a une corrélation légèrement faible
0.1 < Aucune corrélation

〇 Coefficient de corrélation du facteur produit de Pearson

valeur Corrélation
0.7 >= Très fortement corrélé
0.4 >= Il existe une forte corrélation
0.2 >= Il y a une corrélation légèrement faible
0.1 < Aucune corrélation

En plus du coefficient de corrélation, l'échelle nominale peut également montrer la corrélation en représentant graphiquement le «tableau croisé».

4. Examiner le coefficient de corrélation du Titanic

Maintenant, regardons la corrélation entre le coefficient de corrélation et le graphique pour chaque variable Titanic. Créez un "Nouveau carnet de notes" dans Titanic et définissez le "Nombre d'associations Klamer" et le "Rapport de corrélation" ci-dessus. Ensuite, lisez et préparez les données d'entraînement avec le code suivant.

import matplotlib.pyplot as plt

# train.Charger csv
# Load train.csv
df = pandas.read_csv('/kaggle/input/titanic/train.csv')

##############################
#Prétraitement des données
#Gérer les valeurs manquantes
# Data preprocessing
# Fill or remove missing values
##############################
#Nan d'âge-Convertir en 1
# Convert age Nan to -1
df = df.fillna({'Age':-1})
#Embarqué Nan-Convertir en 1
# Convert Embarked Nan to -1
df = df.fillna({'Embarked':'null'})

##############################
#Prétraitement des données
#Quantifier l'étiquette (nom)
# Data preprocessing 
# Digitize labels
##############################
from sklearn.preprocessing import LabelEncoder
#Quantifier le sexe à l'aide de Label Encoder
# Digitize gender using LabelEncoder
encoder_sex = LabelEncoder()
df['Sex'] = encoder_sex.fit_transform(df['Sex'].values)
encoder_embarked = LabelEncoder()
df['Embarked'] = encoder_embarked.fit_transform(df['Embarked'].values)

Pclass (classe de billet)

La classe de billet est une «échelle de commande». Vérifiez avec le rapport de corrélation.

######################################################
#Analyse des données 1
#Examiner la corrélation entre Survived et Pclass (échelle nominale)
# Data analysis 1
# Examine the correlation between Survived and Pclass(nominal scale)
######################################################
CorrelationV(df['Survived'], df['Pclass'])
0.11456941170524215

Il est devenu "faiblement corrélé". Représentons graphiquement le tableau croisé.

cross_pclass = pandas.crosstab(df['Survived'], df['Pclass'])
cross_pclass.T.plot(kind='bar', stacked=True)
plt.show()

20191222_01.png

Lorsque la classe est 1, la survie "1" dépasse 50%. Lorsque la classe devient 3, la survie "1" est-elle d'environ 1/4? Le coefficient de corrélation est faible à 0,1, mais en regardant le graphique, il semble qu'il y ait un bon degré de corrélation.

Nom

Je vais sauter le nom maintenant. L'ordre peut changer, mais il faut aussi "observer les données". Je voudrais évoquer mon nom dans la section "Données d'observation", dont je reviendrai.

Sexe

Le sexe est une «échelle nominale». Vérifiez le nombre d'associations Klamer.

######################################################
#Analyse des données 2
#Examiner la corrélation entre survécu et sexe (échelle nominale)
# Data analysis 2
# Examine the correlation between Survived and Sex(nominal scale)
######################################################
cramersV(df['Survived'], df['Sex'])
0.5433513740027712

C'est devenu "une très forte corrélation". Représentons graphiquement le tableau croisé.

cross_sex = pandas.crosstab(df['Survived'], df['Sex'])
cross_sex.T.plot(kind='bar', stacked=True)
plt.show()

20191222_02.png

Certes, les résultats diffèrent grandement entre les hommes et les femmes.

Âge

L'âge est une «échelle d'ordre». Vérifiez avec le rapport de corrélation.

######################################################
#Analyse des données 3
#Examiner la corrélation entre les survivants et l'âge (échelle proportionnelle)
# Data analysis 3
# Examine the correlation between Survived and Age(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Age'])
0.0001547299039139638

"Aucune corrélation". Représentons graphiquement le tableau croisé. Graphique par incréments de 10 ans.

cross_age = pandas.crosstab(df['Survived'], round(df['Age'],-1))
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_03.png

J'ai l'impression qu'il y a peu de survie "1" après 50 ans, mais le résultat est "pas de corrélation". Il était surprenant que l'âge ait peu d'effet.

SibSp (nombre de frères et sœurs / conjoints)

SibSp est une "variable quantitative (échelle proportionnelle)". Vérifiez avec le rapport de corrélation.

######################################################
#Analyse des données 4
#Examiner la corrélation entre Survived et SibSp (échelle proportionnelle)
# Data analysis 4
# Examine the correlation between Survived and SibSp(ratio scale)
######################################################
CorrelationV(df['Survived'], df['SibSp'])
0.0012476789275327471

"Aucune corrélation". Représentons graphiquement le tableau croisé.

cross_age = pandas.crosstab(df['Survived'], df['SibSp'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_05.png

Aucune corrélation significative ne peut être observée en regardant le graphique.

Parch (nombre de parents / enfants)

Parch est une "variable quantitative (échelle proportionnelle)". Vérifiez avec le rapport de corrélation.

######################################################
#Analyse des données 5
#Examiner la corrélation entre Survived et Parch (échelle proportionnelle)
# Data analysis 5
# Examine the correlation between Survived and Parch(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Parch'])
0.006663360100801152

"Aucune corrélation". Représentons graphiquement le tableau croisé.

cross_age = pandas.crosstab(df['Survived'], df['Parch'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191222_05.png

Aucune corrélation significative ne peut être observée ici non plus.

Ticket (numéro de ticket)

Je vais également sauter le numéro de billet cette fois. Je voudrais aborder ce sujet dans la section "Observation des données", dont je reviendrai.

Tarif

Le tarif est une "variable quantitative (échelle proportionnelle)". Vérifiez avec le rapport de corrélation. Après la normalisation, vérifiez le rapport de corrélation. (Je pense que le résultat sera le même sans standardisation)

##############################
#Prétraitement des données
#Normaliser les nombres
# Data preprocessing
# Standardize numbers
##############################
from sklearn.preprocessing import StandardScaler

#Standardisation
# Standardize numbers
standard = StandardScaler()
df_std = pandas.DataFrame(standard.fit_transform(df[['Pclass', 'Sex', 'Fare']]), columns=['Pclass', 'Sex', 'Fare'])

#Tarif standard
# Standardize Fare
df['Fare'] = df_std['Fare']

######################################################
#Analyse des données 6
#Examiner la corrélation entre Survived et Fare (échelle proportionnelle)
# Data analysis 6
# Examine the correlation between Survived and Fare(ratio scale)
######################################################
CorrelationV(df['Survived'], df['Fare'])
0.06620664646184327

"Aucune corrélation". Représentons graphiquement le tableau croisé. Si elle est laissée telle quelle, l'échelle sera plus fine, alors mettez-la ensemble à 0,2 intervalle.

######################################
# -1.0 < x < -0.8 ⇒-1.0
# -0.8 < x < -0.6 ⇒-0.8
# -0.6 < x < -0.4 ⇒-0.6
# -0.4 < x < -0.2 ⇒-0.4
# -0.2 < x <    0 ⇒-0.2
#  0   < x <  0.2 ⇒ 0.0
#  0.2 < x <  0.4 ⇒ 0.2
#  0.4 < x <  0.6 ⇒ 0.4
#  0.6 < x <  0.8 ⇒ 0.6
#  0.8 < x <  1.0 ⇒ 0.8
#  1.0 < x        ⇒ 1.0
######################################
def one_fifth(x):
    if  x < -0.8:
        return -1.0
    elif -0.8 <= x and x < -0.6:
        return -0.8
    elif -0.6 <= x and x < -0.4:
        return -0.6
    elif -0.4 <= x and x < -0.2:
        return -0.4
    elif -0.2 <= x and x < 0:
        return -0.2
    elif 0 <= x and x < 0.2:
        return 0.0
    elif 0.2 <= x and x < 0.4:
        return 0.2
    elif 0.4 <= x and x < 0.6:
        return 0.4
    elif 0.6 <= x and x < 0.8:
        return 0.6
    elif 0.8 <= x and x < 1.0:
        return 0.8
    else:
        return 1.0

df['Fare_convert'] = df['Fare'].apply(one_fifth)
cross_age = pandas.crosstab(df['Survived'], df['Fare_convert'])
cross_age.T.plot(kind='bar', stacked=True)
plt.show()

20191225_01.png

Lorsque le tarif est laissé pour compte, le taux de survie «1» augmente. Le coefficient est faible, mais il peut y avoir une corrélation.

Cabine (numéro de chambre)

Le numéro de chambre sera également ignoré cette fois. Je voudrais aborder ce sujet dans la section "Observation des données", dont je reviendrai.

Embarqué (port d'embarquement)

Le port d'embarquement est une «échelle de nom». Vérifiez le nombre d'associations Klamer.

######################################################
#Analyse des données 7
#Examiner la corrélation entre survécu et embarqué (échelle nominale)
# Data analysis 7
# Examine the correlation between Survived and Embarked(nominal scale)
######################################################
cramersV(df['Survived'], df['Embarked'])
0.18248384812341217

C'est bien, mais c'est maintenant "aucune corrélation". Représentons graphiquement le tableau croisé.

cross_embarked = pandas.crosstab(df['Survived'], df['Embarked'])
cross_embarked.T.plot(kind='bar', stacked=True)
plt.show()

20191225_02.png

Il semble y avoir une corrélation, il semble y avoir aucune ...

5. Résultat

Les corrélations sont Pclass (classe de billet) et Sexe (genre). Le tarif n'atteint pas non plus la valeur standard, mais il semble y avoir une petite corrélation dans le graphique.

6. Résumé

Je souhaite utiliser Pclass (classe de billet), Sexe (sexe) et Fare (tarif) comme paramètres d'entrée basés sur le graphique de corrélation et de tableau croisé. Vient ensuite la sélection de modèles, mais c'est La prochaine fois.

référence

Calculer les relations entre les variables de différentes échelles (Python) https://qiita.com/shngt/items/45da2d30acf9e84924b7

Calcul du nombre d'associations de Klamer https://qiita.com/canard0328/items/5ea4115d964b448903ba

Histoire

2019/12/25 Première édition publiée 2019/12/29 Ajout du lien suivant

Recommended Posts

Vérifiez la corrélation avec le Titanic de Kaggle (kaggle③)
Vérifiez les données brutes avec Kaggle's Titanic (Kaggle ⑥)
Certains modèles de Kaggle's Titanic (kaggle ④)
Prédire le Titanic de Kaggle avec Keras (Kaggle ⑦)
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
Vérifiez le code avec flake8
Défis de la compétition Titanic pour les débutants de Kaggle
Vérifier l'existence du fichier avec python
Vérifiez la taille du fichier avec du -sh *
Essayez tous les modèles de scikit-learn avec le Titanic de Kaggle (kaggle ⑤)
Jusqu'à ce que vous utilisiez l'API Kaggle avec Colab
Vérifiez la date du devoir de drapeau avec Python
Défiez Kaggle Titanic
Jour 66 [Introduction à Kaggle] Les prévisions Titanic les plus faciles
Examinez les paramètres de RandomForestClassifier dans le didacticiel Kaggle / Titanic
Vérifier quand la version ne change pas dans pyenv
Kaggle Tutorial Le savoir-faire Titanic pour être dans le top 2%
Regardez de plus près le tutoriel Kaggle / Titanic
Prédisons les survivants du Hello World de Kaggle, Titanic par régression logistique-Modélisation-
Vérification de domaine avec Python
Essayez le didacticiel Titanic de Kaggle
Vérifier la version avec python
Repenser le coefficient de corrélation
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
Vérifiez quelle ligne a causé l'erreur avec apply () (dataframe, Pandas)
Vérifiez l'état de fonctionnement du serveur avec la commande Linux top
Prédisons les survivants de Hello World, Titanic de Kaggle par régression logistique-Prédiction / Évaluation-