Setup


Przygotujmy sobie przestrzeń do pracy. Najpierw ustawmy odpowiednią ścieżkę poleceniemsetwd(), a następnie wczytajmy (jeśli nie mamy zainstalujmy) niezbędne pakiety. W kolejnym kroku wczytajmy dane, które posłużą nam do nauki kolejnych poleceń (funkcji) w R

# install.packages("dplyr")
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
# albo całe "combo"
# install.packages("tidyverse") # https://www.tidyverse.org/
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ readr     2.1.5
## ✔ ggplot2   4.0.0     ✔ stringr   1.5.2
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.1.0     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
tidyverse_logo()
## ⬢ __  _    __   .    ⬡           ⬢  . 
##  / /_(_)__/ /_ ___  _____ _______ ___ 
## / __/ / _  / // / |/ / -_) __(_-</ -_)
## \__/_/\_,_/\_, /|___/\__/_/ /___/\__/ 
##      ⬢  . /___/      ⬡      .       ⬢


Dane


# https://r-data.pmagunia.com/dataset/county
# counties <- read.csv("https://r-data.pmagunia.com/system/files/datasets/admin/dataset-47806.csv")
# glimpse(counties)


Skąd możemy wziąć dane? Pamiętamy, że choćby z różnych pakietów. Dla inspiracji, pod kątem przyszłych projektów, zobaczmy kilka.

# install.packages("usdata")
library(usdata)
data("county") # na tym data set'cie chwile popracujemy


Bądź taki zestaw zbiorów danych.


# install.packages("openintro")
library(openintro)
## Loading required package: airports
## Loading required package: cherryblossom
(package_data <- 
    data(package = "openintro") # może nie być zbyt wygodne w przeglądaniu dziesiątek zbiorów
  )

listaZbiorowDanych <- as.data.frame(
  package_data$results
  ) # dla wygodnego przeglądania a'la Excel


i co tam mamy?

cia_factbook # brzmi dobrze i szpiegowsko
## # A tibble: 259 × 11
##    country       area birth_rate death_rate infant_mortality_rate internet_users
##    <fct>        <dbl>      <dbl>      <dbl>                 <dbl>          <dbl>
##  1 Russia      1.71e7       11.9      13.8                   7.08       40853000
##  2 Canada      9.98e6       10.3       8.31                  4.71       26960000
##  3 United Sta… 9.83e6       13.4       8.15                  6.17      245000000
##  4 China       9.60e6       12.2       7.44                 14.8       389000000
##  5 Brazil      8.51e6       14.7       6.54                 19.2        75982000
##  6 Australia   7.74e6       12.2       7.07                  4.43       15810000
##  7 India       3.29e6       19.9       7.35                 43.2        61338000
##  8 Argentina   2.78e6       16.9       7.34                  9.96       13694000
##  9 Kazakhstan  2.72e6       19.6       8.31                 21.6         5299000
## 10 Algeria     2.38e6       24.0       4.31                 21.8              NA
## # ℹ 249 more rows
## # ℹ 5 more variables: life_exp_at_birth <dbl>, maternal_mortality_rate <int>,
## #   net_migration_rate <dbl>, population <int>, population_growth_rate <dbl>
burger # "Burger preferences" :)
## # A tibble: 500 × 2
##    best_burger_place gender
##    <fct>             <fct> 
##  1 Five Guys Burgers Male  
##  2 Five Guys Burgers Male  
##  3 Five Guys Burgers Male  
##  4 Five Guys Burgers Male  
##  5 Five Guys Burgers Male  
##  6 Five Guys Burgers Female
##  7 Five Guys Burgers Female
##  8 Five Guys Burgers Female
##  9 Five Guys Burgers Female
## 10 Five Guys Burgers Female
## # ℹ 490 more rows
# etc.


# Instalacja potrzebnych pakietów 
install.packages(c("nycflights13", 
                   "ggplot2movies",
                   "babynames", "fivethirtyeight", "palmerpenguins", 
                   "datasets", "MASS", "titanic", "dslabs"))


NYCFLIGHTS13 - Loty z NYC (336,776 obserwacji) Szczegółowe dane o wszystkich lotach z NYC w 2013.

library(nycflights13)
glimpse(flights)  # 336,776 lotów - opóźnienia, trasy, czasy
## Rows: 336,776
## Columns: 19
## $ year           <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
## $ month          <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ day            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ dep_time       <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
## $ dep_delay      <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
## $ arr_time       <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
## $ arr_delay      <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
## $ carrier        <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
## $ flight         <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
## $ tailnum        <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
## $ origin         <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
## $ dest           <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
## $ air_time       <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
## $ distance       <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
## $ hour           <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
## $ minute         <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
## $ time_hour      <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…
glimpse(airlines) # Linie lotnicze
## Rows: 16
## Columns: 2
## $ carrier <chr> "9E", "AA", "AS", "B6", "DL", "EV", "F9", "FL", "HA", "MQ", "O…
## $ name    <chr> "Endeavor Air Inc.", "American Airlines Inc.", "Alaska Airline…
glimpse(airports) # Lotniska
## Rows: 1,458
## Columns: 8
## $ faa   <chr> "04G", "06A", "06C", "06N", "09J", "0A9", "0G6", "0G7", "0P2", "…
## $ name  <chr> "Lansdowne Airport", "Moton Field Municipal Airport", "Schaumbur…
## $ lat   <dbl> 41.13047, 32.46057, 41.98934, 41.43191, 31.07447, 36.37122, 41.4…
## $ lon   <dbl> -80.61958, -85.68003, -88.10124, -74.39156, -81.42778, -82.17342…
## $ alt   <dbl> 1044, 264, 801, 523, 11, 1593, 730, 492, 1000, 108, 409, 875, 10…
## $ tz    <dbl> -5, -6, -6, -5, -5, -5, -5, -5, -5, -8, -5, -6, -5, -5, -5, -5, …
## $ dst   <chr> "A", "A", "A", "A", "A", "A", "A", "A", "U", "A", "A", "U", "A",…
## $ tzone <chr> "America/New_York", "America/Chicago", "America/Chicago", "Ameri…
glimpse(planes)   # Szczegóły samolotów
## Rows: 3,322
## Columns: 9
## $ tailnum      <chr> "N10156", "N102UW", "N103US", "N104UW", "N10575", "N105UW…
## $ year         <int> 2004, 1998, 1999, 1999, 2002, 1999, 1999, 1999, 1999, 199…
## $ type         <chr> "Fixed wing multi engine", "Fixed wing multi engine", "Fi…
## $ manufacturer <chr> "EMBRAER", "AIRBUS INDUSTRIE", "AIRBUS INDUSTRIE", "AIRBU…
## $ model        <chr> "EMB-145XR", "A320-214", "A320-214", "A320-214", "EMB-145…
## $ engines      <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ seats        <int> 55, 182, 182, 182, 55, 182, 182, 182, 182, 182, 55, 55, 5…
## $ speed        <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ engine       <chr> "Turbo-fan", "Turbo-fan", "Turbo-fan", "Turbo-fan", "Turb…
glimpse(weather)  # Dane pogodowe
## Rows: 26,115
## Columns: 15
## $ origin     <chr> "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "EWR", "EW…
## $ year       <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,…
## $ month      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ day        <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ hour       <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, …
## $ temp       <dbl> 39.02, 39.02, 39.02, 39.92, 39.02, 37.94, 39.02, 39.92, 39.…
## $ dewp       <dbl> 26.06, 26.96, 28.04, 28.04, 28.04, 28.04, 28.04, 28.04, 28.…
## $ humid      <dbl> 59.37, 61.63, 64.43, 62.21, 64.43, 67.21, 64.43, 62.21, 62.…
## $ wind_dir   <dbl> 270, 250, 240, 250, 260, 240, 240, 250, 260, 260, 260, 330,…
## $ wind_speed <dbl> 10.35702, 8.05546, 11.50780, 12.65858, 12.65858, 11.50780, …
## $ wind_gust  <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 20.…
## $ precip     <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ pressure   <dbl> 1012.0, 1012.3, 1012.5, 1012.2, 1011.9, 1012.4, 1012.2, 101…
## $ visib      <dbl> 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,…
## $ time_hour  <dttm> 2013-01-01 01:00:00, 2013-01-01 02:00:00, 2013-01-01 03:00…


Przykładowe analizy:

  • Które linie lotnicze mają najwięcej opóźnień?

  • Jak pogoda wpływa na opóźnienia?

  • Która pora roku jest najlepsza do latania?


GGPLOT2MOVIES - 58,000 filmów z IMDB 58,788 filmów z ocenami, budżetami, gatunkami

glimpse(movies) 
## Rows: 140
## Columns: 5
## $ movie      <chr> "2Fast2Furious", "28DaysLater", "AGuyThing", "AManApart", "…
## $ genre      <chr> "action", "horror", "rom-comedy", "action", "comedy", "acti…
## $ score      <dbl> 48.9, 78.2, 39.5, 42.9, 79.9, 57.9, 35.1, 50.7, 62.6, 63.3,…
## $ rating     <chr> "PG-13", "R", "PG-13", "R", "PG-13", "PG", "PG-13", "R", "P…
## $ box_office <dbl> 127.146, 45.065, 15.545, 26.248, 17.781, 47.811, 14.219, 10…

Przykładowe analizy:

  • Jak zmieniały się oceny filmów przez lata?

  • Który gatunek ma najwyższe oceny?

  • Zależność między budżetem a oceną


BABYNAMES - Imiona dzieci w USA (1880-2017) 1,924,665 rekordów - popularność imion przez 137 lat

library(babynames)
## 
## Attaching package: 'babynames'
## The following object is masked from 'package:openintro':
## 
##     births
glimpse(babynames)
## Rows: 1,924,665
## Columns: 5
## $ year <dbl> 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880, 1880,…
## $ sex  <chr> "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", "F", …
## $ name <chr> "Mary", "Anna", "Emma", "Elizabeth", "Minnie", "Margaret", "Ida",…
## $ n    <int> 7065, 2604, 2003, 1939, 1746, 1578, 1472, 1414, 1320, 1288, 1258,…
## $ prop <dbl> 0.07238359, 0.02667896, 0.02052149, 0.01986579, 0.01788843, 0.016…


Przykładowe analizy:

  • Jak zmieniała się popularność Twojego imienia?

  • Najmodniejsze imiona w różnych dekadach

  • Różnice między imionami męskimi i żeńskimi


FIVETHIRTYEIGHT - Dane z artykułów dziennikarskich Wiele ciekawych zbiorów z prawdziwych analiz

library(fivethirtyeight)
## 
## Attaching package: 'fivethirtyeight'
## The following object is masked from 'package:openintro':
## 
##     drug_use

Test Bechdel w filmach

glimpse(bechdel)              # Test sprawdzający czy w filmie dwie kobiety rozmawiają ze sobą o czymś innym niż mężczyzna.
## Rows: 1,794
## Columns: 15
## $ year          <int> 2013, 2012, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 20…
## $ imdb          <chr> "tt1711425", "tt1343727", "tt2024544", "tt1272878", "tt0…
## $ title         <chr> "21 & Over", "Dredd 3D", "12 Years a Slave", "2 Guns", "…
## $ test          <chr> "notalk", "ok-disagree", "notalk-disagree", "notalk", "m…
## $ clean_test    <ord> notalk, ok, notalk, notalk, men, men, notalk, ok, ok, no…
## $ binary        <chr> "FAIL", "PASS", "FAIL", "FAIL", "FAIL", "FAIL", "FAIL", …
## $ budget        <int> 13000000, 45000000, 20000000, 61000000, 40000000, 225000…
## $ domgross      <dbl> 25682380, 13414714, 53107035, 75612460, 95020213, 383624…
## $ intgross      <dbl> 42195766, 40868994, 158607035, 132493015, 95020213, 1458…
## $ code          <chr> "2013FAIL", "2012PASS", "2013FAIL", "2013FAIL", "2013FAI…
## $ budget_2013   <int> 13000000, 45658735, 20000000, 61000000, 40000000, 225000…
## $ domgross_2013 <dbl> 25682380, 13611086, 53107035, 75612460, 95020213, 383624…
## $ intgross_2013 <dbl> 42195766, 41467257, 158607035, 132493015, 95020213, 1458…
## $ period_code   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…
## $ decade_code   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,…

Statystyki wypadków drogowych w USA

glimpse(bad_drivers)
## Rows: 51
## Columns: 8
## $ state               <chr> "Alabama", "Alaska", "Arizona", "Arkansas", "Calif…
## $ num_drivers         <dbl> 18.8, 18.1, 18.6, 22.4, 12.0, 13.6, 10.8, 16.2, 5.…
## $ perc_speeding       <int> 39, 41, 35, 18, 35, 37, 46, 38, 34, 21, 19, 54, 36…
## $ perc_alcohol        <int> 30, 25, 28, 26, 28, 28, 36, 30, 27, 29, 25, 41, 29…
## $ perc_not_distracted <int> 96, 90, 84, 94, 91, 79, 87, 87, 100, 92, 95, 82, 8…
## $ perc_no_previous    <int> 80, 94, 96, 95, 89, 95, 82, 99, 100, 94, 93, 87, 9…
## $ insurance_premiums  <dbl> 784.55, 1053.48, 899.47, 827.34, 878.41, 835.50, 1…
## $ losses              <dbl> 145.08, 133.93, 110.35, 142.39, 165.63, 139.91, 16…

Tweety (iXy) Donalda Trumpa

glimpse(trump_twitter)
## Rows: 448
## Columns: 3
## $ id         <dbl> 7.656299e+17, 7.587319e+17, 7.583505e+17, 7.575775e+17, 7.5…
## $ created_at <dttm> 2016-08-16 19:22:57, 2016-07-28 18:32:31, 2016-07-27 17:16…
## $ text       <chr> "It's just a 2-point race, Clinton 38%, Trump 36%' https://…

Ranking słodyczy

glimpse(candy_rankings)
## Rows: 85
## Columns: 13
## $ competitorname   <chr> "100 Grand", "3 Musketeers", "One dime", "One quarter…
## $ chocolate        <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, F…
## $ fruity           <lgl> FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE…
## $ caramel          <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,…
## $ peanutyalmondy   <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, …
## $ nougat           <lgl> FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,…
## $ crispedricewafer <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE…
## $ hard             <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALS…
## $ bar              <lgl> TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, F…
## $ pluribus         <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE…
## $ sugarpercent     <dbl> 0.732, 0.604, 0.011, 0.011, 0.906, 0.465, 0.604, 0.31…
## $ pricepercent     <dbl> 0.860, 0.511, 0.116, 0.511, 0.511, 0.767, 0.767, 0.51…
## $ winpercent       <dbl> 66.97173, 67.60294, 32.26109, 46.11650, 52.34146, 50.…

Przestępstwa z nienawiści

glimpse(hate_crimes)
## Rows: 51
## Columns: 13
## $ state                       <chr> "Alabama", "Alaska", "Arizona", "Arkansas"…
## $ state_abbrev                <chr> "AL", "AK", "AZ", "AR", "CA", "CO", "CT", …
## $ median_house_inc            <int> 42278, 67629, 49254, 44922, 60487, 60940, …
## $ share_unemp_seas            <dbl> 0.060, 0.064, 0.063, 0.052, 0.059, 0.040, …
## $ share_pop_metro             <dbl> 0.64, 0.63, 0.90, 0.69, 0.97, 0.80, 0.94, …
## $ share_pop_hs                <dbl> 0.821, 0.914, 0.842, 0.824, 0.806, 0.893, …
## $ share_non_citizen           <dbl> 0.02, 0.04, 0.10, 0.04, 0.13, 0.06, 0.06, …
## $ share_white_poverty         <dbl> 0.12, 0.06, 0.09, 0.12, 0.09, 0.07, 0.06, …
## $ gini_index                  <dbl> 0.472, 0.422, 0.455, 0.458, 0.471, 0.457, …
## $ share_non_white             <dbl> 0.35, 0.42, 0.49, 0.26, 0.61, 0.31, 0.30, …
## $ share_vote_trump            <dbl> 0.63, 0.53, 0.50, 0.60, 0.33, 0.44, 0.41, …
## $ hate_crimes_per_100k_splc   <dbl> 0.12583893, 0.14374012, 0.22531995, 0.0690…
## $ avg_hatecrimes_per_100k_fbi <dbl> 1.8064105, 1.6567001, 3.4139280, 0.8692089…
# Lista wszystkich zbiorów:
data(package = "fivethirtyeight")


PALMERPENGUINS - Pingwiny z Antarktydy (alternatywa dla iris) 344 pingwiny, 3 gatunki, pomiary biologiczne.

library(palmerpenguins)

glimpse(penguins)
## Rows: 344
## Columns: 8
## $ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, Adel…
## $ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torgerse…
## $ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.1, …
## $ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.1, …
## $ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, 186…
## $ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 3475, …
## $ sex               <fct> male, female, female, NA, female, male, female, male…
## $ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007…

Przykładowe analizy:

  • Klasyfikacja gatunków na podstawie pomiarów

  • Różnice między płciami

  • Machine learning i klasyfikacja


TITANIC - Pasażerowie Titanica 891 pasażerów z informacją o przeżyciu

library(titanic)

glimpse(titanic_train) 
## Rows: 891
## Columns: 12
## $ PassengerId <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,…
## $ Survived    <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1…
## $ Pclass      <int> 3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 3, 1, 3, 3, 3, 2, 3, 2, 3, 3…
## $ Name        <chr> "Braund, Mr. Owen Harris", "Cumings, Mrs. John Bradley (Fl…
## $ Sex         <chr> "male", "female", "female", "female", "male", "male", "mal…
## $ Age         <dbl> 22, 38, 26, 35, 35, NA, 54, 2, 27, 14, 4, 58, 20, 39, 14, …
## $ SibSp       <int> 1, 1, 0, 1, 0, 0, 0, 3, 0, 1, 1, 0, 0, 1, 0, 0, 4, 0, 1, 0…
## $ Parch       <int> 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 5, 0, 0, 1, 0, 0, 0…
## $ Ticket      <chr> "A/5 21171", "PC 17599", "STON/O2. 3101282", "113803", "37…
## $ Fare        <dbl> 7.2500, 71.2833, 7.9250, 53.1000, 8.0500, 8.4583, 51.8625,…
## $ Cabin       <chr> "", "C85", "", "C123", "", "", "E46", "", "", "", "G6", "C…
## $ Embarked    <chr> "S", "C", "S", "S", "S", "Q", "S", "S", "S", "C", "S", "S"…

Przykładowe analizy:

  • Kto miał większe szanse przeżycia?

  • Wpływ klasy, płci, wieku na przeżycie

  • Modelowanie predykcyjne


DSLABS - Zbiory do nauki Data Science

library(dslabs)
## 
## Attaching package: 'dslabs'
## The following object is masked from 'package:openintro':
## 
##     murders

Morderstwa w USA

glimpse(murders)
## Rows: 51
## Columns: 5
## $ state      <chr> "Alabama", "Alaska", "Arizona", "Arkansas", "California", "…
## $ abb        <chr> "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL",…
## $ region     <fct> South, West, West, South, West, West, Northeast, South, Sou…
## $ population <dbl> 4779736, 710231, 6392017, 2915918, 37253956, 5029196, 35740…
## $ total      <dbl> 135, 19, 232, 93, 1257, 65, 97, 38, 99, 669, 376, 7, 12, 36…

Wzrost i płeć

glimpse(heights)
## Rows: 1,050
## Columns: 2
## $ sex    <fct> Male, Male, Male, Male, Male, Female, Female, Female, Female, M…
## $ height <dbl> 75, 70, 68, 74, 61, 65, 66, 62, 66, 67, 72, 72, 69, 68, 69, 66,…

Skład chemiczny oliwy z oliwek

