indentlabs / notebook

Notebook.ai is a set of tools for writers, game designers, and roleplayers to create magnificent universes – and everything within them.
http://www.notebook.ai
MIT License
353 stars 72 forks source link

Infographic (marketing) #182

Open drusepth opened 7 years ago

drusepth commented 7 years ago

Starting to gather some data to make some kind of infographic about worldbuilding. Will post snippets and results here, and am also interested in what kinds of stats you guys would be interested in seeing as well.

drusepth commented 7 years ago

Last updated: Sept 30, 2017

Universes

"Total words written in descriptions"

Universe.all.map(&:description).reject(&:nil?).map { |d| d.split(' ').count }.reject(&:zero?).sum => 71996

"Average word count of description"

wcs = Universe.all.map(&:description).reject(&:nil?).map { |d| d.split(' ').count }.reject(&:zero?) wcs.sum / wcs.count => 20 (bar graph)

"Total words written in histories"

Universe.all.map(&:history).reject(&:nil?).map { |d| d.split(' ').count }.reject(&:zero?).sum => 237650

"Average word count of history"

wcs = Universe.all.map(&:history).reject(&:nil?).map { |d| d.split(' ').count }.reject(&:zero?) wcs.sum / wcs.count => 176 (bar graph)

Characters

"Most common name"

Character.where.not(name: nil).where.not(name: "").group(:name).order('count_id DESC').limit(10).count(:id) => {"Michael"=>11, "Death"=>10, "David"=>9, "Bob"=>9, "Alex"=>9, "Jack"=>8, "William"=>7, "John"=>7, "Alice"=>7, "Adam"=>7} (pie chart)

"Total unique names"

Character.where.not(name: nil).where.not(name: "").group(:name).count.keys.count => 14100

"Most common role"

Character.where.not(role: nil).where.not(role: "").group(:role).order('count_id DESC').limit(10).count(:id) => {"Protagonist"=>378, "Main Character"=>190, "Main character"=>104, "Antagonist"=>86, "Supporting Character"=>68, "Background"=>63, "Hero"=>42, "Protagonist "=>41, "God"=>38, "Side Character"=>35} (pie chart)

"Most common age"

Character.where.not(age: nil).where.not(age: "").group(:age).order('count_id DESC').limit(10).count(:id) => {"17"=>261, "16"=>242, "18"=>238, "19"=>227, "20"=>192, "24"=>191, "22"=>173, "25"=>172, "23"=>171, "28"=>168} (pie chart)

"Average age" (for ages over 1000)

ages = Character.all.map(&:age).map(&:to_i).reject(&:zero?).reject { |age| age < 1000 } ages.sum / ages.count => 115842752 (bar graph)

"Average age" (for ages under 1000)

ages = Character.all.map(&:age).map(&:to_i).reject(&:zero?).reject { |age| age > 1000 } ages.sum / ages.count => 45 (bar graph)

"Average age" (for ages under 100)

ages = Character.all.map(&:age).map(&:to_i).reject(&:zero?).reject { |age| age > 100 } ages.sum / ages.count => 29 (bar graph)

"Number of negative ages"

Character.all.map(&:age).map(&:to_i).reject(&:zero?).select { |age| age < 0 }.count => 2

"Most common gender"

Character.where.not(gender: nil).where.not(gender: "").group(:gender).order('count_id DESC').limit(10).count(:id) => {"Male"=>4897, "Female"=>3088, "male"=>320, "female"=>239, "Male."=>95, "Female."=>75, "M"=>67, "F"=>55, "Male "=>53, "Female "=>44} (pie chart, merge male/female variants)

"Most common hair colors"

Character.where.not(haircolor: nil).where.not(haircolor: "").group(:haircolor).order('count_id DESC').limit(10).count(:id) => {"Black"=>875, "Brown"=>536, "Blonde"=>264, "Red"=>171, "White"=>170, "Dark brown"=>152, "black"=>128, "Blond"=>105, "Dark Brown"=>97, "Grey"=>91}

"Most common eye color"

Character.where.not(eyecolor: nil).where.not(eyecolor: "").group(:eyecolor).order('count_id DESC').limit(10).count(:id) => {"Brown"=>725, "Blue"=>625, "Green"=>452, "brown"=>140, "Black"=>133, "Hazel"=>127, "Red"=>122, "Grey"=>109, "Dark brown"=>103, "blue"=>96}

"Most common heights"

Character.where.not(height: nil).where.not(height: "").group(:height).order('count_id DESC').limit(10).count(:id) => {"5'8\""=>104, "5'6\""=>93, "5'10\""=>90, "5'9\""=>87, "5'7\""=>82, "Tall"=>81, "5'11\""=>79, "5'5\""=>72, "6'"=>72, "6'0\""=>69}

"Most common weights"

Character.where.not(weight: nil).where.not(weight: "").group(:weight).order('count_id DESC').limit(10).count(:id) => {"Average"=>98, "140"=>54, "180"=>50, "130"=>49, "150"=>48, "120"=>41, "160"=>37, "N/A"=>32, "200"=>30, "190"=>28}

"Most common race"

Character.where.not(race: nil).where.not(race: "").group(:race).order('count_id DESC').limit(10).count(:id) => {"Human"=>1069, "Caucasian"=>190, "White"=>153, "Human."=>94, "Elf"=>72, "Dwarf"=>70, "human"=>53, "Dragon"=>35, "white"=>35, "God"=>32}

