diff --git a/CLAUDE.md b/CLAUDE.md index 846102a..cf59061 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,6 +28,7 @@ Each calculator directory contains two files following the same pattern: - **`public/arv/`** — Inheritance gap: lump sum + equal savings, gap never closes. Model: `Gap = Arv × (1+r)^n`. Has percentage y-axis chart. - **`public/lonnsutvikling/`** — Data-driven visualization (not a calculator): real SSB wage data showing how equal percentage growth translates to vastly different kroner amounts across occupations. No sliders — hard-coded SSB table 11418 data (2016–2025). - **`public/boligeierskap/`** — Data-driven visualization: who really owns Norwegian housing? Three charts: doughnut (own outright / own with bank / rent), stacked bar (loan size distribution over time), horizontal stacked bar (ownership by household type). SSB tables 14068, 14059, 14065 data (2015–2024). +- **`public/boutgifter/`** — Data-driven visualization: "it's expensive to be poor". Three charts: housing cost burden by income quartile, heavy burden trend over time, ownership by income group. SSB tables 14061, 14067 data (2015–2024). **External dependencies** (loaded via CDN, no install needed): Chart.js 4.4.1, Google Fonts (Fraunces + DM Sans). diff --git a/TODO.md b/TODO.md index cfcf57b..8ff23bf 100644 --- a/TODO.md +++ b/TODO.md @@ -5,4 +5,5 @@ - [ ] **BNP per innbygger (internasjonale forskjeller)** — Ny kalkulator i `public/verden/` som viser hvordan forskjeller i BNP per innbygger mellom land vokser over tid med prosentvis vekst. Samme prosentvise vekst gir stadig større absolutt gap mellom rike og fattige land. - [x] **Lønnsutvikling: prosent vs. kroner** — Visualisering i `public/lonnsutvikling/` basert på reell SSB-statistikk. Viser dobbel ulikhet: høytlønte fikk både flere kroner OG høyere prosentvekst. Data fra SSB tabell 11418, 2016–2025. - [x] **Hvem eier boligen din?** — Visualisering i `public/boligeierskap/` basert på SSB-data (tabeller 14068, 14059, 14065). Viser at bare 34 % eier fritt, 38 % deler med banken, 28 % leier. Gjeldsbyrde over tid og eierskap etter husholdningstype. 2015–2024. +- [x] **Det er dyrt å være fattig** — Visualisering i `public/boutgifter/` basert på SSB-data (tabeller 14061, 14067). Boutgifter som andel av inntekt per kvartil, byrde over tid, eierskap etter inntektsgruppe. 2015–2024. - [ ] **Store formuer i Norge — arv vs. selvbygd** — Analyse/visualisering av hvordan store formuer i Norge har utviklet seg, og hvor stor andel som er arvet. Krever research og dataarbeid. diff --git a/public/boutgifter/app.js b/public/boutgifter/app.js new file mode 100644 index 0000000..7fe65db --- /dev/null +++ b/public/boutgifter/app.js @@ -0,0 +1,262 @@ +// SSB data: Boutgifter og boligeierskap etter inntekt +// Tabell 14061: Boligøkonomi etter inntektsgruppe (boutgifter som andel av inntekt) +// Tabell 14067: Boligeierskap etter inntektsgruppe +// Hentet 2026-03-16 via SSB PxWeb API v2 + +// --- Data --- + +const YEARS = ['2015', '2016', '2017', '2018', '2019', '2020', '2021', '2022', '2023', '2024']; + +// Boutgifter som andel av inntekt per kvartil, 2024 (tabell 14061) +const QUARTILE_LABELS = ['Laveste kvartil', 'Andre kvartil', 'Tredje kvartil', 'Høyeste kvartil']; + +const HOUSING_BURDEN = { + under10: [ 5.2, 10.8, 16.6, 22.0], + from10to19: [12.4, 26.1, 22.8, 24.6], + from20to29: [19.3, 28.2, 29.0, 28.2], + from30to39: [22.4, 19.5, 18.9, 17.7], + from40to59: [23.6, 12.7, 11.5, 6.4], + over60: [17.1, 2.8, 1.2, 1.0] +}; + +// Andel med boutgifter >40% av inntekt (40-59% + 60%+) over tid (tabell 14061) +const HEAVY_BURDEN = { + q1: [33.6, 33.4, 32.9, 34.5, 33.8, 33.5, 35.6, 41.8, 42.9, 40.7], + q2: [ 7.3, 7.0, 7.0, 6.3, 8.3, 6.0, 7.6, 12.3, 12.5, 15.5], + q3: [ 4.2, 3.1, 4.2, 3.9, 3.2, 3.6, 3.6, 6.0, 9.3, 12.7], + q4: [ 2.5, 1.2, 1.9, 2.5, 2.5, 3.5, 2.5, 4.6, 5.9, 7.4] +}; + +// Eierskap etter inntektsgruppe og utsatte grupper, 2024 (tabell 14067) +const OWNERSHIP_GROUPS = [ + { name: 'Sosialhjelpsmottakere', selveier: 13.9, andel: 4.6, leier: 81.5 }, + { name: 'Lavinntekt (EU 60 %)', selveier: 21.2, andel: 10.8, leier: 68.0 }, + { name: 'Laveste kvartil', selveier: 33.2, andel: 12.6, leier: 54.3 }, + { name: 'Barnefamilier lav inntekt', selveier: 39.0, andel: 8.5, leier: 52.5 }, + { name: 'Aleneboende eldre lav innt.', selveier: 52.4, andel: 23.9, leier: 23.7 }, + { name: 'Uføretrygdede', selveier: 55.6, andel: 13.7, leier: 30.7 }, + { name: 'Andre kvartil', selveier: 60.3, andel: 18.2, leier: 21.5 }, + { name: 'Tredje kvartil', selveier: 70.2, andel: 15.6, leier: 14.2 }, + { name: 'Høyeste kvartil', selveier: 79.7, andel: 13.6, leier: 6.7 }, +]; + +// --- Formattering --- + +function fmtPct(n) { + return n.toLocaleString('nb-NO', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + '\u202f%'; +} + +const GRID_COLOR = 'rgba(0,0,0,0.06)'; +const TICK_COLOR = '#8a857e'; + +function baseOpts() { + return { + responsive: true, maintainAspectRatio: false, + plugins: { + legend: { display: false }, + tooltip: { + backgroundColor: '#1a1714', + titleColor: '#f5f2eb', + bodyColor: 'rgba(245,242,235,0.7)', + padding: 10, + cornerRadius: 4, + titleFont: { family: 'DM Sans', size: 12 }, + bodyFont: { family: 'DM Sans', size: 12 } + } + }, + scales: { + x: { + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, maxRotation: 0 }, + grid: { display: false }, + border: { color: 'rgba(0,0,0,0.1)' } + }, + y: { + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, callback: v => v + ' %' }, + grid: { color: GRID_COLOR }, + border: { dash: [3, 3], color: 'transparent' } + } + } + }; +} + +// --- Diagram 1: Boutgifter som andel av inntekt (stablet horisontal) --- + +var chart1Opts = baseOpts(); +chart1Opts.indexAxis = 'y'; +chart1Opts.scales = { + x: { + stacked: true, + max: 100, + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, callback: v => v + ' %' }, + grid: { color: GRID_COLOR }, + border: { dash: [3, 3], color: 'transparent' } + }, + y: { + stacked: true, + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, autoSkip: false }, + grid: { display: false }, + border: { color: 'rgba(0,0,0,0.1)' } + } +}; +chart1Opts.plugins.tooltip = { + mode: 'index', + callbacks: { + label: function(c) { + return ' ' + c.dataset.label + ': ' + fmtPct(c.parsed.x); + } + }, + backgroundColor: '#1a1714', + titleColor: '#f5f2eb', + bodyColor: 'rgba(245,242,235,0.7)', + padding: 10, + cornerRadius: 4, + titleFont: { family: 'DM Sans', size: 12 }, + bodyFont: { family: 'DM Sans', size: 12 } +}; + +new Chart(document.getElementById('chart1'), { + type: 'bar', + data: { + labels: QUARTILE_LABELS, + datasets: [ + { label: 'Under 10 %', data: HOUSING_BURDEN.under10, backgroundColor: '#2c6e49cc', borderColor: '#2c6e49', borderWidth: 1, borderRadius: 1 }, + { label: '10–19 %', data: HOUSING_BURDEN.from10to19, backgroundColor: '#27ae60cc', borderColor: '#27ae60', borderWidth: 1, borderRadius: 1 }, + { label: '20–29 %', data: HOUSING_BURDEN.from20to29, backgroundColor: '#e67e22cc', borderColor: '#e67e22', borderWidth: 1, borderRadius: 1 }, + { label: '30–39 %', data: HOUSING_BURDEN.from30to39, backgroundColor: '#e74c3ccc', borderColor: '#e74c3c', borderWidth: 1, borderRadius: 1 }, + { label: '40–59 %', data: HOUSING_BURDEN.from40to59, backgroundColor: '#c0392bcc', borderColor: '#c0392b', borderWidth: 1, borderRadius: 1 }, + { label: '60 %+', data: HOUSING_BURDEN.over60, backgroundColor: '#8b1a1acc', borderColor: '#8b1a1a', borderWidth: 1, borderRadius: 1 } + ] + }, + options: chart1Opts +}); + +// --- Diagram 2: Tung boutgiftsbyrde over tid (linje) --- + +function buildLegend(containerId, items) { + var container = document.getElementById(containerId); + items.forEach(function(item) { + var span = document.createElement('span'); + var swatch = document.createElement('span'); + swatch.className = 'swatch'; + swatch.style.background = item.color; + span.appendChild(swatch); + span.appendChild(document.createTextNode(item.name)); + container.appendChild(span); + }); +} + +var chart2Lines = [ + { name: 'Laveste kvartil', data: HEAVY_BURDEN.q1, color: '#c0392b' }, + { name: 'Andre kvartil', data: HEAVY_BURDEN.q2, color: '#e67e22' }, + { name: 'Tredje kvartil', data: HEAVY_BURDEN.q3, color: '#1a4a8a' }, + { name: 'Høyeste kvartil', data: HEAVY_BURDEN.q4, color: '#2c6e49' } +]; + +buildLegend('legend2', chart2Lines); + +var chart2Opts = baseOpts(); +chart2Opts.scales.y.max = 50; +chart2Opts.plugins.tooltip = { + callbacks: { + label: function(c) { + return ' ' + c.dataset.label + ': ' + fmtPct(c.parsed.y); + } + }, + backgroundColor: '#1a1714', + titleColor: '#f5f2eb', + bodyColor: 'rgba(245,242,235,0.7)', + padding: 10, + cornerRadius: 4, + titleFont: { family: 'DM Sans', size: 12 }, + bodyFont: { family: 'DM Sans', size: 12 } +}; + +new Chart(document.getElementById('chart2'), { + type: 'line', + data: { + labels: YEARS, + datasets: chart2Lines.map(function(line) { + return { + label: line.name, + data: line.data, + borderColor: line.color, + backgroundColor: line.color + '12', + fill: false, + tension: 0.3, + pointRadius: 0, + pointHoverRadius: 4, + borderWidth: 2.5 + }; + }) + }, + options: chart2Opts +}); + +// --- Diagram 3: Eierskap etter inntektsgruppe (horisontal stablet) --- + +var chart3Opts = baseOpts(); +chart3Opts.indexAxis = 'y'; +chart3Opts.scales = { + x: { + stacked: true, + max: 100, + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, callback: v => v + ' %' }, + grid: { color: GRID_COLOR }, + border: { dash: [3, 3], color: 'transparent' } + }, + y: { + stacked: true, + ticks: { color: TICK_COLOR, font: { size: 11, family: 'DM Sans' }, autoSkip: false }, + grid: { display: false }, + border: { color: 'rgba(0,0,0,0.1)' } + } +}; +chart3Opts.plugins.tooltip = { + mode: 'index', + callbacks: { + label: function(c) { + return ' ' + c.dataset.label + ': ' + fmtPct(c.parsed.x); + } + }, + backgroundColor: '#1a1714', + titleColor: '#f5f2eb', + bodyColor: 'rgba(245,242,235,0.7)', + padding: 10, + cornerRadius: 4, + titleFont: { family: 'DM Sans', size: 12 }, + bodyFont: { family: 'DM Sans', size: 12 } +}; + +new Chart(document.getElementById('chart3'), { + type: 'bar', + data: { + labels: OWNERSHIP_GROUPS.map(function(g) { return g.name; }), + datasets: [ + { + label: 'Selveier', + data: OWNERSHIP_GROUPS.map(function(g) { return g.selveier; }), + backgroundColor: '#2c6e49cc', + borderColor: '#2c6e49', + borderWidth: 1, + borderRadius: 2 + }, + { + label: 'Andelseier', + data: OWNERSHIP_GROUPS.map(function(g) { return g.andel; }), + backgroundColor: '#1a4a8acc', + borderColor: '#1a4a8a', + borderWidth: 1, + borderRadius: 2 + }, + { + label: 'Leier', + data: OWNERSHIP_GROUPS.map(function(g) { return g.leier; }), + backgroundColor: '#c0392bcc', + borderColor: '#c0392b', + borderWidth: 1, + borderRadius: 2 + } + ] + }, + options: chart3Opts +}); diff --git a/public/boutgifter/index.html b/public/boutgifter/index.html new file mode 100644 index 0000000..3547820 --- /dev/null +++ b/public/boutgifter/index.html @@ -0,0 +1,233 @@ + + + + + +Det er dyrt å være fattig — boutgifter etter inntekt, SSB-data 2015–2024 + + + + + + + + + + + + + + + + + +
+

SSB-data 2015–2024

+

Det er dyrt
å være fattig

+

De fattigste betaler minst i kroner — men mest av inntekten sin. 41 % av de fattigste bruker over 40 % av inntekten på bolig. Blant de rikeste: 7 %.

+
Boligbyrden
+
+ +
+ Data: SSB tabell 14061, + 14067 + — Boligøkonomi og boligeierskap, husholdninger +
+ +
+ + +
+
17× mer sannsynlig
+
De fattigste er 17 ganger mer sannsynlig å bruke over 60 % av inntekten på bolig enn de rikeste (17 % mot 1 %).
+
+ + +
+
+
Laveste inntektskvartil
+
120 065 kr/år
+
41 % bruker >40 % av inntekten
+
54 % leier — bygger ingen formue
+
+
+
Høyeste inntektskvartil
+
262 940 kr/år
+
7 % bruker >40 % av inntekten
+
93 % eier — bygger formue
+
+
+ + +
+
+
+
Boutgifter spiser inntekten
+
Boutgifter som andel av inntekt, etter inntektskvartil, 2024
+
+
+ <10 % + 10–19 % + 20–29 % + 30–39 % + 40–59 % + 60 %+ +
+
+
+
+ +
+ De rikeste betaler dobbelt så mye i kroner (263 000 vs 120 000 kr/år) — men det utgjør bare + en liten del av inntekten deres. For de fattigste er bolig en kvelerslange: + 17 % bruker over 60 % av inntekten bare på å ha et sted å bo. +
+ + +
+
+
+
Byrden vokser
+
Andel med boutgifter >40 % av inntekt, per kvartil, 2015–2024
+
+
+
+
+
+ +
+ Siden 2015 har andelen med tung boligbyrde (>40 % av inntekt) steget for alle inntektsgrupper, + men gapet forblir enormt. I 2024 har de fattigste 5× flere med tung boligbyrde enn de rikeste. + Rentehoppet fra 2022 rammet alle — men de fattigste hadde minst å gå på. +
+ + +
+
+
+
Penger kjøper eierskap
+
Boligeierskap etter inntektsgruppe og utsatte grupper, 2024
+
+
+ Selveier + Andelseier + Leier +
+
+
+
+ +
+ 82 % av sosialhjelpsmottakere leier. Blant barnefamilier med lav inntekt leier over halvparten. + De betaler husleie som aldri blir til egenkapital — mens boligeiere bygger formue automatisk. + Slik forsterker boligmarkedet ulikheten: de fattige betaler andres boliglån. +
+ + +
+

