dh-mc's picture
WIP
23c2526
```{r}
install.packages(c("sf", "raster"))
# Load packages
```
```{r}
install.packages(c("dplyr"))
```
```{r}
# Load necessary libraries
library(sf)
library(ggplot2)
library(rnaturalearth)
library(rnaturalearthdata)
# Read your CSV data
data <- read.csv("GIS_Purpose.csv")
```
```{r}
data_clean <- na.omit(data)
# Convert the cleaned data frame to an sf object, specifying the coordinates and CRS (Coordinate Reference System)
data_sf <- st_as_sf(data_clean, coords = c("lon", "lat"), crs = 4326)
# Get world map data
world <- ne_countries(scale = "medium", returnclass = "sf")
# Plot the world map with points from your data
my_plot <- ggplot(data = world) +
geom_sf() + # This plots the world map as a base layer
geom_sf(data = data_sf, aes(color = Severity), size = 0.4) + # This adds your points on top
theme_minimal() +
labs(title = "Spatial Distribution of Incidents with World Map Basemap") +
theme(legend.position = "right") # Adjust legend position if needed
# Save the plot to a file
ggsave("my_spatial_plot.png", plot = my_plot, width = 10, height = 8, dpi = 300)
```
```{r}
library(lubridate)
library(ggplot2)
library(forecast)
# Check for NA values and remove them
data <- na.omit(data)
# Aggregate data by month
data$Month <- floor_date(data$Datetime, "month")
monthly_incidents <- aggregate(Index ~ Month, data, length)
# Make sure that there are no NA values
monthly_incidents <- na.omit(monthly_incidents)
# Assuming that you've verified the 'monthly_incidents' dataframe and it looks correct
# Create a time series object, checking the start and end values
start_year <- min(year(monthly_incidents$Month), na.rm = TRUE)
start_month <- min(month(monthly_incidents$Month), na.rm = TRUE)
end_year <- max(year(monthly_incidents$Month), na.rm = TRUE)
end_month <- max(month(monthly_incidents$Month), na.rm = TRUE)
# Check if start date is after end date
if (make_date(start_year, start_month) > make_date(end_year, end_month)) {
stop("'start' cannot be after 'end'")
}
# Now create the time series object
ts_data <- ts(monthly_incidents$Index, frequency=12, start=c(start_year, start_month))
```
```{r}
plot(ts_data, main = "Monthly Incidents Time Series", xlab = "Time", ylab = "Number of Incidents", col = "blue")
```
```{r}
decomposed_data <- decompose(ts_data)
plot(decomposed_data)
```
```{r}
incidents_by_severity <- aggregate(Index ~ Severity, data = data, FUN = length)
# Visualize the number of incidents by Severity
ggplot(incidents_by_severity, aes(x = Severity, y = Index, fill = Severity)) +
geom_bar(stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
labs(x = "Severity", y = "Frequency", title = "Frequency of Incidents by Severity")
```
```{r}
# Assuming 'data' is your dataframe and 'Severity' is the column with the severity level
# First, count the frequency of each severity level
severity_counts <- table(data$Severity)
# Convert the names of the table (the severity levels) to numeric ranks
severity_ranks <- as.numeric(factor(names(severity_counts),
levels = c("Minor", "Moderate", "Severe", "Extreme")))
# Perform Spearman's rank correlation test between severity ranks and their frequencies
cor.test(severity_ranks, severity_counts, method = "spearman")
```
```{r}
# Assuming 'data' is your data frame and 'Category' is the column with incident types
category_counts <- table(data$Category)
top_categories <- sort(category_counts, decreasing = TRUE)[1:5]
```
```{r}
# Convert table to data frame for filtering
top_categories_df <- as.data.frame(top_categories)
# Filter your original data for only top categories
top_data <- data[data$Category %in% names(top_categories), ]
```
```{r}
library(dplyr)
library(ggplot2)
library(maps)
# Assuming 'data' is your data frame, 'Category' is the column with incident types, and 'lon', 'lat' are your longitude and latitude columns
# Calculate counts of incidents for each category at each location
top_data <- data %>%
count(Category, lon, lat) %>%
filter(Category %in% names(top_categories))
# Get world map data
world_map <- map_data("world")
# Create the plot
plot <- ggplot(data = world_map, aes(x = long, y = lat)) +
geom_polygon(aes(group = group), fill = "gray80", color = "white") +
geom_point(data = top_data, aes(x = lon, y = lat, color = Category, size = n), alpha = 0.7) +
scale_size(range = c(4, 16)) + # Adjust the size range as needed
scale_color_brewer(palette = "Dark2") +
labs(title = "Top 5 Categories of Incidents on World Map",
subtitle = "Size of point represents frequency of incidents",
size = "Number of Incidents") +
theme_minimal() +
theme(legend.position = "bottom")
# Save the plot
ggsave("incident_map.png", plot = plot, width = 20, height = 10, dpi = 300)
```
```{r}
library(dplyr)
library(ggplot2)
library(maps)
library(scales) # For more refined control over point sizes
# Assuming 'data' is your data frame, 'Category' is the column with incident types, and 'lon', 'lat' are your longitude and latitude columns
# Calculate counts of incidents for each category at each location
top_data <- data %>%
count(Category, lon, lat) %>%
filter(Category %in% names(top_categories)) %>%
mutate(size = sqrt(n)) # Use square root scaling for point sizes
# Get world map data
world_map <- map_data("world")
# Create the plot with improved aesthetics
incident_map <- ggplot(data = world_map, aes(x = long, y = lat)) +
geom_polygon(aes(group = group), fill = "lightblue", color = "white") + # Use a different fill color for water
geom_point(data = top_data, aes(x = lon, y = lat, color = Category, size = size), alpha = 0.6) +
scale_size_continuous(trans = "identity", range = c(1, 12)) + # Use identity transformation and adjust the size range
scale_color_brewer(palette = "Dark2", name = "Category") +
labs(title = "Top 5 Categories of Incidents on World Map",
subtitle = "Size of point represents frequency of incidents",
size = "Frequency (sqrt scale)") + # Updated legend title to reflect sqrt scaling
coord_quickmap() + # Use an equirectangular projection
theme_minimal() +
theme(legend.position = "bottom",
legend.key.size = unit(0.5, "cm")) # Adjust legend key size for better appearance
# Save the plot using the new variable name
ggsave("incident_map_refined.png", plot = incident_map, width = 12, height = 8, dpi = 300) # Adjusted dimensions for a better aspect ratio
```