Οπτικοποιήστε δεδομένα χρησιμοποιώντας Παράλληλες Συντεταγμένες Σχεδίαση
Oktober 1, 2022Αυτό το άρθρο δημοσιεύτηκε ως μέρος του Data Science Blogathon.
Επισκόπηση Παράλληλων Συντεταγμένων Οικόπεδο
Κατά τη χρήση οπτικοποιήσεων, μια συμπαγής απεικόνιση που δείχνει τη σχέση μεταξύ πολλαπλών μεταβλητών έχει το πάνω χέρι έναντι πολλαπλών απεικονίσεων – μία για κάθε μεταβλητή. Όταν προσπαθείτε να απεικονίσετε αριθμητικά δεδομένα υψηλών διαστάσεων αντί για πολλαπλά γραφήματα ράβδων/γραμμών (ένα για κάθε αριθμητική μεταβλητή), ένα Οικόπεδο παράλληλων συντεταγμένων θα μπορούσε να είναι πιο χρήσιμο.
Ένα γράφημα παράλληλων συντεταγμένων χρησιμοποιείται για την ανάλυση πολυμεταβλητών αριθμητικών δεδομένων. Επιτρέπει τη σύγκριση των δειγμάτων ή των παρατηρήσεων σε πολλές αριθμητικές μεταβλητές.
- Κάθε χαρακτηριστικό/μεταβλητή αντιπροσωπεύεται από έναν ξεχωριστό άξονα. Όλοι οι άξονες είναι ίσοι και παράλληλοι μεταξύ τους. Κάθε άξονας μπορεί να έχει διαφορετική κλίμακα και μονάδα μέτρησης.
- Κάθε δείγμα/παρατήρηση σχεδιάζεται οριζόντια.
Δείτε την παρακάτω γραφική παράσταση Παράλληλες Συντεταγμένες του συνόλου δεδομένων ίριδας, όπου κάθε δείγμα σχεδιάζεται ξεκινώντας από τον αριστερό άξονα προς τον πιο δεξιό άξονα. Μπορούμε να δούμε πώς συμπεριφέρεται ένα δείγμα για κάθε ένα από τα διάφορα χαρακτηριστικά.

