The Internet Vacancy Index counts every new ad on SEEK, CareerOne and Workforce Australia, month by month since 2006. It gives the long view that a few weeks of job ads can’t.
ivi =FileAttachment("data/ivi_aust.csv").csv({typed:true})cambios =FileAttachment("data/ivi_cambios.csv").csv({typed:true})fmt = d3.format(",")mes = d => d.toLocaleDateString("en-AU", {month:"long",year:"numeric",timeZone:"UTC"})base2019 = d3.rollup(ivi.filter(d => d.mes.getUTCFullYear() ===2019), v => d3.mean(v, d => d.avisos), d => d.codigo)grupos = ivi.filter(d => d.codigo!==0).map(d => ({...d,indice:100* d.avisos/ base2019.get(d.codigo)}))total = ivi.filter(d => d.codigo===0).map(d => ({...d,indice:100* d.avisos/ base2019.get(0)}))ultimoMes = d3.max(ivi, d => d.mes)ba = cambios.find(d => d.codigo===2611)tot = cambios.find(d => d.codigo===0)// Sin signo menos: la web no lleva guiones (Jona, 16/10/2026)flecha = v => v <0?`▼ ${Math.abs(v)}%`: v >0?`▲ ${v}%`:"0%"sentido = v => v <0?"baja": v >0?"sube":""// El nucleo de la pagina en rosa, el total en negro, los demas en grisROSA ="#DB2777"TINTA ="#0F172A"
html`<p>In ${mes(ultimoMes)}, ads for <strong>ICT Business and Systems Analysts</strong> (the officialgroup closest to data and business analysts) were <strong>${Math.abs(ba.pct_vs_2022)}% ${ba.pct_vs_2022<0?"below":"above"}</strong>their 2022 average (${fmt(ba.ultimo)} a month against ${fmt(ba.prom_2022)}). All job ads inAustralia were ${Math.abs(tot.pct_vs_2022)}% ${tot.pct_vs_2022<0?"below":"above"} 2022 over the same time:the data and tech groups fell much harder than the market as a whole.</p>`
Analysts against the whole market
Each line is rescaled so that its 2019 average is 100. Pink: ICT Business and Systems Analysts. Black: every job ad in Australia. Grey: the other data and tech groups in the table below (hover a line to see which).
destacado = grupos.filter(d => d.codigo===2611)otros = grupos.filter(d => d.codigo!==2611)fin = arr => arr.filter(d =>+d.mes===+ultimoMes)Plot.plot({height:440,marginLeft:50,marginRight:185,x: {label:null},y: {label:"Job ads per month (2019 average = 100)",grid:true},marks: [ Plot.ruleY([100], {stroke:"#94a3b8"}), Plot.lineY(otros, {x:"mes",y:"indice",z:"titulo",stroke:"#cbd5e1",strokeWidth:1,tip:true,title: d =>`${d.titulo}\n${mes(d.mes)}: ${fmt(Math.round(d.avisos))} ads a month (${Math.round(d.indice)} vs 2019)`}), Plot.lineY(total, {x:"mes",y:"indice",stroke: TINTA,strokeWidth:2,tip:true,title: d =>`All job ads in Australia\n${mes(d.mes)}: ${fmt(Math.round(d.avisos))} ads a month (${Math.round(d.indice)} vs 2019)`}), Plot.lineY(destacado, {x:"mes",y:"indice",stroke: ROSA,strokeWidth:2.5,tip:true,title: d =>`ICT Business and Systems Analysts\n${mes(d.mes)}: ${fmt(Math.round(d.avisos))} ads a month (${Math.round(d.indice)} vs 2019)`}), Plot.text(fin(destacado), {x:"mes",y:"indice",text: () =>"Business & systems analysts",dx:6,textAnchor:"start",fill: ROSA,fontWeight:600}), Plot.text(fin(total), {x:"mes",y:"indice",text: () =>"All job ads",dx:6,textAnchor:"start",fill: TINTA}) ]})
The numbers
html`<table class="tabla-simple"> <thead><tr><th>Official group</th><th>2019 avg</th><th>2022 avg</th><th>${mes(ultimoMes)}</th><th>vs 2022</th><th>vs a year before</th></tr></thead> <tbody>${cambios.slice().sort((a, b) => a.codigo- b.codigo).map(d =>html`<tr> <td>${d.codigo===0?"All job ads in Australia": d.titulo}</td> <td class="n">${fmt(d.prom_2019)}</td><td class="n">${fmt(d.prom_2022)}</td><td class="n">${fmt(d.ultimo)}</td> <td class="n ${sentido(d.pct_vs_2022)}">${flecha(d.pct_vs_2022)}</td> <td class="n ${sentido(d.pct_vs_hace_un_ano)}">${flecha(d.pct_vs_hace_un_ano)}</td> </tr>`)}</tbody></table>`
There is no “data analyst” line in the official classification (ANZSCO): data analysts are spread across these groups. At this level of detail each value is an average of three months. Source: Internet Vacancy Index, Jobs and Skills Australia.