NBN speeds improving but more work to do

Australian consumers experienced generally improved speeds on fixed-line NBN services during the last quarter, including during the high-demand evening period, according to the ACCC’s Measuring Broadband Australia report out today.

This latest report, the fifth since the Measuring Broadband Australia series was launched, was compiled with data from a growing pool of almost 1000 volunteers Australia-wide, who used a variety of retail service providers (RSPs) and technologies in February 2019.

RSPs’ download speeds generally increased compared to the previous quarter, including during the busy evening hours of 7pm to 11pm. This followed a dip in performance during the previous testing period, which may have been due, in part, to RSPs migrating their customers to new wholesale products offered by NBN Co.

Exetel and Dodo/iPrimus both improved their speed test performance, after their results were included for the first time in the previous report.

For the busy hours, iiNet posted the biggest improvement for download speeds, while TPG achieved the highest percentage of its maximum download speed.

“It is good to see providers improving their performance in recent months, including those whose performance was seen to be lagging in our previous report,” ACCC Chair Rod Sims said.

“We believe the additional transparency and scrutiny provided by our monitoring program has helped lift speeds across RSPs.”

This report also examines whether RSPs’ performance matches their advertised speeds.

Most RSPs are achieving average speeds on their NBN broadband plans across the busy hours that meet or exceed the typical plan speeds they advertise for the busy evening periods.

Some consumers continue to experience underperforming services that never achieve close to their maximum advertised plan speed. This situation impacted 13 per cent of volunteers in the MBA program, including one in four fibre-to-the-node (FTTN) services on plans with a maximum speed of 50 and 100 Mbps.

These underperforming services continued to significantly impact the overall download speed results. In addition, this latest report finds that these services have a relatively higher latency, meaning the users may have a less reliable experience for uses like video calls and online gaming, even where there are adequate speeds to support such applications.

“RSPs need to continue to monitor their networks to ensure their speed claims are realistic, and we expect NBN Co and RSPs to work harder together to help consumers achieve the speeds they are paying for,” Mr Sims said.

“We will be watching to see how companies respond to customers who aren’t getting the advertised speeds on their current plans, and we will act on misleading speed and performance claims made by providers.”

“Consumers should also ask whether their service could be being affected by in-house wiring issues, which in many cases can be remedied through a visit from a technician.”

For the first time, the Measuring Broadband Australia report includes data on the frequency of outages on NBN services for major RSPs, a bugbear for many consumers.

Most volunteers experienced less than one outage of 30 seconds or more per day, depending on their RSPs. However Optus customers experienced, on average, more than 1.5 outages per day.

“We expect this new reporting to drive retailers to improve their service on outages, as it has with lifting speed performances,” Mr Sims said.

“There are various reasons why an outage may occur, so we encourage consumers experiencing a high rate of drop-outs to contact their RSP to discuss whether they have a fault with their connection or modem.”

Services delivered on the NBN continue to outperform ADSL services. Consumers on NBN plans with a maximum speed of 25 Mbps received average download speeds of 22.7 Mbps during the busy hours compared to the 7.2 Mbps speed received by ADSL users.

While the number of volunteers for the Measuring Broadband Australia program has continued to increase, the ACCC says more participants are needed.

“Measuring Broadband Australia provides Australians with the data they need to make informed decisions about which providers are performing well, and which ones have room for improvement,” Mr Sims said.

“More volunteers will enable us to provide information that is reliable and useful for all Australians, regardless of their RSP, technology or speed plan.”

Data for the latest report was collected in February 2019. The previous testing period was during November 2018.

Interested broadband customers can apply to be a volunteer by signing up at Measuring Broadband Australia.

Notes to editors

Changes to Busiest hour measurement

The busiest hour represents when the RSP networks were under the most stress during the testing period.

In previous reports, this was calculated by identifying the fifth lowest speed during busy hour for each individual service and then calculating the average result for each RSP/Product/Technology.

This report has taken a different approach by calculating the average speed per hour across all busy hours, per RSP/Product/Technology. The busiest hour is then identified as the fifth lowest average speed per hour.

The busiest hour results for Report 4 presented under Broadband Performance Data have been revised to allow a like-for-like comparison with the most recent results.

The original results can still be viewed in Measuring Broadband Australia report 4.

Latency

