**The Epidemiological Journey of COVID-19 Vaccine: From Global Development to Bangladesh

Presented by : Pranto Bhattacharjee

ID: 25015037

Department of Public Health Canadian University of Bangladesh

Introduction: The Epidemiological Journey of COVID-19 Vaccine Initial Emergence: SARS-CoV-2 first identified in Wuhan, China (Dec 2019). Global Impact: Declared a pandemic by WHO in March 2020. Vaccine Breakthrough: First vaccines (Pfizer, AstraZeneca) rolled out in late 2020.

# Map 1: Primary Origin
library(leaflet)
leaflet() %>%
  addTiles() %>%
  setView(lng = 114.3, lat = 30.6, zoom = 4) %>%
  addCircleMarkers(lng = 114.3055, lat = 30.5928, color = "red", radius = 10,
                   popup = "Primary Origin: Wuhan, China")

Global Rollout: Historical Context ​The global vaccination journey began in late 2020. ​ First Country: The United Kingdom was the first to administer the Pfizer-BioNTech vaccine. ​Date: December 8, 2020.

library(leaflet)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# ১.data
vax_data <- data.frame(
  region = c("Bangladesh", "USA", "UK", "India", "China", "Pakistan", "Brazil", "Germany"),
  lat = c(23.685, 37.090, 55.378, 20.593, 35.861, 30.375, -14.235, 51.165),
  lng = c(90.356, -95.712, -3.436, 78.962, 104.195, 69.345, -51.925, 10.451),
  vax_rate = c(82, 79, 85, 75, 90, 65, 88, 80)
)

# ২.leflat map
leaflet(vax_data) %>%
  addTiles() %>%  
  addCircleMarkers(
    ~lng, ~lat, 
    radius = ~vax_rate/5,
    color = "darkgreen",
    fillOpacity = 0.7,
    popup = ~paste0("<b>Country: </b>", region, "<br><b>Vax Rate: </b>", vax_rate, "%")
  ) %>%
  setView(lng = 30, lat = 20, zoom = 2) 

Methodology: Tracking the Vaccination

Data Source: WHO and DGHS Bangladesh.

Metrics: Tracking first, second, and booster dose coverage.

Cold Chain: Monitoring storage requirements for mRNA vaccines.

# ১. প্রয়োজনীয় লাইব্রেরি লোড করা
if (!require(ggplot2)) install.packages("ggplot2") # যদি ইনস্টল না থাকে তবে করে নিবে
## Loading required package: ggplot2
library(ggplot2)

# ২. ডেটা ফ্রেম তৈরি
bd_divisions <- data.frame(
  Division = c("Dhaka", "Chattogram", "Rajshahi", "Khulna", "Sylhet", "Barishal", "Rangpur", "Mymensingh"),
  Doses_In_Millions = c(45.2, 32.5, 18.1, 17.8, 11.2, 9.8, 15.4, 12.1)
)

# ৩. প্লটিং
ggplot(bd_divisions, aes(x = reorder(Division, Doses_In_Millions), y = Doses_In_Millions, fill = Division)) +
  geom_bar(stat = "identity", color = "white") + 
  geom_text(aes(label = Doses_In_Millions), hjust = -0.2, size = 3.5) + 
  coord_flip() +
  expand_limits(y = 50) + # টেক্সট লেবেল যেন কেটে না যায় সেজন্য রেঞ্জ বাড়ানো হয়েছে
  labs(title = "Vaccination Distribution by Division in Bangladesh",
       subtitle = "Total doses administered across major divisions",
       x = "Division",
       y = "Total Doses (Millions)",
       caption = "Data Source: DGHS Trends") +
  theme_minimal() +
  theme(legend.position = "none")

Results & Discussion Infection Hotspots: Dhaka and Narayanganj were the primary hotspots during June 2020.

Recovery Insights: Although Dhaka had the highest cases, the recovery rate varied significantly across districts due to differences in healthcare infrastructure.

Data Observation: The circular markers on the map represent the intensity of the outbreak. Larger and darker red circles indicate higher infection rates.

# 1. Load Libraries
if (!require(leaflet)) install.packages("leaflet")
library(leaflet)

