Trasformazione delle Variabili: Logaritmica

Parte (3/3)

Potrebbe interessarti:

Il progetto Python, che comprende gli script mostrati in questo post, e quelli relativi alla creazione dei grafici Matplotlib, è disponibile assieme al corso Fondamenti di Statistica per il ML.

Dimmi di Più

La trasformazione logaritmica consiste nel sostituire ogni valore originale x con il suo logaritmo:

$$ x' = \log(x) $$

La base del logaritmo può essere diversa. In statistica è molto comune utilizzare il logaritmo naturale, $\ln(x)$:

Grafico del Logaritmo Naturale di x

Compressione dei Valori

La caratteristica fondamentale della trasformazione è che comprime maggiormente i valori grandi rispetto ai valori piccoli:

$x$$\log(x)$
$1$$0.00$
$2$$0.69$
$10$$2.30$
$100$$4.61$
$1{,}000$$6.91$
$10{,}000$$9.21$

Nella scala originale, la distanza tra $1$ e $10{,}000$ è enorme. Nella scala logaritmica, questi valori vengono riportati in un intervallo molto più compatto. Ad esempio:

Trasformazione Logaritmica: compressione dell'intervallo dei dati

Uno degli utilizzi più importanti è il trattamento delle distribuzioni fortemente asimmetriche a destra, nelle quali sono presenti molti valori relativamente piccoli, e pochi valori molto grandi (un esempio classico è quello dei redditi, dove la presenza di redditi molto elevati produce una lunga coda verso destra).

Applicando il logaritmo:

$$ x' = \log(x) $$

i valori più grandi vengono compressi molto più di quelli piccoli. La distribuzione risultante può quindi diventare meno asimmetrica:

Distribuzione fortemente asimmetrica e Trasformazione Logaritmica

In Python, possiamo usare la funzione numpy.log:

import numpy as np

x = np.array([1, 2, 5, 10, 100])
x_log = np.log(x)

np.set_printoptions(precision=2)
print(x_log)
# [0.0  0.69  1.61  2.3  4.61]

Effetto sugli Outlier

La trasformazione logaritmica può anche ridurre l’influenza visiva e numerica dei valori estremamente grandi, perché comprime le distanze. Consideriamo il seguente esempio:

import numpy as np

# Dataset originale
x = np.array([1, 10, 12, 15, 18, 20, 25, 30, 40, 100, 1000])

# Trasformazione logaritmica (logaritmo naturale)
x_log = np.log(x)

np.set_printoptions(precision=2)
print("Valori x:\n" + str(x))
print("\nValori log(x):\n" + str(x_log))

Otteniamo:

Valori x:
[1  10  12  15  18  20  25  30  40  100  1000]

Valori log(x):
[0.0  2.3  2.48  2.71  2.89 3.0  3.22  3.40  3.69  4.61  6.91]

Il valore $1{,}000$ rimane il valore più grande, ma la sua distanza dagli altri valori è stata fortemente compressa. Attenzione però: la trasformazione logaritmica non elimina gli outlier. Cambia la scala sulla quale vengono rappresentate le distanze.

Il Problema dello Zero

Il logaritmo naturale è definito, nei numeri reali, solamente per $x > 0$, quindi np.log(0) produce -inf, mentre per valori negativi non otteniamo un valore reale valido. Quando una variabile contiene valori non negativi, quindi anche degli zeri, viene spesso utilizzata la formula:

$$ x'=\ln(1+x) $$

NumPy mette a disposizione il metodo log1p:

# Restituisce il logaritmo naturale di uno più l'array di input,
# elemento per elemento
x_log = np.log1p(x)

Per esempio:

import numpy as np

x = np.array([0, 1, 2, 5, 10, 100])
x_log = np.log1p(x)

np.set_printoptions(precision=2)
print(x_log)
# [0.  0.69  1.1  1.79  2.4  4.62]

np.log1p(x) calcola $\ln(1+x)$, ed è preferibile a scrivere manualmente np.log(1 + x), anche per ragioni di precisione numerica quando $x$ è molto piccolo.

Trasformazione di Relazioni Moltiplicative in Additive

Consideriamo la seguente proprietà del logaritmo:

$$ \begin{align*} \log\left({x_2} \cdot {x_1}\right) &= \log(x_2) + \log(x_1)\\[6pt] \end{align*} $$

Una relazione moltiplicativa nella scala originale diventa una relazione additiva nella scala logaritmica. Per esempio, confrontiamo la seguente serie numerica:

$$ 10 \rightarrow 20 \rightarrow 40 \rightarrow 80 $$

Ogni valore è ottenuto moltiplicando il precedente per $2$. Nella scala originale, però, le differenze assolute aumentano:

$$ \begin{align*} 20 - 10 &= 10\\ 40 - 20 &= 20\\ 80 - 40 &= 40 \end{align*} $$

Quindi lo stesso fenomeno — un raddoppio — appare come un incremento ogni volta diverso. Applichiamo invece il logaritmo naturale:

$x$$\Delta x$$\log(x)$$\Delta \log(x)$
$10$-$0.00$-
$20$$10$$0.69$$0.69$
$40$$20$$2.30$$0.69$
$80$$40$$4.61$$0.69$

Ora ogni raddoppio corrisponde alla stessa differenza. In altre parole, nella scala logaritmica, lo stesso raddoppio significa aggiungere sempre una costante k (in questo caso, $k \approx 0.69$). Quindi una crescita costante, che nella scala originale genera una curva esponenziale, nella scala logaritmica può diventare una crescita lineare:

Crescita esponenziale trasformata in crescita lineare

In questo caso, una serie numerica calcolata con la formula:

$$ x_n = 10 \cdot 2^n $$

diventa:

$$ \begin{align*} \log(x_n) &= \log(10\cdot2^n)\\ &= \log(10) + \log(2^n)\\ &= \log(10) + n\log(2) \end{align*} $$

Questa equazione può può essere vista come l’equazione di una retta:

$$ \log(x_n) = \log(2)n + \log(10) \rightarrow y = mn + b $$

dove il coefficiente angolare $m$ è $\log(2)$, e l’intercetta $b$ è $\log(10)$.

La crescita moltiplicativa / esponenziale $10 \cdot 2^n$, dopo la trasformazione logaritmica, diventa una crescita additiva e lineare.

Proprietà del Logaritmo del Rapporto

Consideriamo la seguente proprietà del logaritmo:

$$ \log\left(\frac{x_2}{x_1}\right) = \log(x_2)-\log(x_1) $$

Un rapporto tra i valori originali viene trasformato in una differenza tra i rispettivi logaritmi. Vediamo alcuni dei principali vantaggi di questa trasformazione.

L’Assenza di Variazione Corrisponde a Zero

Con i rapporti, l’assenza di variazione di un valore corrisponde a $1$. Ad esempio:

$$ \frac{100}{100} = 1 $$

Con il logaritmo, l’assenza di variazione corrisponde invece a $0$:

$$ \log\left(\frac{100}{100}\right) = \log(1) = 0 $$

Questo è molto conveniente, perché $0$ diventa il punto naturale che rappresenta l’assenza di variazione:

$$ \begin{aligned} \log(x_2/x_1)&>0 \; \rightarrow \; \text{aumento}\\ \log(x_2/x_1)&=0 \; \rightarrow \; \text{nessuna variazione}\\ \log(x_2/x_1)&<0 \; \rightarrow \; \text{diminuzione} \end{aligned} $$

È una rappresentazione molto più simile a quella delle normali differenze $x_2 - x_1$.

Aumenti e Diminuzioni Reciproche Diventano Simmetrici

Supponiamo che un valore raddoppi. Ad esempio:

$$ 100 \rightarrow 200 $$

Il rapporto è:

$$ \frac{200}{100} = 2 $$

Se successivamente il valore torna da $200$ a $100$:

$$ \frac{100}{200} = 0.5 $$

Numericamente, $2$ e $0.5$ non sono simmetrici intorno a $1$.

Con il logaritmo (naturale):

$$ \begin{align*} \log\left(\frac{200}{100}\right) &= \log(2) \approx +0.693\\[6pt] \log\left(\frac{100}{200}\right) &= \log(0.5) \approx −0.693 \end{align*} $$

otteniamo due valori simmetrici intorno a $0$. Le due variazioni opposte hanno la stessa grandezza e segno opposto. Questo accade in quanto:

$$ \log\left(\frac{x_2}{x_1}\right) = -\log\left(\frac{x_1}{x_2}\right) $$

In Sintesi

La trasformazione logaritmica è particolarmente utile quando il fenomeno può essere descritto attraverso prodotti, rapporti, tassi di crescita o potenze, perché permette di trasformare queste relazioni in forme additive, spesso più semplici da analizzare. Ad esempio, consideriamo una relazione moltiplicativa:

$$ y=a\cdot b\cdot c $$

Se uno dei fattori cambia, il suo effetto su $y$ dipende anche dagli altri fattori.
Applicando il logaritmo:

$$ \begin{align*} \log(y) &= \log(a\cdot b\cdot c)\\[4pt] &= \log(a) + \log(b) + \log(c) \end{align*} $$

I diversi contributi diventano termini che si sommano, e quindi è più semplice separarli e studiarli individualmente. Questo porta ad alcuni vantaggi pratici:

  • le variazioni successive possono essere sommate;
  • lo zero può rappresentare l’assenza di variazione;
  • alcune relazioni non lineari possono diventare lineari.

L’ultimo punto è importante, in quanto molti strumenti statistici, a partire dalla regressione lineare, sono costruiti per descrivere relazioni additive e lineari. Facciamo un esempio e consideriamo la seguente equazione:

$$ y=ae^{bx} $$

che diventa:

$$ \begin{align*} \log(y) &= \log(ae^{bx})\\ &= \log(a) + \log(e^{bx})\\ &= \log(a) + bx \end{align*} $$

che ha la forma di una retta:

$$ y' = q + mx $$
Prossimo
Caricamento
  • Rendering delle formule LaTeX...