Counted in milliseconds, this metric measures how long it takes a data packet to go from a device to the test server and back to the same device. The shorter the latency, the better.

Reliable latency is important for activities that require data to be sent both to and from a device. This includes popular services such as online gaming, video streaming and voice/video over internet protocol services.

See also

Measuring Broadband Australia report

Broadband speed information for consumers

More information: Measuring Broadband Australia

Background

In April 2017 the Federal Government announced that it would fund the ACCC to run an independent national broadband performance monitoring and reporting program to provide Australian consumers with accurate and independent information about broadband speeds through to 2021.

Program testing and data is provided by UK-based firm SamKnows using internationally tested methods similar to those used in established programs in the UK, US and Canada.

The program has so far collected expressions of interest from over 10,000 potential volunteers, and has a growing testing panel of over 1000 volunteers in the field in readiness for the next quarter of testing.

Note: This page requires JavaScript to display correctly, please enable JavaScript or use a browser that support JavaScript.

Note: This page requires JavaScript to display correctly, please enable JavaScript or use a browser that support JavaScript.

Figure 1. NBN plan speeds delivered during busy hours and the busiest hour

Aussie Broadband +1.1%
Dodo & iPrimus +2.9%
Exetel +3.5%
iiNet +4.7%
MyRepublic -0.1%
Optus +1.1%
Telstra +0.8%
TPG +2.2%

Aussie Broadband +1.6%
Dodo & iPrimus -1.2%
Exetel +5.1%
iiNet +17.5%
MyRepublic +0.1%
Optus +0.7%
Telstra +0.5%
TPG +4.1%

Aussie Broadband -0.5%
Dodo & iPrimus +2.5%
Exetel -0.5%
iiNet -1.8%
MyRepublic -3.2%
Optus -1.7%
Telstra -0.6%
TPG +0.1%

  • Busy hours = 7.00pm to 11.00pm.
  • Busiest hour = Fifth lowest hourly average speed out of all the month’s busy hours for each RSP. The busiest hour calculation method was revised in May 2019. Busiest hour results are not comparable with those published in Feb 2019.
  • = Benchmark level 60%.
  • +- Percentage point changes
    compared with previous quarter’s
    measurements.
  • Percent of maximum plan speed.

‘use strict’;
var dials = document.getElementsByClassName(‘dial’);

// Define the div for the tooltip
var div = d3.select(“body”).append(“div”)
.attr(“class”, “dial-tooltip”)
.style(“opacity”, 0);

function Gauge(placeholderName, configuration) {
this.placeholderName = placeholderName;

var self = this; // for internal d3 functions

this.configure = function(configuration) {
this.config = configuration;

this.config.size = this.config.size * 1.7;

this.config.radius = this.config.size * 1 / 2;
this.config.cx = this.config.size / 1.8;
this.config.cy = this.config.size / 1.6;

this.config.min = undefined !== configuration.min ? configuration.min : 0;
this.config.max = undefined !== configuration.max ? configuration.max : 100;
this.config.range = this.config.max – this.config.min;

this.config.primaryColor = configuration.primaryColor || ‘#410099’;
this.config.secondaryColor = configuration.secondaryColor || ‘#f3f3f3’;

this.config.value = configuration.value;

this.config.transitionDuration = configuration.transitionDuration || 750;
};

this.render = function() {
this.body = d3.select(‘#’ + this.placeholderName)
.append(‘svg:svg’)
.attr(‘class’, ‘gauge’)
.attr(‘width’, this.config.size)
.attr(‘height’, this.config.size);

for (var index in this.config.primaryZones) {
this.drawBand(this.config.primaryZones[index].from, this.config.primaryZones[index].to, self.config.primaryColor);
}

for (index in this.config.secondaryZones) {
this.drawBand(this.config.secondaryZones[index].from, this.config.secondaryZones[index].to, self.config.secondaryColor);
}

for (index in this.config.tertiaryZones) {
this.drawBand(this.config.tertiaryZones[index].from, this.config.tertiaryZones[index].to, self.config.tertiaryColor);
}

for (index in this.config.quaternaryZones) {
this.drawBand(this.config.quaternaryZones[index].from, this.config.quaternaryZones[index].to, self.config.quaternaryColor);
}

var fontSize = Math.round(this.config.size / 16);

for (var setMarker = 0; setMarker = end – start) {
return;
}

this.body.append(‘svg:path’)
.style(‘fill’, color)
.attr(‘d’, d3.svg.arc()
.startAngle(this.valueToRadians(start))
.endAngle(this.valueToRadians(end))
.innerRadius(0.44 * this.config.radius) // bar width
.outerRadius(0.76 * this.config.radius))
.attr(‘transform’, function() {
return ‘translate(‘ + self.config.cx + ‘, ‘ + self.config.cy + ‘) rotate(270)’;
});

/* console.log(this.config.percentages); */

};

this.redraw = function(value, transitionDuration) {
var pointerContainer = this.body.select(‘#’ + this.placeholderName + ‘ .pointerContainer’);

pointerContainer.selectAll(‘text’).text(value + ‘%’);
var pointer = pointerContainer.selectAll(‘path’);

pointer.transition()
.duration(undefined !== transitionDuration ? transitionDuration : this.config.transitionDuration)
.attrTween(‘transform’, function() {
var pointerValue = value * 1;
if (pointerValue > self.config.max) {
pointerValue = self.config.max + 0.02 * self.config.range;
} else if (pointerValue < self.config.min) {
pointerValue = self.config.min – 0.02 * self.config.range;
}
var targetRotation = (self.valueToDegrees(pointerValue) – 90);
var currentRotation = self._currentRotation || targetRotation;
self._currentRotation = targetRotation;
return function(step) {
var rotation = currentRotation + (targetRotation – currentRotation) * step;
return 'translate(' + self.config.cx + ', ' + self.config.cy + ') rotate(' + rotation + ')';
};
});
};

this.valueToDegrees = function(value) {
return value / this.config.range * 270 – (this.config.min / this.config.range * 270 + 45);
};

this.valueToRadians = function(value) {
return this.valueToDegrees(value) * Math.PI / 180;
};

this.valueToPoint = function(value, factor) {
return {
x: this.config.cx – this.config.radius * factor * Math.cos(this.valueToRadians(value)),
y: this.config.cy – this.config.radius * factor * Math.sin(this.valueToRadians(value))
};
};

// initialization
this.configure(configuration);
}

function newDial(name, value, marker, marker2, min, max, percentages, rsp) {

var config = {
size: 100,
name: name.replace(/s+/g, '-').toLowerCase(),
label: name,
rsp: rsp,
value: value,
markerPosition: marker,
markerPosition2: marker2,
min: undefined !== min ? min : 0,
max: undefined !== max ? max : 100,
percentages: percentages
};

var range = config.max – config.min;
config.primaryZones = [{
from: config.min,
to: config.min + range * config.percentages[0]
}];
config.secondaryZones = [{
from: config.min + range * config.percentages[0],
to: config.min + range * config.percentages[1]
}];

var createDial = new Gauge(config.name, config);
createDial.render();
createDial.redraw(config.value);
}

function createGauges() {
Array.prototype.forEach.call(dials, function(dial) {
var data = dial.dataset;
var percent = data.percentages.split(',').map(Number);
newDial(data.name, data.value, data.marker, data.marker2, data.min, data.max, percent, data.rsp);
});
}

function initialize() {
createGauges();
}

initialize();
jQuery(‘a[data-toggle=”tab”]’).on(‘hide.bs.tab’, function(e) {
var $old_tab = jQuery(jQuery(e.target).attr(“href”));
var $new_tab = jQuery(jQuery(e.relatedTarget).attr(“href”));

if ($new_tab.index() $old_tab.index()) {
$new_tab.css(‘position’, ‘relative’).css(“right”, “-2500px”);
$new_tab.animate({
“right”: “0”
}, 250);
} else {
$new_tab.css(‘position’, ‘relative’).css(“left”, “-2500px”);
$new_tab.animate({
“left”: “0”
}, 250);
}
});

jQuery(‘a[data-toggle=”tab”]’).on(‘shown.bs.tab’, function(e) {});
jQuery(‘#dials_container .nav-tabs>li:nth-child(1)>a’).on(‘click’, function(e) {
jQuery(“div.dial-tooltip”).removeClass(“upload vbusy”);
jQuery(“#dials_explain.explain-rich”).removeClass(“upload vbusy”);
});
jQuery(‘#dials_container .nav-tabs>li:nth-child(2)>a’).on(‘click’, function(e) {
jQuery(“div.dial-tooltip”).addClass(“vbusy”).removeClass(“upload”);
jQuery(“#dials_explain.explain-rich”).addClass(“vbusy”).removeClass(“upload”);
});
jQuery(‘#dials_container .nav-tabs>li:nth-child(3)>a’).on(‘click’, function(e) {
jQuery(“div.dial-tooltip”).addClass(“upload”).removeClass(“vbusy”);
jQuery(“#dials_explain.explain-rich”).addClass(“upload”).removeClass(“vbusy”);
});

data_dl_avg_1803_potential = “/sites/www.accc.gov.au/files/1804-nbn-mba-1901-potential.csv”;
data_disconnect_1901 = “/sites/www.accc.gov.au/files/1901-nbn-mba-disconnect-1901.csv”;

Figure 2. Potential speed excluding results that are unable to achieve maximum plan speeds during busy hours

  • indicates the boost to average speed if services not able to achieve maximum plan speeds were excluded from the overall results. These services include NBN FTTN connections not capable of delivering 50 Mbps. If you are a customer on a service that does not deliver expected speeds, contact your provider to identify whether your connection could be fixed by a technician or if you can change to a different, likely cheaper, plan.

function showMeTheData7(csv, csv_id) {
d3.csv(csv, function(err, data) {
var data = Object.keys(data[0]).filter(function(k) {
return k != “date”
})
.map(function(k) {
return {
“key”: k,
“values”: data.map(function(d) {
return {
“x”: d.date,
“y”: +d[k]
}
})
}
});
nv.addGraph(function() {
var chart = nv.models.multiBarHorizontalChart()
.duration(250)
.color([“#410099”, “#1CCFC9”, ‘#8B9EFF’, “#23C9FF”, “rgba(65, 0, 153, 0.5)”, “rgba(28, 207, 201, 0.5)”, “rgba(139, 158, 255, 0.5)”, “rgba(35, 201, 255, 0.5)”])
.valueFormat(function(d) {
return d3.format(“.3s”)(d) + “%”;
})
.showValues(true)
.margin({
right: 25,
left: 125,
bottom: 50,
top: 0
})
.legendPosition(“top”)
.forceY([0, 100])
.groupSpacing(0.33)
.showControls(false);

chart.yAxis.tickFormat(function(d) {
return d3.format(“.1”)(d) + “%”;
}).ticks(5)

chart.yAxis.ticks(5).axisLabelDistance(0, 0).axisLabel(‘Percent of maximum plan speed during busy hours (%)’);

chart.legend.maxKeyLength(100).rightAlign(false).margin({
left: 0,
top: 10,
bottom: 15
});

d3.select(csv_id)
.datum(data)
.call(chart);

nv.utils.windowResize(function() {
chart.update(function() {});
});

return chart;

});
});
};

nbnChart7 = ‘#chart_7 > svg’;

jQuery(document).ready(function() {

showMeTheData7(data_dl_avg_1803_potential, nbnChart7);

});

Figure 3. Average daily outages per user lasting longer than 30 seconds

jQuery(document).ready(function() {

showMeTheData9(data_disconnect_1901, nbnChart9);

});
function showMeTheData9(csv, csv_id) {
d3.csv(csv, function(err, data) {
var data = Object.keys(data[0]).filter(function(k) {
return k != “label”
})
.map(function(k) {
return {
“key”: k,
“values”: data.map(function(d) {
return {
“x”: d.label,
“y”: +d[k]
}
})
}
});
nv.addGraph(function() {
var chart = nv.models.multiBarHorizontalChart()
.color([“#410099”, “#1CCFC9”, ‘#8B9EFF’, “#23C9FF”, “#FFC502”, ‘#FF7600’, “#92D631″])
.showValues(true)
.showControls(false)
.valueFormat(d3.format(‘,.2f’))
.groupSpacing(0.1)
.forceY([0, 2])
.showLegend(false)
.margin({
right: -40,
left: 120,
bottom: 40,
top: 20
});

chart.xAxis.axisLabel(”).axisLabelDistance(70, 10);
chart.yAxis.tickFormat(d3.format(‘.4’)).ticks(5).axisLabel(‘Average daily outages’);

formatValue_tooltip2 = d3.format(“.4”);

chart.tooltip
.contentGenerator(function(e) {
var series = e.series[0];

if (series.value === null) return;

var rows =

” +

” + “

/Public Release. View in full here.