Réécrire le nœud d'échantillonnage de SPSS Modeler avec Python (2): échantillonnage en couches, échantillonnage en grappes

Le nœud d'échantillonnage est utilisé pour l'échantillonnage avec SPSS Modeler. Je vais expliquer ce nœud d'échantillonnage et le réécrire avec des pandas Python.

Il existe deux types d'échantillonnage: (1) l'échantillonnage simple et (2) l'échantillonnage complexe qui reflète les tendances des données. Dernière fois a expliqué ① échantillonnage simple. Cette fois, j'expliquerai (2) l'échantillonnage compliqué.

① Échantillonnage simple
①-1. N premiers cas
①-2. Échantillonnage aléatoire
② Échantillonnage complexe ← Cet article
②-1. Échantillonnage en couches
②-2. Échantillonnage en grappes

0. données brutes

Effectuer pour les données POS suivantes avec ID. Nous utilisons des données PDV attachées à une pièce d'identité qui enregistrent qui (CUSTID) a acheté quand (SDATE) et quoi (PRODUCTID, classification principale du produit L_CLASS, classification intermédiaire du produit M_CLASS) et combien (SOUS-TOTAL).

Il y a 28 599 cas dans 6 domaines. image.png

1m. ②-1. Version du modeleur d'échantillonnage en couches

L'échantillonnage aléatoire est une méthode d'échantillonnage qui peut refléter les tendances de toutes les données s'il y a suffisamment d'enregistrements. Cependant, certaines données peuvent avoir un biais important dans la distribution et n'existent que dans une petite proportion. Ces données peuvent ne pas être en mesure de refléter la tendance si le nombre d'échantillons est petit.

Par exemple, regardons la distribution de M_CLASS (classification en produits) de ces données. Le nombre de ventes de SHOES01 est de 631 fois, soit 2,21% du total, donc ce n'est pas grand. image.png

En regardant la distribution de M_CLASS (classification dans le produit) à la suite d'un échantillonnage à 0,2%, SHOES01 a disparu. En outre, d'autres éléments sont différents de la distribution d'origine. image.png

À l'origine, dans un tel cas, le nombre d'échantillons devrait être augmenté, mais s'il n'y a pas d'autre choix que de faire un petit échantillonnage pour les données de vérification, etc., un échantillonnage stratifié peut être utilisé.

Il s'agit d'une méthode d'échantillonnage des données séparément pour chaque couche. Dans cet exemple, il s'agira d'une image échantillonnée pour chaque classification intermédiaire de M_CLASS (classification en produits).

L'échantillonnage en couches est également effectué au niveau du nœud d'échantillonnage. La méthode d'échantillonnage est "complexe". Spécifiez ensuite la taille de l'échantillon. Ici, 0,002 (0,2%) est spécifié. Vous pouvez ensuite spécifier des variables en couches en cliquant sur le bouton Cluster and Hierarchy. Ici, M_CLASS (classification dans le produit) est spécifiée comme variable stratifiée.

De plus, le réglage de la graine aléatoire est vérifié afin que l'échantillonnage puisse être reproduit.

image.png

Le résultat a une colonne appelée SampleWeight, qui écrit les poids utilisés en interne lors de l'échantillonnage. Vous pouvez voir que les valeurs sont les mêmes pour chaque M_CLASS. Il n'est généralement pas nécessaire, vous pouvez donc le supprimer avec le nœud de filtre. image.png

En regardant la distribution de M_CLASS (classification en produits) à la suite de l'échantillonnage, il y a SHOES01, qui est proche de la distribution d'origine pour tous les cas.

image.png

Notez que le refoulement SQL ne fonctionne pas pour l'échantillonnage stratifié. Il devient violet et semble rechercher des caractères vides dans les colonnes en couches, mais l'échantillonnage lui-même n'a pas été converti en SQL.

1p. ②-1. Version de pandas d'échantillonnage en couches

Utilisez les fonctions groupby et sample pour obtenir un échantillonnage en couches avec des pandas. Tout d'abord, groupez par «M_CLASS». group_keys = False n'est pas multi-indexé.

Ensuite, un échantillonnage aléatoire à 0,2% est exécuté avec un échantillon en utilisant la formule lamda pour chaque bloc de données de chaque M_CLASS.

Stratified_df=df.groupby('M_CLASS', group_keys=False)\
    .apply(lambda x: x.sample(frac=0.002, random_state = 1))

Regroupées par M_CLASS, les données sont de 0,2%.

image.png

Une autre option consiste à utiliser Stratified Shuffle Split. Il s'agit d'un objet qui effectue un échantillonnage en couches lors de la séparation des données d'entraînement et des données de test.

La taille d'échantillonnage des données d'apprentissage et des données de test est déterminée par les arguments train_size et test_size de StratifiedShuffleSplit. random_state est une graine aléatoire. Puisqu'il s'agit à l'origine d'un objet pour séparer les données d'entraînement et les données de test, il est nécessaire de déterminer train_size et test_size.

Si vous spécifiez le Dataframe (df) et la colonne (df ['M_CLASS']) que vous souhaitez stratifier avec la fonction de fractionnement pour l'échantillon instancié, l'index (train_, test_) du Dataframe des données d'apprentissage et des données de test sera renvoyé. À partir de là, je crée un nouveau Dataframe (StratifiedShuffleSplit_df).

from sklearn.model_selection import StratifiedShuffleSplit
sample = StratifiedShuffleSplit(n_splits = 1,train_size = 0.002,test_size = 0.01, random_state = 1)
for train_,test_ in sample.split(df, df['M_CLASS']):
    StratifiedShuffleSplit_ = df.loc[train_]
#    chunk_test = df1.loc[test_]

En comparant la distribution de M_CLASS de toutes les données, ces données d'échantillonnage stratifiées et les données d'échantillonnage aléatoire simple, SHOES01 est manquant dans les données d'échantillonnage aléatoire simple, et la distribution de toutes les données ne peut pas être reflétée. Je comprends.

image.png

2m. ②-2. Version du modeleur d'échantillonnage en grappes

Les données cette fois sont une transaction d'achat. Un échantillonnage aléatoire de l'ensemble des données réduira les articles achetés par chaque client. Le nombre d'achats et le montant d'achat par personne seront faibles, et il sera difficile de comprendre la tendance d'achat des gens qui «achètent souvent des CHAUSSURES». Vous pouvez analyser les produits les plus vendus dans l'ensemble de la transaction, mais les données ne seront pas adaptées à une analyse orientée client.

Dans ce cas, effectuez un échantillonnage en grappes (échantillonnage d'ID agrégé) qui échantillonne au niveau de l'ID client. Lors de l'échantillonnage en grappes, la transaction de l'ID client extrait est conservée par échantillonnage par l'ID client, il est donc possible d'analyser par l'axe client.

L'échantillonnage en grappes est également effectué au nœud d'échantillonnage. La méthode d'échantillonnage est "Complexe" et la taille de l'échantillon est spécifiée. Ici, 0,1 (10%) est spécifié. Cliquez ensuite sur le bouton Cluster and Hierarchy pour spécifier les variables que vous souhaitez regrouper. Ici, CUSTID est spécifié comme cluster.

De plus, le réglage de la graine aléatoire est vérifié afin que l'échantillonnage puisse être reproduit.

image.png

10% de tous les CUSTID ont été échantillonnés au hasard, les transactions CUSTID extraites ont été enregistrées et 2652 ont été extraites. Une colonne SampleWeight a également été ajoutée, mais je ne pense pas qu'elle soit utilisée pour un échantillonnage complexe. image.png

Cependant, le refoulement SQL ne fonctionne pas si l'échantillonnage en grappes est effectué à l'aide de la fonction de nœud d'échantillonnage. Par conséquent, il est recommandé d'échantillonner CUSTID par agrégation d'enregistrements et échantillonnage aléatoire, puis re-JOIN avec les données d'origine. image.png

Créez un ensemble de données unique avec CUSTID dans l'agrégation d'enregistrements. image.png

La méthode d'échantillonnage est simple et un% aléatoire de 10% est spécifié.

image.png

Combinez ensuite les transactions à partir des données d'origine. image.png

Cette méthode effectuera un refoulement SQL. RAND (2743707) <1.0000000000000001e-01) est un échantillonnage aléatoire et WHERE (T0.CUSTID = T1.CUSTID) joint les transactions.

