[Algoritmi][Python] percentili
numpy ha uno strano modo di calcolare i percentili, che non capisco (e per quanto possa contare... non approvo
)
Ho scritto una funzione che calcola i percentili, seguendo questa impostazione:
http://home.deib.polimi.it/svelto/didat ... entili.pdf
Se la uso, mi dà risultati soddifacenti ( a parte indici grandi, che sballa perché va oltre gli indici consentiti).
Infatti:
È quel 3.7 che mi fa strano, dato anche quello scritto nella documentazione...
http://docs.scipy.org/doc/numpy-dev/ref ... ntile.html
Andrea

Ho scritto una funzione che calcola i percentili, seguendo questa impostazione:
http://home.deib.polimi.it/svelto/didat ... entili.pdf
def Percentile(l, x, ordinati = False, interp = True): """L’indice del k-esimo percentile è dato da: Ik = (n+1) × k /100 Dall’indice si ricava quindi il valore esatto con un’interpolazione lineare tra i due dati (con indici pari all’intero prima e dopo di Ik) Esempio 1: n=14 dati xi. Calcoliamo il 23-esimo precentile. I23 = (14+1) × 23 /100 = 3.45 Il valore del 23-esimo percentile sarà compreso tra il 3° ed il 4° dato ( x3 e x4). Numericamente vale x3 + ( x4 – x3) × 0.45 (interpolazione lineare)""" l.sort() I_x = (len(l)+1) * float(x) /100. print "Indice:\t\t\t\t\t\t", I_x, "\t = ( n + 1 ) · k / 100 " print "Valore corrispondente:\t\t",l[int(I_x)-1] print "Differenza fra 2 valori:\t", (l[int(I_x)] - l[int(I_x-1)]) print "Fattore di moltiplicazione:",(I_x - int(I_x)) if ordinati: print l if interp: return l[int(I_x)-1] + (l[int(I_x)] - l[int(I_x-1)]) * (I_x - int(I_x)) else: return l[int(I_x)-1]
Se la uso, mi dà risultati soddifacenti ( a parte indici grandi, che sballa perché va oltre gli indici consentiti).
Infatti:
o = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] print Percentile(o, 30) 3.3 print Percentile(o, 30, ordinati = True, interp = False) 3 print np.percentile(o,30) 3.7
È quel 3.7 che mi fa strano, dato anche quello scritto nella documentazione...
http://docs.scipy.org/doc/numpy-dev/ref ... ntile.html
Andrea
Risposte
R è un altro linguaggio che restituisce 3.7 di default nel caso che hai mostrato, ma al contrario di numpy fornisce molte più informazione sulla ragione di questo risultato. In generale, tutti i metodi per il calcolo dei percentili restituiscono valori compresi tra gli stessi due campioni, ma l'interpolazione può cambiare. Nel caso di R si possono scegliere 9 metodi diversi. Il tuo risultato è restituito scegliendo il tipo 6 (mentre il default è il tipo 7). Qui trovi la documentazione con la spiegazione dei metodi e dei riferimenti bigliografici (in cui probabilmente spiega i vantaggi/svantaggi di ognuno).
Grazie molte: era quello che cercavo.
Andrea
Andrea