give me code sections of preprocessing,eda and preidctiv emodelling 
# Load required libraries
library(dplyr)
library(lubridate)
library(tidyr)
library(ggplot2)
library(sf)
library(leaflet)
library(htmlwidgets)
library(prophet)
library(RColorBrewer)
library(rworldmap)

# Assume that ‘CV_LatLon_21Jan_12Mar’ is the pre-loaded dataframe containing the COVID-19 data

# Clean data
data <- CV_LatLon_21Jan_12Mar %>% 
  mutate(
    state = replace_na(state, “Unknown”),
    country = replace_na(country, “Unknown”),  # Added country column handling
    date = as.Date(date, format = “%m/%d/%y”),  # Specify the date format
	lat = as.numeric(lat),
    lon = as.numeric(lon)
  ) %>% 
  filter(
    lat >= -90 & lat <= 90 & 
    lon >= -180 & lon <= 180 & 
    !(confirmed == 0 & recovered == 0 & death == 0)
  )

# Aggregate data by country
agg_data <- data %>%
  group_by(country) %>%
  summarise(
    total_confirmed = sum(confirmed),
    total_recovered = sum(recovered),
    total_deaths = sum(death)
  ) %>%
  ungroup()

# Visualizations
# Top countries by confirmed cases
top_countries_confirmed <- agg_data %>% 
  arrange(desc(total_confirmed)) %>% 
  head(10)
ggplot(top_countries_confirmed, aes(x=reorder(country, total_confirmed), y=total_confirmed)) +
  geom_bar(stat=“identity”, fill=“steelblue”) +
  coord_flip() +
  labs(title=“Top 10 Countries by Confirmed Cases”, x=“Country”, y=“Total Confirmed Cases”)

# Top countries by deaths
top_countries_deaths <- agg_data %>% 
  arrange(desc(total_deaths)) %>% 
  head(10)
ggplot(top_countries_deaths, aes(x=reorder(country, total_deaths), y=total_deaths)) +
  geom_bar(stat=“identity”, fill=“red”) +
  coord_flip() +
  labs(title=“Top 10 Countries by Deaths”, x=“Country”, y=“Total Deaths”)

# Top countries by recovered cases
top_countries_recovered <- agg_data %>% 
  arrange(desc(total_recovered)) %>% 
  head(10)
ggplot(top_countries_recovered, aes(x=reorder(country, total_recovered), y=total_recovered)) +
  geom_bar(stat=“identity”, fill=“green”) +
  coord_flip() +
  labs(title=“Top 10 Countries by Recovered Cases”, x=“Country”, y=“Total Recovered Cases”)

# Geospatial Analysis Using Leaflet
# Convert to spatial object
data_sf <- st_as_sf(data, coords = c(“lon”, “lat”), crs = 4326)

# Interactive Map of Confirmed Cases
m_confirmed <- leaflet(data_sf) %>%
  addTiles() %>%
  addCircleMarkers(
    radius = ~log1p(confirmed + 1),
    color = “blue”,
    popup = ~paste0(“<strong>Country: </strong>”, country, “<br>”,
                    “<strong>Confirmed Cases: </strong>”, confirmed, “<br>”,
                    “<strong>Recovered: </strong>”, recovered, “<br>”,
                    “<strong>Deaths: </strong>”, death)
  ) %>%
  addLegend(“bottomright”, 
            colors = c(“blue”),
            labels = c(“Confirmed Cases”),
            opacity = 0.5,
            title = “COVID-19 Cases”)
saveWidget(m_confirmed, “Confirmed_Cases_Map.html”)

# Time Series Forecasting with Prophet
# Aggregate data by date
time_series_data <- data %>%
  group_by(date) %>%
  summarise(total_confirmed = sum(confirmed)) %>%
  ungroup()

# Handle NA values
time_series_data <- na.omit(time_series_data)

# First ensure your data is correctly structured
prophet_data <- time_series_data %>%
  rename(ds = date, y = total_confirmed)

# Fit the model with error handling
model <- tryCatch({
  prophet(prophet_data)  # Fit the prophet model
}, error = function(e) { 
  print("Error fitting model: ")
  print(e)
  return(NULL)  # Return NULL if an error occurs
})
# Disabling yearly seasonality. Run prophet with yearly.seasonality=TRUE to override this.
# Disabling daily seasonality. Run prophet with daily.seasonality=TRUE to override this.
# n.changepoints greater than number of observations. Using 23

# Proceed only if model fitting was successful
if (!is.null(model) && inherits(model, “prophet”)) {
  # Create future dataframe
  future <- make_future_dataframe(model, periods = 30)
  future <- future %>%
    mutate(ds = as.Date(ds, format = “%Y-%m-%d”))
  
  # Predict and visualize
  forecast <- predict(model, future)
  plot(model, forecast)
  prophet_plot_components(model, forecast)
} else {
  print(“Model fitting failed. Future dataframe and forecast were not created.”)
}

# Create future dataframe
future <- make_future_dataframe(model, periods = 30)
future <- future %>%
  mutate(ds = as.Date(ds, format = “%Y-%m-%d”)) # Ensure dates are in Date format
forecast <- predict(model, future)

# Visualize the forecast
if (exists(“model”) && !inherits(model, “error”)) {
  plot(model, forecast)
  prophet_plot_components(model, forecast)
}

# Summary Statistics
summary_stats <- agg_data %>%
  summarise(
    total_confirmed = sum(total_confirmed),
    total_recovered = sum(total_recovered),
    total_deaths = sum(total_deaths),
    mean_confirmed = mean(total_confirmed),
    mean_recovered = mean(total_recovered),
    mean_deaths = mean(total_deaths)
  )
print(summary_stats)

# Heatmap
ggplot(data, aes(x = lon, y = lat)) +
  geom_hex(bins = 30) +
  scale_fill_gradient(low = “blue”, high = “red”) +
  labs(title=“Heatmap of COVID-19 Cases”,
       x=“Longitude”, y=“Latitude”)

# World Map Visualization Using Country
# Correct aggregation for country-level data
agg_data_country <- data %>%
  group_by(country) %>%
  summarise(
    total_confirmed = sum(confirmed),
    total_recovered = sum(recovered),
    total_deaths = sum(death)
  ) %>%
  ungroup()

# Join aggregated data with world map data using the country column
map_data <- joinCountryData2Map(agg_data_country, joinCode = “NAME”, nameJoinColumn = “country”)

# Plot the world map
par(mar = c(0, 0, 2, 0))
mapCountryData(map_data, nameColumnToPlot = “total_confirmed”, 
               mapTitle = “Global Distribution of COVID-19 Confirmed Cases”, 
               colourPalette = “heat”)