# Load dplyr for data manipulation
library(dplyr)
create_bird_dataset <- function(seed = 50, samples_per_species = 1000) {
set.seed(seed)
species <- c("Peregrine Falcon", "Mallard Duck", "American Robin", "Bald Eagle", "House Sparrow",
"Great Horned Owl", "Northern Cardinal", "Canada Goose", "European Starling", "Ruby-throated Hummingbird")
bird_attributes <- list(
"Peregrine Falcon" = list(weight = c(700, 1500), speed = c(320, 390), beak = c(20, 25), wing = c(350, 400), diet = "Carnivore", max_age = 20),
"Mallard Duck" = list(weight = c(700, 1300), speed = c(80, 100), beak = c(30, 45), wing = c(250, 300), diet = "Omnivore", max_age = 15),
"American Robin" = list(weight = c(75, 85), speed = c(30, 50), beak = c(12, 15), wing = c(150, 180), diet = "Omnivore", max_age = 6),
"Bald Eagle" = list(weight = c(3000, 6300),speed = c(120, 160), beak = c(40, 50), wing = c(1800, 2300), diet = "Carnivore", max_age = 25),
"House Sparrow" = list(weight = c(24, 40), speed = c(40, 50), beak = c(7, 10), wing = c(80, 110), diet = "Omnivore", max_age = 5),
"Great Horned Owl" = list(weight = c(900, 1600), speed = c(40, 55), beak = c(25, 30), wing = c(400, 500), diet = "Carnivore", max_age = 18),
"Northern Cardinal"= list(weight = c(40, 50), speed = c(30, 50), beak = c(13, 16), wing = c(110, 140), diet = "Omnivore", max_age = 7),
"Canada Goose" = list(weight = c(3000, 6000),speed = c(65, 90), beak = c(40, 60), wing = c(400, 550), diet = "Herbivore", max_age = 25),
"European Starling"= list(weight = c(70, 100), speed = c(50, 60), beak = c(14, 17), wing = c(150, 180), diet = "Omnivore", max_age = 6),
"Ruby-throated Hummingbird" = list(weight = c(2, 4), speed = c(40, 50), beak = c(10, 12), wing = c(50, 60), diet = "Omnivore", max_age = 5)
)
generate_bird_data <- function(species_name, n) {
attrs <- bird_attributes[[species_name]]
weight <- runif(n, attrs$weight[1], attrs$weight[2])
speed <- runif(n, attrs$speed[1], attrs$speed[2])
beak_depth <- runif(n, attrs$beak[1], attrs$beak[2])
wing_length <- runif(n, attrs$wing[1], attrs$wing[2])
gender <- sample(c("Male", "Female"), n, replace = TRUE)
age <- runif(n, 0, attrs$max_age)
diet <- rep(attrs$diet, n)
data.frame(
Species = species_name,
Weight_g = round(weight, 1),
Top_Speed_kmh = round(speed, 1),
Beak_Depth_mm = round(beak_depth, 1),
Wing_Length_mm = round(wing_length, 1),
Gender = gender,
Age_years = round(age, 1),
Diet = diet
)
}
bird_dataset <- do.call(rbind, lapply(species, generate_bird_data, n = samples_per_species))
# Convert categorical columns to factors for better handling
bird_dataset$Species <- as.factor(bird_dataset$Species)
bird_dataset$Gender <- as.factor(bird_dataset$Gender)
bird_dataset$Diet <- as.factor(bird_dataset$Diet)
return(bird_dataset)
}
# Generate the full bird dataset
birds <- create_bird_dataset()
# Sample 20 rows per species for display
sampled_birds <- birds %>%
group_by(Species) %>%
slice_sample(n = 20) %>%
ungroup()
# Print the sampled data table
print(sampled_birds)
NA
data("sampled_birds")
Warning in data("sampled_birds") : data set ‘sampled_birds’ not found
library(tidyverse)
library(ggplot2)
ggplot(sampled_birds,aes(Top_Speed_kmh))+
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with
`binwidth`.

NA
This graph shows that the majority of birds are in the
0-200 kilometers per hours range
ggplot(sampled_birds,aes(Beak_Depth_mm,fill = Species))+
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with
`binwidth`.

This graph shows the different species and how they have different
beak depth.
ggplot(sampled_birds,aes(Top_Speed_kmh,fill = Gender))+
geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with
`binwidth`.

This shows that there is no correlation between genders and top
speed.
ggplot(sampled_birds,aes(Wing_Length_mm,fill = Species))+
geom_histogram()
ggplot(sampled_birds,aes(Beak_Depth_mm,fill = Diet))+
geom_histogram()
ggplot(sampled_birds, aes(x = Weight_g, y = Wing_Length_mm)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
labs(title = "Birds", x = "Weight", y = "Wing Length")
model <- lm(Top_Speed_kmh ~ Wing_Length_mm, data = sampled_birds)
summary(model)
ggplot(sampled_birds, aes(x = Top_Speed_kmh, y = Wing_Length_mm)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE)+
theme_minimal() +
labs(title = "Top Speed VS Wing Length")
I used code to generate data about birds
ggplot(sampled_birds, aes(x = Beak_Depth_mm, y = Wing_Length_mm)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE) +
theme_minimal() +
labs(title = "Beak Depth VS Wing Length")
`geom_smooth()` using formula = 'y ~ x'

This shows that the larger the beak the wider the wing length and the
opposite should also be true.
ggplot(sampled_birds, aes(x = Weight_g, y = Wing_Length_mm)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE)+
theme_minimal() +
labs(title = "Weight VS Wing Length")
`geom_smooth()` using formula = 'y ~ x'

This signifies that the weight affects the wing length.
ggplot(sampled_birds, aes(x = Beak_Depth_mm, y = Age_years)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE)+
theme_minimal() +
labs(title = "Beak Depth VS Age")
`geom_smooth()` using formula = 'y ~ x'

this shows that the correlation between beak depth and age have a
possitive slope.
LS0tCnRpdGxlOiAiQmlyZHMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojIExvYWQgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uCmxpYnJhcnkoZHBseXIpCgpjcmVhdGVfYmlyZF9kYXRhc2V0IDwtIGZ1bmN0aW9uKHNlZWQgPSA1MCwgc2FtcGxlc19wZXJfc3BlY2llcyA9IDEwMDApIHsKICBzZXQuc2VlZChzZWVkKQogIAogIHNwZWNpZXMgPC0gYygiUGVyZWdyaW5lIEZhbGNvbiIsICJNYWxsYXJkIER1Y2siLCAiQW1lcmljYW4gUm9iaW4iLCAiQmFsZCBFYWdsZSIsICJIb3VzZSBTcGFycm93IiwKICAgICAgICAgICAgICAgIkdyZWF0IEhvcm5lZCBPd2wiLCAiTm9ydGhlcm4gQ2FyZGluYWwiLCAiQ2FuYWRhIEdvb3NlIiwgIkV1cm9wZWFuIFN0YXJsaW5nIiwgIlJ1YnktdGhyb2F0ZWQgSHVtbWluZ2JpcmQiKQogIAogIGJpcmRfYXR0cmlidXRlcyA8LSBsaXN0KAogICAgIlBlcmVncmluZSBGYWxjb24iID0gbGlzdCh3ZWlnaHQgPSBjKDcwMCwgMTUwMCksIHNwZWVkID0gYygzMjAsIDM5MCksIGJlYWsgPSBjKDIwLCAyNSksIHdpbmcgPSBjKDM1MCwgNDAwKSwgZGlldCA9ICJDYXJuaXZvcmUiLCBtYXhfYWdlID0gMjApLAogICAgIk1hbGxhcmQgRHVjayIgICAgID0gbGlzdCh3ZWlnaHQgPSBjKDcwMCwgMTMwMCksIHNwZWVkID0gYyg4MCwgMTAwKSwgIGJlYWsgPSBjKDMwLCA0NSksIHdpbmcgPSBjKDI1MCwgMzAwKSwgZGlldCA9ICJPbW5pdm9yZSIsIG1heF9hZ2UgPSAxNSksCiAgICAiQW1lcmljYW4gUm9iaW4iICAgPSBsaXN0KHdlaWdodCA9IGMoNzUsIDg1KSwgICAgc3BlZWQgPSBjKDMwLCA1MCksICAgYmVhayA9IGMoMTIsIDE1KSwgd2luZyA9IGMoMTUwLCAxODApLCBkaWV0ID0gIk9tbml2b3JlIiwgbWF4X2FnZSA9IDYpLAogICAgIkJhbGQgRWFnbGUiICAgICAgID0gbGlzdCh3ZWlnaHQgPSBjKDMwMDAsIDYzMDApLHNwZWVkID0gYygxMjAsIDE2MCksIGJlYWsgPSBjKDQwLCA1MCksIHdpbmcgPSBjKDE4MDAsIDIzMDApLCBkaWV0ID0gIkNhcm5pdm9yZSIsIG1heF9hZ2UgPSAyNSksCiAgICAiSG91c2UgU3BhcnJvdyIgICAgPSBsaXN0KHdlaWdodCA9IGMoMjQsIDQwKSwgICAgc3BlZWQgPSBjKDQwLCA1MCksICAgYmVhayA9IGMoNywgMTApLCAgd2luZyA9IGMoODAsIDExMCksIGRpZXQgPSAiT21uaXZvcmUiLCBtYXhfYWdlID0gNSksCiAgICAiR3JlYXQgSG9ybmVkIE93bCIgPSBsaXN0KHdlaWdodCA9IGMoOTAwLCAxNjAwKSwgc3BlZWQgPSBjKDQwLCA1NSksICAgYmVhayA9IGMoMjUsIDMwKSwgd2luZyA9IGMoNDAwLCA1MDApLCBkaWV0ID0gIkNhcm5pdm9yZSIsIG1heF9hZ2UgPSAxOCksCiAgICAiTm9ydGhlcm4gQ2FyZGluYWwiPSBsaXN0KHdlaWdodCA9IGMoNDAsIDUwKSwgICAgc3BlZWQgPSBjKDMwLCA1MCksICAgYmVhayA9IGMoMTMsIDE2KSwgd2luZyA9IGMoMTEwLCAxNDApLCBkaWV0ID0gIk9tbml2b3JlIiwgbWF4X2FnZSA9IDcpLAogICAgIkNhbmFkYSBHb29zZSIgICAgID0gbGlzdCh3ZWlnaHQgPSBjKDMwMDAsIDYwMDApLHNwZWVkID0gYyg2NSwgOTApLCAgIGJlYWsgPSBjKDQwLCA2MCksIHdpbmcgPSBjKDQwMCwgNTUwKSwgZGlldCA9ICJIZXJiaXZvcmUiLCBtYXhfYWdlID0gMjUpLAogICAgIkV1cm9wZWFuIFN0YXJsaW5nIj0gbGlzdCh3ZWlnaHQgPSBjKDcwLCAxMDApLCAgIHNwZWVkID0gYyg1MCwgNjApLCAgIGJlYWsgPSBjKDE0LCAxNyksIHdpbmcgPSBjKDE1MCwgMTgwKSwgZGlldCA9ICJPbW5pdm9yZSIsIG1heF9hZ2UgPSA2KSwKICAgICJSdWJ5LXRocm9hdGVkIEh1bW1pbmdiaXJkIiA9IGxpc3Qod2VpZ2h0ID0gYygyLCA0KSwgc3BlZWQgPSBjKDQwLCA1MCksIGJlYWsgPSBjKDEwLCAxMiksIHdpbmcgPSBjKDUwLCA2MCksIGRpZXQgPSAiT21uaXZvcmUiLCBtYXhfYWdlID0gNSkKICApCiAgCiAgZ2VuZXJhdGVfYmlyZF9kYXRhIDwtIGZ1bmN0aW9uKHNwZWNpZXNfbmFtZSwgbikgewogICAgYXR0cnMgPC0gYmlyZF9hdHRyaWJ1dGVzW1tzcGVjaWVzX25hbWVdXQogICAgCiAgICB3ZWlnaHQgPC0gcnVuaWYobiwgYXR0cnMkd2VpZ2h0WzFdLCBhdHRycyR3ZWlnaHRbMl0pCiAgICBzcGVlZCA8LSBydW5pZihuLCBhdHRycyRzcGVlZFsxXSwgYXR0cnMkc3BlZWRbMl0pCiAgICBiZWFrX2RlcHRoIDwtIHJ1bmlmKG4sIGF0dHJzJGJlYWtbMV0sIGF0dHJzJGJlYWtbMl0pCiAgICB3aW5nX2xlbmd0aCA8LSBydW5pZihuLCBhdHRycyR3aW5nWzFdLCBhdHRycyR3aW5nWzJdKQogICAgCiAgICBnZW5kZXIgPC0gc2FtcGxlKGMoIk1hbGUiLCAiRmVtYWxlIiksIG4sIHJlcGxhY2UgPSBUUlVFKQogICAgCiAgICBhZ2UgPC0gcnVuaWYobiwgMCwgYXR0cnMkbWF4X2FnZSkKICAgIAogICAgZGlldCA8LSByZXAoYXR0cnMkZGlldCwgbikKICAgIAogICAgZGF0YS5mcmFtZSgKICAgICAgU3BlY2llcyA9IHNwZWNpZXNfbmFtZSwKICAgICAgV2VpZ2h0X2cgPSByb3VuZCh3ZWlnaHQsIDEpLAogICAgICBUb3BfU3BlZWRfa21oID0gcm91bmQoc3BlZWQsIDEpLAogICAgICBCZWFrX0RlcHRoX21tID0gcm91bmQoYmVha19kZXB0aCwgMSksCiAgICAgIFdpbmdfTGVuZ3RoX21tID0gcm91bmQod2luZ19sZW5ndGgsIDEpLAogICAgICBHZW5kZXIgPSBnZW5kZXIsCiAgICAgIEFnZV95ZWFycyA9IHJvdW5kKGFnZSwgMSksCiAgICAgIERpZXQgPSBkaWV0CiAgICApCiAgfQogIAogIGJpcmRfZGF0YXNldCA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkoc3BlY2llcywgZ2VuZXJhdGVfYmlyZF9kYXRhLCBuID0gc2FtcGxlc19wZXJfc3BlY2llcykpCiAgCiAgIyBDb252ZXJ0IGNhdGVnb3JpY2FsIGNvbHVtbnMgdG8gZmFjdG9ycyBmb3IgYmV0dGVyIGhhbmRsaW5nCiAgYmlyZF9kYXRhc2V0JFNwZWNpZXMgPC0gYXMuZmFjdG9yKGJpcmRfZGF0YXNldCRTcGVjaWVzKQogIGJpcmRfZGF0YXNldCRHZW5kZXIgPC0gYXMuZmFjdG9yKGJpcmRfZGF0YXNldCRHZW5kZXIpCiAgYmlyZF9kYXRhc2V0JERpZXQgPC0gYXMuZmFjdG9yKGJpcmRfZGF0YXNldCREaWV0KQogIAogIHJldHVybihiaXJkX2RhdGFzZXQpCn0KCiMgR2VuZXJhdGUgdGhlIGZ1bGwgYmlyZCBkYXRhc2V0CmJpcmRzIDwtIGNyZWF0ZV9iaXJkX2RhdGFzZXQoKQoKIyBTYW1wbGUgMjAgcm93cyBwZXIgc3BlY2llcyBmb3IgZGlzcGxheQpzYW1wbGVkX2JpcmRzIDwtIGJpcmRzICU+JQogIGdyb3VwX2J5KFNwZWNpZXMpICU+JQogIHNsaWNlX3NhbXBsZShuID0gMjApICU+JQogIHVuZ3JvdXAoKQoKIyBQcmludCB0aGUgc2FtcGxlZCBkYXRhIHRhYmxlCnByaW50KHNhbXBsZWRfYmlyZHMpCgpgYGAKCmBgYHtyfQpkYXRhKCJzYW1wbGVkX2JpcmRzIikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dwbG90MikKYGBgCgpgYGB7cn0KZ2dwbG90KHNhbXBsZWRfYmlyZHMsYWVzKFRvcF9TcGVlZF9rbWgpKSsKICBnZW9tX2hpc3RvZ3JhbSgpCiAgCmBgYAoKVGhpcyBncmFwaCBzaG93cyB0aGF0IHRoZSBtYWpvcml0eSBvZiBiaXJkcyBhcmUgaW4gdGhlCgowLTIwMCBraWxvbWV0ZXJzIHBlciBob3VycyByYW5nZQoKYGBge3J9CmdncGxvdChzYW1wbGVkX2JpcmRzLGFlcyhCZWFrX0RlcHRoX21tLGZpbGwgPSBTcGVjaWVzKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKClRoaXMgZ3JhcGggc2hvd3MgdGhlIGRpZmZlcmVudCBzcGVjaWVzIGFuZCBob3cgdGhleSBoYXZlIGRpZmZlcmVudCBiZWFrIGRlcHRoLgoKYGBge3J9CmdncGxvdChzYW1wbGVkX2JpcmRzLGFlcyhUb3BfU3BlZWRfa21oLGZpbGwgPSBHZW5kZXIpKSsKICBnZW9tX2hpc3RvZ3JhbSgpCgpgYGAKClRoaXMgc2hvd3MgdGhhdCB0aGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIGdlbmRlcnMgYW5kIHRvcCBzcGVlZC4KCmBgYHtyfQpnZ3Bsb3Qoc2FtcGxlZF9iaXJkcyxhZXMoV2luZ19MZW5ndGhfbW0sZmlsbCA9IFNwZWNpZXMpKSsKICBnZW9tX2hpc3RvZ3JhbSgpCmBgYAoKYGBge3J9CmdncGxvdChzYW1wbGVkX2JpcmRzLGFlcyhCZWFrX0RlcHRoX21tLGZpbGwgPSBEaWV0KSkrCiAgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qoc2FtcGxlZF9iaXJkcywgYWVzKHggPSBXZWlnaHRfZywgeSA9IFdpbmdfTGVuZ3RoX21tKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiQmlyZHMiLCB4ID0gIldlaWdodCIsIHkgPSAiV2luZyBMZW5ndGgiKQoKYGBgCgpgYGB7cn0KbW9kZWwgPC0gbG0oVG9wX1NwZWVkX2ttaCB+IFdpbmdfTGVuZ3RoX21tLCBkYXRhID0gc2FtcGxlZF9iaXJkcykKc3VtbWFyeShtb2RlbCkKCmBgYAoKYGBge3J9CmdncGxvdChzYW1wbGVkX2JpcmRzLCBhZXMoeCA9IFRvcF9TcGVlZF9rbWgsIHkgPSBXaW5nX0xlbmd0aF9tbSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkrCiAgdGhlbWVfbWluaW1hbCgpICsKICBsYWJzKHRpdGxlID0gIlRvcCBTcGVlZCBWUyBXaW5nIExlbmd0aCIpCmBgYAoKSSB1c2VkIGNvZGUgdG8gZ2VuZXJhdGUgZGF0YSBhYm91dCBiaXJkcwoKYGBge3J9CmdncGxvdChzYW1wbGVkX2JpcmRzLCBhZXMoeCA9IEJlYWtfRGVwdGhfbW0sIHkgPSBXaW5nX0xlbmd0aF9tbSkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJCZWFrIERlcHRoIFZTIFdpbmcgTGVuZ3RoIikKYGBgCgpUaGlzIHNob3dzIHRoYXQgdGhlIGxhcmdlciB0aGUgYmVhayB0aGUgd2lkZXIgdGhlIHdpbmcgbGVuZ3RoIGFuZCB0aGUgb3Bwb3NpdGUgc2hvdWxkIGFsc28gYmUgdHJ1ZS4KCmBgYHtyfQpnZ3Bsb3Qoc2FtcGxlZF9iaXJkcywgYWVzKHggPSBXZWlnaHRfZywgeSA9IFdpbmdfTGVuZ3RoX21tKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiV2VpZ2h0IFZTIFdpbmcgTGVuZ3RoIikKYGBgCgpUaGlzIHNpZ25pZmllcyB0aGF0IHRoZSB3ZWlnaHQgYWZmZWN0cyB0aGUgd2luZyBsZW5ndGguCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3Qoc2FtcGxlZF9iaXJkcywgYWVzKHggPSBCZWFrX0RlcHRoX21tLCB5ID0gQWdlX3llYXJzKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiQmVhayBEZXB0aCBWUyBBZ2UiKQpgYGAKCnRoaXMgc2hvd3MgdGhhdCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBiZWFrIGRlcHRoIGFuZCBhZ2UgaGF2ZSBhIHBvc3NpdGl2ZSBzbG9wZS4K