<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=PM%3A_Transition_System_Miner</id>
	<title>PM: Transition System Miner - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://lms.onnocenter.or.id/wiki/index.php?action=history&amp;feed=atom&amp;title=PM%3A_Transition_System_Miner"/>
	<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;action=history"/>
	<updated>2026-04-20T17:19:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;diff=72789&amp;oldid=prev</id>
		<title>Unknown user at 08:58, 13 September 2025</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;diff=72789&amp;oldid=prev"/>
		<updated>2025-09-13T08:58:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;amp;diff=72789&amp;amp;oldid=72783&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
	<entry>
		<id>https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;diff=72783&amp;oldid=prev</id>
		<title>Unknown user: Created page with &quot;Siap! Berikut script **Transition System Miner** dengan **PM4Py** yang membaca **file XES terlampir** (`/mnt/data/BPIC_2012_A.xes`), menambang **Transition System (TS)**, lalu...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lms.onnocenter.or.id/wiki/index.php?title=PM:_Transition_System_Miner&amp;diff=72783&amp;oldid=prev"/>
		<updated>2025-09-13T00:03:31Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;Siap! Berikut script **Transition System Miner** dengan **PM4Py** yang membaca **file XES terlampir** (`/mnt/data/BPIC_2012_A.xes`), menambang **Transition System (TS)**, lalu...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Siap! Berikut script **Transition System Miner** dengan **PM4Py** yang membaca **file XES terlampir** (`/mnt/data/BPIC_2012_A.xes`), menambang **Transition System (TS)**, lalu:&lt;br /&gt;
&lt;br /&gt;
* Cetak ringkasan jumlah **state** dan **transition**&lt;br /&gt;
* Simpan **gambar TS** (`transition_system.png`)&lt;br /&gt;
* Ekspor daftar **state** (`ts_states.csv`) dan **transition** (`ts_transitions.csv`)&lt;br /&gt;
&lt;br /&gt;
&amp;gt; **Install dulu (sekali saja):**&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; ```bash&lt;br /&gt;
&amp;gt; pip install pm4py pandas graphviz&lt;br /&gt;
&amp;gt; # pastikan sistem punya Graphviz binary (dot). Linux (Debian/Ubuntu):&lt;br /&gt;
&amp;gt; # sudo apt-get install graphviz&lt;br /&gt;
&amp;gt; ```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### `transition_system_miner.py`&lt;br /&gt;
&lt;br /&gt;
```python&lt;br /&gt;
#!/usr/bin/env python3&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
&lt;br /&gt;
import argparse&lt;br /&gt;
import sys&lt;br /&gt;
from pathlib import Path&lt;br /&gt;
import pandas as pd&lt;br /&gt;
&lt;br /&gt;
from pm4py.objects.log.importer.xes import importer as xes_importer&lt;br /&gt;
from pm4py.algo.discovery.transition_system import algorithm as ts_discovery&lt;br /&gt;
from pm4py.visualization.transition_system import visualizer as ts_visualizer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def discover_transition_system(xes_path: Path, image_out: Path, states_out: Path, trans_out: Path):&lt;br /&gt;
    # 1) Load event log&lt;br /&gt;
    log = xes_importer.apply(str(xes_path))&lt;br /&gt;
&lt;br /&gt;
    # 2) Discover Transition System&lt;br /&gt;
    # Parameter kunci (ubah jika perlu)&lt;br /&gt;
    parameters = {&lt;br /&gt;
        &amp;quot;case_glue&amp;quot;: &amp;quot;case:concept:name&amp;quot;,&lt;br /&gt;
        &amp;quot;activity_key&amp;quot;: &amp;quot;concept:name&amp;quot;,&lt;br /&gt;
        &amp;quot;timestamp_key&amp;quot;: &amp;quot;time:timestamp&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
    ts = ts_discovery.apply(log, parameters=parameters)&lt;br /&gt;
&lt;br /&gt;
    # 3) Visualisasi &amp;amp; simpan ke file&lt;br /&gt;
    gviz = ts_visualizer.apply(ts)&lt;br /&gt;
    ts_visualizer.save(gviz, str(image_out))&lt;br /&gt;
&lt;br /&gt;
    # 4) Ekspor states &amp;amp; transitions ke CSV&lt;br /&gt;
    # Struktur objek TS di PM4Py: ts.states (set of State), ts.transitions (set of Transition)&lt;br /&gt;
    # State biasanya memiliki &amp;#039;name&amp;#039; (id) dan &amp;#039;label&amp;#039; (representasi state)&lt;br /&gt;
    states_rows = []&lt;br /&gt;
    for s in ts.states:&lt;br /&gt;
        sid = getattr(s, &amp;quot;name&amp;quot;, None)&lt;br /&gt;
        slabel = getattr(s, &amp;quot;label&amp;quot;, None)&lt;br /&gt;
        # fallback agar tetap terisi&lt;br /&gt;
        if sid is None:&lt;br /&gt;
            sid = str(s)&lt;br /&gt;
        if slabel is None:&lt;br /&gt;
            slabel = str(s)&lt;br /&gt;
        states_rows.append({&amp;quot;state_id&amp;quot;: sid, &amp;quot;state_label&amp;quot;: slabel})&lt;br /&gt;
&lt;br /&gt;
    trans_rows = []&lt;br /&gt;
    for t in ts.transitions:&lt;br /&gt;
        # transition memiliki source (from), target (to), label (activity/event class)&lt;br /&gt;
        src = getattr(t, &amp;quot;from_state&amp;quot;, getattr(t, &amp;quot;from&amp;quot;, None))&lt;br /&gt;
        dst = getattr(t, &amp;quot;to_state&amp;quot;, getattr(t, &amp;quot;to&amp;quot;, None))&lt;br /&gt;
        lab = getattr(t, &amp;quot;label&amp;quot;, None)&lt;br /&gt;
&lt;br /&gt;
        # Ambil id/label state sumber &amp;amp; tujuan&lt;br /&gt;
        def state_id_label(state_obj):&lt;br /&gt;
            if state_obj is None:&lt;br /&gt;
                return None, None&lt;br /&gt;
            sid = getattr(state_obj, &amp;quot;name&amp;quot;, None) or str(state_obj)&lt;br /&gt;
            slb = getattr(state_obj, &amp;quot;label&amp;quot;, None) or str(state_obj)&lt;br /&gt;
            return sid, slb&lt;br /&gt;
&lt;br /&gt;
        src_id, src_label = state_id_label(src)&lt;br /&gt;
        dst_id, dst_label = state_id_label(dst)&lt;br /&gt;
&lt;br /&gt;
        trans_rows.append({&lt;br /&gt;
            &amp;quot;source_id&amp;quot;: src_id,&lt;br /&gt;
            &amp;quot;source_label&amp;quot;: src_label,&lt;br /&gt;
            &amp;quot;target_id&amp;quot;: dst_id,&lt;br /&gt;
            &amp;quot;target_label&amp;quot;: dst_label,&lt;br /&gt;
            &amp;quot;transition_label&amp;quot;: lab if lab is not None else &amp;quot;&amp;quot;&lt;br /&gt;
        })&lt;br /&gt;
&lt;br /&gt;
    pd.DataFrame(states_rows).to_csv(states_out, index=False)&lt;br /&gt;
    pd.DataFrame(trans_rows).to_csv(trans_out, index=False)&lt;br /&gt;
&lt;br /&gt;
    # 5) Ringkasan&lt;br /&gt;
    print(&amp;quot;=== Transition System Summary ===&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;States     : {len(states_rows)}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Transitions: {len(trans_rows)}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Gambar     : {image_out}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;States CSV : {states_out}&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Trans CSV  : {trans_out}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    ap = argparse.ArgumentParser(description=&amp;quot;Transition System Miner using PM4Py (from XES)&amp;quot;)&lt;br /&gt;
    ap.add_argument(&amp;quot;xes_path&amp;quot;, type=str, help=&amp;quot;Path ke file .xes&amp;quot;)&lt;br /&gt;
    ap.add_argument(&amp;quot;--img&amp;quot;, type=str, default=&amp;quot;transition_system.png&amp;quot;, help=&amp;quot;Output image (PNG)&amp;quot;)&lt;br /&gt;
    ap.add_argument(&amp;quot;--states_csv&amp;quot;, type=str, default=&amp;quot;ts_states.csv&amp;quot;, help=&amp;quot;Output CSV daftar state&amp;quot;)&lt;br /&gt;
    ap.add_argument(&amp;quot;--trans_csv&amp;quot;, type=str, default=&amp;quot;ts_transitions.csv&amp;quot;, help=&amp;quot;Output CSV daftar transition&amp;quot;)&lt;br /&gt;
    args = ap.parse_args()&lt;br /&gt;
&lt;br /&gt;
    xes_path = Path(args.xes_path)&lt;br /&gt;
    if not xes_path.exists():&lt;br /&gt;
        print(f&amp;quot;[ERROR] File tidak ditemukan: {xes_path}&amp;quot;, file=sys.stderr)&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
&lt;br /&gt;
    discover_transition_system(&lt;br /&gt;
        xes_path=xes_path,&lt;br /&gt;
        image_out=Path(args.img),&lt;br /&gt;
        states_out=Path(args.states_csv),&lt;br /&gt;
        trans_out=Path(args.trans_csv),&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### Cara menjalankan (pakai file terlampir)&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
python transition_system_miner.py /mnt/data/BPIC_2012_A.xes \&lt;br /&gt;
  --img ts_BPICA.png \&lt;br /&gt;
  --states_csv ts_BPICA_states.csv \&lt;br /&gt;
  --trans_csv ts_BPICA_transitions.csv&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
### Opsi &amp;amp; catatan&lt;br /&gt;
&lt;br /&gt;
* **Kolom kunci** diset ke standar PM4Py:&lt;br /&gt;
  `case:concept:name`, `concept:name`, `time:timestamp`.&lt;br /&gt;
  Jika log Anda memakai nama kolom berbeda, ubah di `parameters`.&lt;br /&gt;
* **Graphviz** diperlukan agar file PNG bisa disimpan. Jika belum ada, install `graphviz` (OS) selain paket Python-nya.&lt;br /&gt;
* Untuk log besar, TS bisa sangat besar. Anda bisa mulai dari subset (filtering case/variant) sebelum menambang TS:&lt;br /&gt;
&lt;br /&gt;
  * Filter variant Top-K, atau&lt;br /&gt;
  * Filter rentang tanggal tertentu.&lt;br /&gt;
* Jika ingin **lihat** langsung (open viewer), ganti `ts_visualizer.save(...)` menjadi `ts_visualizer.view(gviz)` (akan membuka jendela viewer apabila environment mendukung).&lt;br /&gt;
&lt;br /&gt;
Mau saya tambahkan versi dengan **filter Top-K variants** atau **prefix-length limit** biar graf tidak terlalu padat?&lt;/div&gt;</summary>
		<author><name>Unknown user</name></author>
	</entry>
</feed>