Analisi dei social network con Power BI e R: una guida agli elementi visivi personalizzati

Pubblicato: 2022-07-22

L'analisi dei social network sta rapidamente diventando uno strumento importante per soddisfare una varietà di esigenze professionali. Può informare gli obiettivi aziendali come il marketing mirato e identificare i rischi per la sicurezza o la reputazione. L'analisi dei social network può anche aiutare le aziende a raggiungere gli obiettivi interni: fornisce informazioni dettagliate sui comportamenti dei dipendenti e sulle relazioni tra le diverse parti di un'azienda.

Le organizzazioni possono utilizzare una serie di soluzioni software per l'analisi dei social network; ognuno ha i suoi pro e contro ed è adatto a scopi diversi. Questo articolo è incentrato su Power BI di Microsoft, uno degli strumenti di visualizzazione dei dati più comunemente utilizzati oggi. Sebbene Power BI offra molti componenti aggiuntivi di social network, esploreremo gli oggetti visivi personalizzati in R per creare risultati più accattivanti e flessibili.

Questo tutorial presuppone una comprensione della teoria dei grafi di base, in particolare dei grafi diretti. Inoltre, i passaggi successivi sono più adatti per Power BI Desktop, disponibile solo in Windows. I lettori possono usare il browser Power BI su Mac OS o Linux, ma il browser Power BI non supporta alcune funzionalità, come l'importazione di una cartella di lavoro di Excel.

Strutturazione dei dati per la visualizzazione

La creazione di social network inizia con la raccolta dei dati di connessione (edge). I dati di Connections contengono due campi primari: il nodo di origine e il nodo di destinazione , i nodi alle due estremità del bordo. Oltre a questi nodi, possiamo raccogliere dati per produrre approfondimenti visivi più completi, tipicamente rappresentati come proprietà del nodo o del bordo:

1) Proprietà del nodo

  • Forma o colore : indica il tipo di utente, ad esempio la località/paese dell'utente
  • Dimensione : Indica l'importanza nella rete, ad esempio il numero di follower dell'utente
  • Immagine : funziona come un identificatore individuale, ad esempio l'avatar di un utente

2) Proprietà del bordo

  • Colore , tratto o connessione a punta di freccia : indica il tipo di connessione, ad esempio il sentimento del post o del tweet che collega i due utenti
  • Larghezza : indica la forza della connessione, ad esempio quante menzioni o retweet vengono osservate tra due utenti in un determinato periodo

Esaminiamo un esempio visivo di social network per vedere come funzionano queste proprietà:

Viene visualizzato un grafico di cerchi collegati da linee di larghezza variabile con tre sezioni distinte. La sinistra del grafico ha sei forme verdi di varie dimensioni etichettate 1, 2, 3, 4, 5 e 6 in un esagono. I numeri 1-5 sono cerchi, mentre 6 è un diamante. Sono interconnessi da frecce verdi di larghezza e direzione variabili e alcune punte di freccia sono riempite di verde mentre altre non sono riempite. A destra delle forme verdi c'è la sezione successiva: tre forme blu scuro disposte in un triangolo che sono etichettate 7, 8 e 9 e sono interconnesse da frecce blu di diverse larghezze e direzioni (con alcune punte di freccia riempite di blu). I nodi 7 e 9 sono collegati ai nodi 3 e 4 con frecce grigie di diverse larghezze e direzioni (con alcune punte di freccia riempite di grigio). Al centro del grafico, sotto i primi due gruppi di forme, c'è un singolo diamante azzurro etichettato 10. È collegato ai nodi 5, 4 e 9 da frecce grigie punteggiate di diverse larghezze e direzioni (con alcune punte di freccia riempite di grigio) .
I nodi verdi, azzurri e blu scuro e le diverse forme di cerchi o rombi mostrano diversi tipi di nodi. I numeri con sfondi trasparenti fungono da identificatori dell'immagine del nodo e i nodi più grandi (come il nodo 4) sono più importanti nella rete. I diversi tipi di bordo sono indicati da colore (verde, blu o grigio), tratto (pieno o punteggiato) e punte di freccia (vuote o piene); la larghezza del bordo mostra la forza (ad esempio, la connessione dal nodo 8 al nodo 9 è forte).

Possiamo anche utilizzare il testo al passaggio del mouse per integrare o sostituire i parametri precedenti, poiché può supportare altre informazioni che non possono essere facilmente espresse tramite le proprietà del nodo o del bordo.