Hvorfor er dette viktig?

+

Bolig er den største utgiftsposten for de fleste husholdninger. Men byrden er fundamentalt ulik: + de fattigste bruker en langt større andel av inntekten på å bo — og får mindre igjen for det.

+
+ Fattigste kvartil: 120 065 kr/år → 40 % av inntekten
+ Rikeste kvartil: 262 940 kr/år → 15 % av inntekten
+ Rike betaler mer, men har mer igjen til alt annet +
+

Det som gjør det ekstra skjevt: 54 % av de fattigste leier. Husleien er en ren kostnad — ingen + egenkapital bygges opp. De rikeste derimot eier boligen, og boliglånsbetalinger er delvis sparing. + Slik fungerer boligmarkedet som en formuesmaskin for de rike og en + fattigdomsfelle for de fattige.

+

Tallene er hentet fra SSB levekårsundersøkelsen + (tabell 14061, + 14067). + Boutgifter inkluderer husleie/renter/avdrag, kommunale avgifter, forsikring, strøm og fyring.

+
+ +
+ + + + + + diff --git a/public/index.html b/public/index.html index 19cb5f6..bceb3dc 100644 --- a/public/index.html +++ b/public/index.html @@ -187,6 +187,12 @@ Se visualiseringen → + +

Det er dyrt å være fattig

+

41 % av de fattigste bruker over 40 % av inntekten på bolig. Blant de rikeste: 7 %. Rike betaler mer i kroner, men det merkes knapt. SSB-data 2015–2024.

+ Se visualiseringen → +
+