Statistica con J

jredSi può usare J, la mia ultima scoperta?
Ci sono dei casi in cui, mi dicono, è proprio quello che ci vuole. Allora, ci ho provato. Confesso che sono ancora mooolto n00b|niubbo ma ho cominciato a leggere la documentazione (è un mattone!), con scarsi risultati per adesso. Questo post è un primo tentativo di valutazione, anche in funzione di un incontro con un guru di J, R e altri linguaggi orientati alla matematica e statistica. Mi preparo a una ramanzina di quelle mai viste.
Se nel frattempo arrivassero suggerimenti… chissà 😉

Il caso che considero è elementare: calcolare media e deviazione standard (sigma) di una serie di dati.
Si può fare facilmente in millemila modi, ne considero tre, tipici secondo me.

J è fatto apposta e allora proviamolo. Cioè vorrei ma la cosa non è così semplice (sono ancora un pivello, l’ho già dichiarato).
Dalla documentazione che arriva con l’installazione (o da una successiva googlata, non ricordo esattamente) ho messo assieme questo script. Pessimo, sono un pischello, non ho trovato come passare i dati sulla linea di comando. E J mi fa rimpiangere finanche Perl!

#!/home/juhan/bin/j7
mean =: +/ % #
dev =: - mean
stddev =: [: %:@mean *:@dev

dati =: (1 2 3 4 5)
echo 'dati = ' , ": dati
m =: mean dati
echo 'mean = ' , ": m

d =: dev dati
echo 'dev = ' , ": d

stdd =: stddev dati
echo 'std_dev = ' , ": stdd
exit''

std_j

Mi piace poco la shebang, si deve cambiarla cambiando macchina; forse il symlink j7 conviene spostarlo in /bin quando si installa J.

E se –solo per adesso finché scopro come si usa davvero J— lo script fosse eseguito dalla shell, che invoca j7 attraverso una pipe? In questo modo riesco a passare i dati sula linea di comando.
Questo modo di usare la pipe non funziona però con Windows. E anche $* e la shebang e l’opzione -n di echo. Insomma con Windows si dovrebbe operare in modo completamente differente (ho anche un abbozzo ma lo tengo per il futuro).

#!/bin/sh
echo dati = $*
echo -n "   media ="
echo "(+/ % #)" $* | j7
echo -n variance =
echo "(- (+/ % #))" $* | j7
echo -n std dev =
echo "([: %:@(+/ % #) *:@(- (+/ % #)))" $* | j7
echo ""

m_j

Ma non c’è solo J, per fortuna!

Il linguaggio di programmazione ideale per queste cose, secondo me, è Python. O Ruby, o Lua, o Falcon, o quello cui siete abituati.
Con Python è facilissimo e, a differenza del precedente, chiaro:

s = [1, 2, 3, 4, 5]
def average(s): return sum(s) * 1.0 / len(s)
avg = average(s)
print "avg =", avg
variance = map(lambda x: (x -avg)**2, s)
print "variance =", variance
print "average(variance) =", average(variance)
std_dev = average(variance)**0.5
print "std_dev =", std_dev

stddev

OK, l’ho trovato sul Web (mentre cercavo per J). E dentro si trovano sia map() che lambda(). Non che siano necessari ma fa fine, imho. Devo abituarmi a usarle più spesso.

La versione Python (o linguaggio affine, come detto sopra) è la mia versione. Non avrei difficoltà a modificarla, stravolgerla al volo se se ne presentasse l’occasione. Niente panico 😀

OK, in realtà esiste una terza soluzione, l’ho lasciata per ultima ma sarebbe quella utilizzata nella quasi totalità dei casi: la soluzione del mio amico Beppe S, quella che impiega Excel, o un altro foglio di calcolo, io ho usato LibreOffice Calc (ma l’ho verificata con Excel, funziona anche di là).

excel

L’unica difficoltà (sono niubbo) è stato trovare il nome della funzione, STD.DEV.POP().

Per il resto è OK, anche i dati si riescono (loro io sono n00b) a copia-incollare nella relazione, scritta usando Word. E volendo riesco anche a diagrammare all’interno del foglio di calcolo: nessuno ama Gnuplot.

Riguardo J: devo ancora leggere un mucchio di roba ma continuo a domandarmi se ha senso usare verbi di una o due lettere, per niente mnemonici. Allergia alla tastiera?

Panico: adesso pare non funzionino le opzioni per la selezione, copia e stampa dei codici inseriti, chissà se è solo temporaneo 😮 😦

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: