Gelijkenisanalyse ingrepen¶
Bij de voorloper van de bundelingstool werd ook een gelijkenisanalyse gepresenteerd. Deze zoekt tussen de verschillende ingrepen naar de overeenkomsten op basis van de maatregelen die deel uitmaken van iedere ingreep.
Doel: organisatorische productioportfolio's¶
Het doel van deze analyse is het identificeren voor wat "organisatorische productieportfolio's" worden genoemd. Zo'n organisatorisch productieportfolio is een groep ingrepen die bestaat uit grotendeels dezelfde maatregelen. Deze ingrepen mogen op verschillende objecten geprogrammeerd staan zolang ze maar op elkaar lijken.
Definitie van 'gelijkenis'¶
Deze "gelijkenis" definiƫren en daar een getal aan hangen of berekenen is van essentieel belang voor het (beter) laten slagen van deze analyse.
Voorheen waren alle maatregel-omschrijvingen gereduceerd tot enkele grofstoffelijke omschrijvingen ("renovatie bewegingswerken"), waardoor een gelijkenis op basis van taakomschrijving opportuun was. In geval van de huidige dataset is het herkennen van gelijkenis tussen maatregelen en daarmee ingrepen bemoeilijkt door de veel specifieke omschrijvingen in POEMA. De huidige implementatie van "gelijkenis" leunt namelijk op het controleren van de exacte tekst van de maatregelomschrijving.
Hieronder volgt een snippet dat nog wel uitgaat van de gelijkenis op basis van maatregelnaam, waarbij de kanttekening moet worden geplaatst dat de gelijkenis veel lager uitvalt dan gedacht omdat nog steeds naar "exacte overeenkomsten" tussen maatregelomschrijvingen wordt gezocht.
Importeren van een planning¶
We beginnen met het importeren van een planning.
- In een ongebundelde planning zullen alle maatregelen dusdanig verspreid staan dat er een grote verscheidenheid aan ingrepen gevonden wordt.
- In een gebundelde planning zijn minder ingrepen in aantal (momenten), en kan dus beter gezocht worden naar gelijksoortige ingrepen.
We nemen hieronder een planning zoals die gemaakt is met de handleiding voor het bundelen van maatregelen.
from raplan_rws.project import Horizon, RwsProject
# Een horizon van 2026 tot 2050 om de maatregelen te filteren.
horizon = Horizon(start=2026, end=2050)
# Laad het RWS project in vanaf een Excel.
rws_project = RwsProject.van_excel_bestand(
# Bestandspad naar de maatregelplanning
"./generated/irene_marijke_per_kolk_met_instellingen.xlsx",
# Projectnaam (mag alles zijn)
naam="Irene -en Marijkesluis",
# Horizon voor deze gelijkenisanalyse
horizon=horizon,
)
Verkrijgen van het gelijkenisanalyse (SimilarityAnalysis) object¶
Om het Python object voor de gelijkenisanalyse te verkrijgen roepen we een functie uit de raplan_rws module aan die een RaPlan SimilarityAnalysis object kan aanmaken op basis van een RwsProject en een Horizon.
Dit is een object waar de ingrepen worden vergeleken op het al dan niet bezitten van een gepaalde set kenmerken.
In de standaardimplementatie zijn de maatregelomschrijvingen de kenmerken.
Twee ingrepen worden dan met een Jaccard Index vergeleken op basis van hun totaal aantal verschillende maatregel-omschrijvingen en hun totaal aantal gedeelde omschrijvingen.
from raplan_rws.gelijkenis import gelijkenisanalyse
from ragraph.analysis.similarity import SimilarityAnalysis
sa: SimilarityAnalysis = gelijkenisanalyse(rws_project, horizon)
# Zet de minimale gelijkenis op 0.1 (10%)
sa.row_sim_threshold = 0.1
sa.col_sim_threshold = 0.1
print("De eerste 5 kolomnamen om te laten zien wat er in het SimilarityAnalysis object zit:")
for n in sa.cols[:5]:
print(f" - {n.name}")
print(
"Ter indicatie de eerste 5 ingreep-namen met de volgende structuur: 'DIS-KCO-DE | jaren sinds horizon start'"
)
for n in sa.rows[:5]:
print(f" - {n.name}")
Gelijkenis inspecteren¶
Hieronder volgt een kleine snippet om de gelijkenisscores van ingrepen te inspecteren:
def print_percentages(sa: SimilarityAnalysis, num_print: int = 5):
ingrepen = [n.name for n in sa.rows]
geprint = 0
for i, row in enumerate(sa.row_similarity_matrix):
ingreep_i = ingrepen[i]
for j, cell in enumerate(row[i + 1 :]):
if cell == 0.0:
continue
ingreep_j = ingrepen[j]
print(f"'{ingreep_i}' lijkt {cell * 100:3.0f}% op '{ingreep_j}'")
geprint += 1
if geprint == num_print:
return
print_percentages(sa, num_print=5)
Clusteren op basis van de gelijkenis¶
Vervolgens kunnen we gaan clusteren op basis van de gevonden gelijkenisscores en hier een visualisatie van maken.
Gelijkenismatrix ingrepen links bovenin¶
In de linkerbovenhoek van het resulterende figuur zijn de ingrepen te zien en de gevonden groepen die op elkaar lijken (organisatorische productieportfolio's). Weet dat de ingrepen in identieke volgorde op de kolommen staan in de matrix, te herkennen aan hun rij- en kolomnummer.
Mapping-matrix links onderin¶
Daarnaast is onderin is de mapping-matrix opgenomen in het figuur. Hierin staan op de resterende rijen alle unieke maatregel-omschrijvingen. Een stip in dit vlak betekent dat de ingreep die correspondeert met de kolom de maatregel uit deze rij bevat.
Gelijkenismatrix maatregelen rechts onderin¶
Rechts onderin is een gelijkenismatrix te vinden voor de eigenschappen van ingrepen, ofwel de maatregelen in dit geval. Hier is te zien welke maatregelen relatief gezien vaker met elkaar voorkomen in een ingreep.
from raplan_rws.plot import mdm_gelijkenisanalyse
# Cluster de regels (ingrepen) en kolommen (maatregelen).
# De alpha, beta, en mu zijn parameters voor een wiskundig cluster-algoritme.
# Zie: https://doi.org/10.1115/1.4037626
sa.cluster_rows(
# alpha = 2,
# beta = 2.0,
# mu = 2.0,
)
sa.cluster_cols(
# alpha = 2,
# beta = 2.0,
# mu = 2.0,
)
fig = mdm_gelijkenisanalyse(sa)
fig.show()
fig.write_image("./generated/irene_marijke_gelijkenis.pdf")
fig.write_html("./generated/irene_marijke_gelijkenis.html")