Politics

30 Zip Codes with the Fewest People Per Square Mile πŸ“¨

30 Zip Codes with the Fewest People Per Square Mile πŸ“¨

1HamiltonHoffmeister 13353
2HamiltonPiseco 12139
3St. LawrenceChildwold 12922
4HamiltonLong Lake 12847
5EssexNorth Hudson 12855
6HamiltonRaquette Lake 13436
7HerkimerEagle Bay 13331
8UlsterClaryville 12725
9HamiltonInlet 13360
10St. LawrenceCranberry Lake 12927
11HamiltonBlue Mountain Lake 12812
12HamiltonLake Pleasant 12108
13St. LawrenceSouth Colton 13687
14EssexNewcomb 12852
15WarrenNorth River 12856
16EssexSaint Huberts 12943
17EssexMinerva 12851
18GreeneWest Kill 12492
19HerkimerOld Forge 13420
20OswegoRedfield 13437
21HamiltonIndian Lake 12842
22FranklinOwls Head 12969
23EssexNew Russia 12964
24OneidaForestport 13338
25HamiltonWells 12190
26FranklinSaint Regis Falls 12980
27St. LawrenceParishville 13672
28LewisGlenfield 13312
29St. LawrenceOswegatchie 13670
30St. LawrenceDegrasse 13684

The Great Replacement

The Great Replacement

I’ve been thinking a lot about the theory of the Great Replacement that has been in the news a lot lately. The theory basically suggests that’s Democrats are encouraging a lot of immigrants, especially undocumented immigrants, to move in an effort to tilt elections in their favor. But immigrants are hardly a monolithic voting block – as they come from all over the world with different political cultures.

Immigrants often are incredibly hard working, as often they come from places where life is more difficult then the life in laid-back America. As such, many immigrants go into business, and many business people are conservative, if not right-wing reactionaries. Many immigrants are fleeing socialist countries and dictatorships, and the last thing they want is an overbearing government to greet them in America. Most immigrants, while retaining their unique cultures, also want to integrate as quickly as possible into American culture. By a generation, few immigrants are much different then generations who have lived here for many generations.

I have my doubts that Republican Party is in much danger of becoming a long-term minority party. Republicans control 28 governorship’s in America, including 23 states where Republicans control all branches of government. The Supreme Court has an increasingly conservative majority, adjudicating laws in ways that favor more restrictions on abortion and less restrictions on gun ownership. With people unhappy with inflation and the COVID, the Democrats who control the White House and Congress are likely to get to voted out. Congress may be fully in Republican hands come 2023. In a few years, things will likely pivot back and forth again.

If anything, politics is healthy in America. Parties are and remain very competitive. New voices are always good, as are new perspectives, but I don’t think we should fear drastic change, as our country is diverse, and power is spread out. Immigrants aren’t a unified group, and they add perspectives but do not detract from our values as Americans.

Here is the R script I am using for creating the maps and graphs of ADP for the State Senate and Congressional Districts

Here is the R script I am using for creating the maps and graphs of ADP for the State Senate and Congressional Districts. It should be interesting to see how it compares to the maps released by the special master. You can get the data here.

library(tidyverse)
library(tigris)
library(ggtext)
library(sf)

rm(list=ls())

# load latfor data, VTD level data is okay for larger districts
# although latfor also provides block level data which is better as
# those centroids should always be inside the district you are comparing
vt20 <- read_csv(‘2020vote_vtd.csv’)
vt20$GEOID <- as.character(vt20$GEOID)

# edADP – This code has to be as efficient as possible, as
# it can not be vectorized, due to the need to check to see
# if a race is competitive before including. We also don’t want
# to search for columns here, due to the CPU time cost over thousands
# of rows, each time searched.
edADP <- function(ed, demcols) {
 
  # making sure everything is numeric helps with speed
  ed <- ed %>% as.numeric
 
  # store a total of dems, rep, ballot votes
  dem <- 0; rep <- 0; ballot <- 0;
 
  # use democratic columns as an index for all other columns
  for (pos in demcols) {
    
    # if either Democratic or Republican line is 0, then that
    # multiplies out to zero as x * 0 = 0. Then negate and skip to next race
    if (!(ed[pos] *  ed[pos+1])) next;
    
    # to minimize costs, we just use row positions based on positition relative to
    # democratic rows
    dem <- dem + ed[pos]
    rep <- rep + ed[pos+1]   
    ballot <- ballot + ed[pos-1] – ed[pos+6]
  }
 
  # return the vote totals for all competitive races to bind to the main table
  return (c(‘dem’=dem, ‘rep’=rep, ‘ballot’=ballot))
}

dfADP <- function(df, yr=18) {
  # find position of dem cols before starting to minimize CPU costs when
  # doing the row-by-row math with apply
  demcols <- c()
 
  i <- 1
  for (dfcols in colnames(df)) {
    if (substr(dfcols, 1, 5) == str_c(‘DEM’,yr)) demcols <- append(demcols, i)
    i <- i+1
  }
 
  # Calculate ADP, row by row then bind to the dataframe
  return(cbind(df,df %>% apply(1, edADP, demcols) %>% t))
}

# calculate ADP from VT20 data
adp <- vt20 %>% dfADP(18)

# join the VTD data to voting districts
vtd <- voting_districts(‘ny’, cb=T) %>%
  inner_join(adp, by=c(‘GEOID20’=’GEOID’)) %>%
  st_transform(‘epsg:3857’)

# load the shapefile want to join the VTDs against
a22 <- read_sf(‘/home/andy/Documents/GIS.Data/2022-districts/Congress22.shp’) %>% st_transform(‘epsg:3857’)

name <- ‘Congress’

# for reasons of speed, convert VTDs to centroids, then join against
# the new districts
join <- vtd %>% st_centroid() %>%
  st_join(a22)

# calculate the ADP by dividing democratic votes in all competitive races against
# democrats and republican. Add column for coloring
join %>% st_drop_geometry() %>% group_by(DISTRICT) %>%
  summarise(ADP = (sum(dem)/sum(dem+rep))*100,
            color=ifelse(ADP > 60, ‘Democratic (>60%)’,
                         ifelse(ADP > 50, ‘Lean Democratic (>50%)’,
                                ifelse(ADP > 40, ‘Lean Republican (>40%)’, ‘Republican (<40%)’)))
            ) %>% drop_na() %>%
  ggplot(aes(DISTRICT, ADP, fill=color)) + geom_col(alpha=0.8) +
  geom_hline(yintercept = 50) +
  scale_fill_manual(values=c(‘blue’,’LightSkyBlue’,’Pink’,’Red’)) +
  scale_x_continuous(breaks=seq(1,64,1)) +
  scale_y_continuous(limits = c(0,100), breaks=seq(0,100,10)) +
  theme_minimal() +
  coord_cartesian(expand=F) +
  labs(
    title = str_c(‘<span style=”color: red;”>2018 Average</span> <span style=”color: blue;”>Democratic Performance</span> – ‘,name,’ \’22’),
    y = “2018 ADP (All races with Dem. and Rep. candidates)”,
    x = “”,
    caption=’Data Source: LATFOR VTDs’,
    tag=paste(‘Andy Arthur,’, format(Sys.Date(), format=”%-m/%-d/%y”)),
    fill = “”) +
  theme(
    text=element_text(family=’Open Sans’,size=14),
    plot.title=element_textbox( hjust=0.5, face=’bold’,size=34),
    axis.text = element_text(size=12),
    plot.background = element_rect(fill = “white”, color=”white”),
    plot.tag=element_text(size=10,hjust=0, color=’#555555′),
    plot.caption=element_text(size=10, color=’#555555′),
    plot.margin = unit(c(1,1,1,1), ‘lines’),
    plot.tag.position = c(0.0,0.01),
    legend.key.width = unit(4,’cm’),
    legend.key.height = unit(0.2,’cm’),
    legend.position = ‘top’
  )

fn <- str_c(’22-‘,name,’-graph’)
ggsave(paste(‘/tmp/’,fn,’.jpg’,sep=”), width=1920, height=1200, units=’px’, dpi=120)
ggsave(paste(‘/tmp/’,fn,’.svg’,sep=”), width=1920, height=1200, units=’px’, dpi=130, device = grDevices::svg)

# calculate the ADP by dividing democratic votes in all competitive races against
# democrats and republican. Add column for coloring
join %>% st_drop_geometry() %>% group_by(DISTRICT) %>%
  summarise(ADP = (sum(dem)/sum(dem+rep))*100,
            color=ifelse(ADP > 60, ‘Democratic (>60%)’,
            ifelse(ADP > 50, ‘Lean Democratic (>50%)’,
            ifelse(ADP > 40, ‘Lean Republican (>40%)’, ‘Republican (<40%)’))))  %>%
  drop_na() %>%
  inner_join(a22, by=(‘DISTRICT’)) %>%
  ggplot(aes(geometry=geometry, fill=color)) + geom_sf(size=0.5) +
  scale_fill_manual(values=c(‘blue’,’LightSkyBlue’,’Pink’,’Red’)) +
  theme_void() +
  coord_sf(expand=F) +
  labs(
    title = str_c(‘<span style=”color: red;”>2018 Average</span> <span style=”color: blue;”>Democratic Performance</span> – ‘,name,’ \’22’),
    caption=’Data Source: LATFOR VTDs’,
    tag=paste(‘Andy Arthur,’, format(Sys.Date(), format=”%-m/%-d/%y”)),
    fill = “”) +
  theme(
    text=element_text(family=’Open Sans’,size=14),
    plot.title=element_textbox( hjust=0.5, face=’bold’,size=34, margin=unit(c(0,0,1,0),’pt’)),
    plot.background = element_rect(fill = “white”, color=”white”),
    plot.tag=element_text(size=10,hjust=0, color=’#555555′),
    plot.caption=element_text(size=10, color=’#555555′),
    plot.margin = unit(c(1,1,1,1), ‘lines’),
    plot.tag.position = c(0.0,0.01),
    legend.key.width = unit(4,’cm’),
    legend.key.height = unit(.6,’cm’),
    legend.position = ‘top’
  )

fn <- str_c(’22-‘,name,’-map’)
ggsave(paste(‘/tmp/’,fn,’.jpg’,sep=”), width=1920, height=1200, units=’px’, dpi=120)
ggsave(paste(‘/tmp/’,fn,’.svg’,sep=”), width=1920, height=1200, units=’px’, dpi=130, device = grDevices::svg)

While I probably should follow politics closer then I do, I find J

While I probably should follow politics closer then I do, I find J.D. Vance’s run for US Senate to be fascinating. I really liked his book, Hillbilly Elegy. He’s somebody who knows the mud and muck of life, not some privileged suburbanite brat who has had everything handed to them on a silver plater.

We might be of opposite political parties and largely differentiating ideology, I totally get where he is coming from and I think he would be good representative for his community.