Παράλληλες συντεταγμένες για το σύνολο δεδομένων ίριδας
Πηγή εικόνας: https://upload.wikimedia.org/wikipedia/en/4/4a/ParCorFisherIris.png
Από το παραπάνω παράδειγμα, μπορούμε να το δούμε υπάρχουν 4 μεταβλητές/χαρακτηριστικά – Πλάτος σέπαλ, Μήκος σέπαλ, Πλάτος πετάλου, Μήκος πετάλου. Κάθε μία από τις μεταβλητές αντιπροσωπεύεται από έναν άξονα. Κάθε άξονας έχει διαφορετικές ελάχιστες-μέγιστες τιμές
Στην πλοκή, μπορείτε να δείτε ένα ξεκάθαρο μοτίβο να εμφανίζεται
- Λουλούδια που ανήκουν σε μεταξένιος τα είδη έχουν μεγάλα πλάτη σέπαλ αλλά χαμηλό μήκος σέπαλ, πλάτος πετάλου και μήκος
- Λουλούδια που ανήκουν σε versicolor τα είδη έχουν χαμηλά πλάτη σέπαλ και μεσαίο μήκος σέπαλο, πλάτος και μήκος πετάλων
- Λουλούδια που ανήκουν σε viriginica τα είδη έχουν χαμηλά έως μεσαία πλάτη σέπαλων, μεσαίο έως μεγάλο μήκος σέπαλ και μεγάλο πλάτος και μήκος πετάλων
Τα ακόλουθα μπορούν να προσαρμοστούν
- Κλίμακα: Όλοι οι άξονες μπορούν να ομαλοποιηθούν για να διατηρηθούν ομοιόμορφες όλες οι ζυγαριές.
- Σειρά: Τα χαρακτηριστικά μπορούν να παραγγελθούν έτσι ώστε να μην τέμνονται πάρα πολλές γραμμές με αποτέλεσμα ένα μη αναγνώσιμο γράφημα
- Με τονίζοντας μία ή περισσότερες γραμμές, μπορείτε να εστιάσετε σε ένα μέρος της πλοκής που σας ενδιαφέρει
Πώς να φτιάξετε μια γραφική παράσταση παράλληλων συντεταγμένων χρησιμοποιώντας python;
Ας χρησιμοποιήσουμε το Δεδομένα Ολυμπιακών Αγώνων 2021 για την απεικόνιση της χρήσης ενός σχεδίου παράλληλων συντεταγμένων. Αυτό το σύνολο δεδομένων έχει λεπτομέρειες σχετικά με το
- ομάδες που συμμετείχαν – χώρα, κλάδοι
- αθλητές που συμμετείχαν – χώρα, αθλητές
- τελικός απολογισμός μεταλλίων – χώρα, κατάταξη, συνολικά μετάλλια, και η κατανομή σε χρυσά, ασημένια, χάλκινα μετάλλια
Ας προσπαθήσουμε να πάρουμε μια περίληψη της χώρας, του αριθμού των αθλητών, των κλάδων που συμμετείχαν, της κατάταξης και του αριθμού των μεταλλίων και ας προσπαθήσουμε να βρούμε απαντήσεις σε ορισμένες ερωτήσεις
- Τυπικά πόσοι αθλητές έκαναν ένα γήπεδο σε μια χώρα; Σε πόσους κλάδους συμμετείχε; Πόσα μετάλλια κέρδισε μια χώρα;
- Οι χώρες με περισσότερους αθλητές κέρδισαν περισσότερα μετάλλια;
- Οι χώρες που συμμετείχαν σε περισσότερους κλάδους κέρδισαν περισσότερα μετάλλια;
Διαβάστε και προετοιμάστε τα δεδομένα
df_teams = pd.read_excel("data/Teams.xlsx") df_atheletes = pd.read_excel("data/Athletes.xlsx") df_medals = pd.read_excel("data/Medals.xlsx") print(df_teams.info()) print(df_atheletes.info()) print(df_medals.info())
Δεν λείπουν δεδομένα, επομένως δεν απαιτείται συγκεκριμένος χειρισμός δεδομένων που λείπουν.

Ας βρούμε τον αριθμό των κλάδων που έχει συμμετάσχει κάθε χώρα και τον αριθμό των αθλητών από κάθε χώρα που συμμετείχαν και ας συγχωνεύσουμε αυτά τα δεδομένα σε ένα ενιαίο πλαίσιο δεδομένων.
df_medals.rename(columns={'Team/NOC':'NOC', 'Total': 'Total Medals', 'Gold':'Gold Medals', 'Silver': 'Silver Medals', 'Bronze': 'Bronze Medals'}, inplace=True) df_disciplines_per_country = df_teams.groupby(by='NOC').agg({'Discipline':'nunique'}) df_atheletes_per_country = df_atheletes.groupby(by='NOC').agg({'Name':'nunique'}).rename(columns={'Name':'Athletes'}) df = pd.merge(left=df_disciplines_per_country, right=df_medals, how='inner',on='NOC') df = pd.merge(left=df, right=df_atheletes_per_country, how='inner',on='NOC') df.rename(columns={'NOC':'Country'}, inplace=True) df = df[['Country', 'Rank', 'Total Medals', 'Gold Medals', 'Silver Medals', 'Bronze Medals', 'Athletes', 'Discipline' ]] df.sort_values(by='Rank', inplace=True) df.reset_index(inplace=True) df.drop(columns=['index'], inplace=True) df.head(10)

Τελικό σύνολο δεδομένων μετά τη συγχώνευση όλων των διαφορετικών συνόλων δεδομένων
Οικόπεδο χρησιμοποιώντας ραβδόγραμμα
Αρχικά, ας χρησιμοποιήσουμε ραβδόγραμμα για να σχεδιάσουμε τα δεδομένα αθλητών, κλάδων, κατάταξης και μεταλλίων για κάθε χώρα. Για καλύτερη αναγνωσιμότητα, χρησιμοποιώντας μόνο τις κορυφαίες 20 καταχωρήσεις
plt.figure(figsize=(20, 5)) ax = plt.subplot(1,2,1) ax = df[['Country','Athletes']][:40].plot.bar(x='Country', xlabel="", ax=ax) ax = plt.subplot(1,2,2) df[['Country','Discipline']][:40].plot.bar(x='Country', xlabel="", ax=ax)
plt.figure(figsize=(20, 5)) ax = plt.subplot(1,2,1) df[['Country','Rank']][:40].plot.bar(x='Country', xlabel="", ax=ax) ax = plt.subplot(1,2,2) df[['Country','Gold Medals', 'Silver Medals','Bronze Medals',]][:40].plot.bar(stacked=True, x='Country', xlabel="", ax=ax)


Αφού δούμε αυτά τα 4 ξεχωριστά γραφήματα, μερικές από τις ιδέες που μπορούμε να αντλήσουμε είναι
- Οι 5 κορυφαίες χώρες έχουν 300+ αθλητές που συμμετείχαν σε 10+ κλάδους κέρδισαν 50+ μετάλλια από τα οποία τα 20+ είναι χρυσά μετάλλια
- Ενώ οι περισσότερες χώρες έχουν συμμετάσχει < 200 αθλητές σε <7 κλάδους κέρδισαν <20 Μετάλλια εκ των οποίων <5 είναι χρυσά μετάλλια
- Η Ιαπωνία παρότι συμμετείχε 570+ αθλητές σε 20 (οι περισσότεροι κλάδοι από όλες τις χώρες) βρίσκεται στην 3η θέση με 60 συνολικά μετάλλια και 27 χρυσά
- Ενώ η Κίνα συμμετείχε 400 αθλητές σε 15 κλάδους βρίσκεται στη 2η θέση με 88 μετάλλια και 37 χρυσά
Αυτό είναι καλό. Τι γίνεται όμως αν μπορούμε να αντλήσουμε παρόμοιες ιδέες χρησιμοποιώντας μια ενιαία και πιο συμπαγή απεικόνιση
Σχεδιάστε παράλληλες συντεταγμένες χρησιμοποιώντας πάντα
Ας σχεδιάσουμε χρησιμοποιώντας τη διεπαφή pandas για 20 χώρες
df_20 = df.head(20).copy() df_20 = df_20[['Country', 'Athletes', 'Discipline', 'Rank', 'Total Medals', 'Gold Medals', 'Silver Medals', 'Bronze Medals']] plt.figure(figsize=(16,8)) pd.plotting.parallel_coordinates(df_20, 'Country', color=('#556270', '#4ECDC4', '#C7F464'))

