Evoluția discursului
  • Acasă
  • Două registre
  • Topice în timp
  • Promisiuni
  • Entități
  • Cu Bolojan
  • Metoda

Evoluția discursului lui Nicușor Dan

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.

→ Citește analiza completă cu limitări metodologice

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.

→ Vezi cele 131 de promisiuni

3. Vorbește abstract, nu enumerativ

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ță.

→ Citește raportul ND-Bolojan complet


Cum a fost făcută analiza

Toate metodele sunt open source și reproducibile. Codul Python + datele brute + clasificările LLM sunt în repository-ul GitHub.

11 etape:

  1. Colectare din 9 surse (Facebook + 8 canale YouTube) cu proxy Webshare
  2. 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 / overall
  5. Stats de bază + TF-IDF
  6. BERTopic (multilingual-e5-large) — 26 topice descoperite
  7. Promise Tracker — 131 promisiuni extrase + clasificate
  8. Audit dublu (2 seed-uri, 32 sample-uri, 75% spot-on)
  9. Fact-check web independent pe 10 promisiuni
  10. Analize avansate — complexitate discurs, ezitare/nuanțare în limbaj, drift semantic, NER, sentiment
  11. Raport ND-Bolojan + fact-check pe 6 perioade

→ Vezi metodologia completă


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 — pot adăuga analize la cerere.

Back to top
Source Code
---
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: false
page-layout: full
---

```{python}
#| label: setup
#| include: false
import sys, json
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent if "__file__" in dir() else Path("..").resolve()
sys.path.insert(0, str(ROOT))

import pandas as pd
import frontmatter

def 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(1 for _ in (ROOT / "data" / f"3_nd_{proj}").rglob("*.md")
            if "/excluded/" not in str(_))
    return n

promises = 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 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:

```{python}
#| label: corpus-stats
#| echo: false
from IPython.display import HTML

overall = 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 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.

[→ Citește analiza completă cu limitări metodologice](doua-registre.qmd)

### 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**.

```{python}
#| echo: false
import plotly.graph_objects as go

fig = 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 enumerativ

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ă

```{python}
#| echo: false
import pandas as pd
import frontmatter
from collections import Counter

def period_for(d):
    y, m = int(d[:4]), int(d[5:7])
    if y == 2024 or (y == 2025 and m <= 2): return "Q1 2025 precampanie"
    if y == 2025 and m <= 5: return "Q2 2025 campanie"
    if y == 2025 and m <= 8: return "Q3 2025 deficit"
    if y == 2025 and m <= 11: return "Q4 2025 stabilizare"
    if y == 2025 and m == 12 or (y == 2026 and m <= 2): return "Q1 2026 judiciar"
    if y == 2026 and m <= 5: return "Q2 2026 UE+criză"
    return None

counts = Counter()
for path in (ROOT / "data" / "3_nd_overall").rglob("*.md"):
    if "/excluded/" in str(path):
        continue
    post = frontmatter.load(path)
    p = period_for(str(post.get("data", ""))[:10])
    if p:
        counts[p] += 1

order = ["Q1 2025 precampanie", "Q2 2025 campanie", "Q3 2025 deficit",
         "Q4 2025 stabilizare", "Q1 2026 judiciar", "Q2 2026 UE+criză"]
xs = order
ys = [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: false
import plotly.graph_objects as go
import json as _json
from 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 in zip(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ă analiza

Toate 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 Webshare
2. **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 / overall
5. **Stats de bază** + TF-IDF
6. **BERTopic** (multilingual-e5-large) — 26 topice descoperite
7. **Promise Tracker** — 131 promisiuni extrase + clasificate
8. **Audit dublu** (2 seed-uri, 32 sample-uri, 75% spot-on)
9. **Fact-check web** independent pe 10 promisiuni
10. **Analize avansate** — complexitate discurs, ezitare/nuanțare în limbaj, drift semantic, NER, sentiment
11. **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.
:::

Autor: Radu Stochitoiu · Cod și date: GitHub

 
  • Edit this page
  • View source

Generat cu Quarto · Mai 2026