Creazione di dati "demo" da dati reali: mascherare senza sfigurare


9

(Non ho idea reale di cosa taggare perché non sono uno statistico e non so in quale campo rientri. Sentiti libero di aggiungere tag più adatti.)

Lavoro per un'azienda che produce software di analisi dei dati e abbiamo bisogno di un set decente di dati per testare e dimostrare il nostro ultimo prodotto. Non possiamo semplicemente riempire il database con l'output di un generatore di numeri casuali perché gli output del programma diventerebbero privi di senso. Uno dei modi più semplici per ottenere tali dati è da un client; abbiamo una grande mole di dati da una prova che abbiamo eseguito. Ora, ovviamente, non possiamo pubblicare i dati effettivi di un cliente, quindi dobbiamo modificarli un po ', ma abbiamo ancora bisogno che si comportino come dati reali.

L'obiettivo qui è quello di prendere il loro set di dati e applicare un "fuzz" ad esso in modo che non possa essere riconosciuto come loro specifico. La mia memoria della teoria statistica è di per sé un po 'confusa, quindi mi piacerebbe gestirla da voi ragazzi:

In sostanza, i dati che abbiamo (dal cliente) sono essi stessi un campione di tutti i dati esistenti (nel paese o nel mondo). Quello che mi piacerebbe sapere è quale tipo di operazioni può essere applicato per rendere il campione non più fortemente rappresentativo della popolazione campione del cliente, mantenendolo comunque approssimativamente rappresentativo della popolazione mondiale.

Per riferimento, per quanto ne sappiamo i dati che abbiamo generalmente seguono grossolane distribuzioni normali (gaussiane).

Il set di dati originale non è ampiamente disponibile, ma potrebbe teoricamente essere riconosciuto da alcune caratteristiche specifiche della regione (non sappiamo quali siano queste caratteristiche, ed è dubbio che qualcuno lo faccia a un livello sufficiente, ma sappiamo che esistono variazioni dal luogo piazzare). Ad ogni modo, sono più interessato alla teoria di questo che alla pratica - Voglio sapere se un'operazione rende impossibile (o almeno difficile) identificare il set di dati di origine in base al parametro X, indipendentemente dal fatto che qualcuno abbia o potrebbe capire il parametro X in primo luogo.

L'approccio che ho escogitato è quello di separare le letture nei vari tipi (senza dire molto, diciamo che un gruppo potrebbe essere "lunghezza" o "tempo impiegato per fare X".) Per ognuno di questi, calcolare il deviazione standard. Quindi, ad ogni valore, aggiungi un valore casuale tra i valori positivo e negativo di (n * stddev) dove n è una frazione che posso usare per ottimizzare il risultato fino a quando i dati non sono sufficientemente "sfocati". Non volevo semplicemente applicare un intervallo statico (diciamo, casuale tra il 90% e il 110% del valore originale) perché alcuni valori variano molto più o meno di altri - in alcune misurazioni, essendo il 10% sulla media è appena percettibile , ma in altri ti rende un grave anomalo.

È sufficiente per mascherare l'origine dei dati originali? In caso contrario, con quali misure statistiche i dati sarebbero comunque identificabili e come li maschererei mantenendo i dati risultanti vagamente realistici?


3
In un recente commento a una domanda correlata , ho fornito collegamenti ad alcuni documenti del sondaggio su questo argomento che sono disponibili online. I collegamenti si concentrano sulla mascheratura dei dati del censimento, ma molti di essi affrontano la questione della mascheratura dei dati in generale.
whuber

Può essere prudente sottolineare che non sono in alcun modo uno statistico o addirittura un matematico. Sono un programmatore di professione, quindi posso gestire spiegazioni algoritmiche ma l'algebra stravagante trasforma il mio cervello in stucco. Inoltre, ciò non deve essere particolarmente rigoroso; le dimostrazioni in cui verranno utilizzati questi dati sono in genere presentazioni: dieci o venti minuti di una delle nostre rappresentanti che frugano nel software. Se a qualcuno è permesso di provare il software per un periodo prolungato, inizieranno inserendo i propri dati al suo interno - non potranno davvero controllare i dati della demo.
anaximander,

2
Suggerirei di assumere uno statistico che lo abbia già fatto. Non fare di questo il tuo primo rodeo. Non vuoi essere pronto a fare un lavoro terribile in questo, vero? Vedi arstechnica.com/tech-policy/2009/09/…
David J.

Risposte:


2

Ci sono alcuni suggerimenti:

  1. Converti in forma senza dimensioni. Se va da 0 a 1 e non ha unità come furlong per quindici giorni o tonnellate di carbone attaccate, è più difficile da riconoscere.
  2. Aggiungi un piccolo numero casuale ad esso. Quando contorti un gaussiano con un gaussiano, ottieni solo un altro gaussiano. Non cambia la sua essenza, ma il passaggio da valori esatti mantiene qualcuno che cerca su google numeri per cercare di capire di cosa si tratta.
  3. Mi piace l'idea di ruotarlo. È possibile ritardare un certo numero di passaggi temporali per creare un set di dati 2d dal set di dati 1d. È quindi possibile utilizzare PCA o SVD (dopo il centraggio e il ridimensionamento) per determinare una rotazione. Dopo aver ruotato i dati in modo appropriato, è stata modificata la varianza e si sono confuse le informazioni in sé. È possibile segnalare uno degli assi di coordinate ruotati come "dati campione".
  4. Potresti mescolarlo con dati fortemente formati da qualche altra fonte. Quindi, se i tuoi dati di esempio sono dati di borsa, potresti aggiungere perturbazioni basate sul tempo o sulle variazioni della media del tono dalla tua colonna sonora preferita dei Beatles. Se le persone possono o meno dare un senso a Nasdaq, avranno difficoltà a dare un senso a Nasdaq + Beatles.

1

Suggerirei un approccio in due fasi. Il primo passo sarebbe il campionamento con la sostituzione, simile al metodo utilizzato nel bootstrap. In R, potresti usare

 newdata = sample(olddata, replace = TRUE)

Ora hai un set di dati diverso con le stesse proprietà dell'originale. Il secondo passo sarebbe quello di aggiungere una variabile casuale centrata attorno allo zero:

 newdata = newdata + runif(1, min = -10, max = 10)

Qualsiasi variabile casuale simmetrica intorno allo zero funzionerà e i limiti della distribuzione non sono importanti.

Alla fine, dovresti avere un set di dati completamente diverso con le stesse proprietà del vecchio set di dati.


1
Cosa intendi con "le stesse proprietà"? Per lo meno, le varianze e le covarianze saranno diverse. Se sei interessato alle relazioni tra variabili, questo è davvero importante.
Charlie,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.