R Toplama İşlevi: Özetle ve Group_by() Örneği

Bir değişkenin özeti, veri hakkında fikir sahibi olmak açısından önemlidir. Ancak bir değişkenin gruba göre özetlenmesi verilerin dağılımı hakkında daha iyi bilgi verir.

Bu eğitimde, dplyr kitaplığıyla bir veri kümesini gruba göre nasıl özetleyeceğinizi öğreneceksiniz.

Bu eğitim için vuruş veri setini kullanacaksınız. Orijinal veri seti 102816 gözlem ve 22 değişken içeriyor. Bu veri setinin yalnızca %20'sini kullanacaksınız ve aşağıdaki değişkenleri kullanacaksınız:

  • playerID: Oyuncu kimlik kodu. Faktör
  • yıl kimliği: Yıl. Faktör
  • takım kimliği: Takım. faktör
  • lgID: Lig. Faktör: AA AL FL NL PL UA
  • AB: Yarasalarda. Sayısal
  • G: Oyunlar: Bir oyuncunun oynadığı oyun sayısı. Sayısal
  • R: Koşuyor. Sayısal
  • İK: Homerun'lar. Sayısal
  • SH: Kurban vuruşları. Sayısal

Özetleme yapmadan önce, verileri hazırlamak için aşağıdaki adımları gerçekleştireceksiniz:

  • 1. Adım: Verileri içe aktarın
  • 2. Adım: İlgili değişkenleri seçin
  • 3. Adım: Verileri sıralayın
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)

Bir veri kümesini içe aktarırken iyi bir uygulama, veri kümesinin yapısı hakkında fikir sahibi olmak için bakış() işlevini kullanmaktır.

# Structure of the data
glimpse(data)

Çıktı:

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, ...

Özetle()

summarise() sözdizimi temeldir ve dplyr kitaplığında bulunan diğer fiillerle tutarlıdır.

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

Aşağıdaki koda bakın:

summarise(data, mean_run =mean(R))

Kod Açıklama

  • summarise(data, ortalama_run = ortalama(R)): Veri kümesi verilerinden çalıştırılan sütunun ortalaması olan ortalama_run adında bir değişken oluşturur.

Çıktı:

##   mean_run
## 1 19.20114

İstediğiniz kadar değişken ekleyebilirsiniz. Oynanan ortalama oyunları ve ortalama fedakarlık vuruşlarını geri verirsiniz.

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

Kod Açıklama

  • ortalama_SH = ortalama(SH, na.rm = TRUE): İkinci bir değişkeni özetleyin. SH sütunu eksik gözlemler içerdiğinden na.rm = TRUE değerini ayarlarsınız.

Çıktı:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs group_by yok

group_by() olmadan summerise() işlevi hiçbir anlam ifade etmiyor. Gruba göre özet istatistik oluşturur. Kütüphane dplyr group_by fiilinin içinde ilettiğiniz gruba otomatik olarak bir işlev uygular.

group_by'nin diğer tüm fiillerle (yani mutate(), filter(),range(), …) mükemmel şekilde çalıştığını unutmayın.

Birden fazla adımınız olduğunda boru hattı operatörünü kullanmak uygundur. Ortalama homerun'ı beyzbol ligine göre hesaplayabilirsiniz.

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

