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".
référence Histoire
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.
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).
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 td> | Type d'échelle td> | Signification td> | Exemple td> tr> |
variables qualitatives td> | échelle nominale td> | échelle utilisée pour distinguer td> | sexe, préfecture td > tr> |
Echelle d'ordre td> | Echelle qui n'a de sens que pour les relations d'amplitude td> | Rang, intensité sismique td> tr> | |
Variable quantitative td> | Échelle d'intervalle td> | Les échelles sont régulièrement espacées et les intervalles sont significatifs tr> td> | Température, AD td> tr> |
Échelle proportionnelle td> | Intervalles et rapports significatifs (0 est l'origine) td> | Hauteur, prix td> tr> |
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.
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.
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 td> | Variable 2 td> | Coefficient de corrélation utilisé td> | Variable Titanic td> tr> |
Échelle de nom td> | Échelle de nom td> | Nombre d'associations Klamer td> | Sexe, numéro de ticket, numéro de chambre, Port d'embarquement td> tr> |
Echelle de commande td> | Ratio de corrélation de rang td> | Classe de ticket td> tr> | |
Variables quantitatives td> | Rapport de corrélation td> | Âge, fratrie, parch, tarif td> tr> |
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é».
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)
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()
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.
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.
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()
Certes, les résultats diffèrent grandement entre les hommes et les femmes.
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()
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 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()
Aucune corrélation significative ne peut être observée en regardant le graphique.
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()
Aucune corrélation significative ne peut être observée ici non plus.
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.
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()
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.
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.
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()
Il semble y avoir une corrélation, il semble y avoir aucune ...
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.
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.
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
2019/12/25 Première édition publiée 2019/12/29 Ajout du lien suivant
Recommended Posts