[2020-08-12 12:58:45] Aperçu SQL: SÉLECTIONNEZ T1.SDATE COMME SDATE, T1.PRODUCTID COMME PRODUCTID, T1. "L_CLASS" AS "L_CLASS", T1. "M_CLASS" AS "M_CLASS", T1.SUBTOTAL COMME SOUS-TOTAL, T0.CUSTID COMME CUSTID DE (SÉLECTIONNEZ T0.CUSTID COMME CUSTID DE (SÉLECTIONNEZ T0.CUSTID COMME CUSTID À PARTIR D'ÉCHANTILLONTRANDEPT4EN2019S T0 GROUPE PAR T0.CUSTID) T0 WHERE RAND (2743707) <1.0000000000000001e-01) (SÉLECTIONNEZ T0.CUSTID COMME CUSTID, T0.SDATE COMME SDATE, T0.PRODUCTID COMME PRODUCTID, T0. "L_CLASS" COMME "L_CLASS", T0. "M_CLASS" COMME "M_CLASS", T0.SUBTOTAL COMME SOUS-TOTAL DE SAMPLETRANDEPT4EN2019S T0) O (T0.CUSTID = T1.CUSTID)

2p. ②-2. Version de pandas d'échantillonnage en cluster

Utilisez les fonctions unique, sample et isin pour l'échantillonnage en grappes avec les pandas. Le processus est le même que l'utilisation du nœud d'agrégation, du nœud d'échantillonnage et du nœud de jointure d'enregistrement dans Modeler.

Créez un jeu d'enregistrements unique et doté d'un CUSTID unique. Un échantillonnage aléatoire est effectué avec l'échantillon. Seuls les CUSTID échantillonnés à partir de la transaction d'origine avec isin sont extraits.

df_custid =pd.Series(df['CUSTID'].unique()).sample(frac=0.1,random_state=1)
df[df['CUSTID'].isin(df_custid)]

L'échantillonnage en grappes peut être effectué comme suit. image.png

3. Échantillon

L'échantillon est placé ci-dessous.

courant https://github.com/hkwd/200611Modeler2Python/raw/master/sample/sample.str notebook https://github.com/hkwd/200611Modeler2Python/blob/master/sample/sampling.ipynb Les données https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/sampletranDEPT4en2019S.csv

■ Environnement de test Modeler 18.2.1 Windows 10 64bit Python 3.6.9 pandas 0.24.1

4. Informations de référence

Échantillonnage aléatoire-Wikipedia
https://ja.wikipedia.org/wiki/%E7%84%A1%E4%BD%9C%E7%82%BA%E6%8A%BD%E5%87%BA #% E7% B5% B1% E8% A8% 88% E8% AA% BF% E6% 9F% BB% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E7% 84% A1% E4% BD% 9C% E7% 82% BA% E6% 8A% BD% E5% 87% BA% E3% 81% AE% E6% 89% 8B% E6% B3% 95 L'explication de la méthode d'extraction stratifiée et de la méthode d'extraction par grappes est facile à comprendre.

Noeud d'échantillonnage https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.1/modeler_mainhelp_client_ddita/clementine/mainwindow_navigationstreamsoutputtab.html

Recommended Posts

Réécrire le nœud d'échantillonnage de SPSS Modeler avec Python (2): échantillonnage en couches, échantillonnage en grappes
Réécrire le nœud d'échantillonnage de SPSS Modeler avec Python ①: N premiers cas, échantillonnage aléatoire
Réécrivez le nœud de création de champ de SPSS Modeler avec Python. Extraction de caractéristiques à partir de données de capteurs de séries temporelles
Modifier les paramètres d'un nœud dans un super nœud avec le script SPSS Modeler Python
Vérifier l'existence du fichier avec python
[Python3] Réécrire l'objet code de la fonction
Réécrire le nœud de filtre de SPSS Modeler avec Python
Réécrivez le nœud de reconfiguration de SPSS Modeler avec Python. Agrégation par catégorie de produits achetés
Préparer l'environnement d'exécution de Python3 avec Docker
Mathématiques Todai 2016 résolues avec Python
Calculez le nombre total de combinaisons avec python
Vérifiez la date du devoir de drapeau avec Python
Renommer la balise avec un espace de noms en lxml
Convertir le code de caractère du fichier avec Python3
[Python] Déterminez le type d'iris avec SVM
Réécrivez le nœud d'enregistrement en double de SPSS Modeler avec Python. ① Identifiez le premier article acheté. (2) Identification de l'article le plus vendu dans la catégorie de produits
Extraire le tableau des fichiers image avec OneDrive et Python
Apprenez Nim avec Python (dès le début de l'année).
Détruire l'expression intermédiaire de la méthode sweep avec Python
Visualisez la gamme d'insertions internes et externes avec python
Calculer le coefficient de régression d'une analyse de régression simple avec python
Résumé du flux de base de l'apprentissage automatique avec Python
[Python] Comment réécrire le style de table avec python-pptx [python-pptx]
Obtenez l'état de fonctionnement de JR West avec Python
Gestion des versions de Node, Ruby et Python avec anyenv
Essayez de gratter les données COVID-19 Tokyo avec Python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
L'histoire de la mise en œuvre du sujet Facebook Messenger Bot avec python
Unifier l'environnement de l'équipe de développement Python en commençant par Poetry
Visualisez les résultats des arbres de décision réalisés avec Python scikit-learn
Calculez des millions de chiffres dans la racine carrée de 2 avec python
J'ai écrit la grammaire de base de Python dans Jupyter Lab
Exécutez l'intelligence de votre propre bibliothèque python avec VScode.
J'ai évalué la stratégie de négociation du système boursier avec Python.
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
[Homologie] Comptez le nombre de trous dans les données avec Python
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Récupérez la source de la page à charger indéfiniment avec python.
Vers la retraite de Python2
Appelez l'API avec python3.
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
Le 14 mars est le jour du rapport de circonférence. L'histoire du calcul du ratio de circonférence avec python
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Je veux sortir le début du mois prochain avec Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
L'histoire de la création d'un pilote standard pour db avec python.