Kod Açıklama

  • veri: Özet istatistikleri oluşturmak için kullanılan veri kümesi
  • group_by(lgID): `lgID değişkenini gruplayarak özeti hesaplayın
  • summarise(mean_run = ortalama(HR)): Ortalama homerun'u hesaplayın

Çıktı:

## 
# 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	

Boru operatörü ggplot() ile de çalışır. Özet istatistiği grafikle kolayca gösterebilirsiniz. Grafik çizilene kadar tüm adımlar boru hattının içine itilir. Liglere göre ortalama sayıyı bir çubuk karakterle görmek daha görsel görünüyor. Aşağıdaki kod group_by(), summarise() ve ggplot()'u bir araya getirmenin gücünü göstermektedir.

Aşağıdaki adımı uygulayacaksınız:

  • 1. Adım: Veri çerçevesini seçin
  • 2. Adım: Verileri gruplayın
  • 3. Adım: Verileri özetleyin
  • Adım 4: Özet istatistiklerin grafiğini çizin
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()"
        )
    )

Çıktı:

Özetle Group_by Örneği

Özetle işlev()

summarise() fiili, R'deki hemen hemen tüm işlevlerle uyumludur. Burada summarise() ile birlikte kullanabileceğiniz yararlı işlevlerin kısa bir listesi bulunmaktadır:

Nesnel işlev Açıklama
Basic kastetmek() x vektörünün ortalaması
medyan() x vektörünün medyanı
toplam() x vektörünün toplamı
varyasyon SD() x vektörünün standart sapması
IQR() x vektörünün çeyrekleri
Aralık dk() Minimum vektör x
maksimum() Maksimum vektör x
çeyreklik() x vektörünün niceliği
Pozisyon ilk() group_by() ile kullanın Grubun ilk gözlemi
son() group_by() ile kullanın. Grubun son gözlemi
n'inci() group_by() ile kullanın. grubun n'inci gözlemi
saymak n () group_by() ile kullanın. Satır sayısını sayın
n_distinct() group_by() ile kullanın. Farklı gözlemlerin sayısını sayın

Tablo 1'deki her fonksiyon için örnekler göreceğiz.

Temel işlev

Önceki örnekte özet istatistiğini bir veri çerçevesinde saklamadınız.

Özetten bir tarih çerçevesi oluşturmak için iki adımda ilerleyebilirsiniz:

  • Adım 1: Veri çerçevesini daha sonra kullanmak üzere saklayın
  • Adım 2: Çizgi grafiği oluşturmak için veri kümesini kullanın

) 1 Adım Yıllara göre oynanan ortalama oyun sayısını hesaplarsınız.

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

Kod Açıklama

  • Vuruş veri kümesinin özet istatistiği ex1 veri çerçevesinde saklanır.

Çıktı:

## # 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	

) 2 Adım Özet istatistiğini çizgi grafiğiyle gösterir ve trendi görürsünüz.

# 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"
        )
    )

Çıktı:

Temel Fonksiyon Örneği

alt kümeleme

Summary() işlevi alt kümelemeyle uyumludur.

## 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]))

Kod Açıklama

  • medyan_at_bat_league_no_zero = medyan(AB[AB > 0]): AB değişkeni çok sayıda 0 içerir. vuruşta 0 olan ve olmayan değişken.

Çıktı:

## # 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	

Toplam

Değişkeni toplamak için başka bir yararlı işlev sum() işlevidir.

Hangi liglerin daha fazla homerun'a sahip olduğunu kontrol edebilirsiniz.

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

Çıktı:

## # 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	

Standart sapma

Verilerdeki yayılma standart sapma veya R'deki sd() ile hesaplanır.

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

Çıktı:

## # 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		

Her takımın yaptığı homerun miktarında pek çok eşitsizlik var.

Minimum ve maksimum

Min() ve max() fonksiyonuyla bir vektörün minimum ve maksimum değerlerine erişebilirsiniz.

Aşağıdaki kod, bir oyuncunun bir sezonda oynadığı en düşük ve en yüksek oyun sayısını döndürür.

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

Çıktı:

## # 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

saymak

Gözlemleri gruba göre saymak her zaman iyi bir fikirdir. R ile, oluşum sayısını n() ile toplayabilirsiniz.

Örneğin aşağıdaki kod, her oyuncunun oynadığı yıl sayısını hesaplar.

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

Çıktı:

## # 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

İlk ve son

Bir grubun ilk, son veya n'inci konumunu seçebilirsiniz.

Örneğin her oyuncunun ilk ve son yılını bulabilirsiniz.

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

Çıktı:

## # 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

n'inci gözlem

nth() işlevi, ilk() ve son() işlevinin tamamlayıcısıdır. Döndürülecek indeks ile bir grup içindeki n'inci gözleme erişebilirsiniz.

Örneğin, bir takımın yalnızca oynadığı ikinci yılı filtreleyebilirsiniz.

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

Çıktı:

## # 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

Farklı gözlem sayısı

n() işlevi geçerli bir gruptaki gözlemlerin sayısını döndürür. n()'ın kapalı işlevi, benzersiz değerlerin sayısını sayan n_distinct()'tir.

Bir sonraki örnekte, bir takımın tüm dönemlerde işe aldığı oyuncuların toplamını topluyorsunuz.

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

Kod Açıklama

  • group_by(teamID): Yıla göre grupla ve takım
  • özetle(number_player = n_farklı(playerID)): Takıma göre farklı oyuncu sayısını sayın
  • düzenleme(desc(number_player))): Verileri oynatıcı sayısına göre sıralayın

Çıktı:

## # 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

Birden çok grup

Birden fazla grup arasında özet bir istatistik gerçekleştirilebilir.

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

Kod Açıklama

  • group_by(yılID, takımID): Yıla göre grupla ve takım
  • summarise(mean_games = ortalama(G)): Oyundaki oyuncu sayısını özetler
  • düzenleme(desc(teamID, yılID))): Verileri takıma ve yıla göre sıralayın

Çıktı:

## # 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

filtre

Bir işlem yapmayı düşünmeden önce veri kümesini filtreleyebilirsiniz. Veri seti 1871'de başlıyor ve analizin 1980'den önceki yıllara ihtiyacı yok.

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

Kod Açıklama

  • filter(yearID > 1980): Verileri yalnızca ilgili yılları gösterecek şekilde filtreleyin (örn. 1980 sonrası)
  • group_by(yearID): Yıla göre grupla
  • summarise(mean_game_year = ortalama(G)): Verileri özetleyin

Çıktı:

## # 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

Çöz

Son fakat bir o kadar da önemli olarak, hesaplamanın düzeyini değiştirmek istemeden önce gruplamayı kaldırmanız gerekir.

# 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))

Kod Açıklama

  • filter(HR >0): Sıfır homerun'u hariç tut
  • group_by(playerID): oyuncuya göre grupla
  • summarise(average_HR_game = sum(HR)/sum(G)): Oyuncuya göre ortalama homerun'u hesaplayın
  • ungroup(): gruplamayı kaldır
  • summarise(total_average_homerun = ortalama(average_HR_game)): Verileri özetleyin

Çıktı:

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

ÖZET

Gruba göre bir özet döndürmek istediğinizde şunları kullanabilirsiniz:

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

verilerin grubunu şu şekilde çözmeniz gerekir:

ungroup(df)

Aşağıdaki tablo summarise() ile öğrendiğiniz işlevi özetlemektedir.

Yöntem işlev Kod
ortalama ortalama
summarise(df,mean_x1 = mean(x1))
medyan medyan
summarise(df,median_x1 = median(x1))
toplam toplam
summarise(df,sum_x1 = sum(x1))
standart sapma sd
summarise(df,sd_x1 = sd(x1))
çeyrekler arası I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
asgari dk
summarise(df,minimum_x1 = min(x1))
maksimum maksimum
summarise(df,maximum_x1 = max(x1))
çeyreklik çeyreklik
summarise(df,quantile_x1 = quantile(x1))
ilk gözlem ilk
summarise(df,first_x1 = first(x1))
son gözlem son
summarise(df,last_x1 = last(x1))
n'inci gözlem n'inci
summarise(df,nth_x1 = nth(x1, 2))
meydana gelme sayısı n
summarise(df,n_x1 = n(x1))
farklı oluşum sayısı n_farklı
summarise(df,n_distinct _x1 = n_distinct(x1))

Günlük Guru99 Bülteni

Gününüze, şu anda elinize ulaşan en son ve en önemli yapay zeka haberleriyle başlayın.