FCC providers list

Published

July 25, 2024

Code
source("R/table_with_options.R")

We have multiple sources from FCC to define a provider.

Tip
  • cori.data.fcc is a small R package that contains providers data and is used here

  • Data is downlable using the download button

What does this data look like?

Broadband Data Collection versions:

Code
#|label: read csv
library("cori.data.fcc")

isp <- cori.data.fcc::fcc_provider

FCC provider has 4 341 rows and 5 columns.

Those columns are:

  • Provider.Name: Same than Brand Name?

  • Affiliation: Same number than Provider.ID

Code
op_type <-as.data.frame(table(isp$operation_type, dnn = "Type"), responseName = "Nb." )

knitr::kable(op_type)
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

Code
#|label: display ISP from BDC
table_with_options(isp)

EDA / Analysis

How many unique values do we have per column:

Code
sum_table <-  apply(isp, 2, function(x)length(unique(x))) |>
                    as.data.frame()
names(sum_table) <- c("Count of unique values")

knitr::kable(sum_table)
Count of unique values / columns
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.

What are the Provider Name that are sharing multiple 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.

Code
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)

How FRN are split between Affiliations/Provider.ID?

As expected most of of the relations FRN / provider are one to one (3135) while 387 have more than one FRN.

Code
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)
Affiliation per FRN
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:

Code
dat <- FRN_affiliations.dat[FRN_affiliations.dat[["count_frn"]] > 1 ,]

table_with_options(dat[order(dat[["count_frn"]], decreasing = TRUE), ])

Data set with mail address and phone numbers

This data set is one that is coming from the ACP program.

Code
isp_contact <- read.csv("data/bb-provider_list.csv")
table_with_options(isp_contact)

Footnotes

  1. The Emergency Broadband Benefit is the precursor of the Affordable Connectivity Program, source: https://www.fcc.gov/broadbandbenefit↩︎