Column

Map of LEP and CVALEP Population by Community District

Column

Information about the NYC Community Language Profiles tool

This Language Profiles tool was created by the NYC Civic Engagement Commission and the NYC Mayor’s Office of Data Analytics. The tool provides detailed information about the languages (other than English) that are spoken by 1.7 million city residents across each of New York’s 59 community districts.

 
Community Boards can use the Community Language Profiles tool to refine outreach metrics and more effectively reach constituents who prefer to interact or receive services in a language other than English.


To access, display, and use the map tool on this page, begin by enabling a layer with the layer selector tool in the top right corner of the map pane. This will display tiles based on your selection, each with information that is displayed upon clicking (or tapping) a tile of interest.
 
There are also tables that display the information that is visualized in the map. These tables can be accessed, filtered or sorted, and even downloaded by clicking the headers that contain the word ‘Table’ above this information panel.
 

  • New York City is inhabited by unique and diverse groups across it’s population. Many residents of this city speak more than one language; a number of them speak and understand non-English languages more fluently than English. This affects the way these New Yorkers may engage with their government - both within the voting booth and beyond. This tool looks to explore two specific subsets of this diverse population:

    • NYC residents that have limited English proficiency, or the “LEP” population; as well as
    • NYC residents that are citizens of voting age that have limited English proficiency, or the “CVALEP” population.
       
  • The data describing such NYC residents comes from 5-year American Community Survey (ACS) data (2015 - 2019). For more information on how LEP and CVALEP speakers are defined in the data, please refer to the Glossary tab.
     

  • New York City government bodies are mandated to provide language services in the City’s Local Law 30 eligible languages. However, this is not at the exclusion of other languages present in the City. Under NYC Executive Order 120, New Yorkers have the right to receive information in the language they feel most comfortable speaking regardless of the language spoken. The NYC Community Language Profiles map provides data for all languages spoken in the City by community districts, and aids community boards, non profit groups and other allies to represent the City’s efforts to encourage and facilitate civic participation in local government.
     

Chart: % LEP by Community District

Table: LEP & CVALEP by CD

Table: LEP & CVALEP Languages by CD

Glossary of Terms

Term Description
American Community Survey (ACS) An annual U.S. Census survey that provides social and economic demographic data on communities, including language(s) spoken at home and English proficiency. It is conducted every month, every year, and administered by the U.S. Census Bureau. The ACS is sent to a random sample of addresses in the 50 states, District of Columbia, and Puerto Rico. Data collected includes social, economic, housing and population data. The data is available for the nation, states, counties and other geographic areas down to the block group level. ACS data helps local officials, community leaders, and businesses understand the changes taking place in their communities.
Census tract Census tracts are small, relatively permanent statistical subdivisions of a county, and are defined for the purpose of taking the census.
CVALEP Citizen of voting age with limited English proficiency.
Limited English proficiency (LEP)—as used by ACS (see definition above) A person’s English proficiency as determined by the ACS. The ACS asks three questions to assess languages spoken by each person who lives in the home: whether people speak a language other than English; if yes, which language they speak; and how well they speak English. The question about English proficiency states: “How well does this person speak English?” People can answer “Very well,” “Well,” “Not well” or “Not at all.” LEP is defined as anyone who does not answer “very well.”
Community Boards Community boards are local representative bodies. There are 59 community boards each representing a community district. Community boards have a formal role in the city charter to 1. Improve the delivery of services; 2. Planning and reviewing land use in the community; and 3. Making recommendations on the city’s budget.
Community District Community districts represent New York City’s 59 community boards. Districts range in size and population.
City Council District 51 districts throughout the five boroughs each represented by an elected Council Member.
ZIP Code Tabulation Areas (ZCTAs) ZIP Code Tabulation Areas (ZCTAs) are generalized areal representations of United States Postal Service (USPS) ZIP Code service areas. The USPS ZIP Codes identify the individual post office or metropolitan area delivery station associated with mailing addresses. ZIP Code Tabulation Area (or ZCTA) is a trademark of the U.S. Census Bureau; ZIP Code is a trademark of the U.S. Postal Service.
---
title: "NYC Community Language Profiles"
output: 
  flexdashboard::flex_dashboard:
    vertical_layout: fill
    source_code: embed
    theme: readable
    css: style.css
    self_contained: TRUE
  
---

```{r setup, include=FALSE}

knitr::opts_chunk$set(echo = FALSE)

library(tidyverse)
library(DT)
library(plotly)
library(crosstalk)
library(rgdal)
library(rgeos)
library(leaflet)
library(leaflet.extras)
library(maptools)
library(sf)
library(raster)
library(geosphere)
library(tidyr)
library(rGBAT16AB)
library(geojsonio)

 options(DT.fillContainer = FALSE)
 options(DT.autoHideNavigation = FALSE)
 options(DT.fillContainer = TRUE)
 
```

```{r data}
# Load in Data
tl <- read_csv(paste(Sys.getenv("cec_map"),"data/top_languages0.csv", sep = ""))
tl0 <- read_csv(paste(Sys.getenv("cec_map"),"data/Top_Five_Languages.csv", sep = ""))
tl00 <- read_csv(paste(Sys.getenv("cec_map"),"data/CVALEP_Languages_21.csv", sep = ""))

cecf <- read_csv(paste(Sys.getenv("cec_map"),"data/LEP_ACS_FA1.csv", sep = ""))
cecf$`#` <- NULL

# Load in Shapefiles
cecm <- read_sf(paste(Sys.getenv("cec_map"),"data/Shape Files/cec.shp", sep = ""))

# Create/Join Centroids for Points
centroids <- as.data.frame(st_centroid(cecm))
centroidsf <- centroids %>% 
  separate(geometry, c('long', 'lat'), sep = ",")

centroidsf$long <- as.numeric(gsub("[\\c,(,]", "", centroidsf$long))
centroidsf$lat <- as.numeric(gsub("[\\),]", "", centroidsf$lat))
centroidsf <- centroidsf[, c(1, 2, 3, 5, 4)]

names(cecf)[names(cecf) == "Community District_x"] <- "Community District"
cecf <- cecf[order(cecf$`Borough CD Code`),]
cecf$`% of LEP Population` <- round(cecf$`% of LEP Population`, digits = 1)
cecf$`Community District`<-factor(cecf$`Community District`, levels=c(cecf$`Community District`))

names(tl) <- c("CD Code",
               "District Name",
               "Language",
               "% of LEP Population")

tl <- tl[order(tl$`CD Code`,-tl$`% of LEP Population`),]
tl0 <- tl0[order(tl0$`Borough CD Codes`,-tl0$`% of LEP (Column I/Column J)`),]
tl00 <- tl00[order(tl00$`Borough CD Code`,-tl00$`% of Total CVALEP Population`),]

tl$`% of LEP Population` <- round(tl$`% of LEP Population`, digits = 1)
tl0$`% of LEP (Column I/Column J)` <- round(tl0$`% of LEP (Column I/Column J)`, digits = 1)

tl$`District Name` <- reorder(tl$`District Name`, tl$`CD Code`)
tl0$`Community District` <- reorder(tl0$`Community District`, tl0$`Borough CD Codes`)
tl00$`Community District` <- reorder(tl00$`Community District`, tl00$`Borough CD Code`)

# tl$`District Name`<-factor(tl$`District Name`, levels=c(tl$`District Name`))

# Wrap data in SharedData to use with crosstalk
details <- unique(tl0[c("Borough CD Codes",
                        "Sum of Total LEP Estimate",
                        "CD 2010 Population")])
names(details)[1] <- "Borough CD Code"
tl00 <- merge(x = tl00,
              y = details,
              by = "Borough CD Code",
              all.x = TRUE)
blah <- tl00
blah$`#` <- NULL
blah$Borough <- NULL
blah$`Sum of Total LEP Estimate` <- NULL
blah$`CD 2010 Population` <- NULL
blah$lang_popup <- NULL
blah <- blah[blah$`Total LEP Population Estimate`>0,]

blah[,c(5)] <- format(round(as.numeric(blah[,c(5)]), 1), big.mark=",")
blah[,c(7)] <- format(round(as.numeric(blah[,c(7)]), 1), big.mark=",")

sd <- SharedData$new(blah[,-c(2)])

```

Column {data-width=550}
-------------------------------------
###  **Map of LEP and CVALEP Population by Community District** 
```{r map_prep, include=FALSE}
## Create lookup table: for each CD
# mapping polygons 
cecb <- readOGR(paste(Sys.getenv("cec_map"),"data/Shape Files/cec.shp", sep = ""))
cecb <- cecb[cecb$boro_cd %in% cecf$`Borough CD Code`,] # Removes CDs with sparse populations (parks, cemetaries, airports)

modzcta_sf <- paste(Sys.getenv("cec_map"),"data/Shape Files/Modified Zip Code Tabulation Areas (MODZCTA).geojson", sep = "") %>%
  st_read()

# Fields for: Top 5 languages (concatenated)
tl00$lang_popup <- paste(tl00$Language, ": ",tl00$`% of Total CVALEP Population`,"%", sep=" ")

tl00 <- tl00[order(tl00$`Borough CD Code`, -tl00$`% of Total CVALEP Population`),]
tl00$rank00 <- ave(-tl00$`Total CVALEP Population Estimate`, tl00$`Community District`, FUN = rank)

lang <- tl00
tl00$rank00 <- NULL

lang <- lang[lang$rank00 <=5,]
lang <- unique(lang[c("Borough CD Code", "lang_popup")])
lang$`Borough CD Code` <- as.character(lang$`Borough CD Code`)
lang$lang_popup <- as.character(lang$lang_popup)

end <- data.frame()
for (i in unique(lang$`Borough CD Code`)){
  
  t <- lang[lang$`Borough CD Code`==i,]
  t <- paste(t$lang_popup, collapse = "
") v <- c(as.character(i), as.character(t)) end <- rbind(end, v) end[,1] <- as.character(end[,1]) end[,2] <- as.character(end[,2]) } names(end)[1] <- 'boro_cd' names(end)[2] <- 'Languages' cecf0 <- cecf names(cecf0)[7] <- "% of Population that is LEP" cecz <- merge(x = cecb, y = cecf0, by.x = "boro_cd", by.y = "Borough CD Code", all.x = TRUE) cecz <- merge(x = cecz, y = end, by = "boro_cd", all.x = TRUE) cecz$shape_area <- NULL cecz$shape_leng <- NULL names(cecz)[1] <- "CD Code" cecz@data[,c(5)] <- format(round(as.numeric(cecz@data[,c(5)]), 1), big.mark=",") cecz@data[,c(6)] <- format(round(as.numeric(cecz@data[,c(6)]), 1), big.mark=",") cecz@data[,c(8)] <- format(round(as.numeric(cecz@data[,c(8)]), 1), big.mark=",") cecf0 <- cecf0[c("Borough CD Code", "Community District", "Community District Name", "CD 2010 Population", "Total LEP Population Estimate", "% of Population that is LEP", "Total CVALEP Population Estimate", "% of Population that is CVALEP")] cecf0 <- data.frame(cecf0) names(cecf0) <- c("Borough CD Code", "Community District", "Community District Name", "CD 2010 Population", "Total LEP Population Estimate", "% of Population that is LEP", "Total CVALEP Population Estimate", "% of Population that is CVALEP") ## Load in CEC Poll Sites data load(file = paste(Sys.getenv("cec_map"), "data/Poll_Sites_Geo.Rda", sep = "")) ## Load in ALL Poll Sites data early <- read.csv(paste(Sys.getenv("cec_map"), "data/PollSites/EV_AllSites_Nov2020.csv", sep = ""), header = T) elect <- read.csv(paste(Sys.getenv("cec_map"), "data/PollSites/ED_AllSites_Nov2020.csv", sep = ""), header = T) early$EarlyVotingFlag <- 'Yes' elect$EarlyVotingFlag <- 'No' all_polls <- rbind(early,elect) all_polls0 <- rGBAT16AB::GBAT.zip_code(all_polls, "Site.Name", "Site.Address", "Zip.Code") all_polls$Latitude <- all_polls0$F1A_Latitude all_polls$Longitude <- all_polls0$F1A_Longitude all_polls$BIN <- all_polls0$F1A_BinOfInputAddress all_polls$Latitude <- as.numeric(all_polls$Latitude) all_polls$Longitude <- as.numeric(all_polls$Longitude) # Load in ED, City Council Shapefiles ed_sf <- read_sf(paste(Sys.getenv("cec_map"), "data/Shape Files/ElectionDistricts/geo_export_eec1d155-e38d-4c3e-85e6-9f606199d53d.shp", sep = "")) # Let's read NYCC dists with the geojsonio library: cc_sf <- geojson_read(paste(Sys.getenv("cec_map"), "data/cc_sf0.geojson", sep = ""), what = "sp") cc_sf <- spTransform(cc_sf, CRS('+proj=longlat +datum=WGS84')) ``` ```{r map, fig.alt = "An interactive Map of NYC Community Districts that shades the ground area of each district based on the percentage of the population that is limited in English profieciency as well as a citizen of voting age."} pal <- colorNumeric( palette = "Blues", domain = cecz$`% of Population that is CVALEP`) pal1 <- colorNumeric( palette = "Greens", domain = cecz$`% of Population that is LEP`) pal0 <- colorFactor(c("navy", "red"), domain = c("Early Voting", "Election Day")) cecf0 %>% leaflet() %>% addProviderTiles("CartoDB") %>% setView(lat = 40.730610, lng = -73.935242, zoom = 11) %>% addMapPane("layer0",zIndex=430) %>% addMapPane("layer1", zIndex=420) %>% addMapPane("layer2",zIndex=410) %>% addMapPane("layer3",zIndex=400) %>% addMapPane("layer4",zIndex=380) %>% addMapPane("layer5",zIndex=360) %>% addPolygons(data = cecz, fillColor = ~pal(cecz$`% of Population that is CVALEP`), color = "#444444", # you need to use hex colors weight = 1, smoothFactor = .5, options = pathOptions(pane = "layer2"), fillOpacity = .5, highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE), #dashArray = "3", group = "Percent CVALEP by CD", label = ~paste0(cecz$`Community District`, ": ", cecz$`Community District Name`), popup = ~paste0(cecz$`Community District Name`, "
", cecz$`Community District`, "
", "
", "% LEP: ",cecz$`% of Population that is LEP`, "%", "
", "% CVALEP: ",cecz$`% of Population that is CVALEP`, "%", "
", "2010 Total Population: ",cecz$`CD 2010 Population`, "
", "
", "
", "Top 5 CVALEP Languages: ","
", cecz$Languages)) %>% addPolygons(data = cecz, fillColor = ~pal1(cecz$`% of Population that is LEP`), color = "#444444", # you need to use hex colors weight = 1, smoothFactor = .5, options = pathOptions(pane = "layer3"), fillOpacity = .5, highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE), #dashArray = "3", group = "Percent LEP by CD", label = ~paste0(cecz$`Community District`, ": ", cecz$`Community District Name`), popup = ~paste0(cecz$`Community District Name`, "
", cecz$`Community District`, "
", "
", "% LEP: ",cecz$`% of Population that is LEP`, "%", "
", "% CVALEP: ",cecz$`% of Population that is CVALEP`, "%", "
", "2010 Total Population: ",cecz$`CD 2010 Population`, "
", "
", "
", "Top 5 LEP Languages: ","
", cecz$Languages)) %>% addPolygons(data = cc_sf, fillColor = "white", color = "#000000", # you need to use hex colors weight = 2, options = pathOptions(pane = "layer4"), fillOpacity = .15, group = "City Council Districts", popup = ~paste0("Council District ", cc_sf$CounDist)) %>% addPolygons(data = modzcta_sf, fillColor = "white", color = "#000000", # you need to use hex colors weight = 2, options = pathOptions(pane = "layer4"), fillOpacity = .15, group = "Zip Code Tabulation Area", popup = ~paste0("Zip Code Tabulation Area: ", modzcta_sf$label, "
", "Population Estimate (2010): ", modzcta_sf$pop_est)) %>% addLegend(pal = pal, labFormat = labelFormat(suffix = " %"), values = cecz$`% of Population that is CVALEP`, position = "bottomright", title = paste0("CVALEP Population (%)"), group = "Percent CVALEP by CD") %>% addLegend(pal = pal1, values = cecz$`% of Population that is LEP`, position = "bottomleft", title = "LEP Population (%)", group = "Percent LEP by CD") %>% addLayersControl(overlayGroups = c("Percent LEP by CD", "Percent CVALEP by CD", "City Council Districts", "Zip Code Tabulation Area")) %>% hideGroup(c("Percent LEP by CD", "Percent CVALEP by CD", "City Council Districts", "Zip Code Tabulation Area")) ``` Column {data-width=450 .tabset} ------------------------------------- ### **Information about the _NYC Community Language Profiles_ tool** This Language Profiles tool was created by the [NYC Civic Engagement Commission](https://www1.nyc.gov/site/civicengagement/index.page) and the [NYC Mayor’s Office of Data Analytics](https://www1.nyc.gov/site/analytics/index.page). The tool provides detailed information about the languages (other than English) that are spoken by 1.7 million city residents across each of New York's 59 community districts.   Community Boards can use the Community Language Profiles tool to refine outreach metrics and more effectively reach constituents who prefer to interact or receive services in a language other than English. *** > _To access, display, and use the map tool on this page, begin by enabling a layer with the layer selector tool in the top right corner of the map pane. This will display tiles based on your selection, each with information that is displayed upon clicking (or tapping) a tile of interest._   > _There are also tables that display the information that is visualized in the map. These tables can be accessed, filtered or sorted, and even downloaded by clicking the headers that contain the word 'Table' above this information panel._   * New York City is inhabited by unique and diverse groups across it's population. Many residents of this city speak more than one language; a number of them speak and understand non-English languages more fluently than English. This affects the way these New Yorkers may engage with their government - both within the voting booth and beyond. This tool looks to explore two specific subsets of this diverse population: - NYC residents that have limited English proficiency, or the "LEP" population; as well as - NYC residents that are citizens of voting age that have limited English proficiency, or the "CVALEP" population.   * The data describing such NYC residents comes from 5-year [American Community Survey (ACS)](https://www.census.gov/programs-surveys/acs/microdata/access.html) data (2015 - 2019). For more information on how LEP and CVALEP speakers are defined in the data, please refer to the Glossary tab.   * New York City government bodies are mandated to provide language services in the City’s Local Law 30 eligible languages. However, this is not at the exclusion of other languages present in the City. Under NYC Executive Order 120, New Yorkers have the right to receive information in the language they feel most comfortable speaking regardless of the language spoken. The NYC Community Language Profiles map provides data for all languages spoken in the City by community districts, and aids community boards, non profit groups and other allies to represent the City’s efforts to encourage and facilitate civic participation in local government.   ### **Chart: % LEP by Community District** ```{r plot, fig.alt = "An Interactive, Horizontal Bar Chart that compares each district based on the percentage of the population that is limited in English profieciency based on Census data."} plot_ly(data = cecz@data, y = ~paste(`Community District Name`, " ",sep=""), x = ~`% of Population that is LEP`, type = 'bar', orientation = 'h') %>% config(displayModeBar = F) %>% layout(title = "% of Population that is Limited in English Proficiency (2019 5-year ACS)", margin = list(l=50, r=50, b=50, t=50, pad=0), yaxis = list(title = "", categoryorder = "total ascending", categoryarray = ~`% of Population that is LEP`, dtick = 1, htick = 1, pad = 20), xaxis = list(title = "% of Total Population") ) ``` ### **Table: LEP & CVALEP by CD** ```{r, fig.alt = "A table that describes each of New York's Community Districts - including information on the population based on the 2010 Census as well as the number of residents that are limited in English proficiency or citizens of voting age."} cecf0[,c(4)] <- format(round((cecf0[,c(4)]), 1), big.mark=",") cecf0[,c(5)] <- format(round((cecf0[,c(5)]), 1), big.mark=",") cecf0[,c(7)] <- format(round((cecf0[,c(7)]), 1), big.mark=",") names(cecf0)[3] <- "Community District Name" names(cecf0)[1] <- "Borough CD Code" datatable( cecf0[,-2], extensions = c('Scroller','Buttons'), rownames = NULL, fillContainer = TRUE, options = list( deferRender = TRUE, scrollY = 300, scroller = TRUE, dom = 'Blfrtip', buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), lengthMenu = list(c(10,25,50,-1), c(10,25,50,"All")) ) ) ``` ### **Table: LEP & CVALEP Languages by CD** ```{r, fig.alt = "A table that describes each of the languages, including how many residents are estimated to speak a given language, that are spoken within each Community District of New York City."} datatable( sd, rownames = NULL, extensions = c('Scroller','Buttons'), fillContainer = TRUE, options = list( deferRender = FALSE, scrollY = 300, scroller = TRUE, dom = 'Blfrtip', buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), lengthMenu = list(c(10,25,50,-1), c(10,25,50,"All")) ) ) ``` ### **Glossary of Terms** | Term | Description | | ----------- | ----------- | | American Community Survey (ACS) | An annual U.S. Census survey that provides social and economic demographic data on communities, including language(s) spoken at home and English proficiency. It is conducted every month, every year, and administered by the U.S. Census Bureau. The ACS is sent to a random sample of addresses in the 50 states, District of Columbia, and Puerto Rico. Data collected includes social, economic, housing and population data. The data is available for the nation, states, counties and other geographic areas down to the block group level. ACS data helps local officials, community leaders, and businesses understand the changes taking place in their communities. | | Census tract | Census tracts are small, relatively permanent statistical subdivisions of a county, and are defined for the purpose of taking the census. | | CVALEP | Citizen of voting age with limited English proficiency. | | Limited English proficiency (LEP)—as used by ACS (see definition above) | A person’s English proficiency as determined by the ACS. The ACS asks three questions to assess languages spoken by each person who lives in the home: whether people speak a language other than English; if yes, which language they speak; and how well they speak English. The question about English proficiency states: “How well does this person speak English?” People can answer “Very well,” “Well,” “Not well” or “Not at all.” LEP is defined as anyone who does not answer “very well.” | | Community Boards | Community boards are local representative bodies. There are 59 community boards each representing a community district. Community boards have a formal role in the city charter to 1. Improve the delivery of services; 2. Planning and reviewing land use in the community; and 3. Making recommendations on the city’s budget. | | Community District | Community districts represent New York City’s 59 community boards. Districts range in size and population. | | City Council District | 51 districts throughout the five boroughs each represented by an elected Council Member. | |ZIP Code Tabulation Areas (ZCTAs) | ZIP Code Tabulation Areas (ZCTAs) are generalized areal representations of United States Postal Service (USPS) ZIP Code service areas. The USPS ZIP Codes identify the individual post office or metropolitan area delivery station associated with mailing addresses. ZIP Code Tabulation Area (or ZCTA) is a trademark of the U.S. Census Bureau; ZIP Code is a trademark of the U.S. Postal Service.|