Elasticsearch: aggregazioni metriche

Oltre alla ricerca testuale, Elasticsearch permette di effettuare analisi sui dati mediante le aggregazioni. Tra le varie tipologie di aggregazione disponibili quelle metriche sono orientate proprio a calcolare statistiche su uno o più campi. Mediante degli esempi vedremo quali informazioni possiamo estrarre con questa tipologia di aggregazione.

Share

Reading time: 7 minutes

Come introdotto nell’articolo Elasticsearch: le tipologie di aggregazione, Elasticsearch permette non solo di effettuare ricerche sui dati, ma anche di effettuare delle analisi. Tra le varie tipologie viste, in questo articolo ci occuperemo delle aggregazioni metriche. Queste consentono di eseguire semplici calcoli, come la ricerca dei valori minimi, massimi e medi di un campo.

Le aggregazioni metriche sono di due tipi:

  • aggregazioni metriche a valore singolo: restituiscono una singola metrica. Ad esempio, sum, min, max, avg, cardinality e value_count
  • aggregazioni metriche a valore multiplo: restituiscono più di una metrica. Ad esempio, stats, extended_stats, matrix_stats, percentile, percentile_ranks, geo_bound, top_hits e scripted_metric.

Di seguito vedremo alcune delle funzioni di aggregazione. I dati che utilizzeremo sono quelli di esempio forniti da Kibana. Per aggiungere questi dati, accedete a Kibana, scegliete Home e Try our sample data. Infine, cliccate su Add data per i dati di eCommerce e web logs.

sum, min, max e avg

Le metriche sum, min, max e avg sono aggregazioni di metriche a valore singolo che restituiscono rispettivamente la somma, il minimo, il massimo e il valore medio di un campo.

L’esempio seguente calcola la somma totale del campo taxful_total_price:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "sum_taxful_total_price": {
      "sum": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Esempio di risposta

...
  "aggregations" : {
    "sum_taxful_total_price" : {
      "value" : 350884.12890625
    }
  }
} 

In modo simile, è possibile trovare i valori minimi, massimi e medi di un campo.

Cardinality

La metrica della cardinalità è un’aggregazione di metriche a valore singolo che conta il numero di valori unici o distinti di un campo.

L’esempio seguente trova il numero di prodotti unici in un negozio di e-commerce:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "unique_products": {
      "cardinality": {
        "field": "products.product_id"
      }
    }
  }
} 

Esempio di risposta

...
  "aggregations" : {
    "unique_products" : {
      "value" : 7033
    }
  }
} 

Il conteggio della cardinalità è approssimativo. Se si avessero decine di migliaia di prodotti nel negozio, un calcolo accurato della cardinalità richiederebbe il caricamento di tutti i valori in un insieme di hash e la restituzione della sua dimensione. Questo approccio non è scalabile perché richiede più memoria e causa un’elevata latenza.

È possibile controllare il compromesso tra memoria e precisione con l’impostazione precision_threshold. Questa impostazione definisce la soglia al di sotto della quale ci si aspetta che i conteggi siano quasi precisi. Al di sopra di questo valore, i conteggi potrebbero diventare un po’ meno accurati. Il valore predefinito di precision_threshold è 3.000. Il valore massimo supportato è 40.000.

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "unique_products": {
      "cardinality": {
        "field": "products.product_id",
        "precision_threshold": 10000
      }
    }
  }
} 

value_count

La metrica value_count è un’aggregazione metrica a valore singolo che calcola il numero di valori su cui si basa un’aggregazione.

Ad esempio, è possibile utilizzare la metrica value_count con la metrica avg per trovare quanti numeri l’aggregazione utilizza per calcolare un valore medio.

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
   "aggs": {
    "number_of_values": {
      "value_count": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Esempio di risposta

...
  "aggregations" : {
    "number_of_values" : {
      "value" : 4675
    }
  }
} 

stats, extended_stats, matrix_stats

La metrica stats è un’aggregazione di metriche a più valori che restituisce tutte le metriche di base come min, max, sum, avg e value_count in un’unica query di aggregazione.

L’esempio seguente restituisce le statistiche di base per il campo taxful_total_price:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "stats_taxful_total_price": {
      "stats": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "stats_taxful_total_price" : {
    "count" : 4675,
    "min" : 6.98828125,
    "max" : 2250.0,
    "avg" : 75.05542864304813,
    "sum" : 350884.12890625
  }
 }
} 

L’aggregazione extended_stats è una versione estesa dell’aggregazione stats. Oltre a includere le statistiche di base, extended_stats restituisce anche statistiche come sum_of_squares, varianza e std_deviation.

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "extended_stats_taxful_total_price": {
      "extended_stats": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "extended_stats_taxful_total_price" : {
    "count" : 4675,
    "min" : 6.98828125,
    "max" : 2250.0,
    "avg" : 75.05542864304813,
    "sum" : 350884.12890625,
    "sum_of_squares" : 3.9367749294174194E7,
    "variance" : 2787.59157113862,
    "variance_population" : 2787.59157113862,
    "variance_sampling" : 2788.187974983536,
    "std_deviation" : 52.79764740155209,
    "std_deviation_population" : 52.79764740155209,
    "std_deviation_sampling" : 52.80329511482722,
    "std_deviation_bounds" : {
      "upper" : 180.6507234461523,
      "lower" : -30.53986616005605,
      "upper_population" : 180.6507234461523,
      "lower_population" : -30.53986616005605,
      "upper_sampling" : 180.66201887270256,
      "lower_sampling" : -30.551161586606312
    }
  }
 }
} 

L’oggetto std_deviation_bounds fornisce una varianza visiva dei dati con un intervallo di più/meno due deviazioni standard dalla media. Per impostare la deviazione standard a un valore diverso, ad esempio 3, impostare sigma a 3:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "extended_stats_taxful_total_price": {
      "extended_stats": {
        "field": "taxful_total_price",
        "sigma": 3
      }
    }
  }
} 

L’aggregazione matrix_stats genera statistiche avanzate per più campi in forma di matrice. L’esempio seguente restituisce statistiche avanzate in forma di matrice per i campi taxful_total_price e products.base_price:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "matrix_stats_taxful_total_price": {
      "matrix_stats": {
        "fields": ["taxful_total_price", "products.base_price"]
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "matrix_stats_taxful_total_price" : {
    "doc_count" : 4675,
    "fields" : [
      {
        "name" : "products.base_price",
        "count" : 4675,
        "mean" : 34.994239430147196,
        "variance" : 360.5035285833703,
        "skewness" : 5.530161335032702,
        "kurtosis" : 131.16306324042148,
        "covariance" : {
          "products.base_price" : 360.5035285833703,
          "taxful_total_price" : 846.6489362233166
        },
        "correlation" : {
          "products.base_price" : 1.0,
          "taxful_total_price" : 0.8444765264325268
        }
      },
      {
        "name" : "taxful_total_price",
        "count" : 4675,
        "mean" : 75.05542864304839,
        "variance" : 2788.1879749835402,
        "skewness" : 15.812149139924037,
        "kurtosis" : 619.1235507385902,
        "covariance" : {
          "products.base_price" : 846.6489362233166,
          "taxful_total_price" : 2788.1879749835402
        },
        "correlation" : {
          "products.base_price" : 0.8444765264325268,
          "taxful_total_price" : 1.0
        }
      }
    ]
  }
 }
} 

Nella tabella riportiamo una descrizione delle metriche restituite.

Statistica Descrizione
count

Il numero di campioni misurati.

mean

Il valore medio del campo misurato dal campione.

variance

Quanto si discostano i valori del campo misurato dal suo valore medio. Maggiore è la varianza, maggiore è la distanza dal valore medio.

skewness

Una misura asimmetrica della distribuzione dei valori del campo intorno alla media.

kurtosis

Misura della pesantezza della coda di una distribuzione. Quando la coda diventa più leggera, la curtosi diminuisce. Quando la coda diventa più pesante, la curtosi aumenta. 

covariance

Misura della variabilità congiunta tra due campi. Un valore positivo significa che i loro valori si muovono nella stessa direzione e viceversa.

correlation

Misura della forza della relazione tra due campi. I valori validi sono compresi tra [-1, 1]. Un valore di -1 significa che il valore è correlato negativamente e un valore di 1 significa che è correlato positivamente. Un valore di 0 significa che non c'è una relazione identificabile tra i due campi.

percentile, percentile_ranks

Il percentile è la percentuale dei dati che si trova al livello o al di sotto di un certo valore di soglia.

La metrica del percentile è un’aggregazione metrica a più valori che consente di trovare i valori anomali nei dati o di capire la distribuzione dei dati.

Come la metrica della cardinalità, anche la metrica del percentile è approssimativa.

L’esempio seguente calcola il percentile in relazione al campo taxful_total_price:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "percentile_taxful_total_price": {
      "percentiles": {
        "field": "taxful_total_price"
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "percentile_taxful_total_price" : {
    "values" : {
      "1.0" : 21.984375,
      "5.0" : 27.984375,
      "25.0" : 44.96875,
      "50.0" : 64.22061688311689,
      "75.0" : 93.0,
      "95.0" : 156.0,
      "99.0" : 222.0
    }
  }
 }
} 

Il grado percentile è il percentile dei valori che si trovano al di sopra o al di sotto di una soglia, raggruppati per un valore specifico. Ad esempio, se un valore è maggiore o uguale all’80% dei valori, ha un rango percentile pari a 80.

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "percentile_rank_taxful_total_price": {
      "percentile_ranks": {
        "field": "taxful_total_price",
        "values": [
          10,
          15
        ]
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "percentile_rank_taxful_total_price" : {
    "values" : {
      "10.0" : 0.055096056411283456,
      "15.0" : 0.0830092961834656
    }
  }
 }
} 

geo_bound

La metrica geo_bound è un’aggregazione di metriche a più valori che calcola il riquadro di delimitazione in termini di latitudine e longitudine intorno a un campo geo_point.

L’esempio seguente restituisce la metrica geo_bound per il campo geoip.location:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "geo": {
      "geo_bounds": {
        "field": "geoip.location"
      }
    }
  }
} 

Esempio di risposta

"aggregations" : {
  "geo" : {
    "bounds" : {
      "top_left" : {
        "lat" : 52.49999997206032,
        "lon" : -118.20000001229346
      },
      "bottom_right" : {
        "lat" : 4.599999985657632,
        "lon" : 55.299999956041574
      }
    }
  }
 }
} 

top_hits

La metrica top_hits è un’aggregazione metrica a più valori che classifica i documenti corrispondenti in base a un punteggio di rilevanza per il campo aggregato.

È possibile specificare le seguenti opzioni:

  • from: la posizione iniziale dell’hit.
  • size: La dimensione massima dei risultati da restituire. Il valore predefinito è 3.
  • sort: Come vengono ordinati i risultati corrispondenti. Per impostazione predefinita, i risultati sono ordinati in base al punteggio di rilevanza della query di aggregazione.

L’esempio seguente restituisce i primi 5 prodotti nei dati dell’e-commerce:

GET kibana_sample_data_ecommerce/_search
{
  "size": 0,
  "aggs": {
    "top_hits_products": {
      "top_hits": {
        "size": 5
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "top_hits_products" : {
    "hits" : {
      "total" : {
        "value" : 4675,
        "relation" : "eq"
      },
      "max_score" : 1.0,
      "hits" : [
        {
          "_index" : "kibana_sample_data_ecommerce",
          "_type" : "_doc",
          "_id" : "glMlwXcBQVLeQPrkHPtI",
          "_score" : 1.0,
          "_source" : {
            "category" : [
              "Women's Accessories",
              "Women's Clothing"
            ],
            "currency" : "EUR",
            "customer_first_name" : "rania",
            "customer_full_name" : "rania Evans",
            "customer_gender" : "FEMALE",
            "customer_id" : 24,
            "customer_last_name" : "Evans",
            "customer_phone" : "",
            "day_of_week" : "Sunday",
            "day_of_week_i" : 6,
            "email" : "[email protected]",
            "manufacturer" : [
              "Tigress Enterprises"
            ],
            "order_date" : "2021-02-28T14:16:48+00:00",
            "order_id" : 583581,
            "products" : [
              {
                "base_price" : 10.99,
                "discount_percentage" : 0,
                "quantity" : 1,
                "manufacturer" : "Tigress Enterprises",
                "tax_amount" : 0,
                "product_id" : 19024,
                "category" : "Women's Accessories",
                "sku" : "ZO0082400824",
                "taxless_price" : 10.99,
                "unit_discount_amount" : 0,
                "min_price" : 5.17,
                "_id" : "sold_product_583581_19024",
                "discount_amount" : 0,
                "created_on" : "2016-12-25T14:16:48+00:00",
                "product_name" : "Snood - white/grey/peach",
                "price" : 10.99,
                "taxful_price" : 10.99,
                "base_unit_price" : 10.99
              },
              {
                "base_price" : 32.99,
                "discount_percentage" : 0,
                "quantity" : 1,
                "manufacturer" : "Tigress Enterprises",
                "tax_amount" : 0,
                "product_id" : 19260,
                "category" : "Women's Clothing",
                "sku" : "ZO0071900719",
                "taxless_price" : 32.99,
                "unit_discount_amount" : 0,
                "min_price" : 17.15,
                "_id" : "sold_product_583581_19260",
                "discount_amount" : 0,
                "created_on" : "2016-12-25T14:16:48+00:00",
                "product_name" : "Cardigan - grey",
                "price" : 32.99,
                "taxful_price" : 32.99,
                "base_unit_price" : 32.99
              }
            ],
            "sku" : [
              "ZO0082400824",
              "ZO0071900719"
            ],
            "taxful_total_price" : 43.98,
            "taxless_total_price" : 43.98,
            "total_quantity" : 2,
            "total_unique_products" : 2,
            "type" : "order",
            "user" : "rani",
            "geoip" : {
              "country_iso_code" : "EG",
              "location" : {
                "lon" : 31.3,
                "lat" : 30.1
              },
              "region_name" : "Cairo Governorate",
              "continent_name" : "Africa",
              "city_name" : "Cairo"
            },
            "event" : {
              "dataset" : "sample_ecommerce"
            }
          }
          ...
        }
      ]
    }
  }
 }
}
 

scripted_metric            

 

La metrica scripted_metric è un’aggregazione di metriche a più valori che restituisce metriche calcolate da uno script specificato.

Uno script ha quattro fasi: la fase iniziale, la fase map, la fase combine e la fase reduce.

  • init_script: (OPZIONALE) Imposta lo stato iniziale e viene eseguito prima di qualsiasi raccolta di documenti.
  • map_script: Controlla il valore del campo type ed esegue l’aggregazione sui documenti raccolti.
  • combine_script: Aggrega lo stato restituito da ogni shard. Il valore aggregato viene restituito al nodo coordinatore.
  • reduce_script: Fornisce l’accesso alla variabile states; questa variabile combina i risultati di combine_script su ogni shard in un array.

L’esempio seguente aggrega i diversi tipi di risposta HTTP nei dati di log web:

GET kibana_sample_data_logs/_search
{
  "size": 0,
  "aggregations": {
    "responses.counts": {
      "scripted_metric": {
        "init_script": "state.responses = ['error':0L,'success':0L,'other':0L]",
        "map_script": """
              def code = doc['response.keyword'].value;
                 if (code.startsWith('5') || code.startsWith('4')) {
                  state.responses.error += 1 ;
                  } else if(code.startsWith('2')) {
                   state.responses.success += 1;
                  } else {
                  state.responses.other += 1;
                }
             """,
        "combine_script": "state.responses",
        "reduce_script": """
            def counts = ['error': 0L, 'success': 0L, 'other': 0L];
                for (responses in states) {
                 counts.error += responses['error'];
                  counts.success += responses['success'];
                counts.other += responses['other'];
        }
        return counts;
        """
      }
    }
  }
} 

Esempio di risposta

...
"aggregations" : {
  "responses.counts" : {
    "value" : {
      "other" : 0,
      "success" : 12832,
      "error" : 1242
    }
  }
 }
} 

More To Explore

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte2]

Gradio è una libraria python che ci permette di creare applicazioni web in modo veloce e intuitivo per i nostri modelli di machine learning e AI. Le nostre applicazioni richiedono sempre un’interazione con l’utente e una personalizzazione del layout. Scopriamo, mediante degli esempi, come migliorare le nostre applicazioni.

Intelligenza artificiale

Gradio: applicazioni web in python per AI [parte1]

Scrivere applicazioni web per i nostri modelli di machine learning e/o di intelligenza artificiale può richiedere molto tempo e competenze che non sono in nostro possesso. Per snellire e velocizzare questo compito ci viene in aiuto Gradio, una libreria Python pensata per creare applicazioni web con poche righe di codice. Scopriamo le sue funzionalità base con alcuni esempi.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!