Παράλληλες συντεταγμένες Οικόπεδο με χρήση Pandas
Με τη διεπαφή pandas, έχουμε 2 προβλήματα
1. Δεν μπορούμε να ελέγξουμε την κλίμακα μεμονωμένων αξόνων
2. Δεν μπορούμε να επισημάνουμε τις (πολυ-)γραμμές ενσωματωμένες
Θα μπορούσαμε να χρησιμοποιήσουμε το Plotly για καλύτερο έλεγχο των διαφόρων παραμέτρων.
Σχεδιάστε παράλληλες συντεταγμένες χρησιμοποιώντας Plotly
Πριν βουτήξουμε στα βαθιά, λίγα λόγια για το Plotly. Το Plotly είναι μια βιβλιοθήκη γραφημάτων Python που δημιουργεί διαδραστικά γραφήματα ποιότητας δημοσίευσης στο διαδίκτυο. Παρέχει 2 διεπαφές
- Plotly Express, μια απλή διεπαφή, η οποία παράγει φιγούρες εύκολες στο στυλ. Χρησιμοποιεί εσωτερικά αντικείμενα γραφήματος.
- Αντικείμενα γραφήματος Plotly, μια διεπαφή χαμηλού επιπέδου που θα μπορούσε να χρησιμοποιηθεί για καλύτερο έλεγχο. Αυτό που μπορεί να δημιουργηθεί με μια κλήση μεμονωμένης λειτουργίας χρησιμοποιώντας το Plotly Express θα χρειαζόταν πολύ περισσότερο κώδικα.
Για να δημιουργήσετε και να αποδώσετε γραφικά σχήματα (π.χ. γραφήματα, γραφικά, χάρτες και διαγράμματα) στο Plotly, θα πρέπει να
- δημιουργώ φιγούρες που μπορούν να αναπαρασταθούν είτε ως εντολές είτε ως στιγμιότυπα του Plotly .graph_objects
- χειραγωγώ εαν είναι απαραίτητο
- καθιστώ που χρησιμοποιεί τη βιβλιοθήκη JavaScript Plotly.js κάτω από την κουκούλα
Οι παράλληλες συντεταγμένες είναι από προεπιλογή πλούσια διαδραστική. Θα μπορούσε κανείς να σύρει τις γραμμές κατά μήκος των αξόνων για να φιλτράρει περιοχές και να σύρει τα ονόματα των αξόνων κατά μήκος της γραφικής παράστασης για να αναδιατάξει τις μεταβλητές.
Χρησιμοποιήστε διασύνδεση plotly express
Σε παράλληλες συντεταγμένες σχεδιάστε με px.παράλληλες_συντεταγμένεςκάθε σειρά (ή δείγμα) του DataFrame αντιπροσωπεύεται από ένα σημάδι πολυγραμμής που διασχίζει ένα σύνολο παράλληλων αξόνων, έναν για κάθε μία από τις διαστάσεις.
import plotly.express as px df_ = df.copy() # color : Values from this column are used to assign color to the poly lines. # dimensions: Values from these columns form the axes in the plot. fig = px.parallel_coordinates(df_, color="Rank", dimensions=['Rank', 'Athletes', 'Discipline','Total Medals'], color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=2) fig.show()

Παράλληλες συντεταγμένες Σχεδιάστε χρησιμοποιώντας Plotly express
Χρησιμοποιήστε τη διεπαφή graph_objects του Plotly
- Πρώτα, ορίστε τη λίστα των μεταβλητές/άξονες που πρέπει να γραφτούν. Για κάθε διάσταση, καθορίστε το
- εύρος: τιμές έναρξης και λήξης που καθορίζονται ως λίστα ή πλειάδα
- τικβάλς: τιμές όπου πρέπει να εμφανίζονται τα τικ σε αυτόν τον άξονα
- ticktext: κείμενο που πρέπει να εμφανίζεται στα τικ
- επιγραφή: όνομα του άξονα
- αξίες: τιμές που πρέπει να αποτυπωθούν σε αυτόν τον άξονα
- Επειτα, δημιουργήστε ένα Parcoords που είναι μια λίστα χαρακτηριστικών για το σχήμα.
- Επόμενο, δημιουργήστε μια φιγούρα με τα προαναφερθέντα Parcoords
- Τέλος, ο rτελειώνουμε το σχήμα χρησιμοποιώντας εμφάνιση
import plotly.graph_objects as go df_ = df.copy() dimensions = list([ dict(range=(df_['Rank']There is still one issue. USA won the most medals but is displayed at the bottom. Due to this there are unnecessary criss-crossed lines. This is no very intuitive. We would like to see countries in descending order.min(), df_['Rank'].max()),tickvals = df_['Rank'], ticktext = df_['Country'],label="Country", values=df_['Rank']),
dict(range=(df_['Athletes'].min(),df_['Athletes'].max()),label="Athletes", values=df_['Athletes']), dict(range=(df_['Discipline'].min(),df_['Discipline'].max()),label="Discipline", values=df_['Discipline']), dict(range=(df_['Total Medals'].min(), df_['Total Medals'].max()),label="Total Medals", values=df_['Total Medals']), dict(range=(df_['Gold Medals'].min(), df_['Gold Medals'].max()),label="Gold Medals", values=df_['Gold Medals']), dict(range=(df_['Silver Medals'].min(), df_['Silver Medals'].max()),label="Silver Medals", values=df_['Silver Medals']), dict(range=(df_['Bronze Medals'].min(), df_['Bronze Medals'].max()),label="Bronze Medals", values=df_['Bronze Medals']), ]) fig = go.Figure(data= go.Parcoords(line = dict(color = df_['Rank'], colorscale="agsunset"), dimensions = dimensions)) fig.show()

Παράλληλες συντεταγμένες Σχεδιάστε χρησιμοποιώντας αντικείμενα γραφήματος Plotly
Αυτή είναι σίγουρα μια καλύτερη πλοκή από αυτό που μας έδωσαν τα πάντα. Αλλά το μέγεθος του σχήματος είναι κακό – οι ετικέτες κόβονται. Ας προσαρμόσουμε το μέγεθος χρησιμοποιώντας το update_layout
# Adjust the size to fit all the labels fig.update_layout(width=1200, height=800,margin=dict(l=150, r=60, t=60, b=40)) fig.show()

Υπάρχει ακόμα ένα θέμα. Οι ΗΠΑ κέρδισαν τα περισσότερα μετάλλια αλλά εμφανίζονται στο κάτω μέρος. Λόγω αυτού, υπάρχουν περιττές διασταυρούμενες γραμμές. Αυτό δεν είναι πολύ διαισθητικό. Θα θέλαμε να δούμε τις χώρες σε φθίνουσα σειρά
# Let's reverse the min and max values for the Rank, so that the country with top rank comes on the top. dimensions = list([ dict(range=(df_['Rank'].max(), df_['Rank'].min()), tickvals = df_['Rank'], ticktext = df_['Country'],label="Country", values=df_['Rank']), dict(range=(df_['Athletes'].min(),df_['Athletes'].max()),label="Athletes", values=df_['Athletes']), dict(range=(df_['Discipline'].min(),df_['Discipline'].max()),label="Discipline", values=df_['Discipline']), dict(range=(df_['Total Medals'].min(), df_['Total Medals'].max()),label="Total Medals", values=df_['Total Medals']), dict(range=(df_['Gold Medals'].min(), df_['Gold Medals'].max()), label="Gold Medals", values=df_['Gold Medals']), dict(range=(df_['Silver Medals'].min(), df_['Silver Medals'].max()),label="Silver Medals", values=df_['Silver Medals']), dict(range=(df_['Bronze Medals'].min(), df_['Bronze Medals'].max()),label="Bronze Medals", values=df_['Bronze Medals']), ]) fig = go.Figure(data= go.Parcoords(line = dict(color = df_['Rank'], colorscale="agsunset"), dimensions = dimensions)) fig.update_layout(width=1200, height=800,margin=dict(l=150, r=60, t=60, b=40)) fig.show()

Παράλληλες συντεταγμένες Σχεδιάστε χρησιμοποιώντας γραφικά αντικείμενα
Τώρα η πλοκή φαίνεται πολύ καλύτερη. Δεν συμφωνείτε; Αν ακολουθήσετε τη γραμμή που αντιστοιχεί στις Ηνωμένες Πολιτείες της Αμερικής που κατατάσσονται πρώτες στην κορυφή του πίνακα, μπορείτε να δείτε ότι 614 αθλητές έχουν συμμετάσχει σε 18 κλάδους και έχουν κερδίσει συνολικά 113 μετάλλια από τα οποία τα 39 είναι Χρυσά. Ενώ η Κίνα με 400 αθλητές σε 15 κλάδους βρίσκεται στη 2η θέση με 88 μετάλλια και 37 χρυσά.
Από αυτό το ένα γράφημα, μπορούμε να αντλήσουμε τις ακόλουθες πληροφορίες που είναι βασικά οι ίδιες με προηγούμενες. Μόνο σε αυτή την περίπτωση, υπάρχει μία ενιαία συνοπτική προβολή.
Ποιες είναι οι γνώσεις;
- Οι 5 κορυφαίες χώρες έχουν 400+ αθλητές που συμμετείχαν σε 15+ κλάδους κέρδισαν 50+ μετάλλια εκ των οποίων τα 20+ είναι χρυσά μετάλλια
- Ενώ οι περισσότερες χώρες έχουν συμμετάσχει < 200 αθλητές σε <7 κλάδους κέρδισαν <20 Μετάλλια εκ των οποίων <5 είναι χρυσά μετάλλια
- Η Ιαπωνία αν και συμμετείχε 570+ αθλητές σε 20 (οι περισσότεροι κλάδοι από όλες τις χώρες) βρίσκεται στην 3η θέση με 60 συνολικά μετάλλια και 27 χρυσά
- Ενώ η Κίνα συμμετείχε 400 αθλητές σε 15 κλάδους βρίσκεται στη 2η θέση με 88 μετάλλια και 37 χρυσά
Διαδραστικότητα
Για σύνολα δεδομένων μεγάλου μεγέθους, οι γραφικές παραστάσεις παράλληλων συντεταγμένων τείνουν να είναι ακατάστατες. Σε τέτοιες περιπτώσεις, η διαδραστικότητα έρχεται να μας σώσει. Χρησιμοποιώντας τη διαδραστικότητα, είναι δυνατό να φιλτράρετε ή να επισημάνετε ορισμένα τμήματα δεδομένων. Η σειρά των αξόνων μπορεί επίσης να προσαρμοστεί με τον βέλτιστο τρόπο, έτσι ώστε να προκύπτουν μοτίβα ή συσχετίσεις μεταξύ των μεταβλητών.
Τα διαγράμματα παράλληλων συντεταγμένων Plotly υποστηρίζουν τη διαδραστικότητα. Κάποιος θα μπορούσε
- Σύρετε τις γραμμές κατά μήκος των αξόνων για να φιλτράρετε περιοχές
- Σύρετε τα ονόματα των αξόνων κατά μήκος της γραφικής παράστασης για να αναδιατάξετε τις μεταβλητές.

Περίληψη
Είδαμε πώς οι γραφικές παραστάσεις των Παράλληλων Συντεταγμένων – συμπαγείς απεικονίσεις – μπορούν να χρησιμοποιηθούν για πολυμεταβλητά αριθμητικά δεδομένα υψηλών διαστάσεων για να αναδείξουν σημαντικές πληροφορίες. Για να δημιουργήσουμε γραφικές παραστάσεις παράλληλων συντεταγμένων χρησιμοποιήσαμε τη βιβλιοθήκη Plotly Python που παρέχει πολλές βολικές συναρτήσεις.
Σχετικά με τον Συγγραφέα
Ένας τεχνικός αρχιτέκτονας που επίσης λατρεύει να σπάει πολύπλοκες έννοιες σε εύκολα εύπεπτες κάψουλες! Επί του παρόντος, βρίσκω τον δρόμο μου στον συναρπαστικό κόσμο των οπτικοποιήσεων δεδομένων και της αφήγησης δεδομένων!!
Τα μέσα που εμφανίζονται σε αυτό το άρθρο δεν ανήκουν στο Analytics Vidhya και χρησιμοποιούνται κατά την κρίση του συγγραφέα