Confronto delle estensioni dei social network di Power BI

Dopo aver definito le diverse caratteristiche dei dati di un social network, esaminiamo i pro ei contro di quattro strumenti popolari usati per visualizzare le reti in Power BI.

Estensione Grafico dei social network di Arthur Graus Navigatore di rete Reti avanzate di ZoomCharts (edizione leggera) Visualizzazioni personalizzate utilizzando R
Dimensione del nodo dinamico
Dimensione bordo dinamico No No
Personalizzazione del colore del nodo No
Elaborazione complessa dei social network No
Immagini del profilo per i nodi No No
Zoom regolabile No
Filtraggio delle prime N connessioni No No No
Informazioni personalizzate al passaggio del mouse No No No
Personalizzazione del colore del bordo No No No
Altre funzionalità avanzate No No No


Social Network Graph di Arthur Graus, Network Navigator e Advanced Networks di ZoomCharts (Light Edition) sono tutte estensioni adatte per sviluppare semplici social network e iniziare con la tua prima analisi del social network.

Molti cerchi blu scuro, azzurro e arancione (oltre 50 cerchi) sono collegati da sottili linee grigie su uno sfondo bianco. I cerchi hanno un bordo in tinta unita e sono pieni di piccole immagini di vari Pokemon che hanno uno sfondo bianco, e i cerchi bloccano la vista della maggior parte delle linee grigie. Formano nel complesso una forma circolare.
Una visualizzazione di esempio realizzata utilizzando l'estensione Social Network Graph di Arthur Graus.

Molti cerchi blu, viola e grigi (oltre 50 cerchi) sono collegati da sottili linee grigie su uno sfondo bianco. I cerchi sono pieni e pieni e bloccano la vista di alcune linee grigie. Formano una disposizione circolare nel complesso.
Una visualizzazione di esempio realizzata utilizzando l'estensione Network Navigator.

Molti grandi cerchi verde acqua e piccoli arancioni (oltre 50 cerchi) sono collegati da sottili linee grigie su uno sfondo bianco. I cerchi sono pieni e pieni e la maggior parte delle linee grigie sono visibili. Formano nel complesso una forma a cuneo orizzontale, con cerchi più densamente popolati che appaiono sul lato destro. In basso a sinistra del grafico, ci sono alcune icone dei widget e due cerchi etichettati: un cerchio verde acqua etichettato "Da utente" e un cerchio arancione etichettato "A utente". In basso a destra del grafico c'è un logo con la scritta "zoomcharts".
Una visualizzazione di esempio realizzata utilizzando l'estensione Advanced Networks by ZoomCharts (Light Edition).

Tuttavia, se vuoi dare vita ai tuoi dati e scoprire intuizioni rivoluzionarie con elementi visivi che catturano l'attenzione, o se il tuo social network è particolarmente complesso, ti consiglio di sviluppare i tuoi elementi visivi personalizzati in R.

Molti cerchi verdi, blu e viola (oltre 50 cerchi) sono collegati da linee sottili di vari colori (verde, grigio e rosso) su uno sfondo bianco. I cerchi sono pieni e pieni di un'immagine Pokemon al centro e la maggior parte delle linee sottili sono visibili. Nel complesso formano una forma circolare allargata, con i cerchi verdi che spesso si diramano verso cerchi blu o viola più piccoli. L'angolo in alto a destra del grafico ha il testo "Social Network" e sotto il grafico c'è una legenda di linee e cerchi con testo correlato: una linea verde con il testo "Positivo", una linea grigia con il testo "Neutrale", una linea rossa con il testo "Negativo", un cerchio blu con il testo "Menzione" e un cerchio viola con il testo "Retweet".
Una visualizzazione di esempio realizzata utilizzando elementi visivi personalizzati in R.

Questa visualizzazione personalizzata è il risultato finale dell'estensione del social network del nostro tutorial in R e dimostra l'ampia varietà di funzionalità e proprietà nodo/bordo offerte da R.

Creazione di un'estensione di social network per Power BI utilizzando R

La creazione di un'estensione per visualizzare i social network in Power BI usando R comprende cinque passaggi distinti. Ma prima di poter creare la nostra estensione di social network, dobbiamo caricare i nostri dati in Power BI.

Prerequisito: raccogliere e preparare i dati per Power BI

