Measuring & Monitoring Internet Speed in R
R-bloggers Measuring & Monitoring Internet Speed in R
library(speedtest)
library(stringi)
library(hrbrthemes)
library(ggbeeswarm)
Loading required package: ggplot2
library(tidyverse)
[30m── [1mAttaching packages[22m ─────────────────────────── tidyverse 1.2.0 ──[39m
[30m[32m✔[30m [34mtibble [30m 1.4.1 [32m✔[30m [34mpurrr [30m 0.2.4
[32m✔[30m [34mtidyr [30m 0.7.2 [32m✔[30m [34mdplyr [30m 0.7.4
[32m✔[30m [34mreadr [30m 1.1.1 [32m✔[30m [34mstringr[30m 1.2.0
[32m✔[30m [34mtibble [30m 1.4.1 [32m✔[30m [34mforcats[30m 0.2.0[39m
[30m── [1mConflicts[22m ────────────────────────────── tidyverse_conflicts() ──
[31m✖[30m [34mdplyr[30m::[32mfilter()[30m masks [34mstats[30m::filter()
[31m✖[30m [34mdplyr[30m::[32mlag()[30m masks [34mstats[30m::lag()[39m
config <- spd_config()
servers <- spd_servers(config=config)
closest_servers <- spd_closest_servers(servers, config=config)
only_the_best_severs <- spd_best_servers(closest_servers, config)
glimpse(spd_download_test(closest_servers[1,], config=config))
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================ | 40% ~1 s remaining
|===================== | 50% ~1 s remaining
|========================= | 60% ~1 s remaining
|============================= | 70% ~1 s remaining
|================================= | 80% ~1 s remaining
|===================================== | 90% ~1 s remaining
|==========================================|100% ~0 s remaining Observations: 1
Variables: 15
$ url <chr> "http://speedtest.tekify.com/speedtest/upload.php"
$ lat <dbl> 37.5483
$ lng <dbl> -121.9886
$ name <chr> "Fremont, CA"
$ country <chr> "United States"
$ cc <chr> "US"
$ sponsor <chr> "Tekify Broadband Internet Services"
$ id <chr> "6468"
$ host <chr> "speedtest.tekify.com:8080"
$ url2 <chr> "http://speedtest.tekify.com/speedtest2/upload....
$ min <dbl> 16.28029
$ mean <dbl> 58.79093
$ median <dbl> 55.71502
$ max <dbl> 103.3104
$ sd <dbl> 30.87936
glimpse(spd_upload_test(only_the_best_severs[1,], config=config))
|============== | 33% ~0 s remaining
|===================== | 50% ~0 s remaining
|============================ | 67% ~0 s remaining
|=================================== | 83% ~0 s remaining
|==========================================|100% ~0 s remaining Observations: 1
Variables: 17
$ total_time <dbl> 0.072741
$ retrieval_time <dbl> 3.2e-05
$ url <chr> "http://speedtest-pa.singnet.com.sg/spee...
$ lat <dbl> 37.4419
$ lng <dbl> -122.1419
$ name <chr> "Palo Alto, CA"
$ country <chr> "United States"
$ cc <chr> "US"
$ sponsor <chr> "SingTel"
$ id <chr> "2761"
$ host <chr> "speedtest-pa.singnet.com.sg:8080"
$ url2 <chr> "http://speedtest-pa2.singnet.com.sg/spe...
$ min <dbl> 11.6966
$ mean <dbl> 12.68652
$ median <dbl> 12.23808
$ max <dbl> 14.36649
$ sd <dbl> 1.132289
set.seed(8675309)
bind_rows(
closest_servers[1:3,] %>%
mutate(type="closest"),
only_the_best_severs[1:3,] %>%
mutate(type="best"),
filter(servers, !(id %in% c(closest_servers[1:3,]$id, only_the_best_severs[1:3,]$id))) %>%
sample_n(3) %>%
mutate(type="random")
) %>%
group_by(type) %>%
ungroup() -> to_compare
select(to_compare, sponsor, name, country, host, type)
map_df(1:nrow(to_compare), ~{
spd_download_test(to_compare[.x,], config=config, summarise=FALSE, timeout=30)
}) -> dl_results_full
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~1 s remaining
|===================== | 50% ~1 s remaining
|========================= | 60% ~1 s remaining
|============================== | 70% ~1 s remaining
|================================== | 80% ~1 s remaining
|====================================== | 90% ~1 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~1 s remaining
|===================== | 50% ~0 s remaining
|========================= | 60% ~0 s remaining
|============================== | 70% ~0 s remaining
|================================== | 80% ~1 s remaining
|====================================== | 90% ~1 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~1 s remaining
|===================== | 50% ~1 s remaining
|========================= | 60% ~1 s remaining
|============================== | 70% ~1 s remaining
|================================== | 80% ~1 s remaining
|====================================== | 90% ~0 s remaining
|===========================================|100% ~0 s remaining
|============ | 30% ~0 s remaining
|================= | 40% ~0 s remaining
|===================== | 50% ~0 s remaining
|========================= | 60% ~0 s remaining
|============================== | 70% ~0 s remaining
|================================== | 80% ~0 s remaining
|====================================== | 90% ~0 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~1 s remaining
|===================== | 50% ~1 s remaining
|========================= | 60% ~1 s remaining
|============================== | 70% ~1 s remaining
|================================== | 80% ~1 s remaining
|====================================== | 90% ~0 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~1 s remaining
|===================== | 50% ~1 s remaining
|========================= | 60% ~1 s remaining
|============================== | 70% ~1 s remaining
|================================== | 80% ~1 s remaining
|====================================== | 90% ~0 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~7 s remaining
|============ | 30% ~5 s remaining
|================= | 40% ~4 s remaining
|===================== | 50% ~3 s remaining
|========================= | 60% ~2 s remaining
|============================== | 70% ~2 s remaining
|================================== | 80% ~2 s remaining
|====================================== | 90% ~1 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~1 s remaining
|============ | 30% ~1 s remaining
|================= | 40% ~0 s remaining
|===================== | 50% ~0 s remaining
|========================= | 60% ~0 s remaining
|============================== | 70% ~0 s remaining
|================================== | 80% ~0 s remaining
|====================================== | 90% ~0 s remaining
|===========================================|100% ~0 s remaining
|======== | 20% ~16 s remaining
|============ | 30% ~25 s remaining
|================= | 40% ~34 s remaining
|===================== | 50% ~28 s remaining
|========================= | 60% ~24 s remaining
|============================== | 70% ~28 s remaining
|================================== | 80% ~24 s remaining
|====================================== | 90% ~13 s remaining
|===========================================|100% ~0 s remaining
mutate(dl_results_full, type=stri_trans_totitle(type)) %>%
ggplot(aes(type, bw, fill=type)) +
geom_quasirandom(aes(size=size, color=type), width=0.15, shape=21, stroke=0.25) +
scale_y_continuous(expand=c(0,5), labels=c(sprintf("%s", seq(0,150,50)), "200 Mb/s"), limits=c(0,200)) +
scale_size(range=c(2,6)) +
scale_color_manual(values=c(Random="#b2b2b2", Best="#2b2b2b", Closest="#2b2b2b")) +
scale_fill_ipsum() +
labs(x=NULL, y=NULL, title="Download bandwidth test by selected server type",
subtitle="Circle size scaled by size of file used in that speed test") +
theme_ipsum_rc(grid="Y") +
theme(legend.position="none")
bind_rows(
closest_servers[1:3,] %>% mutate(type="closest"),
only_the_best_severs[1:3,] %>% mutate(type="best")
) %>%
distinct(.keep_all=TRUE) -> to_compare
select(to_compare, sponsor, name, country, host, type)
map_df(1:nrow(to_compare), ~{
spd_upload_test(to_compare[.x,], config=config, summarise=FALSE, timeout=30)
}) -> ul_results_full
|============== | 33% ~0 s remaining
|===================== | 50% ~0 s remaining
|============================ | 67% ~0 s remaining
|=================================== | 83% ~0 s remaining
|===========================================|100% ~0 s remaining
|============== | 33% ~1 s remaining
|===================== | 50% ~1 s remaining
|============================ | 67% ~1 s remaining
|=================================== | 83% ~0 s remaining
|===========================================|100% ~0 s remaining
|============== | 33% ~1 s remaining
|===================== | 50% ~1 s remaining
|============================ | 67% ~1 s remaining
|=================================== | 83% ~1 s remaining
|===========================================|100% ~0 s remaining
|============== | 33% ~0 s remaining
|===================== | 50% ~0 s remaining
|============================ | 67% ~0 s remaining
|=================================== | 83% ~0 s remaining
|===========================================|100% ~0 s remaining
|============== | 33% ~0 s remaining
|===================== | 50% ~0 s remaining
|============================ | 67% ~0 s remaining
|=================================== | 83% ~0 s remaining
|===========================================|100% ~0 s remaining
|============== | 33% ~0 s remaining
|===================== | 50% ~0 s remaining
|============================ | 67% ~0 s remaining
|=================================== | 83% ~0 s remaining
|===========================================|100% ~0 s remaining
ggplot(ul_results_full, aes(x="Upload Test", y=bw)) +
geom_quasirandom(aes(size=size, fill="col"), width=0.1, shape=21, stroke=0.25, color="#2b2b2b") +
scale_y_continuous(expand=c(0,0.5), breaks=seq(0,16,4),
labels=c(sprintf("%s", seq(0,12,4)), "16 Mb/s"), limits=c(0,16)) +
scale_size(range=c(2,6)) +
scale_fill_ipsum() +
labs(x=NULL, y=NULL, title="Upload bandwidth test by selected server type",
subtitle="Circle size scaled by size of file used in that speed test") +
theme_ipsum_rc(grid="Y") +
theme(legend.position="none")