Ana içeriğe geç

Python'da Altair Eğitimi: Veri Görselleştirmeleri

Altair ve bir Filmler Veri Kümesi kullanarak Python'da veri görselleştirmeleri oluşturmayı öğrenin.
· 12 dk. oku

Yapay Zeka ile Keşfedin

datacamp ile kariyer inşa eden python becerileri

Hem kolay anlaşılır hem de gelişmiş grafikler oluşturabilmek, başarılı bir veri bilimci olmanın kilit noktalarından biridir. Görselleştirme, verinizin altında yatan hikâyeyi anlatmanın harika bir yoludur. Verideki ilişkileri öne çıkarır ve yalnızca sayılarla aktarılamayan, insan gözüyle fark edilebilen bilgileri açığa çıkarır. Peki veri analizi için görselleştirmeden daha iyi olan ne var? Etkileşimli görselleştirmeler!

Ne yazık ki, yeni başlayanlar için bu göz korkutucu görünebilir. Python ve R bu konuda size yardımcı olacak çok sayıda araç ve püf noktası sunar. Bu eğitimde sizi Altair ile tanıştıracağız. Altair ile yalnızca birkaç satır kodla ve çok kısa sürede anlamlı, şık ve etkili görselleştirmeler oluşturabileceksiniz. Hadi başlayalım!

Altair nedir?

Altair, istatistiksel görselleştirme için tasarlanmış bir Python kütüphanesidir. Beyan edici (declarative) bir yapıya sahiptir (bu tanıma ileride döneceğiz). Vega ve Vega-Lite üzerine kuruludur; bunlar bir görselleştirmenin görsel görünümünü ve etkileşimli davranışını bir JSON formatında tanımlamanıza olanak tanıyan görselleştirme dilbilgileridir.

Emredici ve Beyan Edici API'ler

Daha önce belirtildiği gibi, Python'un veri görselleştirme için elinizin altında harika araç ve kütüphaneleri zaten vardır ve birçoğu etkileşimli görselleştirmeyi de destekler. Peki Altair’i öne çıkaran nedir?

Cevap, diğer emredici API’lerle karşılaştırıldığında beyan edici doğasında yatıyor.

Emredici API’lerde odak noktanızı 'ne yapmak istediğinizden' ziyade 'bir şeyi nasıl yapacağınıza' vermeniz gerekir. Görselleştirme oluşturmak için gereken koda daha çok kafa yorar, eksen sınırları, boyut, döndürme, lejantlar vb. çizim adımlarını tek tek belirtirsiniz.

Bir veri bilimci olarak Altair, zamanınızı ve enerjinizi gerekli kod yerine verinizi anlamaya, analiz etmeye ve görselleştirmeye yönlendirmenize olanak tanır. Yani verinizi ve beklediğiniz çıktıyı (görselleştirmenin sonunda nasıl görünmesi gerektiğini) tanımlarsınız; Altair gerekli düzenlemeleri sizin için otomatik olarak yapar.

Kurulum

Bu eğitimde Vega veri kümelerinden bir örnek veri kümesini kullanacağız. Altair’i Vega veri kümeleriyle birlikte kurmak için konsol penceresine şunları yazın:

$ pip install altair vega_datasets

conda paket yöneticisini kullanıyorsanız, eşdeğeri şöyledir:

$ conda install -c conda-forge altair vega_datasets

Ardından Jupyter Notebook’a geçip Altair’i içe aktararak başlayabilirsiniz. Jupyter Notebook hakkında daha fazla bilgi için DataCamp’in Jupyter Notebook Kesin Kılavuzuna göz atın.

Veri

Artık Altair’i ve Vega veri kümesini kurduğumuza göre, biraz veri yükleme zamanı. Şu içe aktarmalarla başlayın:

import pandas as pd
import altair as alt

Neden Pandas içe aktarılıyor?

Altair'deki veri yapısı Pandas DataFrame etrafında şekillendiği için, Altair’de veriyi tıpkı Pandas DataFrame’leriyle çalışır gibi işleyebilirsiniz.

