Lewati ke konten utama

Groupby, split-apply-combine, dan pandas

Dalam tutorial ini, Anda akan belajar cara menggunakan operasi groupby di pandas, yang mengacu pada strategi split-apply-combine yang terkenal, pada data film Netflix.
· 8 mnt Baca

Jelajahi bersama AI

Baru-baru ini Netflix merilis sebagian data penilaian pengguna. Saya ingin mengajukan pertanyaan sederhana: apakah pelanggan Netflix lebih menyukai film lama atau baru?

Secara intuitif, Anda ingin membagi dataset ke dalam kelompok, satu untuk setiap tahun, lalu menghitung statistik ringkasan, seperti mean atau median, dan kemudian melihat apakah statistik ini meningkat dari tahun ke tahun (setelah itu, Anda mungkin ingin melakukan uji statistik).

Yang menarik adalah ada kerangka konseptual untuk melakukan dan memikirkan hal ini, beserta implementasinya baik di Python maupun R. Kerangka ini dikenal sebagai "split-apply-combine" karena kita...

  • Langkah 1: membagi data ke dalam kelompok dengan membuat objek groupby dari DataFrame asal;
  • Langkah 2: menerapkan sebuah fungsi, dalam hal ini fungsi agregasi yang menghitung statistik ringkasan (Anda juga dapat mentransformasi atau memfilter data pada langkah ini);
  • Langkah 3: menggabungkan hasilnya ke dalam DataFrame baru.

Inilah kerangka konseptual untuk analisis yang akan kita lakukan. Dalam tulisan ini Anda akan mempelajari cara melakukannya untuk menjawab pertanyaan rating Netflix di atas menggunakan paket Python pandas. Anda bisa melakukan hal yang sama di R menggunakan, misalnya, paket dplyr. Saya juga akan membahas objek groupby, yang tidak terlalu intuitif. Proses split-apply-combine dengan objek groupby adalah pola yang sebenarnya kita lakukan secara intuitif, seperti akan kita lihat, namun diperlukan Hadley Wickham untuk memformalkan prosedur ini pada 2011 melalui makalahnya The Split-Apply-Combine Strategy for Data Analysis.

Jika Anda merasa teknik ini bermanfaat, Anda dapat mempelajarinya lebih lanjut (bersama banyak hal lainnya) dan mempraktikkannya di kursus Manipulating DataFrames with pandas kami.

Eksplorasi Data dengan pandas

Impor data Anda

Di sini Anda akan menggunakan pandas, objek groupby, dan prinsip split-apply-combine untuk melihat bagaimana rentang film Netflix bervariasi sebagai fungsi dari tahun rilisnya. Saya awalnya menemukan data ini di data.world di sini. Anda dapat menemukan semua kode dalam tulisan ini di sini jika ingin mereproduksinya.

Pertama Anda akan mengimpor paket dan data yang diperlukan dan melihat lima baris pertama dari data:

# Import packages and set visualization style
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
# Import data and check out head of DataFrame
df = pd.read_csv('data/chasewillden-netflix-shows/data/netflix.csv')
df.head()
 titleratingratinglevelratingdescriptionrelease_yearuser_rating_scoreuser_rating_size
0White ChicksPG-13crude and sexual humor, language and some drug...80200482.080
1Lucky Number SlevinRstrong violence, sexual content and adult lang...1002006NaN82
2Grey's AnatomyTV-14Parents strongly cautioned. May be unsuitable ...90201698.080
3Prison BreakTV-14Parents strongly cautioned. May be unsuitable ...90200898.080
4How I Met Your MotherTV-PGParental guidance suggested. May not be suitab...70201494.080

Menurut saya ini terlihat cukup menarik: Anda memiliki judul, rating, tahun rilis, dan skor rating pengguna, di antara beberapa kolom lainnya. Sebelum melakukan prosedur groupby dan split-apply-combine, mari kita lihat data lebih dekat untuk memastikan bahwa datanya sesuai dugaan dan untuk menangani nilai hilang. Perhatikan bahwa ada nilai hilang NaN pada user_rating_score di baris kedua (baris 1).

Merangkum data Anda dengan plot dan statistik

Metode .info() pada DataFrame pandas sangat berharga. Penerapannya di bawah ini menunjukkan bahwa Anda memiliki 1000 baris dan 7 kolom data, namun kolom yang menjadi perhatian, user_rating_score, hanya memiliki 605 nilai non-null. Ini berarti ada 395 nilai hilang:

# Check out info of DataFrame
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
title                1000 non-null object
rating               1000 non-null object
ratinglevel          941 non-null object
ratingdescription    1000 non-null int64
release_year         1000 non-null int64
user_rating_score    605 non-null float64
user_rating_size     1000 non-null int64
dtypes: float64(1), int64(3), object(3)
memory usage: 54.8+ KB

Anda dapat menghapus baris yang memiliki nilai hilang apa pun, menghapus baris duplikat, dan membuat pairplot dari DataFrame menggunakan seaborn untuk mendapatkan gambaran visual tentang data. Anda akan mewarnai data berdasarkan kolom 'rating'. Lihat plotnya dan coba dapatkan informasi darinya.

# Drop rows with missing values and drop duplicate
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)

# Visualize pairplot of df
sns.pairplot(df, hue='rating');

pairplot seaborn

Perhatikan, misalnya, user_rating_score sebagai fungsi dari release_year. Tidak ada tren yang dapat diidentifikasi secara visual, tetapi mungkin analisis data akan menyingkap tren apa pun. Jika Anda ingin melihat beberapa statistik ringkasan dari DataFrame, Anda juga bisa melakukannya menggunakan metode .describe():

# Get summary stats of df
df.describe()
 ratingdescriptionrelease_yearuser_rating_scoreuser_rating_size
count246.000000246.000000246.000000246.0
mean73.5569112010.27235881.39024480.0
std26.6161458.88721912.6778830.0
min10.0000001940.00000055.00000080.0
25%60.0000002007.00000071.00000080.0
50%80.0000002015.00000083.50000080.0
75%90.0000002016.00000092.75000080.0
max124.0000002017.00000099.00000080.0

Groupby dan split-apply-combine untuk menjawab pertanyaan

Langkah 1. Split

Setelah Anda meninjau data, sekarang saatnya bagian yang menyenangkan. Pertama Anda akan menggunakan metode groupby untuk membagi data ke dalam kelompok, di mana setiap kelompok adalah kumpulan film yang dirilis pada tahun tertentu. Ini adalah bagian split dalam split-apply-combine:

# Group by year
df_by_year = df.groupby('release_year')

Ini membuat sebuah objek groupby:

# Check type of GroupBy object
type(df_by_year)
pandas.core.groupby.DataFrameGroupBy

Langkah 2. Apply

Objek groupby semacam ini sangat berguna. Ingat bahwa metode .describe() untuk DataFrame mengembalikan statistik ringkasan untuk kolom numerik? Nah, metode .describe() untuk objek DataFrameGroupBy mengembalikan statistik ringkasan untuk setiap kolom numerik, tetapi dihitung untuk tiap kelompok pada hasil split. Dalam kasus Anda, ini untuk setiap release_year. Ini adalah contoh dari bagian apply dalam split-apply-combine: Anda menerapkan metode .describe() ke setiap kelompok dalam groupby. Lakukan ini dan cetak 5 baris pertama hasilnya:

# Summary stats over years
df_by_year.describe().head()
 ratingdescriptionuser_rating_scoreuser_rating_size
 countmeanstdmin25%50%75%maxcountmean...75%maxcountmeanstdmin25%50%75%max
release_year                    
19401.035.0NaN35.035.035.035.035.01.061.0...61.061.01.080.0NaN80.080.080.080.080.0
19781.060.0NaN60.060.060.060.060.01.086.0...86.086.01.080.0NaN80.080.080.080.080.0
19821.060.0NaN60.060.060.060.060.01.068.0...68.068.01.080.0NaN80.080.080.080.080.0
19861.035.0NaN35.035.035.035.035.01.067.0...67.067.01.080.0NaN80.080.080.080.080.0
19871.060.0NaN60.060.060.060.060.01.058.0...58.058.01.080.0NaN80.080.080.080.080.0

