| Oratore |
Trascrizione |
| Jeff Perkinson |
Quando si tratta di sviluppare funzionalità JMP, John Sall, il nostro prossimo relatore, ha un modo interessante di pensare a come stabilire le priorità. Dobbiamo dare la priorità alle funzionalità che... |
| |
Quali funzionalità vogliamo sviluppare? Come facciamo a capire cosa è più importante? Dovremmo concentrarci sulle funzionalità che rendono il nostro prodotto più potente? |
| |
Che ne dite di funzionalità che lo rendano più attraente o più sexy, oppure di funzionalità incentrate sull'alleviamento del dolore, riducendo il carico di analisi? |
| |
John ritiene che il sollievo dal dolore debba essere la principale motivazione del nostro team di ricerca e sviluppo. John è il cofondatore di SAS ed è l'architetto principale di JMP, che ha fondato più di 30 anni fa. |
| |
Per scienziati e ingegneri che dispongono di dati e hanno bisogno di un modo per esplorarli... hanno bisogno di un modo per esplorarli facilmente visivamente sul desktop. |
| |
Parlerà delle forze trainanti dello sviluppo di JMP e dei modi in cui individuiamo le funzionalità su cui vogliamo lavorare. Detto questo, ti do il benvenuto, John. Grazie. |
| John Hall |
Grazie, Jeff. Ed eccoci qui in diretta dal nuovo centro conferenze digitale di Cary, nella Carolina del Nord, dove possiamo ospitare molte più persone. |
| |
Abbassiamo un po' le luci. |
| |
Beh, in realtà non sono qui nel centro conferenze digitale. Sono a casa. Quindi ho un ufficio in casa. Ops. Non quello. |
| |
Come tutti noi, sono a casa e sto tenendo questa conferenza. Ma passiamo a uno sfondo aziendale e iniziamo. |
| |
Di cosa dovrei parlare, quindi? |
| |
Beh, quando ci sono le nuove versioni di JMP, negli anni in cui la Conference Alliance pubblica le sue versioni, è di quello che parliamo, ma negli anni alterni scelgo sempre un argomento diverso. Quindi un anno scelgo le statistiche principali, l'anno successivo i dati fantasma o le funzionalità segrete. |
| |
due anni fa. Oggi il mio argomento sono le parole difficili che iniziano con la lettera A. |
| |
Bene, queste sono le parole che caratterizzano i temi per lo sviluppo di JMP. Quindi, permettetemi di condividere il mio schermo. |
| |
E |
| |
minimizzare |
| |
qui. Condividi. |
| |
Qual è dunque il tema più importante? Ed ecco le tre parole che iniziano con... le parole importanti che iniziano con la lettera A. |
| |
Come ha appena detto Jeff, la prima cosa è l'anabolico. Bene, l'anabolico serve a far crescere la massa muscolare, rendendo JMP più potente. |
| |
I processi anabolici costruiscono organi e tessuti e producono crescita e differenziazione cellulare per aumentare le dimensioni del corpo. |
| |
Quindi aumentare la potenza di JMP sarebbe l'opportunità e questo è ovviamente molto importante, ma il prossimo |
| |
Afrodisiaco, che rende JMP più sexy, più eccitante, il brivido della scoperta. Quindi vogliamo che anche questo sia un attributo. |
| |
Ma ci preoccupiamo anche dei tuoi progressi durante il percorso lavorativo, quindi la terza parola è analgesico, e significa sollievo dal dolore. |
| |
sollievo dal dolore. |
| |
Quindi vorrei che le persone esprimessero cose come le seguenti citazioni immaginarie: "La versione 15 mi è appena servita... mi ha fatto risparmiare ore o addirittura giorni di lavoro che prima dovevo sbrigare con fatica." È un bel sollievo. |
| |
Oppure: "Prima dovevo fare ogni operazione singolarmente, ora la faccio tutta in una volta sola!" Un bel sollievo. Oppure: "Prima dovevo usare diversi altri strumenti per fare tutto, ma ora posso fare tutto con JMP!" |
| |
Oppure: "Ho mostrato ai miei colleghi quanto fosse facile farlo. E sono rimasti sbalorditi." Oppure: "Prima dovevo programmare tutto manualmente, e ora bastano pochi clic del mouse ed è fatto." |
| |
Oppure: "JMP mi aiuta a rimanere concentrato, permettendomi di focalizzarmi sull'analisi dei dati anziché distrarmi eccessivamente con i dettagli operativi." Queste sono le espressioni di sollievo che vogliamo sentire. |
| |
Ora, perché il dolore e la frustrazione sono veri e propri demotivatori? Il flow è importante. Quando sei in flow, non ti distrai. Quando sei in flow, è più probabile che tu impari qualcosa dai dati e faccia scoperte. |
| |
Anche l'empowerment è importante, ma le nuove funzionalità tendono a essere utilizzate solo da pochi, mentre quelle vecchie da molti. Quindi vogliamo migliorare il funzionamento delle vecchie funzionalità. |
| |
per ridurre la difficoltà nell'utilizzarli. E ovviamente, la produttività dipende in larga misura dall'efficacia dei nostri strumenti in termini di utilizzo del tempo. Quindi, se riusciamo a rendere più facile e veloce raggiungere i risultati, è un enorme vantaggio. Vediamo quindi diversi esempi. |
| |
Innanzitutto, gli script che accompagnano le tabelle dati. Quindi qui vedete, fianco a fianco, un esempio di una versione precedente di JMP. Penso sia JMP 14 o 13, dove |
| |
dove prima bisognava tenere premuto il tasto del mouse su questo pulsante, poi compariva una voce di menu e infine si trovava un pulsante "Esegui" per avviare lo script. |
| |
Ma il nuovo metodo prevede semplicemente un pulsante di riproduzione accanto allo script. Quindi basta cliccare su quel pulsante e si evita di dover aprire un menu a tendina. |
| |
Beh, non è una grande vittoria, pensi che la differenza tra cliccare un pulsante e aprire un menu non sia poi così grande. Ma è comunque una grande vittoria per i nuovi utenti, perché i nuovi utenti non devono più capire |
| |
che un pulsante caldo avrà un'esecuzione sottostante. Ma c'è il pulsante di riproduzione proprio lì con lo script. E quindi c'è una maggiore comprensione del fatto che questi sono script. |
| |
E la possibilità di memorizzare gli script insieme ai dati è una caratteristica fondamentale di JMP e vogliamo che le persone la imparino subito. |
| |
e non dover cercare due volte o guardare un suggerimento per capire come funziona. Ed è una grande comodità poter memorizzare tutti i tuoi script |
| |
all'interno della tabella dati stessa e non trovare altri posti dove memorizzarli. Quindi per i nuovi utenti il pulsante di riproduzione. Quindi, questo è un po' un sollievo con questo semplice cambiamento. |
| |
E questo è un cambiamento che ci dispiace di non aver apportato molto prima in JMP. |
| |
Parliamo di come preparare i dati. Una delle cose più importanti da fare quando si preparano i dati è unire dati provenienti da diverse fonti. |
| |
JMP, fin dalla prima versione, ha dovuto integrare delle utility. Ma questo implica comunque un dialogo complesso e la gestione di più tabelle di dati. |
| |
Ecco quindi l'esempio classico in cui noleggio film e abbiamo la nostra tabella delle transazioni di noleggio film |
| |
che contiene il cliente, il numero dell'articolo, la data dell'ordine, l'anno dell'ordine, e poi abbiamo il nostro inventario di film a noleggio, dettagli su ogni film. E poi abbiamo i clienti... informazioni sui clienti e così via. E vogliamo fare domande, coinvolgere tutte e tre le tabelle come |
| |
quali generi sono prevalenti in quali generi di film. Beh, questo implica |
| |
passando attraverso tutte e tre le tabelle, e ovviamente, il comando join è il modo per farlo. Prendo i dati delle transazioni e io |
| |
uniscilo ai clienti. E ovviamente, l'ID cliente è la corrispondenza |
| |
colonna e voglio includere le non corrispondenze dal lato transazione. Quindi, se non ho i dati del cliente, non perdo comunque i dati della transazione. E questo si chiama left outer join, e quindi crea la nuova tabella dati. E ora a quella tabella dati, voglio unire quella |
| |
ai dati dell'inventario. Quindi li unisco tramite il numero dell'articolo che poi corrispondo e che voglio anche un left outer join e ora ho |
| |
un'altra tabella. E così ora, invece di avere tre tabelle, ne ho cinque, i risultati di quell'unione, ma ora posso guardare per rispondere alla domanda del genere per genere, che |
| |
Il genere tende a noleggiare di più quale tipo di film. |
| |
E ciò ha comportato anche la creazione di tutte queste nuove tabelle di dati intermedie. |
| |
A quanto pare, esiste un modo molto più semplice e la fatica di questi passaggi e tabelle aggiuntive può essere notevolmente ridotta. Quindi, permettetemi di annullare questa tabella su quest'altra. |
| |
E vorrei sottolineare che sotto il comando tabelle, c'è un comando chiamato JMP query builder che apre la funzionalità sequel |
| |
Per unire le tabelle, è molto più semplice rispetto a tutte quelle finestre di dialogo di unione, ma crea comunque una nuova tabella di dati. |
| |
Ma un paio di versioni fa, abbiamo introdotto qualcosa di ancora migliore che riduce ulteriormente il dolore, ovvero il join virtuale. Quindi, se guardo questa tabella delle transazioni, |
| |
Ho notato che è già collegato. |
| |
Quindi quello che è successo è che quando ho preparato la tabella dell'inventario dei film, è stata identificata in modo univoco dal numero dell'articolo. E quindi ho dato il numero dell'articolo |
| |
un ID di collegamento che indica che è identificato in modo univoco da quello ed è così che posso indicizzare quella tabella. E allo stesso modo, ho un ID articolo per identificare i dati del cliente. E quando preparo i miei dati di transazione, ho questi due che, in un certo senso, sono chiavi esterne, |
| |
un riferimento di collegamento e fa riferimento a diverse tabelle di dati tramite l'ID identificativo. E quindi, lo collega automaticamente e ho già tutto ciò che mi serve per rispondere a quella domanda. Quindi posso farlo |
| |
per ciascuno |
| |
genere, posso |
| |
trovare il genere del film che voglio fare. E così posso vedere qui che i film d'azione piacciono di più agli uomini e i film per famiglie alle donne e |
| |
rom com più dalle donne e così via. Quindi ho risposto alla mia domanda che coinvolge tre tabelle senza bisogno di passare attraverso tutte le join, perché sono virtualmente unite abbinando quelle colonne ID tra le tabelle. |
| |
Quindi ho fatto |
| |
Ciò mi ha alleviato parecchio il dolore. Quindi chiudiamolo pure. |
| |
Quindi, l'unione delle tabelle di dati ha comportato, a mio avviso, un notevole sollievo nel corso delle varie versioni. |
| |
Registrazione, |
| |
Questa è una delle principali operazioni che svolgiamo quando prepariamo i set di dati. |
| |
Abbiamo iniziato con una ricodifica molto semplice molte versioni fa, dove avevamo solo un campo per il vecchio valore e il nuovo valore e il nuovo valore iniziava con lo stesso del vecchio valore e poi potevo tagliare e incollare o modificare quei valori per ricodificare |
| |
in una nuova colonna o nella colonna esistente. |
| |
E ogni rilascio di recode ha subito notevoli miglioramenti e siamo molto entusiasti del suo stato attuale. E quindi diamo un'occhiata a questo set di dati di ospedali, ospedali distrettuali. E ora recode è proprio lì. |
| |
pulsante destro o menu contestuale nell'intestazione della colonna. E posso scorrere e semplicemente |
| |
Seleziona un insieme di elementi e raggruppali in base a un nuovo valore, come ad esempio una clinica. |
| |
Ma penso che ci siano anche molte scorciatoie. E una delle mie scorciatoie preferite è |
| |
per raggruppare valori simili. Quindi posso impostare una soglia per il numero di differenze di caratteri e così via, e il sistema raggrupperà automaticamente tutti questi elementi. In questo modo raggrupperà tutti gli ospedali distrettuali con lievi differenze di ortografia in uno solo. |
| |
E posso ancora... |
| |
sembra che ne abbia saltato uno. Ma va bene, ora posso raggrupparlo con gli altri e |
| |
tutti, tutti gli ospedali rurali sono stati automaticamente raggruppati in base a quelli corrispondenti e sembra che io possa aggiungerne un altro qui. |
| |
E ora, all'improvviso, ho qualcosa. Ho risparmiato un sacco di fatica nel fare tutta quella ricodifica. |
| |
E naturalmente, in JMP 15 abbiamo aggiunto nuove funzionalità, che non mostrerò qui, ma voglio sottolinearlo. Se hai un altro set di dati con tutti i |
| |
...dimostrato che...i migliori nomi di categoria per quelle categorie, posso eseguire un processo di corrispondenza e fargli scegliere la corrispondenza più vicina quando trova una corrispondenza a tutte quelle cose. Quindi |
| |
Quindi, recode si è evoluto molto nel corso delle varie versioni per semplificare questa operazione. E naturalmente, pensiamoci bene: quanto tempo dedichiamo alla preparazione dei dati rispetto alla loro analisi? |
| |
Spesso dedichiamo dal 70 al 90% del nostro tempo alla preparazione dei dati. Pertanto, ridurre la complessità e il tempo impiegato in questa fase rappresenta un grande vantaggio. Quindi, un sollievo in termini di ricodifica. |
| |
Cliccando sui valori. Ecco |
| |
il set di dati delle città. |
| |
E supponiamo che quando sto esaminando i dettagli di alcune di queste cose, come ad esempio un valore anomalo, io voglia esaminarlo più nel dettaglio. E quindi posso trasformarlo in un link. Quindi proviamo |
| |
Trasformiamolo in una pagina wiki, una pagina Wikimedia. Copierò quel testo lì, andrò alle informazioni sulla colonna e poi lo trasformerò in un link, che è il gestore di espressioni. |
| |
E ora posso prendere |
| |
Questo |
| |
tabella e convertirla in un web |
| |
indirizzo. Quindi |
| |
Andrò su wikipedia.org e poi prenderò il |
| |
il nome di quella città e cambialo in maiuscolo e posso testarlo su quella riga e viene visualizzato Albany. |
| |
E ora dirò... |
| |
Oh, ok. |
| |
E ora posso cliccare su qualsiasi città e ottenere l'articolo di Wikipedia su quella città. Oppure può essere convertito in coordinate della mappa. Quindi posso... copiamo quel testo e andiamo alle informazioni della colonna e ora invece di quello, lo farò |
| |
fare causa per titolo su quello. |
| |
Vediamo se l'analisi va a buon fine. Ora posso cliccare su Denver e verranno effettuate delle ricerche su Denver e su Google Maps. |
| |
Okay, quindi ho trasformato le cose in link per fare... posso fare ricerche, posso fare richieste di mappe e così via. Posso anche |
| |
Incolla questo codice e cliccaci sopra per fargli pronunciare il nome della città. E quindi penso che questo dia grande potenza alla possibilità di memorizzare i link nelle nostre tabelle di dati. |
| |
che rimandano a pagine web o svolgono altre funzioni, tutto ciò che si può esprimere con le ACL, si può fare anche con questi gestori di eventi. Questo può semplificare notevolmente le cose. |
| |
Quindi una delle mie tecniche preferite per ridurre il dolore è la trasmissione, e questo significa che tieni premuto il tasto Comando o il tasto Control per eseguire più analisi, in modo da avere molte analisi simili. Okay, quindi |
| |
Questo funziona non solo per i comandi del menu, ma anche per molti pulsanti e per ridimensionare le cornici dei grafici e fare altre cose, incollare elementi nei grafici e così via. |
| |
Facciamo un esempio. E clicchiamo su... o semplicemente eseguiamo una distribuzione su tutte queste colonne. |
| |
E diciamo che volevo sbarazzarmi di |
| |
questo diagramma a scatola. |
| |
E se solo avessi tenuto premuto |
| |
Per quella voce di menu, vorrei eliminare il box plot. Ma quello che voglio fare è eliminare il box plot per tutte le voci. Quindi quello che farò è tenere premuto il tasto Comando e deselezionare il box plot e ora è deselezionato per tutte quelle voci. Ora posso deselezionare i quantili |
| |
e deselezionerà tutto, perché ha ricevuto quel comando e lo ha trasmesso a tutti gli oggetti attivi in quella finestra, e per quegli oggetti attivi che comprendono quel comando, ad esempio il comando quantili, lo eseguirà. |
| |
Questo funziona anche per alcune cose che hanno a che fare con le finestre di dialogo di richiesta. Quindi diamo un'occhiata alle statistiche di riepilogo. Lasciatemi tenere premuto il tasto Comando e personalizzare le statistiche di riepilogo. |
| |
E diciamo che non voglio gli intervalli di confidenza, ma voglio il numero di valori mancanti. E dirò, ok, e lo applicherà a tutti... |
| |
tutte le cose. Per fare ciò, è stato necessario |
| |
Prendi i risultati di quel dialogo, crea una sceneggiatura e poi trasmetti quella sceneggiatura a tutti gli altri luoghi in quella finestra. |
| |
Ora, questo non accade sempre. A volte, quando ricevi un prompt, riceverai un prompt per ogni analisi. Per ogni rilascio proviamo |
| |
per implementare qualche dettaglio in più, dove il dialogo viene eseguito prima della trasmissione in modo che trasmetta lo stesso dialogo in ogni luogo disponibile. E naturalmente, tutto il resto posso trasmettere una modifica e cambierà, sai, la dimensione di tutti questi elementi, oppure posso trasmettere |
| |
cambiando il colore di sfondo, posso cambiare tutti i colori di sfondo in arancione in tutti i grafici |
| |
che sembrano rilevanti per quel riquadro di inquadratura. Quindi questa trasmissione diventa uno strumento molto potente. |
| |
COSÌ, |
| |
Questo ha risparmiato molta sofferenza alla maggior parte di noi, ma ci sono ancora casi in cui potresti avere 40.000 per gruppi, come è successo all'inizio di quest'anno, e lui vuole fare una previsione inversa su tutti i 40.000 e ti chiede 40.000 volte. |
| |
Questo problema verrà risolto nella versione 16. Sarà un bel sollievo per quell'utente. |
| |
Salvataggio delle colonne delle formule. |
| |
Adoro le colonne di formule. Quando si adatta un modello, è possibile salvare una colonna di previsioni. Ma in quella previsione c'è una formula attiva in modo da poter esaminare quella formula, modificarla, applicarla ai nuovi dati che arrivano. È possibile profilarla rispetto alla formula salvata. È possibile |
| |
se hai |
| |
JMP Pro, puoi andare al deposito delle formule e fare molte altre cose. Puoi generare codice da esso e così via. Quindi la possibilità di salvare le formule è una cosa importante, ma a volte |
| |
Se si utilizzano gruppi, ad esempio, il salvataggio delle formule presenta molte sfumature aggiuntive. |
| |
Ad esempio, adattiamo questi dati sul diabete, dove adattiamo la risposta |
| |
contro tutti questi fattori predittivi, ma vogliamo farlo separatamente per ciascun genere. |
| |
Allora facciamolo. |
| |
E quindi abbiamo due gruppi per genere uno e genere due. E ora diciamo che vogliamo salvare |
| |
il valore previsto, infatti, per entrambi questi. Ora |
| |
ai vecchi tempi, prima che ci sottoponessimo a molti metodi di sollievo dal dolore, |
| |
Quando lo salvi, i dati vengono inseriti in una tabella dati locale. Se guardi nella finestra della tabella dati, nella sezione "Ripristina", vedrai la tabella per gruppo. |
| |
Quindi, per gender=1, ci sono 235 in questa tabella dati virtuale, che puoi visualizzare per gender=1. C'è una variabile di tabella qui che mostra il gruppo per esso. |
| |
E lo salverebbe in questa tabella temporanea invece che nella tabella reale che hai effettivamente salvato. |
| |
Ma |
| |
Qualche tempo fa, quando hai salvato la formula di previsione, l'abbiamo salvata nella tabella dei dati reali. E se guardo questo, l'ho appena salvata per gender=1, |
| |
e se guardo la formula, vedo che se gender=1, ovvero la clausola per gruppo, allora ha questa combinazione lineare che forma una previsione per quella variabile. |
| |
E poi se imposto gender=2 o se tengo premuto il tasto Comando per trasmettere la formula di previsione, ora li ha entrambi e ho entrambe le clausole disponibili per il genere 1 e il genere 2. Quindi aggiunge una clausola ogni volta a quell'output per gruppo. |
| |
A proposito, la stessa cosa succede quando si salvano altre cose, ad esempio quando salvo una colonna di residui, e proviamo a tenere premuto il tasto Comando. |
| |
Se salvo una colonna di residui, verrà salvata per ogni gruppo, ovvero il residuo appropriato per ciascun gruppo. È come se avessi sottratto la formula prevista dalla risposta originale, ma questa volta senza che si tratti di una colonna di formule. |
| |
In quasi tutti i posti in JMP, non l'abbiamo fatto ovunque, ma l'abbiamo fatto nella maggior parte dei posti, salvando in un gruppo |
| |
o in alcuni casi tramite una clausola where, lo salverà quindi nella tabella dati originale con la condizione nell'istruzione if. Okay, quindi questo ha |
| |
ha risparmiato un sacco di fatica. Se non fosse stato disponibile, sarebbe stato salvato in una tabella temporanea e poi avresti dovuto copiare e incollare quella formula e creare delle tabelle nella tabella originale. Quindi abbiamo risolto questi problemi. Ora supponiamo che l'abbia salvato di nuovo, ho ripetuto l'intero processo, |
| |
E |
| |
e ha fatto un'altra cosa, diciamo con variabili diverse, alcune delle quali rimosse, |
| |
e ora l'ho salvato di nuovo. |
| |
COSÌ, |
| |
Salvo la formula di previsione, questa volta tenendo premuto il tasto di trasmissione, ma in realtà ne crea una nuova invece di salvarla nella precedente e aggiunge un 2 alla fine. Bene, come fa a sapere di non doverla salvare nella vecchia? |
| |
Bene, ogni vestibilità ha un ID. E se guardo le proprietà |
| |
tramite ID, ha il numero, un numero univoco che viene rigenerato per ogni adattamento, e quindi finché ha un ID diverso, |
| |
I diversi gruppi avranno lo stesso ID con una partizione. Ma finché hanno lo stesso ID, verranno salvati nello stesso elemento. Altrimenti verrà creato un nuovo spazio per salvarli. |
| |
Inoltre, ogni volta che parliamo di valori predittivi, |
| |
soprattutto formule di previsione, |
| |
creerà un attributo, il creatore e in alcuni casi altre informazioni. In questo caso ha la variabile target y, che è ciò che viene previsto e il creatore si adatta ai minimi quadrati. |
| |
E poi, quando si utilizzano altre piattaforme, ad esempio se si dispone di un confronto tra modelli JMP Pro, tale confronto capirà quali valori previsti si riferiscono a quale creatore e a quale target. In questo modo, può tenere traccia di tutte queste informazioni per le piattaforme a valore aggiunto. |
| |
COSÌ, |
| |
Le colonne formula funzionano aggiungendo nuove clausole e vengono utilizzate altre proprietà, incluso l'ID. |
| |
E le clausole di previsione, se le salvi in variabili categoriche, si salva un'intera gamma di variabili per avere le probabilità per ogni livello di risposta, e tutto ciò è contenuto con tutti i metadati e le necessità. E questo dovrebbe risparmiarti un sacco di problemi. |
| |
COSÌ, |
| |
rimozione degli effetti dai modelli. |
| |
Bene, vediamo un esempio |
| |
Di adattamento |
| |
basta adattare l'altezza al peso. |
| |
Bene, ecco un esempio di polinomio di alto grado. Questo è un polinomio di settimo grado |
| |
che si adatta meglio di |
| |
polinomi di sesto grado e così via. Ma ti fideresti di questa approssimazione? |
| |
Si scopre che se si dà al modello molta flessibilità introducendo termini polinomiali elevati o semplicemente introducendo più variabili, si hanno molte più opportunità di adattamento. E in questo caso è |
| |
Ciò ha consentito la flessibilità di effettuare un'analisi approfondita tra i dati precedenti e l'ultimo dato, al fine di adattare meglio quest'ultimo. |
| |
E quindi è overfitting. È troppo... sta usando quel parametro per adattare il rumore invece di adattare il |
| |
i dati stessi. |
| |
Quindi l'overfitting è un problema ogni volta che si hanno modelli di grandi dimensioni. |
| |
vuoi adattare il segnale, non il rumore. Okay, i modelli grandi tendono a introdurre più variazione nella previsione, perché la previsione, dopotutto, è |
| |
una funzione della variabile y che stanno usando, ma anche quella variabile y è è una parte sistematica di quella variabile più la parte di errore di quella variabile se quella parte della variabile |
| |
è casuale, quindi la tua previsione implica quella casualità. E se gli concedi troppa flessibilità, finirà con |
| |
un problema di overfitting che, includendo tutte le variabili in quel modello, si rischia di prevedere risultati molto peggiori. |
| |
Quindi la cura consiste nel ridurre le dimensioni del modello, ovvero nel ridurre le dimensioni del modello o nel ridurre le dimensioni dei coefficienti del modello, |
| |
in modo che una minore variazione del termine casuale del modello venga trasmessa al valore previsto. E così |
| |
Nei problemi di progettazione degli esperimenti (DOE) di piccole dimensioni, questo non rappresenta un problema perché i dati sono limitati e ben bilanciati per adattarsi perfettamente al modello desiderato. Tuttavia, per i dati osservazionali in modelli di grandi dimensioni, l'overfitting è un problema reale. |
| |
Quindi gli utenti spesso non lo apprezzavano finché non abbiamo introdotto la convalida incrociata in JMP Pro. Quindi, se hai JMP Pro, puoi impostare una colonna di convalida, |
| |
che tratterrà alcuni dati per stimare l'errore su quel set di dati tralasciato. Ed ecco un esempio in cui ho...sto cercando di prevedere le proprietà concrete |
| |
a seconda di tutti questi ingredienti nel calcestruzzo, e ho un modello enorme per questo. E se eseguo semplicemente quel modello, ma trattengo alcuni dati e guardo l'R quadro su quello, |
| |
Per SLUMP ho ottenuto un ottimo adattamento. Ho un R quadro di 79, ma sul set di validazione che ho adattato, ho un R quadro negativo. |
| |
Qualsiasi R quadro negativo significa che l'adattamento è peggiore rispetto al semplice adattamento alla media. Quindi, se adattassi la media, avrei un R quadro pari a zero. Se adatto l'intero modello, ho un R quadro molto peggiore di quello. Quindi, con modelli di grandi dimensioni, si può ottenere un risultato peggiore rispetto al semplice adattamento alla media. |
| |
È un po' controproducente perché il modello è così grande e non abbiamo fatto alcuno sforzo per ridurne le dimensioni. Il modello è stato dominato dal rumore e non dal segnale. Quindi questo è un problema a cui dovreste prestare attenzione. |
| |
Quindi, l'aspetto importante è riuscire a ridurre le dimensioni del modello. |
| |
E ora abbiamo introdotto un comando di dialogo modello per fare proprio questo. |
| |
Analizziamo il diabete con il nostro modello. |
| |
Posso eseguire questo modello e se, diciamo, voglio togliere molte di queste cose non sono molto significative. Sai, l'età |
| |
ha un contributo totalmente non significativo al modello, quindi voglio eliminare l'età. Bene, allora potrei tornare al modello di adattamento e |
| |
richiamalo o e poi elimina l'età. Oppure c'è, posso semplicemente tornare alla finestra di dialogo del modello direttamente qui e inserire l'età e rimuoverla, ma potrei avere una lunga lista di modelli qui e andare avanti e indietro per fare queste cose è un bel po' di lavoro. |
| |
E quindi, piuttosto che fare ciò... |
| |
Vediamo un po', cosa ci faccio qui? |
| |
Qualche versione fa, abbiamo introdotto un nuovo report chiamato "riepilogo degli effetti". |
| |
E con il riepilogo degli effetti, diventa estremamente facile selezionare un sottoinsieme del modello per renderlo più predittivo, |
| |
conferirgli meno flessibilità. |
| |
Quindi posso dire: beh, l'età, quella posso eliminarla. |
| |
Oppure, beh, ci sono molte variabili. Eliminiamone altre tre. |
| |
LDL, beh, sembra più significativo. Quindi posso salvare quel modello. |
| |
Salviamolo semplicemente nella tabella dati. |
| |
E poi torno più tardi e dico: beh, fammi ricordare quel modello che ha questa caratteristica. |
| |
In realtà posso annullare l'azione precedente. E quindi posso annullare ciò e riporta indietro |
| |
tre delle variabili e posso annullare l'operazione e riporta indietro l'età. Quindi, in realtà, quando utilizzo il riepilogo degli effetti per modificare il modello, memorizza effettivamente una memoria di tutte queste cose. E se guardo quello script, |
| |
Riesco a vedere questa cosa della cronologia. Quindi ogni volta che ho applicato un effetto al modello, viene memorizzata una clausola della cronologia. E quando annullo l'azione, questa viene annullata tornando a quella cronologia. |
| |
Quindi rimuovere è facile. Posso anche aggiungere cose. Se sottraessi queste due cose, potrei aggiungerle di nuovo. Potrei aggiungere di nuovo, per esempio, l'età. |
| |
Non è una buona cosa da fare, ma posso farlo. Posso anche modificare il modello riportando indietro una piccola versione del modello e |
| |
del dialogo modello e aggiungi effetti composti e così via. |
| |
Ora un'altra cosa che succede con i modelli grandi e |
| |
(Permettimi di annullare questa operazione). |
| |
Con modelli di grandi dimensioni, |
| |
Stai eseguendo molti test di ipotesi. |
| |
Quindi, se hai un gran numero di test di ipotesi, ci sono alcuni aggiustamenti che dovresti considerare e uno di questi è chiamato tasso di falsa scoperta. E quindi, invece di trattare tutti questi valori p come se fossero test indipendenti, |
| |
Voglio applicare una correzione in modo che i valori p siano corretti per il bias dei test multipli, per il bias di selezione coinvolto nel sottoinsieme del modello. E quindi posso applicare un tasso di falsa scoperta |
| |
correzione ad esso. Quindi, invece del normale valore p, ho il valore p corretto per la falsa scoperta. E ora sono più realistico. Quindi questo mi aiuterà con il problema dell'overfitting e l'ipotesi... il problema del bias di selezione nell'eseguire molti test multipli |
| |
cose. |
| |
COSÌ, |
| |
Ora |
| |
andiamo |
| |
Passiamo all'argomento successivo, che è quello delle trasformazioni. |
| |
Supponiamo |
| |
vuoi realizzare un modello, |
| |
Ma |
| |
Invece di y, vuoi adattare il logaritmo di y. |
| |
Bene, prima quello che dovresti fare è creare una nuova colonna nel set di dati, |
| |
Registro e, |
| |
e poi per Log y, tu |
| |
specificare un... |
| |
crea una formula. |
| |
E posso prendere |
| |
un registro di ciò. |
| |
E ora posso tornare alle specifiche del mio modello e fare quel Log y |
| |
e poi ho avuto una crisi di nervi. |
| |
Oh, è sparito, cosa ho fatto? |
| |
Ho dimenticato di inserire il |
| |
obiettivo, l'argomentazione. |
| |
E quindi ora posso |
| |
adattare il logaritmo di Y |
| |
E ora |
| |
L'ho fatto. Ma proviamo con il profiler. |
| |
Il mio profiler è in termini del logaritmo di Y. Permettetemi di salvare il valore previsto. La mia formula di previsione è in termini del logaritmo di y, |
| |
e ora dovrò andare a correggerlo manualmente... |
| |
quella formula e prendi l'esponenziale di quella |
| |
per riportarlo alle dimensioni originali. Quindi è un bel problema fare trasformazioni in quel modo. |
| |
Beh, diverse uscite fa |
| |
abbiamo introdotto le trasformazioni. |
| |
Quindi posso prendere quella trasformazione e |
| |
trasformalo nel log |
| |
e ora usala direttamente lì come trasformazione e non fa parte della tabella dati. È una variabile virtuale con una formula, ma non viene aggiunta alla tabella dati. |
| |
E ora posso adattare il mio modello al logaritmo di y. Andiamo |
| |
rimuovi l'età in modo che si adatti un po' meglio. |
| |
Ops. |
| |
Avevo selezionato anche quello. |
| |
E ora ho adattato la risposta Log y. |
| |
Quindi, se eseguo un'analisi del profilo, cosa ottengo? |
| |
Profilazione fattoriale, profiler. Invece di profilare il logaritmo di y, profila y. Il profiler lo considera come una trasformazione e dice: "Bene, posso invertire questa trasformazione e tornare alla scala originale". Ed è quello che fa. |
| |
Esso |
| |
Detrasforma, ritrasforma attraverso il logaritmo di y per riportare la previsione sulla scala originale. |
| |
E lo farà per la maggior parte delle trasformazioni che possono essere annullate. Se una trasformazione coinvolge più variabili e così via, non può farlo e farà solo le trasformazioni. Quindi l'originale |
| |
Stessa cosa quando salvo una colonna. Quando salvo la formula di previsione, |
| |
salva una formula di previsione sulla scala di y anziché sul logaritmo di y. |
| |
Questi elementi consentono quindi un incredibile risparmio di tempo e di fatica nell'utilizzo delle trasformazioni. |
| |
Quindi c'è... |
| |
Lasciami |
| |
tornare al diabete |
| |
e fai un altro... considera un'altra trasformazione. |
| |
Quando si lavora con variabili, |
| |
esiste una trasformazione Box-Cox che puoi ottenere. |
| |
E |
| |
tra i fattori di profilazione, l'opzione Box-Cox |
| |
ti dice se hai trasformato un'intera gamma di funzioni di alimentazione, |
| |
Cosa, cosa sarebbe meglio fare? Dovremmo semplicemente annullare la trasformazione? Questo corrisponderebbe a un valore lambda di Box-Cox pari a uno. |
| |
Se avessi fatto zero, sarebbe stato equivalente a calcolarne il logaritmo. Se avessi fatto -1, sarebbe stato equivalente a calcolarne il reciproco. |
| |
L'esponente di -1. Se avessi fatto circa 0,5, sarebbe stato equivalente a prenderne la radice quadrata. |
| |
E ti sta dicendo che questo modello si adatterebbe meglio a una scala di trasformazione regolata per quella trasformazione, se fosse più simile alla trasformazione della radice quadrata, dove lambda era 0,453. Questo è il valore ottimale nella trasformazione di Box-Cox. |
| |
E puoi ingrandire questo |
| |
con una lente d'ingrandimento per ottenere |
| |
per ottenerlo in modo più preciso. |
| |
COSÌ, |
| |
Quindi ora posso trasformarmi, e diverse versioni fa |
| |
Posso... Ho aggiunto diverse colonne. Una è "refit with transform", che creerà una nuova finestra con la risposta della trasformazione. |
| |
Un altro metodo consiste nel sostituire la trasformazione e lo farò. Invece di 0,453, userò semplicemente la trasformazione radice quadrata (0,5) e ora adatterò il modello con quella trasformazione. |
| |
E ora lambda best è intorno a 1, che è dove dovrebbe essere, perché è già trasformato in un colpo solo dalla trasformazione Box-Cox. E ora posso salvare il valore previsto di quello e |
| |
posso profilarlo e così via. E posso anche annullarlo. Quindi, se non mi piace quella trasformazione e voglio tornare all'originale, posso tornare all'originale e riadattarlo. |
| |
COSÌ, |
| |
abbiamo fatto molto per risparmiare dolore |
| |
nel trasformare le risposte. |
| |
Quindi oggi |
| |
C'è un dolore particolare, un dolore specifico quando si hanno molti dati. |
| |
E ci siamo impegnati a fondo per cercare di risolvere i grandi problemi con meno sofferenza. |
| |
Sia che tu abbia molte righe, molte colonne, molti gruppi, molti modelli da provare, |
| |
Nel mondo odierno viviamo in un mondo di big data, con grandi problemi. |
| |
Quindi, se disponiamo di analisi originariamente concepite per gestire problemi di piccole dimensioni, potrebbero non essere adatte a problemi di grandi dimensioni, e il problema principale con i problemi di grandi dimensioni è che la quantità di dati da analizzare è semplicemente eccessiva. |
| |
Se applico lo stesso modello a 1.000 variabili, ho 1.000 report da esaminare. Se cerco valori anomali tra 1.000 colonne, ci sono solo valori anomali, sai, report separati per ogni colonna e così via. Voglio essere in grado di |
| |
per analizzare in modo più efficiente grandi quantità di dati. Quindi abbiamo sviluppato il menu di screening, |
| |
che è pensato per risolvere questo tipo di problemi complessi. Inoltre, ci sono molti altri aspetti all'interno di JMP che risolvono i problemi complessi in modo più efficace. Ad esempio, le serie temporali. La nuova piattaforma di previsione delle serie temporali prevederà molte serie temporali, invece di una sola. |
| |
Quindi gli elementi sulla piattaforma di screening esplorano i valori anomali, esplorano i valori mancanti, esplorano i modelli. Questi servono per effettuare controlli sui dati e poi per cercare associazioni, screening delle risposte, |
| |
Screening dei processi, screening dei predittori. E naturalmente, la previsione delle serie temporali è una novità. Non è presente nel menu di screening, ma è organizzata per la gestione di problemi di grandi dimensioni. |
| |
E tutte queste cose sfruttano non solo modi più compatti per rappresentare i risultati in modo da non dover creare migliaia di report, ma sono anche efficienti dal punto di vista computazionale. Utilizzano il multithreading in modo da sfruttare il tuo |
| |
il multiplo |
| |
core nella tua CPU per renderla molto veloce. |
| |
Diciamo quindi che hai molti dati di processo; hai 568 variabili. Quindi, quali di queste variabili sembrano sane? Bene, lo screening di processo è progettato per rispondere a questo. E quindi può ordinare in base alla stabilità o ordinare in base alla capacità (Ppk) o quali sono in cattive condizioni o ordinare per |
| |
misure dei grafici di controllo, conti fuori controllo e così via. |
| |
Ma ciò che è ancora...mi piace ancora di più, sono alcuni degli strumenti che mostrano tutti i processi in un unico grafico. E ce ne sono due che adoro. Uno è il |
| |
il grafico degli obiettivi che mostra |
| |
come si comporta ciascun processo rispetto ai limiti delle specifiche e se si tratta di un processo capace si trova in questa zona verde. |
| |
Se è al limite, si trova nella zona gialla. Se non lo è, è nella zona rossa, e se è alto, ha troppa varianza. Se è da una parte all'altra, allora c'è un problema. |
| |
Con... |
| |
È decentrato, è fuori bersaglio. |
| |
Ma se si trova nella zona verde allora è un buon processo e con la versione 15 introduciamo il |
| |
Graphlet, la guida al passaggio del mouse |
| |
così puoi vedere ogni processo passando il mouse sopra di esso. E poi l'altro |
| |
Il grafico che adoro per riassumere tutte queste cose e ridurre la fatica di esaminare tutti questi report è questo grafico delle prestazioni del processo. Sull'asse verticale, indica se si rientra nei limiti delle specifiche in base al valore Ppk della capacità. |
| |
Quindi, se il valore è superiore a 1,33, significa che la distribuzione dei valori rientra perfettamente nei limiti di specifica. Sei ampiamente entro i limiti di specifica. |
| |
Se... allora l'indice di stabilità è sull'asse x. Quindi se è un processo piuttosto instabile anche se potrebbe essere capace ma instabile. Quindi se guardi quel processo, potrebbe avere qualche |
| |
cosa di stabilità che vaga un po'. E se sei nella zona gialla, sei |
| |
capace ma instabile e così via. La zona rossa è la zona cattiva dove si è sia incapaci che instabili. E quindi esaminare centinaia o migliaia di processi ora è facile, mentre prima era un'operazione molto complessa. |
| |
La domanda è: cosa è cambiato di più? Ecco alcuni dati del sondaggio dove |
| |
Nel corso di molti anni diversi, hai posto una domanda sulle loro attività. Hai |
| |
andare in campeggio? O giocare d'azzardo in un casinò? O avevi il raffreddore? Sai, tutte queste attività e vuoi sapere quale tra tutte queste attività (e ce n'è |
| |
Penso che ci siano 95 attività diverse) e quale di queste abbia fatto la differenza maggiore. Quindi stai cercando, sai... una cosa che potresti fare è esaminarle una alla volta |
| |
e adattare tale attività all'anno del sondaggio. |
| |
Invece di esaminarli uno alla volta, posso esaminare lo screening delle risposte. |
| |
e basta guardare un solo grafico per vedere cosa è cambiato di più. |
| |
E quindi questo mostra un grafico per tutte queste 95 cose. Innanzitutto, la significatività in termini di logaritmo negativo del valore P, |
| |
che chiamiamo logaritmo del valore, che viene corretto per il tasso di falsa scoperta. E quindi si occupa di parte di quel bias di selezione perché si ordinano tutti quei valori p. |
| |
e selezionando il dietro... i bassi valori P. E trovo che il noleggio di una videocassetta sia cambiato di più, le videocassette, e ovviamente sono diventate obsolete. Quindi, ovviamente, è cambiato. |
| |
Un'altra videocassetta ha cambiato molte cose, raccogliere oggetti da riciclare ha cambiato molte cose, intrattenere le persone a casa mia ha cambiato molte cose. |
| |
Ed ecco quello meno significativo, ma con un grande effetto: usi internet? E ovviamente questo sondaggio è iniziato prima che esistesse internet. Quindi, è cambiato molto. Quindi la domanda su cosa è cambiato di più era |
| |
Ora è facile, mentre prima era difficile. |
| |
Un'altra domanda che hai posto sui big data riguarda i valori mancanti. Ecco quindi... |
| |
280 variabili. |
| |
Dove sono i valori mancanti? Devo preoccuparmene? E posso consultare il report "Esplora valori mancanti" e vedere che, beh, ci sono solo cinque di queste variabili con valori mancanti. |
| |
E alcuni di loro hanno solo una variabile, un valore mancante, ma alcuni ne hanno molti. Quindi quando faccio un'analisi, un'analisi multivariata, probabilmente non voglio includere |
| |
376 variabili su 452. Oppure, se voglio includere J, posso passare attraverso |
| |
e imputare quei valori mancanti |
| |
facendo così, va bene. |
| |
COSÌ, |
| |
Prossima domanda: i dati presentano valori anomali? |
| |
Bene, ho 387 misurazioni, le faccio in questo processo. E voglio scoprire se ci sono valori anomali. Quindi ora abbiamo una funzione per farlo nel menu di screening. Posso |
| |
rendere questo più o meno sensibile. |
| |
Rendiamolo più sensibile |
| |
in questo modo ci sono meno valori anomali e meno scansioni da ripetere. |
| |
Posso guardare |
| |
A |
| |
i nove. Spesso, una sequenza di nove viene utilizzata per rappresentare un valore mancante e quei nove possono essere dei nove reali, ma possono anche essere solo un indicatore di un valore mancante. E quindi, in questi casi, posso dire: aggiungiamo quei nove ai codici dei valori mancanti e ora la memoria è cambiata. |
| |
E ora posso |
| |
Tornate indietro (ci sono molte variabili qui) e ripetete la scansione, così ci saranno meno valori mancanti di cui preoccuparsi. |
| |
In passato, quindi, analizzare i valori anomali era un'operazione complessa. |
| |
Può ancora essere un lavoro impegnativo, ma è molto più facile di un tempo. |
| |
Ora, nella versione 15, abbiamo aggiunto un'altra piattaforma di screening. I dati presentano modelli sospetti? E quindi ecco alcuni dati di laboratorio da uno studio clinico. Questi sono i dati sui modelli di laboratorio della nicardipina. Ci sono 27 risultati di laboratorio che potrei voler esaminare. E quindi richiamo |
| |
la nuova piattaforma, esplora i valori mancanti. E questo mi mostrerà se ho una sequenza di valori. Quindi ho il valore 0,03536 ma ce ne sono sette di fila, a partire dalla riga. |
| |
2065. Posso colorare quelle celle e posso guardare quei valori e forse è l'ultimo valore riportato, che potrebbe non essere sospetto. In questo caso, è il... |
| |
Si tratta della stessa persona. Quindi forse l'ultimo valore riportato è una cosa ragionevole da fare, ma è un evento rarissimo se hai distribuito questi importi... |
| |
se, se si assume una distribuzione casuale per queste cose. |
| |
Anche la sequenza duplicata più lunga. Quindi per questa variabile e iniziamo dalla riga 2816 e anche dalla riga 3034, ci sono quattro righe che avevano gli stessi valori. Quindi se coloro quelle cose, ce ne sono quattro in riga lì. E se io |
| |
Passando alla sequenza successiva, si notano quattro elementi consecutivi con gli stessi valori. Questo potrebbe essere sintomo di un copia-incolla degli stessi valori da un punto all'altro. |
| |
Quindi esplorare i modelli significa cercare quelle cose. E ci sono molte altre cose che puoi esaminare nei dettagli di ciascuna di queste 27 variabili e cercare sintomi di cose sospette o |
| |
effetti negativi del modo in cui hai elaborato i dati e così via. |
| |
COSÌ, |
| |
Esplorare gli schemi è parte integrante della risoluzione di problemi complessi. |
| |
COSÌ, |
| |
Sollievo dal dolore. Gran parte del nostro sviluppo è incentrato sul rendere il flusso delle analisi più fluido, meno gravoso, meno dispendioso in termini di tempo e meno doloroso. Analgesici. |
| |
Ora non sempre sappiamo cosa sia doloroso. Quindi dipendiamo dal feedback per capire su cosa concentrarci. Quando riceviamo quelle email a cui ho dovuto rispondere centinaia di volte, |
| |
Abbiamo ascoltato e comprendiamo il dolore e lo abbiamo risolto in modo che ora tu possa trasmettere in un gruppo con migliaia di cose |
| |
e trasmettere i risultati di un unico dialogo anziché dialogare più volte. Quindi, inviandolo, la situazione è migliorata per tutti, perché non ce ne siamo accorti la prima volta. Pertanto, vi preghiamo di fornirci il vostro feedback. |
| |
Grazie a tutti i miglioramenti che abbiamo già apportato, riteniamo che il processo di preparazione e analisi dei dati sia già diventato molto più fluido, meno interrotto e più ininterrotto. |
| |
COSÌ, |
| |
Invece di impiegare il tuo tempo a superare gli ostacoli, lo dedichi ad apprendere dai tuoi dati, a comprenderli. |
| |
analisi. Ci si potrebbe chiedere se provengano dalla stessa radice, ovviamente non ci piace abbreviare queste due parole. |
| |
La parola "analytics" deriva dal greco analyein, e non so come si pronunci. |
| |
Ma in greco significa spezzare, liberare o rendere libero. Significa prendere qualcosa di complicato e scomporlo in pezzi in modo da poterlo comprendere. |
| |
Ed è esattamente ciò che facciamo con l'analisi dei dati, la scienza dei dati. E "analgesici" deriva da una diversa combinazione di parole: "an-", che significa senza, e "algesia", che è la sensazione di dolore. Quindi stesso prefisso, radici diverse... un po' diverse. |
| |
E non abbreviarli. |
| |
Anabolizzante e afrodisiaco. Ci interessa il potere. |
| |
Gran parte del nostro lavoro consiste nel fornirvi strumenti più potenti per l'analisi dei dati, in gran parte integrati in JMP Pro, oltre che in JMP. |
| |
E speriamo che i dati rendano il tutto emozionante, sapete, il brivido della scoperta. |
| |
L'emozione di imparare a usare le funzionalità avanzate di JMP è entusiasmante, lo troviamo stimolante. È un vero e proprio afrodisiaco. |
| |
Quindi anche il potere e l'eccitazione hanno valore per noi. Non si tratta solo di alleviare il dolore. |
| |
Quindi cosa faremo l'anno prossimo? |
| |
Beh, parole difficili che iniziano con la lettera B. |
| |
Iniziamo con la A, poi c'è la B, giusto? |
| |
Bene, l'anno prossimo uscirà JMP 16. E quindi parleremo di quello. Chissà di cosa parleremo l'anno dopo. Grazie mille. E speriamo che l'analisi dei vostri dati vi risulti il più semplice possibile. |
| Jeff Perkinson |
Grazie mille, John. Lo apprezziamo molto. È stata una conversazione fantastica e, avendo assistito a tanta sofferenza nel corso degli anni, |
| |
È, è tutto ciò che dici, assolutamente vero. Il sollievo dal dolore è una cosa importante per noi. |
| |
Abbiamo ricevuto una domanda, anzi, diverse domande; ad alcune abbiamo già risposto nella sezione Domande e risposte, ma quello che volevo proporvi... |
| |
ha agito sia come sollievo dal dolore, sia come fonte di attrazione, rendendo JMP più potente? |
| John Hall |
Beh, credo che Graph Builder sia la funzionalità che piace di più a tutti. |
| |
È incredibilmente potente poter semplicemente trascinare quelle variabili, fare qualche altro clic e ottenere il grafico desiderato, e poterlo modificare con estrema facilità. |
| |
Quindi è emozionante. È una funzione potente e allevia il dolore; prima era più difficile da ottenere. Quindi penso che sia la cosa preferita da tutti. |
| |
Ma certo che c'è... JMP è un prodotto ricco e siamo orgogliosi di tutto ciò che contiene. Progettazione degli esperimenti, tutto |
| |
Il grande potere in gioco è enorme e abbiamo cercato di semplificare anche questo processo. E mi vengono in mente tante cose. |
| Jeff Perkinson |
Molto bene. Grazie mille, John, lo apprezzo. Se ti è piaciuto questo intervento, ho due suggerimenti per te. Uno, pubblicheremo questo |