Daniel Valente, PhD, JMP Senior Product Manager, SAS
Jon Weisz , JMP Vizepräsident für Vertrieb und Marketing, SAS
Abstrakt
JMP 13 führt zwei neue Tools ein, die Analysten die Lösung häufiger Datenprobleme erleichtern. Oft sind zwei oder mehr Datentabellen durch einen gemeinsamen Schlüssel verknüpft, unterscheiden sich jedoch stark in der Häufigkeit der Faktenstichproben oder den Dimensionen (z. B. Länge vs. Breite). Ein tatsächlicher Join dieser zwei (oder mehr) Tabellen kann zu einer Tabelle führen, die den Speicherbedarf stark übersteigt. Dies ist zwar lästig, wenn die Fakten- und Dimensionstabellen relativ kompakt sind, kann aber schnell zu einer verknüpften Tabelle führen, die den Speicherbedarf übersteigt. Die Lösung ist ein virtueller Join, der die verknüpfte Beziehung aufrechterhält, ohne die verknüpfte Tabelle tatsächlich zu erstellen. Dadurch wird die Faktentabelle effektiv angereichert, ohne sie zu belasten. Analysten müssen häufig komplexe Tabellenverknüpfungen oder -zusammenfassungen in Datenbanken erstellen und SQL schreiben, was insbesondere bei komplexen Beziehungen wie sich langsam ändernden Dimensionen mit eigenen Schwierigkeiten verbunden ist. Der JMP Query Builder dient als einfaches Tool zum Generieren und Schreiben von SQL, dessen Code anschließend in einer Datenbank ausgeführt werden kann. Nachdem Sie die richtige und gewünschte Abfrage per Drag & Drop eingefügt haben, schreibt Query Builder automatisch den SQL-Code für Sie, sodass mühsame manuelle und fehleranfällige Arbeit entfällt.
Übersicht über relationale Tabellenstrukturen
Analysten benötigen Daten in einer Form, die Variablen in Spalten und Beobachtungen in Zeilen enthält. Die Daten benötigen möglicherweise auch kategoriale Spalten, die die Beobachtungen klar unterteilen (z. B. Einkommensniveau, Land, Maschine usw.). Die Daten können außerdem Attribute enthalten, die die Beobachtungen weiter verdeutlichen (z. B. Adresse, Seriennummer, Kundennummer usw.).
Die Quelldaten für solche Analysen sind häufig relationale Datenstrukturen, die in Datenbanken gespeichert sind. Viele moderne Studiengänge im Bereich Data Science behandeln Themen im Zusammenhang mit relationalen Datenstrukturen, Datenbanken und SQL. Die meisten Ingenieure, Wissenschaftler und Statistiker kommen jedoch nicht im akademischen Umfeld mit diesen Themen in Berührung und müssen sich daher im Rahmen einer kontinuierlichen, informellen Ausbildung damit befassen. JMP Query Builder bietet Analysten eine Brücke zwischen relationalen Datenstrukturen und analysebereiten Daten. Durch das Erlernen einiger Begriffe und Konzepte können Analysten mit Query Builder analysebereite Daten generieren.
Die kurze Erörterung relationaler Datenstrukturen in diesem Dokument soll kein gründliches Studium des Themas ersetzen. Vielmehr werden darin die Begriffe und Definitionen vorgestellt, die bei der Arbeit mit Query Builder und seinen virtuellen Join-Funktionen in JMP verwendet werden.
Warum sollte man wichtige Daten in mehr als einer Tabelle speichern?
Stellen Sie sich vor, Sie müssen Daten über die Käufe Ihrer Kunden für Ihre Produkte speichern. Sie könnten zunächst alle Variablen auflisten, die erfasst werden müssen, beispielsweise:
- Kaufdatum
- Kaufbetrag
- Kaufmethode (PO oder CC)
- Produkt-SKU
- Produktbeschreibung
- Kundenname
- Kundenadresse
- Telefonnummer des Kunden
Dies ist sicherlich keine vollständige Liste, aber ein guter Anfang. Denken Sie nun an die Pflege dieser Daten. Diese Tabelle enthält acht Spalten und eine Zeile für jeden Kauf. Einige Felder können viele unterschiedliche Werte enthalten, wie z. B. Kaufbetrag oder Kaufdatum. Andere Felder enthalten deutlich weniger unterschiedliche Werte und viele wiederkehrende Werte, wie z. B. Produkt-SKU und Beschreibung.
Eine gängige Methode zum Reduzieren der Tabellengröße besteht darin, die Tabelle in drei logische Gruppen aufzuteilen. Die erste Gruppe enthält die Transaktionen oder Fakten , beispielsweise Kaufdatum und Kaufbetrag. Die zweite Tabelle enthält die Kundeninformationen und die dritte die Produktinformationen. Um die Verknüpfungen zwischen den Datenspalten beizubehalten, muss eine Spalte mit Verknüpfungsinformationen hinzugefügt werden, um die drei Tabellen miteinander zu verknüpfen. Diese Spalten werden Schlüssel genannt. Eine gängige Methode zum Darstellen dieses Layouts ist die Verwendung eines Entity-Relationship-Diagramms (ER) . Jede Entität hat einen Tabellennamen, einen Schlüssel oder einen Satz von Schlüsseln, die jede Zeile eindeutig identifizieren, und einen Satz von Attributen oder Variablen, die Informationen zu jeder Zeile liefern. Das ER-Diagramm für das Kaufdatum des Kunden ist in Abbildung 1 dargestellt.

