Trasformazione delle Variabili: Logaritmica
Parte (3/3)
Potrebbe interessarti:
- Trasformazione delle Variabili: Standardizzazione Z-Score - (1/3)
- Trasformazione delle Variabili: Normalizzazione Min-Max - (2/3)
- Misure di Posizione: Percentili, Quartili e Intervallo Interquartile - (1/2)
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.
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)$:

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:

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:

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:
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:

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:
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 $$