Altair veriyi dahili olarak bir Pandas DataFrame biçiminde saklasa da veriyi içeri aktarmanın birden fazla yolu vardır:

  • bir Pandas DataFrame olarak
  • bir Data veya ilişkili nesne olarak (ör. UrlData, InlineData, NamedData)
  • JSON veya CSV biçimli bir metin dosyasına işaret eden bir URL dizesi olarak
  • geo_interface’ı destekleyen bir nesne olarak (ör. Geopandas GeoDataFrame, Shapely Geometrileri, GeoJSON Nesneleri)

Filmler Veri Kümesi

Bu eğitimde Vega veri kümesindeki Movies Dataset ile çalışacağız. Bu veya filmlerle ilgili benzer veri kümeleri, özellikle Öneri Motorları bağlamında, veri bilimi topluluğunda oldukça popülerdir. Ancak biz yalnızca Altair ile görselleştirmeler kullanarak veri analizi yapacağız.

Veri kümesi; filmin adı, Amerika’da ve dünya genelinde elde ettiği hasılat, yapım bütçesi, tür, IMDB ve Rotten Tomatoes puanları gibi bilgileri içerir. Tüm sütunlarla ilgilenmeyeceğiz; bunun yerine Altair’in bir görselleştirme aracı olarak nasıl çalıştığını daha iyi anlamak için yalnızca birkaçını kullanacağız.

Hadi veri kümesini alıp daha iyi anlamak için basit birkaç analiz yapalım.

# Vega Veri Kümesini içe aktarma
from vega_datasets import data as vega_data

movies_df = pd.read_json(vega_data.movies.url)

# Elde ettiğimiz verinin türünü kontrol ediyoruz
print("movies_df is of the type: ", type(movies_df))

print("movies_df: ", movies_df.shape)
movies_df is of the type:  <class 'pandas.core.frame.DataFrame'>
movies_df:  (3201, 16)

Gördüğünüz gibi, movies_df aslında bir pandas DataFrame’idir ve her biri 16 özellik bilgisi (sütun) içeren 3201 film (satır) barındırır. DataFrame içindeki verilere göz atalım.

movies_df.head(5)
 TitleUS_GrossWorldwide_GrossUS_DVD_SalesProduction_BudgetRelease_DateMPAA_RatingRunning_Time_minDistributorSourceMajor_GenreCreative_TypeDirectorRotten_Tomatoes_RatingIMDB_RatingIMDB_Votes
0The Land Girls146083.0146083.0NaN8000000.0Jun 12 1998RNaNGramercyNoneNoneNoneNoneNaN6.11071.0
1First Love, Last Rites10876.010876.0NaN300000.0Aug 07 1998RNaNStrandNoneDramaNoneNoneNaN6.9207.0
2I Married a Strange Person203134.0203134.0NaN250000.0Aug 28 1998NoneNaNLionsgateNoneComedyNoneNoneNaN6.8865.0
3Let's Talk About Sex373615.0373615.0NaN300000.0Sep 11 1998NoneNaNFine LineNoneComedyNoneNone13.0NaNNaN
4Slam1009819.01087521.0NaN1000000.0Oct 09 1998RNaNTrimarkOriginal ScreenplayDramaContemporary FictionNone62.03.4165.0

Sütun değerleri şunlardır:

movies_df.columns
Index(['Title', 'US_Gross', 'Worldwide_Gross', 'US_DVD_Sales',
       'Production_Budget', 'Release_Date', 'MPAA_Rating', 'Running_Time_min',
       'Distributor', 'Source', 'Major_Genre', 'Creative_Type', 'Director',
       'Rotten_Tomatoes_Rating', 'IMDB_Rating', 'IMDB_Votes'],
      dtype='object')

Şimdi pandas içindeki to_datetime işlevini kullanarak Release_Date sütununu gerçek bir tarihe dönüştürecek ve ardından buradan 'year' değerini çıkaracağız. Daha sonra bu yeni oluşturduğumuz sütunu görselleştirmelerimizde kullanacağız.

def extract_year(value):
    return pd.to_datetime(value, format='%b %d %Y').year

movies_df["Year"] = movies_df["Release_Date"].apply(extract_year)

Artık sütun değerlerini kontrol ederseniz, ilgili film için yıl değerlerini içeren Year adlı yeni bir sütun göreceksiniz.

movies_df.columns
Index(['Title', 'US_Gross', 'Worldwide_Gross', 'US_DVD_Sales',
       'Production_Budget', 'Release_Date', 'MPAA_Rating', 'Running_Time_min',
       'Distributor', 'Source', 'Major_Genre', 'Creative_Type', 'Director',
       'Rotten_Tomatoes_Rating', 'IMDB_Rating', 'IMDB_Votes', 'Year'],
      dtype='object')

Şimdi bazı grafikler oluşturmaya geçeceğiz. Ama bunu yapmadan önce, şu kod parçasını çalıştırın:

alt.renderers.enable('notebook')
RendererRegistry.enable('notebook')

Yukarıdaki kod, Altair’in Jupyter notebook içinde satır içi (inline) olarak render edilmesini sağlar; böylece oluşturduğumuz şekilleri görebiliriz. Daha fazla sorunla karşılaşırsanız, Altair’in sorun giderme sayfasına bakın.

Veriye ilk bakışta, filmin yapımına ne kadar para harcandığı (Production_Budget) ile filmin gerçekte ne kadar kazandığı (Worldwide_Gross) arasındaki ilişkiyi görmek ilginç olacaktır. Bu değerleri X ve Y eksenlerinde göstereceğiz.

Ancak veri kümesi nispeten büyük — odak noktamız Altair ile denemeler yapmak olduğundan, şimdilik yalnızca birkaç veri noktasıyla çalışacağız. Veri kümemizde belirli bir yılda kaç film olduğuna bakalım ve odaklanmak istediğimiz bir yıl seçelim.

movies_df["Year"].value_counts()
2006    220
2005    210
2002    208
2004    192
2000    188
       ...
1943      1
2015      1
2027      1
2037      1
1928      1
Name: Year, Length: 91, dtype: int64

Odağımızı 2000 yılına verelim ve yalnızca bu yıla ait verileri içeren movies_2000 adlı yeni bir dataframe oluşturalım. 188 satır (film) içermelidir.

movies_2000 = movies_df[movies_df["Year"] == 2000]
movies_2000.shape
(188, 17)

Şimdi ilk görselleştirmemize doğru ilerleyeceğiz. Bunu yapmak için Altair’in formatına biraz daha derinlemesine bakalım.

Grafikler

Grafikler Altair’de temel bir nesnedir ve tek bir argüman — bir dataframe — alır. Bir grafiği şu şekilde tanımlarız:

alt.Chart(DataFrame)

Ancak tek başına grafik, yalnızca üzerinde çalışmak istediğiniz veriyi belirtir; ardından veriye ne yapmak istediğinizi sağlamanız gerekir. İşte burada işaretler (marks) devreye girer.

İşaretler (Marks)

Mark özelliği, verinin grafikte nasıl temsil edileceğini belirtmenizi sağlar. Altair’in sunduğu temel mark özellikleri şunlardır:

Mark özelliği için, DataFrame’deki her değerin grafikte bir nokta (daire) olarak işaretlenmesini istiyoruz. Dolayısıyla şöyle yazacağız:

alt.Chart(DataFrame).mark_point()

Kodlamalar (Encodings)

Veriyi ve nasıl temsil edileceğini belirledikten sonra — nerede temsil edileceğini de belirtmek isteriz. Yani konumları, boyutu, rengi vb. ayarlamak gerekir. Burada da encoding’leri kullanırız. Dolayısıyla şunu elde ederiz:

alt.Chart(DataFrame).mark_point().encode()

Tüm bunları bir araya getirip ilk görselleştirmemizi oluşturmak için ayrıntıları ekleyelim:

alt.Chart(movies_2000).mark_point().encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross')
)
<vega.vegalite.VegaLite at 0x11709a1d0>
görselleştirme 1

Harika değil mi? Çok da bir şey yapmamıza gerek kalmadı — biraz terminolojiye aşina olup hepsini bir araya getirdik. Artık 2000 yılındaki filmlerin harcanan tutara karşılık dünya çapında elde ettikleri hasılatı gösteren bir grafik var.

Bu grafiği daha ilginç hale getirelim. Tüm noktaların aynı boyutta dairelerle işaretlenmesi yerine, işaretleyicileri ilgili US_Gross değerleri kadar büyük (veya küçük) yapmayı deneyelim. Bunun için Size özelliğini tanıtıyoruz. Yani dairenin boyutu büyüdükçe ABD gişe gelirleri de büyüktür. Ayrıca daire işaretleyicilerini sadece kenar çizgisiyle değil, renkle dolduralım; bunun için mark_point() özelliğine bir argüman ekleyeceğiz.

alt.Chart(movies_2000).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross')
)
<vega.vegalite.VegaLite at 0x117cce790>
görselleştirme 2

Şimdi yalnızca dört satırda her filmin bütçelerini betimleyen bir grafiğimiz var. Eksik olan ne? RENK!

Ancak sırf olsun diye rastgele bir renk eklemeyeceğiz! Grafiği ilginç tutmak için veri kümesinde bulunan bir bilgiyi daha ekleyeceğiz: Major_Genre. Filmin her türüne Color özelliğini kullanarak kendi rengini verecek ve renge biraz saydamlık katmak için OpacityValue ekleyeceğiz.

alt.Chart(movies_2000).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross'),
    alt.Color('Major_Genre'),
    alt.OpacityValue(0.7)
)
<vega.vegalite.VegaLite at 0x118e3ff50>
görselleştirme 3

Bu haliyle güzel ama yeterince iyi değil! Grafikte dolaşabilsek ve veri noktasının temsil ettiği filmle ilgili ayrıntıları da görebilsek harika olurdu. Tooltip tam da bunu yapmamızı sağlıyor...

alt.Chart(movies_2000).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross'),
    alt.Color('Major_Genre'),
    alt.OpacityValue(0.7),
    tooltip = [alt.Tooltip('Title'),
               alt.Tooltip('Production_Budget'),
               alt.Tooltip('Worldwide_Gross'),
               alt.Tooltip('US_Gross')
              ]
)
<vega.vegalite.VegaLite at 0x118e3ff90>
görselleştirme 4

Havalı değil mi? Ama durun, daha fazlasını yapalım. Altair’i ilk etapta kullanmak istememizin nedeni neydi? Etkileşimli görselleştirmeler yapabilmekti. Tooltip, veri noktalarının üzerine geldiğinizde zaten bir miktar etkileşim sağlar. Ancak elimizdekilere basit bir interactive() işlevi daha ekleyelim...

alt.Chart(movies_2000).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross'),
    alt.Color('Major_Genre'),
    alt.OpacityValue(0.7),
    tooltip = [alt.Tooltip('Title'),
               alt.Tooltip('Production_Budget'),
               alt.Tooltip('Worldwide_Gross'),
               alt.Tooltip('US_Gross')
              ]
).interactive()
<vega.vegalite.VegaLite at 0x118e3c750>
görselleştirme 5

Bu küçük kod parçasını eklemek, belirli bir alana yakınlaştırmanıza ve eksen değerlerini otomatik olarak ayarlayarak ilgi duyduğunuz bölgeye odaklanmanıza olanak tanır. Ancak grafiğinize ekleyebileceğiniz daha birçok gelişmiş etkileşimli özellik var. Bunlardan birine göz atabiliriz...

