آمار، داده کاوی 1285 بازدید

یکی از روش‌های خلاصه کردن داده‌ها، جمعی‌بندی (Aggregation) است. با استفاده از این روش برای یک گروه از داده‌ها، یک نماینده انتخاب می‌شود. به این ترتیب می‌توان توزیع احتمالی یا فراوانی یک متغیر کمی را به تفکیک سطوح مختلف یک متغیر کیفی یا طبقه‌ای (Categorical Variable) بدست آورد. در این نوشتار به بررسی دو تابع معروف در زبان برنامه‌نویسی آماری R به نام‌های $$summarise()$$ و $$group\_by()$$ خواهیم پرداخت. در این میان از کتابخانه‌ dplyr استفاده خواهیم کرد. بنابراین شاید مطالعه مطلب تبدیل و پاکسازی داده‌ ها با کتابخانه dplyr و tidyr در R — راهنمای کاربردی خالی از لطف نباشد. اکنون و در ادامه به توابع جمع بندی پیش‌تر اشاره شده خواهیم پرداخت.

توابع جمع‌ بندی (Aggregation Functions)

به عنوان یک «تحلیل‌گر داده» (Data Scientist) باید توانایی تغییر ساختار و شاخص‌سازی برای یک «مجموعه داده» (Dataset) را داشته باشید. بخصوص اگر از زبان‌برنامه نویسی R استفاده می‌کنید، این کار به صورت معمول در همه تحلیل‌ها، ضرورت خواهد داشت. برای آشنایی با این گونه توابع از یک بانک اطلاعاتی به نام batting_lahman.csv که در (+) قرار دارد، استفاده خواهیم کرد. این مجموعه داده شامل 20563 مشاهده و ۲۲ متغیر است. البته بعضی از این متغیرها را در اینجا به کار خواهیم گرفت. متغیرهایی که در این نوشتار به آن‌ها می‌پردازیم در زیر فهرست شده‌اند.

نام متغیر شرح
playerID شماره بازیکن (از نوع عامل)
teamID کد تیم (از نوع عامل)
lgID کد مسابقات (از نوع عامل با سطوح AA, AL, FL, NL, PL, UA)
AB تعداد قرارگیری در پست At bats (عددی)
G تعداد بازی‌های هر بازیکن (عددی)
R تعداد Runها (عددی)
HR تعداد بازی‌های خانگی (عددی)
SH تعداد ضربه‌های sacrifice

برای شروع کار گام‌های زیر را باید برداریم تا به مجموعه داده دلخواه با متغیرهایی که در بالا ذکر شده دست پیدا کنیم.

  • گام اول: داده‌ها را وارد کنیم.
  • گام دوم: متغیرهای مورد نظر را انتخاب کنیم.
  • گام سوم: داده‌ها را مرتب کنیم.

این گام‌ها در کد زیر پیاده‌سازی شده‌اند. همانطور که می‌بینید، کتابخانه dplyr در اینجا نقش مهمی دارد.

library(dplyr)

# Step 1
data <- read.csv("https://raw.githubusercontent.com/thomaspernet/data_csv_r/master/data/batting_lahman.csv") % > % 

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

#Step 3
arrange(playerID, teamID, yearID)

