Why is India at the bottom of aggr. performance by Geo?

Being an Indian, a section of Web Almanac’s Performance chapter drew my attention :

Of the 23 countries, India is at the bottom of Aggregate FCP & TTFB by geography.

I wanted to find out why:

India : Mobile vs Desktop Distribution

SELECT   form_factor.name AS device,
  ROUND(SUM(fcp.density), 4) / 315615 AS density 
  FROM `chrome-ux-report.country_in.201907`, 
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
GROUP BY
  device
ORDER BY
  device

Desktop : 17.2%
Mobile : 82.6%

[Note : 315615 is the total distinct origins in the table]

World : Mobile vs Desktop Distribution

SELECT   form_factor.name AS device,
  ROUND(SUM(fcp.density), 4) / 5612504 AS density 
  FROM `chrome-ux-report.all.201907`,
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
GROUP BY
  device
ORDER BY
  device

Desktop : 32.0%
Mobile : 67.5%

[Note : 5612504 is the total distinct origins in the table]

India : Effective Connection Type

SELECT
  effective_connection_type.name AS connection,
  ROUND(SUM(fcp.density), 4) / 315615 AS density
FROM
  `chrome-ux-report.country_in.201907`,
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
GROUP BY
  connection
ORDER BY
  connection

2G : 0.3%
3G : 29.9%
4G : 69.8%

World : Effective Connection Type

SELECT
  effective_connection_type.name AS connection,
  ROUND(SUM(fcp.density), 4) / 5612504 AS density
FROM
  `chrome-ux-report.all.201907`,
  UNNEST(first_contentful_paint.histogram.bin) AS fcp
GROUP BY
  connection
ORDER BY
  connection

2G : 0%
3G : 5.7%
4G : 94.2%

India : Most Popular Smartphone
According to this report (based on mobile web traffic to this analytics provider), Xiaomi Redmi Note 4 (released in Jan 2017) Android 6.0 device with 3/4GB RAM and Snapdragon 625 is most popular device in Q2 2019.

USA : Most Popular Smartphone
During the same time, iPhone 7 is the most popular device in the USA.

Note : Would like to have better device stats here - recommendation for sources welcome.

India vs World : Median Website Stats (size, requests for HTML, JS, CSS, Images)

WITH
  countries AS (
  SELECT *, 'in' AS country_code, 'India' AS country FROM `chrome-ux-report.country_in.201907` UNION ALL
  SELECT *, 'gl' AS country_code, 'World' AS country FROM `chrome-ux-report.all.201907`
)

SELECT
  _TABLE_SUFFIX AS client,
  country,
  COUNT(0) AS urls,
  ROUND(APPROX_QUANTILES(bytesFont, 1001)[OFFSET(501)] / 1024, 2) AS median_font_bytes,
  ROUND(APPROX_QUANTILES(num_scripts_sync, 1001)[OFFSET(501)], 2) AS median_num_scripts_sync,
  ROUND(APPROX_QUANTILES(num_scripts_async, 1001)[OFFSET(501)], 2) AS median_num_scripts_async,
  ROUND(APPROX_QUANTILES(num_scripts, 1001)[OFFSET(501)], 2) AS median_num_scripts,
  ROUND(APPROX_QUANTILES(avg_dom_depth, 1001)[OFFSET(501)], 2) AS median_avg_dom_depth,
  ROUND(APPROX_QUANTILES(numDomElements, 1001)[OFFSET(501)], 2) AS median_numDomElements,
  ROUND(APPROX_QUANTILES(numRedirects, 1001)[OFFSET(501)], 2) AS median_numRedirects,
  ROUND(APPROX_QUANTILES(numDomains, 1001)[OFFSET(501)], 2) AS median_numDomains,
  ROUND(APPROX_QUANTILES(bytesHtml, 1001)[OFFSET(501)] / 1024, 2) AS median_bytesHtml,
  ROUND(APPROX_QUANTILES(bytesJS, 1001)[OFFSET(501)] / 1024, 2) AS median_bytesJS,
  ROUND(APPROX_QUANTILES(bytesCSS, 1001)[OFFSET(501)] / 1024, 2) AS median_bytesCSS,
  ROUND(APPROX_QUANTILES(bytesImg, 1001)[OFFSET(501)] / 1024, 2) AS median_bytesImg,
  ROUND(APPROX_QUANTILES(bytesTotal, 1001)[OFFSET(501)] / 1024, 2) AS median_bytesTotal,
  ROUND(APPROX_QUANTILES(reqHtml, 1001)[OFFSET(501)] , 2) AS median_reqHtml,
  ROUND(APPROX_QUANTILES(reqJS, 1001)[OFFSET(501)] , 2) AS median_reqJS,
  ROUND(APPROX_QUANTILES(reqCSS, 1001)[OFFSET(501)], 2) AS median_reqCSS,
  ROUND(APPROX_QUANTILES(reqImg, 1001)[OFFSET(501)], 2) AS median_reqImg,
  ROUND(APPROX_QUANTILES(reqTotal, 1001)[OFFSET(501)], 2) AS median_reqTotal
FROM
  countries
JOIN
  `httparchive.summary_pages.2019_07_01_*`
ON
  CONCAT(origin, '/') = url
GROUP BY
  client,
  country

**India : % Websites Using JS Frameworks (React, Angular & so on) **

WITH
  countries AS (
  SELECT *, 'in' AS country_code, 'India' AS country FROM `chrome-ux-report.country_in.201907`
)
SELECT
  country,
  COUNT(DISTINCT url)
FROM
  countries
JOIN
  `httparchive.technologies.2019_07_01_mobile`
ON
  CONCAT(origin, '/') = url
WHERE (app = 'React' or app = 'Angular' or app = 'AngularJS' or app = 'Backbone.js' or app = 'Ember.js' or app = 'Vue.js')
GROUP BY
  country

13.75%

[Total 246360 websites in above table]

**World : % Websites Using JS Frameworks (React, Angular & so on) **

WITH
  countries AS (
  SELECT *, 'gl' AS country_code, 'World' AS country FROM `chrome-ux-report.all.201907`
)
SELECT
  country,
  COUNT(DISTINCT url)
FROM
  countries
JOIN
  `httparchive.technologies.2019_07_01_mobile`
ON
  CONCAT(origin, '/') = url
WHERE (app = 'React' or app = 'Angular' or app = 'AngularJS' or app = 'Backbone.js' or app = 'Ember.js' or app = 'Vue.js')
GROUP BY
  country

11.31%

[Total 3983196 websites in above table]

Conclusion

  • Indian audience accesses web through substantially lower capacity mobile devices and inferior network conditions.
  • Websites targeting this audience are as heavy (in terms of # of bytes or # of requests) or heavier (in adoption of JS frameworks) than their global counterparts.

Above mismatch results in a poorer speed experience for the Indian audience reflected in the Web Almanac section linked at the beginning of the post.

Questions

  • Is there a better way to find most commonly used mobile devices (globally or for a geo)?
  • Not very familiar with querying CRUX / http archive - so if you spot an error, please let know.
2 Likes

Thanks for sharing those metrics and info :slight_smile:

My parents use Xiaomi Redmi Note 4 while I am on Redmi Note 7 right now :slight_smile: