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.
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 styleimport pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()%matplotlib inline
Didukung oleh
# Import data and check out head of DataFrame
df = pd.read_csv('data/chasewillden-netflix-shows/data/netflix.csv')
df.head()Didukung oleh
title
rating
ratinglevel
ratingdescription
release_year
user_rating_score
user_rating_size
0
White Chicks
PG-13
crude and sexual humor, language and some drug...
80
2004
82.0
80
1
Lucky Number Slevin
R
strong violence, sexual content and adult lang...
100
2006
NaN
82
2
Grey's Anatomy
TV-14
Parents strongly cautioned. May be unsuitable ...
90
2016
98.0
80
3
Prison Break
TV-14
Parents strongly cautioned. May be unsuitable ...
90
2008
98.0
80
4
How I Met Your Mother
TV-PG
Parental guidance suggested. May not be suitab...
70
2014
94.0
80
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()Didukung oleh
<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+KBDidukung oleh
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');Didukung oleh
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()Didukung oleh
ratingdescription
release_year
user_rating_score
user_rating_size
count
246.000000
246.000000
246.000000
246.0
mean
73.556911
2010.272358
81.390244
80.0
std
26.616145
8.887219
12.677883
0.0
min
10.000000
1940.000000
55.000000
80.0
25%
60.000000
2007.000000
71.000000
80.0
50%
80.000000
2015.000000
83.500000
80.0
75%
90.000000
2016.000000
92.750000
80.0
max
124.000000
2017.000000
99.000000
80.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')Didukung oleh
Ini membuat sebuah objek groupby:
# Check type of GroupBy objecttype(df_by_year)Didukung oleh
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()Didukung oleh
ratingdescription
user_rating_score
user_rating_size
count
mean
std
min
25%
50%
75%
max
count
mean
...
75%
max
count
mean
std
min
25%
50%
75%
max
release_year
1940
1.0
35.0
NaN
35.0
35.0
35.0
35.0
35.0
1.0
61.0
...
61.0
61.0
1.0
80.0
NaN
80.0
80.0
80.0
80.0
80.0
1978
1.0
60.0
NaN
60.0
60.0
60.0
60.0
60.0
1.0
86.0
...
86.0
86.0
1.0
80.0
NaN
80.0
80.0
80.0
80.0
80.0
1982
1.0
60.0
NaN
60.0
60.0
60.0
60.0
60.0
1.0
68.0
...
68.0
68.0
1.0
80.0
NaN
80.0
80.0
80.0
80.0
80.0
1986
1.0
35.0
NaN
35.0
35.0
35.0
35.0
35.0
1.0
67.0
...
67.0
67.0
1.0
80.0
NaN
80.0
80.0
80.0
80.0
80.0
1987
1.0
60.0
NaN
60.0
60.0
60.0
60.0
60.0
1.0
58.0
...
58.0
58.0
1.0
80.0
NaN
80.0
80.0
80.0
80.0
80.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 yearlist(df_by_year)[10]Didukung oleh
(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
76635199564.08096760199574.080)Didukung oleh
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()Didukung oleh
ratingdescription
user_rating_score
user_rating_size
release_year
1940
35.0
61.0
80.0
1978
60.0
86.0
80.0
1982
60.0
68.0
80.0
1986
35.0
67.0
80.0
1987
60.0
58.0
80.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:
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)Didukung oleh
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 indexprint(df_med_by_year.index)Didukung oleh
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')Didukung oleh
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');Didukung oleh
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 iniThe 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:
Temukan alasan mengapa Anda sebaiknya (tidak) menggunakan spaghetti plot untuk menyampaikan ketidakpastian jalur prediksi badai serta dampaknya terhadap interpretasi.
Kuasai pertanyaan wawancara basis data, dari konsep SQL dasar hingga skenario desain sistem tingkat lanjut. Panduan mendalam ini mencakup semua yang Anda perlukan untuk sukses di wawancara DBMS dan meraih peran berikutnya.
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...
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, paketdplyr. 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:
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 DataFramepandassangat 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:Anda dapat menghapus baris yang memiliki nilai hilang apa pun, menghapus baris duplikat, dan membuat pairplot dari DataFrame menggunakan
seabornuntuk mendapatkan gambaran visual tentang data. Anda akan mewarnai data berdasarkan kolom 'rating'. Lihat plotnya dan coba dapatkan informasi darinya.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():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:
Ini membuat sebuah objek groupby:
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 objekDataFrameGroupBymengembalikan 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:5 baris × 24 kolom
Jika Anda ingin melihat seperti apa pengelompokannya, Anda dapat meneruskan objek groupby ke fungsi
list():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.Ada hal penting terkait indeks DataFrame
df_med_by_year. Ingat bahwa indeks sebuah DataFrame terdiri dari label baris. Lihat indeks DataFrame asaldf:Indeks ini terdiri dari nomor baris asli, berlabel integer. '1' hilang karena Anda menghapus beberapa baris di atas. Indeks
df_med_by_yearterdiri dari nilai pada kolom asli yang Anda gunakan untuk mengelompokkan, yaitu tahun dari 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_yeardan memplotnya sebagai fungsi dari tahun (diberikan oleh indeks DataFramedf_rat_by_year):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: