Daniel Valentin , PhD, Senior-Produktmanager bei JMP, SAS
Jon Weiss , JMP-Vizepräsident für Vertrieb und Marketing, SAS
Abstrakt
JMP 13 führt zwei neue Tools ein, die es dem Analysten erleichtern, allgemeine Datenprobleme zu lösen. Häufig sind zwei oder mehr Datentabellen durch einen gemeinsamen Schlüssel verbunden, sie unterscheiden sich jedoch sehr in Bezug auf die Häufigkeit oder Dimensionen der Faktenabtastung (z. B. lang oder breit). Durch eine tatsächliche Verknüpfung dieser zwei (oder mehr) Tabellen kann eine resultierende Tabelle erstellt werden, die im Arbeitsspeicher sehr groß wird. Dies ist zwar ein Ärgernis, wenn die Fakten- und Dimensionstabellen relativ kompakt sind, es kann jedoch schnell eine verbundene Tabelle erzeugen, die zu groß ist, um in den Speicher zu passen. Die Lösung besteht in der Verwendung einer virtuellen Verknüpfung, die die verknüpfte Beziehung beibehält, ohne die verknüpfte Tabelle tatsächlich zu erstellen – wodurch die Faktentabelle effektiv erweitert wird, ohne sie zu belasten. Analysten müssen oft komplexe Tabellenverknüpfungen oder -zusammenfassungen in Datenbanken vornehmen und SQL schreiben, was ihre eigenen Probleme mit sich bringt, insbesondere wenn es komplexe Beziehungen wie sich langsam ändernde Dimensionen gibt. JMP Query Builder dient als einfaches Werkzeug zum Generieren und Schreiben von SQL, dessen Code dann in einer Datenbank ausgeführt werden kann. Nachdem Sie die richtige und gewünschte Abfrage per Drag-and-Drop abgelegt haben, schreibt Query Builder automatisch den SQL-Code für Sie, wodurch die Notwendigkeit mühsamer manueller und fehleranfälliger Arbeit entfällt.
Überblick ü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 auch Attribute aufweisen, die Beobachtungen weiter erhellen (z. B. Adresse, Seriennummer, Kunden-ID usw.).
Häufig sind die Quelldaten für eine solche Analyse relationale Datenstrukturen, die in Datenbanken gespeichert sind. Viele moderne Studiengänge in Data Science behandeln Themen rund um relationale Datenstrukturen, Datenbanken und SQL. Aber die meisten Ingenieure, Wissenschaftler und Statistiker sind diesen Themen in einem akademischen Umfeld nicht ausgesetzt, so dass sie sich im Rahmen einer fortlaufenden, informellen Ausbildung damit befassen müssen. JMP Query Builder bietet Analysten eine Brücke zwischen relationalen Datenstrukturen und analysebereiten Daten. Durch das Erlernen einiger Begriffe und Konzepte können Analysten den Abfragegenerator verwenden, um Daten zu generieren, die für die Analyse bereit sind.
Die kurze Erörterung relationaler Datenstrukturen in diesem Dokument soll eine gründliche Beschäftigung mit dem Thema nicht ersetzen; vielmehr werden die Begriffe und Definitionen eingeführt, die bei der Arbeit mit Query Builder und seinen virtuellen Verknüpfungsfunktionen in JMP verwendet werden.
Warum mehr als eine Tabelle zum Speichern wichtiger Daten?
Stellen Sie sich vor, Sie müssten eine Möglichkeit finden, Daten über die Käufe der Produkte Ihres Unternehmens durch Kunden zu speichern. Sie könnten zunächst damit beginnen, alle Variablen aufzulisten, die möglicherweise erfasst werden müssen, z. B.:
- Kaufdatum
- Gesamtbetrag des Einkaufs
- Kaufmethode (PO oder CC)
- Produkt-SKU
- Produktbeschreibung
- Kundenname
- Kundenadresse
- Telefonnummer des Kunden
Dies ist sicherlich keine vollständige Liste, aber es ist ein guter Anfang. Denken Sie nun an die Pflege dieser Daten. Diese Tabelle hat acht Spalten und eine Zeile für jeden Kauf. Einige Felder können viele unterschiedliche Werte haben, z. B. Kaufbetrag oder Kaufdatum. Andere Felder haben viel weniger unterschiedliche Werte und viele wiederholte Werte, wie z. B. Produkt-SKU und Beschreibung.
Eine gängige Methode zum Reduzieren der Größe der Tabelle besteht darin, die Tabelle in drei logische Gruppen aufzuteilen. Die erste ist die Tabelle mit Transaktionen oder Fakten , wie z. B. Kaufdatum und Kaufbetrag. Die zweite Tabelle enthält die Kundeninformationen und die dritte die Produktinformationen. Um die Verknüpfungen zwischen den Datenspalten beizubehalten, müsste eine Spalte mit Verknüpfungsinformationen hinzugefügt werden, um die drei Tabellen zu verknüpfen. Diese Spalten werden aufgerufen Schlüssel . Eine übliche Methode, dieses Layout anzuzeigen, ist die Verwendung von Entity-Relationship-Diagramm (ER) . Jede Entität hat einen Tabellennamen, einen Schlüssel oder eine Gruppe von Schlüsseln, die jede Zeile eindeutig identifizieren, und eine Gruppe von Attributen oder Variablen, die Informationen über jede Zeile liefern. Das ER-Diagramm für das Kaufdatum des Kunden ist in Abbildung 1 dargestellt.

Abbildung 1. Entitätsbeziehungsdiagramm für Kundenkaufdaten
Das Schlüsselsymbol neben der Kunden-ID in der Kundendimensionstabelle bedeutet, dass Sie, wenn Sie eine Kunden-ID kennen, diesen Kunden in der Tabelle und alle zugehörigen Informationen eindeutig finden können. Die Kunden-ID befindet sich auch in der Kauffaktentabelle. Die Kunden-ID wird als Fremdschlüssel bezeichnet, wenn sie sich in der Tabelle „Purchases Fact“ befindet, da sie viele Male vorkommen kann und Zeilen in einer Fremdtabelle eindeutig für die Zeile definiert, in der sie angezeigt wird.
Mit dem Layout in Abbildung 1 ist es sehr einfach zu sehen, wie eine Produktbeschreibung aktualisiert wird. Dazu müssten Sie nur die Produktdimensionstabelle bearbeiten, und diese eine Änderung würde für alle jemals getätigten Käufe gelten, ein Vorteil, der als bezeichnet wird Wartbarkeit . Wenn dies eine Tabelle wäre, in der die Produktbeschreibung viele Male wiederholt wird, müssten Sie viele Zeilen bearbeiten, was unweigerlich zu Fehlern und Datenqualitätsproblemen führen würde.
Fall 1: Aktuelle Bevölkerungsumfrage
Sehen wir uns nun ein Beispiel mit Query Builder an. Die US-Regierung sammelt mit dem Current Population Survey (CPS) [USGCPS] viele interessante Daten. Der CPS ist:
„ Die Current Population Survey (CPS) ist eine der ältesten, größten und anerkanntesten Umfragen in den Vereinigten Staaten. Es ist immens wichtig, Informationen über viele Dinge bereitzustellen, die uns als Individuen und als Gesellschaft ausmachen – unsere Arbeit, unser Einkommen und unsere Bildung. Das CPS ist nicht nur die Hauptquelle für monatliche Arbeitskräftestatistiken, sondern wird auch verwendet, um Daten für eine Vielzahl anderer Studien zu sammeln, die die Nation über das wirtschaftliche und soziale Wohlergehen ihrer Bevölkerung auf dem Laufenden halten. Dies geschieht, indem den monatlichen CPS-Grundfragen eine Reihe von Zusatzfragen hinzugefügt wird. Die Zusatzanfragen variieren von Monat zu Monat und decken eine Vielzahl von Themen wie Kindergeld, Freiwilligenarbeit, Krankenversicherungsschutz und Einschulung ab. Ergänzungen werden normalerweise jährlich oder halbjährlich durchgeführt, aber die Häufigkeit und Wiederholung einer Ergänzung hängt vollständig davon ab, was den Bedürfnissen des Sponsors der Ergänzung am besten entspricht.“
Diese Daten stehen als 36 Textdateien zum Download bereit, die einfach in JMP geöffnet werden können, da es sich bei den Dateien um tabulatorgetrennte Textdateien handelt. Mit Blick auf die JMP-Tabellen wurde ein ER-Diagramm (Abbildung 2) erstellt, um die Arbeit in Query Builder zu informieren.

Figur 2. ER-Diagramm für die Datentabellen der CPS-Arbeitskräftestatistik
Um den Abfragegenerator verwenden zu können, müssen Sie eine Primärtabelle (Fakt) und Sekundärtabelle(n) (Dimension ).
Die Faktentabelle für die CPS-Daten wird aufgerufen AllData.jmp . Die Tabelle hat mehr als 5 Millionen Zeilen, aber nur fünf Spalten. Die Spalten haben eine „series_id“, Datums- und eine „Wert“-Spalte. Um den Daten einen Sinn zu geben, müssen Sie herausfinden, was die series_id.jmp bedeutet. Das ER-Diagramm in Abbildung 2 zeigt, dass „series_id“ mit der verknüpft ist series.jmp Tisch. Öffnen Sie als Nächstes diese beiden Tabellen in JMP und verwenden Sie Query Builder, um die Verknüpfung zu definieren.
Wählen Sie in JMP aus AllData.jmp als primäre (Fakten-)Tabelle und series.jmp als sekundäre (Dimensions-)Tabelle (Abbildung 3). JMP sucht automatisch nach passenden Schlüsseln und richtet die Verbindung ein, aber Sie sollten dies überprüfen, indem Sie auf das Venn-Diagramm rechts neben der Reihentabelle klicken. Query Builder hat „footnote_codes“ in beiden Tabellen gefunden, aber Sie möchten diese nicht als Schlüssel zusammenführen, sondern nur die „series_id“, sodass diese Schlüsselbeziehung entfernt werden sollte.

Figur 3. Abfrage-Generator für den Join von AllData.jmp Und Serie.jmp
Jetzt müssen Sie die Spalten in der verknüpften Tabelle definieren (Abbildung 4). Wählen Sie dazu aus AllData.jmp oben links und wählen Sie die benötigten Spalten aus dieser Tabelle aus. Lassen Sie „series_id“ jetzt weg, da Sie diesen Schlüssel in der resultierenden Tabelle nicht benötigen ( Serie und Daten.jmp ).

Figur 4. Query Builder zum Mitmachen Serie und Daten.jmp an alle " _code.jmp “ Tische
Beachte das Serie und Daten.jmp ist etwa fünfmal größer als die AllData.jmp Tisch. Diese Inflation ist auf die wiederholten Werte aller „_code“-Felder zurückzuführen. So deutlich reduziert die Speicherung der Daten in 36 Tabellen das Lagerung Anforderungen wesentlich. Wählen Sie als Nächstes aus Serie und Daten.jmp als primäre Tabelle und alle „_code.jmp ” Tabellen als sekundäre Tabellen (Abbildung 5).

Abbildung 5. Query Builder, um allen „ _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 Cols > Columns Viewer in JMP können Sie ganz einfach eine Zusammenfassung der nun 42 Spalten in der Tabelle abrufen Vollständige Datei join.jmp. Sie haben immer noch 5,7 Millionen Zeilen, was dasselbe ist wie AllData.jmp , aber jetzt haben Sie die Textfelder, die die Daten beschreiben. Obwohl der Tisch Vollständige Datei join.jmp ist immer noch sechsmal größer als der Tisch AllData.jmp, Sie haben jetzt eine Tabelle, die für die Analyse nützlich ist.
Verwenden Sie Graph Builder, um den Trend der Arbeitslosigkeit im verarbeitenden Gewerbe darzustellen Vollständige Datei join.jmp . In Abbildung 6 ist die Störung in diesem Sektor während der Rezession mit der roten Trendlinie dargestellt. Die Arbeitslosenzahlen im Jahr 2016 sind wieder auf dem Niveau von 2006-2007. Die grüne Trendlinie zeigt das Beschäftigungsniveau in der Automobilindustrie. Von 2010 bis 2015 kamen mehr als 300.000 Arbeitsplätze in der Automobilindustrie hinzu.

Abbildung 6. Graph Builder mit Daten aus CPS-Arbeitskräftestatistiken
Fall 2: Restaurantinspektionsdaten
In diesem Fall wird die Verwendung von Virtual Join und JMP Query Builder zur Analyse der Inspektionsergebnisse von DOHMH-Restaurants in New York City untersucht [DOHMH] . Stellen Sie sich vor, Sie wären ein neuer Inspektor im Job und untersuchen einige historische Daten, um zu sehen, was die Daten offenbaren. Von der Webseite https://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59 , können Sie eine .csv-Version dieser Daten herunterladen, die einfach in JMP geöffnet werden kann. Der vollständige Download am 17. Juli 2016 generiert eine 163,3 MB große Datei, die 448.149 Datensätze enthält.
Diese Daten haben eine Spalte INSPEKTIONSDATUM, die ein M/T/J des Inspektionsereignisses ist. Um zu sehen, wie viele Jahre in diesen Daten enthalten sind, klicken Sie mit der rechten Maustaste und verwenden Sie eine neue Formelspalte > Datumszeit > Jahr. Die Umwandlung von kontinuierlich in nominal und dann Analysieren > Verteilung ist in Abbildung 7 dargestellt. Das Niveau 1900 ist wahrscheinlich ein Code für fehlende Daten, etwas, das Sie ansprechen müssen. Es ist kein Problem, diese Daten destruktiv zu bearbeiten (da JMP hier als Sandbox verwendet wird und die echten Daten immer auf dem Server gespeichert sind); Verwenden Sie als Nächstes das Dienstprogramm Recode, um diese Ebenen auf fehlend zu ändern.

Abbildung 7. Inspektionsdaten für vollständigen Datensatz
Im Neucodierungsfenster gibt es 1.151 Datensätze vom 01.01.1900. Ändern Sie diesen alten Wert in •, indem Sie die Zeichenfolge löschen und dann auf Fertig -> An Ort und Stelle klicken. Da das RECORD DATE das Datum ist, an dem die Daten abgerufen wurden, und für diese Analyse nicht wesentlich ist, löschen Sie die Spalte.
In diesem Dokument geht es um virtuelle Verknüpfungen und den Abfragegenerator, daher fragen Sie sich vielleicht, warum wir uns eine denormalisierte Tabelle ansehen. Es scheint eine Möglichkeit zu geben, diese Daten zu normalisieren. In diesen Rohdaten fehlen insbesondere die geokodierten Standorte der einzelnen Restaurants, eine Aufgabe, die später mit einem JMP-Add-In durchgeführt werden kann. Da dieser Prozess rechenintensiv ist, ist es sinnvoll, nur eindeutige Orte zu geocodieren, die möglicherweise mehrere Inspektionen in diesen Daten enthalten. Darüber hinaus scheint es eine Möglichkeit zu geben, eine zusätzliche Tabelle mit Verstößen zu erstellen, die weitaus weniger als einmalige Inspektionen sind.
Bevor Sie die Daten aufteilen, nehmen Sie eine Stichprobe dieser Daten, damit die Zahlen für Ihre Erkundungsübung besser überschaubar sind.
Sampling ist etwas, das mit Query Builder einfach durchgeführt werden kann. Tabellen > JMP Query Builder öffnet den Startdialog. Da Sie in diesem Fall keine Verknüpfung durchführen, verwenden Sie DOHMH_New_York_City_Restaurant_Inspection_Results.jmp als primäre Tabelle ohne sekundäre Tabellen zu diesem Zeitpunkt. Im Abfrage-Generator gibt es eine Registerkarte mit dem Namen Beispiel. Wenn Sie das Kontrollkästchen für „Sample this results set“ aktivieren, können Sie „First“ auswählen N Zeilen oder Zufällig N Reihen. Nehmen Sie eine zufällige 10-Prozent-Stichprobe dieser Daten, geben Sie also 44.815 in die Zufallszahl ein N Reihen. Fügen Sie alle Spalten zum Abschnitt Include Columns hinzu und überprüfen Sie dann die SQL. Query Builder hat automatisch die SQL generiert, um diese Abfrage auszuführen:
WÄHLE t1.CAMIS, t1.DBA, t1.BORO, t1.GEBÄUDE,
t1.STRASSE, t1.PLZ, t1.TELEFON, t1."KÜCHENBESCHREIBUNG",
t1. "INSPEKTIONSDATUM", t1. "MASSNAHME", t1. "VERLETZUNGSCODE", t1. "VERLETZUNGSBESCHREIBUNG",
t1."KRITISCHE FLAGGE", t1.ERGEBNIS, t1.GRADE, t1."GRADE DATUM",
t1."PRÜFART", t1."Jahr[PRÜFDATUM]"
VON DOHMH_New_York_City_Restaurant_Inspection_Results t1
ORDER BY RANDOM() LIMIT 44815;
Nach dem Gebrauch die Bestellung nach Zufall () Funktion für unser Sampling, generiert diese Abfrage die entsprechende Teilmenge der Daten. Speichern Sie dies als Teilmenge und trennen Sie dann die demografischen Merkmale des Restaurants und die Verstoßcodes ab. Auch hier kann der Query Builder verwendet werden. Beginnen Sie mit den Verletzungscodes. Auch hier benötigen Sie nur eine Primärtabelle. Ziehen Sie VERSTOSSCODE und VERLETZUNGSBESCHREIBUNG per Drag-and-Drop in die Variablenliste und ziehen Sie dann den VERLETZUNGSCODE erneut hinein, wodurch Sie nach Anzahl aggregieren und die Tabelle mit den gewünschten Eigenschaften generieren können. Ändern Sie den JMP-Namen der Aggregationsspalte 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 die VIOLATION COUNT auf die Order By-Rolle ziehen, wie in Abbildung 8 gezeigt.

Abbildung 8. Aggregationsspalte umbenannt in Violation Count, mit einer Order By-Eigenschaft
Mit nur 88 eindeutigen Verletzungscodes ist diese resultierende Abfrage viel kompakter. Nach der Benennung dieser Tabelle D-ViolationCodes.jmp , T Dies ist ein guter Zeitpunkt, um mit Graph Builder zu 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 dann mit der rechten Maustaste auf die VERLETZUNGSBESCHREIBUNG und Sortieren nach VERLETZUNGSZAHL (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 enthalten (Abbildung 9).

Abbildung 9. Höchste Anzahl von Verstößen (>2500 eindeutige Datensätze in der Stichprobentabelle)
Wenn Sie sich vorerst von der Verletzungstabelle entfernen, können Sie sich auf die einzigartigen Restaurant-Demografien konzentrieren. An dieser Stelle können Sie auch die Verstoßbeschreibung löschen, wodurch eine Reihe doppelter Zeilen in der Hauptfaktentabelle eingespart werden. Verwenden Sie den VIOLATION CODE, der eine viel kompaktere Methode zum Organisieren dieser Daten darstellt (Zeichenfolgen aus drei Buchstaben im Vergleich zu satzlangen Zeichenfolgen).
Verwenden Sie erneut den Query Builder, um die eindeutigen Restaurantdemografien abzuschälen. Es ist sehr wahrscheinlich, dass es in NYC mehr als einen Pizzaladen mit demselben Namen gibt, aber Query Builder kann mit dieser Situation umgehen. Die Spalte CAMIS fungiert als ID, mit der eindeutige Restaurants identifiziert werden können. Ziehen Sie im Abfragegenerator zweimal CAMIS hinein, von denen eines Aggregiert nach Anzahl sein und in INSPECTION COUNT umbenannt werden sollte. Die restlichen demografischen Daten sind DBA, BORO, GEBÄUDE, STRASSE, PLZ, TELEFON und KÜCHENBESCHREIBUNG. Berechnen Sie abschließend eine Spalte mit dem Namen ADDRESS für den Geocoder, was als Post-Query-Skript ausgeführt wird. Führen Sie die Abfrage aus und verwenden Sie dann eine Formelspalte mit der folgenden Formel:
:GEBÄUDE || " " || :STRASSE || " " || :BORO || "NY", || Verkohlen ( :PLZ )
Diese Formel stellt die richtige Adresse zusammen. Tippen :ADRESSE << Skript bekommen ; in einem Skripteditor erzeugt die JSL, die zum Generieren der Spalte für ein Post-Query-Skript erforderlich ist. Kopieren Sie diesen Code, fügen Sie ihn in die entsprechende Registerkarte im Abfragegenerator ein und generieren Sie dann eine Spalte, die die Daten für eine bessere Schnittstelle mit dem Geocode in 20 Gruppen aufteilt. Nachdem Sie eine neue Spalte namens Group and Initialize Data: Sequence Data, From 1 to 20, Step 1, Repeat 1 generiert 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 unter D-Restaurants.jmp . Löschen Sie als letzten Schritt die zusätzlichen Spalten aus der Now-Faktentabelle, einschließlich: DBA, BORO, GEBÄUDE, STRASSE, PLZ, TELEFON und KÜCHENBESCHREIBUNG.
Speichern Sie diese Tabelle unter F-Inspektionen.jmp . Jetzt können Sie die Gruppen von Restaurants mit einem von Xan Gregg erstellten Add-In geokodieren, das auf JMP File Exchange [GREGG] verfügbar ist und OpenStreetMaps.org zum Geokodieren von Standorten verwendet. Dieser Dienst ist rechenintensiv und fehleranfällig, daher ist es am besten, ihn aufzuteilen D-Restaurants nach Gruppe mit Tabellen > Teilmenge. Die Funktion Subset By dieser Plattform, die in Abbildung 10 dargestellt ist, ist hier hilfreich.

Abbildung 10. Plattform für Untergruppentabellen zum Aufteilen nach Restaurantgruppen
Die neu erstellten 20 Tabellen können mit dem Add-in individuell geokodiert werden. Das Adressfeld hilft bei der Bestimmung des korrekten Längen- und Breitengrads. Speichern Sie schließlich die Ergebnisse in derselben Datentabelle.
Um die Datentabelle wieder in eine einzige Dimensionstabelle mit Positionen zu bringen, verwenden Sie die Funktion Tabellen > Verketten, indem Sie die 20 Gruppen kombinieren; es heißt D-RestaurantswLocation.jmp.
Nachdem Sie diese Tabelle nun mit Query Builder aufgeschlüsselt haben, können Sie sie mit Virtual Join wieder aufbauen.
Beginnen Sie zunächst mit unseren zwei Maßtabellen: Restaurants-wLocation.jmp Und ViolationCodes.jmp . Klicken Sie mit der rechten Maustaste auf den VERLETZUNGSCODE und wählen Sie die Link-ID aus, um den Beginn der virtuellen Verbindung einzurichten. Beachten Sie, dass in der Spaltenliste ein kleines Schlüsselsymbol angezeigt wird. Gehen Sie zum Restauranttisch und machen Sie dasselbe mit dem CAMIS. Um die virtuelle Verknüpfung abzuschließen, wechseln Sie zur Faktentabelle, die alle Inspektionen enthält, und wählen Sie dann Link Reference 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 skriptgesteuert werden:
Zur Linkreferenz:
Set Property("Link Reference", Reference Table("D(f)-Restaurants-wLocation.jmp"));
Für die Link-ID:
Eigenschaft festlegen ("Link-ID", 1);

Abbildung 11. Virtueller Beitritt
Abbildung 11 zeigt, dass Sie Zugriff auf die Spalten in beiden Dimensionstabellen haben, ohne die Faktentabelle zu belasten.
Erstellen Sie schließlich ein Dashboard, um diese Daten zu visualisieren und zu untersuchen, indem Sie die virtuell verbundenen Spalten nutzen.
Abbildung 12 zeigt, wie Dashboard Builder eine Sammlung von fünf Diagrammen anzeigt. Um zwei der Diagramme als Auswahlfilter zu verwenden, beginnen Sie mit der hierarchischen Filtervorlage in Dashboard Builder und verwenden Sie CRITICAL FLAG und BORO als Filter und hierarchischen Filter. Verwenden Sie als Nächstes ein Diagramm der Notenanzahl, die mittlere Punktzahl nach Quantil auf einer Karte und schließlich eine Heatmap der Datumsanzahl nach Art der Inspektion.

Abbildung 12. Dashboard Builder-Modus von Application Builder mit Final NYC Inspection Dashboard
Dies ist nur ein Beispiel für die Art der Visualisierung, die Sie mit diesen Daten erstellen können, indem Sie die verknüpften Tabellen nutzen, die durch die virtuelle Verknüpfung bereitgestellt werden. Die geocodierten Daten ermöglichen es Ihnen beispielsweise auch, die Standorte von Restaurants nach Küche aufzuschlüsseln (Abbildung 13).

Abbildung 13. Geocodierte Restaurants, die nach Klasse gefärbt sind und auf einer Karte auf Straßenebene angezeigt werden
SQL-Generierung und -Bereitstellung
Ein weiterer großer Vorteil der Verwendung von Query Builder ist die Generierung von Structured Query Language (SQL). SAS kann SQL innerhalb von Proc SQL verwenden, und die meisten Datenbanken verwenden SQL als Programmiersprache, um Tabellen zu verknüpfen und zu verwalten. SQL kann aus einer Abfrage generiert werden, die Sie in der Point-and-Click-Oberfläche von Query Builder definieren.
Unten ist die von Query Builder erstellte SQL für die Verknüpfung aller Dimensionstabellen mit der verknüpften Tabelle von series.jmp Und AllData.jmp (aus Fall 1) und das SQL aus dem Join von Vollständige Datei join.jmp und alle _code.jmp Tische. Der Bibliotheksname -Anweisung, zugehörige libname-Verweise auf die Tabellen und die proz sql Erklärung hinzugefügt. Der Rest des Codes wurde von Query Builder generiert.
Beachten Sie, dass der größte Teil des Codes eine Auflistung der Spalten innerhalb der SELECT-Anweisungen ist. Die Verwendung von Query Builder zum Generieren eines solchen Codes ist eine große Hilfe, selbst wenn der Benutzer SQL kennt. Warum so viele Tabellen- und Spaltennamen eingeben, wenn es nicht nötig ist?
Bibliotheksname Quelle 'Ihr Dateispeicherort' ;
proz sql ;
erstellen Tisch source.dataNseries als
WÄHLEN t1.year, t1.period, t1.value, t1.footnote_codes,
t2.lfst_code, t2.periodicity_code, t2.series_title, t2.absn_code,
t2.Aktivitätscode, t2.Alterscode, t2.Klassencode, t2.Dauer_Code,
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_period AUS source.AllData t1
LINKS OUTER JOIN source.series t2
AN ( t1.serien_id = t2.serien_id ) ;
WÄHLEN t1.Jahr, t1.Zeitraum, t1.Wert, t1.Serientitel,
t1.seasonal, t1.begin_year, t1.begin_period, t1.end_year,
t1.end_period, t13.footnote_text, t34.wkst_text, t33.vets_text,
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.berufstext, 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.class_text, t6.chld_text, t5.born_text, t4.ages_text,
t3.Aktivitätstext, t2.absn_Text AUS source.dataNseries t1
LINKS OUTER JOIN Quelle.Fußnote t13
AN (t1.footnote_codes = t13.footnote_code)
LINKS OUTER JOIN source.wkst t34
AN ( t34.wkst_code = t1.wkst_code )
LINKS OUTER JOIN source.vets t33
AN ( t33.vets_code = t1.vets_code )
LINKS OUTER JOIN source.tdat t32
AN ( t32.tdat_code = t1.tdat_code )
LINKS OUTER JOIN source.sexs t31
AN ( t31.sexs_code = t1.sexs_code )
LINKS OUTER JOIN source.seek t30
AN ( t30.Suchcode = t1.Suchcode )
LINKS OUTER JOIN source.rwns t29
AN ( t29.rwns_code = t1.rwns_code )
LINKS OUTER JOIN source.rnlf t28
AN ( t28.rnlf_code = t1.rnlf_code )
LINKS OUTER JOIN source.rjnw t27
AN ( t27.RJNW_CODE = t1.rjnw_code )
LINKS OUTER JOIN source.race t26
AN ( t26.Renncode = t1.Renncode )
LINKS OUTER JOIN Quelle.Periodizität t25
AN ( t25.Periodizitätscode = t1.Periodizitätscode )
LINKS OUTER JOIN source.pcts t24
AN ( t24.pcts_code = t1.pcts_code )
LINKS OUTER JOIN source.orig t23
AN ( t23.orig_code = t1.orig_code )
LINKS OUTER JOIN Quelle.Beruf t22
AN ( t22.Berufscode = t1.Berufscode )
LINKS OUTER JOIN source.mjhs t21
AN ( t21.mjhs_code = t1.mjhs_code )
LINKS OUTER JOIN source.mari t20
AN ( t20.mari_code = t1.mari_code )
LINKS OUTER JOIN source.look t19
AN ( t19.look_code = t1.look_code )
LINKS OUTER JOIN source.lfst t18
AN ( t18.lfst_code = t1.lfst_code )
LINKS OUTER JOIN source.jdes t17
AN ( t17.jdes_code = t1.jdes_code )
LINKS OUTER JOIN source.indy t16
AN ( t16.indy_code = t1.indy_code )
LINKS OUTER JOIN source.hour t15
AN ( t15.Stunden_Code = t1.Stunden_Code )
LINKS OUTER JOIN source.hheader t14
AN ( t14.hheader_code = t1.hheader_code )
LINKS OUTER JOIN source.expr t12
AN ( t12.expr_code = t1.expr_code )
LINKS OUTER JOIN source.entr t11
AN (t11.entr_code = t1.entr_code)
LINKS OUTER JOIN source.education t10
AN ( t10.Bildungscode = t1.Bildungscode )
LINKS OUTER JOIN Quelle.Dauer t9
AN ( t9.Dauer_Code = t1.Dauer_Code )
LINKS OUTER JOIN source.disa t8
AN ( t8.disa_code = t1.disa_code )
LINKS OUTER JOIN source.class t7
AN ( t7.Klassencode = t1.Klassencode )
LINKS OUTER JOIN source.chld t6
AN ( t6.chld_code = t1.chld_code )
LINKS OUTER JOIN source.born t5
AN ( t5.geborener_code = t1.geborener_code )
LINKS OUTER JOIN source.ages t4
AN ( t4.alters_code = t1.alters_code )
LINKS OUTER JOIN Quelle.Aktivität t3
AN ( t3.Aktivitätscode = t1.Aktivitätscode )
LINKS OUTER JOIN source.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. Jedoch, Daten werden häufig zum Laden, Pflegen und Speichern in vielen Tabellen (normalisiert) organisiert, sodass Analysten vor der Herausforderung stehen, viele Tabellen zu einer analysebereiten Tabelle zusammenzuführen und zusammenzufassen.
JMP Query Builder ist eine leistungsstarke Möglichkeit, mehrere Tabellen in JMP zu verknüpfen. Mit der Vorschaufunktion kann der Benutzer sehen, ob die Verknüpfung richtig definiert ist, bevor eine zeitaufwändige Tabellenverknüpfungsoperation ausgeführt wird. Das generierte SQL kann in SAS oder einer Datenbank bereitgestellt werden, wodurch viel Zeit eingespart wird, da ein solcher Code nicht von Hand geschrieben werden muss.
Verweise
[UGSCPS] Arbeitskräftestatistik – Aktuelle Bevölkerungserhebung – CPS. Abgerufen am 18. August 2016 von http://www.bls.gov/cps/data.htm .
[DOMHH] DOHMH Ergebnisse der Restaurantinspektionen in New York City. Abgerufen am 17. August 2016 von https://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59 .
[GREGG] Gregg, X. (2014, 28. Mai). Geocodierung von Ortsnamen. Abgerufen am 18. August 2016 von https://community.jmp.com/docs/DOC-6175 .