5 baris × 24 kolom

Jika Anda ingin melihat seperti apa pengelompokannya, Anda dapat meneruskan objek groupby ke fungsi list():

# Cast grouping as a list and check out one year
list(df_by_year)[10]
(1995,             title rating                                ratinglevel  \
 766         Balto      G  General Audiences. Suitable for all ages.   
 967  Heavyweights     PG              some rude language and pranks   

      ratingdescription  release_year  user_rating_score  user_rating_size  
 766                 35          1995               64.0                80  
 967                 60          1995               74.0                80  )

Langkah 3. Combine

Misalkan Anda menginginkan user_rating_score mean atau median untuk setiap tahun. Maka Anda dapat menerapkan metode .mean() atau .median(), masing-masing, ke objek groupby dan kemudian 'menggabungkannya' ke dalam DataFrame baru.

# Get median values by year and print first 5 rows
df_med_by_year = df_by_year.median()
df_med_by_year.head()
 ratingdescriptionuser_rating_scoreuser_rating_size
release_year   
194035.061.080.0
197860.086.080.0
198260.068.080.0
198635.067.080.0
198760.058.080.0

Ada hal penting terkait indeks DataFrame df_med_by_year. Ingat bahwa indeks sebuah DataFrame terdiri dari label baris. Lihat indeks DataFrame asal df:

# Print index of df
print(df.index)
Int64Index([  0,   2,   3,   4,   5,   6,   7,   8,   9,  10,
            ...
            908, 911, 917, 931, 962, 966, 967, 972, 973, 979],
           dtype='int64', length=246)

Indeks ini terdiri dari nomor baris asli, berlabel integer. '1' hilang karena Anda menghapus beberapa baris di atas. Indeks df_med_by_year terdiri dari nilai pada kolom asli yang Anda gunakan untuk mengelompokkan, yaitu tahun dari release_year:

# Print index
print(df_med_by_year.index)
Int64Index([1940, 1978, 1982, 1986, 1987, 1989, 1990, 1992, 1993, 1994, 1995,
            1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
            2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017],
           dtype='int64', name='release_year')

Anda tertarik pada kolom user_rating_score, yang berisi rating median untuk setiap tahun. Anda dapat mengiris kolom user_rating_score dari df_med_by_year dan memplotnya sebagai fungsi dari tahun (diberikan oleh indeks DataFrame df_rat_by_year):

# Slice out user rating and plot
df_rat_by_year = df_med_by_year['user_rating_score']
plt.scatter(df_rat_by_year.index, df_rat_by_year)
plt.xlabel('year of release')
plt.ylabel('median rating');

Netflix groupby split-apply-combine

Melihat gambar tersebut, rating median jelas meningkat seiring waktu. Anda perlu menggunakan statistik yang lebih canggih untuk meyakinkan saya tentang tren ini secara umum, namun ini adalah contoh Analisis Data Eksploratori yang menjadi titik awal yang baik untuk penelitian lebih lanjut.

Groupby dan split-apply-combine dalam Penggunaan Sehari-hari

Objek Groupby memang tidak intuitif. Namun, objek ini sesuai dengan tindakan alami memecah dataset terhadap salah satu kolomnya (atau lebih dari satu, tetapi mari simpan itu untuk tulisan lain tentang pengelompokan berdasarkan beberapa kolom dan indeks hierarkis).

Prinsip split-apply-combine tidak hanya elegan dan praktis, tetapi juga sesuatu yang digunakan Data Scientist setiap hari, seperti pada contoh di atas. Untuk mengapresiasi lebih banyak kegunaannya, lihat makalah asli Hadley Wickham ini The Split-Apply-Combine Strategy for Data Analysis. Jika Anda punya pemikiran, tanggapan, dan/atau renungan, silakan hubungi saya di Twitter: @hugobowne.

Lihat tutorial pandas praktis lainnya dari DataCamp, termasuk:

Topik

Terkait

blogs

Tutorial Korelasi di R

blogs

Spaghetti Plot dan Jalur Badai

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026