glimpse(olive)
## Rows: 572
## Columns: 10
## $ region      <fct> Southern Italy, Southern Italy, Southern Italy, Southern I…
## $ area        <fct> North-Apulia, North-Apulia, North-Apulia, North-Apulia, No…
## $ palmitic    <dbl> 10.75, 10.88, 9.11, 9.66, 10.51, 9.11, 9.22, 11.00, 10.82,…
## $ palmitoleic <dbl> 0.75, 0.73, 0.54, 0.57, 0.67, 0.49, 0.66, 0.61, 0.60, 0.55…
## $ stearic     <dbl> 2.26, 2.24, 2.46, 2.40, 2.59, 2.68, 2.64, 2.35, 2.39, 2.13…
## $ oleic       <dbl> 78.23, 77.09, 81.13, 79.52, 77.71, 79.24, 79.90, 77.28, 77…
## $ linoleic    <dbl> 6.72, 7.81, 5.49, 6.19, 6.72, 6.78, 6.18, 7.34, 7.09, 6.33…
## $ linolenic   <dbl> 0.36, 0.31, 0.31, 0.50, 0.50, 0.51, 0.49, 0.39, 0.46, 0.26…
## $ arachidic   <dbl> 0.60, 0.61, 0.63, 0.78, 0.80, 0.70, 0.56, 0.64, 0.83, 0.52…
## $ eicosenoic  <dbl> 0.29, 0.29, 0.29, 0.35, 0.46, 0.44, 0.29, 0.35, 0.33, 0.30…

Dane do rozpoznawania cyfr

glimpse(mnist_27)
## List of 5
##  $ train      :'data.frame': 800 obs. of  3 variables:
##   ..$ y  : Factor w/ 2 levels "2","7": 1 1 2 1 2 2 2 1 2 2 ...
##   ..$ x_1: num [1:800] 0.1392 0.0909 0.1964 0.2727 0.1556 ...
##   ..$ x_2: num [1:800] 0.316 0.299 0.196 0.336 0.2 ...
##  $ test       :'data.frame': 200 obs. of  3 variables:
##   ..$ y  : Factor w/ 2 levels "2","7": 1 1 1 1 2 2 2 1 2 2 ...
##   ..$ x_1: num [1:200] 0.023 0.0617 0.0465 0.046 0.175 ...
##   ..$ x_2: num [1:200] 0.264 0.272 0.314 0.322 0.4 ...
##  $ index_train: int [1:800] 5167 53374 44258 19964 45808 43920 49362 2333 42549 14742 ...
##  $ index_test : int [1:200] 30347 17556 43450 32036 869 27984 12782 54710 54543 15940 ...
##  $ true_p     :'data.frame': 15625 obs. of  3 variables:
##   ..$ x_1: num [1:15625] 0 0.00422 0.00845 0.01267 0.0169 ...
##   ..$ x_2: num [1:15625] 0 0 0 0 0 0 0 0 0 0 ...
##   ..$ p  : num [1:15625] 0.702 0.712 0.721 0.73 0.738 ...
##   ..- attr(*, "out.attrs")=List of 2
##   .. ..$ dim     : Named int [1:2] 125 125
##   .. .. ..- attr(*, "names")= chr [1:2] "x_1" "x_2"
##   .. ..$ dimnames:List of 2

Sondaże wyborcze 2016

glimpse(polls_us_election_2016)
## Rows: 4,208
## Columns: 15
## $ state            <fct> U.S., U.S., U.S., U.S., U.S., U.S., U.S., U.S., New M…
## $ startdate        <date> 2016-11-03, 2016-11-01, 2016-11-02, 2016-11-04, 2016…
## $ enddate          <date> 2016-11-06, 2016-11-07, 2016-11-06, 2016-11-07, 2016…
## $ pollster         <fct> "ABC News/Washington Post", "Google Consumer Surveys"…
## $ grade            <fct> A+, B, A-, B, B-, A, A-, A-, NA, A-, A+, A-, A+, B+, …
## $ samplesize       <int> 2220, 26574, 2195, 3677, 16639, 1295, 1426, 1282, 843…
## $ population       <chr> "lv", "lv", "lv", "lv", "rv", "lv", "lv", "lv", "lv",…
## $ rawpoll_clinton  <dbl> 47.00, 38.03, 42.00, 45.00, 47.00, 48.00, 45.00, 44.0…
## $ rawpoll_trump    <dbl> 43.00, 35.69, 39.00, 41.00, 43.00, 44.00, 41.00, 40.0…
## $ rawpoll_johnson  <dbl> 4.00, 5.46, 6.00, 5.00, 3.00, 3.00, 5.00, 6.00, 6.00,…
## $ rawpoll_mcmullin <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…
## $ adjpoll_clinton  <dbl> 45.20163, 43.34557, 42.02638, 45.65676, 46.84089, 49.…
## $ adjpoll_trump    <dbl> 41.72430, 41.21439, 38.81620, 40.92004, 42.33184, 43.…
## $ adjpoll_johnson  <dbl> 4.626221, 5.175792, 6.844734, 6.069454, 3.726098, 3.0…
## $ adjpoll_mcmullin <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N…



# Lista wszystkich:
data(package = "dslabs")


Marvel

# install.packages("fivethirtyeightdata", 
#                  repos = "https://fivethirtyeightdata.github.io/drat/", 
#                  type = "source")

library(fivethirtyeightdata)
data(package = "fivethirtyeightdata")

# Avengers (Mściciele)
avengers <- read.csv("https://raw.githubusercontent.com/fivethirtyeight/data/master/avengers/avengers.csv")



US Counties


Wracając do zbioru, którym będziemy się dziś zajmować.

# nowy sposób na podejrzenie zbioru, 
glimpse(county)
## Rows: 3,142
## Columns: 15
## $ name              <chr> "Autauga County", "Baldwin County", "Barbour County"…
## $ state             <fct> Alabama, Alabama, Alabama, Alabama, Alabama, Alabama…
## $ pop2000           <dbl> 43671, 140415, 29038, 20826, 51024, 11714, 21399, 11…
## $ pop2010           <dbl> 54571, 182265, 27457, 22915, 57322, 10914, 20947, 11…
## $ pop2017           <int> 55504, 212628, 25270, 22668, 58013, 10309, 19825, 11…
## $ pop_change        <dbl> 1.48, 9.19, -6.22, 0.73, 0.68, -2.28, -2.69, -1.51, …
## $ poverty           <dbl> 13.7, 11.8, 27.2, 15.2, 15.6, 28.5, 24.4, 18.6, 18.8…
## $ homeownership     <dbl> 77.5, 76.7, 68.0, 82.9, 82.0, 76.9, 69.0, 70.7, 71.4…
## $ multi_unit        <dbl> 7.2, 22.6, 11.1, 6.6, 3.7, 9.9, 13.7, 14.3, 8.7, 4.3…
## $ unemployment_rate <dbl> 3.86, 3.99, 5.90, 4.39, 4.02, 4.93, 5.49, 4.93, 4.08…
## $ metro             <fct> yes, yes, no, yes, yes, no, no, yes, no, no, yes, no…
## $ median_edu        <fct> some_college, some_college, hs_diploma, hs_diploma, …
## $ per_capita_income <dbl> 27841.70, 27779.85, 17891.73, 20572.05, 21367.39, 15…
## $ median_hh_income  <int> 55317, 52562, 33368, 43404, 47412, 29655, 36326, 436…
## $ smoking_ban       <fct> none, none, partial, none, none, none, NA, NA, none,…
# alternatywa do:
summary(county)
##      name                state         pop2000           pop2010       
##  Length:3142        Texas   : 254   Min.   :     67   Min.   :     82  
##  Class :character   Georgia : 159   1st Qu.:  11224   1st Qu.:  11114  
##  Mode  :character   Virginia: 133   Median :  24621   Median :  25872  
##                     Kentucky: 120   Mean   :  89650   Mean   :  98262  
##                     Missouri: 115   3rd Qu.:  61775   3rd Qu.:  66780  
##                     Kansas  : 105   Max.   :9519338   Max.   :9818605  
##                     (Other) :2256   NA's   :3                          
##     pop2017           pop_change          poverty      homeownership  
##  Min.   :      88   Min.   :-33.6300   Min.   : 2.40   Min.   : 0.00  
##  1st Qu.:   10976   1st Qu.: -1.9700   1st Qu.:11.30   1st Qu.:69.50  
##  Median :   25857   Median : -0.0600   Median :15.20   Median :74.60  
##  Mean   :  103763   Mean   :  0.5339   Mean   :15.97   Mean   :73.27  
##  3rd Qu.:   67756   3rd Qu.:  2.3750   3rd Qu.:19.40   3rd Qu.:78.40  
##  Max.   :10163507   Max.   : 37.1900   Max.   :52.00   Max.   :91.30  
##  NA's   :3          NA's   :3          NA's   :2                      
##    multi_unit    unemployment_rate  metro             median_edu  
##  Min.   : 0.00   Min.   : 1.620    no  :1974   below_hs    :   2  
##  1st Qu.: 6.10   1st Qu.: 3.520    yes :1165   hs_diploma  :1397  
##  Median : 9.70   Median : 4.360    NA's:   3   some_college:1695  
##  Mean   :12.32   Mean   : 4.611                bachelors   :  46  
##  3rd Qu.:15.90   3rd Qu.: 5.355                NA's        :   2  
##  Max.   :98.50   Max.   :19.070                                   
##                  NA's   :3                                        
##  per_capita_income median_hh_income   smoking_ban  
##  Min.   :10467     Min.   : 19264   none    :1927  
##  1st Qu.:21772     1st Qu.: 41126   partial : 635  
##  Median :25445     Median : 48073   complete:   0  
##  Mean   :26093     Mean   : 49765   NA's    : 580  
##  3rd Qu.:29276     3rd Qu.: 55771                  
##  Max.   :69533     Max.   :129588                  
##  NA's   :2         NA's   :2


No dobrze, a czym są counties?



select()


Zadanie

Ile jest tak w ogóle stanów w zbiorze?

Rozwiązanie

