1. IMPORT, DATA PRE-PROCESSING & VISUALIZE THE DATA

Ερώτημα: Introduction to the dataset and the purpose of the analysis.

Το California Crime and Law Enforcement σετ δεδομένων από το Πρόγραμμα Ενιαίας Αναφοράς Εγκλήματος (UCR) του FBI παρέχει αρχεία των κατηγοριών εγκλημάτων και του προσωπικού επιβολής του νόμου σε πόλεις, κομητείες και πανεπιστημιουπόλεις της Αμερικανικής πολιτείας της Καλιφόρνια.

Το σετ δεδομένων καταγράφει όχι μόνο τον όγκο των ποινικών αδικημάτων —που κυμαίνονται από βίαια εγκλήματα όπως επίθεση και ληστεία έως εγκλήματα ιδιοκτησίας όπως διάρρηξη και κλοπή—αλλά επίσης τα εντάσσει σε σχέση με αριθμούς πληθυσμού και παρουσία ένστολων.

Τα πέντε κύρια αρχεία CSV περιλαμβάνουν λεπτομερή δεδομένα:

  • Τα ca_law_enforcement_by_city.csv και ca_law_enforcement_by_county.csv αναφέρουν τον αριθμό των ενστόλων ανά τοποθεσία,

  • Τα ca_offenses_by_city.csv και ca_offenses_by_county.csv καταγράφουν διάφορες κατηγορίες εγκλημάτων και

  • Το ca_offenses_by_campus.csv εστιάζει στην εγκληματική δραστηριότητα στα πανεπιστημία.

    Ο σκοπός της παρούσας ανάλυσης διερευνεί τη σχέση μεταξύ των ποσοστών εγκληματικότητας και του μεγέθους του πληθυσμού, της γεωγραφικής επέκτασης του και της ικανότητας επιβολής του νόμου. Εντοπίζοντας τάσεις, ακραίες τιμές και συσχετίσεις εντός των δεδομένων, και απαντούμε σε ερωτήματα όπως:

  • Είναι ορισμένα εγκλήματα πιο διαδεδομένα σε συγκεκριμένες περιοχές;

  • Πώς συγκρίνονται τα εγκλήματα στα πανεπιστήμια με τα μοτίβα στις κομητείες της Καλιφόρνια;

  • Η υψηλότερη παρουσία της επιβολής του νόμου συσχετίζεται με χαμηλότερα ποσοστά εγκληματικότητας;

Μέσω στατιστικών περιλήψεων, γραφημάτων, οπτικοποιήσεων και αξιολογήσεων συσχέτισης, επιδώκουμε μια σαφέστερη κατανόηση της δυναμικής των εγκλημάτων στην Καλιφόρνια.

Ερώτημα: Presentation of the libraries that will be used.
  • stringr – Παρέχει συνεπή, και απλά wrappers για συμβολοσειρές όπως αντιστοίχιση μοτίβων και καθαρισμός χαρακτήρων.
  • dplyr – Προσφέρει ισχυρές λειτουργίες για φιλτράρισμα, επιλογή και μετατροπή dataframes.
  • stats – Περιλαμβάνει βασικές στατιστικές συναρτήσεις όπως το shapiro.test().
  • reshape2 – Απλοποιεί την αναμόρφωση δεδομένων μεταξύ ευρείας και μεγάλης μορφής χρησιμοποιώντας λειτουργίες όπως melt().
  • moments - Παρέχει συναρτήσεις για τον υπολογισμό στατιστικών ροπών υψηλότερης τάξης — συμπεριλαμβανομένης της λοξότητας (skewness) και της κύρτωσης (kurtosis) — για την ανάλυση του σχήματος και της κατανομής των δεδομένων.
  • caret – Προσφέρει εντολές για εκπαίδευση και αξιολόγηση μοντέλων μηχανικής μάθησης, με εργαλεία για προ επεξεργασία, εκπαίδευση και επικύρωση.
  • ggplot2 – Επιτρέπει τη δημιουργία ευέλικτων γραφημάτων χρησιμοποιώντας μια πολυεπίπεδη σύσταση των πληροφοριών.
  • ggrepel – Βελτιώνει το ggplot2 επιτρέποντας την επικάλυψη ετικετών κειμένου με έξυπνη απώθηση.
  • scales - Παρέχει εργαλεία για τον έλεγχο των αξόνων, των legends και των ετικετών γραφημάτων (π.χ. μορφοποίηση αριθμών ως ποσοστά ή κόμματα).
  • sf – Υποστηρίζει το χειρισμό και την ανάλυση χωρικών διανυσματικών δεδομένων (π.χ. shapefiles).
  • tigris – Εύκολη πρόσβαση και φόρτωση δεδομένων γεωγραφικών ορίων από το Γραφείο Απογραφής των ΗΠΑ για χαρτογράφηση.
  • viridis – Παρέχει ομοιόμορφες χρωματικές κλίμακες για οπτικοποίηση δεδομένων, βελτιστοποιημένες για αχρωματοψία.
  • tidyr - Προσφέρει πληθώρα εργαλείων για την αναδιαμόρφωση και οργάνωση των δεδομένων, διευκολύνοντας τη μετατροπή των συνόλων δεδομένων σε μια τακτοποιημένη μορφή όπου κάθε μεταβλητή είναι μια στήλη, κάθε παρατήρηση είναι μια σειρά και κάθε τιμή είναι ένα κελί.
  • kableExtra - Βελτιώνει τους πίνακες R Markdown και R Notebook προσθέτοντας προηγμένες επιλογές μορφοποίησης, όπως ριγέ σειρές, περιγράμματα, και ευθυγράμμιση, ειδικά για χρήση με το knitr::kable().
packages <- c("stringr","dplyr","stats","reshape2","moments","caret",
              "ggplot2","ggrepel","scales","sf","tigris","viridis",
              "tidyr","kableExtra")

invisible(lapply(packages, library, character.only = TRUE))
Ερώτημα: Load the following csv files.

Αρχικοποιούμε τα ονόματα των αρχείων σε μεταβλητές για να είναι πιο ευανάγνωστος ο κώδικας.

dsPath1 <- "./ca_law_enforcement_by_city.csv"
dsPath2 <- "./ca_law_enforcement_by_county.csv"
dsPath3 <- "./ca_offenses_by_city.csv"
dsPath4 <- "./ca_offenses_by_county.csv"

Φορτώνουμε τα αρχεία και θα προβούμε σε κάποιες αρχικές ενέργειες καθαρισμού και μορφοποίησης των δεδομένων.
Οι ενέργειες καθαρισμού και μορφοποίησης περιλαμβάνουν:

  • αφαίρεση του χαρακτήρα “.” από τους τίτλους των μεταβλητών
  • αφαίρεση του χαρακτήρα “,” από τα στοιχεία των αριθμητικών μεταβλητών
  • μετατροπή των αριθμητικών μεταβλητών από χαρακτήρες σε νούμερα
#ca_law_enforcement_by_city
{
  ca_law_enforcement_by_city <- read.csv(dsPath1, header = TRUE, sep = ",")
  #Καθαρισμός των ονομάτων των στηλών από τελείες "." και κενά στην αρχή και στο τέλος του κάθε ονόματος.
  colnames(ca_law_enforcement_by_city) <- str_squish(gsub('\\.',' ',colnames(ca_law_enforcement_by_city))) 
  
  #Αφαίρεση του χαρακτήρα "," (κόμμα) για την ακριβής μετατροπή των χαρακτήρων σε αριθμούς 
  #και ορισμός του αριθμητικού είδους της μεταβλητής.
  for (i in 2:ncol(ca_law_enforcement_by_city))
    ca_law_enforcement_by_city[,i] <- as.numeric(gsub(",","",ca_law_enforcement_by_city[,i]))  
}
#ca_law_enforcement_by_county
{
  ca_law_enforcement_by_county <- read.csv(dsPath2, header = TRUE, sep = ",")
  #Καθαρισμός των ονομάτων των στηλών από τελείες "." και κενά στην αρχή και στο τέλος του κάθε ονόματος.
  colnames(ca_law_enforcement_by_county) <- str_squish(gsub('\\.',' ',colnames(ca_law_enforcement_by_county)))  
  #Αφαίρεση του χαρακτήρα "," (κόμμα) για την ακριβής μετατροπή των χαρακτήρων σε αριθμούς 
  #και ορισμός του αριθμητικού είδους της μεταβλητής.
  for (i in 3:ncol(ca_law_enforcement_by_county))
    ca_law_enforcement_by_county[,i] <- as.numeric(gsub(",","",ca_law_enforcement_by_county[,i])) 
}

#ca_offenses_by_city
{
  ca_offenses_by_city <- read.csv(dsPath3, header = TRUE, sep = ",")
  #Καθαρισμός των ονομάτων των στηλών από τελείες "." και κενά στην αρχή και στο τέλος του κάθε ονόματος.
  colnames(ca_offenses_by_city) <- str_squish(gsub('\\.',' ',colnames(ca_offenses_by_city))) 
  #Αφαίρεση του χαρακτήρα "," (κόμμα) για την ακριβής μετατροπή των χαρακτήρων σε αριθμούς 
  #και ορισμός του αριθμητικού είδους της μεταβλητής.
  for (i in 2:ncol(ca_offenses_by_city))
    ca_offenses_by_city[,i] <- as.numeric(gsub(",","",ca_offenses_by_city[,i])) 
}

#ca_offenses_by_county
{
  ca_offenses_by_county <- read.csv(dsPath4, header = TRUE, sep = ",")
  #Καθαρισμός των ονομάτων των στηλών από τελείες "." και κενά στην αρχή και στο τέλος του κάθε ονόματος.
  colnames(ca_offenses_by_county) <- str_squish(gsub('\\.',' ',colnames(ca_offenses_by_county)))
  #Αφαίρεση του χαρακτήρα "," (κόμμα) για την ακριβής μετατροπή των χαρακτήρων σε αριθμούς 
  #και ορισμός του αριθμητικού είδους της μεταβλητής.
  for (i in 3:ncol(ca_offenses_by_county))
    ca_offenses_by_county[,i] <- as.numeric(gsub(",","",ca_offenses_by_county[,i])) 
}
Ερώτημα: Identify and handle missing values as well outliers and extreme values in each dataset.

Προκειμένου να γίνει έλεγχος για απολεσμένες (NA) ή κενές (Empty) τιμές για κάθε σετ δεδομένων δημιουργούμε τη συνάρτηση summarize_NA_and_empty.
Η summarize_NA_and_empty δέχεται σαν υποχρεωτικό όρισμα το όνομα του σετ δεδομένων που θέλουμε να ελέγξουμε, και επιστρέφει ένα συγκεντρωτικό πίνακα με τις παρακάτω πληροφορίες:

  • ονόμα στήλης
  • αριθμός μη κενών στοιχείων της στήλης
  • αριθμός απολεσμένων ή κενών στοιχείων της στήλης
  • συνολικός αριθμός στοιχείων της στήλης
  • ποσοστό απολεσμένων ή κενών στοιχείων ως προς το σύνολο των στοιχείων της στήλης
summarize_NA_and_empty <- function(dtset) {
  #Αρχικοποιήση των στηλών που θα χρησιμοποιήσουμε.
  colnames_vec <- character()
  non_empty_counts <- numeric()
  missing_counts <- numeric()
  
  for (i in 1:ncol(dtset)) {
    col_data <- dtset[[i]]
    col_name <- colnames(dtset)[i]
    
    #Αποθήκευση ονομάτος στήλης του πίνακα.
    colnames_vec <- c(colnames_vec, col_name)
    
    #Αναγνώριση κενών ή απολεσμένων τιμών.
    missing_or_empty <- is.na(col_data) | (col_data == "" & !is.na(col_data))
    
    #Αποθήκευση κενών ή απολεσμένων τιμών.
    missing_count <- sum(missing_or_empty)
    non_empty_count <- length(col_data) - missing_count
    
    #Ενημέρωση κενών ή απολεσμένων τιμών.
    missing_counts <- c(missing_counts, missing_count)
    non_empty_counts <- c(non_empty_counts, non_empty_count)
  }
  
  #Δημιουργία πίνακα με σύνολο πληροφοριών για τις στήλες του προς εξέταση σε δεδομένων.   
  summary_dtset <- data.frame(
    Column = colnames_vec,
    Non_Empty_Count = non_empty_counts,
    Missing_or_Empty_Count = missing_counts,
    Total_Elements = non_empty_counts + missing_counts
  )
  
  #Προσθήκη στήλης με το ποσοστο απολεσμένων ή κενων στοιχείων πος το σύνολο των στοιχείων της κάθε στήλης.
  summary_dtset$Percentage_Filled <- round(
    (summary_dtset$Non_Empty_Count / summary_dtset$Total_Elements) * 100, 2
  )
  
  return(summary_dtset)
}

Στη συνέχεια κάνουμε χρήση της συνάρτησης και παρατηρούμε:
1. Οι πίνακες ca_law_enforcement_by_city, και ca_law_enforcement_by_county είναι πλήρεις.

#Έλεγχος για το σετ δεδομένων ca_law_enforcement_by_city
knitr::kable(summarize_NA_and_empty(ca_law_enforcement_by_city)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
City 333 0 333 100
Population 333 0 333 100
Total law enforcement employees 333 0 333 100
Total officers 333 0 333 100
Total civilians 333 0 333 100
#Έλεγχος για το σετ δεδομένων ca_law_enforcement_by_county
knitr::kable(summarize_NA_and_empty(ca_law_enforcement_by_county)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
Metropolitan Nonmetropolitan 58 0 58 100
County 58 0 58 100
Total law enforcement employees 58 0 58 100
Total officers 58 0 58 100
Total civilians 58 0 58 100
  1. Ο πίνακας ca_offenses_by_city έχει μία (1) πλήρως κενή μεταβλητή, τη “Rape legacy definition”, την οποία αφαιρούμε τελείως.
#Έλεγχος για το σετ δεδομένων ca_offenses_by_city.
knitr::kable(summarize_NA_and_empty(ca_offenses_by_city)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
City 460 0 460 100
Population 460 0 460 100
Violent crime 460 0 460 100
Murder and nonnegligent manslaughter 460 0 460 100
Rape revised definition 460 0 460 100
Rape legacy definition 0 460 460 0
Robbery 460 0 460 100
Aggravated assault 460 0 460 100
Property crime 460 0 460 100
Burglary 460 0 460 100
Larceny theft 460 0 460 100
Motor vehicle theft 460 0 460 100
Arson 460 0 460 100

Αφαιρούμε την μεταβλητή και πραγματοποιούμε επανέλεγχο στο νέο πίνακα ca_offenses_by_city_upd.

#Αφαίρεση της κενής στήλης "Rape legacy definition".
ca_offenses_by_city_upd <- cbind(ca_offenses_by_city[1:5],ca_offenses_by_city[7:13])

#Επανάληψη του ελέγχου στο νέο σετ δεδομέν ca_offenses_by_city_upd.
knitr::kable(summarize_NA_and_empty(ca_offenses_by_city_upd)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
City 460 0 460 100
Population 460 0 460 100
Violent crime 460 0 460 100
Murder and nonnegligent manslaughter 460 0 460 100
Rape revised definition 460 0 460 100
Robbery 460 0 460 100
Aggravated assault 460 0 460 100
Property crime 460 0 460 100
Burglary 460 0 460 100
Larceny theft 460 0 460 100
Motor vehicle theft 460 0 460 100
Arson 460 0 460 100
  1. Ο πίνακας ca_offenses_by_county έχει μία (1) πλήρως κενή μεταβλητή, τη “Rape legacy definition”, την οποία αφαιρούμε τελείως. Επίσης για όλες τις υπόλοιπες μεταβλητές το 97.8% των τιμών είναι κενές, άρα τις αφαιρούμε και αυτές.
#Έλεγχος για το σετ δεδομένων ca_offenses_by_county.
knitr::kable(summarize_NA_and_empty(ca_offenses_by_county)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
Metropolitan Nonmetropolitan 57 2535 2592 2.2
County 57 2535 2592 2.2
Violent crime 57 2535 2592 2.2
Murder and nonnegligent manslaughter 57 2535 2592 2.2
Rape revised definition 57 2535 2592 2.2
Rape legacy definition 0 2592 2592 0.0
Robbery 57 2535 2592 2.2
Aggravated assault 57 2535 2592 2.2
Property crime 57 2535 2592 2.2
Burglary 57 2535 2592 2.2
Larceny theft 57 2535 2592 2.2
Motor vehicle theft 57 2535 2592 2.2
Arson 57 2535 2592 2.2

Αφαιρούμε την μεταβλητή, τις κενές εγγραφές και πραγματοποιούμε επανέλεγχο στο νέο πίνακα ca_offenses_by_county_upd.

#Αφαίρεση της κενής στήλης "Rape legacy definition".
ca_offenses_by_county_upd <- cbind(ca_offenses_by_county[1:5],ca_offenses_by_county[7:13])

#Αφαίρεση των κενών γραμμών του σετ δεδομένων.
ca_offenses_by_county_upd <- ca_offenses_by_county_upd[1:57,]

#Επανάληψη του ελέγχου στο νέο σετ δεδομέν ca_offenses_by_county_upd.
knitr::kable(summarize_NA_and_empty(ca_offenses_by_county_upd)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
Metropolitan Nonmetropolitan 57 0 57 100
County 57 0 57 100
Violent crime 57 0 57 100
Murder and nonnegligent manslaughter 57 0 57 100
Rape revised definition 57 0 57 100
Robbery 57 0 57 100
Aggravated assault 57 0 57 100
Property crime 57 0 57 100
Burglary 57 0 57 100
Larceny theft 57 0 57 100
Motor vehicle theft 57 0 57 100
Arson 57 0 57 100

Προκειμένου να γίνει έλεγχος για ακραίες τιμές(outliers/extreme values) για κάθε σετ δεδομένων δημιουργούμε τη συνάρτηση plot_single_boxplot_outliers.
Η plot_single_boxplot_outliers δέχεται σαν ορίσματα:

  • (Υποχρεωτικό) ένα πίνακα δεδομένων
  • (Υποχρεωτικό) το όνομα μιας μεταβλητής με αριθμητικές τιμές που θέλουμε να ελέγξουμε για ακραίες τιμές
  • (Υποχρεωτικό) το όνομα μιας μεταβλητής με τα ονόματα των πόλεων ή των κομητειών

Η συνάρτηση επιστρέφει μια λίστα με:

  • (plot): το θηκόγραμμα της μεταβλητής που ζητήθηκε
  • (mild_outliers): τον πίνακα με τα δεδομένα που έχουν τιμές μεγαλύτερες από Q1 - 1.5 * ΕΤΕ ή Q3 + 1.5 * ΕΤΕ, αλλά μικρότερες από Q1 - 3 * ΕΤΕ ή Q3 + 3 * ΕΤΕ
  • (extreme_outliers): τον πίνακα με τα δεδομένα που έχουν τιμές μεγαλύτερες από Q1 - 3 * ΕΤΕ ή Q3 + 3 * ΕΤΕ

*ΕΤΕ = Ενδοτεταρτημοριακό εύρος

plot_single_boxplot_outliers <- function(data, value_col, label_col) {
  
  #Δημιουργία του σετ δεδομένων για επεξεργασία.
  ds_col <- data %>%
    select(ID = all_of(label_col), Value = all_of(value_col))
  
  #Υπολογισμός Q1, Q2, Q3 και ΕΤΕ.
  Q1 <- quantile(ds_col$Value, 0.25)
  Q2 <- quantile(ds_col$Value, 0.50)  
  Q3 <- quantile(ds_col$Value, 0.75)
  IQR <- Q3 - Q1
  
  #Χαρακτηρισμός σημείων ως "Mild Outlier", "Extreme Outlier" ή τίποτα από τα προηγούμενα.
  #Χρήση για καλύτερη οπτικοποιήση των αποτελεσμάτων.
  ds_col <- ds_col %>%
    mutate(
      OutlierType = case_when(
        Value < (Q1 - 3 * IQR) | Value > (Q3 + 3 * IQR) ~ "Extreme Outlier",
        (Value >= (Q1 - 3 * IQR) & Value < (Q1 - 1.5 * IQR)) |
          (Value > (Q3 + 1.5 * IQR) & Value <= (Q3 + 3 * IQR)) ~ "Mild Outlier",
        TRUE ~ NA_character_
      )
    )
  
  #Θηκόγραμμα
  p <- ggplot(ds_col, aes(x = "", y = Value)) +
    geom_boxplot(outlier.shape = NA) +
    geom_point(data = filter(ds_col, !is.na(OutlierType)),
               aes(color = OutlierType), size = 3) +
    geom_text_repel(data = filter(ds_col, OutlierType == "Extreme Outlier"),
                    aes(label = paste(ID, ",", Value)), color = "black",
                    size = 3, direction = "y", nudge_x = 0.1, box.padding = 0.3, point.padding = 0.2,max.overlaps = Inf) +
    geom_text_repel(data = filter(ds_col, OutlierType == "Mild Outlier"),
                    aes(label = paste(ID, ",", Value)), color = "black",
                    size = 3, direction = "y", nudge_x = -0.1, box.padding = 0.3, point.padding = 0.2,max.overlaps = Inf) +
    geom_hline(yintercept = Q2, linetype = "dashed", color = "blue", size = 0.5) +
    annotate("text", x = 1, y = Q2, label = paste("Q2 value is:", Q2),
             color = "black", size = 3, hjust = 0.5, vjust = -1) +
    scale_color_manual(values = c("Mild Outlier" = "orange", "Extreme Outlier" = "red")) +
    scale_y_continuous(labels = comma) +
    labs(
      title = paste("Boxplot of", value_col, "by", label_col),
      x = "", y = "", color = "Outlier Type"
    ) +
    theme_minimal()
  
  return(list(
    plot = p,
    mild_outliers = filter(ds_col, OutlierType == "Mild Outlier"),
    extreme_outliers = filter(ds_col, OutlierType == "Extreme Outlier")
  ))
}

Για κάθε ένα από τα σετ δεδομένων και τις μεταβλητές τους χρησιμοποιούμε την plot_single_boxplot_outliers και εντοπίζουμε σε όλα την ύπαρξη είτε ήπια (mild) ή υπερβολικά (extreme) ακραίων τιμών.
Παρά την παρουσία τέτοιων τιμών, δεν τις απορρίπτουμε καθώς τα σετ δεδομένων μας έχουν σχετικά μικρό αριθμό παρατηρήσεων με αποτέλεσμα να συντρέχει κίνδυνος να οδηγηθούμε σε μεροληπτικά συμπεράσματα. Αξίζει να σημειωθεί ότι η ύπαρξη ακραίων τιμών δεν φαίνεται να προκύπτει από κάποιο σφάλμα στην καταγραφή τους, αντιθέτως αντανακλούν πλήρως την πραγματικότητα.
Αξίζει να σημειωθεί ότι η ύπαρξη ακραίων τιμών δεν φαίνεται να προκύπτει από κάποιο σφάλμα στην καταγραφή τους, αντιθέτως αντανακλούν πλήρως την πραγματικότητα.
Τέλος για λόγους παρουσίασης, ακολουθεί το θηκόγραμμα και οι σχετικοι πίνακες, μόνο για τη μεταβλητή Property crime ανά County, ενώ τα αποτελέσματα για όλα τα σετ δεδομένων παρατίθενται στο Παράρτημα.

#Θηκόγραμμα
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Property crime","County")$plot

#Πίνακας ήπια ακραίων τιμών
knitr::kable(plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Property crime","County")$mild_outliers) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
ID Value OutlierType
San Bernardino 5527 Mild Outlier
San Diego 4784 Mild Outlier
#Θηκόγραμμα υπερβολικά ακραίων τιμών
knitr::kable(plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Property crime","County")$extreme_outliers) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
ID Value OutlierType
Kern 9903 Extreme Outlier
Los Angeles 16301 Extreme Outlier
Riverside 7680 Extreme Outlier
Sacramento 11164 Extreme Outlier
Ερώτημα: Examine the types of variables and report their definitions.

Για κάθε ένα από τα σετ δεδομένων παρατηρούμε το είδος της κλάσης των μεταβλητών του, αλλά και το είδος που αυτές αποθηκεύονται στην μνήμη του Η.Υ..

  • Γενική παρατήρηση είναι πως οι αριθμητικές μεταβλητές έχουν κλάση numeric, ενώ οι χαρακτήρες έχουν κλάση character.

  • Οι αριθμητικές μεταβλητές κατά την αποθήκευσή τους αποτυπώνονται ως double, δηλαδή διατηρούν με ακρίβεια τους αριθμούς που αποθηκεύονται μετά την υποδιαστολή.

    Τέλος για λόγους παρουσίασης, ακολουθούν τα αποτελέσματα μόνο για τον πίνακα ca_law_enforcement_by_city ενώ τα αποτελέσματα για τους υπόλοιπους πίνακες παρατίθενται στο Παράρτημα.

#Είδος κλάσης για τις τιμές των στηλών.
knitr::kable(sapply(ca_law_enforcement_by_city, class), col.names = c("Variable Name", "Variable Class")) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Class
City character
Population numeric
Total law enforcement employees numeric
Total officers numeric
Total civilians numeric
#Είδος αποθήκευσης για τις τιμές των στηλών. 
knitr::kable(sapply(ca_law_enforcement_by_city, typeof), col.names = c("Variable Name", "Variable Type"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Type
City character
Population double
Total law enforcement employees double
Total officers double
Total civilians double
Ερώτημα: Use the R functions to visualize the data set in order to answer the following questions:
Distribution Type: Examine for the following variables of the datasets ca_offenses_by_city.csv, ca_offenses_by_county.csv, the distribution types (e.g., normal, skewed): Population, Violent Crime

Για τον έλεγχο της κατανομής των μεταβλητών Population, Violent Crime στα σετ δεδομένων ca_offenses_by_city.csv και ca_offenses_by_county.csv δημιουργούμε τη συνάρτηση chist.
Η chist δέχεται σαν ορίσματα:

  • (Υποχρεωτικό) ένα πίνακα δεδομένων
  • (Υποχρεωτικό) το όνομα της μεταβλητής με αριθμητικές τιμές που θέλουμε να ελέγξουμε την κατανομή της
  • (Προαιρετικό) μια λογική μεταβλητή “adjust_max” που καθορίζει αν θα λάβουμε υπόψιν τις ακραίες τιμές ή όχι
  • (Προαιρετικό) το όνομα της μεταβλητής που περιέχει τις πόλεις ή τις κομητείες για τον καθορισμό των ακραίων τιμών

Η συνάρτηση επιστρέφει:

  • Το ιστόγραμμα της μεταβλητής ως προς τις πόλεις ή τις κομητείες λαμβάνοντας υπόψιν τις ακραίες τιμές (προεπιλογή)
  • Το ιστόγραμμα της μεταβλητής ως προς τις πόλεις ή τις κομητείες αγνοώντας τις ακραίες τιμές (οριζόμενο από το χρήστη)
chist <-  function(data,value_col, adjust_max = FALSE, adjust_max_byCol = NULL) {
    dt_col <-data[[value_col]]
    
    if (adjust_max) {
      #Έλεγχος για adjust_max_byCol.
      if (is.null(adjust_max_byCol)) {
        stop("When adjust_max = TRUE, 'adjust_max_byCol' must be specified.")
      }
      #Καλούμε την plot_single_boxplot_outliers για την εύρεση των ακραίων τιμών.
      resultF <- plot_single_boxplot_outliers(data, value_col, adjust_max_byCol) 
      
      if (nrow(resultF$extreme_outliers) > 0){
        #ενημέρωση της μέγιστιης τιμής του εύρους με ακραίες τιμές.
        m <- tail(resultF$extreme_outliers[order(resultF$extreme_outliers$Value, decreasing = TRUE),][,2],1)
        } 
      else {
        m <- max(dt_col) #ενημέρωση της μέγιστιης τιμής του εύρους χωρίς ακραίες τιμές.
        }
  } else {
      m <- max(dt_col) #ενημέρωση της μέγιστιης τιμής του εύρους  χωρίς ακραίες τιμές. 
    }
     
    n <-min(dt_col) #ενημέρωση της ελάχιστης τιμής του μέγιστου στοιχείου.
    r <- m-n #Υπολογισμός εύρους.
    k <- 1 + 3.32*log10(length(dt_col)) #Sturges rule 
    cls <-r/k # Υπολογισμός πλάτους κλάσης.
    
    hp<-ggplot(data, aes(x = dt_col)) +
      geom_histogram(binwidth = cls , fill = "steelblue", color = "black", alpha = 0.8) +
      coord_cartesian(xlim = c(n, m)) +
      labs(title = paste("Distribution of",value_col), x = "", y = "Count"  ) +
      theme_minimal()
    
    return(hp)
}

Από τα ιστογράμματα των μεταβλητών που συμπεριλαμβάνουν τις ακραίες τιμές, παρατηρούμε ότι καμία μεταβλητή δεν ακολουθεί κανονική κατανομή και παρουσιάζουν ισχυρή θετική λοξότητα.
Στα ιστογράμματα των μεταβλητών που δεν συμπεριλαμβάνουν τις ακραίες τιμές, τα αποτελέσματα παραμένουν ίδια, ωστόσο υπάρχει μεγαλύτερη εξομάλυνση στην κατανομή των στοιχείων. Τα σχήματα των κατανομών, χωρίς τις ακραίες τιμές, είναι μονοκόρυφα με την ουρά προς τα δεξιά να φαίνεται πιο ήπια. Εξαίρεση αποτελεί το σχήμα της κατανομής χωρίς τις ακραίες τιμές για το συνδυασμό Violent crime - city διότι δεν διαφέρει αισθητά από το ιστόγραμμα με τις ακραίες τιμές.

chist(ca_offenses_by_city_upd,"Violent crime")

chist(ca_offenses_by_city_upd,"Violent crime",adjust_max = TRUE, adjust_max_byCol = 'City')

chist(ca_offenses_by_city_upd,"Population")

chist(ca_offenses_by_city_upd,"Population",adjust_max = TRUE, adjust_max_byCol = 'City')

chist(ca_offenses_by_county_upd,"Violent crime")

chist(ca_offenses_by_county_upd,"Violent crime",adjust_max = TRUE, adjust_max_byCol = 'County')

Spatial Analysis: i.Create a map displaying the distribution of crimes in California. You should use the appropriate csv file.

Για τη δημιουργία του γραφήματος χάρτη που περιέχει την κατανομή των εγκλημάτων στην πολιτεία της Καλιφόρνια πραγματοποιούμε πρώτα προετοιμασία των δεδομένων προς χρήση.

  1. Δημιουργούμε ένα νέο πίνακα, crime_by_CAcounty, όπου περιέχει το σύνολο των εγκλημάτων για κάθε κομητεία της Καλιφόρνια.

  2. Ορίζουμε τα ονόματα των στηλών του πίνακα, το σωστό τύπο δεδομένων για το σύνολο των εγκλημάτων, αφαιρούμε το χαρακτήρα “3” από τα ονόματα των κομητειών και τα μετατρέπουμε σε κεφαλαίους χαρακτήρες.

  3. Λαμβάνουμε και αποθηκεύουμε τα στοιχεία για το γεωγραφικό μήκος και πλάτος για τις κομητείες στο ca_counties.

  4. Η προετοιμασία ολοκληρώνεται με τη μετατροπή σε κεφαλαία γράμματα τα ονόματα των κομητειών και σε αυτό τον πίνακα, προκειμένου να τον συνδέσουμε με crime_by_CAcounty μέσω των ονομάτων.

Ο τελικός πίνακας που χρησιμοποιούμε είναι ο ca_map_data.

#Δημιουργία πίνακα με το σύνολο των εγκλημάτων ανά κομητεία.
crime_by_CAcounty <- as.data.frame(cbind(ca_offenses_by_county_upd[, 2], 
                                  rowSums(ca_offenses_by_county_upd[, 3:11], dims = 1)))
#Μετονομασία στηλών, καθορισμός σωστού τύπου δεδομένων και καθαρισμός και μετατροπή σε κεφαλαίους χαρακτήρες ονομάτων κομητειών.
colnames(crime_by_CAcounty) <- c("county", "ttl_crime")     
crime_by_CAcounty$ttl_crime <- as.numeric(crime_by_CAcounty$ttl_crime)
crime_by_CAcounty$county <- toupper(str_squish(gsub("3",'',crime_by_CAcounty$county)))

#Ενσωμάτωση στοιχείων κομητειών Καλιφόρνια με βάση το έτος 2024.
ca_counties <- counties(state = "CA", cb = TRUE, class = "sf", progress_bar = FALSE)


#Μετατροπή σε κεφαλαίους χαρακτήρες ονομάτων κομητειών.
ca_counties$NAME <- toupper(str_squish(ca_counties$NAME))

#Ένωση δεδομένων βάσει των ονομάτων των κομητειών.
ca_map_data <- left_join(ca_counties, crime_by_CAcounty, by = c("NAME" = "county"))

Από το χάρτη μπορούμε να εξάγουμε τα συμπεράσματα:

  • Οι κομητείες του νότιου τομέα της πολιτείας έχουν την υψηλότερη συγκέντρωση εγκλημάτων. Το Los Angeles έχει το μεγαλύτερο σύνολο και ακολουθούν το Kern, το Riverside, το San Diegro και το San Bernandino.

  • Οι κομητείες του κεντρικού τομέα της πολιτείας έχουν μικρότερη συγκέντρωση εγκλημάτων σε σχέση με το νότιο τομέα. Ωστόσο, και εδώ υπάρχουν κομητείες με αρκετά υψηλή εγκληματικότητα όπως το Sacramento, το Fresno και το San Joaquin.

  • Οι κομητείες του βόρειου τομέα της πολιτείας έχουν τη μικρότερη συγκέντρωση εγκλημάτων.

  • Για δύο κομητείες δεν μπορούμε να εξάγουμε κάποιο συμπέρασμα καθώς δεν έχουμε δεδομένα και αυτές είναι το Tulare και το San Francisco.

#Χάρτης
ggplot(ca_map_data) +
  geom_sf(aes(fill = ttl_crime), color = "gray20", size = 0.3) +
  geom_sf_text(data = ca_map_data, aes(label = NAME), size = 1.5, color = "black") +
  scale_fill_viridis_c(
    option = "viridis",
    na.value = "lightgray", 
    name = "Total Crimes",
    direction = -1
  ) +
  labs(
    title = "Crime Distribution in California by County",
    caption = "Source: ca_offenses_by_county.csv"
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, size = 8),
    legend.position = "right",
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 9),
    axis.title = element_blank(), 
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )
Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
give correct results for longitude/latitude data

Ερώτημα: Spatial Analysis: ii. Use graphs such as bar plots or pie charts to represent crime categories for the ca_offenses_by_county.csv.

Για τη δημιουργία του ραβδογράμματος που περιέχει την κατανομή των εγκλημάτων ανά κατηγορία στις κομητείες της Καλιφόρνια πραγματοποιούμε πρώτα προετοιμασία των δεδομένων προς χρήση.

  1. Δημιουργούμε ένα νέο πίνακα, crime_category_totals, όπου περιέχει το σύνολο των εγκλημάτων ανά κατηγορία εγκλήματος και προκύπτει από τον πίνακα ca_offenses_by_county_upd.

  2. Ορίζουμε τα ονόματα των στηλών, και το σωστό τύπο δεδομένων για το σύνολο των εγκλημάτων.

crime_category_totals <- as.data.frame(
                          cbind(as.vector(colnames(ca_offenses_by_county_upd[3:11]))
                                ,as.vector(sapply(ca_offenses_by_county_upd[3:11],sum))
                                )
                          )
colnames(crime_category_totals) <- c("Crime", "Total")
crime_category_totals$Total <- as.numeric(crime_category_totals$Total)

Από το ραβδόγραμμα παρατηρούμε:

  • Η κατηγορία με τα περισσότερα εγκλήματα στις κομητείες είναι το Property crime, με 105.500 εγκλήματα.
  • Την τριάδα της κορυφής συμπληρώνουν τα εγκλήματα Larceny theft και Burglary, με 60.626 και 32.380 εγγραφές, αντίστοιχα.
  • Βαριές κατηγορίες εγκλημάτων όπως Violent crime, Aggravated assault, Rape revised definition Manslaughter και nonnegligent manslaughter έχουν σύνολο 45.330 καταγγεγραμμένα περιστατικά.
ggplot(crime_category_totals, aes(x = reorder(Crime, -Total), y = Total, fill = Crime)) +
  geom_bar(stat = "identity" ) +
  geom_text(aes(label = number(Total, big.mark = ".",decimal.mark = ",", accuracy = 1)), vjust = -0.3, size = 3) +
  labs(
    title = "Crime Category (Total) by County",
    x = "", y = "Total"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "none")

Ερώτημα: Crime Analysis: i. Visualize the frequencies of different crime categories for the ca_offenses_by_city.csv.

Για τη δημιουργία του ραβδογράμματος που περιέχει τη συχνότητα των εγκλημάτων ανά κατηγορία στις πόλεις της Καλιφόρνια πραγματοποιούμε πρώτα προετοιμασία των δεδομένων προς χρήση.

  1. Δημιουργούμε ένα νέο πίνακα, crime_category_freq, όπου περιέχει το σύνολο, τη συχνότητα ανά κατηγορία εγκλήματος και προκύπτει από τον πίνακα ca_offenses_by_city_upd.

  2. ορίζουμε τα ονόματα των στηλών, και το σωστό τύπο δεδομένων για τις αριθμητικές μεταβλητές.

crime_category_freq <- as.data.frame(
  cbind(as.vector(colnames(ca_offenses_by_city_upd[3:11]))
        ,as.vector(sapply(ca_offenses_by_city_upd[3:11],sum))
        ,as.vector((sapply(ca_offenses_by_city_upd[3:11],sum)/sum(ca_offenses_by_city_upd[3:11]))*100)
  )
)
colnames(crime_category_freq) <- c("Crime", "Total", "Frequency")
crime_category_freq$Total <- as.numeric(crime_category_freq$Total)
crime_category_freq$Frequency <- as.double(crime_category_freq$Frequency,2)

Από το ραβδόγραμμα παρατηρούμε:

  • Το αποτέλεσμα του ραβδογράμματος των συχνοτήτων στις πόλεις είναι συνεπές ως προς τις τρεις (3) κυριότερες κατηγορίες εγκλημάτων.
  • Το Property crime είναι η μεγαλύτερη κατηγορία με περίπου 43% του συνόλου, ενώ ακολουθούν το Larceny theft και το Burglary με 28% και 8%, αντίστοιχα
  • Η μόνη αισθητή διαφορά σε σχέση με το ραβδόγραμμα του συνόλου των εγκλημάτων ανά κατηγορία στις κομητείες, είναι η θέση της κατηγορίας Motor vehicle theft. Στις πόλεις κατατάτεσεται στην τέταρτη θέση έναντι της έκτης θέσης στις κομητείες.
ggplot(crime_category_freq, aes(x = reorder(Crime, -Frequency), y = Frequency, fill = Crime)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(sprintf("%.1f", Frequency), "%")), size = 2, vjust = -0.5)+
  scale_y_continuous(labels = label_percent(scale = 1, decimal.mark = ",",suffix = " %")) +
  labs(
    title = "Crime Category (Frequency) by City",
    x = "", y = "Frequency"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1),legend.position = "none")

2. STATISTICAL ANALYSIS

Ερώτημα: Central Tendencies: Calculate mean, variance, standard deviation, skewness and kurtosis for each crime category for the ca_offenses_by_county.csv. Is the data distribution for each category a normal distribution?

Για την παρουσίαση των μέτρων κεντρικής θέσης και διασποράς ανά κατηγορία εγκλήματος δημιουργούμε ένα πίνακα που υπολογίζει σαν λίστα:

  • το μέσο όρο
  • τη διακύμανση
  • τη τυπική απόκλιση
  • την λοξότητα
  • την κύρτωση
    για κάθε κατηγορία εγκλήματος βάσει του πίνακα ca_offenses_by_county_upd.
#Δημιουργία πίνακα υποσυνόλου των αριθμητικών μεταβλητών για τις κατηγορίες εγκλημάτων.
crime_data <- ca_offenses_by_county_upd[,3:12]

#Υπολογισμός μέτρων κετρικής θέσης και διασποράς ανά κατηγορία εγκλήματος.
stats_results <- lapply(names(crime_data), function(col) {
  x <- crime_data[[col]]
  
  m <- mean(x, na.rm = TRUE)
  v <- var(x, na.rm = TRUE)
  s <- sd(x, na.rm = TRUE)
  sk <- skewness(x, na.rm = TRUE)
  kurt <- kurtosis(x, na.rm = TRUE)
  
  data.frame(
    Crime = col,
    Mean = round(m, 2),
    Variance = round(v, 2),
    SD = round(s, 2),
    Skewness = round(sk, 2),
    Kurtosis = round(kurt, 2)
    )
})

#Ενοποίηση των δεδομένων.
crime_stats_summary <- do.call(rbind, stats_results)
#Εκτύπωση του πίνακα με όλα τα στοιχεία ανά κατηγορία εγκλήματος.
knitr::kable(crime_stats_summary) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Crime Mean Variance SD Skewness Kurtosis
Violent crime 438.49 684063.33 827.08 4.16 21.96
Murder and nonnegligent manslaughter 6.61 204.92 14.32 4.95 30.77
Rape revised definition 32.39 2460.03 49.60 3.56 17.95
Robbery 81.72 44415.85 210.75 4.42 22.43
Aggravated assault 317.77 320481.71 566.11 4.02 21.32
Property crime 1850.88 8838627.72 2972.98 3.10 13.25
Burglary 568.07 666056.92 816.12 2.77 10.40
Larceny theft 1063.61 2670027.21 1634.02 2.95 12.07
Motor vehicle theft 219.19 424483.16 651.52 4.61 26.56
Arson 20.53 2594.33 50.93 4.22 21.00

Για τον έλεγχο, αν η κατανομή κάθε κατηγορίας εγκλήματος ακολουθεί την κανονική κατανομή, δημιουργούμε τα ιστόγραμμα των κατηγοριώ

  1. Με χρήση του κανόνα του Stuger για πλήθος 57 παρατηρήσεων, υπολογίζουμε πως θα χρειαστούμε 7 κλάσεις στο ιστόγραμμα κάθε κατηγορίας εγκλήματος.
#Κανόνας Stuger
StugerR =  (1 + 3.32 * log10(57))
StugerR
[1] 6.829505
  1. Παρατηρώντας τα ιστογράμματα των κατηγοριών μπορούμε να εξάγουμε το συμπέρασμα ότι καμία δεν ακολουθεί την κανονική κατανομή.
plot_data <- pivot_longer(ca_offenses_by_county_upd[3:12], 
                          cols = everything(), 
                          names_to = c("Crime"),
                          values_to = "Value")

#Ιστόγραμμα with bins = 7 
ggplot(plot_data, aes(x = Value)) +
  geom_histogram(aes(y = after_stat(density)), bins = 7 ,fill = "skyblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", size = 1) +
  facet_wrap(~ Crime, scales = "free", ncol = 3) +
  labs(
    title = "Distribution of Crime Categories",
    x = "", y = ""
  ) +
  theme_minimal() +
  theme(
  axis.title.y = element_blank(), 
  axis.text.y = element_blank(), 
  )

Το συμπέρασμά μας, ότι καμία κατηγορία εγκλήματος δεν ακολουθεί κανονική κατανομή, επιβεβαιώνεται και από τον έλεγχο της τιμής του p-value από το Shapiro-Wilk’s Test.

  1. Η μηδενική υπόθεση αυτού του τεστ είναι ότι ο πληθυσμός κατανέμεται κανονικά.
  2. Αν η τιμή p είναι μικρότερη από το επιλεγμένο επίπεδο alpha, τότε η μηδενική υπόθεση απορρίπτεται και υπάρχουν ενδείξεις ότι τα δεδομένα δεν κατανέμονται κανονικά.

Τέλος για λόγους παρουσίασης, ακολουθούν τα αποτελέσματα μόνο για τον έλεγχο της μεταβλητής Violent crime, ενώ τα αποτελέσματα για τις υπόλοιπες μεταβλητές παρατίθενται στο Παράρτημα.

#Ορισμός επιπέδου alpha.
alphalvl <- 0.05
#Shapiro-Wilk's Test
shapiro.test(ca_offenses_by_county_upd$`Violent crime`)$p < alphalvl
[1] TRUE
Ερώτημα: Correlations: Compute correlations between various numeric variables for the ca_offenses_by_county.csv.

Γνωρίζουμε ότι οι αριθμητικές μεταβλητές του αρχείου ca_offenses_by_county.csv, δεν ακολουθούν κανονική κατανομή, συνεπώς για τον υπολογισμό της συσχέτισης τους δεν χρησιμοποιούμε τη μέθοδο Pearson, αλλά τη μέθοδο Spearman.

Η μέθοδος Spearman:

  • ενδείκνυται για μη κανονικά κατανεμημένα δεδομένα.
  • μετράει μονοτονικές σχέσεις (δηλαδή, εάν μια μεταβλητή αυξάνεται, η άλλη αυξάνεται ή μειώνεται σταθερά).
  • χρησιμοποιεί την κατάταξη δεδομένων αντί για πρωτογενείς τιμές.
  • είναι αποδοτική στην ύπαρξη ακραίων τιμών.
#Πίνακας συσχετίσεων όλων των μεταβλητών.
corr_matrix <- round(cor(ca_offenses_by_county_upd[3:12], method = "spearman"),2)

knitr::kable(corr_matrix)%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Violent crime Murder and nonnegligent manslaughter Rape revised definition Robbery Aggravated assault Property crime Burglary Larceny theft Motor vehicle theft Arson
Violent crime 1.00 0.80 0.85 0.92 0.99 0.94 0.94 0.91 0.75 0.81
Murder and nonnegligent manslaughter 0.80 1.00 0.73 0.81 0.75 0.80 0.78 0.78 0.68 0.58
Rape revised definition 0.85 0.73 1.00 0.82 0.80 0.83 0.84 0.81 0.67 0.67
Robbery 0.92 0.81 0.82 1.00 0.88 0.95 0.92 0.93 0.76 0.75
Aggravated assault 0.99 0.75 0.80 0.88 1.00 0.91 0.91 0.89 0.73 0.79
Property crime 0.94 0.80 0.83 0.95 0.91 1.00 0.97 0.99 0.79 0.73
Burglary 0.94 0.78 0.84 0.92 0.91 0.97 1.00 0.95 0.72 0.72
Larceny theft 0.91 0.78 0.81 0.93 0.89 0.99 0.95 1.00 0.77 0.71
Motor vehicle theft 0.75 0.68 0.67 0.76 0.73 0.79 0.72 0.77 1.00 0.71
Arson 0.81 0.58 0.67 0.75 0.79 0.73 0.72 0.71 0.71 1.00
#Αναδιαταγμένςο πίνακας συσχετίσεων όλων των μεταβλητών.
melted_corr_matrix <- melt(corr_matrix)
knitr::kable(head(melted_corr_matrix,5), col.names = c("Variable 1", "Variable 2", "Correlation"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable 1 Variable 2 Correlation
Violent crime Violent crime 1.00
Murder and nonnegligent manslaughter Violent crime 0.80
Rape revised definition Violent crime 0.85
Robbery Violent crime 0.92
Aggravated assault Violent crime 0.99

Επιλέγουμε να μελετήσουμε τις 3 μεταβλητές με την υψηλότερη συσχέτιση και τις 3 μεταβλητές με την χαμηλότερη συσχέτιση.

  1. Από τον αναδιαταγμένο πίνακα συσχετίσεων αφαιρούμε τις συσχετίσεις των μεταβλητών με τον εαυτό τους.
  2. Δημιουργούμε τα ζευγάρια των μεταβλητών.
  3. Αφαιρούμε τις διπλές εγγραφές για ζευγάρια μεταβλητών, το Α_Β είναι ίδιο με το Β_Α.
  4. Αποθηκεύουμε στον πίνακα top3, τις 3 μεταβλητές με την υψηλότερα παρατημένη συσχέτιση.
  5. Αποθηκεύουμε στον πίνακα bottom3, τις 3 μεταβλητές με τη χαμηλότερα παρατημένη συσχέτιση.
#Απομόνωση στοίχειων διαγωνίου πίνακα συσχετίσεων.
melted_corr_matrix_3 <- melted_corr_matrix[melted_corr_matrix$Var1 != melted_corr_matrix$Var2, ]
#Αναγνώριση ζεύγων μεταβλητών στον πίνακα συσχετίσεων.
melted_corr_matrix_3$pair <- apply(melted_corr_matrix_3[, 1:2], 1,  function(x) paste(sort(x), collapse = "_"))
#Αφαιρεση ζεύγων μεταβλητών στον πίνακα συσχετίσεων.
melted_corr_matrix_3 <- melted_corr_matrix_3[!duplicated(melted_corr_matrix_3$pair), ]
#Ταξινόμηση κατά απόλυτη τιμή συσχέτισης.
melted_corr_matrix_3 <- melted_corr_matrix_3[order(abs(melted_corr_matrix_3$value), decreasing = TRUE), ]

Για τις 3 υψηλότερα συσχετισμένες μεταβλητές παρατηρούμε:

  • Τα ζευγάρια είναι Aggravated assault - Violent crime, Larceny theft - Property crime, και Burglary -Property crime.
  • Υπερβολικά θετική συσχέτιση σχεδόν ίση με τη μονάδα.
  • Ισχυρό ενδεχόμενο, που χρειάζεται περαιτέρω διερεύνησης για επαλήθευση, αυτές οι κατηγορίες εγκλήματος να τελούνται ταυτόχρονα.
#Οι 3 υψηλότερα συσχετισμένες μεταβλητές.
top3 <- head(melted_corr_matrix_3, 3)[, c("Var1", "Var2", "value")]
             
knitr::kable(top3, col.names = c("Variable 1", "Variable 2", "Correlation"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed")) 
Variable 1 Variable 2 Correlation
5 Aggravated assault Violent crime 0.99
58 Larceny theft Property crime 0.99
57 Burglary Property crime 0.97

Για τις 3 λιγότερο συσχετισμένες μεταβλητές παρατηρούμε:

  • Τα ζευγάρια είναι Motor vehicle theft - Rape revised definition, Arson - Rape revised definition, Arson - Murder and nonnegligent manslaughter.
  • Υψηλή θετική συσχέτιση μεταξύ 0.58 και 0.67.
  • Πιθανό ενδεχόμενο, που χρειάζεται περαιτέρω διερεύνησης για επαλήθευση, αυτές οι κατηγορίες εγκλήματος να τελούνται ταυτόχρονα.
#Οι 3 λιγότερο συσχετισμένες μεταβλητές.
bottom3 <- tail(melted_corr_matrix_3, 3)[, c("Var1", "Var2", "value")]

knitr::kable(bottom3, col.names = c("Variable 1", "Variable 2", "Correlation"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed")) 
Variable 1 Variable 2 Correlation
29 Motor vehicle theft Rape revised definition 0.67
30 Arson Rape revised definition 0.67
20 Arson Murder and nonnegligent manslaughter 0.58

Επιλέγουμε να δημιουργήσουμε:

  1. Τα γραφήματα διασποράς για τις 3 υψηλότερα συσχετισμένες και τις 3 λιγότερο συσχετισμένες μεταβλητές με τη χρήση της συνάρτησης cCorPlt.

Η cCorPlt δέχεται ως όρισματα:

  • (Υποχρεωτικό) το όνομα του σετ δεδομένων που θέλουμε να ελέγξουμε
  • (Υποχρεωτικό) τα ονόματα των δύο μεταβλητών που θέλουμε να ελέγξουμε

Η συνάρτηση επιστρέφει το διάγραμμα διασποράς των δύο αυτών μεταβλητών.

  1. Τη γραφική απεικόνιση του πίνακα συσχετίσεων για όλες τις μεταβλητές.
#Δημιουργία συνάρτησης για την εκτύπωση του διαγράματος διασποράς 2 μεταβλητών.
cCorPlt <- function(data,v1,v2){
  
  plot(data[[v1]],data[[v2]],
       main = paste("Συσχέτιση",v1,"και",v2),
       xlab = "",
       ylab = "",
       col = c("red", "blue"),
       pch = c(19,8)
  )
  
  legend("topright", legend = c(v1, v2), col = c("red", "blue"),
         pch = c(19, 8), title = "Μεταβλητές")
  
}

Τα διαγράμματα διασποράς για τις 3 πιο ισχυρά συσχετιζόμενες μεταβλητές.

cCorPlt(ca_offenses_by_county_upd, "Aggravated assault", "Violent crime") 

cCorPlt(ca_offenses_by_county_upd, "Larceny theft", "Property crime") 

cCorPlt(ca_offenses_by_county_upd, "Burglary", "Property crime") 

Τα διαγράμματα διασποράς για τις 3 πιο ασθενώς συσχετιζόμενες μεταβλητές.

cCorPlt(ca_offenses_by_county_upd, "Motor vehicle theft", "Rape revised definition")

cCorPlt(ca_offenses_by_county_upd, "Arson", "Rape revised definition")

cCorPlt(ca_offenses_by_county_upd, "Arson", "Murder and nonnegligent manslaughter")

Τα αποτελέσματα είναι συνεπή όπως φαίνεται και στον πίνακα συσχετίσεων για όλες τις μεταβλητές.

#Δίαγραμμα συσχετίσεων όλων των μεταβλητών.
ggplot(data = melted_corr_matrix, aes(x=Var1, y=Var2, fill=value)) + 
  geom_tile() +
  labs( x = "", y = "")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Ερώτημα: What are the most common types of crimes in California? Are there certain crimes that are more common in a particular place category, such as a college/university campus, compared to the rest of the state? You can extract this information from the ca_offenses_by_campus.csv

Φορτώνουμε το νέο αρχείο δεδομένων, ca_offenses_by_campus.csv, και θα προβούμε σε κάποιες αρχικές ενέργειες καθαρισμού και μορφοποίησης των δεδομένων. Οι ενέργειες καθαρισμού και μορφοποίησης περιλαμβάνουν:

  • αφαίρεση του χαρακτήρα “.” από τους τίτλους των μεταβλητών
  • αφαίρεση του χαρακτήρα “4” από τα στοιχεία των ποιοτικών μεταβλητών
  • μετατροπή των ποιοτικών μεταβλητών σε χαρακτήρες
  • αφαίρεση του χαρακτήρα “,” από τα στοιχεία των αριθμητικών μεταβλητών
  • μετατροπή των αριθμητικών μεταβλητών από χαρακτήρες σε νούμερα
dsPath5 <- "./ca_offenses_by_campus.csv"

#ca_offenses_by_campus
{
  ca_offenses_by_campus <- read.csv(dsPath5, header = TRUE, sep = ",")
  #Καθαρισμός των ονομάτων των στηλών από τελείες "." και κενά στην αρχή και στο τέλος του κάθε ονόματος.
  colnames(ca_offenses_by_campus) <- str_squish(gsub('\\.',' ',colnames(ca_offenses_by_campus)))  

  #Αφαίρεση του χαρακτήρα "4", όπου υπάρχει, και μετατροπή στο σωστό είδος μεταβλητής.
  for (i in 1:2)
    ca_offenses_by_campus[,i] <- as.character(gsub("4","",ca_offenses_by_campus[,i]))  
  
  #Αφαίρεση του χαρακτήρα "," (κόμμα) για την ακριβής μετατροπή των χαρακτήρων σε αριθμούς  
  #και ορισμός του αριθμητικού είδους της μεταβλητής.
  for (i in 3:ncol(ca_offenses_by_campus))
    ca_offenses_by_campus[,i] <- as.numeric(gsub(",","",ca_offenses_by_campus[,i])) 
}

Ελέγχουμε το ca_offenses_by_campus για κενές ή απολεσμένες τιμές με χρήση της συνάρτησης summarize_NA_and_empty.

Παρατηρούμε ότι:

  • 1 πλήρως κενή μεταβλητή, “Rape legacy definition”
  • 5 εγγραφές κενές/απολεσμένες σε όλες τις μεταβλητές, με εξαίρεση τις “Campus” και “Student enrollment”, που έχουν από 1 και 19 επιπλέον, αντίστοιχα.
knitr::kable(summarize_NA_and_empty(ca_offenses_by_campus)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
University College 49 5 54 90.74
Campus 30 24 54 55.56
Student enrollment 48 6 54 88.89
Violent crime 49 5 54 90.74
Murder and nonnegligent manslaughter 49 5 54 90.74
Rape revised definition 49 5 54 90.74
Rape legacy definition 0 54 54 0.00
Robbery 49 5 54 90.74
Aggravated assault 49 5 54 90.74
Property crime 49 5 54 90.74
Burglary 49 5 54 90.74
Larceny theft 49 5 54 90.74
Motor vehicle theft 49 5 54 90.74
Arson 49 5 54 90.74

Δημιουργούμε ένα καθαρό πίνακα, ca_offenses_by_campus_upd όπου:

  • αφαιρούμε τη μεταβλητή “Rape legacy definition” από το ca_offenses_by_campus
  • αφαιρούμε τις 5 κενές γραμμές από όλες τις μεταβλητές του ca_offenses_by_campus
  • διατηρούμε τη μεταβλητή Campus διότι δεν θα τη χρησιμοποιήσουμε
  • αντικαθιστούμε με τη μέση τιμή στην επιπλέον κενή τιμή της μεταβλητής “Student enrollment”
ca_offenses_by_campus_upd <- cbind(ca_offenses_by_campus[1:49,1:6],ca_offenses_by_campus[1:49,8:14])

ca_offenses_by_campus_upd$`Student enrollment`[is.na(ca_offenses_by_campus_upd$`Student enrollment`)==TRUE] <- mean(ca_offenses_by_campus_upd$`Student enrollment`,na.rm =TRUE) 
#Επανάληψη του ελέγχου στο νέο σετ δεδομέν ca_offenses_by_campus_upd.

knitr::kable(summarize_NA_and_empty(ca_offenses_by_campus_upd)) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
University College 49 0 49 100.00
Campus 30 19 49 61.22
Student enrollment 49 0 49 100.00
Violent crime 49 0 49 100.00
Murder and nonnegligent manslaughter 49 0 49 100.00
Rape revised definition 49 0 49 100.00
Robbery 49 0 49 100.00
Aggravated assault 49 0 49 100.00
Property crime 49 0 49 100.00
Burglary 49 0 49 100.00
Larceny theft 49 0 49 100.00
Motor vehicle theft 49 0 49 100.00
Arson 49 0 49 100.00

Δημιουργούμε συγκεντρωτικό πίνακα με το σύνολο των εγκλημάτων ανά κατηγορία στους πανεπιστημιακούς χώρους.

crime_category_campus_totals <- as.data.frame(
  cbind(as.vector(colnames(ca_offenses_by_campus_upd[4:13]))
        ,as.vector(sapply(ca_offenses_by_campus_upd[4:13],sum))
  )
)
colnames(crime_category_campus_totals) <- c("Crime", "Total")
crime_category_campus_totals$Total <- as.numeric(crime_category_campus_totals$Total)

Τέλος συνδυάζουμε τα δεδομένα του συνόλου των εγκλημάτων στις κομητείες με αυτά που μόλις υπολογίσαμε για τους πανεπιστημιακούς χώρους.

#Προσθήκη στήλης για την αναγνώριση δεδομένων σε κοινό γράφημα.
crime_category_totals$Source <- "Counties"
crime_category_campus_totals$Source <- "Universities"

#Συνδυασμός δεδομένων για απεικόνιηση.
combined_crime_totals <- rbind(crime_category_totals, crime_category_campus_totals)
combined_crime_totals$Total <- as.numeric(combined_crime_totals$Total)

Από το συνδυασμό των δεδομένων πανεπιστημίων με αυτά από τις κομητείες, παρατηρούμε ότι:

  • και στα πανεπιστήμια οι πιο συχνές κατηγορίες εγκλημάτων είναι Property crime, Larceny theft, Burglary, Violent crime.
  • η κατηγορία Motor vehicle theft, είναι υψηλότερα στην κατανομή των πανεπιστημίων (πέμπτη θέση στο σύνολο), ενώ στις κομητείες η ίδια κατηγορία είναι στην έκτη θέση του συνόλου.
  • ορισμένες κατηγορίες εγκλημάτων δεν έχουν παρατηρηθεί σε πανεπιστήμια όπως arson, murder and nonnegligent manslaughter
#Κοινό ραβδόγραμμα
ggplot(combined_crime_totals, aes(x = Crime, y = Total, fill = Source)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(
    aes(label = number(Total, big.mark = ".", decimal.mark = ",", accuracy = 1)),
    position = position_dodge(width = 0.7),
    vjust = -0.3, size = 3
  ) +
  labs(
    title = "Crime Totals by Category: Counties vs Universities",
    x = "" , y = ""
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
  )

Ερώτημα: Visualize the 10 most populous cities of California. Compare the crime rates (total number of crimes in each city) of each of these cities. Do you discover a correlation between population and crime rate?

Δημιουργούμε ένα πίνακα με το σύνολο των εγκλημάτων για όλες τις κατηγορίες στις 10 πολυπληθέστερες πόλεις.

#Υπολογισμός 10 πολυπληθέστεων πόλεων.
top10_cities_by_pop <- ca_offenses_by_city_upd %>%
                      arrange(desc(Population)) %>%
                      slice(1:10)


#Υπολογισμός συνολικών εγκλημάτων για τις 10 πολυπληθέστερες πόλεις.
top10_cities_by_pop <- top10_cities_by_pop %>%
                      rowwise() %>%
                      mutate(Total_Crimes = sum(c_across(3:12))) %>%
                      ungroup()

To ραβδόγραμμα του συνολικού αριθμού εγκλημάτων για τις 10 πολυπληθέστερες πόλεις δείχνει συσχέτιση των εγκλημάτων με τον πληθυσμό.

#Ραβδόγραμμα συνολικών εγκλημάτων για τις 10 πολυπληθέστερες πόλεις.
ggplot(top10_cities_by_pop, aes(x = reorder(City, -Total_Crimes), y = Total_Crimes, fill = City)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = Total_Crimes), size = 2, vjust = -0.5)+
   labs(title = "Total Crimes in the 10 Most Populous California Cities",
      x = "", y = "") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)
        ,legend.position = "none")

Η δυνατή θετική συσχέτιση επιβεβαιώνεται και από τον έλεγχο συσχέτισης μεταξύ των δύο μεταβλητών. Χρησιμοποιούμε τη μέθοδο Spearman, όπως και προηγουμένως, διότι οι μεταβλητές δεν ακολουθούν κανονική κατανομή.

shapiro.test(top10_cities_by_pop$Population)$p <0.05
[1] TRUE
shapiro.test(top10_cities_by_pop$Total_Crimes)$p <0.05
[1] TRUE
cor(top10_cities_by_pop$Population, top10_cities_by_pop$Total_Crimes, method = "spearman")  
[1] 0.8060606
Ερώτημα: How does the number of law enforcement officers compare to the crime rates (total number of crimes in each city) of the 10 most populous cities?

Δημιουργούμε ένα πίνακα με το σύνολο των ένστολων στις 10 πολυπληθέστερες πόλεις, συνδυάζοντας τον πίνακα που δημιουργούμε στο προηγούμενο βήμα για τις 10 πόλεις.

#Βεβαιωνόμαστε πως και οι 2 στήλες στον εκάστοτε πίνακα δεν έχουν κενά και αφαιρούμε το χαρακτήρα "3".
top10_cities_by_pop$City <- str_squish(gsub("3",'',top10_cities_by_pop$City))
ca_law_enforcement_by_city$City <- str_squish(ca_law_enforcement_by_city$City)

#Ενώνουμε τους 2 πίνακες στη στήλη City. 
crime_vs_officers10 <- inner_join(top10_cities_by_pop, 
                               ca_law_enforcement_by_city[, c("City", "Total officers")], 
                               by = "City")

Παρατηρούμε πως ο αριθμός των ένστολων αυξάνεται παράλληλα με τον αριθμό των εγκλημάτων.

knitr::kable(crime_vs_officers10[, c("City", "Population", "Total_Crimes", "Total officers")], col.names = c("City", "Population", "Total Crimes", "Total officers"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
City Population Total Crimes Total officers
Los Angeles 3962726 238449 9863
San Diego 1400467 69654 1887
San Jose 1031458 56963 939
San Francisco 863782 119730 2236
Fresno 520837 49209 702
Sacramento 489717 40364 646
Long Beach 476318 34275 771
Oakland 419481 61417 734
Bakersfield 373887 35077 388
Anaheim 349471 22646 399

Η παρατήρηση επιβεβαιώνεται και από τον υπολογισμό της συσχέτιση μεταξύ των δύο μεταβλητών, 0.83.

shapiro.test(crime_vs_officers10$Total_Crimes)$p <0.05
[1] TRUE
shapiro.test(crime_vs_officers10$`Total officers`)$p <0.05
[1] TRUE
cor(crime_vs_officers10$`Total officers`, crime_vs_officers10$Total_Crimes, method = "spearman")
[1] 0.830303
ggplot(crime_vs_officers10, aes(x = `Total officers`, y = Total_Crimes)) +
  geom_point(color = "darkgreen", size = 3) +
  geom_text(aes(label = City),vjust = -0.5, size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = "Crime vs. Law Enforcement Officers (Top 10 Cities)",
       x = "Total Law Enforcement Officers", y = "Total Crimes") +
  theme_minimal()

Ερώτημα: Is the ratio similar throughout the next 10 most populous cities (No 11 to 20)?

Με την ίδια διαδικασία που δημιουργήσαμε τους πίνακες για τις 10 πολυπληθέστερες και τους ένστολους που εργάζονται σε αυτές, δημιουργούμε και για τις επόμενες 10, δηλαδή τις 11-20 πολυπληθέστερες πόλεις.

#Πόλεις 11 με 20 σε αριθμό πληθυσμού. 
next10_cities_by_pop <- ca_offenses_by_city_upd %>%
                    arrange(desc(Population)) %>%
                    slice(11:20)
#Σύνολο εγκλημάτων στις πόλεις 11 με 20 σε αριθμό πληθυσμού.
next10_cities_by_pop <- next10_cities_by_pop %>%
                    rowwise() %>%
                    mutate(Total_Crimes = sum(c_across(3:12), na.rm = TRUE)) %>%
                    ungroup()

#Αφαιρούμε το χαρακτήρα "3" και καθαρίζουμε τα κενά.
next10_cities_by_pop$City <- str_squish(gsub("3",'',next10_cities_by_pop$City))

#Ενώνουμε τους 2 πίνακες στη στήλη City. 
crime_vs_officers_20 <- inner_join(next10_cities_by_pop, 
                             ca_law_enforcement_by_city[, c("City", "Total officers")], 
                             by = "City")

Υπολογίζουμε το ποσοστό εγκλημάτων ανά ένστολο για τα δύο σύνολα των πόλεων, 10 πρώτες πολυπληθέστερες και 10 επόμενες και τα συνδυάζουμε σε ένα πίνακα.

#Ποσοτό για τις 10 πρώτες πολυπληθέστερες.
crime_vs_officers10 <-crime_vs_officers10 %>%
                    mutate(
                      Crimes_per_Officer = Total_Crimes / `Total officers`
                    )
#Ποσοτό για τις 10 επόμενες πολυπληθέστερες.
crime_vs_officers_20 <-crime_vs_officers_20 %>%
                    mutate(
                      Crimes_per_Officer = Total_Crimes / `Total officers`
                    )

#Ενωποίηση δεδομένων για τη δημιουργία γραφημάτων.
combined_crime_vs_officers <- rbind(
                          crime_vs_officers10 %>% mutate(Group = "Top 10"),
                          crime_vs_officers_20 %>% mutate(Group = "Next 10")
                        )

Από το θηκόγραμμα μεταξύ του ποσοστού εγκλημάτων ανά ένστολο μεταξύ των δύο δειγμάτων πόλεων εξάγουμε τα παρακάτω συμπεράσματα:

  • Οι 11-20 πολυπληθέστερες πόλεις έχουν υψηλότερο αριθμό εγκλημάτων που αντιμετωπίζουν οι ένστολοι, καθώς η γραμμή του Q2 είναι υψηλότερα.
  • Το εύρος των δύο θηκογράμμων διαφέρει αισθητά, θεωρούμε πως οι ένστολοι των 10 πολυπληθέστερων πόλεων διαχειρίζονται παρόμοιες κατηγορίες εγκλημάτων σε σχέση με τους συναδέλφους τους στις επόμενες 10 πολυπληθέστερες πόλεις.
  • Δεν παρατηρείται η ύπαρξη ακραίων τιμών για κανένα από τα δύο σύνολα.
#Θηκόγραμμα
ggplot(
    combined_crime_vs_officers %>%
      mutate(Group = factor(Group, levels = c("Top 10", "Next 10"))) %>%
      pivot_longer(cols = c("Total_Crimes", "Total officers"), names_to = "Metric", values_to = "Value"),
    aes(x = Group, y = Crimes_per_Officer, fill = Group)) +
    geom_boxplot() +
    labs(title = "Crimes per Officer: Top 10 vs. Next 10 Most Populous Cities",
         x = "", y = "Crimes per Officer") +
    theme_minimal()

3. FREQUENCY TABLE & CLASSIFICATION WITH NAIVE BAYES

Ερώτημα:Use the appropriate plot to visualize the frequency of the crimes by day

Φορτώνουμε το νέο αρχείο δεδομένων στον πίνακα sf_crime_cls, και πραγματοποιούμε το μετασχηματισμό της στήλης των ημερών για να αποτυπώσουμε την ιεραρχία τους. τέλος, ελέγχουμε για κενές ή απολεσμένες τιμές.

dsPath6 <- "./train.csv"

#sf_crime_cls
{
  sf_crime_cls <- read.csv(dsPath6, header = TRUE, sep = ",")
  #Καθορισμός ιεραρχίας ημερών.
  sf_crime_cls$DayOfWeek <- factor(sf_crime_cls$DayOfWeek, 
                             levels = c("Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday", "Sunday"))
}

#Έλεγχος για κενές ή απολεσμένες τιμές στις μεταβλητές. 
knitr::kable(summarize_NA_and_empty(sf_crime_cls) )%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Column Non_Empty_Count Missing_or_Empty_Count Total_Elements Percentage_Filled
Dates 878049 0 878049 100
Category 878049 0 878049 100
Descript 878049 0 878049 100
DayOfWeek 878049 0 878049 100
PdDistrict 878049 0 878049 100
Resolution 878049 0 878049 100
Address 878049 0 878049 100
X 878049 0 878049 100
Y 878049 0 878049 100

Εν συνεχεία, πραγματοποιούμε ομαδοποίηση των δεδομένων ως προς τις ημέρες της εβδομάδας και παρατηρούμε από το γράφημα ότι η ημέρα με την υψηλότερα καταγεγραμμένη εγκληματικότητα είναι η Παρασκευή. Ακολουθούν η Τετάρτη και το Σάββατο, ενώ ο χαμηλότερος αριθμός εγκλημάτων παρατηρείται τις Κυριακές.

#Άθροιση εγκληματικότητας ανά ημέρα της εβδομάδας.
sf_crime_per_day <- sf_crime_cls %>%
               count(DayOfWeek)

#Γράφημα
ggplot(sf_crime_per_day, aes(x = DayOfWeek, y = 1, fill = n)) +
  geom_tile() +
  geom_text(aes(label =n)) +
  scale_fill_viridis_c(option = "plasma") +
  labs(
    title = "Weekday Crime Frequency in California",
    x = "", y = "", fill = "Total Crimes"
  ) +
  theme_minimal() +
  theme(axis.text.y = element_blank(),
        axis.ticks.y = element_blank())

Ερώτημα:Construct the Frequent Table for the frequency of the crimes by day

Ο πίνακας συχνοτήτων για τις ημέρες της εβδομάδας.

sf_crime_freq_tbl <- sf_crime_cls %>%
  count(DayOfWeek) %>%
  mutate(Relative_Frequency = round(n / sum(n) * 100, 2)) %>%
  arrange(-desc(Relative_Frequency))%>%
  mutate(
    Cumulative_n = cumsum(n),
    Cumulative_Relative_Frequency = round(cumsum(Relative_Frequency), 2)
  )
knitr::kable(sf_crime_freq_tbl, col.names = c("Day of Week","Frequency","Relative Frequency",
                                              "Cumulative Frequency","Cumulative Relative Frequency") )%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Day of Week Frequency Relative Frequency Cumulative Frequency Cumulative Relative Frequency
Sunday 116707 13.29 116707 13.29
Monday 121584 13.85 238291 27.14
Tuesday 124965 14.23 363256 41.37
Thursday 125038 14.24 488294 55.61
Saturday 126810 14.44 615104 70.05
Wednesday 129211 14.72 744315 84.77
Friday 133734 15.23 878049 100.00
Ερώτημα:Data Preparation for the Classification: Encode categorical variables and perform Future Selection in order to select the best (independent) variables for your model

Οι κατηγορικές μεταβλητές, οι οποίες θα πρέπει να κωδικοποιηθούν είναι:

  1. DayOfWeek
  2. PdDistrict
  3. Resolution
  4. Descript
  5. Category
#Κωδικοποιήση DayOfWeek
sf_crime_cls$DayOfWeekNum <- as.numeric(sf_crime_cls$DayOfWeek)

#Κωδικοποιήση PdDistrict
sf_crime_cls$PdDistrict <- factor(sf_crime_cls$PdDistrict)
sf_crime_cls$PdDistrictNum <- as.numeric(sf_crime_cls$PdDistrict)

#Κωδικοποιήση Resolution
sf_crime_cls$Resolution <- factor(sf_crime_cls$Resolution)
sf_crime_cls$ResolutionNum <- as.numeric(sf_crime_cls$Resolution)

#Κωδικοποιήση Descript
sf_crime_cls$Descript <- factor(sf_crime_cls$Descript)
sf_crime_cls$DescriptNum <- as.numeric(sf_crime_cls$Descript)

#Κωδικοποιήση Category (εξαρτημένη μεταβλητή)
sf_crime_cls$Category <- factor(sf_crime_cls$Category)
sf_crime_cls$CategoryNum <- as.numeric(sf_crime_cls$Category)

Ελέγχουμε για την ύπαρξη κενών ή απολεσμένων τιμών στον πίνακα με τις κωδικοποιημένες μεταβλητές που θα χρησιμοποιήσουμε για την εκπαίδευση και τον έλεγχο του μοντέλου.

sf_crime_cls_Outcome <- sf_crime_cls  %>%
  select(CategoryNum
         ,DayOfWeekNum
         ,PdDistrictNum
         ,DescriptNum
         ,ResolutionNum 
         ,X
         ,Y)

knitr::kable(colSums(is.na(sf_crime_cls_Outcome)), col.names = c("Variable", "NA-Empty Values") )%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable NA-Empty Values
CategoryNum 0
DayOfWeekNum 0
PdDistrictNum 0
DescriptNum 0
ResolutionNum 0
X 0
Y 0

Λόγω του μεγάλου αριθμού εγγραφών που έχει το αρχικό σετ δεδομένων, θα περιοριστούμε σε ένα υποσύνολο 2400 εγγραφών και στοχεύουμε στην αναζήτηση 3 κατηγοριών εγκλημάτων. Συνεπώς, θα αναγνωρίσουμε τις κατηγορίες εγκλημάτων που να έχουν τουλάχιστον 800 εγγραφές και να κρατήσουμε 3 από αυτές ώστε το υποσύνολο των δεδομένων να μην είναι μεροληπτικό.

Οι πληροφορίες αυτές αποθηκεύονται στον πίνακα sf_crime_cls_subset2400_Outcome.

sf_crime_cls_noOutcome <- sf_crime_cls_Outcome[,-1]

#Εύρεση κατηγοριών με τουλάχιστον 800 εγγραφές
sf_crime_cls_cats <- sf_crime_cls_Outcome %>%
                          count(CategoryNum) %>%
                          filter(n >= 800) %>%
                          arrange(desc(n))

#Αποθήκευση των 3 μεγαλύτερων κατηγοριών εγκλημάτων με τουλάχιστον 800 εγγραφές 
sf_top3 <- head(sf_crime_cls_cats$CategoryNum,3)

#Δημιουργία υποσυνόλου δεδομένων με 2400 εγγραφές για 3 κατηγορίες εγκλημάτων
sf_crime_cls_subset2400_Outcome <- as.data.frame(sf_crime_cls_Outcome %>%
                                filter(CategoryNum %in% sf_top3) %>%
                                group_by(CategoryNum) %>%
                                slice_sample(n = 800) %>%
                                ungroup())

Στη συνέχεια, για να αποφασίσουμε ποιες μεταβλητές είναι κατάλληλες ως ανεξάρτητες θα ελέγξουμε το διάγραμμα συσχετίσεων των κωδικοποιημένων μεταβλητών.

#Υποσύνολο χωρίς εξατημένη μεταβλητή,
sf_crime_cls_subset2400_noOutcome <- sf_crime_cls_subset2400_Outcome[,-1]

#πίνακας συσχετίσεων,
sf_corr_mat2400 <- round(cor(sf_crime_cls_subset2400_noOutcome),2) 

#Αναδιάταξη πίνακα συσχετίσεων,
sf_melted_corr_mat2400 <- melt(sf_corr_mat2400)

#διάγραμμα συσχετίσεων
ggplot(sf_melted_corr_mat2400, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile() +
  geom_text(aes(label = value), size = 3) +
  scale_fill_gradient2(low = "red", mid = "white", high = "blue", midpoint = 0) +
  labs(title = "Correlation Heatmap ",
       x = NULL, y = NULL, fill = "Correlation") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Οι ανεξάρτητες μεταβλητές που θα χρησιμοποιηθούν είναι οι DayOfWeekNum, PdDistrictNum ,DescriptNum, ResolutionNum, X, Y, ενώ η εξαρτημένη μεταβλητή είναι η CategoryNum. .

Ερώτημα:Train and Evaluate your model’s performance (using the test set provided to you)

Ο κατηγοριοποιητής που θα χρησιμοποιήσουμε για την αναγνώριση των 3 κατηγοριών εγκλημάτων είναι αυτό του Naive Bayes.
Προτού ξεκινήσουμε την εκπαίδευση και τον έλεγχο του μοντέλου διαχωρίσουμε τα δεδομένα με τον κανόνα 80% των δεδομένων να χρησιμοποιούνται για εκπαίδευση και 20% για έλεγχο. Επίσης, κανονικοποιούμε τις τιμές των μεταβλητών πριν την πραγματοποίηση της εκπαίδευσης του μοντέλου

set.seed(123)  

#Διαχωρισμός υποσυνόλου σετ δεδομένων με τον κανόνα 80/20 train/test
split_index2400 <- createDataPartition(sf_crime_cls_subset2400_Outcome$CategoryNum, p = 0.8, list = FALSE)

#Δημιουργία υποσυνόλου train, test
train_set2400 <- sf_crime_cls_subset2400_Outcome[split_index2400, ]
test_set2400  <- sf_crime_cls_subset2400_Outcome[-split_index2400, ]

#Διαχωρισμός στόχου και μεταβλητών πρόβλεψης για υποσύνιλο train, test
train_data_sf2400 <- train_set2400[, -1] 
train_data_cat2400 <- as.factor(train_set2400[, 1])   #train στόχος

test_data_sf2400 <- test_set2400[, -1] 
test_data_cat2400 <- as.factor(test_set2400[, 1]) #test στόχος

#Κανονικοποίηση των μεταβλητών πρόβληψης για train, test
train_data_sf_after_scale2400 <- scale(train_data_sf2400)
test_data_sf_after_scale2400 <- scale(test_data_sf2400)

Εκπαιδεύουμε το μοντέλο με το σετ δεδομένων train_data_sf_after_scale2400.

#Εκπαίδευση μοντέλου με το train δείγμα των δεδομένων
model2400 = train(train_data_sf_after_scale2400,as.factor(train_data_cat2400),'nb',trControl=trainControl(method='cv',number=10))
print(model2400)
Naive Bayes 

1920 samples
   6 predictor
   3 classes: '17', '21', '22' 

No pre-processing
Resampling: Cross-Validated (10 fold) 
Summary of sample sizes: 1729, 1728, 1728, 1728, 1728, 1728, ... 
Resampling results across tuning parameters:

  usekernel  Accuracy   Kappa    
  FALSE      0.5817684  0.3723962
   TRUE      0.7718682  0.6578306

Tuning parameter 'fL' was held constant at a value of 0
Tuning
 parameter 'adjust' was held constant at a value of 1
Accuracy was used to select the optimal model using the largest value.
The final values used for the model were fL = 0, usekernel = TRUE and adjust
 = 1.

Η εκπαίδευση του μοντέλου επί των δεδομένων στο test δείγμα μας δίνει τα κάτωθι αποτελέσματα:

  1. Το μοντέλο χρησιμοποιεί 1920 παρατηρήσεις (80% από τις 2400 του δείγματος που παρέχουμε).
  2. Η εκπαίδευση γίνεται στις 6 ανεξάρτητες μεταβλητές ως προς τις 3 κατηγορίες εγκλημάτων της εξαρτημένης μεταβλητής.
  3. Το μοντέλο προσφέρει πιο ακριβείς προβλέψεις με τη χρήση πυκνότητας Kernel, καθώς η χρήση του αγνοεί την υπόθεση της κανονικότητας.
#Έλεγχος μοντέλου με το test δείγμα των δεδομένων
nb_pred2400 <- predict(model2400, newdata = test_data_sf_after_scale2400)
#Χρήση του Confusion Matrix για την αξιολόγηση της απόδησης του μοντέλου στο test σετ δεδομένων 
confusionMatrix(nb_pred2400, as.factor(test_data_cat2400))
Confusion Matrix and Statistics

          Reference
Prediction  17  21  22
        17 105  62  35
        21  51  89  69
        22   3  10  56

Overall Statistics
                                          
               Accuracy : 0.5208          
                 95% CI : (0.4751, 0.5663)
    No Information Rate : 0.3354          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.2812          
                                          
 Mcnemar's Test P-Value : 1.529e-15       

Statistics by Class:

                     Class: 17 Class: 21 Class: 22
Sensitivity             0.6604    0.5528    0.3500
Specificity             0.6978    0.6238    0.9594
Pos Pred Value          0.5198    0.4258    0.8116
Neg Pred Value          0.8058    0.7343    0.7470
Prevalence              0.3312    0.3354    0.3333
Detection Rate          0.2188    0.1854    0.1167
Detection Prevalence    0.4208    0.4354    0.1437
Balanced Accuracy       0.6791    0.5883    0.6547

Ο έλεγχος του μοντέλου επί των δεδομένων στο test δείγμα μας δίνει:

  1. To στατιστικό του Accuracy αποτυπώνει το ποσοστό των παρατηρήσεων που κατηγοριοποιήθηκαν σωστά.
  2. Η κατηγορία εγκλήματος 17 έχει το καλύτερο ποσοστό πρόβλεψης.
  3. Η κατηγορία εγκλήματος 21 έχει τη συχνότερα λανθασμένη αναγνώριση της.
  4. Η κατηγορία εγκλήματος 22 έχει υψηλή ακρίβεια πρόβλεψης.
Ερώτημα:Summarize the results and discuss limitations and potential improvements.

Για το μοντέλο που δημιουργήσαμε συγκεντρώνουμε παρακάτω τα συμπεράσματα, τους περιορισμούς και τα σημεία βελτίωσης του.

Γενικό συμπέρασμα

Ο Naive Bayes classifier αποδίδει μέτρια όσον αφορά το μέτρο Accuracy στην πρόβλεψη των κατηγοριών του εγκλήματος επί των επιλεγμένων χαρακτηριστικών. Ενώ το μοντέλο κατηγοριοποιεί με επιτυχία μεταξύ των τριών κατηγοριών καλύτερα από μία τυχαία πρόβλεψη, η απόδοση ταξινόμησης ποικίλλει ανά κατηγορία. Ορισμένες κατηγορίες προβλέπονται με μεγαλύτερά sensitivity και precision, ενώ άλλες αναγνωρίζονται λανθασμένα συχνά. Το επίπεδο συμφωνίας μεταξύ των πραγματικών και των προβλεπόμενων τάξεων υποδηλώνει περιθώρια βελτίωσης στη διακριτική ικανότητα του μοντέλου.

Περιορισμοί

  • Η κατηγοριοποίηση δεν έχει καλή απόδοση για όλες τις κατηγορίες, με αποτέλεσμα ορισμένες κατηγορίες εγκλημάτων να μην αναγνωρίζονται στο ίδιο επίπεδο με άλλες.
  • ο Naive Bayes classifier προϋποθέτει ανεξαρτησία μεταξύ των χαρακτηριστικών πρόβλεψης, η οποία όπως φαίνεται στο γράφημα “Correlation Heatmap” δεν ισχύει μεταξύ των μεταβλητών X,Y αλλά και Resolution, Descript.
  • Η χρήση των μεταβλητών επί των γεωγραφικών χαρακτηριστικών Χ,Υ μεμονωμένες δεν ενσωματώνουν πλήρως τη δυνατή πληροφορία την οποία θα έπρεπε να αποτυπώνουν.
  • Το σύνολο των χαρακτηριστικών πρόβλεψης που έχουμε επιλέξει είναι μικρό και απλοϊκό.
  • Το τεχνητό δείγμα των 2400 παρατηρήσεων, με ισομερώς κατανεμημένες 800 παρατηρήσεις κάθε κατηγορίας εγκλήματος, απλοποιεί την εκπαίδευση αλλά δεν αντανακλά την πραγματικότητα

Πιθανές βελτιώσεις

  • Μοντέλα με μεγαλύτερη ευελιξία ως προς τις προϋποθέσεις των χαρακτηριστικών πρόβλεψης θα μπορούσαν να χρησιμοποιηθούν προκειμένου να βελτιωθεί η απόδοση, π.χ.Random Forests ή Support Vector Machines.
  • Πιο εξειδικευμένες μεταβλητές που απορρέουν από τις υπάρχουσες όπως η ώρα της ημέρας, αν μια μέρα ανήκει στο σαββατοκύριακο, ή η ομαδοποίηση των Χ,Υ θα μπορούσαν να προσφέρουν καλύτερα μοτίβα στα χαρακτηριστικά πρόβλεψης.
  • Αντίστοιχα με τη δημιουργία πιο εξειδικευμένων μεταβλητών, θα μπορούσε να γίνει αφαίρεση συσχετιζόμενων (είτε θετικά είτε αρνητικά) μεταβλητών προκειμένου να μειωθεί ο θόρυβος.
  • Η χρήση του πλήρους σετ δεδομένων θα μπορούσε να προσφέρει καλύτερα αποτελέσματα καθώς περιέχει μεγαλύτερο αριθμό παρατηρήσεων αλλά και μη ισορροπημένες κατηγορίες εγκλημάτων που αντικατοπτρίζουν την πραγματική φύση του προβλήματος.

ΠΑΡΑΡΤΗΜΑ

(Συνέχεια) Ερώτημα: Identify and handle missing values as well outliers and extreme values in each dataset.
#Αποτελέσματα για ca_law_enforcement_by_city
plot_single_boxplot_outliers(ca_law_enforcement_by_city,"Population","City")
$plot


$mild_outliers
                ID  Value  OutlierType
1      Chula Vista 265215 Mild Outlier
2          Fontana 206982 Mild Outlier
3          Fremont 232427 Mild Outlier
4         Glendale 202298 Mild Outlier
5 Huntington Beach 203233 Mild Outlier
6           Irvine 258198 Mild Outlier
7          Modesto 210794 Mild Outlier
8           Oxnard 207221 Mild Outlier
9   San Bernardino 216477 Mild Outlier

$extreme_outliers
              ID   Value     OutlierType
1        Anaheim  349471 Extreme Outlier
2    Bakersfield  373887 Extreme Outlier
3         Fresno  520837 Extreme Outlier
4     Long Beach  476318 Extreme Outlier
5    Los Angeles 3962726 Extreme Outlier
6        Oakland  419481 Extreme Outlier
7      Riverside  323064 Extreme Outlier
8     Sacramento  489717 Extreme Outlier
9      San Diego 1400467 Extreme Outlier
10 San Francisco  863782 Extreme Outlier
11      San Jose 1031458 Extreme Outlier
12     Santa Ana  337304 Extreme Outlier
13      Stockton  304890 Extreme Outlier
plot_single_boxplot_outliers(ca_law_enforcement_by_city,"Total law enforcement employees","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1       Chula Vista   303 Mild Outlier
2           Fontana   274 Mild Outlier
3           Fremont   280 Mild Outlier
4          Glendale   339 Mild Outlier
5           Hayward   288 Mild Outlier
6  Huntington Beach   330 Mild Outlier
7            Irvine   298 Mild Outlier
8           Modesto   295 Mild Outlier
9         Oceanside   276 Mild Outlier
10          Ontario   321 Mild Outlier
11           Oxnard   358 Mild Outlier
12         Pasadena   333 Mild Outlier
13         Richmond   265 Mild Outlier
14   San Bernardino   394 Mild Outlier
15     Santa Monica   373 Mild Outlier
16        Sunnyvale   284 Mild Outlier
17         Torrance   314 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1        Anaheim   577 Extreme Outlier
2    Bakersfield   542 Extreme Outlier
3         Fresno   959 Extreme Outlier
4     Long Beach  1123 Extreme Outlier
5    Los Angeles 12665 Extreme Outlier
6        Oakland  1034 Extreme Outlier
7      Riverside   515 Extreme Outlier
8     Sacramento   949 Extreme Outlier
9      San Diego  2545 Extreme Outlier
10 San Francisco  2711 Extreme Outlier
11      San Jose  1325 Extreme Outlier
12     Santa Ana   527 Extreme Outlier
13      Stockton   571 Extreme Outlier
plot_single_boxplot_outliers(ca_law_enforcement_by_city,"Total officers","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1       Chula Vista   217 Mild Outlier
2          Glendale   236 Mild Outlier
3  Huntington Beach   210 Mild Outlier
4            Irvine   203 Mild Outlier
5           Modesto   216 Mild Outlier
6         Oceanside   206 Mild Outlier
7           Ontario   234 Mild Outlier
8            Oxnard   237 Mild Outlier
9          Pasadena   221 Mild Outlier
10   San Bernardino   214 Mild Outlier
11     Santa Monica   203 Mild Outlier
12        Sunnyvale   214 Mild Outlier
13         Torrance   212 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1        Anaheim   399 Extreme Outlier
2    Bakersfield   388 Extreme Outlier
3         Fresno   702 Extreme Outlier
4     Long Beach   771 Extreme Outlier
5    Los Angeles  9863 Extreme Outlier
6        Oakland   734 Extreme Outlier
7      Riverside   368 Extreme Outlier
8     Sacramento   646 Extreme Outlier
9      San Diego  1887 Extreme Outlier
10 San Francisco  2236 Extreme Outlier
11      San Jose   939 Extreme Outlier
12     Santa Ana   302 Extreme Outlier
13      Stockton   389 Extreme Outlier
plot_single_boxplot_outliers(ca_law_enforcement_by_city,"Total civilians","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1          Berkeley    88 Mild Outlier
2       Chula Vista    86 Mild Outlier
3           Fontana    89 Mild Outlier
4           Fremont   100 Mild Outlier
5          Glendale   103 Mild Outlier
6           Hayward   114 Mild Outlier
7  Huntington Beach   120 Mild Outlier
8            Irvine    95 Mild Outlier
9           Ontario    87 Mild Outlier
10           Oxnard   121 Mild Outlier
11         Pasadena   112 Mild Outlier
12           Pomona    99 Mild Outlier
13         Richmond    88 Mild Outlier
14         Torrance   102 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1         Anaheim   178 Extreme Outlier
2     Bakersfield   154 Extreme Outlier
3          Fresno   257 Extreme Outlier
4      Long Beach   352 Extreme Outlier
5     Los Angeles  2802 Extreme Outlier
6         Oakland   300 Extreme Outlier
7       Riverside   147 Extreme Outlier
8      Sacramento   303 Extreme Outlier
9  San Bernardino   180 Extreme Outlier
10      San Diego   658 Extreme Outlier
11  San Francisco   475 Extreme Outlier
12       San Jose   386 Extreme Outlier
13      Santa Ana   225 Extreme Outlier
14   Santa Monica   170 Extreme Outlier
15       Stockton   182 Extreme Outlier
#Αποτελέσματα για ca_law_enforcement_by_county
plot_single_boxplot_outliers(ca_law_enforcement_by_county,"Total law enforcement employees","County")
$plot


$mild_outliers
           ID Value  OutlierType
1  Sacramento  1906 Mild Outlier
2 Santa Clara  1613 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1    Los Angeles 16582 Extreme Outlier
2         Orange  3602 Extreme Outlier
3      Riverside  4088 Extreme Outlier
4 San Bernardino  3247 Extreme Outlier
5      San Diego  4127 Extreme Outlier
plot_single_boxplot_outliers(ca_law_enforcement_by_county,"Total officers","County")
$plot


$mild_outliers
           ID Value  OutlierType
1     Alameda   978 Mild Outlier
2  Sacramento  1249 Mild Outlier
3 Santa Clara  1206 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1    Los Angeles  9146 Extreme Outlier
2         Orange  1778 Extreme Outlier
3      Riverside  2049 Extreme Outlier
4 San Bernardino  1824 Extreme Outlier
5      San Diego  2558 Extreme Outlier
plot_single_boxplot_outliers(ca_law_enforcement_by_county,"Total civilians","County")
$plot


$mild_outliers
[1] ID          Value       OutlierType
<0 rows> (or 0-length row.names)

$extreme_outliers
              ID Value     OutlierType
1    Los Angeles  7436 Extreme Outlier
2         Orange  1824 Extreme Outlier
3      Riverside  2039 Extreme Outlier
4 San Bernardino  1423 Extreme Outlier
5      San Diego  1569 Extreme Outlier
#Αποτελέσματα για ca_offenses_by_city_upd
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Population","City")
$plot


$mild_outliers
                 ID  Value  OutlierType
1           Fontana 206982 Mild Outlier
2           Fremont 232427 Mild Outlier
3     Garden Grove3 176041 Mild Outlier
4         Glendale3 202298 Mild Outlier
5  Huntington Beach 203233 Mild Outlier
6           Irvine3 258198 Mild Outlier
7           Modesto 210794 Mild Outlier
8     Moreno Valley 205182 Mild Outlier
9         Oceanside 176319 Mild Outlier
10          Ontario 170274 Mild Outlier
11           Oxnard 207221 Mild Outlier
12 Rancho Cucamonga 176376 Mild Outlier
13   San Bernardino 216477 Mild Outlier
14    Santa Clarita 211132 Mild Outlier
15      Santa Rosa3 175738 Mild Outlier

$extreme_outliers
              ID   Value     OutlierType
1       Anaheim3  349471 Extreme Outlier
2    Bakersfield  373887 Extreme Outlier
3    Chula Vista  265215 Extreme Outlier
4         Fresno  520837 Extreme Outlier
5     Long Beach  476318 Extreme Outlier
6    Los Angeles 3962726 Extreme Outlier
7        Oakland  419481 Extreme Outlier
8      Riverside  323064 Extreme Outlier
9     Sacramento  489717 Extreme Outlier
10     San Diego 1400467 Extreme Outlier
11 San Francisco  863782 Extreme Outlier
12      San Jose 1031458 Extreme Outlier
13    Santa Ana3  337304 Extreme Outlier
14      Stockton  304890 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Violent crime","City")
$plot


$mild_outliers
              ID Value  OutlierType
1       Berkeley   530 Mild Outlier
2    Chula Vista   705 Mild Outlier
3        Concord   491 Mild Outlier
4      Elk Grove   586 Mild Outlier
5      Escondido   529 Mild Outlier
6  Garden Grove3   504 Mild Outlier
7     Hawthorne3   628 Mild Outlier
8        Hayward   556 Mild Outlier
9          Hemet   605 Mild Outlier
10         Indio   585 Mild Outlier
11 Moreno Valley   643 Mild Outlier
12     Oceanside   702 Mild Outlier
13       Ontario   547 Mild Outlier
14       Redding   614 Mild Outlier
15   Santa Cruz3   499 Mild Outlier
16   Santa Rosa3   606 Mild Outlier
17   South Gate3   561 Mild Outlier
18       Visalia   608 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3  1271 Extreme Outlier
2         Antioch   771 Extreme Outlier
3     Bakersfield  1810 Extreme Outlier
4         Compton   988 Extreme Outlier
5         Fontana   804 Extreme Outlier
6          Fresno  2871 Extreme Outlier
7      Inglewood3   775 Extreme Outlier
8       Lancaster  1005 Extreme Outlier
9      Long Beach  2766 Extreme Outlier
10    Los Angeles 25156 Extreme Outlier
11         Merced   763 Extreme Outlier
12        Modesto  2025 Extreme Outlier
13        Oakland  6051 Extreme Outlier
14         Oxnard   920 Extreme Outlier
15       Palmdale   830 Extreme Outlier
16        Pomona3   792 Extreme Outlier
17      Riverside  1441 Extreme Outlier
18     Sacramento  3611 Extreme Outlier
19        Salinas  1098 Extreme Outlier
20 San Bernardino  2697 Extreme Outlier
21      San Diego  5582 Extreme Outlier
22  San Francisco  6710 Extreme Outlier
23       San Jose  3400 Extreme Outlier
24     Santa Ana3  1626 Extreme Outlier
25       Stockton  4122 Extreme Outlier
26        Vallejo  1031 Extreme Outlier
27    Victorville   777 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Murder and nonnegligent manslaughter","City")
$plot


$mild_outliers
                   ID Value  OutlierType
1             Antioch     7 Mild Outlier
2             Banning     8 Mild Outlier
3              Carson     7 Mild Outlier
4         Chula Vista     6 Mild Outlier
5  Desert Hot Springs     7 Mild Outlier
6             Downey3     7 Mild Outlier
7           El Monte3     8 Mild Outlier
8           Escondido     7 Mild Outlier
9           Fairfield     8 Mild Outlier
10           Gardena3     6 Mild Outlier
11         Hawthorne3     6 Mild Outlier
12         Inglewood3     7 Mild Outlier
13      Jurupa Valley     6 Mild Outlier
14          Lancaster     7 Mild Outlier
15      Moreno Valley     6 Mild Outlier
16            Orange3     7 Mild Outlier
17           Palmdale     7 Mild Outlier
18      Santa Clarita     7 Mild Outlier
19     South El Monte     6 Mild Outlier
20        Victorville     6 Mild Outlier
21            Visalia     6 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3    18 Extreme Outlier
2     Bakersfield    22 Extreme Outlier
3         Compton    13 Extreme Outlier
4          Fresno    39 Extreme Outlier
5         Hayward    10 Extreme Outlier
6           Hemet    10 Extreme Outlier
7      Long Beach    36 Extreme Outlier
8     Los Angeles   282 Extreme Outlier
9          Merced    11 Extreme Outlier
10        Modesto    25 Extreme Outlier
11        Norwalk     9 Extreme Outlier
12        Oakland    85 Extreme Outlier
13      Oceanside     9 Extreme Outlier
14         Oxnard    12 Extreme Outlier
15        Pomona3    10 Extreme Outlier
16      Riverside    10 Extreme Outlier
17     Sacramento    43 Extreme Outlier
18        Salinas    40 Extreme Outlier
19 San Bernardino    44 Extreme Outlier
20      San Diego    37 Extreme Outlier
21  San Francisco    53 Extreme Outlier
22       San Jose    30 Extreme Outlier
23     Santa Ana3    12 Extreme Outlier
24    Santa Maria    13 Extreme Outlier
25       Stockton    49 Extreme Outlier
26         Tulare    10 Extreme Outlier
27        Vallejo    18 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Rape revised definition","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1           Antioch    53 Mild Outlier
2          Berkeley    44 Mild Outlier
3            Chico3    59 Mild Outlier
4       Chula Vista    63 Mild Outlier
5       Costa Mesa3    53 Mild Outlier
6          El Cajon    50 Mild Outlier
7         Escondido    48 Mild Outlier
8         Fairfield    46 Mild Outlier
9           Fontana    46 Mild Outlier
10          Fremont    49 Mild Outlier
11       Fullerton3    66 Mild Outlier
12 Huntington Beach    52 Mild Outlier
13       Inglewood3    44 Mild Outlier
14         Palmdale    44 Mild Outlier
15        Pasadena3    57 Mild Outlier
16          Redding    50 Mild Outlier
17   Santa Barbara3    62 Mild Outlier
18      Santa Cruz3    44 Mild Outlier
19      Santa Maria    50 Mild Outlier
20          Ventura    53 Mild Outlier
21      Victorville    49 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3   129 Extreme Outlier
2     Bakersfield    71 Extreme Outlier
3          Fresno   167 Extreme Outlier
4         Hayward    71 Extreme Outlier
5       Lancaster    82 Extreme Outlier
6      Long Beach   177 Extreme Outlier
7     Los Angeles  2209 Extreme Outlier
8         Modesto    85 Extreme Outlier
9         Oakland   285 Extreme Outlier
10      Oceanside    68 Extreme Outlier
11        Pomona3    72 Extreme Outlier
12      Riverside   137 Extreme Outlier
13     Sacramento   105 Extreme Outlier
14        Salinas    76 Extreme Outlier
15 San Bernardino    98 Extreme Outlier
16      San Diego   566 Extreme Outlier
17  San Francisco   344 Extreme Outlier
18       San Jose   375 Extreme Outlier
19     Santa Ana3   154 Extreme Outlier
20    Santa Rosa3    89 Extreme Outlier
21       Stockton   135 Extreme Outlier
22        Vallejo   102 Extreme Outlier
23        Visalia   106 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Robbery","City")
$plot


$mild_outliers
                ID Value  OutlierType
1      Chula Vista   239 Mild Outlier
2          Concord   182 Mild Outlier
3          Downey3   173 Mild Outlier
4        Escondido   176 Mild Outlier
5          Fontana   213 Mild Outlier
6       Hawthorne3   246 Mild Outlier
7            Hemet   174 Mild Outlier
8  Huntington Park   177 Mild Outlier
9        Oceanside   216 Mild Outlier
10         Ontario   217 Mild Outlier
11        Palmdale   251 Mild Outlier
12     San Leandro   220 Mild Outlier
13    Santa Monica   172 Mild Outlier
14     South Gate3   199 Mild Outlier
15     Victorville   229 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3   439 Extreme Outlier
2         Antioch   280 Extreme Outlier
3     Bakersfield   655 Extreme Outlier
4        Berkeley   330 Extreme Outlier
5         Compton   332 Extreme Outlier
6          Fresno  1012 Extreme Outlier
7         Hayward   298 Extreme Outlier
8      Inglewood3   358 Extreme Outlier
9       Lancaster   326 Extreme Outlier
10     Long Beach  1054 Extreme Outlier
11    Los Angeles  8952 Extreme Outlier
12        Modesto   488 Extreme Outlier
13  Moreno Valley   275 Extreme Outlier
14        Oakland  3290 Extreme Outlier
15         Oxnard   385 Extreme Outlier
16        Pomona3   291 Extreme Outlier
17      Riverside   520 Extreme Outlier
18     Sacramento  1174 Extreme Outlier
19        Salinas   369 Extreme Outlier
20 San Bernardino   968 Extreme Outlier
21      San Diego  1378 Extreme Outlier
22  San Francisco  3610 Extreme Outlier
23       San Jose  1140 Extreme Outlier
24     Santa Ana3   523 Extreme Outlier
25       Stockton  1144 Extreme Outlier
26        Vallejo   351 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Aggravated assault","City")
$plot


$mild_outliers
              ID Value  OutlierType
1        Antioch   431 Mild Outlier
2         Carson   297 Mild Outlier
3    Chula Vista   397 Mild Outlier
4      Elk Grove   447 Mild Outlier
5      Escondido   298 Mild Outlier
6  Garden Grove3   304 Mild Outlier
7     Hawthorne3   341 Mild Outlier
8          Hemet   388 Mild Outlier
9          Indio   424 Mild Outlier
10    Inglewood3   366 Mild Outlier
11        Madera   335 Mild Outlier
12 Moreno Valley   329 Mild Outlier
13     Oceanside   409 Mild Outlier
14       Ontario   296 Mild Outlier
15       Pomona3   419 Mild Outlier
16       Redding   417 Mild Outlier
17   Santa Cruz3   337 Mild Outlier
18   Santa Rosa3   382 Mild Outlier
19   South Gate3   336 Mild Outlier
20       Visalia   366 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3   685 Extreme Outlier
2     Bakersfield  1062 Extreme Outlier
3         Compton   610 Extreme Outlier
4         Fontana   542 Extreme Outlier
5          Fresno  1653 Extreme Outlier
6       Lancaster   590 Extreme Outlier
7      Long Beach  1499 Extreme Outlier
8     Los Angeles 13713 Extreme Outlier
9          Merced   570 Extreme Outlier
10        Modesto  1427 Extreme Outlier
11        Oakland  2391 Extreme Outlier
12         Oxnard   502 Extreme Outlier
13       Palmdale   528 Extreme Outlier
14      Riverside   774 Extreme Outlier
15     Sacramento  2289 Extreme Outlier
16        Salinas   613 Extreme Outlier
17 San Bernardino  1587 Extreme Outlier
18      San Diego  3601 Extreme Outlier
19  San Francisco  2703 Extreme Outlier
20       San Jose  1855 Extreme Outlier
21     Santa Ana3   937 Extreme Outlier
22       Stockton  2794 Extreme Outlier
23        Vallejo   560 Extreme Outlier
24    Victorville   493 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Property crime","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1          Berkeley  5906 Mild Outlier
2       Chula Vista  4619 Mild Outlier
3           Concord  4618 Mild Outlier
4       Costa Mesa3  4723 Mild Outlier
5           Fremont  4371 Mild Outlier
6     Garden Grove3  4433 Mild Outlier
7           Hayward  4483 Mild Outlier
8  Huntington Beach  4942 Mild Outlier
9     Moreno Valley  6663 Mild Outlier
10        Oceanside  4597 Mild Outlier
11          Ontario  5169 Mild Outlier
12           Oxnard  6696 Mild Outlier
13          Pomona3  4507 Mild Outlier
14      Santa Rosa3  4311 Mild Outlier
15          Vallejo  4986 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3 10038 Extreme Outlier
2     Bakersfield 15559 Extreme Outlier
3          Fresno 21606 Extreme Outlier
4      Long Beach 14337 Extreme Outlier
5     Los Angeles 93503 Extreme Outlier
6         Modesto 10123 Extreme Outlier
7         Oakland 24568 Extreme Outlier
8       Riverside 10531 Extreme Outlier
9      Sacramento 16501 Extreme Outlier
10 San Bernardino 10390 Extreme Outlier
11      San Diego 29158 Extreme Outlier
12  San Francisco 53019 Extreme Outlier
13       San Jose 25035 Extreme Outlier
14     Santa Ana3  7270 Extreme Outlier
15       Stockton 12998 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Burglary","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1           Antioch   862 Mild Outlier
2          Berkeley  1090 Mild Outlier
3           Fremont   913 Mild Outlier
4     Garden Grove3   885 Mild Outlier
5             Hemet   908 Mild Outlier
6     Moreno Valley  1190 Mild Outlier
7           Ontario   897 Mild Outlier
8            Oxnard  1103 Mild Outlier
9          Palmdale   803 Mild Outlier
10     Palm Springs   898 Mild Outlier
11        Pasadena3   830 Mild Outlier
12 Rancho Cucamonga   930 Mild Outlier
13       Santa Ana3   909 Mild Outlier
14      Victorville  1095 Mild Outlier
15          Visalia   814 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3  1476 Extreme Outlier
2     Bakersfield  3877 Extreme Outlier
3          Fresno  4429 Extreme Outlier
4       Lancaster  1342 Extreme Outlier
5      Long Beach  3094 Extreme Outlier
6     Los Angeles 16160 Extreme Outlier
7         Modesto  1639 Extreme Outlier
8         Oakland  3333 Extreme Outlier
9       Riverside  1633 Extreme Outlier
10     Sacramento  3713 Extreme Outlier
11 San Bernardino  3164 Extreme Outlier
12      San Diego  5129 Extreme Outlier
13  San Francisco  5186 Extreme Outlier
14       San Jose  4896 Extreme Outlier
15       Stockton  2891 Extreme Outlier
16        Vallejo  2352 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Larceny theft","City")
$plot


$mild_outliers
                 ID Value  OutlierType
1          Berkeley  4099 Mild Outlier
2       Chula Vista  3093 Mild Outlier
3           Concord  3068 Mild Outlier
4       Costa Mesa3  3558 Mild Outlier
5        Fullerton3  2958 Mild Outlier
6     Garden Grove3  2899 Mild Outlier
7  Huntington Beach  3846 Mild Outlier
8           Irvine3  3144 Mild Outlier
9     Moreno Valley  4312 Mild Outlier
10        Oceanside  3541 Mild Outlier
11          Ontario  3206 Mild Outlier
12          Redding  2888 Mild Outlier
13   San Bernardino  4210 Mild Outlier
14     Santa Monica  2953 Mild Outlier
15      Santa Rosa3  3223 Mild Outlier
16          Ventura  3042 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1       Anaheim3  6893 Extreme Outlier
2    Bakersfield  9288 Extreme Outlier
3         Fresno 14184 Extreme Outlier
4     Long Beach  8413 Extreme Outlier
5    Los Angeles 61191 Extreme Outlier
6        Modesto  6749 Extreme Outlier
7        Oakland 14846 Extreme Outlier
8         Oxnard  4758 Extreme Outlier
9      Riverside  7144 Extreme Outlier
10    Sacramento  9865 Extreme Outlier
11     San Diego 18933 Extreme Outlier
12 San Francisco 40918 Extreme Outlier
13      San Jose 13138 Extreme Outlier
14    Santa Ana3  4494 Extreme Outlier
15      Stockton  8119 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Motor vehicle theft","City")
$plot


$mild_outliers
                ID Value  OutlierType
1          Antioch  1024 Mild Outlier
2         Berkeley   717 Mild Outlier
3      Chula Vista   816 Mild Outlier
4          Compton   767 Mild Outlier
5          Concord   956 Mild Outlier
6          Downey3   792 Mild Outlier
7          Fontana  1031 Mild Outlier
8          Fremont   703 Mild Outlier
9  Huntington Park   796 Mild Outlier
10      Inglewood3   683 Mild Outlier
11   Jurupa Valley   838 Mild Outlier
12         Ontario  1066 Mild Outlier
13          Oxnard   835 Mild Outlier
14       Pittsburg   803 Mild Outlier
15          Rialto   721 Mild Outlier
16     San Leandro   903 Mild Outlier
17     South Gate3  1051 Mild Outlier

$extreme_outliers
               ID Value     OutlierType
1        Anaheim3  1669 Extreme Outlier
2     Bakersfield  2394 Extreme Outlier
3          Fresno  2993 Extreme Outlier
4         Hayward  1388 Extreme Outlier
5      Long Beach  2830 Extreme Outlier
6     Los Angeles 16152 Extreme Outlier
7         Modesto  1735 Extreme Outlier
8   Moreno Valley  1161 Extreme Outlier
9         Oakland  6389 Extreme Outlier
10        Pomona3  1256 Extreme Outlier
11      Riverside  1754 Extreme Outlier
12     Sacramento  2923 Extreme Outlier
13        Salinas  1932 Extreme Outlier
14 San Bernardino  3016 Extreme Outlier
15      San Diego  5096 Extreme Outlier
16  San Francisco  6915 Extreme Outlier
17       San Jose  7001 Extreme Outlier
18     Santa Ana3  1867 Extreme Outlier
19       Stockton  1988 Extreme Outlier
20        Vallejo  1098 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_city_upd,"Arson","City")
$plot


$mild_outliers
              ID Value  OutlierType
1       Adelanto    24 Mild Outlier
2       Anaheim3    28 Mild Outlier
3        Antioch    36 Mild Outlier
4    Chula Vista    27 Mild Outlier
5         Delano    26 Mild Outlier
6      El Monte3    29 Mild Outlier
7        Eureka3    30 Mild Outlier
8      Fairfield    30 Mild Outlier
9  Garden Grove3    25 Mild Outlier
10       Hayward    30 Mild Outlier
11     Livermore    28 Mild Outlier
12       Ontario    32 Mild Outlier
13        Oxnard    24 Mild Outlier
14    Santa Ana3    37 Mild Outlier
15   Santa Cruz3    25 Mild Outlier
16  Santa Monica    24 Mild Outlier
17         Tracy    25 Mild Outlier
18      Turlock3    30 Mild Outlier

$extreme_outliers
                ID Value     OutlierType
1      Bakersfield   339 Extreme Outlier
2           Chico3   191 Extreme Outlier
3          Compton    53 Extreme Outlier
4           Fresno   255 Extreme Outlier
5        Lancaster    70 Extreme Outlier
6       Long Beach    69 Extreme Outlier
7      Los Angeles  1131 Extreme Outlier
8           Merced    81 Extreme Outlier
9          Modesto    66 Extreme Outlier
10         Oakland   179 Extreme Outlier
11       Pasadena3    45 Extreme Outlier
12         Pomona3    39 Extreme Outlier
13       Riverside    71 Extreme Outlier
14      Sacramento   140 Extreme Outlier
15  San Bernardino    65 Extreme Outlier
16       San Diego   174 Extreme Outlier
17   San Francisco   272 Extreme Outlier
18        San Jose    93 Extreme Outlier
19 San Luis Obispo    44 Extreme Outlier
20     Santa Rosa3    41 Extreme Outlier
21        Stockton   103 Extreme Outlier
22         Vallejo    40 Extreme Outlier
23     Victorville    39 Extreme Outlier
#Αποτελέσματα για ca_offenses_by_county_upd
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Violent crime","County")
$plot


$mild_outliers
              ID Value  OutlierType
1         Fresno   962 Mild Outlier
2      Riverside   885 Mild Outlier
3 San Bernardino   920 Mild Outlier
4      San Diego  1161 Mild Outlier
5    San Joaquin   845 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern  2235 Extreme Outlier
2 Los Angeles  5173 Extreme Outlier
3  Sacramento  3117 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Murder and nonnegligent manslaughter","County")
$plot


$mild_outliers
              ID Value  OutlierType
1   Contra Costa    14 Mild Outlier
2 San Bernardino    18 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern    31 Extreme Outlier
2 Los Angeles    98 Extreme Outlier
3  Sacramento    37 Extreme Outlier
4     Tulare4    23 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Rape revised definition","County")
$plot


$mild_outliers
              ID Value  OutlierType
1 San Bernardino    91 Mild Outlier
2         Sonoma    73 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern   157 Extreme Outlier
2 Los Angeles   304 Extreme Outlier
3  Sacramento   155 Extreme Outlier
4   San Diego   110 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Robbery","County")
$plot


$mild_outliers
              ID Value  OutlierType
1        Alameda   177 Mild Outlier
2   Contra Costa   153 Mild Outlier
3      Riverside   172 Mild Outlier
4 San Bernardino   141 Mild Outlier
5      San Diego   161 Mild Outlier
6    San Joaquin   161 Mild Outlier
7     Stanislaus   122 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern   360 Extreme Outlier
2 Los Angeles  1212 Extreme Outlier
3  Sacramento  1026 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Aggravated assault","County")
$plot


$mild_outliers
              ID Value  OutlierType
1         Fresno   810 Mild Outlier
2      Riverside   663 Mild Outlier
3 San Bernardino   670 Mild Outlier
4    San Joaquin   661 Mild Outlier
5         Shasta   599 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern  1687 Extreme Outlier
2 Los Angeles  3559 Extreme Outlier
3  Sacramento  1899 Extreme Outlier
4   San Diego   880 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Property crime","County")
$plot


$mild_outliers
              ID Value  OutlierType
1 San Bernardino  5527 Mild Outlier
2      San Diego  4784 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern  9903 Extreme Outlier
2 Los Angeles 16301 Extreme Outlier
3   Riverside  7680 Extreme Outlier
4  Sacramento 11164 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Burglary","County")
$plot


$mild_outliers
              ID Value  OutlierType
1         Fresno  1398 Mild Outlier
2      Riverside  1880 Mild Outlier
3 San Bernardino  1719 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern  3243 Extreme Outlier
2 Los Angeles  3739 Extreme Outlier
3  Sacramento  3690 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Larceny theft","County")
$plot


$mild_outliers
         ID Value  OutlierType
1 San Diego  2843 Mild Outlier

$extreme_outliers
           ID Value     OutlierType
1        Kern  4777 Extreme Outlier
2 Los Angeles  8359 Extreme Outlier
3   Riverside  4321 Extreme Outlier
4  Sacramento  7348 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Motor vehicle theft","County")
$plot


$mild_outliers
           ID Value  OutlierType
1      Orange   142 Mild Outlier
2  Sacramento   126 Mild Outlier
3 San Joaquin   144 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1        Alameda   629 Extreme Outlier
2         Fresno   574 Extreme Outlier
3           Kern  1883 Extreme Outlier
4    Los Angeles  4203 Extreme Outlier
5      Riverside  1479 Extreme Outlier
6 San Bernardino  1225 Extreme Outlier
7      San Diego   788 Extreme Outlier
8      San Mateo   376 Extreme Outlier
9    Santa Clara   198 Extreme Outlier
plot_single_boxplot_outliers(ca_offenses_by_county_upd,"Arson","County")
$plot


$mild_outliers
         ID Value  OutlierType
1 San Diego    41 Mild Outlier

$extreme_outliers
              ID Value     OutlierType
1         Fresno   145 Extreme Outlier
2           Kern   300 Extreme Outlier
3    Los Angeles   215 Extreme Outlier
4 San Bernardino    62 Extreme Outlier
(Συνέχεια) Ερώτημα: Examine the types of variables and report their definitions.
#Είδος κλάσης για τις τιμές των στηλών.
knitr::kable(sapply(ca_law_enforcement_by_county, class), col.names = c("Variable Name", "Variable Class")) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Class
Metropolitan Nonmetropolitan character
County character
Total law enforcement employees numeric
Total officers numeric
Total civilians numeric
#Είδος αποθήκευσης για τις τιμές των στηλών. 
knitr::kable(sapply(ca_law_enforcement_by_county, typeof), col.names = c("Variable Name", "Variable Type"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Type
Metropolitan Nonmetropolitan character
County character
Total law enforcement employees double
Total officers double
Total civilians double
#Είδος κλάσης για τις τιμές των στηλών.
knitr::kable(sapply(ca_offenses_by_city_upd, class), col.names = c("Variable Name", "Variable Class")) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed")) 
Variable Name Variable Class
City character
Population numeric
Violent crime numeric
Murder and nonnegligent manslaughter numeric
Rape revised definition numeric
Robbery numeric
Aggravated assault numeric
Property crime numeric
Burglary numeric
Larceny theft numeric
Motor vehicle theft numeric
Arson numeric
 #Είδος αποθήκευσης για τις τιμές των στηλών. 
knitr::kable(sapply(ca_offenses_by_city_upd, typeof), col.names = c("Variable Name", "Variable Type"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed")) 
Variable Name Variable Type
City character
Population double
Violent crime double
Murder and nonnegligent manslaughter double
Rape revised definition double
Robbery double
Aggravated assault double
Property crime double
Burglary double
Larceny theft double
Motor vehicle theft double
Arson double
#Είδος κλάσης για τις τιμές των στηλών.
knitr::kable(sapply(ca_offenses_by_county_upd, class), col.names = c("Variable Name", "Variable Class")) %>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Class
Metropolitan Nonmetropolitan character
County character
Violent crime numeric
Murder and nonnegligent manslaughter numeric
Rape revised definition numeric
Robbery numeric
Aggravated assault numeric
Property crime numeric
Burglary numeric
Larceny theft numeric
Motor vehicle theft numeric
Arson numeric
#Είδος αποθήκευσης για τις τιμές των στηλών. 
knitr::kable(sapply(ca_offenses_by_county_upd, typeof), col.names = c("Variable Name", "Variable Type"))%>%
  kable_styling(full_width = FALSE
                ,position = "center"
                ,bootstrap_options = c("striped", "condensed"))  
Variable Name Variable Type
Metropolitan Nonmetropolitan character
County character
Violent crime double
Murder and nonnegligent manslaughter double
Rape revised definition double
Robbery double
Aggravated assault double
Property crime double
Burglary double
Larceny theft double
Motor vehicle theft double
Arson double
(Συνέχεια) Ερώτημα: Central Tendencies: Calculate mean, variance, standard deviation, skewness and kurtosis for each crime category for the ca_offenses_by_county.csv. Is the data distribution for each category a normal distribution?
#Shapiro-Wilk's Test Murder and nonnegligent manslaughter
shapiro.test(ca_offenses_by_county_upd$`Murder and nonnegligent manslaughter`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Rape revised definition
shapiro.test(ca_offenses_by_county_upd$`Rape revised definition`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Robbery
shapiro.test(ca_offenses_by_county_upd$Robbery)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Aggravated assault
shapiro.test(ca_offenses_by_county_upd$`Aggravated assault`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Property crime
shapiro.test(ca_offenses_by_county_upd$`Property crime`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Burglary
shapiro.test(ca_offenses_by_county_upd$Burglary)$p< alphalvl
[1] TRUE
#Shapiro-Wilk's Test Larceny theft
shapiro.test(ca_offenses_by_county_upd$`Larceny theft`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Motor vehicle theft
shapiro.test(ca_offenses_by_county_upd$`Motor vehicle theft`)$p < alphalvl
[1] TRUE
#Shapiro-Wilk's Test Arson
shapiro.test(ca_offenses_by_county_upd$Arson)$p < alphalvl
[1] TRUE