Nederlands

Ontgrendel de kracht van tijdreeksgegevens met window functions. Deze gids behandelt essentiële concepten, praktische voorbeelden en geavanceerde technieken voor data-analyse.

Tijdreeksanalyse: Window Functions beheersen voor Data Insights

Tijdreeksgegevens, gekenmerkt door hun sequentiële en tijdsafhankelijke aard, zijn alomtegenwoordig in alle industrieën. Van het volgen van aandelenkoersen en het monitoren van websiteverkeer tot het analyseren van sensormetingen en het voorspellen van verkoopresultaten, is de mogelijkheid om zinvolle inzichten uit tijdreeksgegevens te halen cruciaal voor geïnformeerde besluitvorming. Window functions bieden een krachtige en flexibele toolset voor het uitvoeren van berekeningen over een reeks rijen die gerelateerd zijn aan de huidige rij in een tabel of dataframe, waardoor ze onmisbaar zijn voor tijdreeksanalyse.

Tijdreeksgegevens begrijpen

Tijdreeksgegevens zijn een reeks datapunten geïndexeerd in tijdvolgorde. De datapunten kunnen verschillende meetwaarden vertegenwoordigen, zoals:

Het analyseren van tijdreeksgegevens omvat het identificeren van patronen, trends en seizoensgebondenheid, die kunnen worden gebruikt voor het voorspellen van toekomstige waarden, het detecteren van afwijkingen en het optimaliseren van bedrijfsprocessen.

Introductie tot Window Functions

Window functions, ook bekend als windowed aggregates of analytische functies, stellen u in staat om berekeningen uit te voeren op een reeks rijen die gerelateerd zijn aan de huidige rij, zonder de rijen in een enkele resultaatset te groeperen zoals traditionele aggregatiefuncties (bijvoorbeeld SUM, AVG, COUNT). Deze mogelijkheid is met name handig voor tijdreeksanalyse, waarbij u vaak voortschrijdende gemiddelden, cumulatieve sommen en andere op tijd gebaseerde meetwaarden moet berekenen.

Een window function bestaat doorgaans uit de volgende componenten:

  1. Functie: De uit te voeren berekening (bijvoorbeeld AVG, SUM, RANK, LAG).
  2. OVER-clausule: Definieert het venster van rijen dat wordt gebruikt voor de berekening.
  3. PARTITION BY-clausule (optioneel): Verdeelt de gegevens in partities en de window function wordt onafhankelijk op elke partitie toegepast.
  4. ORDER BY-clausule (optioneel): Specificeert de volgorde van rijen binnen elke partitie.
  5. ROWS/RANGE-clausule (optioneel): Definieert het window frame, dat is de reeks rijen ten opzichte van de huidige rij die wordt gebruikt voor de berekening.

Belangrijke concepten en syntaxis

1. De OVER() Clausule

De OVER() clausule is het hart van een window function. Het definieert het venster van rijen waarop de functie zal werken. Een simpele OVER() clausule zonder argumenten beschouwt de hele resultaatset als het venster. Bijvoorbeeld:

SQL-voorbeeld:

SELECT
  date,
  sales,
  AVG(sales) OVER()
FROM
  sales_data;

Deze query berekent de gemiddelde verkoop over alle datums in de tabel sales_data.

2. PARTITION BY

De PARTITION BY clausule verdeelt de gegevens in partities en de window function wordt afzonderlijk op elke partitie toegepast. Dit is handig als u meetwaarden wilt berekenen voor verschillende groepen binnen uw gegevens.

SQL-voorbeeld:

SELECT
  date,
  product_id,
  sales,
  AVG(sales) OVER (PARTITION BY product_id)
FROM
  sales_data;

Deze query berekent de gemiddelde verkoop voor elk product afzonderlijk.

3. ORDER BY

De ORDER BY clausule specificeert de volgorde van rijen binnen elke partitie. Dit is essentieel voor het berekenen van lopende totalen, voortschrijdende gemiddelden en andere op tijd gebaseerde meetwaarden.

SQL-voorbeeld:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date)
FROM
  sales_data;

Deze query berekent de cumulatieve som van de verkoop in de tijd.

4. ROWS/RANGE