Puoi seguire questo tutorial con un set di dati di prova basato sui dati di Twitter e Facebook o procedere con il tuo social network. I nostri dati sono stati randomizzati; puoi scaricare dati reali di Twitter se lo desideri. Dopo aver raccolto i dati richiesti, aggiungili a Power BI (ad esempio, importando una cartella di lavoro di Excel o aggiungendo dati manualmente). Il risultato dovrebbe essere simile alla tabella seguente:

Viene visualizzata una tabella con tredici righe grigie e bianche alternate. Ha un titolo --- "Social Network" --- con intestazioni sotto di esso. La prima colonna è denominata "Da utente" e contiene otto testi "1" seguiti da cinque testi "2". La seconda colonna è etichettata "All'utente" e recita (dall'alto verso il basso): 2, 3, 5, 6, 7, 8, 9, 10, 7, 8, 11, 13, 14. La terza colonna è etichettata " Numero di connessioni" e legge (dall'alto verso il basso): 12, 46, 29, 79, 49, 11, 90, 100, 66, 29, 62, 13, 45. La quarta colonna è etichettata "Tipo" e recita ( dall'alto verso il basso): Retweet, Menzione, Menzione, Retweet, Retweet, Retweet, Menzione, Menzione, Retweet, Retweet, Retweet, Retweet, Menzione. La quinta colonna è denominata "Sentimento" e recita (dall'alto verso il basso): Positivo, Positivo, Negativo, Neutro, Positivo, Negativo, Positivo, Neutro, Neutro, Negativo, Negativo, Negativo, Negativo. La sesta colonna è denominata "Da nome utente" e contiene otto testi "Aaliyah" seguiti da cinque testi "Aaron". La settima colonna recita "To User Name" e recita (dall'alto verso il basso): Aaron, Abel, Abraham, Ace, Adalyn, Adalynn con due N, Adam, Addison, Adalyn, Adalynn con due N, Adeline, Adriel, Aidan. L'ottava colonna recita "Da Avatar" e contiene otto testi "https://raychemmedica.com/SampleImages/Pokemon/1.png" seguiti da cinque testi "https://raychemmedica.com/SampleImages/Pokemon/2.png" . La nona colonna recita "Ad Avatar" e ogni voce ha il testo "https://raychemmedica.com/SampleImages/Pok" e sembra essere tagliata.

Una volta impostati i dati, sei pronto per creare una visualizzazione personalizzata.

Passaggio 1: imposta il modello di visualizzazione

Lo sviluppo di una visualizzazione Power BI non è semplice, anche gli oggetti visivi di base richiedono migliaia di file. Fortunatamente, Microsoft offre una libreria chiamata pbiviz , che fornisce i file di supporto dell'infrastruttura richiesti con solo poche righe di codice. La libreria pbiviz anche tutti i nostri file finali in un file con .pbiviz che possiamo caricare direttamente in Power BI come visualizzazione.

Il modo più semplice per installare pbiviz è con Node.js. Una volta installato pbiviz , dobbiamo inizializzare il nostro visual R personalizzato tramite l'interfaccia della riga di comando della nostra macchina:

 pbiviz new toptalSocialNetworkByBharatGarg -t rhtml cd toptalSocialNetworkByBharatGarg npm install pbiviz package

Non dimenticare di sostituire toptalSocialNetworkByBharatGarg con il nome desiderato per la visualizzazione. -t rhtml informa il pacchetto pbiviz che dovrebbe creare un modello per sviluppare visualizzazioni HTML basate su R. Vedrai errori perché non abbiamo ancora specificato campi come il nome dell'autore e l'e-mail nel nostro pacchetto, ma li risolveremo più avanti nel tutorial. Se lo script pbiviz non viene eseguito affatto in PowerShell, potrebbe essere necessario prima consentire gli script con Set-ExecutionPolicy RemoteSigned .

Al termine dell'esecuzione del codice, vedrai una cartella con la seguente struttura:

Un elenco di Esplora file contenente otto sottocartelle (.tmp, .vscode, asset, dist, node_modules, r_files, src e style) e otto file (capabilities.json, dependencies.json, package.json, package-lock.json, pbiviz .json, script.r, tsconfig.json e tslint.json). Tutti i file sono 1 KB, ad eccezione di capacity.json (2 KB) e package-lock.json (23 KB).

Una volta che abbiamo la struttura delle cartelle pronta, possiamo scrivere il codice R per la nostra visualizzazione personalizzata.

Passaggio 2: codificare la visualizzazione in R

La directory creata nel primo passaggio contiene un file denominato script.r , che consiste nel codice predefinito. (Il codice predefinito crea una semplice estensione Power BI, che usa il database di esempio iris disponibile in R per tracciare un istogramma di Petal.Length di Petal.Species .) Aggiorneremo il codice ma manterremo la sua struttura predefinita, incluse le sezioni commentate.

Il nostro progetto utilizza tre librerie R:

  • DiagrammeR: crea grafici dal testo
  • visNetwork: fornisce visualizzazioni di rete interattive
  • data.table: aiuta con l'organizzazione dei dati, simile a data.frame

Sostituiamo il codice nella sezione Library Declarations della libreria di script.r per riflettere l'utilizzo della nostra libreria:

 libraryRequireInstall("DiagrammeR") libraryRequireInstall("visNetwork") libraryRequireInstall("data.table")

Successivamente, sostituiremo il codice nella sezione Actual code con il nostro codice R. Prima di creare la nostra visualizzazione, dobbiamo prima leggere ed elaborare i nostri dati. Prenderemo due input da Power BI:

  • num_records : l'input numerico N , tale da selezionare solo le prime N connessioni dalla nostra rete (per limitare il numero di connessioni visualizzate)
  • dataset di dati: i nostri nodi e bordi del social network

Per calcolare le N connessioni che verranno tracciate, è necessario aggregare il valore num_records perché Power BI fornirà un vettore per impostazione predefinita anziché un singolo valore numerico. Una funzione di aggregazione come max raggiunge questo obiettivo:

 limit_connection <- max(num_records)

Ora leggeremo il set di dataset come un oggetto data.table con colonne personalizzate. Ordiniamo il set di dati per valore in ordine decrescente per posizionare le connessioni più frequenti in cima alla tabella. Ciò garantisce che scegliamo i record più importanti da tracciare quando limitiamo le nostre connessioni con num_records :

 dataset <- data.table(from = dataset[[1]] ,to = dataset[[2]] ,value = dataset[[3]] ,col_sentiment = dataset[[4]] ,col_type = dataset[[5]] ,from_name = dataset[[6]] ,to_name = dataset[[7]] ,from_avatar = dataset[[8]] ,to_avatar = dataset[[9]])[ order(-value)][ seq(1, min(nrow(dataset), limit_connection))]

Successivamente, dobbiamo preparare le nostre informazioni sull'utente creando e assegnando ID utente univoci ( uid ) a ciascun utente, memorizzandoli in una nuova tabella. Calcoliamo anche il numero totale di utenti e memorizziamo tali informazioni in una variabile separata chiamata num_nodes :

 user_ids <- data.table(id = unique(c(dataset$from, dataset$to)))[, uid := 1:.N] num_nodes <- nrow(user_ids)

Aggiorniamo le nostre informazioni sull'utente con proprietà aggiuntive, tra cui:

  • Il numero di follower (dimensione del nodo).
  • Il numero di record.
  • Il tipo di utente (codici colore).
  • Collegamenti avatar.

Useremo la funzione di merge di R per aggiornare la tabella:

 user_ids <- merge(user_ids, dataset[, .(num_follower = uniqueN(to)), from], by.x = 'id', by.y = 'from', all.x = T)[is.na(num_follower), num_follower := 0][, size := num_follower][num_follower > 0, size := size + 50][, size := size + 10] user_ids <- merge(user_ids, dataset[, .(sum_val = sum(value)), .(to, col_type)][order(-sum_val)][, id := 1:.N, to][id == 1, .(to, col_type)], by.x = 'id', by.y = 'to', all.x = T) user_ids[id %in% dataset$from, col_type := '#42f548'] user_ids <- merge(user_ids, unique(rbind(dataset[, .('id' = from, 'Name' = from_name, 'avatar' = from_avatar)], dataset[, .('id' = to, 'Name' = to_name, 'avatar' = to_avatar)])), by = 'id')

Aggiungiamo anche il nostro uid creato al set di dati originale in modo da poter recuperare gli ID utente from e to più avanti nel codice:

 dataset <- merge(dataset, user_ids[, .(id, uid)], by.x = "from", by.y = "id") dataset <- merge(dataset, user_ids[, .(id, uid_retweet = uid)], by.x = "to", by.y = "id") user_ids <- user_ids[order(uid)]

Successivamente, creiamo frame di dati di nodi e bordi per la visualizzazione. Scegliamo lo style e la shape dei nostri nodi (cerchi pieni) e selezioniamo le colonne corrette della nostra tabella user_ids per popolare gli attributi color , data , value e image dei nostri nodi:

 nodes <- create_node_df(n = num_nodes, type = "lower",, color = user_ids$col_type, shape = 'circularImage', data = user_ids$uid, value = user_ids$size, image = user_ids$avatar, title = paste0("<p>Name: <b>", user_ids$Name,"</b><br>", "Super UID <b>", user_ids$id, "</b><br>", "# followers <b>", user_ids$num_follower, "</b><br>", "</p>") )

Allo stesso modo, selezioniamo le colonne della tabella del dataset di dati che corrispondono agli attributi from , to e color dei nostri bordi:

 edges <- create_edge_df(from = dataset$uid, to = dataset$uid_retweet, arrows = "to", color = dataset$col_sentiment)

Infine, con i frame di dati del nodo e del bordo pronti, creiamo la nostra visualizzazione utilizzando la libreria visNetwork e memorizziamola in una variabile che il codice di default utilizzerà in seguito, chiamata p :

 p <- visNetwork(nodes, edges) %>% visOptions(highlightNearest = list(enabled = TRUE, degree = 1, hover = T)) %>% visPhysics(stabilization = list(enabled = FALSE, iterations = 10), adaptiveTimestep = TRUE, barnesHut = list(avoidOverlap = 0.2, damping = 0.15, gravitationalConstant = -5000))

Qui personalizziamo alcune configurazioni di visualizzazione della rete in visOptions e visPhysics. Sentiti libero di guardare le pagine della documentazione e aggiornare queste opzioni come desideri. La nostra sezione Actual code è ora completa e dovremmo aggiornare la sezione Create and save widget rimuovendo la riga p = ggplotly(g); poiché abbiamo codificato la nostra variabile di visualizzazione, p .

Passaggio 3: preparare la visualizzazione per Power BI

Ora che abbiamo terminato la codifica in R, dobbiamo apportare alcune modifiche ai nostri file JSON di supporto per preparare la visualizzazione per l'uso in Power BI.

Iniziamo con il capabilities.json . Include la maggior parte delle informazioni che vedi nella scheda Visualizzazioni per un oggetto visivo, come le origini dati della nostra estensione e altre impostazioni. Innanzitutto, dobbiamo aggiornare dataRoles e sostituire il valore esistente con nuovi ruoli dati per il nostro dataset di dati e input num_records :

 # ... "dataRoles": [ { "displayName": "dataset", "description": "Connection Details - From, To, # of Connections, Sentiment Color, To Node Type Color", "kind": "GroupingOrMeasure", "name": "dataset" }, { "displayName": "num_records", "description": "number of records to keep", "kind": "Measure", "name": "num_records" } ], # ...

Nel nostro capabilities.json capacity.json, aggiorniamo anche la sezione dataViewMappings . Aggiungeremo le conditions a cui i nostri input devono attenersi e aggiorneremo lo scriptResult in modo che corrisponda ai nostri nuovi ruoli dati e alle relative condizioni. Vedere la sezione delle conditions , insieme alla sezione select in scriptResult , per le modifiche:

 # ... "dataViewMappings": [ { "conditions": [ { "dataset": { "max": 20 }, "num_records": { "max": 1 } } ], "scriptResult": { "dataInput": { "table": { "rows": { "select": [ { "for": { "in": "dataset" } }, { "for": { "in": "num_records" } } ], "dataReductionAlgorithm": { "top": {} } } } }, # ...

Passiamo al nostro file dependencies.json . Qui aggiungeremo tre pacchetti aggiuntivi in cranPackages in modo che Power BI possa identificare e installare le librerie richieste:

 { "name": "data.table", "displayName": "data.table", "url": "https://cran.r-project.org/web/packages/data.table/index.html" }, { "name": "DiagrammeR", "displayName": "DiagrammeR", "url": "https://cran.r-project.org/web/packages/DiagrammeR/index.html" }, { "name": "visNetwork", "displayName": "visNetwork", "url": "https://cran.r-project.org/web/packages/visNetwork/index.html" },

Nota: Power BI dovrebbe installare automaticamente queste librerie, ma se si verificano errori di libreria, provare a eseguire il comando seguente:

 install.packages(c("DiagrammeR", "htmlwidgets", "visNetwork", "data.table", "xml2"))

Infine, aggiungiamo le informazioni rilevanti per il nostro visual al file pbiviz.json . Ti consiglio di aggiornare i seguenti campi:

  • Il campo della descrizione dell'oggetto visivo
  • URL di supporto dell'oggetto visivo
  • L'URL GitHub dell'oggetto visivo
  • Il nome dell'autore
  • L'e-mail dell'autore

Ora i nostri file sono stati aggiornati e dobbiamo riconfezionare la visualizzazione dalla riga di comando:

 pbiviz package

Dopo aver eseguito correttamente il codice, è necessario creare un file .pbiviz nella directory dist . L'intero codice trattato in questo tutorial può essere visualizzato su GitHub.

Passaggio 4: importa la visualizzazione in Power BI

Per importare la tua nuova visualizzazione in Power BI, apri il tuo report Power BI (uno per i dati esistenti o uno creato durante il nostro passaggio Prerequisito con dati di test) e vai alla scheda Visualizzazioni . Fare clic sul pulsante [altre opzioni] e selezionare Importa un oggetto visivo da un file . Nota: potrebbe essere necessario selezionare prima Modifica in un browser affinché la scheda Visualizzazioni sia visibile.

Viene visualizzato un riquadro con il titolo "Visualizzazioni" e due frecce ">" alla sua destra. Sotto, il testo "Build visual" con due immagini sotto: due rettangoli gialli e una linea a sinistra, e una carta e un pennello a destra. L'immagine dei due rettangoli gialli è selezionata e sotto ha un pannello con più di 30 diverse icone di grafici. L'ultima icona è un'ellissi, che ha il testo al passaggio del mouse "Ottieni più elementi visivi". Sotto il pannello delle icone, il testo "Valori" con una riga di testo sottostante che dice: "Aggiungi campi dati qui". Sotto, il testo "Drill through", seguito da "Rapporto incrociato" con un pulsante di opzione "Off" selezionato accanto ad esso.

Passare alla directory dist della cartella di visualizzazione e selezionare il file .pbiviz per caricare senza problemi l'oggetto visivo in Power BI.

Passaggio 5: creare la visualizzazione in Power BI

La visualizzazione importata è ora disponibile nel riquadro Visualizzazioni. Fare clic sull'icona di visualizzazione per aggiungerla al report, quindi aggiungere colonne pertinenti al set di dataset e num_records :

Viene visualizzato un riquadro con l'icona degli strumenti selezionati con il testo al passaggio del mouse "toptalSocialNetworkByBharatGarg". Sotto l'icona compare il testo "set di dati" con sotto di esso vari rettangoli a tendina (dall'alto verso il basso): Da Utente, A Utente, Numero di Connessioni, Colore, Colore, Nome Utente, Nome Utente, Avatar, Avatar.

È possibile aggiungere testo, filtri e funzionalità aggiuntivi alla visualizzazione in base ai requisiti del progetto. Ti consiglio inoltre di consultare la documentazione dettagliata per le tre librerie R che abbiamo utilizzato per migliorare ulteriormente le tue visualizzazioni, poiché il nostro progetto di esempio non può coprire tutti i casi d'uso delle funzioni disponibili.

Aggiornare la tua prossima analisi del social network

Il nostro risultato finale è una testimonianza della potenza e dell'efficienza di R quando si tratta di creare visualizzazioni Power BI personalizzate. Prova l'analisi dei social network utilizzando elementi visivi personalizzati in R sul tuo prossimo set di dati e prendi decisioni più intelligenti con informazioni dettagliate sui dati.

Il Toptal Engineering Blog estende la sua gratitudine a Leandro Roser per aver esaminato gli esempi di codice presentati in questo articolo.

Dall'alto verso il basso, vengono visualizzate le parole "Gold" (color oro), "Microsoft" e "Partner" (entrambe in nero) seguite dal logo Microsoft.
In qualità di Microsoft Gold Partner, Toptal è la tua rete d'élite di esperti Microsoft. Crea team ad alte prestazioni con gli esperti di cui hai bisogno, ovunque ed esattamente quando ne hai bisogno!