"Most common skintone"

Character.where.not(skintone: nil).where.not(skintone: "").group(:skintone).order('count_id DESC').limit(10).count(:id) => {"Pale"=>518, "White"=>511, "Fair"=>151, "Tan"=>146, "Olive"=>115, "Light"=>110, "Tanned"=>96, "Brown"=>83, "pale"=>81, "Dark"=>64}

"Most common bodytype"

Character.where.not(bodytype: nil).where.not(bodytype: "").group(:bodytype).order('count_id DESC').limit(10).count(:id) => {"Athletic"=>162, "Slim"=>160, "Muscular"=>141, "Average"=>134, "Slender"=>103, "Thin"=>99, "Lean"=>68, "Skinny"=>64, "Fit"=>51, "Slim."=>44}

"Most common motivations"

Character.where.not(motivations: nil).where.not(motivations: "").group(:motivations).order('count_id DESC').limit(10).count(:id) => {"Money"=>17, "Power"=>17, "Unknown"=>12, "Revenge"=>11, "Survival"=>8, "Family"=>8, "Love"=>7, "Justice"=>7, "Honor"=>6, "Peace"=>5}

"Most common flaws"

Character.where.not(flaws: nil).where.not(flaws: "").group(:flaws).order('count_id DESC').limit(10).count(:id) => {"Unknown"=>13, "Arrogant"=>7, "Greed"=>7, "Impulsive"=>5, "Stubborn"=>5, "Reckless"=>5, "Quick to anger"=>4, "Naive"=>4, "Easily angered"=>3, "?"=>3}

"Most common religion"

Character.where.not(religion: nil).where.not(religion: "").group(:religion).order('count_id DESC').limit(10).count(:id) => {"None"=>237, "Atheist"=>112, "Agnostic"=>84, "N/A"=>58, "Catholic"=>36, "Christianity"=>34, "None."=>32, "none"=>30, "Christian"=>25, "Jewish"=>15}

"Most common occupation"

Character.where.not(occupation: nil).where.not(occupation: "").group(:occupation).order('count_id DESC').limit(10).count(:id) => {"Student"=>78, "King"=>46, "Soldier"=>31, "Mercenary"=>23, "None"=>23, "Queen"=>19, "N/A"=>17, "Hunter"=>16, "Thief"=>15, "Princess"=>15}

"Most favorited foods"

Character.where.not(fave_food: nil).where.not(fave_food: "").group(:fave_food).order('count_id DESC').limit(10).count(:id) => {"Pizza"=>38, "Steak"=>29, "N/A"=>26, "None"=>18, "Fish"=>13, "Unknown"=>12, "Pasta"=>12, "Sweets"=>11, "Chicken"=>11, "Tacos"=>10}

"Most favorited weapons"

Character.where.not(fave_weapon: nil).where.not(fave_weapon: "").group(:fave_weapon).order('count_id DESC').limit(10).count(:id) => {"Sword"=>45, "None"=>39, "Magic"=>30, "N/A"=>29, "Longsword"=>18, "Spear"=>18, "Dagger"=>16, "Bow"=>16, "Knife"=>16, "Bow and arrow"=>15}

"Most favorited animal"

Character.where.not(fave_animal: nil).where.not(fave_animal: "").group(:fave_animal).order('count_id DESC').limit(10).count(:id) => {"Cat"=>56, "Dog"=>49, "Wolf"=>47, "Cats"=>30, "Dogs"=>27, "None"=>26, "Bear"=>23, "Horse"=>22, "Lion"=>22, "Fox"=>19} (cat/dog needs merged)

TBD: family sizes?

Locations

"Most common location type"

Location.where.not(type_of: [nil, ""]).group(:type_of).order('count_id DESC').limit(10).count(:id) => {"City"=>931, "Country"=>352, "Planet"=>278, "Continent"=>182, "Town"=>153, "Region"=>121, "Nation"=>118, "Kingdom"=>116, "Island"=>92, "Village"=>92}

"Most common climates"

Location.where.not(climate: [nil, ""]).group(:climate).order('count_id DESC').limit(10).count(:id) => {"Temperate"=>98, "Warm"=>23, "Tropical"=>21, "Cold"=>20, "Warm."=>10, "Desert"=>9, "Arid"=>9, "Mediterranean"=>9, "Cold."=>8, "Mild"=>7}

Items

"Most common types"

Item.where.not(item_type: [nil, ""]).group(:item_type).order('count_id DESC').limit(10).count(:id) => {"Sword"=>71, "Weapon"=>69, "Book"=>25, "Artifact"=>23, "Bow"=>13, "Material"=>13, "Staff"=>11, "Wondrous item, Artifact (requires attunement)"=>11, "Devil Fruit"=>10, "Independent Guild"=>9} (maybe not on this, since data seems to come from just a few users)

"Most common materials"

Item.where.not(materials: [nil, ""]).group(:materials).order('count_id DESC').limit(10).count(:id) => {"Steel"=>18, "Metal."=>15, "Steel."=>11, "Metal"=>10, "Gold"=>9, "Wood"=>8, "Silver"=>7, "Unknown"=>6, "Osmium"=>6, "Obsidian"=>4} (metal needs merged)