# 2. Data Preparation (64 Districts with Confirmed & Recovered Cases)
# Including coordinates for mapping
covid_data <- data.frame(
  district = c("Dhaka", "Chittagong", "Gazipur", "Narayanganj", "Cumilla", "Sylhet", "Rajshahi", "Bogra", "Khulna", "Barisal", "Rangpur", "Mymensingh", "Jessore", "Feni", "Noakhali", "Chandpur", "Brahmanbaria", "Narsingdi", "Tangail", "Manikganj", "Munshiganj", "Faridpur", "Madaripur", "Gopalganj", "Rajbari", "Shariatpur", "Kishoreganj", "Netrokona", "Sherpur", "Jamalpur", "Pabna", "Sirajganj", "Naogaon", "Natore", "Nawabganj", "Gaibandha", "Kurigram", "Nilphamari", "Dinajpur", "Panchagarh", "Thakurgaon", "Kushtia", "Magura", "Jhenaidah", "Chuadanga", "Meherpur", "Satkhira", "Bagerhat", "Narail", "Pirojpur", "Jhalokati", "Patuakhali", "Barguna", "Bhola", "Habiganj", "Moulvibazar", "Sunamganj", "Cox's Bazar", "Khagrachari", "Rangamati", "Bandarban", "Lakshmipur", "Lalmonirhat", "Joypurhat"),
  lat = c(23.8103, 22.3569, 24.0023, 23.6238, 23.4607, 24.8949, 24.3745, 24.8481, 22.8456, 22.7010, 25.7439, 24.7471, 23.1664, 23.0159, 22.8695, 23.2333, 23.9571, 23.9230, 24.2513, 23.8644, 23.5422, 23.6071, 23.1712, 23.0050, 23.7574, 23.2423, 24.4260, 24.8700, 25.0204, 24.9330, 24.0158, 24.4577, 24.9130, 24.4137, 24.5911, 25.3287, 25.8103, 25.9319, 25.6217, 26.3331, 26.0330, 23.9013, 23.4873, 23.5448, 23.6337, 23.7622, 22.7185, 22.6516, 23.1725, 22.5841, 22.6406, 22.3524, 22.1591, 22.6859, 24.3749, 24.4829, 25.0658, 21.4272, 23.1193, 22.6574, 22.1953, 22.9425, 25.9124, 25.1010),
  lon = c(90.4125, 91.7832, 90.4264, 90.5000, 91.1809, 91.8687, 88.6042, 89.3730, 89.5403, 90.3535, 89.2752, 90.4203, 89.2081, 91.3976, 91.0996, 90.6667, 91.1167, 90.7181, 89.9167, 90.0046, 90.5305, 89.8429, 90.1973, 89.8267, 89.6444, 90.4335, 90.7826, 90.7270, 90.0121, 89.9463, 89.2337, 89.7084, 88.9530, 88.9813, 88.2743, 89.5280, 89.6426, 88.8465, 88.6470, 88.5617, 88.4617, 89.1204, 89.4199, 89.1751, 88.8514, 88.6318, 89.0711, 89.7859, 89.5126, 89.9720, 90.1973, 90.3345, 90.1255, 90.6440, 91.4126, 91.7605, 91.3950, 92.0058, 91.9415, 92.1735, 92.2184, 90.8411, 89.4486, 89.0209),
  confirmed = sample(500:20000, 64), # Random sample data for project
  recovered = sample(100:5000, 64)
)

# 3. Create Color Palette
pal <- colorNumeric(palette = "YlOrRd", domain = covid_data$confirmed)

# 4. Create Map
leaflet(covid_data) %>%
  addTiles() %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng = ~lon, lat = ~lat,
    radius = ~sqrt(confirmed)/10, # Marker size based on confirmed cases
    color = ~pal(confirmed),
    fillOpacity = 0.7,
    stroke = FALSE,
    popup = ~paste0("<b>District: </b>", district, 
                    "<br><b>Confirmed: </b>", confirmed,
                    "<br><b>Recovered: </b>", recovered)
  ) %>%
  addLegend(pal = pal, values = ~confirmed, title = "Confirmed Cases", position = "bottomright")

Results: Bangladesh Vaccination Drive

Start Date: January 27, 2021.

Coverage: Over 150 million doses administered.

Hotspots: Dhaka and Chattogram show highest coverage.

# STEP 1: Load necessary libraries
if (!require(leaflet)) install.packages("leaflet")
library(leaflet)

# STEP 2: Create Dataset for 64 Districts
districts_data <- data.frame(
  district = c("Dhaka", "Chittagong", "Gazipur", "Narayanganj", "Cumilla", "Sylhet", "Rajshahi", "Bogra", "Khulna", "Barisal", "Rangpur", "Mymensingh", "Jessore", "Feni", "Noakhali", "Chandpur", "Brahmanbaria", "Narsingdi", "Tangail", "Manikganj", "Munshiganj", "Faridpur", "Madaripur", "Gopalganj", "Rajbari", "Shariatpur", "Kishoreganj", "Netrokona", "Sherpur", "Jamalpur", "Pabna", "Sirajganj", "Naogaon", "Natore", "Nawabganj", "Gaibandha", "Kurigram", "Nilphamari", "Dinajpur", "Panchagarh", "Thakurgaon", "Kushtia", "Magura", "Jhenaidah", "Chuadanga", "Meherpur", "Satkhira", "Bagerhat", "Narail", "Pirojpur", "Jhalokati", "Patuakhali", "Barguna", "Bhola", "Habiganj", "Moulvibazar", "Sunamganj", "Cox's Bazar", "Khagrachari", "Rangamati", "Bandarban", "Lakshmipur", "Lalmonirhat", "Joypurhat"),
  lat = c(23.8103, 22.3569, 24.0023, 23.6238, 23.4607, 24.8949, 24.3745, 24.8481, 22.8456, 22.7010, 25.7439, 24.7471, 23.1664, 23.0159, 22.8695, 23.2333, 23.9571, 23.9230, 24.2513, 23.8644, 23.5422, 23.6071, 23.1712, 23.0050, 23.7574, 23.2423, 24.4260, 24.8700, 25.0204, 24.9330, 24.0158, 24.4577, 24.9130, 24.4137, 24.5911, 25.3287, 25.8103, 25.9319, 25.6217, 26.3331, 26.0330, 23.9013, 23.4873, 23.5448, 23.6337, 23.7622, 22.7185, 22.6516, 23.1725, 22.5841, 22.6406, 22.3524, 22.1591, 22.6859, 24.3749, 24.4829, 25.0658, 21.4272, 23.1193, 22.6574, 22.1953, 22.9425, 25.9124, 25.1010),
  lon = c(90.4125, 91.7832, 90.4264, 90.5000, 91.1809, 91.8687, 88.6042, 89.3730, 89.5403, 90.3535, 89.2752, 90.4203, 89.2081, 91.3976, 91.0996, 90.6667, 91.1167, 90.7181, 89.9167, 90.0046, 90.5305, 89.8429, 90.1973, 89.8267, 89.6444, 90.4335, 90.7826, 90.7270, 90.0121, 89.9463, 89.2337, 89.7084, 88.9530, 88.9813, 88.2743, 89.5280, 89.6426, 88.8465, 88.6470, 88.5617, 88.4617, 89.1204, 89.4199, 89.1751, 88.8514, 88.6318, 89.0711, 89.7859, 89.5126, 89.9720, 90.1973, 90.3345, 90.1255, 90.6440, 91.4126, 91.7605, 91.3950, 92.0058, 91.9415, 92.1735, 92.2184, 90.8411, 89.4486, 89.0209),
  vax_count = sample(200000:1500000, 64, replace = TRUE) # Sample data
)

# STEP 3: Define Color Palette
pal <- colorNumeric(palette = "YlGnBu", domain = districts_data$vax_count)

# STEP 4: Create Interactive Map
leaflet(districts_data) %>%
  addTiles() %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng = ~lon, lat = ~lat,
    radius = ~sqrt(vax_count)/25,
    color = ~pal(vax_count),
    fillOpacity = 0.8,
    stroke = FALSE,
    popup = ~paste0("<b>District: </b>", district, 
                    "<br><b>Total Doses: </b>", format(vax_count, big.mark=","))
  ) %>%
  addLegend(pal = pal, values = ~vax_count, title = "Vaccinations", position = "bottomright")

Conclusion: Future Strategy

Regular Boosters: Transitioning to annual vaccination.

Local Production: Establishing vaccine plants in Bangladesh.

Awareness: Fighting vaccine hesitancy in rural areas.

# ============================================================
# PROJECT: COVID-19 DISTRICT-WISE ANALYSIS (BANGLADESH)
# ============================================================

# 1. LOAD LIBRARIES
if (!require(leaflet)) install.packages("leaflet")
if (!require(dplyr)) install.packages("dplyr")
if (!require(ggplot2)) install.packages("ggplot2")

library(leaflet)
library(dplyr)
library(ggplot2)

# 2. DATA PREPARATION (64 Districts with Sample Research Data)
# Note: Coordinates are set for all 64 districts of Bangladesh
bd_data <- data.frame(
  district = c("Dhaka", "Chittagong", "Gazipur", "Narayanganj", "Cumilla", "Sylhet", "Rajshahi", "Bogra", "Khulna", "Barisal", "Rangpur", "Mymensingh", "Jessore", "Feni", "Noakhali", "Chandpur", "Brahmanbaria", "Narsingdi", "Tangail", "Manikganj", "Munshiganj", "Faridpur", "Madaripur", "Gopalganj", "Rajbari", "Shariatpur", "Kishoreganj", "Netrokona", "Sherpur", "Jamalpur", "Pabna", "Sirajganj", "Naogaon", "Natore", "Nawabganj", "Gaibandha", "Kurigram", "Nilphamari", "Dinajpur", "Panchagarh", "Thakurgaon", "Kushtia", "Magura", "Jhenaidah", "Chuadanga", "Meherpur", "Satkhira", "Bagerhat", "Narail", "Pirojpur", "Jhalokati", "Patuakhali", "Barguna", "Bhola", "Habiganj", "Moulvibazar", "Sunamganj", "Cox's Bazar", "Khagrachari", "Rangamati", "Bandarban", "Lakshmipur", "Lalmonirhat", "Joypurhat"),
  lat = c(23.8103, 22.3569, 24.0023, 23.6238, 23.4607, 24.8949, 24.3745, 24.8481, 22.8456, 22.7010, 25.7439, 24.7471, 23.1664, 23.0159, 22.8695, 23.2333, 23.9571, 23.9230, 24.2513, 23.8644, 23.5422, 23.6071, 23.1712, 23.0050, 23.7574, 23.2423, 24.4260, 24.8700, 25.0204, 24.9330, 24.0158, 24.4577, 24.9130, 24.4137, 24.5911, 25.3287, 25.8103, 25.9319, 25.6217, 26.3331, 26.0330, 23.9013, 23.4873, 23.5448, 23.6337, 23.7622, 22.7185, 22.6516, 23.1725, 22.5841, 22.6406, 22.3524, 22.1591, 22.6859, 24.3749, 24.4829, 25.0658, 21.4272, 23.1193, 22.6574, 22.1953, 22.9425, 25.9124, 25.1010),
  lon = c(90.4125, 91.7832, 90.4264, 90.5000, 91.1809, 91.8687, 88.6042, 89.3730, 89.5403, 90.3535, 89.2752, 90.4203, 89.2081, 91.3976, 91.0996, 90.6667, 91.1167, 90.7181, 89.9167, 90.0046, 90.5305, 89.8429, 90.1973, 89.8267, 89.6444, 90.4335, 90.7826, 90.7270, 90.0121, 89.9463, 89.2337, 89.7084, 88.9530, 88.9813, 88.2743, 89.5280, 89.6426, 88.8465, 88.6470, 88.5617, 88.4617, 89.1204, 89.4199, 89.1751, 88.8514, 88.6318, 89.0711, 89.7859, 89.5126, 89.9720, 90.1973, 90.3345, 90.1255, 90.6440, 91.4126, 91.7605, 91.3950, 92.0058, 91.9415, 92.1735, 92.2184, 90.8411, 89.4486, 89.0209),
  confirmed = sample(1000:30000, 64), 
  recovered = sample(500:8000, 64)
)

# 3. ANALYSIS CALCULATIONS
bd_data <- bd_data %>%
  mutate(recovery_rate = (recovered / confirmed) * 100)

# ------------------------------------------------------------
# TOPIC 1: MAP OF HIGHEST LOAD DISTRICTS (Infection Burden)
# ------------------------------------------------------------
pal_load <- colorNumeric(palette = "Reds", domain = bd_data$confirmed)

map_load <- leaflet(bd_data) %>%
  addTiles() %>%
  addCircleMarkers(
    lng = ~lon, lat = ~lat,
    radius = ~sqrt(confirmed)/15,
    color = ~pal_load(confirmed),
    fillOpacity = 0.7,
    popup = ~paste0("<b>", district, "</b><br>Confirmed: ", confirmed)
  ) %>%
  addLegend(pal = pal_load, values = ~confirmed, title = "Total Confirmed", position = "bottomright")

# ------------------------------------------------------------
# TOPIC 2: MAP OF HIGHEST RECOVERY RATE (Health Performance)
# ------------------------------------------------------------
pal_recover <- colorNumeric(palette = "YlGn", domain = bd_data$recovery_rate)

map_recovery <- leaflet(bd_data) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addCircleMarkers(
    lng = ~lon, lat = ~lat,
    radius = 8,
    color = ~pal_recover(recovery_rate),
    fillOpacity = 0.9,
    popup = ~paste0("<b>", district, "</b><br>Recovery Rate: ", round(recovery_rate, 1), "%")
  ) %>%
  addLegend(pal = pal_recover, values = ~recovery_rate, title = "Recovery %", position = "bottomleft")

# ------------------------------------------------------------
# TOPIC 3: BAR CHART OF TOP 10 HIGHEST CASES
# ------------------------------------------------------------
top_10_plot <- bd_data %>%
  arrange(desc(confirmed)) %>%
  head(10) %>%
  ggplot(aes(x = reorder(district, -confirmed), y = confirmed, fill = confirmed)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Top 10 Districts with Highest COVID-19 Cases", x = "District", y = "Confirmed Cases") +
  scale_fill_gradient(low = "orange", high = "red")

# 4. VIEW RESULTS
print(top_10_plot) # Shows the Graph

map_load           # Shows the Infection Map
map_recovery       # Shows the Recovery Rate Map