R Aggregate Function: Περίληψη & Group_by() Παράδειγμα

Η περίληψη μιας μεταβλητής είναι σημαντική για να έχετε μια ιδέα σχετικά με τα δεδομένα. Ωστόσο, η σύνοψη μιας μεταβλητής ανά ομάδα παρέχει καλύτερες πληροφορίες σχετικά με την κατανομή των δεδομένων.

Σε αυτό το σεμινάριο, θα μάθετε πώς συνοψίζετε ένα σύνολο δεδομένων ανά ομάδα με τη βιβλιοθήκη dplyr.

Για αυτό το σεμινάριο, θα χρησιμοποιήσετε το σύνολο δεδομένων batting. Το αρχικό σύνολο δεδομένων περιέχει 102816 παρατηρήσεις και 22 μεταβλητές. Θα χρησιμοποιήσετε μόνο το 20 τοις εκατό αυτού του συνόλου δεδομένων και θα χρησιμοποιήσετε τις ακόλουθες μεταβλητές:

  • Αναγνωριστικό παίκτη: Κωδικός αναγνώρισης παίκτη. Παράγοντας
  • Αναγνωριστικό έτους: Έτος. Παράγοντας
  • ID ομάδας: Ομάδα. παράγοντας
  • lgID: League. Συντελεστής: AA AL FL NL PL UA
  • Α.Β.: Στις νυχτερίδες. Αριθμητικός
  • Ζ: Παιχνίδια: αριθμός παιχνιδιών από έναν παίκτη. Αριθμητικός
  • Ε: Τρέχει. Αριθμητικός
  • HR: Homeruns. Αριθμητικός
  • Σ.Χ.: Θυσία χτυπήματα. Αριθμητικός

Προτού εκτελέσετε σύνοψη, θα κάνετε τα ακόλουθα βήματα για να προετοιμάσετε τα δεδομένα:

  • Βήμα 1: Εισαγάγετε τα δεδομένα
  • Βήμα 2: Επιλέξτε τις σχετικές μεταβλητές
  • Βήμα 3: Ταξινόμηση των δεδομένων
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)

Μια καλή πρακτική όταν εισάγετε ένα σύνολο δεδομένων είναι να χρησιμοποιήσετε τη συνάρτηση glimpse() για να έχετε μια ιδέα σχετικά με τη δομή του συνόλου δεδομένων.

# Structure of the data
glimpse(data)

Παραγωγή:

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

Συνοψίζω()

Η σύνταξη της 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

Δείτε τον παρακάτω κώδικα:

summarise(data, mean_run =mean(R))

Επεξήγηση κώδικα

  • summarise(data, mean_run = mean(R)): Δημιουργεί μια μεταβλητή με το όνομα mean_run που είναι ο μέσος όρος της στήλης που εκτελείται από τα δεδομένα δεδομένων.

Παραγωγή:

##   mean_run
## 1 19.20114

Μπορείτε να προσθέσετε όσες μεταβλητές θέλετε. Επιστρέφετε τον μέσο όρο των παιχνιδιών που παίχτηκαν και ο μέσος όρος θυσίας χτυπά.

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

Επεξήγηση κώδικα

  • mean_SH = mean(SH, na.rm = TRUE): Συνοψίστε μια δεύτερη μεταβλητή. Ορίζετε na.rm = TRUE επειδή η στήλη SH περιέχει παρατηρήσεις που λείπουν.

Παραγωγή:

##   mean_games  mean_SH
## 1   51.98361 2.340085

Group_by vs no group_by

Η συνάρτηση summerise() χωρίς group_by() δεν έχει νόημα. Δημιουργεί συνοπτικά στατιστικά ανά ομάδα. Η βιβλιοθήκη dplyr εφαρμόζει μια συνάρτηση αυτόματα στην ομάδα που περάσατε μέσα στο ρήμα group_by.

Σημειώστε ότι, το group_by λειτουργεί τέλεια με όλα τα άλλα ρήματα (π.χ. mutate(), filter(), arrange(), …).

Είναι βολικό να χρησιμοποιείτε τον χειριστή αγωγού όταν έχετε περισσότερα από ένα βήματα. Μπορείτε να υπολογίσετε το μέσο όρο homerun ανά πρωτάθλημα μπέιζμπολ.

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

Επεξήγηση κώδικα

  • δεδομένα: Σύνολο δεδομένων που χρησιμοποιείται για την κατασκευή των συνοπτικών στατιστικών
  • group_by(lgID): Υπολογίστε τη σύνοψη ομαδοποιώντας τη μεταβλητή `lgID
  • summarise(mean_run = mean(HR)): Υπολογίστε το μέσο homerun

Παραγωγή:

## 
# 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(). Μπορείτε εύκολα να εμφανίσετε το συνοπτικό στατιστικό στοιχείο με ένα γράφημα. Όλα τα σκαλοπάτια ωθούνται μέσα στον αγωγό έως ότου η λαβή είναι οικόπεδο. Φαίνεται πιο οπτικό να βλέπεις το μέσο homerun ανά πρωτάθλημα με έναν χαρακτήρα μπαρ. Ο παρακάτω κώδικας δείχνει τη δύναμη του συνδυασμού group_by(), summarise() και ggplot() μαζί.

Θα κάνετε το εξής βήμα:

  • Βήμα 1: Επιλέξτε πλαίσιο δεδομένων
  • Βήμα 2: Ομαδοποιήστε δεδομένα
  • Βήμα 3: Συνοψίστε τα δεδομένα
  • Βήμα 4: Σχεδιάστε τα συνοπτικά στατιστικά στοιχεία
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()"
        )
    )

Παραγωγή:

Ομάδα_κατά Παράδειγμα με Σύνοψη

Συνάρτηση συνοπτικά ()

Το ρήμα summarise() είναι συμβατό με όλες σχεδόν τις συναρτήσεις στο R. Ακολουθεί μια σύντομη λίστα με χρήσιμες συναρτήσεις που μπορείτε να χρησιμοποιήσετε μαζί με το summarise():

Σκοπός Λειτουργία Descriptιόν
Βασικο σημαίνω() Μέσος όρος του διανύσματος x
διάμεσος() Διάμεσος του διανύσματος x
άθροισμα() Άθροισμα του διανύσματος x
παραλλαγή sd() τυπική απόκλιση του διανύσματος x
IQR() Διατεταρτημόριο του διανύσματος x
Σειρά ελάχ. () Ελάχιστο διάνυσμα x
Μέγιστη() Μέγιστο διάνυσμα x
quantile() Ποσοστό του διανύσματος x
Θέση πρώτα() Χρήση με group_by() Πρώτη παρατήρηση της ομάδας
τελευταίος() Χρήση με group_by(). Τελευταία παρατήρηση της ομάδας
απείρως μικρός() Χρήση με group_by(). η παρατήρηση της ομάδας
Κόμης ν () Χρήση με group_by(). Μετρήστε τον αριθμό των σειρών
n_distinct() Χρήση με group_by(). Μετρήστε τον αριθμό των διακριτών παρατηρήσεων

Θα δούμε παραδείγματα για κάθε συνάρτηση του πίνακα 1.

Βασική λειτουργία

Στο προηγούμενο παράδειγμα, δεν αποθηκεύσατε το συνοπτικό στατιστικό στοιχείο σε ένα πλαίσιο δεδομένων.

Μπορείτε να προχωρήσετε σε δύο βήματα για να δημιουργήσετε ένα πλαίσιο ημερομηνίας από μια σύνοψη:

  • Βήμα 1: Αποθηκεύστε το πλαίσιο δεδομένων για περαιτέρω χρήση
  • Βήμα 2: Χρησιμοποιήστε το σύνολο δεδομένων για να δημιουργήσετε μια γραφική παράσταση γραμμής

Βήμα 1) Υπολογίζετε τον μέσο αριθμό παιχνιδιών που παίζονται ανά έτος.

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

Επεξήγηση κώδικα

  • Η συνοπτική στατιστική του συνόλου δεδομένων batting αποθηκεύεται στο πλαίσιο δεδομένων 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	

Βήμα 2) Δείχνεις το συνοπτικό στατιστικό με ένα διάγραμμα γραμμής και βλέπεις την τάση.

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

Παραγωγή:

Παράδειγμα βασικής συνάρτησης

Υπορύθμιση

Η συνάρτηση summarise() είναι συμβατή με την υπορύθμιση.

## 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_at_bat_league_no_zero = διάμεσος(AB[AB > 0]): Η μεταβλητή AB περιέχει πολλά 0. Μπορείτε να συγκρίνετε τη διάμεσο του στο ρόπαλο μεταβλητή με και χωρίς 0.

Παραγωγή:

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

Μπορείτε να ελέγξετε ποια πρωταθλήματα έχουν τα περισσότερα homerun.

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

Παραγωγή:

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

Τυπική απόκλιση

Το spread στα δεδομένα υπολογίζεται με την τυπική απόκλιση ή sd() στο R.

# 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		

Υπάρχουν πολλές ανισότητες στην ποσότητα του homerun που κάνει κάθε ομάδα.

Ελάχιστο και μέγιστο

Μπορείτε να αποκτήσετε πρόσβαση στο ελάχιστο και στο μέγιστο ενός διανύσματος με τις συναρτήσεις min() και max().

Ο παρακάτω κωδικός επιστρέφει τον χαμηλότερο και τον υψηλότερο αριθμό αγώνων σε μια σεζόν που έπαιξε ένας παίκτης.

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

Παραγωγή:

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

Κόμης

Η καταμέτρηση των παρατηρήσεων ανά ομάδα είναι πάντα καλή ιδέα. Με το R, μπορείτε να συγκεντρώσετε τον αριθμό εμφάνισης με n().

Για παράδειγμα, ο παρακάτω κώδικας υπολογίζει τον αριθμό των ετών που έπαιξε κάθε παίκτης.

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

Παραγωγή:

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

Πρώτος και τελευταίος

Μπορείτε να επιλέξετε την πρώτη, την τελευταία ή την ντη θέση μιας ομάδας.

Για παράδειγμα, μπορείτε να βρείτε την πρώτη και την τελευταία χρονιά κάθε παίκτη.

# 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

η παρατήρηση

Η γραμματοσειρά nth() είναι συμπληρωματική της first() και της last(). Μπορείτε να αποκτήσετε πρόσβαση στην ντη παρατήρηση μέσα σε μια ομάδα με το ευρετήριο για επιστροφή.

Για παράδειγμα, μπορείτε να φιλτράρετε μόνο τη δεύτερη χρονιά που έπαιξε μια ομάδα.

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

Παραγωγή:

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

Διακεκριμένος αριθμός παρατηρήσεων

Η συνάρτηση n() επιστρέφει τον αριθμό των παρατηρήσεων σε μια τρέχουσα ομάδα. Μια κλειστή συνάρτηση της n() είναι η n_distinct(), η οποία μετράει τον αριθμό των μοναδικών τιμών.

Στο επόμενο παράδειγμα, αθροίζετε το σύνολο των παικτών που προσέλαβε μια ομάδα σε όλες τις περιόδους.

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

Επεξήγηση κώδικα

  • group_by(teamID): Ομάδα ανά έτος και
  • σύνοψη(number_player = n_distinct(αναγνωριστικό παίκτη)): Μετρήστε τον ξεχωριστό αριθμό παικτών ανά ομάδα
  • arrange(desc(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
data % > %
	group_by(yearID, teamID) % > %
	summarise(mean_games = mean(G)) % > %
	arrange(desc(teamID, yearID))

Επεξήγηση κώδικα

  • 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

Φίλτρα

Πριν σκοπεύετε να κάνετε μια πράξη, μπορείτε να φιλτράρετε το σύνολο δεδομένων. Το σύνολο δεδομένων ξεκινά το 1871 και η ανάλυση δεν χρειάζεται τα χρόνια πριν από το 1980.

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

Επεξήγηση κώδικα

  • filter(yearID > 1980): Φιλτράρετε τα δεδομένα για να εμφανίζονται μόνο τα σχετικά έτη (δηλαδή μετά το 1980)
  • group_by(yearID): Ομάδα ανά έτος
  • summarise(mean_game_year = mean(G)): Συνοψίστε τα δεδομένα

Παραγωγή:

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

Επεξήγηση κώδικα

  • φίλτρο (HR >0) : Εξαιρείται το μηδενικό homerun
  • group_by(playerID): ομάδα ανά παίκτη
  • summarise(average_HR_game = sum(HR)/sum(G)): Υπολογίστε τον μέσο όρο homerun ανά παίκτη
  • ungroup(): αφαιρέστε την ομαδοποίηση
  • summarise(total_average_homerun = mean(average_HR_game)): Συνοψίστε τα δεδομένα

Παραγωγή:

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

Σύνοψη

Όταν θέλετε να επιστρέψετε μια σύνοψη ανά ομάδα, μπορείτε να χρησιμοποιήσετε:

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

πρέπει να καταργήσετε την ομαδοποίηση των δεδομένων με:

ungroup(df)

Ο παρακάτω πίνακας συνοψίζει τη συνάρτηση που μάθατε με summarise()

Μέθοδος Λειτουργία Κώδικας
εννοώ εννοώ
summarise(df,mean_x1 = mean(x1))
διάμεσος διάμεσος
summarise(df,median_x1 = median(x1))
άθροισμα άθροισμα
summarise(df,sum_x1 = sum(x1))
τυπική απόκλιση sd
summarise(df,sd_x1 = sd(x1))
μεσοτεταρτημόριο I.Q.R.
summarise(df,interquartile_x1 = IQR(x1))
ελάχιστο πρακτικά
summarise(df,minimum_x1 = min(x1))
ανώτατο όριο max
summarise(df,maximum_x1 = max(x1))
ποσοστό ποσοστό
summarise(df,quantile_x1 = quantile(x1))
πρώτη παρατήρηση πρώτα
summarise(df,first_x1 = first(x1))
τελευταία παρατήρηση τελευταία
summarise(df,last_x1 = last(x1))
η παρατήρηση n
summarise(df,nth_x1 = nth(x1, 2))
αριθμός περιστατικών n
summarise(df,n_x1 = n(x1))
αριθμός διακριτών περιστατικών n_distinct
summarise(df,n_distinct _x1 = n_distinct(x1))