Artık verimizi sergilemek için havalı bir grafiğimiz var. Tüm veri noktalarını grafiğimize getirelim. Ama durun, tüm veri noktalarını tek bir görselleştirmeye koymak fazla olmaz mı? Ayrıca daha önce oluşturduğumuz Year değerine göre de ayırmak istiyoruz. Bunu yapmak için gelişmiş bir selection özelliğini kullanacağız.

select_year = alt.selection_single(
    name='Select', fields=['Year'], init={'Year': 1928},
    bind=alt.binding_range(min=1928, max=2046, step=10)
)

alt.Chart(movies_df).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross'),
    alt.Color('Major_Genre'),
    alt.OpacityValue(0.7),
    tooltip = [alt.Tooltip('Title:N'),
               alt.Tooltip('Production_Budget:Q'),
               alt.Tooltip('Worldwide_Gross:Q'),
               alt.Tooltip('US_Gross:Q')
              ]
).add_selection(select_year).transform_filter(select_year)
<vega.vegalite.VegaLite at 0x117cd4cd0>
görselleştirme 6

Burada add_selection özelliğini kullanarak grafiğe tekli seçim özelliği olarak select_year’ı tanıtıyor, ardından transform_filter() uygulayarak dönüşümü gerçekten grafiğe uyguluyoruz.

Koddaki başka bir yeni eklemeyi fark ettiniz mi? Tooltip içine yerleştirilen 'Q' ve 'N'. Bunlar veri tipini belirtir: N-Nominal (kategorik veri), Q-Kantitatif (sayısal veri), O-Sıralı (ordinal veri) veya T-Zamansal (zaman noktaları veya aralıkları).

Veri kümesindeki en eski ve en yeni yıla bakın.

print("The oldest year is: ", movies_df["Year"].min())
print("The latest year is: ", movies_df["Year"].max())
The oldest year is:  1928
The latest year is:  2046

Gördüğünüz gibi 'Select_Year' çubuğunu sürüklediğinizde, 1928 - 1967 yıllarında temsil edilen film sayısı çok az. Ayrıca 2018’den sonra ve elbette 2046’ya kadar kaydedilmiş film verisi yok. Yıllardaki aralığı ve adım boyutlarını belirtmek için binding_range() özelliğini kullanabiliriz.

Gerçek bir projede bu tür bulgular önemlidir ve veri toplama aşamanızda veya süreç içinde bir yerdeki hatalara işaret edebilir. Hatalarla etkili biçimde başa çıkmanız gerekir. Bu, veri ön işleme sırasında önemli bir adımdır. Bu hayati adımlara giriş için pandas ile Veri Hazırlama yazısına göz atın.

Hadi yılları ayarlayalım ve bununla birlikte nihai görselleştirmemiz hazır...

select_year = alt.selection_single(
    name='Select', fields=['Year'], init={'Year': 1968},
    bind=alt.binding_range(min=1968, max=2008, step=10)
)

alt.Chart(movies_df).mark_point(filled=True).encode(
    alt.X('Production_Budget'),
    alt.Y('Worldwide_Gross'),
    alt.Size('US_Gross'),
    alt.Color('Major_Genre'),
    alt.OpacityValue(0.7),
    tooltip = [alt.Tooltip('Title:N'),
               alt.Tooltip('Production_Budget:Q'),
               alt.Tooltip('Worldwide_Gross:Q'),
               alt.Tooltip('US_Gross:Q')
              ]
).add_selection(select_year).transform_filter(select_year)
<vega.vegalite.VegaLite at 0x1180cda10>
görselleştirme 7

Bu eğitimde Altair ile tanıştınız. Birkaç satır kodla, verinizdeki hikâyeyi daha etkili biçimde anlatmanıza yardımcı olan, güzel ve etkileşimli grafikler oluşturabileceğinizi gördünüz. Bu eğitim Altair’in gücünü ve potansiyelini göstermeyi amaçlıyor. Altair hakkında daha fazla bilgi için resmi web sitesine gidin.

datacamp'in python kurs kitaplığını keşfedin banner

Konular

İlgili