De ROWS en RANGE clausules definiëren het window frame, dat is de reeks rijen ten opzichte van de huidige rij die wordt gebruikt voor de berekening. De ROWS clausule specificeert het window frame op basis van het fysieke rijnummer, terwijl de RANGE clausule het window frame specificeert op basis van de waarden van de ORDER BY kolom.

ROWS-voorbeeld:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW)
FROM
  sales_data;

Deze query berekent het voortschrijdend gemiddelde van de verkoop over de afgelopen 3 dagen (inclusief de huidige dag).

RANGE-voorbeeld:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date RANGE BETWEEN INTERVAL '2' DAY PRECEDING AND CURRENT ROW)
FROM
  sales_data;

Deze query berekent het voortschrijdend gemiddelde van de verkoop over de afgelopen 2 dagen (inclusief de huidige dag). Merk op dat `RANGE` een geordende kolom vereist die van een numeriek of datum/tijd gegevenstype is.

Veelvoorkomende Window Functions voor Tijdreeksanalyse

1. Voortschrijdend/Moving Gemiddelde

Het voortschrijdend gemiddelde, ook wel het moving average genoemd, is een veelgebruikte techniek om kortetermijnfluctuaties in tijdreeksgegevens glad te strijken en langetermijntrends te benadrukken. Het wordt berekend door de waarden over een gespecificeerd tijdsvenster te middelen.

SQL-voorbeeld:

SELECT
  date,
  sales,
  AVG(sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_7_days
FROM
  sales_data;

Deze query berekent het 7-daags voortschrijdend gemiddelde van de verkoop.

Python-voorbeeld (met behulp van Pandas):

import pandas as pd

# Ervan uitgaande dat u een Pandas DataFrame 'sales_df' hebt met 'date' en 'sales' kolommen

sales_df['moving_average_7_days'] = sales_df['sales'].rolling(window=7).mean()

Algemene toepassing: Een multinationale retailer kan een voortschrijdend gemiddelde over 30 dagen gebruiken om dagelijkse verkoopfluctuaties glad te strijken en onderliggende verkooptrends in verschillende regio's te identificeren.

2. Cumulatieve Som

De cumulatieve som, ook wel het lopende totaal genoemd, berekent de som van de waarden tot de huidige rij. Het is handig voor het volgen van de totale geaccumuleerde waarde in de tijd.

SQL-voorbeeld:

SELECT
  date,
  sales,
  SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM
  sales_data;

Deze query berekent de cumulatieve som van de verkoop in de tijd.

Python-voorbeeld (met behulp van Pandas):

import pandas as pd

# Ervan uitgaande dat u een Pandas DataFrame 'sales_df' hebt met 'date' en 'sales' kolommen

sales_df['cumulative_sales'] = sales_df['sales'].cumsum()

Algemene toepassing: Een internationaal e-commercebedrijf kan cumulatieve verkoop gebruiken om de totale omzet bij te houden die is gegenereerd door de lancering van een nieuw product in verschillende markten.

3. Lead en Lag

Met de functies LEAD en LAG kunt u toegang krijgen tot gegevens uit respectievelijk volgende of voorafgaande rijen. Ze zijn handig voor het berekenen van periode-over-periode wijzigingen, het identificeren van trends en het vergelijken van waarden over verschillende tijdsperioden.

SQL-voorbeeld:

SELECT
  date,
  sales,
  LAG(sales, 1, 0) OVER (ORDER BY date) AS previous_day_sales,
  sales - LAG(sales, 1, 0) OVER (ORDER BY date) AS sales_difference
FROM
  sales_data;

Deze query berekent het verkoopverschil ten opzichte van de vorige dag. De functie `LAG(sales, 1, 0)` haalt de verkoopwaarde op van de vorige rij (offset 1), en als er geen vorige rij is (bijvoorbeeld de eerste rij), retourneert deze 0 (de standaardwaarde).

Python-voorbeeld (met behulp van Pandas):

import pandas as pd

# Ervan uitgaande dat u een Pandas DataFrame 'sales_df' hebt met 'date' en 'sales' kolommen

sales_df['previous_day_sales'] = sales_df['sales'].shift(1)
sales_df['sales_difference'] = sales_df['sales'] - sales_df['previous_day_sales'].fillna(0)

Algemene toepassing: Een wereldwijde luchtvaartmaatschappij kan lead- en lag-functies gebruiken om ticketverkopen voor dezelfde route over verschillende weken te vergelijken en potentiële vraagfluctuaties te identificeren.

4. Rank en Dense Rank

De functies RANK() en DENSE_RANK() wijzen een rang toe aan elke rij binnen een partitie op basis van de opgegeven volgorde. RANK() wijst rangen met gaten toe (bijvoorbeeld 1, 2, 2, 4), terwijl DENSE_RANK() rangen zonder gaten toewijst (bijvoorbeeld 1, 2, 2, 3).

SQL-voorbeeld:

SELECT
  date,
  sales,
  RANK() OVER (ORDER BY sales DESC) AS sales_rank,
  DENSE_RANK() OVER (ORDER BY sales DESC) AS sales_dense_rank
FROM
  sales_data;

Deze query rangschikt de verkoopwaarden in aflopende volgorde.

Algemene toepassing: Een wereldwijde online marktplaats kan rankingfuncties gebruiken om de bestverkochte producten in elk land of elke regio te identificeren.

Geavanceerde technieken en toepassingen

1. Window Functions combineren

Window functions kunnen worden gecombineerd om complexere berekeningen uit te voeren. U kunt bijvoorbeeld het voortschrijdend gemiddelde van de cumulatieve som berekenen.

SQL-voorbeeld:

SELECT
  date,
  sales,
  AVG(cumulative_sales) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_cumulative_sales
FROM
  (
    SELECT
      date,
      sales,
      SUM(sales) OVER (ORDER BY date) AS cumulative_sales
    FROM
      sales_data
  ) AS subquery;

2. Window Functions gebruiken met voorwaardelijke aggregatie

U kunt window functions in combinatie met voorwaardelijke aggregatie (bijvoorbeeld met behulp van CASE-instructies) gebruiken om berekeningen uit te voeren op basis van specifieke voorwaarden.

SQL-voorbeeld:

SELECT
  date,
  sales,
  AVG(CASE WHEN sales > 100 THEN sales ELSE NULL END) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_average_high_sales
FROM
  sales_data;

Deze query berekent het voortschrijdend gemiddelde van de verkoop alleen voor dagen waarop de verkoop groter is dan 100.

3. Tijdreeksdecompositie

Window functions kunnen worden gebruikt om een tijdreeks te ontbinden in de trend-, seizoens- en residuele componenten. Dit omvat het berekenen van voortschrijdende gemiddelden om de trend te schatten, het identificeren van seizoensgebonden patronen en vervolgens het aftrekken van de trend- en seizoensgebonden componenten om de residuen te verkrijgen.

4. Afwijkingsdetectie

Window functions kunnen worden gebruikt om afwijkingen in tijdreeksgegevens te detecteren door voortschrijdende gemiddelden en standaarddeviaties te berekenen. Datapunten die buiten een bepaald bereik vallen (bijvoorbeeld +/- 3 standaarddeviaties van het voortschrijdend gemiddelde) kunnen als afwijkingen worden gemarkeerd.

Praktische voorbeelden in verschillende branches

1. Financiën

2. Detailhandel

3. Productie

4. Gezondheidszorg

De juiste tool kiezen

Window functions zijn beschikbaar in verschillende tools en programmeertalen voor gegevensverwerking, waaronder:

De keuze van de tool hangt af van uw specifieke behoeften en technische expertise. SQL is zeer geschikt voor gegevens die zijn opgeslagen in relationele databases, terwijl Python en Spark flexibeler zijn voor het verwerken van grote datasets en het uitvoeren van complexe analyses.

Best Practices

Conclusie

Window functions zijn een krachtige tool voor tijdreeksanalyse, waarmee u voortschrijdende gemiddelden, cumulatieve sommen, lead/lag-waarden en andere op tijd gebaseerde meetwaarden kunt berekenen. Door window functions te beheersen, kunt u waardevolle inzichten uit uw tijdreeksgegevens halen en weloverwogen beslissingen nemen. Of u nu financiële gegevens, verkoopgegevens, sensorgegevens of webverkeersgegevens analyseert, window functions kunnen u helpen patronen, trends en afwijkingen te identificeren die moeilijk te detecteren zouden zijn met behulp van traditionele aggregatietechnieken. Door de belangrijkste concepten en syntaxis van window functions te begrijpen en best practices te volgen, kunt u ze effectief inzetten om een breed scala aan problemen in de praktijk in verschillende branches op te lossen.