Bu eğitimde, Netflix film verileri üzerinde, iyi bilinen böl-uygula-birleştir stratejisinden yararlanan pandas groupby işlemini nasıl kullanacağınızı öğreneceksiniz.
Netflix yakın zamanda bazı kullanıcı derecelendirme verilerini yayımladı. Ben de basit bir soru sormak istedim: Netflix aboneleri daha eski filmleri mi, yoksa daha yeni filmleri mi tercih ediyor?
Sezgisel olarak, veri kümesini yıllara göre gruplara ayırmak, ardından ortalama veya medyan gibi bir özet istatistik hesaplamak ve bu istatistiğin yıllar içinde artıp artmadığını görmek istersiniz (bundan sonra istatistiksel bir test de yapmak isteyebilirsiniz).
Güzel olan şu ki, bunu yapmak ve bu şekilde düşünmek için hem Python hem de R’de uygulanmış kavramsal bir çerçeve var. Bu çerçeve, "böl-uygula-birleştir" olarak bilinir; çünkü...
Adım 1: veriyi, orijinal DataFrame’den bir groupby nesnesi oluşturarak gruplara bölersiniz;
Adım 2: bu örnekte bir özet istatistik hesaplayan bir toplulaştırma fonksiyonunu uygularsınız (bu adımda verinizi dönüştürebilir veya filtreleyebilirsiniz de);
Adım 3: sonuçları yeni bir DataFrame’de birleştirirsiniz.
Bu, elimizdeki analizin kavramsal çerçevesi. Bu yazıda, Python paketi pandas’ı kullanarak yukarıdaki Netflix derecelendirme sorusunu nasıl yanıtlayacağınızı öğreneceksiniz. Aynısını R’de örneğin dplyr paketiyle de yapabilirsiniz. Ayrıca, çok da sezgisel olmayan groupby nesnelerine de değineceğim. Groupby nesneleriyle böl-uygula-birleştir süreci, aslında hepimizin sezgisel olarak yaptığı bir kalıp; ancak bu prosedürü 2011’de Hadley Wickham, Veri Analizi için Böl-Uygula-Birleştir Stratejisi başlıklı makalesiyle resmileştirdi.
Burada, pandas, groupby nesneleri ve böl-uygula-birleştir ilkelerini kullanarak Netflix film derecelendirmelerinin, filmlerin vizyon yılına göre nasıl değiştiğine bakacaksınız. Veriye ilk olarak data.world’de burada rastladım. Tüm kodu çoğaltmak isterseniz bu yazının kodlarını burada bulabilirsiniz.
Önce gerekli paketleri ve veriyi içe aktaracak ve verinin ilk beş satırına bakacaksınız:
# Import packages and set visualization styleimport pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()%matplotlib inline
Altyapı:
# Import data and check out head of DataFrame
df = pd.read_csv('data/chasewillden-netflix-shows/data/netflix.csv')
df.head()Altyapı:
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
Bu bana oldukça iyi görünüyor: başlıklar, derecelendirmeler, vizyon yılı ve kullanıcı puanı gibi birçok sütun var. Groupby ve böl-uygula-birleştir prosedürümüzü uygulamadan önce, verinin gerçekten beklediğimiz gibi olduğundan emin olmak ve eksik değerlerle ilgilenmek için biraz daha yakından bakalım. İkinci satırda (satır 1) user_rating_score sütununda NaN şeklinde bir eksik değer olduğunu unutmayın.
Verinizi grafikler ve istatistiklerle özetleme
pandas DataFrame’in .info() metodu çok değerlidir. Aşağıda uyguladığınızda, 1000 satır ve 7 sütun veriniz olduğunu; ancak ilgi alanımız olan user_rating_score sütununda sadece 605 adet null olmayan değer bulunduğunu gösterir. Bu da 395 eksik değer olduğu anlamına gelir:
Herhangi bir eksik değeri olan satırları düşürebilir, yinelenen satırları kaldırabilir ve veriye görsel bir bakış atmak için seaborn kullanarak DataFrame’in bir pairplot grafiğini oluşturabilirsiniz. Veriyi 'rating' sütununa göre renklendireceksiniz. Grafikleri inceleyin ve hangi bilgileri çıkarabildiğinize bakın.
# 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');Altyapı:
Örneğin, user_rating_score’u release_year’ın bir fonksiyonu olarak inceleyin. Görsel olarak belirgin bir eğilim yok ama belki biraz veri analizi bir eğilimi ortaya çıkarır. DataFrame’in birkaç özet istatistiğine de bakmak isterseniz .describe() metodunu kullanabilirsiniz:
Soruyu yanıtlamak için groupby ve böl-uygula-birleştir
Adım 1. Böl
Artık veriyi incelediğinize göre, işin eğlenceli kısmına geçebiliriz. Önce veriyi bir groupby yöntemiyle gruplara böleceksiniz; burada her grup belirli bir yılda vizyona giren filmlerden oluşacak. Bu, böl-uygula-birleştir içindeki böl adımıdır:
# Group by year
df_by_year = df.groupby('release_year')Altyapı:
Bu bir groupby nesnesi oluşturur:
# Check type of GroupBy objecttype(df_by_year)Altyapı:
Bu tür groupby nesneleri çok kullanışlıdır. DataFrame için .describe() metodunun sayısal sütunlar için özet istatistikler döndürdüğünü hatırlayın. DataFrameGroupBy nesneleri için .describe() metodu da her sayısal sütun için özet istatistikler döndürür; ancak bunu bölünmüş her grup için ayrı ayrı hesaplar. Sizin durumunuzda bu, her release_year için geçerlidir. Bu, böl-uygula-birleştir içindeki uygula adımına bir örnektir: groupby içindeki her gruba .describe() metodunu uyguluyorsunuz. Bunu yapın ve sonucun ilk 5 satırını yazdırın:
# Summary stats over years
df_by_year.describe().head()Altyapı:
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 satır × 24 sütun
Gruplamanın nasıl göründüğünü görmek isterseniz, groupby nesnesini list() fonksiyonuna gönderebilirsiniz:
# Cast grouping as a list and check out one yearlist(df_by_year)[10]Altyapı:
(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)Altyapı:
Adım 3. Birleştir
Diyelim ki her yıl için ortalama ya da medyan user_rating_score değerini istiyorsunuz. O zaman groupby nesnesine sırasıyla .mean() veya .median() metodunu uygulayabilir ve bunları yeni bir DataFrame’de "birleştirebilirsiniz".
# Get median values by year and print first 5 rows
df_med_by_year = df_by_year.median()
df_med_by_year.head()Altyapı:
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
df_med_by_year DataFrame’inin indeksine dair önemli bir incelik var. Bir DataFrame’in indeksi, satır etiketlerinden oluşur. Orijinal DataFrame df’nin indeksine bakın:
Bu indeks, orijinal satır numaralarından, yani tamsayılardan oluşur. Yukarıda bazı satırları düşürdüğünüz için '1' eksik. df_med_by_year’ın indeksi ise gruplama yaptığınız orijinal sütundaki değerlerden, yani release_year yıllarından oluşur:
Her yıl için medyan puanı içeren user_rating_score sütunuyla ilgileniyorsunuz. df_med_by_year’ın user_rating_score sütununu dilimleyebilir ve bunu yılın (yani df_rat_by_year DataFrame’inin indeksi) bir fonksiyonu olarak çizebilirsiniz:
# 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');Altyapı:
Şekle bakılırsa medyan puan zaman içinde kesinlikle artıyor. Genel bir eğilime beni ikna etmek için daha gelişmiş istatistiklerden yararlanmanız gerekir; ancak bu, Keşifsel Veri Analizi’nin ileri araştırmalar için harika bir başlangıç olduğuna güzel bir örnek.
Günlük kullanımlarda groupby ve böl-uygula-birleştir
Groupby nesneleri sezgisel değildir. Yine de bir veri kümesini, sütunlarından birine (veya birkaçına—ancak birden fazla sütuna göre gruplama ve hiyerarşik indeksler konusunu başka bir yazıya bırakalım) göre bölme eylemiyle doğal olarak örtüşürler.
Böl-uygula-birleştir ilkesi yalnızca zarif ve pratik olmakla kalmaz; tıpkı yukarıdaki örnekte olduğu gibi Veri Bilimcilerin her gün kullandığı bir yaklaşımdır. Daha fazla kullanım alanını görmek için Hadley Wickham’ın orijinal makalesine, Veri Analizi için Böl-Uygula-Birleştir Stratejisi’ne göz atın. Görüş, yorum ve/veya düşüncelerinizi paylaşmak isterseniz Twitter’da bana ulaşabilirsiniz: @hugobowne.
DataCamp’in diğer faydalı pandas eğitimlerine de göz atın:
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Netflix yakın zamanda bazı kullanıcı derecelendirme verilerini yayımladı. Ben de basit bir soru sormak istedim: Netflix aboneleri daha eski filmleri mi, yoksa daha yeni filmleri mi tercih ediyor?
Sezgisel olarak, veri kümesini yıllara göre gruplara ayırmak, ardından ortalama veya medyan gibi bir özet istatistik hesaplamak ve bu istatistiğin yıllar içinde artıp artmadığını görmek istersiniz (bundan sonra istatistiksel bir test de yapmak isteyebilirsiniz).
Güzel olan şu ki, bunu yapmak ve bu şekilde düşünmek için hem Python hem de R’de uygulanmış kavramsal bir çerçeve var. Bu çerçeve, "böl-uygula-birleştir" olarak bilinir; çünkü...
Bu, elimizdeki analizin kavramsal çerçevesi. Bu yazıda, Python paketi
pandas’ı kullanarak yukarıdaki Netflix derecelendirme sorusunu nasıl yanıtlayacağınızı öğreneceksiniz. Aynısını R’de örneğindplyrpaketiyle de yapabilirsiniz. Ayrıca, çok da sezgisel olmayan groupby nesnelerine de değineceğim. Groupby nesneleriyle böl-uygula-birleştir süreci, aslında hepimizin sezgisel olarak yaptığı bir kalıp; ancak bu prosedürü 2011’de Hadley Wickham, Veri Analizi için Böl-Uygula-Birleştir Stratejisi başlıklı makalesiyle resmileştirdi.Bu tekniği faydalı bulursanız, (ve daha pek çok şeyi) pandas ile DataFrame’leri Manipüle Etme kursumuzda öğrenebilir ve pratik edebilirsiniz.
pandas ile Veri Keşfi
Verinizi içe aktarın
Burada,
pandas, groupby nesneleri ve böl-uygula-birleştir ilkelerini kullanarak Netflix film derecelendirmelerinin, filmlerin vizyon yılına göre nasıl değiştiğine bakacaksınız. Veriye ilk olarak data.world’de burada rastladım. Tüm kodu çoğaltmak isterseniz bu yazının kodlarını burada bulabilirsiniz.Önce gerekli paketleri ve veriyi içe aktaracak ve verinin ilk beş satırına bakacaksınız:
Bu bana oldukça iyi görünüyor: başlıklar, derecelendirmeler, vizyon yılı ve kullanıcı puanı gibi birçok sütun var. Groupby ve böl-uygula-birleştir prosedürümüzü uygulamadan önce, verinin gerçekten beklediğimiz gibi olduğundan emin olmak ve eksik değerlerle ilgilenmek için biraz daha yakından bakalım. İkinci satırda (satır 1) user_rating_score sütununda NaN şeklinde bir eksik değer olduğunu unutmayın.
Verinizi grafikler ve istatistiklerle özetleme
pandasDataFrame’in.info()metodu çok değerlidir. Aşağıda uyguladığınızda, 1000 satır ve 7 sütun veriniz olduğunu; ancak ilgi alanımız olan user_rating_score sütununda sadece 605 adet null olmayan değer bulunduğunu gösterir. Bu da 395 eksik değer olduğu anlamına gelir:Herhangi bir eksik değeri olan satırları düşürebilir, yinelenen satırları kaldırabilir ve veriye görsel bir bakış atmak için
seabornkullanarak DataFrame’in bir pairplot grafiğini oluşturabilirsiniz. Veriyi 'rating' sütununa göre renklendireceksiniz. Grafikleri inceleyin ve hangi bilgileri çıkarabildiğinize bakın.Örneğin, user_rating_score’u release_year’ın bir fonksiyonu olarak inceleyin. Görsel olarak belirgin bir eğilim yok ama belki biraz veri analizi bir eğilimi ortaya çıkarır. DataFrame’in birkaç özet istatistiğine de bakmak isterseniz
.describe()metodunu kullanabilirsiniz:Soruyu yanıtlamak için groupby ve böl-uygula-birleştir
Adım 1. Böl
Artık veriyi incelediğinize göre, işin eğlenceli kısmına geçebiliriz. Önce veriyi bir groupby yöntemiyle gruplara böleceksiniz; burada her grup belirli bir yılda vizyona giren filmlerden oluşacak. Bu, böl-uygula-birleştir içindeki böl adımıdır:
Bu bir groupby nesnesi oluşturur:
Adım 2. Uygula
Bu tür groupby nesneleri çok kullanışlıdır. DataFrame için
.describe()metodunun sayısal sütunlar için özet istatistikler döndürdüğünü hatırlayın.DataFrameGroupBynesneleri için.describe()metodu da her sayısal sütun için özet istatistikler döndürür; ancak bunu bölünmüş her grup için ayrı ayrı hesaplar. Sizin durumunuzda bu, her release_year için geçerlidir. Bu, böl-uygula-birleştir içindeki uygula adımına bir örnektir: groupby içindeki her gruba.describe()metodunu uyguluyorsunuz. Bunu yapın ve sonucun ilk 5 satırını yazdırın:5 satır × 24 sütun
Gruplamanın nasıl göründüğünü görmek isterseniz, groupby nesnesini
list()fonksiyonuna gönderebilirsiniz:Adım 3. Birleştir
Diyelim ki her yıl için ortalama ya da medyan user_rating_score değerini istiyorsunuz. O zaman groupby nesnesine sırasıyla
.mean()veya.median()metodunu uygulayabilir ve bunları yeni bir DataFrame’de "birleştirebilirsiniz".df_med_by_yearDataFrame’inin indeksine dair önemli bir incelik var. Bir DataFrame’in indeksi, satır etiketlerinden oluşur. Orijinal DataFramedf’nin indeksine bakın:Bu indeks, orijinal satır numaralarından, yani tamsayılardan oluşur. Yukarıda bazı satırları düşürdüğünüz için '1' eksik.
df_med_by_year’ın indeksi ise gruplama yaptığınız orijinal sütundaki değerlerden, yani release_year yıllarından oluşur:Her yıl için medyan puanı içeren user_rating_score sütunuyla ilgileniyorsunuz.
df_med_by_year’ın user_rating_score sütununu dilimleyebilir ve bunu yılın (yanidf_rat_by_yearDataFrame’inin indeksi) bir fonksiyonu olarak çizebilirsiniz:Şekle bakılırsa medyan puan zaman içinde kesinlikle artıyor. Genel bir eğilime beni ikna etmek için daha gelişmiş istatistiklerden yararlanmanız gerekir; ancak bu, Keşifsel Veri Analizi’nin ileri araştırmalar için harika bir başlangıç olduğuna güzel bir örnek.
Günlük kullanımlarda groupby ve böl-uygula-birleştir
Groupby nesneleri sezgisel değildir. Yine de bir veri kümesini, sütunlarından birine (veya birkaçına—ancak birden fazla sütuna göre gruplama ve hiyerarşik indeksler konusunu başka bir yazıya bırakalım) göre bölme eylemiyle doğal olarak örtüşürler.
Böl-uygula-birleştir ilkesi yalnızca zarif ve pratik olmakla kalmaz; tıpkı yukarıdaki örnekte olduğu gibi Veri Bilimcilerin her gün kullandığı bir yaklaşımdır. Daha fazla kullanım alanını görmek için Hadley Wickham’ın orijinal makalesine, Veri Analizi için Böl-Uygula-Birleştir Stratejisi’ne göz atın. Görüş, yorum ve/veya düşüncelerinizi paylaşmak isterseniz Twitter’da bana ulaşabilirsiniz: @hugobowne.
DataCamp’in diğer faydalı pandas eğitimlerine de göz atın: