legisData <- read.csv("~/Downloads/AntiLGBTQData.csv", fileEncoding = "UTF-8")
# Remove the period from the 'ISSUE.' column
colnames(legisData)[colnames(legisData) == "ISSUE."] <- "ISSUE"

# Check for missing values in important columns
anyNA(legisData$State)
[1] FALSE
anyNA(legisData$Bill)
[1] FALSE
anyNA(legisData$ISSUE)
[1] FALSE
anyNA(legisData$Status)
[1] FALSE
anyNA(legisData$Status.Detail)
[1] FALSE

Status Info

set.seed(789)

# Remove duplicate bills based on the Bill column (only keep unique bills)
uniqueLegisData <- legisData %>% distinct(Bill, .keep_all = TRUE)

# Create a table of unique bill statuses
statusTable <- table(uniqueLegisData$Status)

# Generate a pie chart with labels showing both count and percentage for unique bills
pie(statusTable, 
    labels = paste(names(statusTable), "\n", statusTable, "(", round(statusTable/sum(statusTable)*100, 1), "%)", sep = ""),
    main = "Status of Unique Bills",
    col = rainbow(length(statusTable)))

statusTable

      Advancing        Defeated      Introduced Passed into Law 
            327              64               5              23 

Summary Stats: Bills/State Frequency

legisData
stateCounts <- as.numeric(stateTable)

summary(stateCounts)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   3.000   6.000   9.886  12.000  51.000 
which.max(stateCounts)  
[1] 39
names(stateTable)[which.max(stateCounts)]  
[1] "Texas"
which.min(stateCounts)  
[1] 4
names(stateTable)[which.min(stateCounts)]  
[1] "California"
boxplot(stateCounts, main = "Boxplot of Bills per State", ylab = "Number of Bills")


hist(stateCounts, main = "Histogram of Bills per State", xlab = "Number of Bills", col = "lightblue", breaks = 10)

House v Senate


legisData$Chamber <- ifelse(grepl("\\bAB\\b|\\bHF\\b|\\bHB\\b|\\HSB\\b", legisData$Bill, ignore.case = TRUE), "House", 
                             ifelse(grepl("\\bSF\\b|\\bSB\\b|\\S\\b|\\SSB\\b", legisData$Bill, ignore.case = TRUE), "Senate", "Unknown"))


# Create the table of Senate vs. House bills (no "Unknown" values)
chamberTable <- table(legisData$Chamber)

# Display the table
chamberTable

 House Senate 
   214    221 
# Pie chart for Senate vs. House bills
pie(chamberTable, col = c("lightpink", "lightgreen"),
    main = "Bills by Chamber (Senate vs. House)")

# Assign 'House' or 'Senate' based on bill title (HB, AB, HF for House; SB, SF for Senate)

Issues Stats

unique(legisData$`ISSUE `)


names(legisData)[grepl("ISSUE", names(legisData))]

names(legisData)[grepl("ISSUE", names(legisData))] <- "Issue"
library(dplyr)
library(tidyr)

legisData_clean <- legisData %>%
  separate_rows(Issue, sep = ",|/|;|\\n") %>%  # separate by common delimiters
  mutate(Issue = trimws(Issue))             

head(legisData_clean$Issue)
issueTable <- table(legisData_clean$Issue)
issueTable

issueCounts <- table(legisData_clean$Issue)

names(legisData)


par(mar = c(10, 4, 4, 2))
barplot(issueTable,
        las = 3,  
        col = "lightblue",  
        main = "Frequency of Bill Issues",  
        ylab = "Number of Bills",  
        xlab = "Issue",  
        cex.names = 0.5)  
 
legisData

Dividing States by Party


redStates <- c("Alaska", "Arizona", "Arkansas", "Florida", "Georgia", "Idaho", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Mississippi", "Missouri", "Montana", "New Hampshire", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "West Virginia", "Wyoming")
blueStates <- c("California", "Colorado", "Connecticut", "Hawaii", "Maine", "Maryland", "Massachusetts", "Nevada", "New Jersey", "New Mexico", "Oregon", "Rhode Island", "Virginia", "Washington")
purpleStates <- c("Michigan", "Minnesota", "Nebraska", "Pennsylvania")

legisData$StateColor <- ifelse(legisData$State %in% redStates, "Red",
                         ifelse(legisData$State %in% blueStates, "Blue",
                         ifelse(legisData$State %in% purpleStates, "Purple", "Unknown")))

colorTable <- table(legisData$StateColor)
colorTable 

  Blue Purple    Red 
    47     16    372 
pie(colorTable, col = c("blue", "purple", "red"),
    main = "Bills by State Color")

NA
NA

political affiliation testing

uniqueLegisData <- legisData %>% distinct(Bill, .keep_all = TRUE)
# Check if 'StateColor' exists in the dataset
colnames(uniqueLegisData)
[1] "State"         "Bill"          "ISSUE"         "Status"        "Status.Detail" "Chamber"       "StateColor"   
billsPerState <- table(uniqueLegisData$State)
billsData <- data.frame(State = names(billsPerState), Bills = as.vector(billsPerState))
billsData$StateColor <- uniqueLegisData$StateColor[match(billsData$State, uniqueLegisData$State)]
anovaResult <- aov(Bills ~ StateColor, data = billsData)
summary(anovaResult)
            Df Sum Sq Mean Sq F value Pr(>F)   
StateColor   2   1148   574.0   6.182 0.0045 **
Residuals   41   3807    92.9                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
tukeyResult <- TukeyHSD(anovaResult)
tukeyResult$StateColor
                  diff        lwr      upr      p adj
Purple-Blue  0.7857143 -12.498669 14.07010 0.98866437
Red-Blue    10.5549451   2.787495 18.32240 0.00551238
Red-Purple   9.7692308  -2.815477 22.35394 0.15511047
plot(tukeyResult)

status v color

library(dplyr)
uniqueLegisData <- legisData %>% distinct(Bill, .keep_all = TRUE)
statusColorTable <- table(uniqueLegisData$StateColor, uniqueLegisData$Status)
statusColorTable
        
         Advancing Defeated Introduced Passed into Law
  Blue          29       14          2               0
  Purple        15        0          1               0
  Red          283       50          2              23
chisq.test(statusColorTable)
Warning in chisq.test(statusColorTable) :
  Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  statusColorTable
X-squared = 24.394, df = 6, p-value = 0.0004419
fisher.test(statusColorTable)

    Fisher's Exact Test for Count Data

data:  statusColorTable
p-value = 0.0007295
alternative hypothesis: two.sided
LS0tCnRpdGxlOiAiQW50aS1MR0JUUSsgTGVnaXNsYXRpb24iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQoKbGVnaXNEYXRhIDwtIHJlYWQuY3N2KCJ+L0Rvd25sb2Fkcy9BbnRpTEdCVFFEYXRhLmNzdiIsIGZpbGVFbmNvZGluZyA9ICJVVEYtOCIpCiMgUmVtb3ZlIHRoZSBwZXJpb2QgZnJvbSB0aGUgJ0lTU1VFLicgY29sdW1uCmNvbG5hbWVzKGxlZ2lzRGF0YSlbY29sbmFtZXMobGVnaXNEYXRhKSA9PSAiSVNTVUUuIl0gPC0gIklTU1VFIgoKIyBDaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMgaW4gaW1wb3J0YW50IGNvbHVtbnMKYW55TkEobGVnaXNEYXRhJFN0YXRlKQphbnlOQShsZWdpc0RhdGEkQmlsbCkKYW55TkEobGVnaXNEYXRhJElTU1VFKQphbnlOQShsZWdpc0RhdGEkU3RhdHVzKQphbnlOQShsZWdpc0RhdGEkU3RhdHVzLkRldGFpbCkKCgpgYGAKCgpTdGF0dXMgSW5mbwpgYGB7cn0Kc2V0LnNlZWQoNzg5KQoKIyBSZW1vdmUgZHVwbGljYXRlIGJpbGxzIGJhc2VkIG9uIHRoZSBCaWxsIGNvbHVtbiAob25seSBrZWVwIHVuaXF1ZSBiaWxscykKdW5pcXVlTGVnaXNEYXRhIDwtIGxlZ2lzRGF0YSAlPiUgZGlzdGluY3QoQmlsbCwgLmtlZXBfYWxsID0gVFJVRSkKCiMgQ3JlYXRlIGEgdGFibGUgb2YgdW5pcXVlIGJpbGwgc3RhdHVzZXMKc3RhdHVzVGFibGUgPC0gdGFibGUodW5pcXVlTGVnaXNEYXRhJFN0YXR1cykKCiMgR2VuZXJhdGUgYSBwaWUgY2hhcnQgd2l0aCBsYWJlbHMgc2hvd2luZyBib3RoIGNvdW50IGFuZCBwZXJjZW50YWdlIGZvciB1bmlxdWUgYmlsbHMKcGllKHN0YXR1c1RhYmxlLCAKICAgIGxhYmVscyA9IHBhc3RlKG5hbWVzKHN0YXR1c1RhYmxlKSwgIlxuIiwgc3RhdHVzVGFibGUsICIoIiwgcm91bmQoc3RhdHVzVGFibGUvc3VtKHN0YXR1c1RhYmxlKSoxMDAsIDEpLCAiJSkiLCBzZXAgPSAiIiksCiAgICBtYWluID0gIlN0YXR1cyBvZiBVbmlxdWUgQmlsbHMiLAogICAgY29sID0gcmFpbmJvdyhsZW5ndGgoc3RhdHVzVGFibGUpKSkKc3RhdHVzVGFibGUKCgpgYGAKClN1bW1hcnkgU3RhdHM6IEJpbGxzL1N0YXRlIEZyZXF1ZW5jeQpgYGB7cn0KbGVnaXNEYXRhCnN0YXRlQ291bnRzIDwtIGFzLm51bWVyaWMoc3RhdGVUYWJsZSkKCnN1bW1hcnkoc3RhdGVDb3VudHMpCndoaWNoLm1heChzdGF0ZUNvdW50cykgIApuYW1lcyhzdGF0ZVRhYmxlKVt3aGljaC5tYXgoc3RhdGVDb3VudHMpXSAgCndoaWNoLm1pbihzdGF0ZUNvdW50cykgIApuYW1lcyhzdGF0ZVRhYmxlKVt3aGljaC5taW4oc3RhdGVDb3VudHMpXSAgCgpib3hwbG90KHN0YXRlQ291bnRzLCBtYWluID0gIkJveHBsb3Qgb2YgQmlsbHMgcGVyIFN0YXRlIiwgeWxhYiA9ICJOdW1iZXIgb2YgQmlsbHMiKQoKaGlzdChzdGF0ZUNvdW50cywgbWFpbiA9ICJIaXN0b2dyYW0gb2YgQmlsbHMgcGVyIFN0YXRlIiwgeGxhYiA9ICJOdW1iZXIgb2YgQmlsbHMiLCBjb2wgPSAibGlnaHRibHVlIiwgYnJlYWtzID0gMTApCgpgYGAKCkhvdXNlIHYgU2VuYXRlCmBgYHtyfQoKbGVnaXNEYXRhJENoYW1iZXIgPC0gaWZlbHNlKGdyZXBsKCJcXGJBQlxcYnxcXGJIRlxcYnxcXGJIQlxcYnxcXEhTQlxcYiIsIGxlZ2lzRGF0YSRCaWxsLCBpZ25vcmUuY2FzZSA9IFRSVUUpLCAiSG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIlxcYlNGXFxifFxcYlNCXFxifFxcU1xcYnxcXFNTQlxcYiIsIGxlZ2lzRGF0YSRCaWxsLCBpZ25vcmUuY2FzZSA9IFRSVUUpLCAiU2VuYXRlIiwgIlVua25vd24iKSkKCgojIENyZWF0ZSB0aGUgdGFibGUgb2YgU2VuYXRlIHZzLiBIb3VzZSBiaWxscyAobm8gIlVua25vd24iIHZhbHVlcykKY2hhbWJlclRhYmxlIDwtIHRhYmxlKGxlZ2lzRGF0YSRDaGFtYmVyKQoKIyBEaXNwbGF5IHRoZSB0YWJsZQpjaGFtYmVyVGFibGUKCiMgUGllIGNoYXJ0IGZvciBTZW5hdGUgdnMuIEhvdXNlIGJpbGxzCnBpZShjaGFtYmVyVGFibGUsIGNvbCA9IGMoImxpZ2h0cGluayIsICJsaWdodGdyZWVuIiksCiAgICBtYWluID0gIkJpbGxzIGJ5IENoYW1iZXIgKFNlbmF0ZSB2cy4gSG91c2UpIikKIyBBc3NpZ24gJ0hvdXNlJyBvciAnU2VuYXRlJyBiYXNlZCBvbiBiaWxsIHRpdGxlIChIQiwgQUIsIEhGIGZvciBIb3VzZTsgU0IsIFNGIGZvciBTZW5hdGUpCgoKCmBgYAoKSXNzdWVzIFN0YXRzCmBgYHtyfQp1bmlxdWUobGVnaXNEYXRhJGBJU1NVRcKgYCkKCgpuYW1lcyhsZWdpc0RhdGEpW2dyZXBsKCJJU1NVRSIsIG5hbWVzKGxlZ2lzRGF0YSkpXQoKbmFtZXMobGVnaXNEYXRhKVtncmVwbCgiSVNTVUUiLCBuYW1lcyhsZWdpc0RhdGEpKV0gPC0gIklzc3VlIgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQoKbGVnaXNEYXRhX2NsZWFuIDwtIGxlZ2lzRGF0YSAlPiUKICBzZXBhcmF0ZV9yb3dzKElzc3VlLCBzZXAgPSAiLHwvfDt8XFxuIikgJT4lICAjIHNlcGFyYXRlIGJ5IGNvbW1vbiBkZWxpbWl0ZXJzCiAgbXV0YXRlKElzc3VlID0gdHJpbXdzKElzc3VlKSkgICAgICAgICAgICAgCgpoZWFkKGxlZ2lzRGF0YV9jbGVhbiRJc3N1ZSkKaXNzdWVUYWJsZSA8LSB0YWJsZShsZWdpc0RhdGFfY2xlYW4kSXNzdWUpCmlzc3VlVGFibGUKCmlzc3VlQ291bnRzIDwtIHRhYmxlKGxlZ2lzRGF0YV9jbGVhbiRJc3N1ZSkKCm5hbWVzKGxlZ2lzRGF0YSkKCgpwYXIobWFyID0gYygxMCwgNCwgNCwgMikpCmJhcnBsb3QoaXNzdWVUYWJsZSwKICAgICAgICBsYXMgPSAzLCAgCiAgICAgICAgY29sID0gImxpZ2h0Ymx1ZSIsICAKICAgICAgICBtYWluID0gIkZyZXF1ZW5jeSBvZiBCaWxsIElzc3VlcyIsICAKICAgICAgICB5bGFiID0gIk51bWJlciBvZiBCaWxscyIsICAKICAgICAgICB4bGFiID0gIklzc3VlIiwgIAogICAgICAgIGNleC5uYW1lcyA9IDAuNSkgIAogCmxlZ2lzRGF0YQpgYGAKCkRpdmlkaW5nIFN0YXRlcyBieSBQYXJ0eQpgYGB7cn0KCnJlZFN0YXRlcyA8LSBjKCJBbGFza2EiLCAiQXJpem9uYSIsICJBcmthbnNhcyIsICJGbG9yaWRhIiwgIkdlb3JnaWEiLCAiSWRhaG8iLCAiSW5kaWFuYSIsICJJb3dhIiwgIkthbnNhcyIsICJLZW50dWNreSIsICJMb3Vpc2lhbmEiLCAiTWlzc2lzc2lwcGkiLCAiTWlzc291cmkiLCAiTW9udGFuYSIsICJOZXcgSGFtcHNoaXJlIiwgIk5vcnRoIENhcm9saW5hIiwgIk5vcnRoIERha290YSIsICJPaGlvIiwgIk9rbGFob21hIiwgIlNvdXRoIENhcm9saW5hIiwgIlNvdXRoIERha290YSIsICJUZW5uZXNzZWUiLCAiVGV4YXMiLCAiVXRhaCIsICJXZXN0IFZpcmdpbmlhIiwgIld5b21pbmciKQpibHVlU3RhdGVzIDwtIGMoIkNhbGlmb3JuaWEiLCAiQ29sb3JhZG8iLCAiQ29ubmVjdGljdXQiLCAiSGF3YWlpIiwgIk1haW5lIiwgIk1hcnlsYW5kIiwgIk1hc3NhY2h1c2V0dHMiLCAiTmV2YWRhIiwgIk5ldyBKZXJzZXkiLCAiTmV3IE1leGljbyIsICJPcmVnb24iLCAiUmhvZGUgSXNsYW5kIiwgIlZpcmdpbmlhIiwgIldhc2hpbmd0b24iKQpwdXJwbGVTdGF0ZXMgPC0gYygiTWljaGlnYW4iLCAiTWlubmVzb3RhIiwgIk5lYnJhc2thIiwgIlBlbm5zeWx2YW5pYSIpCgpsZWdpc0RhdGEkU3RhdGVDb2xvciA8LSBpZmVsc2UobGVnaXNEYXRhJFN0YXRlICVpbiUgcmVkU3RhdGVzLCAiUmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShsZWdpc0RhdGEkU3RhdGUgJWluJSBibHVlU3RhdGVzLCAiQmx1ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobGVnaXNEYXRhJFN0YXRlICVpbiUgcHVycGxlU3RhdGVzLCAiUHVycGxlIiwgIlVua25vd24iKSkpCgpjb2xvclRhYmxlIDwtIHRhYmxlKGxlZ2lzRGF0YSRTdGF0ZUNvbG9yKQpjb2xvclRhYmxlIApwaWUoY29sb3JUYWJsZSwgY29sID0gYygiYmx1ZSIsICJwdXJwbGUiLCAicmVkIiksCiAgICBtYWluID0gIkJpbGxzIGJ5IFN0YXRlIENvbG9yIikKCgpgYGAKCgpwb2xpdGljYWwgYWZmaWxpYXRpb24gdGVzdGluZwpgYGB7cn0KdW5pcXVlTGVnaXNEYXRhIDwtIGxlZ2lzRGF0YSAlPiUgZGlzdGluY3QoQmlsbCwgLmtlZXBfYWxsID0gVFJVRSkKIyBDaGVjayBpZiAnU3RhdGVDb2xvcicgZXhpc3RzIGluIHRoZSBkYXRhc2V0CmNvbG5hbWVzKHVuaXF1ZUxlZ2lzRGF0YSkKCmJpbGxzUGVyU3RhdGUgPC0gdGFibGUodW5pcXVlTGVnaXNEYXRhJFN0YXRlKQpiaWxsc0RhdGEgPC0gZGF0YS5mcmFtZShTdGF0ZSA9IG5hbWVzKGJpbGxzUGVyU3RhdGUpLCBCaWxscyA9IGFzLnZlY3RvcihiaWxsc1BlclN0YXRlKSkKYmlsbHNEYXRhJFN0YXRlQ29sb3IgPC0gdW5pcXVlTGVnaXNEYXRhJFN0YXRlQ29sb3JbbWF0Y2goYmlsbHNEYXRhJFN0YXRlLCB1bmlxdWVMZWdpc0RhdGEkU3RhdGUpXQphbm92YVJlc3VsdCA8LSBhb3YoQmlsbHMgfiBTdGF0ZUNvbG9yLCBkYXRhID0gYmlsbHNEYXRhKQpzdW1tYXJ5KGFub3ZhUmVzdWx0KQp0dWtleVJlc3VsdCA8LSBUdWtleUhTRChhbm92YVJlc3VsdCkKdHVrZXlSZXN1bHQkU3RhdGVDb2xvcgpwbG90KHR1a2V5UmVzdWx0KQoKYGBgCgpzdGF0dXMgdiBjb2xvcgpgYGB7cn0KbGlicmFyeShkcGx5cikKdW5pcXVlTGVnaXNEYXRhIDwtIGxlZ2lzRGF0YSAlPiUgZGlzdGluY3QoQmlsbCwgLmtlZXBfYWxsID0gVFJVRSkKc3RhdHVzQ29sb3JUYWJsZSA8LSB0YWJsZSh1bmlxdWVMZWdpc0RhdGEkU3RhdGVDb2xvciwgdW5pcXVlTGVnaXNEYXRhJFN0YXR1cykKc3RhdHVzQ29sb3JUYWJsZQpmaXNoZXIudGVzdChzdGF0dXNDb2xvclRhYmxlKQoKYGBgCgo=