Fungsi Agregat R: Ringkas & Group_by() Contoh

Ringkasan suatu variabel penting untuk mendapatkan gambaran tentang data. Meskipun demikian, meringkas suatu variabel berdasarkan kelompok memberikan informasi yang lebih baik mengenai distribusi data.

Dalam tutorial ini, Anda akan mempelajari cara meringkas kumpulan data berdasarkan grup dengan pustaka dplyr.

Untuk tutorial ini, Anda akan menggunakan kumpulan data pemukulan. Kumpulan data asli berisi 102816 observasi dan 22 variabel. Anda hanya akan menggunakan 20 persen dari kumpulan data ini dan menggunakan variabel berikut:

  • playerID: Kode ID pemain. Faktor
  • ID tahun: Tahun. Faktor
  • ID tim: Tim. faktor
  • lgID: Liga. Faktor: AA AL FL NL PL UA
  • AB: Pada kelelawar. numerik
  • G: Permainan: jumlah permainan yang dilakukan seorang pemain. numerik
  • R: Berlari. numerik
  • HR: Homerun. numerik
  • SH: Pengorbanan berhasil. numerik

Sebelum Anda melakukan ringkasan, Anda akan melakukan langkah-langkah berikut untuk menyiapkan data:

  • Langkah 1: Impor data
  • Langkah 2: Pilih variabel yang relevan
  • Langkah 3: Urutkan datanya
library(dplyr)

# Step 1
data <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/lahman-batting.csv") % > %

# Step 2
select(c(playerID, yearID, AB, teamID, lgID, G, R, HR, SH))  % > % 

# Step 3
arrange(playerID, teamID, yearID)

Praktik yang baik saat Anda mengimpor kumpulan data adalah dengan menggunakan fungsi sekilas() untuk mendapatkan gambaran tentang struktur kumpulan data.

# Structure of the data
glimpse(data)

Keluaran:

Observations: 104,324
Variables: 9
$ playerID <fctr> aardsda01, aardsda01, aardsda01, aardsda01, aardsda01, a...
$ yearID   <int> 2015, 2008, 2007, 2006, 2012, 2013, 2009, 2010, 2004, 196...
$ AB       <int> 1, 1, 0, 2, 0, 0, 0, 0, 0, 603, 600, 606, 547, 516, 495, ...
$ teamID   <fctr> ATL, BOS, CHA, CHN, NYA, NYN, SEA, SEA, SFN, ATL, ATL, A...
$ lgID     <fctr> NL, AL, AL, NL, AL, NL, AL, AL, NL, NL, NL, NL, NL, NL, ...
$ G        <int> 33, 47, 25, 45, 1, 43, 73, 53, 11, 158, 155, 160, 147, 15...
$ R        <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, 113, 84, 100, 103, 95, 75...
$ HR       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 39, 29, 44, 38, 47, 34, 40...
$ SH       <int> 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, ...

Meringkaskan()

Sintaks summarise() bersifat dasar dan konsisten dengan kata kerja lain yang disertakan dalam perpustakaan dplyr.

summarise(df, variable_name=condition) 
arguments: 
- `df`: Dataset used to construct the summary statistics 
- `variable_name=condition`: Formula to create the new variable

Lihatlah kode di bawah ini:

summarise(data, mean_run =mean(R))

Penjelasan Kode

  • summarise(data, mean_run = mean(R)): Membuat variabel bernama mean_run yang merupakan rata-rata kolom yang dijalankan dari dataset.

Keluaran:

##   mean_run
## 1 19.20114

Anda dapat menambahkan variabel sebanyak yang Anda inginkan. Anda mengembalikan rata-rata permainan yang dimainkan dan rata-rata pengorbanan yang berhasil.

summarise(data, mean_games = mean(G),
    mean_SH = mean(SH, na.rm = TRUE))

Penjelasan Kode

  • mean_SH = mean(SH, na.rm = TRUE): Ringkaslah variabel kedua. Anda menyetel na.rm = TRUE karena kolom SH berisi observasi yang hilang.

Keluaran:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs tanpa group_by

Fungsi summerise() tanpa group_by() tidak masuk akal. Ini membuat ringkasan statistik berdasarkan kelompok. Perpustakaan dplyr menerapkan fungsi secara otomatis ke grup yang Anda lewati di dalam kata kerja group_by.

Perhatikan bahwa, group_by berfungsi sempurna dengan semua kata kerja lainnya (yaitu mutate(), filter(), arrange(),…).

Akan lebih mudah untuk menggunakan operator saluran pipa ketika Anda memiliki lebih dari satu langkah. Anda dapat menghitung rata-rata homerun berdasarkan liga bisbol.

data % > %
	group_by(lgID) % > %
	summarise(mean_run = mean(HR))

Penjelasan Kode

  • data: Kumpulan data yang digunakan untuk membuat ringkasan statistik
  • group_by(lgID): Hitung ringkasan dengan mengelompokkan variabel `lgID
  • summarise(mean_run = mean(HR)): Hitung rata-rata homerun

Keluaran:

## 
# A tibble: 7 x 2
##     lgID  mean_run
##   <fctr>     <dbl>
## 1     AA 0.9166667
## 2     AL 3.1270988
## 3     FL 1.3131313
## 4     NL 2.8595953
## 5     PL 2.5789474
## 6     UA 0.6216216
## 7   <NA> 0.2867133	

Operator pipa juga bekerja dengan ggplot(). Anda dapat dengan mudah menampilkan ringkasan statistik dengan grafik. Semua langkah didorong ke dalam pipa sampai grafiknya dibuat. Tampaknya lebih visual untuk melihat rata-rata homerun berdasarkan liga dengan bar char. Kode di bawah ini menunjukkan kekuatan menggabungkan group_by(), summarise() dan ggplot() secara bersamaan.

Anda akan melakukan langkah berikut:

  • Langkah 1: Pilih bingkai data
  • Langkah 2: Kelompokkan data
  • Langkah 3: Ringkas datanya
  • Langkah 4: Plot ringkasan statistik
library(ggplot2)
# Step 1
data % > % 
#Step 2
group_by(lgID) % > % 
#Step 3
summarise(mean_home_run = mean(HR)) % > % 
#Step 4
ggplot(aes(x = lgID, y = mean_home_run, fill = lgID)) +
    geom_bar(stat = "identity") +
    theme_classic() +
    labs(
        x = "baseball league",
        y = "Average home run",
        title = paste(
            "Example group_by() with summarise()"
        )
    )

Keluaran:

Group_by Contoh dengan Ringkas

Fungsi dalam ringkasan()

Kata kerja summarise() kompatibel dengan hampir semua fungsi di R. Berikut adalah daftar singkat fungsi berguna yang dapat Anda gunakan bersama dengan summarise():

Tujuan fungsi Description
Dasar berarti() Rata-rata vektor x
median () Median vektor x
jumlah() Jumlah vektor x
variasi sd() simpangan baku vektor x
IQR() Interkuartil vektor x
Jarak min () Minimal vektor x
maks() Maksimum vektor x
kuantil() Kuantil vektor x
Posisi pertama() Gunakan dengan group_by() Pengamatan pertama grup
terakhir() Gunakan dengan group_by(). Pengamatan terakhir kelompok
ke-n() Gunakan dengan group_by(). pengamatan kelompok yang ke-n
Menghitung n () Gunakan dengan group_by(). Hitung jumlah barisnya
n_berbeda() Gunakan dengan group_by(). Hitung jumlah pengamatan yang berbeda

Kita akan melihat contoh untuk setiap fungsi pada tabel 1.

Fungsi dasar

Pada contoh sebelumnya, Anda tidak menyimpan statistik ringkasan dalam bingkai data.

Anda dapat melanjutkan dalam dua langkah untuk menghasilkan kerangka tanggal dari ringkasan:

  • Langkah 1: Simpan bingkai data untuk digunakan lebih lanjut
  • Langkah 2: Gunakan kumpulan data untuk membuat plot garis

Langkah 1) Anda menghitung jumlah rata-rata permainan yang dimainkan menurut tahun.

## Mean
ex1 <- data % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))
head(ex1)

Penjelasan Kode

  • Statistik ringkasan kumpulan data batting disimpan dalam bingkai data ex1.

Keluaran:

## # A tibble: 6 x 2
##   yearID mean_game_year
##    <int>          <dbl>
## 1   1871       23.42308
## 2   1872       18.37931
## 3   1873       25.61538
## 4   1874       39.05263
## 5   1875       28.39535
## 6   1876       35.90625	

Langkah 2) Anda menampilkan ringkasan statistik dengan plot garis dan melihat trennya.

# Plot the graph
ggplot(ex1, aes(x = yearID, y = mean_game_year)) +
    geom_line() +
    theme_classic() +
    labs(
        x = "Year",
        y = "Average games played",
        title = paste(
            "Average games played from 1871 to 2016"
        )
    )

Keluaran:

Contoh Fungsi Dasar

Sub-pengaturan

Fungsi summarise() kompatibel dengan subsetting.

## Subsetting + Median
data % > %
group_by(lgID) % > %
summarise(median_at_bat_league = median(AB), 
	#Compute the median without the zero 
	median_at_bat_league_no_zero = median(AB[AB > 0]))

Penjelasan Kode

  • median_at_bat_league_no_zero = median(AB[AB > 0]): Variabel AB berisi banyak 0. Anda dapat membandingkan median dari di kelelawar variabel dengan dan tanpa 0.

Keluaran:

## # A tibble: 7 x 3
##     lgID median_at_bat_league median_at_bat_league_no_zero
##   <fctr>                <dbl>                        <dbl>
## 1     AA                  130                          131
## 2     AL                   38                           85
## 3     FL                   88                           97
## 4     NL                   56                           67
## 5     PL                  238                          238
## 6     UA                   35                           35
## 7   <NA>                  101                          101	

Jumlah

Fungsi lain yang berguna untuk menggabungkan variabel adalah sum().

Anda dapat memeriksa liga mana yang memiliki homeruns lebih banyak.

## Sum
data % > %
	group_by(lgID) % > %
	summarise(sum_homerun_league = sum(HR))

Keluaran:

## # A tibble: 7 x 2
##     lgID sum_homerun_league
##   <fctr>              <int>
## 1     AA                341
## 2     AL              29426
## 3     FL                130
## 4     NL              29817
## 5     PL                 98
## 6     UA                 46
## 7   <NA>                 41	

Standar deviasi

Penyebaran data dihitung dengan standar deviasi atau sd() di R.

# Spread
data % > %
	group_by(teamID) % > %
	summarise(sd_at_bat_league = sd(HR))

Keluaran:

## # A tibble: 148 x 2
##    teamID sd_at_bat_league
##    <fctr>            <dbl>
##  1    ALT               NA
##  2    ANA        8.7816395
##  3    ARI        6.0765503
##  4    ATL        8.5363863
##  5    BAL        7.7350173
##  6    BFN        1.3645163
##  7    BFP        0.4472136
##  8    BL1        0.6992059
##  9    BL2        1.7106757
## 10    BL3        1.0000000
## # ... with 138 more rows		

Banyak sekali ketimpangan kuantitas homerun yang dilakukan masing-masing tim.

Minimal dan maksimal

Anda dapat mengakses vektor minimum dan maksimum dengan fungsi min() dan max().

Kode di bawah menampilkan jumlah permainan terendah dan tertinggi dalam satu musim yang dimainkan oleh seorang pemain.

# Min and max
data % > %
	group_by(playerID) % > %
	summarise(min_G = min(G),
    max_G = max(G))

Keluaran:

## # A tibble: 10,395 x 3
##     playerID min_G max_G
##       <fctr>       <int>
##  1 aardsda01    53    73
##  2 aaronha01   120   156
##  3  aasedo01    24    66
##  4  abadfe01    18    18
##  5 abadijo01    11    11
##  6 abbated01     3   153
##  7 abbeybe01    11    11
##  8 abbeych01    80   132
##  9 abbotgl01     5    23
## 10 abbotji01    13    29
## # ... with 10,385 more rows

Menghitung

Menghitung observasi berdasarkan kelompok selalu merupakan ide bagus. Dengan R, Anda dapat menggabungkan jumlah kemunculan dengan n().

Misalnya, kode di bawah ini menghitung jumlah tahun yang dimainkan oleh setiap pemain.

# count observations
data % > %
	group_by(playerID) % > %
	summarise(number_year = n()) % > %
	arrange(desc(number_year))

Keluaran:

## # A tibble: 10,395 x 2
##     playerID number_year
##       <fctr>       <int>
##  1 pennohe01          11
##  2 joosted01          10
##  3 mcguide01          10
##  4  rosepe01          10
##  5 davisha01           9
##  6 johnssi01           9
##  7  kaatji01           9
##  8 keelewi01           9
##  9 marshmi01           9
## 10 quirkja01           9
## # ... with 10,385 more rows

Pertama dan terakhir

Anda dapat memilih posisi pertama, terakhir, atau ke-n dalam suatu grup.

Misalnya, Anda dapat menemukan tahun pertama dan terakhir setiap pemain.

# first and last
data % > %
	group_by(playerID) % > %
	summarise(first_appearance = first(yearID),
		last_appearance = last(yearID))

Keluaran:

## # A tibble: 10,395 x 3
##     playerID first_appearance last_appearance
##       <fctr>            <int>           <int>
##  1 aardsda01             2009            2010
##  2 aaronha01             1973            1975
##  3  aasedo01             1986            1990
##  4  abadfe01             2016            2016
##  5 abadijo01             1875            1875
##  6 abbated01             1905            1897
##  7 abbeybe01             1894            1894
##  8 abbeych01             1895            1897
##  9 abbotgl01             1973            1979
## 10 abbotji01             1992            1996
## # ... with 10,385 more rows

observasi ke-n

Fungsi nth() melengkapi first() dan last(). Anda dapat mengakses observasi ke-n dalam grup dengan indeks yang akan dikembalikan.

Misalnya, Anda hanya dapat memfilter tahun kedua tim bermain.

# nth
data % > %
	group_by(teamID) % > %
	summarise(second_game = nth(yearID, 2)) % > %
	arrange(second_game)

Keluaran:

## # A tibble: 148 x 2
##    teamID second_game
##    <fctr>       <int>
##  1    BS1        1871
##  2    CH1        1871
##  3    FW1        1871
##  4    NY2        1871
##  5    RC1        1871
##  6    BR1        1872
##  7    BR2        1872
##  8    CL1        1872
##  9    MID        1872
## 10    TRO        1872
## # ... with 138 more rows

Jumlah pengamatan yang berbeda

Fungsi n() mengembalikan jumlah observasi dalam grup saat ini. Fungsi tertutup untuk n() adalah n_distinct(), yang menghitung jumlah nilai unik.

Pada contoh berikutnya, Anda menjumlahkan total pemain yang direkrut tim selama semua periode.

# distinct values
data % > %
	group_by(teamID) % > %
	summarise(number_player = n_distinct(playerID)) % > %
	arrange(desc(number_player))

Penjelasan Kode

  • group_by(teamID): Kelompokkan berdasarkan tahun dan tim
  • rangkum(angka_pemain = n_berbeda(playerID)): Hitung jumlah pemain yang berbeda berdasarkan tim
  • arrange(desc(number_player)): Urutkan data berdasarkan jumlah pemain

Keluaran:

## # A tibble: 148 x 2
##    teamID number_player
##    <fctr>         <int>
##  1    CHN           751
##  2    SLN           729
##  3    PHI           699
##  4    PIT           683
##  5    CIN           679
##  6    BOS           647
##  7    CLE           646
##  8    CHA           636
##  9    DET           623
## 10    NYA           612
## # ... with 138 more rows

Beberapa kelompok

Statistik ringkasan dapat diwujudkan di antara banyak kelompok.

# Multiple groups
data % > %
	group_by(yearID, teamID) % > %
	summarise(mean_games = mean(G)) % > %
	arrange(desc(teamID, yearID))

Penjelasan Kode

  • group_by(yearID, teamID): Kelompokkan berdasarkan tahun dan tim
  • summarise(mean_games = mean(G)): Ringkaslah jumlah pemain game
  • arrange(desc(teamID, yearID)): Urutkan data berdasarkan tim dan tahun

Keluaran:

## # A tibble: 2,829 x 3
## # Groups:   yearID [146]
##    yearID teamID mean_games
##     <int> <fctr>      <dbl>
##  1   1884    WSU   20.41667
##  2   1891    WS9   46.33333
##  3   1886    WS8   22.00000
##  4   1887    WS8   51.00000
##  5   1888    WS8   27.00000
##  6   1889    WS8   52.42857
##  7   1884    WS7    8.00000
##  8   1875    WS6   14.80000
##  9   1873    WS5   16.62500
## 10   1872    WS4    4.20000
## # ... with 2,819 more rows

Filter

Sebelum Anda ingin melakukan suatu operasi, Anda dapat memfilter kumpulan data. Kumpulan datanya dimulai pada tahun 1871, dan analisisnya tidak memerlukan tahun-tahun sebelum tahun 1980.

# Filter
data % > %
	filter(yearID > 1980) % > %
	group_by(yearID) % > %
	summarise(mean_game_year = mean(G))

Penjelasan Kode

  • filter(yearID > 1980): Filter data untuk hanya menampilkan tahun yang relevan (misalnya setelah 1980)
  • group_by(yearID): Kelompokkan berdasarkan tahun
  • summarise(mean_game_year = mean(G)): Ringkas datanya

Keluaran:

## # A tibble: 36 x 2
##    yearID mean_game_year
##     <int>          <dbl>
##  1   1981       40.64583
##  2   1982       56.97790
##  3   1983       60.25128
##  4   1984       62.97436
##  5   1985       57.82828
##  6   1986       58.55340
##  7   1987       48.74752
##  8   1988       52.57282
##  9   1989       58.16425
## 10   1990       52.91556
## # ... with 26 more rows

Ungroup

Terakhir, Anda perlu menghapus pengelompokan sebelum Anda ingin mengubah tingkat komputasi.

# Ungroup the data
data % > %
	filter(HR > 0) % > %
	group_by(playerID) % > %
	summarise(average_HR_game = sum(HR) / sum(G)) % > %
	ungroup() % > %
	summarise(total_average_homerun = mean(average_HR_game))

Penjelasan Kode

  • filter(HR >0) : Kecualikan homerun nol
  • group_by(playerID): grup demi pemain
  • summarise(average_HR_game = sum(HR)/sum(G)): Hitung rata-rata homerun berdasarkan pemain
  • ungroup(): menghapus pengelompokan
  • summarise(total_average_homerun = mean(average_HR_game)): Ringkas datanya

Keluaran:

## # A tibble: 1 x 1
##   total_average_homerun
##                   <dbl>
## 1            0.06882226	

Kesimpulan

Saat Anda ingin mengembalikan ringkasan berdasarkan grup, Anda dapat menggunakan:

# group by X1, X2, X3
group(df, X1, X2, X3)

Anda perlu memisahkan data dengan:

ungroup(df)

Tabel di bawah merangkum fungsi yang Anda pelajari dengan summarise()

metode fungsi Kode
berarti berarti
summarise(df,mean_x1 = mean(x1))
rata-rata rata-rata
summarise(df,median_x1 = median(x1))
jumlah jumlah
summarise(df,sum_x1 = sum(x1))
standar deviasi sd
summarise(df,sd_x1 = sd(x1))
antarkuartil I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
minimum menit
summarise(df,minimum_x1 = min(x1))
maksimum max
summarise(df,maximum_x1 = max(x1))
kuantil kuantil
summarise(df,quantile_x1 = quantile(x1))
pengamatan pertama pertama
summarise(df,first_x1 = first(x1))
pengamatan terakhir terakhir
summarise(df,last_x1 = last(x1))
observasi ke-n n
summarise(df,nth_x1 = nth(x1, 2))
jumlah kejadian n
summarise(df,n_x1 = n(x1))
jumlah kejadian yang berbeda n_berbeda
summarise(df,n_distinct _x1 = n_distinct(x1))