length(unique(county$state))
## [1] 51
# or
count(distinct(county, state))
## # A tibble: 1 × 1
##       n
##   <int>
## 1    51
county %>%
  summarise("# States" = n_distinct(state))
## # A tibble: 1 × 1
##   `# States`
##        <int>
## 1         51



Zadanie

Wybierzmy ze zbioru tylko zmienne: nazwa stanu, nazwa hrabstwa, populację w roku 2010 oraz zmienna dot. poziomu ubóstwa i stwórzmy nowy zbiór o nazwie counties_selected. Użyj funkcji plot() do zwizualizowania jak populacja i procent osób żyjących poniżej granicy ubóstwa, wyglądały w poszczególnych stanach (niekoniecznie na jednym rysunku).

Rozwiązanie

names(county) # "wy`print()`ujmy" sobie wszystkie nazwy zmiennych, żeby mieć je "pod ręką"
##  [1] "name"              "state"             "pop2000"          
##  [4] "pop2010"           "pop2017"           "pop_change"       
##  [7] "poverty"           "homeownership"     "multi_unit"       
## [10] "unemployment_rate" "metro"             "median_edu"       
## [13] "per_capita_income" "median_hh_income"  "smoking_ban"
(counties_selected <- county %>%
    select(state, 
           name, 
           pop2010, 
           poverty)
  )
## # A tibble: 3,142 × 4
##    state   name            pop2010 poverty
##    <fct>   <chr>             <dbl>   <dbl>
##  1 Alabama Autauga County    54571    13.7
##  2 Alabama Baldwin County   182265    11.8
##  3 Alabama Barbour County    27457    27.2
##  4 Alabama Bibb County       22915    15.2
##  5 Alabama Blount County     57322    15.6
##  6 Alabama Bullock County    10914    28.5
##  7 Alabama Butler County     20947    24.4
##  8 Alabama Calhoun County   118572    18.6
##  9 Alabama Chambers County   34215    18.8
## 10 Alabama Cherokee County   25989    16.1
## # ℹ 3,132 more rows
plot(x = counties_selected$state, 
     y = counties_selected$poverty)

plot(counties_selected$state, 
     counties_selected$pop2010)




arrange()


Zadanie

Proszę posortować dane, tak, żeby układały się rosnąco od najmniej zaludnionych po te najliczniej zamieszkałe i wyprint’tować tylko 13 pierwszych wierszy (za rok 2017)

Rozwiązanie

head(county %>%
       arrange(pop2017), 
     13)
## # A tibble: 13 × 15
##    name           state pop2000 pop2010 pop2017 pop_change poverty homeownership
##    <chr>          <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
##  1 Kalawao County Hawa…     147      90      88      -1.12    12.7           0  
##  2 Loving County  Texas      67      82     134      26.4     17.1          45.5
##  3 King County    Texas     356     286     296       8.03     3.5          38.9
##  4 Kenedy County  Texas     414     416     417      -4.14    24.8          38  
##  5 Arthur County  Nebr…     444     460     457       0.66    10.9          63.5
##  6 Blaine County  Nebr…     583     478     482       2.55     9.8          65.3
##  7 McPherson Cou… Nebr…     533     539     499      -5.67    16            58.8
##  8 Petroleum Cou… Mont…     493     494     523       2.55    10.1          68.6
##  9 Yakutat City … Alas…     808     662     605      -7.07     6.2          61.1
## 10 Loup County    Nebr…     712     632     609       3.75     8.9          85.1
## 11 Grant County   Nebr…     747     614     649       2.53    21.1          62.8
## 12 Borden County  Texas     729     641     673       4.18     2.8          62.7
## 13 Hooker County  Nebr…     783     736     674      -7.8     17.4          84.7
## # ℹ 7 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>




filter()


Zadanie

Wybierzmy ze zbioru tylko counties w Kalifornii, posortowane malejąco względem zmiennej populacyjnej - rok 2000 i wyrzućmy w konsoli powiedzmy 7 pierwszych wierszy.

Rozwiązanie

head(county %>%
       arrange(desc(pop2000)) %>%
       filter(state == "California"),
     7)
## # A tibble: 7 × 15
##   name            state pop2000 pop2010 pop2017 pop_change poverty homeownership
##   <chr>           <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
## 1 Los Angeles Co… Cali… 9519338 9818605  1.02e7       1.45    17            48.2
## 2 Orange County   Cali… 2846289 3010232  3.19e6       2.46    12.1          60.8
## 3 San Diego Coun… Cali… 2813833 3095313  3.34e6       3.77    13.3          55.9
## 4 San Bernardino… Cali… 1709434 2035210  2.16e6       3.39    18.2          65.1
## 5 Santa Clara Co… Cali… 1682585 1781642  1.94e6       3.59     8.6          59.2
## 6 Riverside Coun… Cali… 1545387 2189641  2.42e6       5.75    15.6          70  
## 7 Alameda County  Cali… 1443741 1510271  1.66e6       5.07    11.3          55.1
## # ℹ 7 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>
# vs

county %>%
  filter(state == "California") %>%
  arrange(desc(pop2000)) %>%
            head(7)
## # A tibble: 7 × 15
##   name            state pop2000 pop2010 pop2017 pop_change poverty homeownership
##   <chr>           <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
## 1 Los Angeles Co… Cali… 9519338 9818605  1.02e7       1.45    17            48.2
## 2 Orange County   Cali… 2846289 3010232  3.19e6       2.46    12.1          60.8
## 3 San Diego Coun… Cali… 2813833 3095313  3.34e6       3.77    13.3          55.9
## 4 San Bernardino… Cali… 1709434 2035210  2.16e6       3.39    18.2          65.1
## 5 Santa Clara Co… Cali… 1682585 1781642  1.94e6       3.59     8.6          59.2
## 6 Riverside Coun… Cali… 1545387 2189641  2.42e6       5.75    15.6          70  
## 7 Alameda County  Cali… 1443741 1510271  1.66e6       5.07    11.3          55.1
## # ℹ 7 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>



Zadanie

Proszę wybrać ze zbioru hrabstwa, w których nie ma problemu ubóstwa.

Rozwiązanie

county %>%
  filter(poverty == 0)
## # A tibble: 0 × 15
## # ℹ 15 variables: name <chr>, state <fct>, pop2000 <dbl>, pop2010 <dbl>,
## #   pop2017 <int>, pop_change <dbl>, poverty <dbl>, homeownership <dbl>,
## #   multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>, median_edu <fct>,
## #   per_capita_income <dbl>, median_hh_income <int>, smoking_ban <fct>



n()


Funkcja n() w dplyr jest używana do zliczania liczby wierszy w każdej grupie po zastosowaniu funkcji group_by(). To jest podstawowy licznik, który nie wymaga podawania żadnych argumentów i zwraca liczbę obserwacji (de facto wierszy) w danej grupie.

Zadanie

Proszę sprawdzić i zapisać w osobnym obiekcie jakie są proporcje zakazu palenia w poszczególnych hrabstwach. Następnie proszę narysować tę tabelę używając pie chart’u.

Rozwiązanie

# Podsumowanie kategorii zmiennej `smoking_ban`
smoking_summary <- county %>%
  group_by(smoking_ban) %>%
  summarise(count = n()) %>%
  mutate(percentage = count / sum(count) * 100)

# pokazywałem na jednych z pierwszych zajęć funkcję tabyl()
smoking_summary2 <- janitor::tabyl(county$smoking_ban) # dlaczego wyniki są "inne" niż w smoking_summary?

# Wyświetlenie wyniku
print(smoking_summary)
## # A tibble: 3 × 3
##   smoking_ban count percentage
##   <fct>       <int>      <dbl>
## 1 none         1927       61.3
## 2 partial       635       20.2
## 3 <NA>          580       18.5
# Tworzenie najprostszego wykresu kołowego
pie(smoking_summary$count, 
    labels = paste0(smoking_summary$smoking_ban, 
                    " (", 
                    round(smoking_summary$percentage, 1), 
                    "%)"),
    main = "Udział kategorii zmiennej 'smoking_ban'")



Zadanie

Wybierzmy ze zbioru tylko hrabstwa z Alabamy, które mają odsetek ubóstwa mniejszy niż mediana tego wskaźnika w całych Stanach Zjednoczonych.

Rozwiązanie

county %>%
  filter(state == "Alabama") %>%
  filter(poverty < median(poverty)) # coś nie tak, dlaczego?
## # A tibble: 33 × 15
##    name           state pop2000 pop2010 pop2017 pop_change poverty homeownership
##    <chr>          <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
##  1 Autauga County Alab…   43671   54571   55504       1.48    13.7          77.5
##  2 Baldwin County Alab…  140415  182265  212628       9.19    11.8          76.7
##  3 Bibb County    Alab…   20826   22915   22668       0.73    15.2          82.9
##  4 Blount County  Alab…   51024   57322   58013       0.68    15.6          82  
##  5 Calhoun County Alab…  112249  118572  114728      -1.51    18.6          70.7
##  6 Chambers Coun… Alab…   36583   34215   33713      -1.2     18.8          71.4
##  7 Cherokee Coun… Alab…   23988   25989   25857      -0.6     16.1          77.5
##  8 Clay County    Alab…   14254   13932   13367      -0.29    19.1          72.8
##  9 Cleburne Coun… Alab…   14123   14972   14900      -0.51    19.1          74.9
## 10 Coffee County  Alab…   43615   49948   51874       2.42    16.1          69.7
## # ℹ 23 more rows
## # ℹ 7 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>
# a teraz?
county %>%
  filter(poverty < median(poverty)) %>%
  filter(state == "Alabama") # w ogóle nic?
## # A tibble: 0 × 15
## # ℹ 15 variables: name <chr>, state <fct>, pop2000 <dbl>, pop2010 <dbl>,
## #   pop2017 <int>, pop_change <dbl>, poverty <dbl>, homeownership <dbl>,
## #   multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>, median_edu <fct>,
## #   per_capita_income <dbl>, median_hh_income <int>, smoking_ban <fct>
# dla pewności chciałbym mieć na boku tę medianę
(poverty_median <- median(county$ poverty)) # dlaczego NA?
## [1] NA
(poverty_median <- median(county$ poverty, na.rm = T)) # teraz ok
## [1] 15.2
county %>%
  filter(poverty < poverty_median) %>%
  filter(state == "Alabama")
