Buon anno a tutti!
Ho iniziato a esplorare questo set di dati da Kaggle: https://www.kaggle.com/chicago/chi-restaurant-inspections . Ogni riga è un'ispezione del ristorante, con un'unica colonna per l'elenco delle violazioni. Per fortuna, le violazioni sono delimitate da "|". Esempio di seguito. Il numero di violazioni varia.
40. REFRIGERAZIONE E TERMOMETRI A STELO METALLICO FORNITI E EVIDENTI - Commenti: TERMOMETRO A STELO NECESSARIO PER MONITORARE LE TEMPERATURE DEGLI ALIMENTI. ISTRUITO A FORNIRE E MANTENERE. | 41. LOCALI MANTENUTI PRIVI DI RIFIUTI, ARTICOLI NON NECESSARI, ATTREZZATURE PER LA PULIZIA CORRETTAMENTE CONSERVATE - Commenti: OSSERVATI ALCUNI OGGETTI NON ELEVATI DI 6 POLLICI DAL PAVIMENTO NELL'AREA DI PREPARAZIONE POSTERIORE. DEVE ELEVARE E MANTENERE. | 38. VENTILAZIONE: CAMERE E ATTREZZATURE VENTILATE COME RICHIESTO: IMPIANTO IDRAULICO: INSTALLATO E MANTENUTO - Commenti: LAVELLO A MANO A VISTA NELLA CUCINA POSTERIORE AREA DI PREPARAZIONE DEL CIBO DRENANTE LENTO. DEVE RIPARARE E MANTENERE. | 32. SUPERFICI DI CONTATTO ALIMENTARI E NON ALIMENTARI PROGETTATE, COSTRUITE E MANTENUTE CORRETTAMENTE - Commenti: OSSERVATA SCAFFALATURA PER LA CONSERVAZIONE DI ALIMENTARI ARRUGGINITA NEL SEMINTERRATO. DEVE RIVERNICIARE E MANTENERE. | 34. PAVIMENTI: COSTRUITI SECONDO CODICE, PULITI, BUONO RISTRUTTURAZIONE, COVING INSTALLATI, METODI DI PULIZIA SENZA POLVERE UTILIZZATI - Commenti: SPORCO E DETRITI OSSERVATI SUL PAVIMENTO SOTTO I PALLET SUL SEMINTERRATO. DEVE PULIRE E MANTENERE.
Osservando la struttura: ViolationID#. Violation_Type - Commenti. Posso pensare a due modi per analizzare queste stringhe in ID#, Tipo, Commenti:
1) Cols> Utilità> Testo in colonne, quindi Tabelle> Impila, quindi elimina le righe vuote, quindi analizza la nuova colonna con Word (testo, delimitatore)
2) Usa Words(Violations, "|") per creare un elenco come quello qui sotto, quindi lavora su ciascuno degli elementi nell'elenco
{"40. REFRIGERAZIONE E TERMOMETRI A STELO METALLICO FORNITI E EVIDENTI - Commenti: TERMOMETRO A STELO NECESSARIO PER MONITORARE LE TEMPERATURE DEGLI ALIMENTI. ISTRUITO A FORNIRE E MANTENERE. ", "41. LOCALI MANTENUTI PRIVI DI RIFIUTI, ARTICOLI NON NECESSARI, ATTREZZATURE PER LA PULIZIA CORRETTAMENTE CONSERVATE - Commenti: OSSERVATI ALCUNI OGGETTI NON ELEVATI DI 6 POLLICI DAL PAVIMENTO NELL'AREA DI PREPARAZIONE POSTERIORE. DEVE ELEVARE E MANTENERE. ", "38. VENTILAZIONE: CAMERE E ATTREZZATURE VENTILATE COME RICHIESTO: IMPIANTO IDRAULICO: INSTALLATO E MANTENUTO - Commenti: LAVELLO A MANO A VISTA NELLA CUCINA POSTERIORE AREA DI PREPARAZIONE DEL CIBO DRENANTE LENTO. DEVE RIPARARE E MANTENERE. ", "32. SUPERFICI DI CONTATTO ALIMENTARI E NON ALIMENTARI PROGETTATE, COSTRUITE E MANTENUTE CORRETTAMENTE - Commenti: OSSERVATA SCAFFALATURA PER LA CONSERVAZIONE DI ALIMENTARI ARRUGGINITA NEL SEMINTERRATO. DEVE RIVERNICIARE E MANTENERE. ", "34. PAVIMENTI: COSTRUITI SECONDO CODICE, PULITI, BUONO RISTRUTTURAZIONE, COVING INSTALLATI, METODI DI PULIZIA SENZA POLVERE UTILIZZATI - Commenti: SPORCO E DETRITI OSSERVATI SUL PAVIMENTO SOTTO I PALLET SUL SEMINTERRATO. DEVE PULIRE E MANTENERE."}
Non ho molta esperienza nell'uso delle liste.
Sarebbe più efficiente lavorare con l'elenco {}, utilizzare l'approccio Testo in colonne o esiste un modo migliore? Se l'approccio dell'elenco è il più efficiente, qual è l'approccio più efficiente per fare l'equivalente di Tabelle> Stack per ogni riga, elemento nell'elenco?
In alternativa, è presente una colonna con InspectionID#. Sarebbe più efficiente suddividerlo in due tabelle utilizzando InspectionID# come chiave invece di creare un'enorme tabella in pila?
Craig:
Grazie! Essendo un principiante dell'analisi del testo, non ho mai utilizzato le funzioni di Pattern Matching prima. Bella soluzione al problema. Dedicherò sicuramente un po' di tempo a conoscere regex e pattern matching.
A proposito, l'analisi del testo sarebbe un ottimo argomento del Webinar Mastering JMP!
Giocando solo con le prime 100 righe, ecco una mappa:
LocationsLocationsLuoghi
Ecco una colonna formula per ottenere solo i campi dei commenti:
a = :Violations;
b = "";
Pat Match( a, // full violation text
Pat Repeat(
Pat Arb() + "Comments:"
+ ( Pat Break( "|" ) | Pat Rem()) >> c // the interesting bit
+ Pat Test( // not really a test, just some JSL to build text
b = b || "|" || c; // build text here
1; // always succeed the test
)
),
NULL, // no replacement
FULLSCAN // get the final one
);
b;
Esplora testo può utilizzare la nuova colonna per formare cluster
clustersclusters cluster
Tracciare il numero di cluster per i commenti rispetto al risultato effettivo dell'ispezione sembra promettente; i commenti del cluster 2 non hanno ricevuto voti negativi e i commenti del cluster 4 hanno avuto esito negativo. In genere qualcosa come "GRASSO OSSERVATO ACCUMULO SUI FILTRI DELLA CAPPA DI VENTILAZIONE. DEVE PULIRE I FILTRI DELLA CAPPA DI VENTILAZIONE" (superato) vs "NO LAVAGGIO DELLE MANI NÉ RIMOZIONE DEI GUANTI PER IL CIBO" (fallito).
clustered by comment textclustered by comment textraggruppati per testo di commento
Non credo che le 145.000 righe saranno troppo lente per nessuna delle idee di analisi. Penso che probabilmente vorrai colonne di indicatori per ogni tipo di violazione, 0 o 1. Se hai JMP 13, puoi utilizzare text explorer sui commenti; Suggerirei di eseguire tutti i commenti, senza le descrizioni costanti, insieme in un unico campo di caratteri.