O analiză cantitativă a primului an de mandat (decembrie 2024 → mai 2026)
Author
Radu Stochitoiu
Published
24 mai 2026
1.062 de discursuri analizate. 28 de concluzii. Două registre comunicative (scris vs vorbit) cu diferențe radicale, 131 de promisiuni urmărite, un raport tensionat cu premierul Bolojan și o observație: ND tinde să vorbească mai mult despre intenții decât despre realizările sale concrete.
Care e povestea
Nicușor Dan a fost ales președinte pe 18 mai 2025. De atunci a vorbit ca președinte timp de un an. Cât din ce a spus se regăsește în ce face? Și cât din ce face nu apare în ce spune?
Am colectat tot ce a comunicat public — 1.525 documente brute, 1.110 după deduplicate, distribuite între:
1,062
documente totale
724
scris (Facebook)
338
vorbit (video)
~650k
cuvinte analizate
5 concluzii care îți schimbă perspectiva
1. Două registre — scris vs vorbit — radical diferite
Pe Facebook scrie cu vocabular instituțional, repetitiv, fără ezitări. Pe video vorbește reflexiv, cu pauze, întrebări, “cred că”. Patru metrici independente (ezitare/nuanțare, pronume personale, diversitate lexicală, polarizare sentiment) arată diferențe de 2-5× între cele două canale.
Cauza e neclară — poate fi adaptare naturală la medium, audiență diferită, sau colaborare cu echipă PR pentru FB. Datele nu disting între aceste ipoteze.
2. Vorbește mai mult despre intenții decât despre realizări
Clasificatorul LLM (bazat pe ce spune ND) marchează doar 20% din promisiunile de campanie ca “ținute”. Dar verificarea independentă a 10 promisiuni mari de policy arată 6 dintre ele executate concret (decrete, legi, numiri) chiar dacă ND nu se laudă cu ele în discurs.
Pattern, nu cifră generalizabilă
Cele 10 promisiuni verificate nu sunt random. Le-am ales pentru că păreau predispuse la decalaj (PMB, policy mari). Nu putem extrapola “60% pe 131”.
Ce putem spune cu încredere: există un pattern documentat pe cazuri reale — ND livrează acțiuni concrete pe care nu le menționează explicit ulterior.
Top cele 6 cuvinte: vrea, sine, spune, trebui, putea, moment. Toate sunt verbe modale și reflexive. Nu apar în top 30: lege, buget, salariu, pensie, școală, spital, drum.
Este un orator deliberativ, nu un manager care enumeră livrabile.
4. Volumul s-a prăbușit post-investitură
În medie, 130 de discursuri pe trimestru ca președinte vs 468 în campanie. Drop de 3,6×.
5. Cu premierul Bolojan: aliat tactic, nu prieten
Note
Fix metodologic (mai 2026): numerele au scăzut față de versiunea inițială pentru că ~65% din match-urile pe “premier”/“prim-ministru” erau de fapt despre Ciolacu, Ponta sau alți premieri istorici. Folosim acum un pas de disambiguare prin Gemini. → detalii pe pagina Bolojan
De la “nu e o mare miză să fie Iohannis sau Bolojan” (interviu B1TV, 18 ian 2025 — ND despre cine rămâne președinte interimar) la “I-am cerut premierului acest lucru. Știu că mai multă lume i l-a cerut. Susțin și eu demersul ăsta.” (8 aprilie 2026, despre desecretizarea contractelor Pfizer). Un arc relațional în 16 luni: de la indiferență politică la presiune publică pentru transparență.
Toate documentele brute, clasificările și scripturile sunt disponibile în repository. Lucrezi la un articol jurnalistic? Contactează-mă la radu.stochitoiu@gmail.com — pot adăuga analize la cerere.
---title: "Evoluția discursului lui Nicușor Dan"subtitle: "O analiză cantitativă a primului an de mandat (decembrie 2024 → mai 2026)"date: "2026-05-24"author: "Radu Stochitoiu"toc: falsepage-layout: full---```{python}#| label: setup#| include: falseimport sys, jsonfrom pathlib import PathROOT = Path(__file__).resolve().parent.parent if"__file__"indir() else Path("..").resolve()sys.path.insert(0, str(ROOT))import pandas as pdimport frontmatterdef load_promises(): rows = []with (ROOT /"results"/"04_promises"/"promise_status.jsonl").open() as f:for line in f: rows.append(json.loads(line))return pd.DataFrame(rows)def load_corpus_count(proj): n =sum(1for _ in (ROOT /"data"/f"3_nd_{proj}").rglob("*.md")if"/excluded/"notinstr(_))return npromises = load_promises()n_total =len(promises)n_kept = (promises["status_status"] =="KEPT").sum()n_inprog = (promises["status_status"] =="IN_PROGRESS").sum()n_nom = (promises["status_status"] =="NO_MENTION").sum()```::: {.hook-card}**1.062 de discursuri analizate.** 28 de concluzii. Două registre comunicative (scris vs vorbit) cu diferențe radicale, 131 de promisiuni urmărite, un raport tensionat cu premierul Bolojan și o observație: ND tinde să **vorbească mai mult despre intenții decât despre realizările sale concrete**.:::## Care e povesteaNicușor Dan a fost ales președinte pe 18 mai 2025. De atunci a vorbit ca președinte timp de un an. **Cât din ce a spus se regăsește în ce face? Și cât din ce face nu apare în ce spune?**Am colectat tot ce a comunicat public — 1.525 documente brute, 1.110 după deduplicate, distribuite între:```{python}#| label: corpus-stats#| echo: falsefrom IPython.display import HTMLoverall = load_corpus_count("overall")scris = load_corpus_count("scris")vorbit = load_corpus_count("vorbit")html =f"""<div class="stats-grid"> <div class="stat"> <div class="stat-value">{overall:,}</div> <div class="stat-label">documente totale</div> </div> <div class="stat"> <div class="stat-value">{scris:,}</div> <div class="stat-label">scris (Facebook)</div> </div> <div class="stat"> <div class="stat-value">{vorbit:,}</div> <div class="stat-label">vorbit (video)</div> </div> <div class="stat"> <div class="stat-value">~650k</div> <div class="stat-label">cuvinte analizate</div> </div></div>"""HTML(html)```## 5 concluzii care îți schimbă perspectiva### 1. Două registre — scris vs vorbit — radical diferitePe Facebook scrie cu vocabular **instituțional**, repetitiv, fără ezitări. Pe video vorbește **reflexiv**, cu pauze, întrebări, "cred că". Patru metrici independente (ezitare/nuanțare, pronume personale, diversitate lexicală, polarizare sentiment) arată **diferențe de 2-5×** între cele două canale.**Cauza e neclară** — poate fi adaptare naturală la medium, audiență diferită, sau colaborare cu echipă PR pentru FB. Datele nu disting între aceste ipoteze.[→ Citește analiza completă cu limitări metodologice](doua-registre.qmd)### 2. Vorbește mai mult despre intenții decât despre realizăriClasificatorul LLM (bazat pe **ce spune ND**) marchează doar 20% din promisiunile de campanie ca "ținute". Dar **verificarea independentă a 10 promisiuni mari de policy** arată 6 dintre ele executate concret (decrete, legi, numiri) **chiar dacă ND nu se laudă cu ele în discurs**.```{python}#| echo: falseimport plotly.graph_objects as gofig = go.Figure(go.Bar( x=["Clasificator pe 131<br>(doar discurs ND)", "Sample verificat web<br>(10 promisiuni mari)"], y=[20, 60], marker_color=["#999999", "#28a745"], text=["20% (din 131)", "6 din 10"], textposition="outside", textfont=dict(size=16, color="#333"),))fig.update_layout( title="Promisiuni ținute — discurs propriu vs verificare independentă", yaxis_title="%", yaxis_range=[0, 75], height=400, margin=dict(t=60, b=40, l=60, r=20), showlegend=False, plot_bgcolor="white", annotations=[dict(x=0.5, y=-0.28, xref="paper", yref="paper", text="<i>Cele 10 verificate nu sunt eșantion random — au fost alese pentru<br>vizibilitate (DNA, magistrați, deficit, OCDE, infrastructură PMB).</i>", showarrow=False, font=dict(size=11, color="#666"), align="center"), ],)fig.show()```::: {.callout-note}## Pattern, nu cifră generalizabilăCele 10 promisiuni verificate **nu sunt random**. Le-am ales pentru că păreau predispuse la decalaj (PMB, policy mari). Nu putem extrapola "60% pe 131".Ce putem spune cu încredere: **există un pattern documentat pe cazuri reale** — ND livrează acțiuni concrete pe care nu le menționează explicit ulterior.:::[→ Vezi cele 131 de promisiuni](promisiuni.qmd)### 3. Vorbește abstract, nu enumerativTop cele 6 cuvinte: `vrea, sine, spune, trebui, putea, moment`. Toate sunt verbe **modale și reflexive**. Nu apar în top 30: `lege, buget, salariu, pensie, școală, spital, drum`.Este un orator deliberativ, **nu un manager care enumeră livrabile**.### 4. Volumul s-a prăbușit post-investitură```{python}#| echo: falseimport pandas as pdimport frontmatterfrom collections import Counterdef period_for(d): y, m =int(d[:4]), int(d[5:7])if y ==2024or (y ==2025and m <=2): return"Q1 2025 precampanie"if y ==2025and m <=5: return"Q2 2025 campanie"if y ==2025and m <=8: return"Q3 2025 deficit"if y ==2025and m <=11: return"Q4 2025 stabilizare"if y ==2025and m ==12or (y ==2026and m <=2): return"Q1 2026 judiciar"if y ==2026and m <=5: return"Q2 2026 UE+criză"returnNonecounts = Counter()for path in (ROOT /"data"/"3_nd_overall").rglob("*.md"):if"/excluded/"instr(path):continue post = frontmatter.load(path) p = period_for(str(post.get("data", ""))[:10])if p: counts[p] +=1order = ["Q1 2025 precampanie", "Q2 2025 campanie", "Q3 2025 deficit","Q4 2025 stabilizare", "Q1 2026 judiciar", "Q2 2026 UE+criză"]xs = orderys = [counts.get(p, 0) for p in order]fig = go.Figure(go.Bar( x=xs, y=ys, marker_color=["#003049"]*2+ ["#d62828"]*4, text=ys, textposition="outside", textfont=dict(size=14, color="#333"),))fig.update_layout( title="Numărul de discursuri pe trimestru (peak campanie → drop 79% post-investitură)", yaxis_title="Documente", yaxis_range=[0, 600], # extra headroom so labels don't overlap height=440, margin=dict(t=70, b=80, l=60, r=20), showlegend=False, plot_bgcolor="white", annotations=[dict( x="Q2 2025 campanie", y=540, text="<b>peak campanie</b>", showarrow=True, arrowhead=2, ax=0, ay=-25, font=dict(size=12, color="#003049"), ),dict( x="Q3 2025 deficit", y=200, text="<b>drop 79% post-investitură</b>", showarrow=True, arrowhead=2, ax=0, ay=-25, font=dict(size=12, color="#d62828"), ), ],)fig.show()```În medie, **130 de discursuri pe trimestru ca președinte vs 468 în campanie**. Drop de 3,6×.### 5. Cu premierul Bolojan: aliat tactic, nu prieten```{python}#| echo: falseimport plotly.graph_objects as goimport json as _jsonfrom collections import Counter as _Counter_b_path = ROOT /"results"/"10_nd_bolojan"/"bolojan_mentions.jsonl"_period_counts = _Counter()with _b_path.open() as _f:for _line in _f: _r = _json.loads(_line) _period_counts[_r["period"]] +=1_period_keys = ["2024Q4-2025Q1 candidatură-precampanie","2025Q2 campanie + investitură","2025Q3 deficit + reforma economică","2025Q4 stabilizare + diplomație","2025Q4-2026Q1 reformă judiciară","2026Q2 cotitură UE + criză guvern"]periods = ["Q1 2025", "Q2 2025", "Q3 2025", "Q4 2025", "Q1 2026", "Q2 2026"]tones = ["distant", "mixt", "colaborativ", "mixt", "colaborativ", "tensionat"]mentions = [_period_counts[k] for k in _period_keys]colors = {"distant": "#778da9", "mixt": "#f4a261","colaborativ": "#2a9d8f", "tensionat": "#e63946"}bar_colors = [colors[t] for t in tones]fig = go.Figure(go.Bar( x=periods, y=mentions, marker_color=bar_colors, text=[f"{m}<br><b>{t}</b>"for m, t inzip(mentions, tones)], textposition="outside",))fig.update_layout( title="Mențiuni Bolojan (validate cu disambiguare LLM) + ton relațional", yaxis_title="Mențiuni în discursul ND", height=450, margin=dict(t=60, b=40, l=60, r=20), showlegend=False, plot_bgcolor="white", yaxis_range=[0, max(mentions) +5],)fig.show()```::: {.callout-note}**Fix metodologic (mai 2026)**: numerele au scăzut față de versiunea inițială pentru că ~65% din match-urile pe "premier"/"prim-ministru" erau de fapt despre Ciolacu, Ponta sau alți premieri istorici. Folosim acum un pas de disambiguare prin Gemini. [→ detalii pe pagina Bolojan](bolojan.qmd):::De la *"nu e o mare miză să fie Iohannis sau Bolojan"* ([interviu B1TV, 18 ian 2025](https://www.youtube.com/results?search_query=nicusor+dan+cere+explicatii+anulare+stiri) — ND despre cine rămâne președinte interimar) la *"I-am cerut premierului acest lucru. Știu că mai multă lume i l-a cerut. Susțin și eu demersul ăsta."* (8 aprilie 2026, despre desecretizarea contractelor Pfizer). Un arc relațional în 16 luni: de la indiferență politică la presiune publică pentru transparență.[→ Citește raportul ND-Bolojan complet](bolojan.qmd)---## Cum a fost făcută analizaToate metodele sunt **open source și reproducibile**. Codul Python + datele brute + clasificările LLM sunt în [repository-ul GitHub](https://github.com/radusqrt/evolutie-discurs-nicusor-dan).11 etape:1. **Colectare** din 9 surse (Facebook + 8 canale YouTube) cu proxy Webshare2. **Deduplicate** cu Jaccard ≥ 0,70 (1.525 → 1.110 docs)3. **Diarizare LLM** (Gemini 2.5 Flash, 95-97% acuratețe)4. **Proiecții** scris / vorbit / overall5. **Stats de bază** + TF-IDF6. **BERTopic** (multilingual-e5-large) — 26 topice descoperite7. **Promise Tracker** — 131 promisiuni extrase + clasificate8. **Audit dublu** (2 seed-uri, 32 sample-uri, 75% spot-on)9. **Fact-check web** independent pe 10 promisiuni10. **Analize avansate** — complexitate discurs, ezitare/nuanțare în limbaj, drift semantic, NER, sentiment11. **Raport ND-Bolojan** + fact-check pe 6 perioade[→ Vezi metodologia completă](metoda.qmd)---::: {.callout-tip}## Vrei să folosești datele?Toate documentele brute, clasificările și scripturile sunt disponibile în repository. Lucrezi la un articol jurnalistic? Contactează-mă la **[radu.stochitoiu@gmail.com](mailto:radu.stochitoiu@gmail.com)** — pot adăuga analize la cerere.:::