---
title: "Særlig uavhengige stillinger"
subtitle: "Et ukentlig tekstsøk i norske stillingsannonser etter stillinger som markedsføres som unntatt arbeidstidsreglene (aml. § 10-12)"
date: today
date-format: "D. MMMM YYYY"
lang: nb
format:
html:
code-tools: true
code-links: false
grid:
body-width: 1040px
---
## Hva siden måler
::: {.callout-note title="Sammendrag"}
«Særlig uavhengig stilling» etter arbeidsmiljøloven § 10-12 (2) tar en ansatt ut av arbeidstidskapittelet: ingen grenser for arbeidstid, ingen overtidsbetaling. Arbeidstilsynet er tydelig på at dette er en vurdering av **de faktiske arbeidsoppgavene**, ikke av tittelen eller yrkeskoden, og at de alminnelige reglene gjelder i tvilstilfeller. Derfor lar unntaket seg ikke lese av en STYRK-kode. Yrker-datasettet klassifiserer bare de 11 lederyrkene i STYRK-hovedgruppe 1 som særlig uavhengige og markerer resten som mulige falske negative.
Denne siden legger et empirisk signal oppå regelsettet. Hver uke leser proben de fullstendige annonsetekstene fra NAV og teller hvor mange stillinger som faktisk er **markedsført** med språk om særlig uavhengighet, unntak fra arbeidstidsbestemmelsene eller bortfall av overtidsbetaling. De sterke treffene som ligger **utenfor** lederyrkene er kandidater til manuell gjennomgang — stillinger som ser ut til å påberope seg unntaket uten å være ledelse.
:::
Unntaket er rettslig viktig og samtidig vanskelig å observere. Det er nettopp derfor et tekstsignal er nyttig: det peker på hvor de uavklarte tilfellene faktisk dukker opp, slik at de kan vurderes — ikke som en juridisk konklusjon, men som en kandidatliste.
## Hvordan signalet er bygget
Deteksjonen er **gradert**, kalibrert på rundt 6 700 reelle annonsetekster der den ordrette frasen forekommer i omtrent 0,01 %:
- **Sterkt** — eksplisitt «særlig uavhengig», «§ 10-12», «unntatt fra arbeidstidsbestemmelsene», negert overtid («ingen/uten overtidsbetaling», «ikke overtidsbetalt») eller full råderett over egen arbeidstid. Dette er et reelt signal om unntak fra arbeidstidsreglene.
- **Svakt** — «stor grad av selvstendighet/frihet», «høy grad av autonomi». En autonomiramme som støtter opp under, men ikke avgjør.
- **Ledende** — «ledende stilling». Det beslektede, men separate lederunntaket etter § 10-12 (1), som telles for seg.
Tallgrunnlaget kommer fra den samme ukentlige NAV-innhentingen som [adopsjonssporeren](adoption.qmd); proben gjenbruker tekst-cachen og henter ingenting ekstra.
```{python}
#| label: setup
#| code-summary: "Last de ukentlige SU-panelene"
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
def md(s):
from IPython.display import Markdown
return Markdown(s)
KOJA = {"fjord": "#5d79a0", "amber": "#cf9a5c", "mist": "#b1abb0",
"muted": "#8292ad", "heading": "#e7ecf3", "rose": "#c07a86"}
plt.rcParams.update({
"figure.facecolor": "none", "axes.facecolor": "none", "savefig.facecolor": "none",
"savefig.transparent": True, "text.color": KOJA["mist"], "axes.labelcolor": KOJA["mist"],
"axes.edgecolor": "#3a4860", "xtick.color": KOJA["muted"], "ytick.color": KOJA["muted"],
"axes.titlecolor": KOJA["heading"], "axes.grid": True, "grid.color": "#8292ad",
"grid.alpha": 0.15, "font.size": 11,
})
D = "adoption-tracker/data"
wk = pd.read_csv(f"{D}/su_weekly.csv").sort_values("date").reset_index(drop=True)
occ = pd.read_csv(f"{D}/su_by_occupation.csv")
cand = pd.read_csv(f"{D}/su_candidates.csv")
last = wk.iloc[-1]
last_date = str(last["date"])
```
```{python}
#| output: asis
#| echo: false
n_strong = int(last["n_strong"]); n_led = int(last["n_ledende"])
n_bodies = int(last["n_bodies"]); n_weak = int(last["n_weak"])
cand_last = cand[cand.date == cand.date.max()]
n_nonlead = int((cand_last.role_class != "leadership").sum())
md(f"I siste øyeblikksbilde (**{last_date}**) bar **{n_strong}** av {n_bodies:,} leste annonser "
f"et **sterkt** signal om særlig uavhengighet ({last['share_strong']*100:.2f} %), "
f"{n_weak} et svakt autonomisignal ({last['share_weak']*100:.2f} %), og {n_led} omtalte en "
f"**ledende** stilling. Av de sterke treffene ligger **{n_nonlead}** utenfor lederyrkene — "
f"det er kandidatene til gjennomgang lenger ned.")
```
## Utviklingen uke for uke
```{python}
#| label: fig-su-trend
#| fig-cap: "Sterke og ledende treff (venstre akse, få per uke) mot svake autonomisignaler (høyre akse). Tallene er små: noen titalls per 10 000 annonser, og uke-til-uke-bevegelser bør leses som støy inntil serien er lengre."
fig, axL = plt.subplots(figsize=(7, 4.2))
x = wk["date"].astype(str)
axL.plot(x, wk["n_strong"], "-o", color=KOJA["amber"], label="Sterkt (SU/unntak)")
axL.plot(x, wk["n_ledende"], "-o", color=KOJA["fjord"], label="Ledende stilling")
axL.set_ylabel("Sterke / ledende treff (antall)")
axL.yaxis.set_major_locator(MaxNLocator(integer=True))
axL.set_ylim(bottom=0)
axR = axL.twinx()
axR.plot(x, wk["n_weak"], "--", color=KOJA["mist"], label="Svakt (autonomi)")
axR.set_ylabel("Svake autonomisignaler (antall)")
axR.grid(False)
axR.set_ylim(bottom=0)
lines = axL.get_lines() + axR.get_lines()
axL.legend(lines, [l.get_label() for l in lines], loc="upper left", frameon=False, fontsize=9)
axL.set_title("Særlig-uavhengig-signaler per ukentlig NAV-snapshot")
fig.autofmt_xdate(rotation=0, ha="center")
plt.tight_layout(); plt.show()
```
## Hvilke yrker dukker opp?
```{python}
#| label: fig-su-occ
#| fig-cap: "Yrker med minst ett sterkt SU-signal i siste uke, etter antall treff. Yrkestitlene er STYRK-08. Listen domineres ikke av lederyrkene alene — og det er hele poenget med proben."
o = occ[occ.date == occ.date.max()].copy()
o = o[o.styrk.astype(str).str.strip() != ""]
o = o.sort_values("n_strong").tail(14)
if len(o):
fig, ax = plt.subplots(figsize=(7, max(2.4, 0.42*len(o))))
ax.barh(o.styrk, o.n_strong, color=KOJA["amber"], alpha=0.85)
ax.set_xlabel("Sterke SU-treff i siste uke (antall)")
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
ax.set_title(f"Sterke SU-signaler etter yrke — {last_date}")
ax.grid(axis="y", alpha=0)
plt.tight_layout(); plt.show()
else:
md("_Ingen yrkesfordeling for siste uke._")
```
## Kandidatene til gjennomgang
Hver stilling med et sterkt signal som **ikke** er et lederyrke er en kandidat: en annonse markedsført som særlig uavhengig utenfor det regelbaserte settet, altså et mulig falskt negativt. Regelsettet (Yrker) regner bare ledelse som særlig uavhengig, så det er disse tilfellene som er verdt et menneskelig blikk.
```{python}
#| output: asis
#| echo: false
c = cand[cand.date == cand.date.max()].copy()
c = c[c.role_class != "leadership"]
if len(c):
rows = ["| Stilling | Yrke (STYRK-08) | Signal |", "|---|---|---|"]
for _, r in c.iterrows():
title = str(r["title"]).replace("|", "∣").strip()
styrk = str(r["styrk"]).replace("|", "∣").strip() or "—"
terms = str(r["signal_terms"]).replace("|", "∣").strip()
rows.append(f"| {title} | {styrk} | {terms} |")
out = f"**{len(c)} kandidat(er) i {last_date}:**\n\n" + "\n".join(rows)
else:
out = f"_Ingen ikke-ledende kandidater i {last_date}._"
md(out)
```
::: {.callout-warning title="Hva signalet ikke er"}
Et tekstsignal er ikke en rettslig avgjørelse. At en annonse omtaler særlig uavhengighet, unntak fra arbeidstidsbestemmelsene eller bortfall av overtid, betyr ikke at stillingen *er* unntatt — det avhenger av de faktiske oppgavene, og i tvil gjelder de alminnelige reglene. Negert overtid fanger dessuten både reelle § 10-12-tilfeller og ordinære fastlønnsformuleringer. Tallene er små, og listen er ment som et utgangspunkt for gjennomgang, ikke som en konklusjon.
:::
## Kilde og metode
- **Datakilde:** ukentlig øyeblikksbilde av åpne stillinger på [arbeidsplassen.nav.no](https://arbeidsplassen.nav.no), med fullstendig annonsetekst hentet for nye annonser.
- **Hjemmel:** arbeidsmiljøloven [§ 10-12](https://lovdata.no/lov/2005-06-17-62/§10-12); Arbeidstilsynets veiledning om særlig uavhengig stilling.
- **Klassifisering:** yrkene er STYRK-08; lederyrkene i hovedgruppe 1 utgjør det regelbaserte SU-settet.
- **Oppdatering:** panelene `su_weekly.csv`, `su_by_occupation.csv` og `su_candidates.csv` bygges på nytt ved hver ukentlige kjøring av sporeren.