[PYTHON] J'ai essayé de comprendre comment utiliser les pandas et la colinéarité multiple en utilisant l'ensemble de données Affaires comme thème.

introduction

La dernière fois, j'ai résumé ce que j'avais appris de la théorie sur la régression logistique.

J'ai essayé d'approfondir ma compréhension en créant un discriminateur qui peut être classé binaire par ma propre régression logistique. https://qiita.com/Fumio-eisan/items/e2c625c4d28d74cf02f3

Cette fois, nous avons effectué une estimation du modèle à l'aide d'un ensemble de données réel. Nous avons résumé le traitement de base du prétraitement des données (variable factice, suppression de colonnes, combinaison), l'interprétation des données et la colinéarité multiple, qui est un problème en analyse multivariée. Il existe de nombreux contenus d'implémentation.

Le contour est ci-dessous.

La version utilisée est la suivante.

Cet ensemble de données

Cette fois, nous avons utilisé l'ensemble de données des résultats de l'enquête de 1974 sur les femmes mariées pour la présence d'infidélité.

affair.ipynb


df = sm.datasets.fair.load_pandas().data
df.head()

image.png

En regardant les données, vous pouvez voir que la période depuis le mariage, l'âge, la présence d'enfants, etc. sont décrits comme des variables explicatives. Et enfin, il y a un numéro dans la colonne des affaires. 0 indique que vous n'êtes pas une infidélité, et 1 ou plus indique que vous êtes (ou étiez) une infidélité.

Interpréter les données en affichant plusieurs graphiques en un dans un histogramme

Évaluez la différence entre la présence et l'absence d'infidélité. Tout d'abord, dans les données actuelles, les nombres d'affaires sont différents, donc divisez par affaire (1 ou plus) et non par affaire (0).

affair.ipynb


def affair_check(x):
    if x!=0:
        return 1
    else:
        return 0

df['Had_Affair']=df['affairs'].apply(affair_check)

Interprétez les données pour rechercher des paramètres susceptibles d'être plus pertinents pour le modèle prédictif. Pour cela, classez par affaire (1) et sans affaire (0) et faites un histogramme avec chaque variable. Avec les axes comme valeur de retour, donnez chacun comme argument dans le graphique que vous souhaitez représenter.

affair.ipynb


fig, axes = plt.subplots(nrows=3, ncols=3,figsize=(10,8))

sns.countplot(df['age'], hue=df['Had_Affair'],ax=axes[0,0])
sns.countplot(df['yrs_married'], hue=df['Had_Affair'],ax=axes[0,1])
sns.countplot(df['children'], hue=df['Had_Affair'],ax=axes[0,2])
sns.countplot(df['rate_marriage'], hue=df['Had_Affair'],ax=axes[1,0])
sns.countplot(df['religious'], hue=df['Had_Affair'],ax=axes[1,1])
sns.countplot(df['educ'], hue=df['Had_Affair'],ax=axes[1,2])
sns.countplot(df['occupation'], hue=df['Had_Affair'],ax=axes[2,0])
sns.countplot(df['occupation_husb'], hue=df['Had_Affair'],ax=axes[2,1])

101.png

Maintenant que vous pouvez tout afficher en même temps, vous pouvez maintenant interpréter les données. Fondamentalement, je pense que vous devriez vous concentrer sur les paramètres où les pics sont différents entre le groupe ** infidélité et le groupe sans affaire. ** **

Prétraitement des données

Introduction de variables fictives

Nous allons maintenant effectuer un prétraitement pour créer un modèle de prédiction. Dans cet ensemble de données sur les affaires, les variables catégorielles sont la profession et la profession du mari. Pour ceux-ci, nous introduisons des variables fictives et les classons avec une expression 0/1. image.png

C'est une telle image. La mise en œuvre est la suivante.

affair.ipynb


occ_dummies = pd.get_dummies(df['occupation'])
hus_occ_dummies = pd.get_dummies(df['occupation_husb'])
occ_dummies.columns = ['occ1','occ2','occ3','occ4','occ5','occ6']
hus_occ_dummies.columns = ['hocc1','hocc2','hocc3','hocc4','hocc5','hocc6']
occ_dummies

image.png

J'ai pu le diviser en toute sécurité.

Supprimer et connecter des données

Ensuite, je veux supprimer les colonnes dont je n'ai pas besoin et connecter les colonnes dont j'ai besoin. Supprimez les colonnes occupation et Had_Affair.

affair.ipynb


X = df.drop(['occupation','occupation_husb','Had_Affair'],axis=1)

Ensuite, rassemblez les variables factices.

affair.ipynb


dummies = pd.concat([occ_dummies,hus_occ_dummies],axis=1)

Enfin, combinez la variable factice avec les données d'origine.

affair.ipynb


XX = pd.concat([X,dummies],axis= 1)

À propos de la colinéarité multiple

Ensuite, considérons la colinéarité multiple. C'est un problème qui apparaît à mesure que les types de variables explicatives augmentent. Parmi ces variables explicatives, le phénomène dans lequel les coefficients de corrélation sont forts entre eux est appelé ** co-linéarité multiple **. S'il y a beaucoup de colinéarité multiple, la précision de l'équation de régression peut devenir extrêmement médiocre et les résultats de l'analyse peuvent devenir instables.

Par exemple, dans un modèle qui prédit les prix des logements, le «nombre de pièces» et la «superficie de la pièce» devraient avoir une forte corrélation. Dans de tels cas, vous pouvez éviter la colinéarité multiple en excluant l'une des variables.

Cette fois, j'aimerais faire un modèle en excluant occ1, hocc1 = étudiants de la variable fictive profession.

affair.ipynb


XX = XX.drop('occ1',axis=1)
XX = XX.drop('hocc1',axis=1)

image.png

La relation est comme indiqué ci-dessus.

Prédire par régression logistique

Puis prédisez le modèle. Cette fois, je voudrais faire une prédiction simple en utilisant la régression logistique de scicit learn. Entraînez d'abord le modèle avec uniquement les données d'entraînement. Puis prédisez avec les données de test.

affair.ipynb


X_train, X_test, Y_train, Y_test = train_test_split(XX, Y)
model2 = LogisticRegression()
model2.fit(X_train, Y_train)
class_predict = model2.predict(X_test)
print(metrics.accuracy_score(Y_test,class_predict))

0.707286432160804

Il s'est avéré que le taux de réponse correcte était d'environ 70%. Alors, que se passe-t-il si les données effacées en évitant la colinéarité multiple mentionnée précédemment ne sont pas effacées telles quelles (= le fait est que les données sont telles quelles)?

affair.ipynb


X2_train, X2_test, Y2_train, Y2_test = train_test_split(X2, Y)
model3 = LogisticRegression()
model3.fit(X2_train, Y2_train)
class_predict2 = model3.predict(X2_test)
print(metrics.accuracy_score(Y2_test,class_predict2))

0.9748743718592965

Le taux de réponse correcte était élevé à 97%. ** Dans ce cas, la colinéarité multiple ne se produit pas, donc on peut voir que les données auraient dû être laissées telles quelles. ** **

En d'autres termes, il semble que la prise en compte ou non de la colinéarité multiple doit être envisagée une fois lorsque toutes les données sont incluses dans le calcul et lorsqu'elles sont supprimées. Il s'est avéré que la partie empirique est la procédure de dire des choses.

À la fin

Les données ont été interprétées à l'aide de pandas et de matplotlib, et le prétraitement a été effectué en tenant compte de la colinéarité multiple. Puisqu'il s'agit d'un ensemble de données de type tutoriel, il semble avoir progressé sans heurts, mais je pensais que la gestion des pandas tels que le dessin et la combinaison de graphiques était encore plus.   De plus, comme la mise en œuvre de la régression logistique elle-même est très simple, il était très pratique de pouvoir calculer sans savoir ce qui se passait à l'intérieur.

Le programme complet peut être trouvé ici. https://github.com/Fumio-eisan/affairs_20200412

Recommended Posts

J'ai essayé de comprendre comment utiliser les pandas et la colinéarité multiple en utilisant l'ensemble de données Affaires comme thème.
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé de résumer comment utiliser à nouveau le référentiel EPEL
Comment utiliser les pandas Timestamp et date_range
Comment utiliser Pandas 2
J'ai essayé d'utiliser Resultoon sur Mac + AVT-C875, mais j'étais frustré en chemin.
J'ai essayé d'utiliser Twitter Scraper avec AWS Lambda et cela n'a pas fonctionné.
L'arbre.plot_tree de scikit-learn était très simple et pratique, j'ai donc essayé de résumer comment l'utiliser facilement.
J'ai essayé de résumer comment utiliser matplotlib de python
Comment utiliser la commande grep et des exemples fréquents
Comment utiliser argparse et la différence entre optparse
Je veux utiliser le jeu de données R avec python
J'ai essayé d'installer scrapy sur Anaconda et je n'ai pas pu
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
Comprendre comment utiliser django-filter
Comment utiliser Pandas Rolling
Comment utiliser le décorateur
J'ai essayé de simuler la propagation de l'infection avec Python
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
J'ai essayé de résumer le code souvent utilisé dans Pandas
J'ai essayé d'illustrer le temps et le temps du langage C
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
Je ne savais pas comment utiliser l'instruction [python] for
J'ai essayé d'énumérer les différences entre java et python
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé de lancer le cluster ipython au minimum sur AWS
[Git] J'ai essayé de faciliter la compréhension de l'utilisation de git stash en utilisant un exemple concret.
Comment utiliser la fonction zip
Comment utiliser le module optparse
J'ai créé mon propre réseau de neurones à propagation directe à 3 couches et j'ai essayé de comprendre le calcul en profondeur.
[Python] Comment utiliser la série Pandas
Comment utiliser Dataiku sous Windows
J'ai essayé la validation croisée basée sur le résultat de la recherche de grille avec scikit-learn
Remarques sur l'utilisation de pywinauto
J'ai essayé de visualiser l'ensemble de données de préférence de boisson par décomposition tenseur.
Comment lire l'ensemble de données SNLI
Remarques sur l'utilisation des featuretools
Comment installer des pandas sur EC2 (Comment gérer MemoryError et PermissionError)
J'ai essayé d'expliquer l'ensemble de données de Pytorch
Comment utiliser l'homebrew dans Debian
J'ai essayé de numériser le tampon estampé sur papier en utilisant OpenCV
Comment utiliser .bash_profile et .bashrc
J'ai essayé d'enregistrer une station sur la plateforme IoT "Rimotte"
J'ai essayé de démarrer avec Bitcoin Systre le week-end
Comment installer et utiliser Graphviz
Comment utiliser Jupyter sur le frontal de Spacon ITO
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
Je vais vous expliquer comment utiliser Pandas d'une manière facile à comprendre.
Je ne suis pas sûr de la différence entre les modules, les packages et les bibliothèques, alors j'ai essayé de les organiser.
Comment utiliser le module ConfigParser
[Introduction à Python] Comment utiliser l'opérateur booléen (et ・ ou ・ non)
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de pousser les documents Sphinx vers BitBucket et de les refléter automatiquement sur le serveur Web
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!