Abbildung 1. Entity-Relationship-Diagramm für Kundenkaufdaten
Das Schlüsselsymbol neben der Kunden-ID in der Dimensionstabelle „Kunden“ bedeutet, dass Sie bei Kenntnis einer Kunden-ID diesen Kunden und alle zugehörigen Informationen in der Tabelle eindeutig finden können. Die Kunden-ID befindet sich auch in der Faktentabelle „Käufe“. Die Kunden-ID wird in der Faktentabelle „Käufe“ als Fremdschlüssel bezeichnet, da sie häufig vorkommen kann und Zeilen in einer Fremdtabelle eindeutig zu der Zeile definiert, in der sie erscheint.
Anhand des Layouts in Abbildung 1 lässt sich leicht erkennen, wie eine Produktbeschreibung aktualisiert wird. Dazu müssen Sie lediglich die Produktdimensionstabelle bearbeiten. Diese Änderung gilt dann für alle getätigten Käufe. Dieser Vorteil wird als Wartbarkeit bezeichnet. Wäre dies eine Tabelle mit der mehrfachen Produktbeschreibung, müssten Sie viele Zeilen bearbeiten, was unweigerlich zu Fehlern und Problemen mit der Datenqualität führen würde.
Fall 1: Aktuelle Bevölkerungsumfrage
Schauen wir uns nun ein Beispiel mit dem Query Builder an. Die US-Regierung erhebt mit der Current Population Survey (CPS) [USGCPS] viele interessante Daten. Die CPS lautet:
“Der Current Population Survey (CPS) ist eine der ältesten, umfangreichsten und bekanntesten Erhebungen in den Vereinigten Staaten. Er ist von enormer Bedeutung, da er Informationen zu vielen Dingen liefert, die uns als Individuen und als Gesellschaft definieren – unsere Arbeit, unser Einkommen und unsere Bildung. Der CPS ist nicht nur die wichtigste Quelle für monatliche Arbeitsmarktstatistiken, sondern wird auch zur Datenerhebung für verschiedene andere Studien verwendet, die die Nation über die wirtschaftliche und soziale Lage ihrer Bevölkerung informieren. Dies geschieht durch das Hinzufügen einer Reihe von Zusatzfragen zu den monatlichen Basisfragen des CPS. Diese Zusatzfragen variieren von Monat zu Monat und decken ein breites Spektrum an Themen ab, wie beispielsweise Kindesunterhalt, Freiwilligenarbeit, Krankenversicherungsschutz und Einschulung. Zusatzfragen werden in der Regel jährlich oder halbjährlich erhoben, ihre Häufigkeit hängt jedoch ganz davon ab, was den Bedürfnissen des Initiators der Zusatzfrage am besten entspricht.“
Diese Daten stehen als 36 Textdateien zum Download bereit und lassen sich dank der Tabulatortrennung problemlos in JMP öffnen. Anhand der JMP-Tabellen wurde ein ER-Diagramm (Abbildung 2) erstellt, das die Arbeit im Query Builder unterstützt.

Abbildung 2. ER-Diagramm für die Datentabellen der CPS-Arbeitskräftestatistik
Um den Abfrage-Generator zu verwenden, müssen Sie eine Primärtabelle (Fakt) und Sekundärtabelle(n) (Dimension ) definieren.
Die Faktentabelle für die CPS-Daten heißtAllData.jmpDie Tabelle enthält mehr als 5 Millionen Zeilen, aber nur fünf Spalten. Die Spalten enthalten eine „series_id“, Datumsangaben und eine „value“-Spalte. Um die Daten sinnvoll zu nutzen, müssen Sie herausfinden, was dieseries_id.jmp bedeutet. Das ER-Diagramm in Abbildung 2 zeigt, dass „series_id“ mit demSerie.jmpTabelle. Öffnen Sie anschließend beide Tabellen in JMP und definieren Sie den Join mithilfe des Abfrage-Generators.
Wählen Sie in JMPAllData.jmpals Primärtabelle (Faktentabelle) undSerie.jmpals sekundäre (Dimensions-)Tabelle (Abbildung 3). JMP sucht automatisch nach passenden Schlüsseln und richtet die Verknüpfung ein. Sie sollten dies jedoch überprüfen, indem Sie auf das Venn-Diagramm rechts neben der Serientabelle klicken. Der Abfrage-Generator hat in beiden Tabellen „footnote_codes“ gefunden, die Sie jedoch nicht als Schlüssel verknüpfen möchten, sondern nur die „series_id“, daher sollte diese Schlüsselbeziehung entfernt werden.

Abbildung 3. Abfrage-Generator für den Join vonAllData.jmpUndSerie.jmp
Nun müssen Sie die Spalten in der verknüpften Tabelle definieren (Abbildung 4). Wählen Sie dazuAllData.jmpoben links und wählen Sie die benötigten Spalten aus dieser Tabelle aus. Löschen Sie jetzt „series_id“, da Sie diesen Schlüssel in der resultierenden Tabelle nicht benötigen (Serien und Daten.jmp).

Abbildung 4. Abfrage-Generator zum BeitretenSerien und Daten.jmpan alle“_code.jmp” Tabellen
Beachten Sie, dassSerien und Daten.jmpist etwa fünfmal größer als dieAllData.jmpTabelle. Diese Inflation ist auf die wiederholten Werte aller „_code“-Felder zurückzuführen. Die Speicherung der Daten in 36 Tabellen reduziert den Speicherbedarf also deutlich. Wählen Sie als NächstesSerien und Daten.jmp als primäre Tabelle und alle„_code.jmp”-Tabellen als Sekundärtabellen (Abbildung 5).

Abbildung 5. Query Builder zum Verbinden aller „_code.jmp”
Erstellen Sie die Abfrage nur mit den „_text“-Feldern aus den „_code“-Tabellen, da Sie die Schlüsselvariablen nicht mehr benötigen. Mit dem Spalten-Viewer in JMP erhalten Sie ganz einfach eine Übersicht über die nun 42 Spalten in der Tabelle.Vollständiges join.jmp.Sie haben immer noch 5,7 Millionen Zeilen, was dasselbe ist wieAllData.jmp, aber jetzt haben Sie die Textfelder, die die Daten beschreiben. Obwohl die TabelleVollständiger Join.jmpist immer noch sechsmal größer als der TischAllData.jmp,Sie verfügen nun über eine für die Analyse nützliche Tabelle.
Verwenden Sie den Graph Builder, um die Entwicklung der Arbeitslosigkeit im verarbeitenden Gewerbe darzustellen.Vollständiger Join.jmpAbbildung 6 zeigt die wirtschaftlichen Umbrüche in diesem Sektor während der Rezession anhand der roten Trendlinie. Die Arbeitslosenzahlen lagen 2016 wieder auf dem Niveau von 2006 und 2007. Die grüne Trendlinie zeigt die Beschäftigungszahlen im Automobilbau. Von 2010 bis 2015 wurden in der Automobilindustrie über 300.000 neue Arbeitsplätze geschaffen.

Abbildung 6. Graph Builder zeigt Daten aus der CPS-Arbeitskräftestatistik
Fall 2: Restaurant-Inspektionsdaten
In diesem Fall wird die Verwendung von Virtual Join und JMP Query Builder zur Analyse der Ergebnisse der Restaurantinspektion des DOHMH New York City untersucht.[DOHMH]Stellen Sie sich vor, Sie sind ein neuer Inspektor und untersuchen einige historische Daten, um zu sehen, was die Daten verraten. Von der Websitehttps://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59Sie können eine CSV-Version dieser Daten herunterladen, die sich problemlos in JMP öffnen lässt. Der vollständige Download am 17. Juli 2016 generiert eine 163,3 MB große Datei mit 448.149 Datensätzen.
Diese Daten enthalten eine Spalte „INSPEKTIONSDATUM“, die den Monat/Tag/Jahr des Inspektionsereignisses angibt. Um zu sehen, wie viele Jahre in diesen Daten enthalten sind, klicken Sie mit der rechten Maustaste und wählen Sie „Neue Formelspalte > Datum/Uhrzeit > Jahr“. Die Konvertierung von kontinuierlich in nominal und anschließend „Analysieren > Verteilung“ ist in Abbildung 7 dargestellt. Der Wert 1900 ist wahrscheinlich ein Code für fehlende Daten, den Sie beheben müssen. Eine destruktive Bearbeitung dieser Daten ist problemlos möglich (da JMP hier als Sandbox verwendet wird und die realen Daten immer auf dem Server gespeichert sind). Verwenden Sie anschließend das Dienstprogramm „Neu kodieren“, um diese Werte in „fehlend“ zu ändern.

Abbildung 7. Inspektionsdaten für den vollständigen Datensatz
Im Neukodierungsfenster finden sich 1.151 Datensätze mit dem Datum 01.01.1900. Ändern Sie diesen alten Wert in •, indem Sie die Zeichenfolge löschen und anschließend auf „Fertig“ -> „Im Speicher“ klicken. Da das Datensatzdatum das Datum der Datenabfrage ist und für diese Analyse nicht relevant ist, löschen Sie die Spalte.
In diesem Dokument geht es um virtuelle Verknüpfungen und den Abfragegenerator. Sie fragen sich vielleicht, warum wir eine denormalisierte Tabelle betrachten. Es scheint eine Möglichkeit zu geben, diese Daten zu normalisieren. Auffällig ist, dass in diesen Rohdaten die geokodierten Standorte der einzelnen Restaurants fehlen. Diese Aufgabe kann später mit einem JMP-Add-In erledigt werden. Da dieser Prozess rechenintensiv ist, ist es sinnvoll, nur eindeutige Standorte zu geokodieren, die in diesen Daten möglicherweise mehrere Inspektionen aufweisen. Darüber hinaus bietet sich die Möglichkeit, eine zusätzliche Tabelle mit Verstößen zu erstellen, die weitaus weniger sind als einzelne Inspektionen.
Bevor Sie die Daten aufteilen, nehmen Sie eine Stichprobe dieser Daten, damit die Zahlen für Ihre Erkundungsübung besser handhabbar sind.
Stichproben lassen sich einfach mit dem Abfrage-Generator durchführen. Über Tabellen > JMP Abfrage-Generator wird der Startdialog geöffnet. Da Sie in diesem Fall keinen Join durchführen, verwenden SieDOHMH_New_York_City_Restaurant_Inspection_Results.jmpals Primärtabelle ohne Sekundärtabellen. Im Abfrage-Generator gibt es die Registerkarte „Stichprobe“. Aktivieren Sie das Kontrollkästchen „Stichprobe dieses Ergebnissatzes“ und wählen Sie „Erste N Zeilen“ oder „Zufällige N Zeilen“. Nehmen Sie eine zufällige Stichprobe von 10 Prozent dieser Daten, also tragen Sie 44.815 in „Zufällige N Zeilen“ ein. Fügen Sie alle Spalten im Abschnitt „Spalten einschließen“ hinzu und überprüfen Sie anschließend die SQL. Der Abfrage-Generator hat die SQL für diese Abfrage automatisch generiert:
WÄHLEN SIE t1.CAMIS, t1.DBA, t1.BORO, t1.BUILDING,
t1.STRASSE, t1.POSTLEITZAHL, t1.TELEFON, t1."KÜCHENBESCHREIBUNG",
t1."INSPEKTIONSDATUM", t1."AKTION", t1."VERLETZUNGSCODE", t1."VERLETZUNGSBESCHREIBUNG",
t1.KRITISCHES KENNZEICHNUNGSMERKMAL, t1.ERGEBNIS, t1.NOTE, t1.NOTENDATUM,
t1."INSPEKTIONSART", t1."Jahr[INSPEKTIONSDATUM]"
VON DOHMH_New_York_City_Restaurant_Inspektionsergebnisse t1
ORDER BY RANDOM() LIMIT 44815;
Nach der Verwendungdie Reihenfolge nach Zufallsprinzip () Funktion für unsere Stichprobe. Diese Abfrage generiert die entsprechende Teilmenge der Daten. Speichern Sie diese als Teilmenge und trennen Sie dann die Restaurantdemografie und die Verstoßcodes ab. Auch hier kann der Abfrage-Generator verwendet werden. Beginnen Sie mit den Verstoßcodes. Auch hier benötigen Sie nur eine Primärtabelle. Ziehen Sie VIOLATION CODE und VIOLATION DESCRIPTION per Drag & Drop in die Variablenliste und ziehen Sie dann VIOLATION CODE erneut hinein. Dadurch können Sie nach Anzahl aggregieren und die Tabelle mit den gewünschten Eigenschaften generieren. Ändern Sie den JMP-Namen der Aggregatspalte in VIOLATION COUNT. Diese Möglichkeit, einen Alias für eine Spalte oder abgeleitete Spalte zu generieren, ist eine leistungsstarke Funktion des Abfrage-Generators. Sie können auch automatisch nach der neu erstellten aggregierten Spalte sortieren, indem Sie VIOLATION COUNT in die Rolle „Sortieren nach“ ziehen, wie in Abbildung 8 gezeigt.

Abbildung 8. Aggregatspalte umbenannt in „Violation Count“ mit der Eigenschaft „Order By“
Mit nur 88 eindeutigen Verstoßcodes ist diese resultierende Abfrage deutlich kompakter. Nachdem Sie die Tabelle D-ViolationCodes.jmp benannt haben, können Sie mit dem Graph Builder untersuchen, welche Codes die meisten Datensätze enthalten. Ziehen Sie VIOLATION DESCRIPTION auf die X-Achse und VIOLATION COUNT auf die Y-Achse. Klicken Sie anschließend mit der rechten Maustaste auf VIOLATION DESCRIPTION und sortieren Sie nach VIOLATION COUNT (absteigend). Um sich nur auf die Top-Kategorien zu konzentrieren, können Sie den Filter „Lokale Daten“ für VIOLATION COUNT mit Verstoßkategorien verwenden, die mehr als 2.500 eindeutige Datensätze aufweisen (Abbildung 9).

Abbildung 9. Anzahl der häufigsten Verstöße (>2500 eindeutige Datensätze in der Stichprobentabelle)
Wenn Sie die Verstoßtabelle zunächst beiseite lassen, können Sie sich auf die individuellen Restaurant-Demografien konzentrieren. An dieser Stelle können Sie auch die Verstoßbeschreibung löschen, wodurch einige doppelte Zeilen in der Hauptfaktentabelle eingespart werden. Verwenden Sie den VERLETZUNGSCODE, der eine wesentlich kompaktere Möglichkeit bietet, diese Daten zu organisieren (dreistellige Zeichenfolgen statt satzlanger Zeichenfolgen).
Verwenden Sie erneut den Abfrage-Generator, um die individuellen Restaurant-Demografien zu ermitteln. Es ist sehr wahrscheinlich, dass es in New York City mehrere Pizzerien mit demselben Namen gibt, aber der Abfrage-Generator kann diese Situation bewältigen. Die Spalte „CAMIS“ dient als ID zur Identifizierung einzelner Restaurants. Ziehen Sie im Abfrage-Generator „CAMIS“ zweimal hinein. Eine davon sollte „Aggregated by count“ heißen und in „INSPECTION COUNT“ umbenannt werden. Die restlichen demografischen Daten sind „DBA“, „BORO“, „BUILDING“, „STREET“, „ZIPCODE“, „PHONE“ und „CUISINE DESCRIPTION“. Berechnen Sie abschließend eine Spalte „ADDRESS“ für den Geocoder. Dies erfolgt als Post-Query-Skript. Führen Sie die Abfrage aus und verwenden Sie anschließend eine Formelspalte mit der folgenden Formel:
:GEBÄUDE ||" "|| :STRASSE ||" "|| :BORO ||„NY“,||Verkohlen( :PLZ )
Mit dieser Formel wird die richtige Adresse zusammengestellt.:ADRESSE <<Skript abrufen; In einem Skripteditor wird das JSL-Format erstellt, das zum Generieren der Spalte für ein Post-Query-Skript erforderlich ist. Kopieren Sie diesen Code und fügen Sie ihn in die entsprechende Registerkarte im Abfrage-Generator ein. Erstellen Sie anschließend eine Spalte, die die Daten in 20 Gruppen aufteilt, um eine bessere Schnittstelle zum Geocode zu gewährleisten. Nachdem Sie eine neue Spalte mit dem Namen „Daten gruppieren und initialisieren: Daten sequenzieren, von 1 bis 20, Schritt 1, Wiederholung 1“ erstellt haben, können Sie das Skript abrufen und in das Post-Query-Skript einfügen. Da nun beide Spalten Skripte sind, können Sie die Abfragetabelle löschen und die Abfrage erneut ausführen. Speichern Sie diese Datentabelle unterD-Restaurants.jmp. Löschen Sie als letzten Schritt die zusätzlichen Spalten aus der neuen Faktentabelle, darunter: DBA, BORO, GEBÄUDE, STRASSE, POSTLEITZAHL, TELEFONNUMMER und KÜCHENBESCHREIBUNG.
Speichern Sie diese Tabelle als F-Inspections.jmp. Jetzt können Sie die Restaurantgruppen mit einem Add-In von Xan Gregg geokodieren, das im JMP File Exchange [GREGG] verfügbar ist und OpenStreetMaps.org zur Geokodierung von Standorten nutzt. Dieser Dienst ist rechenintensiv und fehleranfällig, daher empfiehlt es sich,D-Restaurants nach Gruppe über Tabellen > Teilmenge. Die in Abbildung 10 dargestellte Subset-By-Funktionalität dieser Plattform ist hier hilfreich.

Abbildung 10. Plattform für Teiltabellen zum Aufteilen nach Restaurantgruppen
Die neu erstellten 20 Tabellen können mithilfe des Add-Ins einzeln geokodiert werden. Das Adressfeld hilft dabei, den korrekten Breiten- und Längengrad zu bestimmen. Abschließend werden die Ergebnisse in derselben Datentabelle gespeichert.
Um die Datentabelle wieder in eine eindimensionale Tabelle mit Standorten umzuwandeln, verwenden Sie die Funktion Tabellen > Verketten, wobei die 20 Gruppen kombiniert werden. Sie heißt D-RestaurantswLocation.jmp.
Nachdem Sie diese Tabelle mit dem Abfrage-Generator aufgeschlüsselt haben, können Sie sie mithilfe des virtuellen Joins wieder aufbauen.
Beginnen wir zunächst mit unseren beiden Dimensionstabellen: Restaurants-wLocation.jmp UndViolationCodes.jmp. Klicken Sie mit der rechten Maustaste auf den VIOLATION CODE und wählen Sie die Link-ID, um den virtuellen Join zu starten. Beachten Sie, dass in der Spaltenliste ein kleines Schlüsselsymbol angezeigt wird. Wechseln Sie zur Tabelle „Restaurants“ und wiederholen Sie den Vorgang mit „CAMIS“. Um den virtuellen Join abzuschließen, wechseln Sie zur Faktentabelle mit allen Inspektionen und wählen Sie anschließend „Link-Referenz“ für „CAMIS“ und „VIOLATION CODE“.
Alle Spalten werden in der Faktentabelle angezeigt, ohne dass die Tabellen im Speicher physisch verknüpft werden müssen. Der virtuelle Join kann auch über eine Spalteneigenschaft geskriptet werden:
Für die Linkreferenz:
Setze Eigenschaft("Link-Referenz", Referenztabelle("D(f)-Restaurants-wLocation.jmp"));
Für die Link-ID:
Setze Eigenschaft("Link-ID", 1);

Abbildung 11. Virtueller Join
Abbildung 11 zeigt, dass Sie auf die Spalten in beiden Dimensionstabellen zugreifen können, ohne die Faktentabelle zu belasten.
Erstellen Sie abschließend ein Dashboard, um diese Daten unter Nutzung der virtuell verbundenen Spalten zu visualisieren und zu untersuchen.
Abbildung 12 zeigt, wie Dashboard Builder eine Sammlung von fünf Diagrammen darstellt. Um zwei der Diagramme als Auswahlfilter zu verwenden, beginnen Sie mit der Vorlage „Hierarchischer Filter“ in Dashboard Builder und verwenden Sie „CRITICAL FLAG“ und „BORO“ als Filter und hierarchischen Filter. Verwenden Sie anschließend ein Diagramm der Notenzählungen, den Durchschnittswert nach Quantil auf einer Karte und schließlich eine Heatmap der Datumszählungen nach Inspektionsart.

Abbildung 12. Dashboard Builder-Modus des Application Builders mit Final NYC Inspection Dashboard
Dies ist nur ein Beispiel für die Visualisierung, die Sie mit diesen Daten erstellen können, indem Sie die verknüpften Tabellen nutzen, die durch die virtuelle Verknüpfung möglich sind. Die geokodierten Daten ermöglichen es Ihnen beispielsweise auch, die Standorte von Restaurants nach Küche zu analysieren (Abbildung 13).

Abbildung 13. Geokodierte Restaurants, eingefärbt nach Kategorie, auf einer Straßenkarte
SQL-Generierung und -Bereitstellung
Ein weiterer großer Vorteil des Query Builders ist die Generierung von Structured Query Language (SQL). SAS kann SQL innerhalb von Proc SQL verwenden, und die meisten Datenbanken nutzen SQL als Programmiersprache zum Verknüpfen und Verwalten von Tabellen. SQL kann aus einer Abfrage generiert werden, die Sie in der Point-and-Click-Oberfläche des Query Builders definieren.
Unten sehen Sie das vom Abfrage-Generator erstellte SQL für die Verknüpfung aller Dimensionstabellen mit der verknüpften Tabelle vonSerie.jmpUndAllData.jmp(aus Fall 1) und die SQL aus dem Join vonVollständiger Join.jmpund alle_code.jmpTabellen. DieBibliotheksnameAnweisung, zugehörige Libname-Referenzen auf die Tabellen und dieproc SQL -Anweisung hinzugefügt. Der restliche Code wurde vom Query Builder generiert.
Beachten Sie, dass der Großteil des Codes aus einer Auflistung der Spalten innerhalb der SELECT-Anweisungen besteht. Die Verwendung des Abfrage-Generators zur Generierung solchen Codes ist eine große Hilfe, selbst wenn der Benutzer SQL-Kenntnisse hat. Warum so viele Tabellen- und Spaltennamen eingeben, wenn es nicht nötig ist?
Bibliotheksname Quelle „Ihr Dateispeicherort“;
proc SQL;
erstellen TischQuelle.dataNseriesals
WÄHLENt1.Jahr, t1.Zeitraum, t1.Wert, t1.Fußnotencodes,
t2.lfst_code, t2.periodicity_code, t2.series_title, t2.absn_code,
t2.Aktivitätscode, t2.Alterscode, t2.Klassencode, t2.Dauercode,
t2.education_code, t2.entr_code, t2.expr_code, t2.hheader_code,
t2.hour_code, t2.indy_code, t2.jdes_code, t2.look_code,
t2.mari_code, t2.mjhs_code, t2.occupation_code, t2.orig_code,
t2.pcts_code, t2.race_code, t2.rjnw_code, t2.rnlf_code,
t2.rwns_code, t2.seek_code, t2.sexs_code, t2.tdat_code,
t2.vets_code, t2.wkst_code, t2.born_code, t2.chld_code,
t2.disa_code, t2.seasonal, t2.footnote_codes, t2.begin_year,
t2.begin_period, t2.end_year, t2.end_periodAUSQuelle.AlleDaten t1
LINKSOUTER JOIN Quelle.Serie t2
AN ( t1.series_id = t2.series_id ) ;
WÄHLENt1.Jahr, t1.Zeitraum, t1.Wert, t1.Serientitel,
t1.saisonal, t1.Jahresbeginn, t1.Zeitraumbeginn, t1.Jahresende,
t1.Ende_Zeitraum, t13.Fußnotentext, t34.Wochentext, t33.Wochentext,
t32.tdat_text, t31.sexs_text, t30.seek_text, t29.rwns_text,
t28.rnlf_text, t27.RJNW_TEXT, t26.race_text, t25.periodicity_text,
t24.pcts_text, t23.orig_text, t22.occupation_text, t21.mjhs_text,
t20.mari_text, t19.look_text, t18.lfst_text, t17.jdes_text,
t16.indy_text, t15.hour_text, t14.hheader_text, t12.expr_text,
t11.entr_text, t10.education_text, t9.duration_text, t8.disa_text,
t7.Klassentext, t6.Kindertext, t5.Geborenentext, t4.Alterstext,
t3.Aktivitätstext, t2.Absn_textAUSQuelle.dataNseries t1
LINKSOUTER JOIN Quelle.Fußnote t13
AN ( t1.Fußnotencodes = t13.Fußnotencode )
LINKSOUTER JOIN Quelle.wkst t34
AN ( t34.Wochencode = t1.Wochencode )
LINKSOUTER JOIN source.vets t33
AN ( t33.vets_code = t1.vets_code )
LINKSOUTER JOIN Quelle.tdat t32
AN ( t32.tdat_code = t1.tdat_code )
LINKSOUTER JOIN source.sexs t31
AN ( t31.Geschlechtscode = t1.Geschlechtscode )
LINKSOUTER JOIN Quelle.Suche t30
AN ( t30.Seek_Code = t1.Seek_Code )
LINKSOUTER JOIN Quelle.rwns t29
AN ( t29.rwns_code = t1.rwns_code )
LINKSOUTER JOIN Quelle.rnlf t28
AN ( t28.rnlf_code = t1.rnlf_code )
LINKSOUTER JOIN Quelle.rjnw t27
AN ( t27.RJNW_CODE = t1.rjnw_code )
LINKSOUTER JOIN Quelle.Rennen t26
AN ( t26.Race_Code = t1.Race_Code )
LINKSOUTER JOIN Quelle.Periodizität t25
AN ( t25.Periodizitätscode = t1.Periodizitätscode )
LINKSOUTER JOIN source.pcts t24
AN ( t24.pcts_code = t1.pcts_code )
LINKSOUTER JOIN source.orig t23
AN ( t23.orig_code = t1.orig_code )
LINKSOUTER JOIN Quelle.Beruf t22
AN ( t22.Berufscode = t1.Berufscode )
LINKSOUTER JOIN Quelle.mjhs t21
AN ( t21.mjhs_code = t1.mjhs_code )
LINKSOUTER JOIN Quelle.mari t20
AN ( t20.mari_code = t1.mari_code )
LINKSOUTER JOIN source.look t19
AN ( t19.look_code = t1.look_code )
LINKSOUTER JOIN Quelle.lfst t18
AN ( t18.lfst_code = t1.lfst_code )
LINKSOUTER JOIN Quelle.jdes t17
AN ( t17.jdes_code = t1.jdes_code )
LINKSOUTER JOIN source.indy t16
AN ( t16.indy_code = t1.indy_code )
LINKSOUTER JOIN Quelle.Stunde t15
AN ( t15.Stundencode = t1.Stundencode )
LINKSOUTER JOIN source.hheader t14
AN ( t14.hheader_code = t1.hheader_code )
LINKSOUTER JOIN Quelle.Ausdruck t12
AN ( t12.Ausdruckscode = t1.Ausdruckscode )
LINKSOUTER JOIN source.entr t11
AN ( t11.Eingabecode = t1.Eingabecode )
LINKSOUTER JOIN Quelle.Bildung t10
AN ( t10.Bildungscode = t1.Bildungscode )
LINKSOUTER JOIN Quelle.Dauer t9
AN ( t9.Dauercode = t1.Dauercode )
LINKSOUTER JOIN source.disa t8
AN ( t8.disa_code = t1.disa_code )
LINKSOUTER JOIN Quelle.Klasse t7
AN ( t7.Klassencode = t1.Klassencode )
LINKSOUTER JOIN source.chld t6
AN ( t6.chld_code = t1.chld_code )
LINKSOUTER JOIN Quelle.geboren t5
AN ( t5.born_code = t1.born_code )
LINKSOUTER JOIN Quelle.Alter t4
AN ( t4.Alterscode = t1.Alterscode )
LINKSOUTER JOIN Quelle.Aktivität t3
AN ( t3.Aktivitätscode = t1.Aktivitätscode )
LINKSOUTER JOIN Quelle.absn t2
AN ( t1.absn_code = t2.absn_code );
aufhören;
Zusammenfassung
Analysten benötigen Daten in einer Tabelle, die so organisiert ist, dass Visualisierung und Analyse möglich sind. Allerdings Daten werden zum Laden, Verwalten und Speichern häufig in vielen Tabellen organisiert (normalisiert), sodass Analysten vor der Herausforderung stehen, viele Tabellen zu einer einzigen analysebereiten Tabelle zusammenzufügen und zusammenzufassen.
Der JMP Query Builder ist eine leistungsstarke Möglichkeit, mehrere Tabellen direkt in JMP zu verknüpfen. Die Vorschaufunktion ermöglicht es dem Benutzer, die korrekte Definition der Verknüpfung zu prüfen, bevor er eine zeitaufwändige Tabellenverknüpfung ausführt. Das generierte SQL kann in SAS oder einer Datenbank implementiert werden, was die manuelle Codeerstellung erheblich spart.
Verweise
[UGSCPS] Arbeitsmarktstatistik – Aktuelle Bevölkerungsumfrage – CPS. Abgerufen am 18. August 2016 vonhttp://www.bls.gov/cps/data.htm.
[DOHMH] DOHMH New York City Restaurant Inspektion Ergebnisse. Abgerufen am 17. August 2016, vonhttps://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59.
[GREGG]Gregg, X. (28. Mai 2014). Geokodierung von Ortsnamen. Abgerufen am 18. August 2016 vonhttps://community.jmp.com/docs/DOC-6175.