Code
source("R/table_with_options.R")April 28, 2025
We have multiple sources from FCC to define a provider.
Two are coming from the Broadband Data Collection:
The first one from FCC, accessed the 26-04-2024
The second is comming from our pipelines of NBM (June 2023 release)
One is comming from the Emergency Broadband Benefit1 and can be downloaded here (accessed the 26-04-2024)
cori.data.fcc is a small R package that contains providers data and is used here
Data is downlable using the download button
FCC provider has 4 341 rows and 5 columns.
Those columns are:
Provider.Name: Same than Brand Name?
Affiliation: Same number than Provider.ID
| Type | Nb. |
|---|---|
| ILEC | 972 |
| Non-ILEC | 3484 |
Operation.Type: Only two options “ILEC” or “Non-ILEC”
FRN: FCC Registration Number; “number of the entity that submited the data”. It is supposed to be a string of 10 characters (with padding 0). Slighly more number than Provider.Name and seems to be the primary key.
Provider.ID: An ID for Affiliations
| Count of unique values | |
|---|---|
| provider_name | 4435 |
| affiliation | 3619 |
| operation_type | 2 |
| frn | 4456 |
| provider_id | 3619 |
We can confirm that:
FRN here is unique for every row in this data set (our primary key)
We have a bit less Provider.Name (4321 / 4341) than FRN
We have the same number of Affiliations and Provider.ID
The number of Provider.ID/Affiliations is smaller than FRN.
A quick check indicate that all Provider.ID are 6 characters. FRN is also always 10 characters.
Hence the one with 7 characters in FCC NBM is probably an error.
FRN:We probably have cases where companies have same name (“Farmers Mutual Telephone company”) but we have probably company that have multiple FRN (“Grand Mound Cooperative Telephone Association”). Granted the low numbers I think we are fair to assume it does not matter to much.
provider.name_by_FRN <- sapply(split(isp$frn, isp$provider_name), function(x) unique(x))
multiple.frn <- provider.name_by_FRN[lengths(provider.name_by_FRN)> 1]
provider.name_by_FRN.dat <- data.frame(provider_name = names(multiple.frn),
FRN = sapply(multiple.frn, toString)
)
table_with_options(provider.name_by_FRN.dat)Affiliations/Provider.ID?As expected most of of the relations FRN / provider are one to one (3135) while 387 have more than one FRN.
get_me_FRN_affiliations <- function(isp) {
FRN_by_affiliations <- sapply(split(isp[["frn"]], isp[["affiliation"]]),
function(x) length(unique(x)))
FRN_by_affiliations.dat <- data.frame(Affiliations = names(FRN_by_affiliations),
count_frn = FRN_by_affiliations)
return(FRN_by_affiliations.dat)
}
FRN_affiliations.dat <- get_me_FRN_affiliations(isp)
cnt_affiliation <- as.data.frame(table(FRN_affiliations.dat$count_frn),
responseName = "")
cnt_affiliation[["Num. of Affiliations / FRN"]] <-
ifelse(as.numeric(cnt_affiliation[[1]]) < 10, cnt_affiliation[[1]], "10+")
cnt_affiliation <- aggregate(cnt_affiliation[[2]],
list(cnt_affiliation[["Num. of Affiliations / FRN"]]),
sum)
names(cnt_affiliation) <- c("Number of Affiliations / FRN", "Count")
knitr::kable(cnt_affiliation[c(1, 3:9, 2 ),], row.names = FALSE)| Number of Affiliations / FRN | Count |
|---|---|
| 1 | 3226 |
| 2 | 259 |
| 3 | 66 |
| 4 | 29 |
| 5 | 8 |
| 6 | 8 |
| 7 | 3 |
| 8 | 2 |
| 10+ | 15 |
You can explore those 387 affiliations here:
This data set is one that is coming from the ACP program.
The Emergency Broadband Benefit is the precursor of the Affordable Connectivity Program, source: https://www.fcc.gov/broadbandbenefit↩︎