برای مشاهده بخشی از داده‌ها بهتر است از دستور (glimpse(data استفاده کنیم. نتیجه به صورت زیر خواهد بود.

## Observations: 20,563
## Variables: 9
## $ playerID <fctr> aardsda01, aardsda01, aaronha01, aaronha01, aaronha0...
## $ yearID   <int> 2009, 2010, 1973, 1957, 1962, 1975, 1986, 1979, 1980,...
## $ AB       <int> 0, 0, 392, 615, 592, 465, 0, 0, 0, 0, 0, 0, 45, 610, ...
## $ teamID   <fctr> SEA, SEA, ATL, ML1, ML1, ML4, BAL, CAL, CAL, CAL, LA...
## $ lgID     <fctr> AL, AL, NL, NL, NL, AL, AL, AL, AL, AL, NL, AL, NA, ...
## $ G        <int> 73, 53, 120, 151, 156, 137, 66, 37, 40, 24, 32, 18, 1...
## $ R        <int> 0, 0, 84, 118, 127, 45, 0, 0, 0, 0, 0, 0, 3, 70, 20, ...
## $ HR       <int> 0, 0, 40, 44, 45, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0...
## $ SH       <int> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, NA, 5, 8, 0, NA, ...

تابع Summarise

شکل تابع $$summarise()$$ به مانند دیگر توابع کتابخانه dplyr است. با این تابع می‌توان یک متغیر محاسباتی براساس تابعی که معرفی می‌کنید ایجاد کرد.

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

پارامتر اول نام «چارچوب داده» (Data Frame) و پارامتر دوم نام متغیر و نحوه محاسبه این متغیر جدید است. برای مثال اگر قرار باشد که میانگین متغیر R را در چارچوب داده data محاسبه کرده و در متغیر mean_run قرار دهیم، باید شکل دستوری summarise به صورت زیر نوشته شود.

summarise(data, mean_run =mean(R))

نتیجه ایجاد متغیر mean_run با مقدار 19.20144 خواهد بود. همین کار را برای متغیرهای دیگر نیز می‌توان در یک دستور انجام داد. برای مثال، کد زیر میانگین را برای متغیرهای G و SH محاسبه می‌کند. البته برای متغیر SH‌ پارامتر na.rm=TRUE نشان می‌دهد که باید مقادیر ناموجود (گمشده) که با NA در مجموعه داده data ثبت شده‌اند حذف و سپس محاسبه میانگین صورت گیرد.

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

گروه بندی با group_by

اگر هدف از اجرای تابع $$summarise()$$ جمع‌بندی براساس گروه‌ها باشد باید از group_by نیز استفاده کرد. به این ترتیب آماره‌های توصیفی به تفکیک متغیر گروه‌بندی ایجاد می‌شود. ترکیب این تابع با توابع دیگر مانند mutate و filter و arrange بسیار کاربردی و موثر است.

در اینجا استفاده از «عملگر سلسله‌ای» (Pipeline Operator) بخصوص زمانی که مراحل زیاد باشند، مناسب به نظر می‌رسد. در ادامه با استفاده از این عملگر و تابع group_by و summarise محاسبات را انجام داده‌ایم.

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

همانطور که دیده می‌شود، مجموعه داده data وارد فیلتر group_by شده و محاسبات مربوط به میانگین متغیر HR به تفکیک متغیر lgID ثبت خواهد شد. در نتیجه خروجی شامل ۷ سطر است که میانگین متغیر HR را در سطوح مختلف متغیر lgID مشخص می‌کند.

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

از عملگر سلسله‌ای در تابع ggplot از کتابخانه ggplot2 نیز می‌توان استفاده کرد. به این ترتیب می‌توان محاسباتی که توسط summarise صورت گرفته را در نمودار به کار برد. فرض کنید می‌خواهیم میانگین متغیر HR را به تفکیک سطوح متغیر lgID روی یک نمودار میله‌ای (Bar Chart) نمایش دهیم. مراحل زیر برای انجام چنین کاری باید طی شود.

  • انتخاب چارچوب داده (Data Frame)
  • دسته‌بندی کردن داده‌ها (Group Data)
  • محاسبه شاخص جمع‌بندی (Summarize the Data)
  • رسم نمودار شاخص محاسبه شده (Plot the Summary Statistics)

این گام‌ها در کد زیر انجام شده است. توجه داشته باشید که از کتابخانه ggplot2 استفاده کرده‌ایم.

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

خروجی با اجرای این کد به صورت زیر در خواهد آمد. مشخص است که مراحل اولیه تا قبل از اجرای فرمان ggplot به منظور طبقه‌بندی و جمع‌بندی صورت گرفته و در گام آخر رسم نمودار انجام شده است.

Aggregate and plotting

توابع محاسباتی در Summarise

تقریبا همه توابع محاسباتی در summarise قابلیت استفاده دارند. در ادامه به لیست کوتاهی از توابع معمول که در summarise به کار می‌روند اشاره می‌کنیم. توجه دارید که این لیست شامل توابعی است که خروجیشان به صورت یک عدد ظاهر خواهد شد.

نوع تابع شیوه محاسبه تابع
پایه‌ میانگین mean()
میانه median()
جمع sum()
پراکندگی انحراف استاندارد sd()
دامنه میان چارکی IQR()
دامنه حداقل min()
حداکثر max()
چندک quantile()
موقعیت مقدار اولین موقعیت (اولین مقدار) first()
مقدار آخرین موقعیت (آخرین مقدار) last()
مقدار nامین موقعیت nth()
شمارش شمارش تعداد سطرها n()
شمارش تعداد مشاهدات مجزا n_distinct()

در ادامه برای هر یک از این حالت‌ها مثال‌هایی خواهیم دید.

توابع پایه

در کدهایی که تا به حال در این نوشتار دیدید، نتایج محاسبه شاخص‌های جمع‌بندی و summarise در متغیری ثبت نشد. حال نتیجه محاسبات با summarise را درون یک «چارچوب داده» (data frame) ثبت و از آن استفاده خواهیم کرد.

در ادامه قصد داریم، میانگین تعداد بازی در هر سال را محاسبه و سپس نمودار مربوط به این موضوع را به صورت یک نمودار خطی ترسیم کنیم.

در گام اول، شاخص میانگین استخراج می‌شود. این کار توسط کد زیر صورت گرفته است:

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

نتیجه اجرای این کار به صورت زیر است. مشخص است که نتیجه محاسبه شاخص میانگین توسط summarise روی گروه‌های تعیین شده توسط group_by برای هر سال استخراج شده و به صورت یک چارچوب داده در ex1 ثبت شده است.

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

در گام دوم برای رسم نمودار از متغیر ایجاد شده کمک گرفته و نمودار خطی ترسیم می‌شود.

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

نمودار خطی مطابق با تصویر زیر ظاهر خواهد شد.

Aggregate and line plotting

درون summarise می‌توان بیش از یک متغیر را محاسبه کرد. در کد زیر علاوه بر محاسبه میانه برای متغیر AB میانه برای داده‌هایی از متغیر AB که غیر صفر هستند نیز محاسبه شده و با میانه قبلی مقایسه شده است. همانطور که دیده می‌شود از نوعی فیلتر به صورت $$[AB>0]$$ برای متغیر AB استفاده کرده‌ایم.

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

به این ترتیب خروجی به صورتی است که «میانه» (Median) در هر دو حالت (با احتساب مقدارهای صفر و بدون آن) محاسبه و به تفکیک lgID ظاهر شده است.

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

در مثال بعدی با استفاده از تابع sum مجموع بازی‌های خانگی هر تیم (HR) به تفکیک کد لیگ مسابقات (lgID) محاسبه شده است.

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

نکته: همانطور که در خروجی می‌بینید متغیر lgID از نوع فاکتور یا عامل (<fctr>)و متغیر جمع‌بندی sum_homerun_leage عددی (<int>) است.

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

معیارهای پراکندگی

معمولا برای محاسبه میزان پارکندگی داده‌ها در R از شاخص‌های انحراف استاندارد که توسط تابع sd قابل دسترسی است، کمک می‌گیرند. کد زیر به منظور محاسبه میزان پراکندگی برای HR تهیه شده است.

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

نتیجه در ادامه قابل مشاهده است.

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

نکته: اگر می‌خواهید خروجی به صورت مرتب شده برحسب متغیر جمع‌بندی ظاهر شود باید از دستور arrange استفاده کنید. بنابراین برای نمایش انحراف استاندارد بازی‌های خانگی به ترتیب از بزرگ به کوچک دستورات را به صورتی که در ادامه آمده‌ است، وارد و اجرا کنید.

data %>%
  group_by(teamID) %>%
  summarise(sd_at_bat_league = sd(HR)) %>%
arrange(desc(sd_at_bat_league))

خروجی این قطعه کد در ادامه، دیده می‌شود.

# A tibble: 148 x 2
   teamID sd_at_bat_league
   <fct>             <dbl>
 1 ML1               10.2 
 2 MIL                9.53
 3 COL                9.49
 4 ANA                8.78
 5 TOR                8.72
 6 ATL                8.54
 7 NYA                8.11
 8 TEX                7.87
 9 MIA                7.78
10 BAL                7.74
# ... with 138 more rows
>

مشخص است که تیم ML1 دارای بیشترین انحراف استاندارد برای بازی‌های خانگی است.

معیارهای مرتبط با دامنه

همچنین می‌توان حداکثر و حداقل تعداد بازی‌های هر بازیکن را به همین شکل بدست آورد. به کد زیر توجه کنید.

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

نکته: حتما تا به حال متوجه شده‌اید که با اجرای عملگر سلسله مراتب، احتیاجی به ذکر مجموعه داده data در summarise نیست.

پس از انجام محاسبات، خروجی به صورتی که در ادامه قابل مشاهده است، ظاهر خواهد شد.

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

موقعیت

برای نمایش مقدارها در موقعیت‌های خاص از توابعی مانند first و last‌ استفاده می‌کنیم. فرض کنید که باید برای هر بازیکن، سال شروع به فعالیت ورزشی و سال بازنشستگی را مشخص کنید. این توابع را در summarise به این منظور به کار برده و کدی که در ادامه قابل مشاهده است را ایجاد کرده‌ایم.

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

خروجی حاصل از اجرای این کد در ادامه قابل مشاهده است.

## # 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امین مشاهده کافی است از تابع ()nth استفاده شود. فرض کنید در مجموعه داده data بخواهیم فقط روی بازی‌هایی که تیم در سال دوم فعالیتش انجام داده تمرکز داشته باشیم. با استفاده از کدی که در ادامه مشاهده می‌کنید این منظور محقق شده است.

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

ابتدا بوسیله group_by دسته‌بندی براساس کد تیم صورت گرفته، سپس خروجی براساس دومین «سال بازی» (yearID) هر تیم به صورت نزولی ظاهر خواهد شد. به خروجی توجه کنید.

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

به این ترتیب، متوجه می‌شویم سال ۱۸۷۱ دومین سالی بوده که تیم BS1 در لیگ شرکت کرده بوده است.

شمارش (Count)

برای شمارش تعداد مشاهدات براساس تفکیکی که group_by ایجاد کرده است، از تابع $$n()$$‌ در summarise استفاده می‌کنیم. به کد زیر توجه کنید.

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

مشخص است که برای مرتب‌سازی خروجی از arrange و شیوه مرتب‌سازی نزولی (Descending) استفاده شده است. خروجی که شامل تعداد بازی‌های بازیکنان به صورت نزولی است را در ادامه می‌توانید ببینید.

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

اگر بخواهید تعداد مشاهدات منحصر به فرد را شمارش کنید باید از n_distinct بهره بگیرید. فرض کنید احتیاج به لیستی دارید که در آن مشخص شود هر تیم تا به حال از چند بازیکن استفاده کرده است. کدی که در ادامه می‌بینید به این منظور تهیه شده است.

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

خروجی به صورت زیر در خواهد آمد. همانطور که مشخص است number_player تعداد بازیکنان برای هر تیم را ثبت و نمایش داده است.

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

گروه‌بندی ترکیبی (Multiple Groups)

همانطور که گفته شد، تابع group_by امکان دسته‌بندی مشاهدات را براساس یک متغیر عامل انجام می‌دهد. این طبقه‌بندی می‌تواند به صورت ترکیبی نیز باشد. برای مثال می‌توان بازی‌ها را براساس هم سال و هم تیم، طبقه‌بندی کرده و میانگین بازی‌های صورت گرفته را محاسبه کرد. در خروجی از ترتیب نزولی کد تیم (teamID) و کد سال (yearID) بهره گرفته‌ایم تا میانگین بازی‌های هر تیم در سال‌های مختلف را نمایش دهیم. به کد زیر توجه کنید:

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

خروجی در ادامه قابل مشاهده است. همانطور که می‌بینید، ترتیب نمایش متوسط بازی‌ها براساس اولویت نام تیم است. اگر نام تیمی تکراری باشد، متوسط بازی‌ها به ترتیب سال انجام بازی از کم به زیاد مرتب شده است.

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

گاهی لازم است که محاسبات براساس مشاهدات خاصی صورت گیرد. به کمک تابع ()filter این امکان در R بوجود آمده است. فرض کنید می‌خواهید محاسبات میانگین بازی‌ها را به سال‌های بعد از ۱۹۸۰ محدود کنید. کد زیر به این منظور نوشته شده است.

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

مشخص است که در تابع ()filter از پارامتر 1980<yearID برای ایجاد محدودیت روی مشاهدات برحسب سال‌های بعد از 1980 استفاده شده، سپس طبقه‌بندی و محاسبه میانگین بازی‌ها به تفکیک سال، انجام شده است. نتیجه اجرای کد به صورت زیر خواهد بود.

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

اگر در حین محاسبات روی گروه‌ها، لازم باشد که شاخصی برای همه مشاهدات بدست آید، می‌توانید از تابع ()ungroup استفاده کنید. فرض کنید قرار است درصد بازی‌ها خانگی (HR) به کل بازی‌ها (G)، به تفکیک هر بازیکن محاسبه شود. براساس این مقدارها، میانگین درصد کل بازی‌های خانگی بازیکنان (بدون در نظر گرفتن گروه‌بندی براساس بازیکنان) نیز باید در انتها بدست آید.

همانطور که در کد زیر قابل مشاهده است، تابع ()ungroup به عنوان یک تابع درون عملگرهای سلسله‌ مراتبی ظاهر شده و باعث می‌شود که گروه‌بندی برداشته شود. بنابراین محاسبه summarise برای همه مشاهدات اعمال خواهد شد.

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

همانطور که دیده می‌شود، فیلتر $$filter(HR>0)$$ باعث می‌شود، مشاهداتی که تعداد بازی‌های خانگی‌ آن‌ها صفر است، از محاسبات خارج شوند. خروجی به صورت زیر در خواهد آمد.

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

به این ترتیب مشخص است که فقط بطور متوسط ۶ درصد بازی‌های بازیکنان در خانه صورت گرفته است.

نکته: در حالت کلی برای گروه‌بندی یا خارج کردن مشاهدات از گروه‌بندی، باید از قالب‌های زیر استفاده کنید.

group(df, X1, X2, X3)
ungroup(df)

خلاصه

جدول زیر به بررسی اجمالی محاسبات توسط summarise پرداخته است.

روش  تابع کد
محاسبه میانگین روی مجموعه داده df روی متغیر x1 mean summarise(df,mean_x1=mean(x1))
محاسبه میانه روی مجموعه داده df روی متغیر x1 median summarise(df,median_x1=median(x1))
محاسبه مجموع روی مجموعه داده df روی متغیر x1 sum summarise(df,sum_x1=sum(x1))
محاسبه انحراف استاندارد روی مجموعه داده df روی متغیر x1 sd summarise(df,sd_x1=sd(x1))
محاسبه دامنه چارکی روی مجموعه داده df روی متغیر x1 IQR summarise(df,interquartile_x1=IQR(x1))
محاسبه حداقل روی مجموعه داده df روی متغیر x1 min summarise(df,minimum_x1=min(x1))
محاسبه حداکثر روی مجموعه داده df روی متغیر x1 max summarise(df,maximum_x1=max(x1))
محاسبه چندک‌ها روی مجموعه داده df روی متغیر x1 quantile summarise(df,quantile_x1=quantile(x1))
محاسبه اولین مقدار روی مجموعه داده df روی متغیر x1 first summarise(df,first_x1=first(x1))
محاسبه آخرین مقدار روی مجموعه داده df روی متغیر x1 last summarise(df,last_x1=last(x1))
محاسبه nامین مقدار روی مجموعه داده df روی متغیر x1 nth summarise(df,nth_x1=nth(x1, 2))
محاسبه تعداد مقدار روی مجموعه داده df روی متغیر x1 n summarise(df,n_x1=n(x1))
محاسبه تعداد تکرار‌های یک مقدار روی مجموعه داده df روی متغیر x1 n_distinct summarise(df,n_distinct _x1=n_distinct(x1))

اگر مطلب بالا برای شما مفید بوده، آموزش‌ها و مطالب زیر نیز که در زمینه به کار‌گیری آمار و محاسبات در نرم‌افزار R هستند، به شما پیشنهاد می‌شوند:

^^

بر اساس رای 1 نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«آرمان ری‌بد» دکتری آمار در شاخه آمار ریاضی دارد. از علاقمندی‌های او، یادگیری ماشین، خوشه‌بندی و داده‌کاوی است و در حال حاضر نوشتارهای مربوط به آمار و یادگیری ماشین را در مجله فرادرس تهیه می‌کند.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *