Το 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 εστιάζει στην εγκληματική
δραστηριότητα στα πανεπιστημία.
Ο σκοπός της παρούσας ανάλυσης διερευνεί τη σχέση μεταξύ των ποσοστών
εγκληματικότητας και του μεγέθους του πληθυσμού, της γεωγραφικής
επέκτασης του και της ικανότητας επιβολής του νόμου. Εντοπίζοντας
τάσεις, ακραίες τιμές και συσχετίσεις εντός των δεδομένων, και απαντούμε
σε ερωτήματα όπως:
Είναι ορισμένα εγκλήματα πιο διαδεδομένα σε συγκεκριμένες
περιοχές;
Πώς συγκρίνονται τα εγκλήματα στα πανεπιστήμια με τα μοτίβα στις
κομητείες της Καλιφόρνια;
Η υψηλότερη παρουσία της επιβολής του νόμου συσχετίζεται με
χαμηλότερα ποσοστά εγκληματικότητας;
Μέσω στατιστικών περιλήψεων, γραφημάτων, οπτικοποιήσεων και αξιολογήσεων συσχέτισης, επιδώκουμε μια σαφέστερη κατανόηση της δυναμικής των εγκλημάτων στην Καλιφόρνια.
packages <- c("stringr","dplyr","stats","reshape2","moments","caret",
"ggplot2","ggrepel","scales","sf","tigris","viridis",
"tidyr","kableExtra")
invisible(lapply(packages, library, character.only = TRUE))
Αρχικοποιούμε τα ονόματα των αρχείων σε μεταβλητές για να είναι πιο ευανάγνωστος ο κώδικας.
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]))
}
Προκειμένου να γίνει έλεγχος για απολεσμένες (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 |
#Έλεγχος για το σετ δεδομένων 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 |
#Έλεγχος για το σετ δεδομένων 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_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 |
Για κάθε ένα από τα σετ δεδομένων παρατηρούμε το είδος της κλάσης των
μεταβλητών του, αλλά και το είδος που αυτές αποθηκεύονται στην μνήμη του
Η.Υ..
Γενική παρατήρηση είναι πως οι αριθμητικές μεταβλητές έχουν κλάση
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 |
Για τον έλεγχο της κατανομής των μεταβλητών Population, Violent Crime
στα σετ δεδομένων ca_offenses_by_city.csv και ca_offenses_by_county.csv
δημιουργούμε τη συνάρτηση chist.
Η chist
δέχεται σαν ορίσματα:
Η συνάρτηση επιστρέφει:
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')
Για τη δημιουργία του γραφήματος χάρτη που περιέχει την κατανομή των
εγκλημάτων στην πολιτεία της Καλιφόρνια πραγματοποιούμε πρώτα
προετοιμασία των δεδομένων προς χρήση.
Δημιουργούμε ένα νέο πίνακα, crime_by_CAcounty, όπου
περιέχει το σύνολο των εγκλημάτων για κάθε κομητεία της
Καλιφόρνια.
Ορίζουμε τα ονόματα των στηλών του πίνακα, το σωστό τύπο
δεδομένων για το σύνολο των εγκλημάτων, αφαιρούμε το χαρακτήρα “3” από
τα ονόματα των κομητειών και τα μετατρέπουμε σε κεφαλαίους χαρακτήρες.
Λαμβάνουμε και αποθηκεύουμε τα στοιχεία για το γεωγραφικό μήκος και πλάτος για τις κομητείες στο ca_counties.
Η προετοιμασία ολοκληρώνεται με τη μετατροπή σε κεφαλαία γράμματα
τα ονόματα των κομητειών και σε αυτό τον πίνακα, προκειμένου να τον
συνδέσουμε με 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
Για τη δημιουργία του ραβδογράμματος που περιέχει την κατανομή των
εγκλημάτων ανά κατηγορία στις κομητείες της Καλιφόρνια πραγματοποιούμε
πρώτα προετοιμασία των δεδομένων προς χρήση.
Δημιουργούμε ένα νέο πίνακα, crime_category_totals, όπου
περιέχει το σύνολο των εγκλημάτων ανά κατηγορία εγκλήματος και προκύπτει
από τον πίνακα ca_offenses_by_county_upd.
Ορίζουμε τα ονόματα των στηλών, και το σωστό τύπο δεδομένων για το σύνολο των εγκλημάτων.
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)
Από το ραβδόγραμμα παρατηρούμε:
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_category_freq, όπου
περιέχει το σύνολο, τη συχνότητα ανά κατηγορία εγκλήματος και προκύπτει
από τον πίνακα ca_offenses_by_city_upd.
ορίζουμε τα ονόματα των στηλών, και το σωστό τύπο δεδομένων για τις αριθμητικές μεταβλητές.
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)
Από το ραβδόγραμμα παρατηρούμε:
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")
Για την παρουσίαση των μέτρων κεντρικής θέσης και διασποράς ανά
κατηγορία εγκλήματος δημιουργούμε ένα πίνακα που υπολογίζει σαν λίστα:
#Δημιουργία πίνακα υποσυνόλου των αριθμητικών μεταβλητών για τις κατηγορίες εγκλημάτων.
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 |
Για τον έλεγχο, αν η κατανομή κάθε κατηγορίας εγκλήματος ακολουθεί
την κανονική κατανομή, δημιουργούμε τα ιστόγραμμα των κατηγοριώ
#Κανόνας Stuger
StugerR = (1 + 3.32 * log10(57))
StugerR
[1] 6.829505
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.
Τέλος για λόγους παρουσίασης, ακολουθούν τα αποτελέσματα μόνο για τον έλεγχο της μεταβλητής Violent crime, ενώ τα αποτελέσματα για τις υπόλοιπες μεταβλητές παρατίθενται στο Παράρτημα.
#Ορισμός επιπέδου alpha.
alphalvl <- 0.05
#Shapiro-Wilk's Test
shapiro.test(ca_offenses_by_county_upd$`Violent crime`)$p < alphalvl
[1] TRUE
Γνωρίζουμε ότι οι αριθμητικές μεταβλητές του αρχείου
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 μεταβλητές με την χαμηλότερη συσχέτιση.
#Απομόνωση στοίχειων διαγωνίου πίνακα συσχετίσεων.
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 υψηλότερα συσχετισμένες μεταβλητές παρατηρούμε:
#Οι 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 λιγότερο συσχετισμένες μεταβλητές παρατηρούμε:
#Οι 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 |
Επιλέγουμε να δημιουργήσουμε:
Η cCorPlt δέχεται ως όρισματα:
Η συνάρτηση επιστρέφει το διάγραμμα διασποράς των δύο αυτών
μεταβλητών.
#Δημιουργία συνάρτησης για την εκτύπωση του διαγράματος διασποράς 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))
Φορτώνουμε το νέο αρχείο δεδομένων, ca_offenses_by_campus.csv, και θα
προβούμε σε κάποιες αρχικές ενέργειες καθαρισμού και μορφοποίησης των
δεδομένων. Οι ενέργειες καθαρισμού και μορφοποίησης
περιλαμβάνουν:
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.
Παρατηρούμε ότι:
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
όπου:
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)
Από το συνδυασμό των δεδομένων πανεπιστημίων με αυτά από τις
κομητείες, παρατηρούμε ότι:
#Κοινό ραβδόγραμμα
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),
)
Δημιουργούμε ένα πίνακα με το σύνολο των εγκλημάτων για όλες τις κατηγορίες στις 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
Δημιουργούμε ένα πίνακα με το σύνολο των ένστολων στις 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()
Με την ίδια διαδικασία που δημιουργήσαμε τους πίνακες για τις 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")
)
Από το θηκόγραμμα μεταξύ του ποσοστού εγκλημάτων ανά ένστολο μεταξύ
των δύο δειγμάτων πόλεων εξάγουμε τα παρακάτω συμπεράσματα:
#Θηκόγραμμα
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()
Φορτώνουμε το νέο αρχείο δεδομένων στον πίνακα 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())
Ο πίνακας συχνοτήτων για τις ημέρες της εβδομάδας.
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 |
Οι κατηγορικές μεταβλητές, οι οποίες θα πρέπει να κωδικοποιηθούν
είναι:
#Κωδικοποιήση 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. .
Ο κατηγοριοποιητής που θα χρησιμοποιήσουμε για την αναγνώριση των 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 δείγμα μας δίνει
τα κάτωθι αποτελέσματα:
#Έλεγχος μοντέλου με το 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 δείγμα μας
δίνει:
Για το μοντέλο που δημιουργήσαμε συγκεντρώνουμε παρακάτω τα
συμπεράσματα, τους περιορισμούς και τα σημεία βελτίωσης του.
Γενικό συμπέρασμα
Ο Naive Bayes classifier αποδίδει μέτρια όσον αφορά το μέτρο Accuracy στην πρόβλεψη των κατηγοριών του εγκλήματος επί των επιλεγμένων χαρακτηριστικών. Ενώ το μοντέλο κατηγοριοποιεί με επιτυχία μεταξύ των τριών κατηγοριών καλύτερα από μία τυχαία πρόβλεψη, η απόδοση ταξινόμησης ποικίλλει ανά κατηγορία. Ορισμένες κατηγορίες προβλέπονται με μεγαλύτερά sensitivity και precision, ενώ άλλες αναγνωρίζονται λανθασμένα συχνά. Το επίπεδο συμφωνίας μεταξύ των πραγματικών και των προβλεπόμενων τάξεων υποδηλώνει περιθώρια βελτίωσης στη διακριτική ικανότητα του μοντέλου.
Περιορισμοί
Πιθανές βελτιώσεις
#Αποτελέσματα για 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
#Είδος κλάσης για τις τιμές των στηλών.
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 |
#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