Το «πώς»: πηγές δεδομένων, ορισμοί και φόρμουλες των δεικτών, κατώφλια δημοσίευσης, γνωστά κενά. Για το «τι (δεν) ισχυριζόμαστε» και το δικαίωμα απάντησης, δείτε την Αποποίηση.
Μεθοδολογία
Έκδοση: 0.8 · Τελευταία ενημέρωση: 2026-07-13 · Άδεια: CC BY 4.0
Κεντρική αρχή — διαβάστε πρώτα αυτό: Οι δείκτες που δημοσιεύονται εδώ είναι στατιστικοί δείκτες ρίσκου διαδικασιών, όχι διαπιστώσεις παρανομίας, διαφθοράς ή κακοδιαχείρισης. Ένας υψηλός δείκτης σημαίνει «μοτίβο που, σύμφωνα με τη διεθνή βιβλιογραφία, δικαιολογεί περαιτέρω διερεύνηση» — τίποτα περισσότερο. Όπως το διατυπώνει το Red Flags Project (Ουγγαρία): «risky does not mean corrupt». Πολλά flags έχουν απολύτως νόμιμες εξηγήσεις (επείγουσες ανάγκες, εξειδικευμένες αγορές με έναν προμηθευτή, μικρά δείγματα, νησιωτικότητα κ.ά.).
1. Σκοπός
Η πλατφόρμα συγκεντρώνει, κανονικοποιεί και οπτικοποιεί δημόσια, ανοιχτά δεδομένα δημοσίων συμβάσεων της Ελλάδας, και υπολογίζει πάνω σε αυτά επικυρωμένους από τη βιβλιογραφία δείκτες ακεραιότητας διαδικασιών (procurement integrity indicators). Στόχοι:
- Να μπορεί κάθε πολίτης να δει τι αγοράζει ο δήμος, η περιφέρεια ή το υπουργείο του, από ποιον και με ποια διαδικασία.
- Να αναδεικνύονται μοτίβα που η διεθνής έρευνα συσχετίζει με αυξημένο ρίσκο μειωμένου ανταγωνισμού — πάντα με πλήρη πρόσβαση στα πρωτογενή δεδομένα και στη μεθοδολογία υπολογισμού.
- Να παρέχεται στους φορείς και τις εταιρείες δικαίωμα απάντησης/διόρθωσης (βλ. DISCLAIMER.md).
Ό,τι δημοσιεύεται συνοδεύεται από: (α) τα raw δεδομένα από τα οποία προέκυψε, (β) link στο πρωτότυπο ΑΔΑΜ/ΑΔΑ, (γ) την ακριβή φόρμουλα υπολογισμού, (δ) τους περιορισμούς της.
2. Πηγές δεδομένων
2.1 ΚΗΜΔΗΣ Open Data API (κύρια πηγή)
- URL:
https://cerpp.eprocurement.gov.gr/khmdhs-opendata - Τεκμηρίωση: Swagger UI
- Άδεια δεδομένων: Creative Commons Attribution 4.0 (CC BY 4.0)
- Όριο χρήσης: 350 requests/λεπτό (η υλοποίησή μας περιορίζεται συντηρητικά στα 300)
Το Κεντρικό Ηλεκτρονικό Μητρώο Δημοσίων Συμβάσεων (ΚΗΜΔΗΣ) είναι το επίσημο μητρώο στο οποίο οι αναθέτουσες αρχές υποχρεούνται εκ του νόμου (ν. 4412/2016) να καταχωρίζουν τις πράξεις τους. Οντότητες που αντλούμε:
| Οντότητα | Endpoint | Πρόθεμα ΑΔΑΜ | Περιεχόμενο |
|---|---|---|---|
| Αιτήματα | POST /request |
REQ |
Πρωτογενή αιτήματα δαπάνης |
| Προσκλήσεις/Προκηρύξεις/Διακηρύξεις | POST /notice |
PROC |
Δημοσίευση πρόθεσης σύναψης σύμβασης |
| Αναθέσεις | POST /auction |
AWRD |
Αποφάσεις ανάθεσης (κατακύρωσης) |
| Συμβάσεις | POST /contract |
SYMV |
Υπογεγραμμένες συμβάσεις |
| Εντολές Πληρωμών | POST /payment |
PAY |
Εντολές πληρωμής |
| Συνδεδεμένες Πράξεις | GET /adamChain/{ΑΔΑΜ} |
— | Η αλυσίδα REQ→PROC→AWRD→SYMV→PAY |
Κρίσιμα πεδία κάθε εγγραφής (επιβεβαιωμένα από το API):
referenceNumber— ο ΑΔΑΜ (μοναδικό αναγνωριστικό, π.χ.25AWRD016745076), που επιτρέπει σε οποιονδήποτε να επαληθεύσει την πράξη στο ΚΗΜΔΗΣ.organizationVatNumber,organization— ΑΦΜ και όνομα αναθέτουσας αρχής.classificationOfPublicLawOrganization,typeOfContractingAuthority— τύπος φορέα (π.χ. ΟΤΑ).procedureType— τύπος διαδικασίας· η τιμή «Απευθείας ανάθεση» ξεχωρίζει τις απευθείας αναθέσεις.totalCostWithVAT,totalCostWithoutVAT,budget— ποσά.nutsCode,nutsCity,nutsPostalCode— γεωγραφικός προσδιορισμός.objectDetailsList[].cpvs— κωδικοί CPV (κατηγοριοποίηση αντικειμένου), ποσότητες, μονάδες.contractingDataDetails.contractingMembersDataList[]— ΑΦΜ και όνομα αναδόχου/-ων.noticeRefNo,contractRefNo,paymentRefNo,approvedRequestsList— σύνδεσμοι της αλυσίδας ΑΔΑΜ.submissionDate,signedDate,lastUpdateDate— ημερομηνίες.cancelled,amendPreviousAuction,isModified— κατάσταση/τροποποιήσεις.
2.2 Μελλοντικές/συμπληρωματικές πηγές (δεν χρησιμοποιούνται ακόμα)
- ΔΙΑΥΓΕΙΑ (diavgeia.gov.gr): εγκρίσεις δαπανών, οριστικοποιήσεις πληρωμών, προϋπολογισμοί/απολογισμοί ΟΤΑ.
- ΕΛΣΤΑΤ: Δείκτης Τιμών Καταναλωτή και δείκτες κόστους κατασκευής, για αποπληθωρισμό ποσών.
- ΓΕΜΗ Open Data (Φάση 2): προφίλ εταιρειών-αναδόχων.
- TED (Φάση 3): διασταύρωση συμβάσεων άνω των ορίων ΕΕ.
Κάθε νέα πηγή θα τεκμηριώνεται εδώ πριν χρησιμοποιηθεί σε δημοσιευμένο δείκτη.
3. Συλλογή & επεξεργασία δεδομένων
- Άντληση: μέσω του open-source client μας (src/kimdis/client.py): σελιδοποίηση 50 εγγραφών/σελίδα, χρονικά παράθυρα ≤180 ημερών, όριο <350 αιτήματα/λεπτό, αυτόματη επανάληψη σε προσωρινά σφάλματα. Τα δεδομένα αποθηκεύονται ως έχουν (raw) σε μορφή Parquet.
- Έλεγχοι πληρότητας: για κάθε batch μετράμε % εγγραφών με έγκυρο ΑΔΑΜ, ημερομηνία, ποσό, CPV, και ΑΦΜ σε δύο επίπεδα: μορφή (9 ψηφία μετά την κανονικοποίηση,
pct_org_vat) και checksum mod-11 (pct_org_vat_checksum,is_valid_vat_checksum()στο kimdis_data.py). Το keying/entity-resolution χρησιμοποιεί μόνο τον έλεγχο μορφής (κάποια ΑΦΜ δημοσίων φορέων στο ΚΗΜΔΗΣ δεν ακολουθούν πάντα το τυπικό checksum)· το checksum δημοσιεύεται ως ξεχωριστό ποιοτικό μέτρο, όχι ως φίλτρο αποδοχής. Τα reports πληρότητας δημοσιεύονται. - Κανονικοποίηση: ενιαίος πίνακας φορέων (ΑΦΜ → όνομα → τύπος → NUTS) και αναδόχων. Στη Φάση 2 προστίθεται entity resolution (deduplication παραλλαγών ονομάτων) με μετρημένη ακρίβεια σε χειροκίνητο δείγμα.
- Αποπληθωρισμός: όπου συγκρίνονται ποσά μεταξύ ετών, μετατρέπονται σε σταθερές τιμές έτους βάσης με τον ΔΤΚ της ΕΛΣΤΑΤ. Ονομαστικά και αποπληθωρισμένα ποσά εμφανίζονται και τα δύο.
- Καμία χειροκίνητη παρέμβαση σε τιμές: δεν διορθώνουμε, δεν συμπληρώνουμε και δεν «καθαρίζουμε» ποσά ή ονόματα πέρα από τεκμηριωμένους, αναπαραγώγιμους κανόνες που ζουν στον κώδικα αυτού του repo.
4. Δείκτες (v1)
Όλοι οι δείκτες v1 υπολογίζονται αποκλειστικά από πεδία ΚΗΜΔΗΣ και στηρίζονται σε επικυρωμένη βιβλιογραφία (βλ. §8). Κάθε δείκτης δημοσιεύεται μαζί με: το N (μέγεθος δείγματος), την περίοδο αναφοράς, και τα επιμέρους στοιχεία από τα οποία υπολογίστηκε.
4.1 Ποσοστό απευθείας αναθέσεων
- Ορισμός: Μερίδιο των αναθέσεων ενός φορέα που έγιναν με τη διαδικασία «Απευθείας ανάθεση», υπολογισμένο και σε πλήθος και σε αξία.
- Φόρμουλα:
DA_count = N_direct / N_total,DA_value = Σ(value_direct) / Σ(value_total)ανά φορέα ανά έτος (προαιρετικά ανά CPV division). - Πεδία:
procedureType,totalCostWithoutVAT,organizationVatNumber. - Λογική: Η απευθείας ανάθεση είναι νόμιμη κάτω από όρια του ν. 4412/2016, αλλά συστηματικά υψηλά ποσοστά σημαίνουν περιορισμένο ανταγωνισμό (OECD, EU Single Market Scoreboard).
- Παγίδες: μικροί φορείς με λίγες, μικρές προμήθειες θα έχουν φυσιολογικά υψηλό ποσοστό σε πλήθος· γι’ αυτό δείχνουμε πάντα και το ποσοστό σε αξία και το N.
4.2 Συγκέντρωση αναδόχων (HHI & top-1 μερίδιο)
- Ορισμός: Πόσο συγκεντρωμένες είναι οι δαπάνες ενός φορέα σε λίγους αναδόχους.
- Φόρμουλα:
HHI = Σᵢ(sᵢ²)όπουsᵢτο μερίδιο (0–1) του αναδόχου i στη συνολική αξία συμβάσεων του φορέα στην περίοδο· επίσηςtop1 = max(sᵢ). HHI > 0,25 θεωρείται υψηλή συγκέντρωση (κατά αναλογία με τα όρια ανταγωνισμού). - Πεδία:
contractingMembersDataList[].vatNumber,totalCostWithoutVAT. - Παραδοχή κοινοπραξιών (v1): το ΚΗΜΔΗΣ δεν δημοσιεύει επιμερισμό αξίας ανά μέλος κοινοπραξίας· όταν μια σύμβαση έχει περισσότερα από ένα
contractingMembersDataList[], όλη η αξία πιστώνεται στον πρώτο καταχωρημένο ανάδοχο (members[0]), όχι επιμερισμένη. Αυτό ευνοεί συστηματικά τον πρώτο εταίρο κοινοπραξιών στον υπολογισμό του HHI/top1. Για να φαίνεται το μέγεθος της πιθανής μεροληψίας, ο δείκτης δημοσιεύεται πάντα μαζί με τοpct_multi_member(ποσοστό συμβάσεων του φορέα/έτους με >1 μέλος). - Παγίδες: εξειδικευμένες αγορές (π.χ. συντήρηση συγκεκριμένου λογισμικού) έχουν εγγενώς λίγους προμηθευτές· ο δείκτης υπολογίζεται και ανά CPV division για να μετριάζεται αυτό. Απαιτείται ελάχιστο N συμβάσεων (≥10) για να δημοσιευθεί.
4.3 Single-bid rate
- Ορισμός: Μερίδιο ανταγωνιστικών διαδικασιών με μία μόνο προσφορά.
- Φόρμουλα:
SB = N_single_bid / N_with_bids, ανά φορέα/έτος, μόνο σε ανταγωνιστικές διαδικασίες και μόνο όπου τα δεδομένα προσφορών είναι διαθέσιμα. Ελάχιστο N=5 έγκυρες διαδικασίες (ίδιο κατώφλι με §4.5/§4.6/§4.7). ΤοN_competitiveκαι τοcoverage_pct = N_with_bids / N_competitiveδημοσιεύονται δίπλα στον δείκτη. - Πεδία:
contract.bidsSubmitted/ flattenedbidsSubmitted,procedureType,organizationVatNumber. - Cutover δεδομένων: τα raw
contract.bidsSubmittedείναι κενά για 2020–2023 και μερικά έως 2025-03. Ο δημοσιευμένος δείκτης ξεκινά από τον πρώτο πλήρη μήνα 2025-04· δεν παρουσιάζεται ως ιστορική σειρά πριν από αυτό. - Guard σε outliers: τιμές
bidsSubmitted < 1ή>100εξαιρούνται ως data errors και μετρώνται στοn_bids_outliers(στο raw dataset έχουν καταγραφεί σκουπίδια έως 335.315+ και ακόμη μεγαλύτερα placeholder-like values). Δεν γίνονται αποδείξεις/ευρήματα από αυτές τις τιμές. - Λογική: Ο πιο ευρέως επικυρωμένος μεμονωμένος δείκτης στη βιβλιογραφία (Fazekas & Kocsis· EU Single Market Scoreboard — Ελλάδα: από τις υψηλότερες τιμές στην ΕΕ).
- Παγίδες: το πεδίο δεν υπάρχει σε όλες τις εγγραφές ΚΗΜΔΗΣ· ο δείκτης υπολογίζεται μόνο στο υποσύνολο με διαθέσιμα δεδομένα και το ποσοστό κάλυψης δημοσιεύεται δίπλα του.
4.4 Έλεγχος Benford (1ο & 2ο ψηφίο)
- Ορισμός: Στατιστική απόκλιση της κατανομής πρώτων/δεύτερων ψηφίων των ποσών ενός φορέα από την αναμενόμενη κατανομή Benford.
- Φόρμουλα: Κατανομή αναφοράς
P(d) = log₁₀(1 + 1/d). Μέτρο απόκλισης: MAD (Mean Absolute Deviation) με τα κατώφλια συμμόρφωσης του Nigrini· το χ² αναφέρεται συμπληρωματικά. - Πεδία:
totalCostWithoutVATσε πληρωμές/συμβάσεις. - Τι μετρά το
coverage_pct: μετρά μόνο την εγκυρότητα ποσών — το ποσοστό εγγραφών του φορέα/περιόδου με έγκυρο, θετικό, πεπερασμένο ποσό. Οι εγγραφές χωρίς επιλύσιμο ΑΦΜ φορέα εξαιρούνται πριν από κάθε παρονομαστή και ΔΕΝ μετρούνται στοcoverage_pct(η ανά-φορέα ομαδοποίηση απαιτεί ΑΦΜ). Η κάλυψη ΑΦΜ του payment entity μετριέται ξεχωριστά σε εθνικό επίπεδο (pct_rows_without_vat, τυπώνεται από τοcompute_indicators_v1.py) — στο E3 gate μετρήθηκε 100% κάλυψη ΑΦΜ, οπότε η πρακτική διαφορά σήμερα είναι μηδενική· αν όμως μελλοντικοί μήνες πέσουν σε κάλυψη ΑΦΜ, η πτώση φαίνεται εκεί, όχι στοcoverage_pct. - Παγίδες: ο Benford δεν είναι απόδειξη κανενός — αποκλίσεις προκύπτουν φυσιολογικά από θεσμικά κατώφλια (π.χ. πολλές συμβάσεις ακριβώς κάτω από όριο), στρογγυλοποιημένους προϋπολογισμούς, ομοιογενείς αγορές. Απαιτεί μεγάλο N (≥300 εγγραφές) και χρησιμοποιείται μόνο ως δευτερεύον σήμα, ποτέ μόνος του.
- Δύο επίπεδα περιόδου: το
indicator_benford.csvδημοσιεύει γραμμές ανά (ΑΦΜ φορέα, έτος) και μία συγκεντρωτική γραμμή ανά ΑΦΜ μεperiod="all"(όλη η διαθέσιμη περίοδος). Λίγοι φορείς πιάνουν N≥300 σε μεμονωμένο έτος, οπότε η γραμμήallλειτουργεί ως fallback ώστε η κάρτα να έχει νόημα και για μεσαίους φορείς. Στο site (build_site_data.py::merge_indicators), μόνο οι ετήσιες γραμμές (period != "all") μπαίνουν στο ενιαίοindicators.json(ένωση σε vat/year όπως όλοι οι άλλοι δείκτες)· η κάρτα προφίλ φορέα (/foreas/<vat>/,build_foreas_data.py::attach_indicators) παίρνει και τα δύο επίπεδα και προτιμά το πιο πρόσφατο έτος με επαρκές N, αλλιώς πέφτει στοall. - Site wiring: νέα σελίδα δείκτη
/deiktes/benford/(φόρμουλα, παράδειγμα, παγίδες) και κάρτα «Έλεγχος Benford» στο προφίλ φορέα (MAD 1ου ψηφίου + ζώνη Nigrini + N + περίοδος, badge «Ανεπαρκή δεδομένα» κάτω από N=300). Ο Benford δεν μπαίνει στον σύνθετο δείκτη §4.8 (κλειδωμένα components, ρητή απόφαση — αλλαγή θα ήταν αλλαγή φόρμουλας composite, ξεχωριστή απόφαση σε επόμενο sprint).
4.5 Κατακερματισμός συμβάσεων (bid-splitting)
- Ορισμός: Ασυνήθιστη συγκέντρωση αναθέσεων ακριβώς κάτω από το εκάστοτε νόμιμο όριο απευθείας ανάθεσης.
- Μέθοδος: Ιστόγραμμα αξιών γύρω από το κατώφλι (π.χ. ±20%)· δείκτης = λόγος πυκνότητας στο διάστημα αμέσως κάτω από το όριο προς το διάστημα αμέσως πάνω (McCrary-style density test). Συμπληρωματικά: πλήθος «δίδυμων» αναθέσεων ίδιου φορέα, ίδιου CPV, σε κοντινές ημερομηνίες, με άθροισμα πάνω από το όριο.
- Πεδία:
totalCostWithoutVAT,procedureType,organizationVatNumber, CPV, ημερομηνίες. - Παγίδες: τα όρια έχουν αλλάξει διαχρονικά (καταγράφουμε τον πίνακα ορίων ανά περίοδο στον κώδικα)· η συγκέντρωση κάτω από το όριο είναι εν μέρει αναμενόμενη ορθολογική συμπεριφορά — σημασία έχει η σύγκριση μεταξύ φορέων, όχι η απόλυτη τιμή.
4.6 Ποσοστό έκπτωσης προκήρυξης → σύμβασης
- Ορισμός: Διαφορά εκτιμώμενης αξίας (προκήρυξη) και τελικής αξίας (σύμβαση).
- Φόρμουλα:
discount = (est_value − contract_value) / est_value, μέσω σύνδεσης ΑΔΑΜ (noticeRefNo→contractRefNo). - Λογική: Σε ανταγωνιστικές αγορές αναμένονται θετικές εκπτώσεις· συστηματικά μηδενικές εκπτώσεις σε ανταγωνιστικές διαδικασίες είναι καθιερωμένο red flag (OECD bid-rigging screens).
- Παγίδες: μεμονωμένη μηδενική έκπτωση δεν σημαίνει τίποτα· ο δείκτης είναι το ποσοστό των διαδικασιών φορέα με ~0% έκπτωση, όχι η έκπτωση μιας σύμβασης.
4.7 Σύντομες προθεσμίες υποβολής
- Ορισμός: Ημέρες από τη δημοσίευση της προκήρυξης έως την καταληκτική ημερομηνία υποβολής προσφορών.
- Φόρμουλα:
days = finalSubmissionDate − submissionDate(πεδία notice, κανονικοποιημένα στο ημερολογιακό τους date πριν την αφαίρεση – τοsubmissionDateέχει ώρα/λεπτό ενώ τοfinalSubmissionDateείναι σχεδόν πάντα μεσάνυχτα). Δείκτης φορέα/έτους = διάμεση προθεσμία (ημέρες), ελάχιστο N=5 έγκυρες διαδικασίες (ίδιο κατώφλι με §4.5/§4.6 – το §4.7 δεν όριζε ρητά ελάχιστο N, αποφασίστηκε ρητά session 18). - Αποκλεισμός μη-ανταγωνιστικών/ειδικών διαδικασιών: εξαιρούνται
typeOfProcedure.key == "6"(Απευθείας ανάθεση),key == "12"/value = "Διαπραγμάτευση χωρίς προηγούμενη δημοσίευση"(άρθρο 32 ν.4412/2016, επιβεβαιωμένο για την εξαίρεση από το πλαίσιο ελάχιστης προθεσμίας μέσω εγκυκλίου ΓΓ Εμπορίου 99864/2025) καιkey == "18"/value = "Διαδικασία άρθρου 128 του ν.4412/16"(πιθανή ειδική διαδικασία χωρίς ενιαίο χρονοδιάγραμμα, βάσει εσωτερικής έρευνας για τις ελάχιστες προθεσμίες). Αυτές οι εγγραφές δεν μετέχουν στη δημοσιευμένηmedian_deadline_days, ώστε να μην αλλοιώνουν τη διάμεσο προς τα κάτω. Ο δείκτης υπολογίζεται μόνο επί ανταγωνιστικών διαδικασιών (Ανοιχτή/Κλειστή διαδικασία, διαπραγμάτευση με προηγούμενη προκήρυξη, ανταγωνιστικός διάλογος κ.ά.). - Guard σε άκυρες τιμές: εγγραφές με κενή ημερομηνία (NaT) ή αρνητική διάρκεια (
finalSubmissionDateπριν τοsubmissionDate– data error, ~2-3% των εγγραφών σε δείγματα ελέγχου) εξαιρούνται από τη διάμεσο. Η κάλυψη (coverage_pct= έγκυρες / σύνολο ανταγωνιστικών διαδικασιών του φορέα/έτους) δημοσιεύεται πάντα δίπλα στον δείκτη. - Λογική: Πολύ σύντομες προθεσμίες ευνοούν προμηθευτές με εκ των προτέρων γνώση (Fazekas CRI component, DIGIWHIST).
- ⚠ Ανοιχτό (εκκρεμεί, session 18): το «% διαδικασιών με σύντομη προθεσμία» δεν δημοσιεύεται ακόμα. Απαιτεί πίνακα ελάχιστων νόμιμων προθεσμιών ανά τύπο διαδικασίας (EU Directive 2014/24 άρθρα 27-28 / ν. 4412/2016 άρθρα 121-122, με μειώσεις για ηλεκτρονική υποβολή/επείγον) που δεν είναι σήμερα τεκμηριωμένος εδώ ούτε επιβεβαιωμένος νομικά – ίδιο ανοιχτό ζήτημα με τα όρια bid-splitting του §4.5 (βλ. changelog v0.2). Μέχρι τη νομική επιβεβαίωση, δημοσιεύεται μόνο η αδιαμφισβήτητη διάμεση προθεσμία.
4.8 Σύνθετος δείκτης (τύπου CRI)
- Φόρμουλα: Απλός (μη σταθμισμένος) μέσος όρος των διαθέσιμων επιμέρους flags του φορέα, κανονικοποιημένων στο [0,1]. Αν ένας δείκτης δεν υπολογίζεται (ανεπαρκές N), εξαιρείται από τον μέσο και αυτό σημειώνεται.
- Δημοσιευμένα components v1:
DA_count,DA_value,HHI,pct_near_zero_discount,median_deadline_daysως ανεστραμμένο ετήσιο percentile (συντομότερη διάμεση προθεσμία = υψηλότερο flag), καιsingle_bid_pct. Δεν περιλαμβάνονται το bid-splitting §4.5 και τοpct_short_deadline§4.7, επειδή δεν δημοσιεύονται πριν τη νομική επιβεβαίωση. - Κανόνας παρουσίασης: Ο σύνθετος δείκτης δεν εμφανίζεται ποτέ μόνος — πάντα μαζί με όλα τα επιμέρους flags και τα N τους. Ακολουθούμε την πρακτική του Corruption Risk Index (Fazekas et al.) και του Government Transparency Institute.
- Ερμηνεία: Ο δείκτης μετρά χαρακτηριστικά διαδικασιών, όχι πρόσωπα ή προθέσεις. Κατατάξεις παρουσιάζονται με ουδέτερη γλώσσα («δείκτες διαφάνειας διαδικασιών»).
4.9 Κάλυψη δεδομένων (γνωστά κενά)
- 2 μόνιμα κενά μηνών σε
auction:2021-02και2025-08λείπουν οριστικά από το backfill. Αιτία: το ΚΗΜΔΗΣ API σταματά να απαντά με συνέπεια γύρω στη σελίδα ~15-16 (server-side timeout), ανεξάρτητο από τον ρυθμό αιτημάτων μας — επιβεβαιωμένο σε πολλαπλά backfill runs. Καταγράφονται και ξαναδοκιμάζονται αυτόματα σε κάθε μελλοντικό backfill run (data/raw/_backfill_failures.json). - Επίπτωση: οι δείκτες των ετών 2021 και 2025 (Ποσοστό απευθείας αναθέσεων §4.1, HHI §4.2, συνολικές αξίες) υποεκτιμούν συστηματικά ~1/12 του έτους για την οντότητα
auction. Οι δείκτεςcontract/noticeδεν επηρεάζονται (πλήρη για τα ίδια έτη). - Discount rate (§4.6) — κάλυψη 2020: μόνο ~6% των εγγραφών του 2020 έχουν σύνδεση notice↔auction (η πλειοψηφία εμφανίζεται ως «Ανεπαρκή δεδομένα»). Συνειδητή επιλογή, όχι σφάλμα: το
noticeRefNoείναι σπάνια συμπληρωμένο στα πρώτα έτη του dataset. - Payment entity: ολοκληρώθηκε το backfill 2020-01→2026-06 (78/78 μήνες, 0 μόνιμες αποτυχίες, session 2026-07-12). Το
paymentπεριλαμβάνεται πλέον στον πίνακα πληρότητας του/dedomena/(COMPLETENESS_ENTITIESστοscripts/build_site_data.py) και τροφοδοτεί το §4.4 Benford (30.944 γραμμές φορέα/έτους, 4.685 με N≥300).
4.10 Δείκτες δικτύου
Blocking gate: καμία κάρτα «Δίκτυο» δεν εμφανίζεται στο site πριν δημοσιευτεί αυτή η ενότητα (§4.10) μαζί με το αντίστοιχο DISCLAIMER.md update. Ισχύει από 2026-07-13.
Τι είναι: ανάλυση του δικτύου φορέας↔ανάδοχος (γράφημα Neo4j, offline, τοπικό) πάνω στο ίδιο ΚΗΜΔΗΣ dataset, όχι νέα πηγή δεδομένων. Το γράφημα χτίζεται από το ίδιο vat_resolver.csv/entities.csv με το υπόλοιπο pipeline — καμία δική του κανονικοποίηση/keying.
Δημοσιευμένα components:
- Top γείτονες (ego-network, top-30) — για κάθε φορέα, οι top-30 ανάδοχοι με τους οποίους έχει τη μεγαλύτερη σωρευτική αξία συναλλαγών (
total_amount_ex_vatστο aggregate edge φορέας→ανάδοχος), με πλήθος αναθέσεων και μερίδιο επί του συνόλου του φορέα. Δεν είναι κατάταξη «ύποπτων» σχέσεων — είναι απλή περιγραφή του ποιοι ανάδοχοι έχουν τη μεγαλύτερη παρουσία σε κάθε φορέα, ισοδύναμο (σε μεγαλύτερο βάθος) με το ήδη δημοσιευμένο «Από ποιον» top-10 του προφίλ φορέα. - New-winner-rate («ρυθμός νέων αναδόχων») — ανά φορέα/έτος: ποσοστό αναδόχων που κερδίζουν για πρώτη φορά από αυτόν τον φορέα (δεν είχαν ξανακερδίσει σε προηγούμενο έτος, ίδιος κανόνας
source_yearμε τα υπόλοιπα δείκτες, §4.9). Ελάχιστο N=5 ανάδοχοι/έτος. Χαμηλό και σταθερά χαμηλό ποσοστό σε βάθος πολλών ετών μπορεί να αντανακλά μειωμένο ανταγωνισμό, αλλά έχει και προφανείς νόμιμες εξηγήσεις (μακροχρόνιες συμβάσεις παροχής υπηρεσιών, μικρή τοπική αγορά προμηθευτών, εξειδικευμένο αντικείμενο).
Ρητά ΜΗ δημοσιευμένα (μένουν εσωτερικά, μέχρι να ολοκληρωθεί νομικός έλεγχος):
- Query A (αποκλειστικές σχέσεις) και Query E (ύποπτη εναλλαγή αναδόχων) παραμένουν ΕΣΩΤΕΡΙΚΑ ΜΟΝΟ — δεν έχουν ακόμα δημοσιευμένα στατιστικά κατώφλια ούτε νομικό review, και η γλώσσα «αποκλειστική σχέση»/«εναλλαγή» είναι πιο αιχμηρή από τα υπόλοιπα δείκτες. Δεν εμφανίζονται πουθενά στο δημόσιο site.
- Query B (market bridges) υπολογίζεται (
graph_features_contractor.csv) αλλά δεν έχει ακόμα δική του θέση στο site σε αυτή τη φάση — παραμένει διαθέσιμο μόνο ως CSV εσωτερικά/reproducibility artifact. - Query #4 (κοινοί διευθυντές ΓΕΜΗ) μπλοκάρεται ολοκληρωτικά — απαιτεί ΓΕΜΗ key (P2-B1) και νομική γνωμοδότηση (P2-14, βλ. §6 σημείο 3 — φυσικά πρόσωπα).
Παγίδες/περιορισμοί (διαβάστε πριν ερμηνεύσετε οποιονδήποτε αριθμό εδώ):
- WINS_AGAINST δεν υπολογίζεται. Το ΚΗΜΔΗΣ δημοσιεύει μόνο τον νικητή κάθε διαγωνισμού, ποτέ τους ηττημένους προσφέροντες. Το δίκτυο εδώ δείχνει ποιος κέρδισε από ποιον, όχι «ποιος ανταγωνίζεται ποιον» — καμία σχέση ανταγωνισμού/συμφωνίας δεν μπορεί να συναχθεί από αυτά τα δεδομένα.
- Community detection (Louvain) = δομικές ομαδοποιήσεις, ΟΧΙ κατηγορίες συμπαιγνίας. Οι «κοινότητες» που υπολογίζει ο αλγόριθμος Louvain (βλ.
scripts/graph/run_gds.py) είναι στατιστική ομαδοποίηση κόμβων με πυκνές συνδέσεις μεταξύ τους — τυπικό αποτέλεσμα ενός δικτύου φορέας-ανάδοχος είναι ομάδες ανά γεωγραφική περιοχή, κλάδο αγοράς ή μέγεθος φορέα. Καμία κοινότητα δεν ερμηνεύεται ή παρουσιάζεται ως ένδειξη συμφωνίας/συμπαιγνίας. - Batch/offline, όχι real-time. Ο γράφος δεν ανανεώνεται από το καθημερινό nightly pipeline — υπολογίζεται χειροκίνητα, περιοδικά (στόχος ~1×/μήνα). Κάθε export φέρει
snapshot_date(P2-07,scripts/graph/snapshot.py) και το site το εμφανίζει ρητά δίπλα στην κάρτα «Δίκτυο» ώστε να μην υπάρχει σύγχυση με τη φρεσκάδα των υπόλοιπων δεικτών. - Κάλυψη ταυτόσημη με το υπόλοιπο dataset (§4.9) — τα ίδια 2 μόνιμα κενά μηνών (
auction_2021_02,auction_2025_08) υποεκτιμούν ελαφρώς τα δίκτυα των ετών 2021/2025. - Multi-member συμβάσεις: όπως και στο HHI (§4.2), όλη η αξία μιας κοινοπραξίας πιστώνεται στο πρώτο καταχωρημένο μέλος — το ίδιο μεθοδολογικό όριο ισχύει και στο δίκτυο (υποεκτιμά ελαφρώς τη σύνδεση των υπόλοιπων μελών).
- New-winner-rate: left-censoring στο πρώτο ενεργό έτος κάθε φορέα. Το «πρώτη φορά κερδίζει» υπολογίζεται μόνο μέσα στο παράθυρο δεδομένων (2020-εξής) — για το πρώτο έτος που εμφανίζεται καθόλου δραστηριότητα ενός φορέα στο dataset, ΟΛΟΙ οι ανάδοχοί του είναι τετριμμένα «νέοι» (100%), όχι επειδή είναι πράγματι πρωτοεμφανιζόμενοι αλλά επειδή δεν υπάρχει ιστορικό πριν το 2020 (ή πριν την πρώτη καταγεγραμμένη δραστηριότητα του φορέα) για να συγκριθούν. Αυτές οι γραμμές σημειώνονται εσωτερικά ως
left_censoredκαι δεν επιλέγονται ως το προεπιλεγμένο (τελευταίο) έτος που εμφανίζει η κάρτα «Δίκτυο» — αν το πιο πρόσφατο έτος ενός φορέα είναι και το πρώτο του ενεργό έτος, η κάρτα δείχνει «ανεπαρκή δεδομένα» αντί για ένα τεχνητό 100%. - Ακυρωμένες αναθέσεις: πολιτική ενοποιήθηκε 2026-07-13. Όλα τα δημοσιευμένα components του δικτύου (top γείτονες, new-winner-rate) περιλαμβάνουν ακυρωμένες αναθέσεις (4,25% του συνόλου) — ίδια πολιτική με το ήδη δημοσιευμένο «Από ποιον» top-10 του προφίλ φορέα, το οποίο επίσης δεν φιλτράρει ακυρωμένες. Πριν από αυτή την ενοποίηση, η new-winner-rate (Query C) εξαιρούσε ακυρωμένες ενώ οι top γείτονες (Query D) όχι — η ασυνέπεια διορθώθηκε αφαιρώντας το φίλτρο από το Query C (και το αντίστοιχο Query E, εσωτερικό).
5. Κατώφλια δημοσίευσης & στατιστική προστασία
- Δείκτης φορέα δημοσιεύεται μόνο αν βασίζεται σε επαρκές δείγμα (ελάχιστα N ανά δείκτη, όπως ορίζονται στην §4). Κάτω από το κατώφλι εμφανίζεται «ανεπαρκή δεδομένα».
- Οι κατατάξεις συνοδεύονται από διαστήματα/αβεβαιότητα όπου υπολογίζονται (π.χ. Wilson intervals σε ποσοστά).
- Ακραίες τιμές ελέγχονται πρώτα για σφάλματα καταχώρισης (π.χ. ποσά ×1000) και επισημαίνονται ως πιθανά data errors, όχι ως ευρήματα.
6. Τι ΔΕΝ ισχυριζόμαστε
- Δεν ισχυριζόμαστε ότι οποιοσδήποτε φορέας, εταιρεία ή πρόσωπο έχει διαπράξει παρανομία. Αυτό μπορεί να το κρίνει μόνο δικαστήριο ή αρμόδια ελεγκτική αρχή.
- Δεν υπολογίζουμε «πραγματικό κόστος αγοράς» ή «υπερτιμολόγηση» συγκεκριμένης σύμβασης — δεν υπάρχουν τα δεδομένα για κάτι τέτοιο. Ό,τι συγκρίσεις τιμών γίνουν (Φάση 3) θα είναι σχετικές συγκρίσεις εντός του ίδιου dataset (π.χ. απόσταση από τη διάμεση τιμή μονάδας ίδιου CPV/έτους), με δημοσιευμένη φόρμουλα.
- Δεν δημοσιεύουμε δεδομένα φυσικών προσώπων στη v1. Μόνο φορείς και νομικά πρόσωπα.
- Συγκεντρωτικές εκτιμήσεις «δυνητικής εξοικονόμησης» (Φάση 3) θα παρουσιάζονται μόνο ως εύρος σε εθνικό/κλαδικό επίπεδο με ρητές παραδοχές, ποτέ ως ποσό που αποδίδεται σε συγκεκριμένο φορέα.
7. Διαφάνεια, αναπαραγωγιμότητα & changelog
- Όλος ο κώδικας συλλογής και υπολογισμού είναι open source σε αυτό το repository. Οποιοσδήποτε μπορεί να αναπαραγάγει κάθε δημοσιευμένο αριθμό.
- Κάθε αλλαγή σε φόρμουλα, κατώφλι ή πηγή δεδομένων καταγράφεται σε changelog αλγορίθμων (σε αυτό το αρχείο, §9) με ημερομηνία και αιτιολόγηση, και αποτυπώνεται στο git history.
- Λάθη που εντοπίζονται (από εμάς ή από τρίτους μέσω της διαδικασίας διόρθωσης) διορθώνονται και η διόρθωση δημοσιεύεται.
8. Βιβλιογραφία & πρότυπα
- Fazekas, M., Tóth, I. J., & King, L. P. — An Objective Corruption Risk Index Using Public Procurement Data (Corruption Risk Index / CRI).
- Fazekas, M. & Kocsis, G. — Uncovering High-Level Corruption: Cross-National Objective Corruption Risk Indicators Using Public Procurement Data.
- OECD — Guidelines for Fighting Bid Rigging in Public Procurement & Analytics for Integrity.
- DIGIWHIST / Government Transparency Institute — opentender.eu indicators methodology.
- European Commission — Single Market Scoreboard, Public Procurement indicators.
- Nigrini, M. — Benford’s Law: Applications for Forensic Accounting, Auditing, and Fraud Detection.
- Red Flags Project (Ουγγαρία) — redflags.eu («risky does not mean corrupt»).
- Transparency International EU — Integrity Watch.
- ν. 4412/2016 (δημόσιες συμβάσεις), ν. 5090/2024 (τροποποιήσεις ΠΚ), άρθρα 362-363, 367 ΠΚ.
9. Changelog μεθοδολογίας
| Ημερομηνία | Έκδοση | Αλλαγή |
|---|---|---|
| 2026-07-08 | 0.1 | Αρχική έκδοση: ορισμοί δεικτών v1, πηγές, αρχές δημοσίευσης. Κανένας δείκτης δεν έχει δημοσιευθεί ακόμα. |
| 2026-07-08 | 0.2 | Πρώτη υλοποίηση §4.5 (bid-splitting) και §4.6 (discount rate) σε scripts/compute_indicators_v1.py, επί δεδομένων 2020-2021 + 2025-05. §4.5: πίνακας ορίων απευθείας ανάθεσης ανά περίοδο – πριν 1/6/2021: 20.000€ (όλες οι κατηγορίες)· από 1/6/2021 (ν. 4782/2021): 30.000€ προμήθειες/υπηρεσίες, 60.000€ έργα/μελέτες/τεχνικές υπηρεσίες (κατηγοριοποίηση βάσει contractType.value). Χρειάζεται νομική επιβεβαίωση πριν οριστική δημοσίευση (πρώτο πέρασμα βάσει δημόσιας δευτερογενούς πηγής, όχι πρωτογενούς νομικού κειμένου). §4.6: η σύνδεση notice↔contract μέσω contract.noticeReferenceNumber είναι σχεδόν κενή στα δεδομένα (<0.1%, ελέγχθηκε επί 2020-01)· χρησιμοποιείται αντ’ αυτής η σύνδεση notice.referenceNumber ↔ auction.noticeRefNo (κάλυψη: μόνο ~10-18% των auctions έχουν καν noticeRefNo – αναμενόμενο, αφού οι απευθείας αναθέσεις δεν προηγούνται notice) και η τιμή κατακύρωσης (auction) ως proxy της τελικής τιμής σύμβασης αντί της υπογεγραμμένης σύμβασης. Το ποσοστό κάλυψης δημοσιεύεται πάντα δίπλα στον δείκτη. Προστέθηκε επίσης πίνακας κανονικοποίησης φορέων (scripts/build_entity_table.py → data/processed/entities.csv, ΑΦΜ→όνομα/τύπος/NUTS) και static dashboard v1 σκελετός (site/, χωρίς build step, τροφοδοτείται από scripts/build_site_data.py). |
| 2026-07-09 | 0.3 | Pre-release: εφαρμόστηκε το πλάνο του εσωτερικού τεχνικού ελέγχου. Ενιαίος persisted VAT resolver (A3): build_entity_table.py γράφει πλέον data/processed/vat_resolver.csv (name→ΑΦΜ, χτισμένο από auction+contract+notice)· compute_indicators_v1.py και build_foreas_data.py τον διαβάζουν αντί να χτίζουν ο καθένας δικό του (πριν, το build_foreas_data.py χτίζε resolver μόνο από auctions, ~25% ΑΦΜ fill, με αποτέλεσμα ασύμφωνα κλειδιά ΑΦΜ ανάμεσα σε δείκτες και σελίδες προφίλ φορέα). Έλεγχος πληρότητας pagination (A1): το backfill πλέον επαληθεύει totalElements έναντι των πραγματικά κατεβασμένων εγγραφών· ελλιπείς μήνες δεν γράφονται καθόλου (αντί να γράφονται ως “πλήρεις” με λιγότερες γραμμές) και καταγράφονται σε data/raw/_backfill_failures.json για επανάληψη. Η αναδρομική επαλήθευση/διόρθωση του ήδη κατεβασμένου 2020-2023 dataset (audit A1 + γνωστά κενά auction_2020_08, auction_2021_02) εκκρεμεί ακόμα – θα εκτελεστεί σε επόμενο run του backfill_historical.py και οι αριθμοί των δεικτών θα ενημερωθούν τότε αν αλλάξουν. |
| 2026-07-10 | 0.4 | Sanity-check έναντι δημοσιευμένων εθνικών ποσοστών (EU Single Market Scoreboard ~58,2% single-bidding, Vouliwatch 62,4% απευθείας σε συμβουλευτικές): το εθνικό da_count_pct (75-84% ανά έτος 2020-2026) αποκλίνει αλλά αναμενόμενα – διαφορετικός πληθυσμός (όλες οι αναθέσεις έναντι μόνο ανταγωνιστικών/άνω ενωσιακού ορίου διαδικασιών). Το da_value_pct όμως ταλαντευόταν χωρίς λογική έτος προς έτος (33%→97%→41%→98%→46%→70%→6%), λόγω 20 εγγραφών totalCostWithVAT/totalCostWithoutVAT >1 δισ. ευρώ (έως €600 δισ.) με fingerprint φθαρμένης πηγής (π.χ. ΑΦΜ “11111111111” με ποσό ακριβώς 111.111.111.111€· Δήμος Αγίας Παρασκευής €600.030.600.000 σε μία ανάθεση με μέσο όρο υπόλοιπων 802 αναθέσεών του €13.600). Προστέθηκε VALUE_SANITY_CAP = 10 δισ. ευρώ σε scripts/kimdis_data.py (sanitize_value()), εφαρμοσμένο σε όλα τα σημεία παραγωγής value από τα πεδία κόστους σε compute_indicators_v1.py και build_foreas_data.py (και στο per-εγγραφή amount_with_vat της προβολής “πρόσφατη δραστηριότητα”). Τιμές πάνω από το όριο μηδενίζονται (όχι clip) ώστε να μη διαστρεβλώνουν sums/rankings/terciles μεγέθους. Το όριο χωρίζει καθαρά τις 9 εγγραφές-σκουπίδια από τις μεγαλύτερες αλλά εύλογες τιμές που μένουν (π.χ. ΑΔΜΗΕ €2,06δισ., Υπ. Εθνικής Άμυνας €4,26δισ.). |
| 2026-07-10 | 0.4 | Ολοκλήρωση Sprint C backfill re-run (η εκκρεμότητα της v0.3): 238 parquet αρχεία, 1,9 GB raw (2020-01→2026-06, auction+contract+notice)· βρέθηκαν+διορθώθηκαν 2 μη καταγεγραμμένα κενά (auction_2025_04, auction_2020_08) και επιβεβαιώθηκαν 2 μόνιμα κενά (auction_2021_02, auction_2025_08, server-side timeout – βλ. νέα §4.9 «Κάλυψη δεδομένων»). Το pipeline re-run μετατόπισε ουσιωδώς τους εθνικούς αριθμούς: 8.647→12.827 ΑΦΜ φορέων, 3.217→6.191 προφίλ /foreas/· το εθνικό DA% παρέμεινε σταθερό (75-84%/έτος) πριν/μετά, καμία ένδειξη ότι το audit/repair αλλοίωσε κατανομές. Τεκμηριώθηκαν επίσης δύο αποφάσεις που είχαν μείνει ανεκτέλεστες (εσωτερικός τεχνικός έλεγχος v2, B2/B3): §4.2 πλέον δηλώνει ρητά την παραδοχή πίστωσης όλης της αξίας συμβάσεων-κοινοπραξιών στον πρώτο καταχωρημένο ανάδοχο και ο δείκτης pct_multi_member δημοσιεύεται δίπλα στο HHI/top1· §3.2 διακρίνει πλέον ρητά μορφή (pct_org_vat) από mod-11 checksum (pct_org_vat_checksum, νέα is_valid_vat_checksum() στο kimdis_data.py) αντί να τα συγχέει σε μία υπόσχεση που δεν τηρούνταν στον κώδικα. |
| 2026-07-12 | 0.6 | E3: ολοκλήρωση backfill payment entity (2020-01→2026-06, 78/78 μήνες, 0 μόνιμες αποτυχίες – υπερκάλυψη του στόχου ≥74/78). Το payment προστέθηκε στο COMPLETENESS_ENTITIES του scripts/build_site_data.py (εμφανίζεται πλέον στον πίνακα πληρότητας /dedomena/) και ξεκλείδωσε πλήρη κάλυψη για το §4.4 Benford (30.944 γραμμές, 4.685 με N≥300). Δεδομένα ανέβηκαν στο R2 (data/raw/payment_*.parquet, 1,6 GB). |
| 2026-07-10 | 0.5 | D2: πρώτη υλοποίηση §4.7 (σύντομες προθεσμίες υποβολής) σε scripts/compute_indicators_v1.py::deadline_indicator() → data/processed/indicator_deadlines.csv (10.435 γραμμές φορέα/έτους, vat, year, n_notices, median_deadline_days, pct_short_deadline, coverage_pct, note). Οριστικοποιήθηκε: days = finalSubmissionDate − submissionDate (ημερολογιακή ανάλυση), αποκλεισμός απευθείας αναθέσεων (84% των notice, μη-ανταγωνιστική ημερομηνιακή σημασιολογία), ελάχιστο N=5, guard σε NaT/αρνητικές διάρκειες με δημοσιευμένο coverage_pct. Συνειδητή απόφαση χρήστη: το pct_short_deadline (% σύντομων προθεσμιών) δεν υλοποιείται σε αυτό το πέρασμα – απαιτεί πίνακα ελάχιστων νόμιμων προθεσμιών ανά τύπο διαδικασίας που δεν υπάρχει τεκμηριωμένος και χρειάζεται νομική επιβεβαίωση, ίδιο άνοιχτο ζήτημα με τα όρια bid-splitting (§4.5). Η στήλη δημοσιεύεται με τιμή null προς το παρόν. Ενσωματώθηκε στο downstream pipeline (build_site_data.py, build_foreas_data.py) και νέα κάρτα «Διάμεση προθεσμία υποβολής» στο /foreas/<vat>/ (build-time inline SVG, ουδέτερη μπλε κλίμακα, badge «Ανεπαρκή δεδομένα» κάτω από N=5). |
| 2026-07-10 | 0.6 | D13: επέκταση εξαίρεσης διαδικασιών στο §4.7: το deadline_indicator() εξαιρεί πλέον, πέρα από typeOfProcedure.key == "6", και key == "12" / value = "Διαπραγμάτευση χωρίς προηγούμενη δημοσίευση" (άρθρο 32 ν.4412/2016, επιβεβαιωμένο ως ειδική διαδικασία μέσω εγκυκλίου ΓΓ Εμπορίου 99864/2025) καθώς και key == "18" / value = "Διαδικασία άρθρου 128 του ν.4412/16" (πιθανή ειδική διαδικασία χωρίς ενιαίο χρονοδιάγραμμα, βλ. research note). Στόχος: να μη χαμηλώνουν τεχνητά τη δημοσιευμένη median_deadline_days. Το pct_short_deadline παραμένει null και μη δημοσιευμένο ως flag. |
| 2026-07-10 | 0.6 | D3: πρώτη υλοποίηση §4.3 single-bid rate σε scripts/compute_indicators_v1.py::single_bid_rate() → data/processed/indicator_single_bid.csv (cutover 2025-04, πρώτος πλήρης μήνας με διαθέσιμο bidsSubmitted). Ο δείκτης χρησιμοποιεί μόνο ανταγωνιστικές διαδικασίες με το ίδιο φίλτρο του §4.7, ελάχιστο N=5, δημοσιεύει coverage_pct, και εξαιρεί τιμές bidsSubmitted < 1 ή >100 ως data errors με μετρητή n_bids_outliers (εντοπίστηκαν 1.573 outliers στο τρέχον run). |
| 2026-07-10 | 0.6 | D8: πρώτη υλοποίηση §4.8 σύνθετου δείκτη σε data/processed/indicator_composite.csv: μη σταθμισμένος μέσος των διαθέσιμων δημοσιευμένων flags (DA_count, DA_value, HHI, pct_near_zero_discount, median_deadline_days ως ανεστραμμένο ετήσιο percentile, single_bid_pct). Εξαιρούνται ρητά §4.5 bid-splitting και §4.7 pct_short_deadline, επειδή δεν δημοσιεύονται πριν τη νομική επιβεβαίωση. |
| 2026-07-12 | 0.7 | E6: downstream wiring §4.4 Benford ολοκληρώθηκε (ο δείκτης ήταν ήδη υπολογισμένος από session 27). build_site_data.py::merge_indicators ενώνει τις ετήσιες γραμμές (period != "all") στο indicators.json· build_foreas_data.py::attach_indicators περνά και τα δύο επίπεδα περιόδου (έτος + all) στα foreas_pages.json, με fallback στο all όταν κανένα έτος δεν πιάνει N=300. Νέα κάρτα «Έλεγχος Benford» στο /foreas/<vat>/ (MAD 1ου ψηφίου + ζώνη Nigrini + N + περίοδος, badge «Ανεπαρκή δεδομένα»)· νέα σελίδα /deiktes/benford/ (status pending→published στο site/src/lib/indicators.ts). Παραμένει εκτός §4.8 (κλειδωμένα components). |
| 2026-07-13 | 0.9 | Review M2/M3 (review.md, sessions 29-36 review): §4.10 ενοποίηση/διόρθωση. Αφαιρέθηκε το φίλτρο ακυρωμένων αναθέσεων από τα Query C/E (scripts/graph/queries.py) και το snapshot GDS projection (scripts/graph/run_gds.py) — τα δημοσιευμένα components της κάρτας «Δίκτυο» μετράνε πλέον τον ίδιο πληθυσμό (παγίδα #7, βλ. παραπάνω για την αιτιολόγηση της επιλογής). Το Query C επιστρέφει πλέον και left_censored flag ανά (φορέα, έτος) για το πρώτο ενεργό έτος κάθε φορέα· το attach_network() (build_foreas_data.py) και η κάρτα «Δίκτυο» (/foreas/<vat>/) δεν επιλέγουν πλέον left-censored έτος ως προεπιλογή (παγίδα #6). Απαιτεί επόμενο χειροκίνητο refresh του γράφου (scripts/graph/queries.py + run_gds.py) για να ενημερωθούν τα ήδη εξαγμένα graph_features_org.csv/GDS αποτελέσματα. |
| 2026-07-13 | 0.8 | P2-12: νέα §4.10 «Δείκτες δικτύου» (blocking gate για κάθε δημόσια κάρτα «Δίκτυο»). Δημοσιεύονται: top-30 ego-network γείτονες ανά φορέα, new-winner-rate ανά φορέα/έτος (N≥5). Ρητά ΕΣΩΤΕΡΙΚΑ/μη δημοσιευμένα: Query A αποκλειστικές σχέσεις, Query B market bridges (CSV μόνο, καμία θέση στο site ακόμα), Query E ύποπτη εναλλαγή, Query #4 κοινοί διευθυντές ΓΕΜΗ. Ρητές παγίδες: WINS_AGAINST δεν υπολογίζεται, Louvain communities = δομικές ομαδοποιήσεις όχι συμπαιγνία, batch/offline με snapshot_date, ίδια κενά κάλυψης §4.9, ίδια παραδοχή multi-member με §4.2. DISCLAIMER.md ενημερώθηκε παράλληλα (§4α). Υλοποίηση: scripts/graph/queries.py (Queries A-E πάνω στο ήδη φορτωμένο Neo4j γράφημα), build_foreas_data.py::attach_network, νέα κάρτα «Δίκτυο» στο /foreas/<vat>/. |