## # A tibble: 9 × 15
##   name            state pop2000 pop2010 pop2017 pop_change poverty homeownership
##   <chr>           <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
## 1 Autauga County  Alab…   43671   54571   55504       1.48    13.7          77.5
## 2 Baldwin County  Alab…  140415  182265  212628       9.19    11.8          76.7
## 3 Coosa County    Alab…   12202   11539   10754      -4.43    14.4          83.7
## 4 Elmore County   Alab…   65874   79303   81677       1.39    13.5          77.6
## 5 Henry County    Alab…   16310   17302   17147       0.1     13.7          81.9
## 6 Limestone Coun… Alab…   65676   82782   94402       6.19    14.8          77.1
## 7 Madison County  Alab…  276700  334811  361046       4.24    13.6          70.4
## 8 St. Clair Coun… Alab…   64742   83593   88199       2.52    13.7          82.2
## 9 Shelby County   Alab…  143293  195085  213605       4.76     8.3          80.6
## # ℹ 7 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>



Zadanie

Ilu mieszkańców ma Warszawa? W przybliżeni! Proszę wybrać ze zbioru hrabstwa wraz z przynależnością do stanu i informacją o liczbie mieszkańców, które były co najmniej tak samo liczne w roku 2010.

Rozwiązanie

Warszawa <- 2000000

county %>%
  filter(pop2010 > Warszawa) %>%
  select(name, state, pop2010)
## # A tibble: 12 × 3
##    name                  state      pop2010
##    <chr>                 <fct>        <dbl>
##  1 Maricopa County       Arizona    3817117
##  2 Los Angeles County    California 9818605
##  3 Orange County         California 3010232
##  4 Riverside County      California 2189641
##  5 San Bernardino County California 2035210
##  6 San Diego County      California 3095313
##  7 Miami-Dade County     Florida    2496435
##  8 Cook County           Illinois   5194675
##  9 Kings County          New York   2504700
## 10 Queens County         New York   2230722
## 11 Dallas County         Texas      2368139
## 12 Harris County         Texas      4092459



Zadanie

W jakim hrabstwie (i stanie) nikt nie jest właścicielem swojego mieszkania

Rozwiązanie

county %>%
  filter(homeownership == 0) %>%
  select(name, state)
## # A tibble: 1 × 2
##   name           state 
##   <chr>          <fct> 
## 1 Kalawao County Hawaii



mutate()



Zadanie

Proszę stworzyć nową zmienną, gdzie wyliczymy nominalną liczbę osób objętych ubóstwem w każdym powiecie, po czym posortujmy wynik malejąco względem nowo utworzonej zmiennej i dodajmy do zbioru. Pamiętajmy, że nie ma pół, czy ćwierć osoby, zatem sensownie zaokrąglijmy wyniki obliczeń. Dodajmy nową zmienną do zbioru.

Rozwiązanie

county <- county %>%
  mutate(poverty_pop = round(pop2010 * poverty / 100, 0)) %>% # Liczba osób żyjących w ubóstwie w danym hrabstwie (w wartościach bezwzględnych, a nie procentach)
  arrange(desc(poverty_pop))



Zadanie

Proszę stworzyć nową zmienną, pop_increase, gdzie wyliczymy (w procentach) zmianę liczby mieszkańców hrabstwa względem ostatnich 10 lat. Proszę odpowiedzieć na pytanie, w których dziesięciu hrabstwach ten przyrost był największy (użyj funkcji top_n)?

Rozwiązanie

county %>%
  mutate(pop_increase = round((pop2010 - pop2000) / pop2000 * 100, 1)) %>%
  arrange(desc(pop_increase)) %>% 
  select(name, state, pop_increase) %>%
  top_n(10)
## Selecting by pop_increase
## # A tibble: 10 × 3
##    name            state        pop_increase
##    <chr>           <fct>               <dbl>
##  1 Kendall County  Illinois            110. 
##  2 Pinal County    Arizona             109. 
##  3 Flagler County  Florida              92  
##  4 Lincoln County  South Dakota         85.8
##  5 Loudoun County  Virginia             84.1
##  6 Rockwall County Texas                81.8
##  7 Forsyth County  Georgia              78.4
##  8 Sumter County   Florida              75.1
##  9 Paulding County Georgia              74.3
## 10 Sublette County Wyoming              73.1
  # top_n(10, wt = pop_increase)



Zadanie

Proszę policzyć ile jest hrabstw w USA.

Rozwiązanie

length(unique(county$name)) # na pewno?
## [1] 1877
length(unique(paste(county$state, county$name)))
## [1] 3142
# "alternatywnie" wiedząc, że wiersze to unikalne obserwacje
nrow(county)
## [1] 3142
# "alternatywnie"
county %>%
  summarise(Liczba.hrabstw = n()) # n() gives the current group size
## # A tibble: 1 × 1
##   Liczba.hrabstw
##            <int>
## 1           3142
# albo po prostu...
county %>%
  count()
## # A tibble: 1 × 1
##       n
##   <int>
## 1  3142



count()

Funkcja, która może posłużyć nam do grupowania obserwacji (właściwie ich zliczania). Najprostszym przykładem był właśnie kod counties %>% count(), który zwrócił nam de facto liczbę obserwacji w zbiorze.

Gdy funkcji count() damy jako argument konkretną zmienną, policzy nam liczbę obserwacji w ramach tej zmiennej.



Zadanie

Proszę policzyć ile jest hrabstw w poszczególnych stanach i posortować wyniki malejąco. Który stan ma najwięcej counties?

Rozwiązanie

county %>%
  group_by(state) %>%
  summarise(Liczba.powiatow = n()) %>%
  arrange(desc(Liczba.powiatow))
## # A tibble: 51 × 2
##    state          Liczba.powiatow
##    <fct>                    <int>
##  1 Texas                      254
##  2 Georgia                    159
##  3 Virginia                   133
##  4 Kentucky                   120
##  5 Missouri                   115
##  6 Kansas                     105
##  7 Illinois                   102
##  8 North Carolina             100
##  9 Iowa                        99
## 10 Tennessee                   95
## # ℹ 41 more rows
# z użyciem count()
county %>%
  count(state, sort = T)
## # A tibble: 51 × 2
##    state              n
##    <fct>          <int>
##  1 Texas            254
##  2 Georgia          159
##  3 Virginia         133
##  4 Kentucky         120
##  5 Missouri         115
##  6 Kansas           105
##  7 Illinois         102
##  8 North Carolina   100
##  9 Iowa              99
## 10 Tennessee         95
## # ℹ 41 more rows



Zadanie

Proszę policzyć ilu jest mieszkańców w poszczególnych stanach USA i posortować wyniki malejąco.

Rozwiązanie

county %>%
  group_by(state) %>%
  summarise(Liczba.mieszkancow = sum(pop2010)) %>%
  arrange(desc(Liczba.mieszkancow))
## # A tibble: 51 × 2
##    state          Liczba.mieszkancow
##    <fct>                       <dbl>
##  1 California               37253956
##  2 Texas                    25145561
##  3 New York                 19378102
##  4 Florida                  18801310
##  5 Illinois                 12830632
##  6 Pennsylvania             12702379
##  7 Ohio                     11536504
##  8 Michigan                  9883640
##  9 Georgia                   9687653
## 10 North Carolina            9535483
## # ℹ 41 more rows
# z użyciem count()
county %>%
  count(state, 
        wt = pop2010, 
        sort = T)
## # A tibble: 51 × 2
##    state                 n
##    <fct>             <dbl>
##  1 California     37253956
##  2 Texas          25145561
##  3 New York       19378102
##  4 Florida        18801310
##  5 Illinois       12830632
##  6 Pennsylvania   12702379
##  7 Ohio           11536504
##  8 Michigan        9883640
##  9 Georgia         9687653
## 10 North Carolina  9535483
## # ℹ 41 more rows
# argument wt służy do "przeważenia" kolumny n populacją



Zadanie

Proszę policzyć ilu jest nominalnie mieszkańców w poszczególnych stanach USA, którzy posiadają na własność mieszkanie lub dom.

Rozwiązanie

county %>%
  mutate(Liczba.wlascicieli = round(pop2010 * homeownership / 100, 0)) %>%
  group_by(state) %>%
  summarise(Liczba.wlascicieli = sum(Liczba.wlascicieli)) %>%
  arrange(desc(Liczba.wlascicieli))
## # A tibble: 51 × 2
##    state          Liczba.wlascicieli
##    <fct>                       <dbl>
##  1 California               21402616
##  2 Texas                    16337912
##  3 Florida                  13044295
##  4 New York                 10799189
##  5 Pennsylvania              9020897
##  6 Illinois                  8900375
##  7 Ohio                      8002479
##  8 Michigan                  7328298
##  9 Georgia                   6541480
## 10 North Carolina            6488489
## # ℹ 41 more rows
# z użyciem count()
county %>%
  mutate(Liczba.wlascicieli = round(pop2010 * homeownership / 100, 0)) %>%
  count(state, wt = Liczba.wlascicieli, sort = T)
## # A tibble: 51 × 2
##    state                 n
##    <fct>             <dbl>
##  1 California     21402616
##  2 Texas          16337912
##  3 Florida        13044295
##  4 New York       10799189
##  5 Pennsylvania    9020897
##  6 Illinois        8900375
##  7 Ohio            8002479
##  8 Michigan        7328298
##  9 Georgia         6541480
## 10 North Carolina  6488489
## # ℹ 41 more rows
# argument wt służy do "przeważenia" kolumny n liczbą właścicieli

summarize()



Zadanie

Proszę policzyć ilu było mieszkańców USA w roku 2000.

Rozwiązanie

county %>%
  summarize(Liczba.ludnosci = sum(pop2000)) # jak to?
## # A tibble: 1 × 1
##   Liczba.ludnosci
##             <dbl>
## 1              NA
county %>%
  summarize(Liczba.ludnosci = sum(pop2000, na.rm = T)) # no i git
## # A tibble: 1 × 1
##   Liczba.ludnosci
##             <dbl>
## 1       281411318
county %>% 
  count(wt = pop2000)
## # A tibble: 1 × 1
##           n
##       <dbl>
## 1 281411318



Zadanie

A jak by Państwo policzyli różnicę w liczbie mieszkańców USA w roku 2010 i 2000?

Rozwiązanie

(Roznica <- sum(county$pop2010) - sum(county$pop2000, na.rm = T))
## [1] 27327998
county %>%
  summarize(Liczba.ludnosci2000 = sum(pop2000, na.rm = T),
            Liczba.ludnosci2010 = sum(pop2010)) %>%
  mutate(Roznica = Liczba.ludnosci2010 - Liczba.ludnosci2000)
## # A tibble: 1 × 3
##   Liczba.ludnosci2000 Liczba.ludnosci2010  Roznica
##                 <dbl>               <dbl>    <dbl>
## 1           281411318           308739316 27327998



Zadanie

Proszę znaleźć - z użyciem funkcji summarize() liczbę mieszkańców USA w roku 2010 oraz średni roczny dochód

Rozwiązanie

county %>%
  summarise(Liczba.mieszkancow2010 = sum(pop2010),
            Sredni.dochod = mean(median_hh_income)) # :(
## # A tibble: 1 × 2
##   Liczba.mieszkancow2010 Sredni.dochod
##                    <dbl>         <dbl>
## 1              308739316            NA
county %>%
  summarise(Liczba.mieszkancow2010 = sum(pop2010),
            Sredni.dochod = mean(median_hh_income, na.rm = T))
## # A tibble: 1 × 2
##   Liczba.mieszkancow2010 Sredni.dochod
##                    <dbl>         <dbl>
## 1              308739316        49765.



group_by()



Zadanie

Proszę policzyć liczbę mieszkańców w roku 2010 oraz średnią dochodu na mieszkańca dla każdego ze stanów i posortować zbiór malejąco względem liczby ludności.

Rozwiązanie

county %>%
  group_by(state) %>%
  summarise(Liczba.mieszkancow2010 = sum(pop2010),
            Sredni.dochod = mean(median_hh_income)) %>%
  arrange(desc(Sredni.dochod))
## # A tibble: 51 × 3
##    state                Liczba.mieszkancow2010 Sredni.dochod
##    <fct>                                 <dbl>         <dbl>
##  1 District of Columbia                 601723        77649 
##  2 New Jersey                          8791894        77048.
##  3 Connecticut                         3574097        74496 
##  4 Maryland                            5773552        72541.
##  5 Massachusetts                       6547629        71031.
##  6 Rhode Island                        1052567        69906.
##  7 Hawaii                              1360301        68663 
##  8 New Hampshire                       1316470        64902.
##  9 Delaware                             897934        61295.
## 10 California                         37253956        61047.
## # ℹ 41 more rows



Zadanie

Proszę stworzyć mały data.frame i wyrzucić go do konsoli, zawierający podsumowanie o: minimalnej liczbie ludności w 2010, maksymalnym wskaźniku ubóstwa i medianie dochodu

Rozwiązanie

county %>%
  summarise(min_pop = min(pop2010),
            max_poverty = max(poverty, na.rm = T),
            median_income = median(median_hh_income, na.rm = T)
            )
## # A tibble: 1 × 3
##   min_pop max_poverty median_income
##     <dbl>       <dbl>         <dbl>
## 1      82          52        48072.



Zadanie

Jak wyżej, ale dla poszczególnych stanów.

Rozwiązanie

county %>%
  group_by(state) %>%
  summarise(min_pop = min(pop2010),
            max_poverty = max(poverty),
            median_income = median(median_hh_income)
            )
## # A tibble: 51 × 4
##    state                min_pop max_poverty median_income
##    <fct>                  <dbl>       <dbl>         <dbl>
##  1 Alabama                 9045        41.9        39293 
##  2 Alaska                   662        NA             NA 
##  3 Arizona                 8437        35.9        47847 
##  4 Arkansas                5368        33          37982 
##  5 California              1175        27.1        56818.
##  6 Colorado                 699        29.6        51457 
##  7 Connecticut           118428        12.1        73187 
##  8 Delaware              162310        13          57901 
##  9 District of Columbia  601723        17.4        77649 
## 10 Florida                 8365        31.9        46511 
## # ℹ 41 more rows



slice_max()

Funkcja zwracająca najliczniejsze (największe) wartości obserwacji w każdej z grup. Przyjmuje dwa argumenty: zmienną, po której chcemy sortować oraz liczbę obserwacji, którą chcemy zwrotnie otrzymać. Przykład:

head(county %>%
       group_by(state) %>%
       slice_max(pop2010, n = 3), 
     9)
## # A tibble: 9 × 16
## # Groups:   state [3]
##   name            state pop2000 pop2010 pop2017 pop_change poverty homeownership
##   <chr>           <fct>   <dbl>   <dbl>   <int>      <dbl>   <dbl>         <dbl>
## 1 Jefferson Coun… Alab…  662047  658466  659197       0.07    17.6          66.8
## 2 Mobile County   Alab…  399843  412992  413955       0.01    19.3          68.4
## 3 Madison County  Alab…  276700  334811  361046       4.24    13.6          70.4
## 4 Anchorage Muni… Alas…  260283  291826  294356      -2.23     8.1          61.7
## 5 Fairbanks Nort… Alas…   82840   97581   99703      -1.18     7.7          59.8
## 6 Matanuska-Susi… Alas…   59322   88995  106532      11.1      9.8          79.2
## 7 Maricopa County Ariz… 3072149 3817117 4307033       7.51    15.7          66.3
## 8 Pima County     Ariz…  843746  980263 1022769       2.82    18.3          64.6
## 9 Pinal County    Ariz…  179727  375770  430237      12.0     15.5          77.7
## # ℹ 8 more variables: multi_unit <dbl>, unemployment_rate <dbl>, metro <fct>,
## #   median_edu <fct>, per_capita_income <dbl>, median_hh_income <int>,
## #   smoking_ban <fct>, poverty_pop <dbl>



slice_min()

Analogicznie działa funkcja slice_min() zwracając jednak wartości najmniejsze.



“Select helpers”


W sytuacji, w której mamy sporo zmiennych, które dotyczą podobnych, interesujących nas cech, a w dodatku nazwy zmiennych zawierają słowa kluczowe, po których rozpoznajemy, że są w zakresie naszych zainteresowań, możemy się wspomóc select helpers’ami. Zachęcam zajrzeć ?select_helpers Rozważmy poniższy przykład:


county %>%
  select(state, contains("pop")) %>%
  top_n(5) # wykorzystane zamiast head(), nie ma znaczenia merytorycznego w tym ćwiczeniu
## Selecting by poverty_pop
## # A tibble: 5 × 6
##   state      pop2000 pop2010  pop2017 pop_change poverty_pop
##   <fct>        <dbl>   <dbl>    <int>      <dbl>       <dbl>
## 1 California 9519338 9818605 10163507       1.45     1669163
## 2 Illinois   5376741 5194675  5211263      -0.75      825953
## 3 Texas      3400578 4092459  4652980       6.88      687533
## 4 Arizona    3072149 3817117  4307033       7.51      599287
## 5 New York   2465326 2504700  2648771       1.65      548529


Inny przykład:


county %>%
  select(state, starts_with("pop")) %>%
  top_n(5)
## Selecting by pop_change
## # A tibble: 5 × 5
##   state        pop2000 pop2010 pop2017 pop_change
##   <fct>          <dbl>   <dbl>   <int>      <dbl>
## 1 Texas          97589  157107  214485       21.8
## 2 Texas           3344    3476    4408       32.1
## 3 Tennessee       7259    7870   10083       29.2
## 4 North Dakota    5737    6360   12724       37.2
## 5 Texas             67      82     134       26.4


Inny przykład:


county %>%
  select(state, ends_with("income")) %>%
  top_n(5)
## Selecting by median_hh_income
## # A tibble: 5 × 3
##   state    per_capita_income median_hh_income
##   <fct>                <dbl>            <int>
## 1 Virginia            51812.           117515
## 2 Virginia            65872.           112138
## 3 Maryland            50492.           115576
## 4 Virginia            49457.           129588
## 5 Virginia            64175.           114795


Zadanie

Proszę wyrzucić do konsoli nazwy kolumn zbioru county, a następnie usunąć zmienną pop2000 ze zbioru.

Rozwiązanie

names(county)
##  [1] "name"              "state"             "pop2000"          
##  [4] "pop2010"           "pop2017"           "pop_change"       
##  [7] "poverty"           "homeownership"     "multi_unit"       
## [10] "unemployment_rate" "metro"             "median_edu"       
## [13] "per_capita_income" "median_hh_income"  "smoking_ban"      
## [16] "poverty_pop"
county %>%
  select(-pop2000) %>%
  names()
##  [1] "name"              "state"             "pop2010"          
##  [4] "pop2017"           "pop_change"        "poverty"          
##  [7] "homeownership"     "multi_unit"        "unemployment_rate"
## [10] "metro"             "median_edu"        "per_capita_income"
## [13] "median_hh_income"  "smoking_ban"       "poverty_pop"


Zadanie

Proszę zmienić nazwę kolumn pop2000 oraz pop2010 na (kolejno) populacja2000 oraz populacja2010

Rozwiązanie

county %>%
  rename(populacja2000 = pop2000, 
         populacja2010 = pop2010) %>%
  top_n(5)
## Selecting by poverty_pop
## # A tibble: 5 × 16
##   name              state populacja2000 populacja2010 pop2017 pop_change poverty
##   <chr>             <fct>         <dbl>         <dbl>   <int>      <dbl>   <dbl>
## 1 Los Angeles Coun… Cali…       9519338       9818605  1.02e7       1.45    17  
## 2 Cook County       Illi…       5376741       5194675  5.21e6      -0.75    15.9
## 3 Harris County     Texas       3400578       4092459  4.65e6       6.88    16.8
## 4 Maricopa County   Ariz…       3072149       3817117  4.31e6       7.51    15.7
## 5 Kings County      New …       2465326       2504700  2.65e6       1.65    21.9
## # ℹ 9 more variables: homeownership <dbl>, multi_unit <dbl>,
## #   unemployment_rate <dbl>, metro <fct>, median_edu <fct>,
## #   per_capita_income <dbl>, median_hh_income <int>, smoking_ban <fct>,
## #   poverty_pop <dbl>
# inaczej...
names(county)[3:4] <- c("populacja2000", "populacja2010")

# przywróćmy stare
names(county)[3:4] <- c("pop2000", "pop2010")



select() + rename()


Gdybyśmy w trakcie wyboru kolumn chcieli w jednym kroku nadać im inne, bardziej intuicyjne dla nas nazwy, możemy zrobić tak:

county %>%
  select(state, 
         populacja2000 = pop2000, 
         populacja2010 = pop2010) %>%
  top_n(5)
## Selecting by populacja2010
## # A tibble: 5 × 3
##   state      populacja2000 populacja2010
##   <fct>              <dbl>         <dbl>
## 1 California       9519338       9818605
## 2 Illinois         5376741       5194675
## 3 Texas            3400578       4092459
## 4 Arizona          3072149       3817117
## 5 California       2813833       3095313


transmute()


Funkcja transmute() działa jak mutate(), ale zachowuje tylko te kolumny, które wymienisz w funkcji - reszta zostaje usunięta. Jest skrótem dla mutate() + select(). Przydatna, gdy chcemy stworzyć nowe zmienne i od razu pozbyć się starych.


Rozważmy taki przykład. Liczyliśmy zmienną ile osób pozostaje w ubóstwie. Powtórzmy to ćwiczenie, przycinając jednocześnie nasza ramkę do niezbędnych zmiennych.

county %>%
  transmute(state,
            poverty_pop = round(pop2010 * poverty / 100, 0)) %>%
  top_n(10)
## Selecting by poverty_pop
## # A tibble: 10 × 2
##    state      poverty_pop
##    <fct>            <dbl>
##  1 California     1669163
##  2 Illinois        825953
##  3 Texas           687533
##  4 Arizona         599287
##  5 New York        548529
##  6 Florida         474323
##  7 Michigan        431478
##  8 Texas           419161
##  9 California      411677
## 10 New York        411377


Wcześniejszy przykład z zadania, gdy nie znamy funkcji transmiute():

county %>%
  mutate(pop_increase = round((pop2010 - pop2000) / pop2000 * 100, 1)) %>%
  select(name, state, pop_increase) %>%
  arrange(desc(pop_increase)) %>% 
  top_n(10)
## Selecting by pop_increase
## # A tibble: 10 × 3
##    name            state        pop_increase
##    <chr>           <fct>               <dbl>
##  1 Kendall County  Illinois            110. 
##  2 Pinal County    Arizona             109. 
##  3 Flagler County  Florida              92  
##  4 Lincoln County  South Dakota         85.8
##  5 Loudoun County  Virginia             84.1
##  6 Rockwall County Texas                81.8
##  7 Forsyth County  Georgia              78.4
##  8 Sumter County   Florida              75.1
##  9 Paulding County Georgia              74.3
## 10 Sublette County Wyoming              73.1

W wersji nieco uproszczonej, gdy już ją znamy.

county %>%
  transmute(name, # biorę
            state, # to też
            pop_increase = round((pop2010 - pop2000) / pop2000 * 100, 1)) %>% # tu liczę
  arrange(desc(pop_increase)) %>% # tu posortuję
  top_n(10) # i 10 najwyższych
## Selecting by pop_increase
## # A tibble: 10 × 3
##    name            state        pop_increase
##    <chr>           <fct>               <dbl>
##  1 Kendall County  Illinois            110. 
##  2 Pinal County    Arizona             109. 
##  3 Flagler County  Florida              92  
##  4 Lincoln County  South Dakota         85.8
##  5 Loudoun County  Virginia             84.1
##  6 Rockwall County Texas                81.8
##  7 Forsyth County  Georgia              78.4
##  8 Sumter County   Florida              75.1
##  9 Paulding County Georgia              74.3
## 10 Sublette County Wyoming              73.1



Zadanie


Hrabstwo Jefferson w stanie Alabama prowadzi program mający na celu poprawę jakości życia mieszkańców. Zastanawiają się, jak ich sytuacja wygląda na tle innych hrabstw Alabamy, zwłaszcza w kwestiach ekonomicznych i społecznych. Chcieliby dowiedzieć się:

  • Czy ich wskaźnik ubóstwa oraz stopa bezrobocia są niższe, wyższe czy na poziomie średniej dla Alabamy.

  • Jak wygląda ich sytuacja w porównaniu do innych hrabstw pod względem dochodu na mieszkańca i medianowego dochodu gospodarstwa domowego.

  • Chcieliby także dowiedzieć się, czy wskaźnik posiadania własnego domu (homeownership) oraz odsetek mieszkańców żyjących w budynkach wielorodzinnych (multi_unit) różnią się znacząco od średnich wartości dla stanu.

Poniżej kod, który wykona takie porównanie, dostarczając hrabstwu Jefferson odpowiedzi na ich pytania.

Rozwiązanie

# Filtrowanie danych dla hrabstw w stanie Alabama
alabama_counties <- county %>%
  filter(state == "Alabama")

# Wyliczanie średnich wskaźników dla hrabstw w stanie Alabama
alabama_averages <- alabama_counties %>%
  summarise(
    avg_poverty = mean(poverty, na.rm = TRUE),
    avg_unemployment_rate = mean(unemployment_rate, na.rm = TRUE),
    avg_per_capita_income = mean(per_capita_income, na.rm = TRUE),
    avg_median_hh_income = mean(median_hh_income, na.rm = TRUE),
    avg_homeownership = mean(homeownership, na.rm = TRUE),
    avg_multi_unit = mean(multi_unit, na.rm = TRUE)
  )

# Wybieranie danych dla hrabstwa Jefferson w Alabamie
jefferson_county <- county %>%
  filter(state == "Alabama", name == "Jefferson County")

# Porównanie wskaźników hrabstwa Jefferson z średnimi dla Alabamy
comparison <- jefferson_county %>%
  select(poverty, unemployment_rate, 
         per_capita_income, median_hh_income, 
         homeownership, multi_unit) %>%
  mutate(
    poverty_vs_avg = poverty - alabama_averages$avg_poverty,
    unemployment_vs_avg = unemployment_rate - alabama_averages$avg_unemployment_rate,
    per_capita_income_vs_avg = per_capita_income - alabama_averages$avg_per_capita_income,
    median_hh_income_vs_avg = median_hh_income - alabama_averages$avg_median_hh_income,
    homeownership_vs_avg = homeownership - alabama_averages$avg_homeownership,
    multi_unit_vs_avg = multi_unit - alabama_averages$avg_multi_unit
  )

# Wyświetlenie wyników porównania
print(comparison)
## # A tibble: 1 × 12
##   poverty unemployment_rate per_capita_income median_hh_income homeownership
##     <dbl>             <dbl>             <dbl>            <int>         <dbl>
## 1    17.6              4.24            29260.            49321          66.8
## # ℹ 7 more variables: multi_unit <dbl>, poverty_vs_avg <dbl>,
## #   unemployment_vs_avg <dbl>, per_capita_income_vs_avg <dbl>,
## #   median_hh_income_vs_avg <dbl>, homeownership_vs_avg <dbl>,
## #   multi_unit_vs_avg <dbl>



“Graficzne podsumowanie, source: DataCamp.com”
“Graficzne podsumowanie, source: DataCamp.com”

BabyNames


babynames <- as_tibble(
  read.csv("https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv?accessType=DOWNLOAD")
  ) # source: https://catalog.data.gov/dataset/popular-baby-names

glimpse(babynames)
## Rows: 77,287
## Columns: 6
## $ Year.of.Birth      <int> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 201…
## $ Gender             <chr> "FEMALE", "FEMALE", "FEMALE", "FEMALE", "FEMALE", "…
## $ Ethnicity          <chr> "HISPANIC", "HISPANIC", "HISPANIC", "HISPANIC", "HI…
## $ Child.s.First.Name <chr> "GERALDINE", "GIA", "GIANNA", "GISELLE", "GRACE", "…
## $ Count              <int> 13, 21, 49, 38, 36, 26, 126, 14, 17, 17, 13, 10, 15…
## $ Rank               <int> 75, 67, 42, 51, 53, 62, 8, 74, 71, 71, 75, 78, 73, …



Zadanie

Proszę wybrać ze zbioru tylko dwa imiona, Bruno i Lena, i przypisać wyniki do ramki LenaBruno.

Rozwiązanie

LenaBruno <- babynames %>%
  filter(Child.s.First.Name %in% c("Lena", "LENA", "Bruno")) 

LenaBruno %>%
  top_n(10)
## Selecting by Rank
## # A tibble: 11 × 6
##    Year.of.Birth Gender Ethnicity          Child.s.First.Name Count  Rank
##            <int> <chr>  <chr>              <chr>              <int> <int>
##  1          2012 FEMALE WHITE NON HISP     LENA                  15    78
##  2          2012 FEMALE WHITE NON HISP     LENA                  15    78
##  3          2012 FEMALE WHITE NON HISP     LENA                  15    78
##  4          2017 MALE   HISPANIC           Bruno                 11    88
##  5          2012 FEMALE WHITE NON HISP     LENA                  15    78
##  6          2016 FEMALE WHITE NON HISPANIC Lena                  16    78
##  7          2015 MALE   HISPANIC           Bruno                 10    99
##  8          2012 FEMALE WHITE NON HISP     LENA                  15    78
##  9          2012 FEMALE WHITE NON HISP     LENA                  15    78
## 10          2012 FEMALE WHITE NON HISP     LENA                  15    78
## 11          2012 FEMALE WHITE NON HISP     LENA                  15    78



Zadanie

Proszę wybrać najpopularniejsze imiona w danym roku

Rozwiązanie

najpopularniejszeImiona <- babynames %>%
  group_by(Year.of.Birth) %>%
  top_n(1, Count) # wybieramy jeden wiersz z najwyższą wartością zmiennej `Count`


# czego przy okazji dowiadujemy się o zbiorze?
# na jakim poziomie nadawany jest rank?
# czy zbiór ma unikalne wiersze?
# babynames2 <- unique(babynames)
# nrow(babynames) - nrow(babynames2)



Zadanie

Proszę wybrać najpopularniejsze 10 imion w roku 2011 (użyj funkcji top_n() w odpowiednim kontekście)

Rozwiązanie

babynames %>%
  filter(Year.of.Birth == 2011) %>%
  # arrange(desc(Count))
  top_n(10, Count)
## # A tibble: 15 × 6
##    Year.of.Birth Gender Ethnicity Child.s.First.Name Count  Rank
##            <int> <chr>  <chr>     <chr>              <int> <int>
##  1          2011 FEMALE HISPANIC  ISABELLA             331     1
##  2          2011 FEMALE HISPANIC  ISABELLA             331     1
##  3          2011 MALE   HISPANIC  JAYDEN               426     1
##  4          2011 FEMALE HISPANIC  ISABELLA             331     1
##  5          2011 MALE   HISPANIC  JAYDEN               426     1
##  6          2011 FEMALE HISPANIC  ISABELLA             331     1
##  7          2011 MALE   HISPANIC  JAYDEN               426     1
##  8          2011 FEMALE HISPANIC  ISABELLA             331     1
##  9          2011 MALE   HISPANIC  JAYDEN               426     1
## 10          2011 FEMALE HISPANIC  ISABELLA             331     1
## 11          2011 MALE   HISPANIC  JAYDEN               426     1
## 12          2011 MALE   HISPANIC  JAYDEN               426     1
## 13          2011 FEMALE HISPANIC  ISABELLA             331     1
## 14          2011 MALE   HISPANIC  JAYDEN               426     1
## 15          2011 FEMALE HISPANIC  ISABELLA             331     1


i jeszcze takie dwa przykłady utrwalające i pokazujące różnicę w funkcjach


Możemy stworzyć podsumowanie liczby urodzonych dzieci w danym roku…

babynames %>%
  group_by(Year.of.Birth) %>%
  summarise(lacznie = sum(Count))
## # A tibble: 11 × 2
##    Year.of.Birth lacznie
##            <int>   <int>
##  1          2011  541525
##  2          2012  557042
##  3          2013  540062
##  4          2014  544078
##  5          2015   69600
##  6          2016   68740
##  7          2017   65395
##  8          2018   63314
##  9          2019   60696
## 10          2020   53309
## 11          2021   52603


Ale również możemy sobie dodać tę zmienną do każdego wiersza. Będzie potrzebna, jeśli przyszłoby nam do głowy policzyć np. udziały poszczególnych imion wśród wszystkich nadanych

babynames %>%
  group_by(Year.of.Birth) %>%
  mutate(lacznie = sum(Count)) %>%
  select(Year.of.Birth, Child.s.First.Name, Count, Rank, lacznie)
## # A tibble: 77,287 × 5
## # Groups:   Year.of.Birth [11]
##    Year.of.Birth Child.s.First.Name Count  Rank lacznie
##            <int> <chr>              <int> <int>   <int>
##  1          2011 GERALDINE             13    75  541525
##  2          2011 GIA                   21    67  541525
##  3          2011 GIANNA                49    42  541525
##  4          2011 GISELLE               38    51  541525
##  5          2011 GRACE                 36    53  541525
##  6          2011 GUADALUPE             26    62  541525
##  7          2011 HAILEY               126     8  541525
##  8          2011 HALEY                 14    74  541525
##  9          2011 HANNAH                17    71  541525
## 10          2011 HAYLEE                17    71  541525
## # ℹ 77,277 more rows


Dawniej, żeby jednak zrobić to sensownie, musieliśmy zastosować funkcję ungroup()

babynames %>%
  group_by(Year.of.Birth) %>%
  mutate(lacznie = sum(Count)) %>%
  ungroup() %>% # to ta rzeczona nowość
  mutate(odsetek = Count / lacznie) %>%
  select(Year.of.Birth, Child.s.First.Name, Count, Rank, lacznie)
## # A tibble: 77,287 × 5
##    Year.of.Birth Child.s.First.Name Count  Rank lacznie
##            <int> <chr>              <int> <int>   <int>
##  1          2011 GERALDINE             13    75  541525
##  2          2011 GIA                   21    67  541525
##  3          2011 GIANNA                49    42  541525
##  4          2011 GISELLE               38    51  541525
##  5          2011 GRACE                 36    53  541525
##  6          2011 GUADALUPE             26    62  541525
##  7          2011 HAILEY               126     8  541525
##  8          2011 HALEY                 14    74  541525
##  9          2011 HANNAH                17    71  541525
## 10          2011 HAYLEE                17    71  541525
## # ℹ 77,277 more rows


Jak wykażemy zaraz empirycznie, pozbawienie kodu funkcji ungroup() nie zmienia teraz wiele w wynikach.

babynames %>%
  group_by(Year.of.Birth) %>%
  mutate(lacznie = sum(Count)) %>%
  mutate(odsetek = Count / lacznie) %>%
  select(Year.of.Birth, Child.s.First.Name, Count, Rank, lacznie)
## # A tibble: 77,287 × 5
## # Groups:   Year.of.Birth [11]
##    Year.of.Birth Child.s.First.Name Count  Rank lacznie
##            <int> <chr>              <int> <int>   <int>
##  1          2011 GERALDINE             13    75  541525
##  2          2011 GIA                   21    67  541525
##  3          2011 GIANNA                49    42  541525
##  4          2011 GISELLE               38    51  541525
##  5          2011 GRACE                 36    53  541525
##  6          2011 GUADALUPE             26    62  541525
##  7          2011 HAILEY               126     8  541525
##  8          2011 HALEY                 14    74  541525
##  9          2011 HANNAH                17    71  541525
## 10          2011 HAYLEE                17    71  541525
## # ℹ 77,277 more rows


Okazuje się bowiem, że w przypadku najnowszych wersji dplyr (od wersji 1.0.0) zmieniło się zachowanie grupowania po wykonaniu operacji mutate(). Teraz, po wywołaniumutate() na grupowanych danych, dplyr domyślnie usuwa grupowanie po wykonaniu operacji, co oznacza, że w wielu przypadkach nie musimy już wywoływać ungroup(). Kiedyś brak rozgrupowania powodował, że grupowanie było wykonywane milcząco, w trakcie dalszego używania ramki danych raz zgrupowanej.


Zadanie

Znajdź najbardziej popularne imię wszech czasów dla każdego roku, płci i grupy etnicznej.

Rozwiązanie

babynames %>%
  group_by(Year.of.Birth, Gender) %>%
  top_n(1, Count) %>%
  arrange(Year.of.Birth, Ethnicity, Gender)
## # A tibble: 72 × 6
## # Groups:   Year.of.Birth, Gender [22]
##    Year.of.Birth Gender Ethnicity Child.s.First.Name Count  Rank
##            <int> <chr>  <chr>     <chr>              <int> <int>
##  1          2011 FEMALE HISPANIC  ISABELLA             331     1
##  2          2011 FEMALE HISPANIC  ISABELLA             331     1
##  3          2011 FEMALE HISPANIC  ISABELLA             331     1
##  4          2011 FEMALE HISPANIC  ISABELLA             331     1
##  5          2011 FEMALE HISPANIC  ISABELLA             331     1
##  6          2011 FEMALE HISPANIC  ISABELLA             331     1
##  7          2011 FEMALE HISPANIC  ISABELLA             331     1
##  8          2011 FEMALE HISPANIC  ISABELLA             331     1
##  9          2011 MALE   HISPANIC  JAYDEN               426     1
## 10          2011 MALE   HISPANIC  JAYDEN               426     1
## # ℹ 62 more rows
# lub

babynames %>%
  group_by(Year.of.Birth, Gender) %>%
  slice_max(Count, n = 1, with_ties = FALSE) %>% # lepszy wariant jeśli chcemy dokładnie 1 wiersz na grupę, nawet przy remisach
  arrange(Year.of.Birth, Ethnicity, Gender)
## # A tibble: 22 × 6
## # Groups:   Year.of.Birth, Gender [22]
##    Year.of.Birth Gender Ethnicity Child.s.First.Name Count  Rank
##            <int> <chr>  <chr>     <chr>              <int> <int>
##  1          2011 FEMALE HISPANIC  ISABELLA             331     1
##  2          2011 MALE   HISPANIC  JAYDEN               426     1
##  3          2012 FEMALE HISPANIC  ISABELLA             327     1
##  4          2012 MALE   HISPANIC  JAYDEN               364     1
##  5          2013 FEMALE HISPANIC  Isabella             326     1
##  6          2013 MALE   HISPANIC  Jayden               352     1
##  7          2014 FEMALE HISPANIC  Isabella             331     1
##  8          2014 MALE   HISPANIC  Liam                 312     1
##  9          2015 FEMALE HISPANIC  Isabella             307     1
## 10          2015 MALE   HISPANIC  Liam                 356     1
## # ℹ 12 more rows


Zadanie

Sprawdź imię “Elsa”, które miało gwałtowny wzrost popularności tuż po premierze popularnego filmu Frozen w 2013 roku.

Rozwiązanie

babynames %>%
  filter(Child.s.First.Name == "Elsa" & Year.of.Birth >= 2010) %>%
  arrange(Year.of.Birth) %>%
  mutate(Change = Count - lag(Count, default = 0)) %>% # ?lag()
  filter(Change > 0) %>% # Imię rosło na popularności
  select()
## # A tibble: 9 × 0





Źródła i inspiracje pomocne w przygotowaniu niniejszej prezentacji: