Ana içeriğe geç

Zanaat Biralarının Keşifsel Veri Analizi: Veri Profilleme

Bu eğitimde Python'da keşifsel veri analizi (EDA) ve daha özel olarak, pandas ile veri profillemeyi öğreneceksiniz.
· 14 dk. oku

Yapay Zeka ile Keşfedin

Editörün notu: Jean-Nicholas Hould Montreal'de Intel Security'de veri bilimcisidir ve blogunda veri bilimine nasıl başlanacağını öğretir.

Keşifsel veri analizi (EDA), bir veri kümesini keşfetmeyi ve özetlemeyi amaçlayan istatistiksel bir yaklaşımdır. Veri bilimi sürecinin bu adımında, veri kümenizin yapısını, değişkenleri ve aralarındaki ilişkileri keşfetmek istersiniz.

Bu yazıda, keşifsel veri analizinin bir yönüne odaklanacaksınız: veri profilleme.

Veri profilleme, veri kümenizi betimsel istatistiklerle özetlemekle ilgilidir. Veri kümenizi daha iyi anlamak için çok sayıda ölçüm kullanmak istersiniz. Veri türleri, eksik değerler, ortalama, medyan ve standart sapma, bir veri kümesini profillerken toplamanız gereken birçok öğeden sadece birkaçıdır. Veri profillemenin amacı, verinizi sağlam bir şekilde anlamaktır; böylece sonrasında verinizi çeşitli şekillerde sorgulamaya ve görselleştirmeye başlayabilirsiniz.

Verinizin Nereden Geldiğini Bilin

Herhangi bir EDA'ya başlamadan önce, analiz ettiğiniz verinin kökeni hakkında mümkün olduğunca çok şey bilmelisiniz. Verinin nasıl toplandığını ve nasıl işlendiğini anlamanız gerekir. Analizinizi etkileyebilecek, veride geçmişte yapılmış dönüşümler var mı?

Veri kümeniz hakkında şu soruları yanıtlayabilmelisiniz:

  • Nasıl toplandı?
  • Bir örneklem mi?
  • Uygun şekilde örneklemlendi mi?
  • Veri kümesi herhangi bir şekilde dönüştürüldü mü?
  • Veri kümesi üzerinde bilinen sorunlar var mı?

Verinin nereden geldiğini anlamazsanız, veri kümesinden anlamlı sonuçlar çıkarmakta zorlanırsınız. Ayrıca çok önemli analiz hataları yapma riskiyle karşı karşıya kalırsınız.

Ek olarak, veri kümesinin standart bir biçimde yapılandırıldığından emin olmalısınız. Önerilen format, düzenli veri olarak da adlandırılan üçüncü normal formdur. “Düzenli” bir veri kümesi şu özelliklere sahiptir:

  • Her değişken bir sütun oluşturur ve değerler içerir
  • Her gözlem bir satır oluşturur
  • Her gözlemsel birim türü bir tablo oluşturur

Bu standartlaştırılmış formata uymak, birçok araç ve kütüphane ile uyumlu olduğundan analizinizin hızlanmasını sağlar.

Veri Profilleme

Bu yazıda, CraftCans web sitesinden Zanaat Bira (Craft Beers) veri setini kullanacaksınız. Bu veri seti yalnızca kutulanmış biraları ve Amerika Birleşik Devletleri’ndeki bira fabrikalarını içerir. Bu veri setinin ABD'de üretilen tüm kutu biraları raporlayıp raporlamadığı siteden net değildir. Güvenli olmak adına, bu veri setini önyargılar içerebilecek bir örneklem olarak kabul edeceksiniz.

Kullanacağınız veri setlerinin yapısı şöyledir:

Beers:

  • ID: Biranın benzersiz tanımlayıcısı.
  • Name: Biranın adı.
  • ABV: Biranın hacmen alkol oranı.
  • IBU: Biranın Uluslararası Acılık Birimi.
  • Style: Biranın stili.
  • Ounces: Biranın ons cinsinden miktarı.

Breweries:

  • ID: Bira fabrikasının benzersiz tanımlayıcısı.
  • Name: Bira fabrikasının adı.
  • City: Bira fabrikasının bulunduğu şehir.
  • State: Bira fabrikasının bulunduğu eyalet.

Veri Türleri

İlk adım, veri kümenizin bileşimini anlamaktır.

Hangi değişkenlerle uğraşıyorsunuz?

Veriyi genellikle şu kategorilerden birine sığdırabilirsiniz:

  • Sayısal
  • Kategorik
  • Metin
  • Tarih

bu depoda bulabileceğiniz veri setlerini pandas'ın from_csv işleviyle içe aktaracaksınız. Ayrıca analizi kolaylaştırmak için beers ve breweries veri setlerini birleştireceksiniz.

import pandas as pd

beers = pd.DataFrame.from_csv("https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/craftcans_beers.csv")
breweries = pd.DataFrame.from_csv("https://raw.githubusercontent.com/nickhould/craft-beers-dataset/master/data/craftcans_breweries.csv")

beers_and_breweries = pd.merge(beers, 
                               breweries, 
                               how='inner', 
                               left_on="brewery_id", 
                               right_on="id", 
                               sort=True,
                               suffixes=('_beer', '_brewery'))

pandas kütüphanesiyle, her sütunu ve veri türlerini listelemek için dtypes işlevini çalıştırabilirsiniz.

beers.dtypes

Bu da size aşağıdaki sonucu verir:

abv           float64
ibu           float64
id              int64
name           object
style          object
brewery_id      int64
ounces        float64
dtype: object

Yukarıda gördüğünüz gibi, bu işlev farklı veri türlerini temiz bir şekilde gruplamaz. Çeşitli sayısal veri türleri (float64 ve int64) istediğimiz gibi tek bir kategoride toplanmaz. Ayrıca bazı sütunlar nesne (object) olarak listelenir ki bu pek yardımcı değildir.

Bunu aşmak için, bir DataFrame içindeki her sütunun kategorisini belirleyecek kendi işlevinizi yazabilirsiniz.

def get_var_category(series):
    unique_count = series.nunique(dropna=False)
    total_count = len(series)
    if pd.api.types.is_numeric_dtype(series):
        return 'Numerical'
    elif pd.api.types.is_datetime64_dtype(series):
        return 'Date'
    elif unique_count==total_count:
        return 'Text (Unique)'
    else:
        return 'Categorical'

def print_categories(df):
    for column_name in df.columns:
        print(column_name, ": ", get_var_category(df[column_name]))

Beers Değişkenleri

print_categories(beers)

Yukarıdaki komut size şu sonucu verir:

abv :  Numerical
ibu :  Numerical
id :  Numerical
name :  Categorical
style :  Categorical
brewery_id :  Numerical
ounces :  Numerical

Breweries Değişkenleri

print_categories(breweries)

Bu da size aşağıdaki sonucu verir:

name :  Categorical
city :  Categorical
state :  Categorical
id :  Numerical

Bu bilgilerle, veri kümemizi şimdiden daha iyi anlayabilirsiniz. Yalnızca kategorik ve sayısal verilerle uğraştığınızı biliyorsunuz. Sayısal değişkenler, ortalama, standart sapma vb. gibi birçok farklı ölçüm çıkarmak için kullanılabilir. Kategorik değişkenler ise genellikle veriyi bölümlendirmenin ve gruplandırmanın ilginç bir yoludur. Örneğin, farklı bira stilleri arasında IBU'nun nasıl farklılaştığını anlamak isteyebilirsiniz.

Betimsel İstatistikler

Bu bölümde, verimizi daha iyi anlamak için kullanılabilecek çeşitli betimsel istatistikleri adım adım inceleyeceksiniz. Bu ölçümlerin her birinin tek başına çok faydalı olmadığını fark edeceksiniz. En fazla değeri, bu farklı ölçümlerin birleşimi sağlar.

IBU değişkenine odaklanacaksınız çünkü bu sayısal bir değişkendir. Bu tür bir değişken, kategorik değişkenlere kıyasla daha geniş bir ölçüm yelpazesi sunar. Kategorik değişkenler üzerinde de ölçümler yapabilirsiniz, ancak çok daha sınırlı olursunuz.

Uzunluk

len işlevi bir Series içindeki gözlem sayısını sayar. İşlev, eksik ya da null değerler olsa da tüm gözlemleri sayar.

length = len(beers["ibu"])
print(length)

Bu Series içinde toplam 2410 gözlemimiz var.

Sayım

count işlevi bir Series içindeki NA olmayan/null olmayan gözlemlerin sayısını döndürür.

count = beers["ibu"].count()
print(count)

Gördüğünüz gibi, Series içinde 1405 adet null olmayan gözlem var.

Eksik Değerler

Length ve Count ile artık eksik değerlerin sayısını hesaplayabiliriz. Eksik değerlerin sayısı, Length ile Count arasındaki farktır.

number_of_missing_values = length - count
pct_of_missing_values = float(number_of_missing_values / length)
pct_of_missing_values = "{0:.1f}%".format(pct_of_missing_values*100)
print(pct_of_missing_values)

Eksik değerleri yüzde olarak vermek için, eksik değerlerin sayısını toplam gözlem sayısına, yani uzunluğa bölersiniz. Bölmede ondalıkların yakalanmasını sağlamak için float işlevi kullanılır. format işlevi ise sayıyı yüzde olarak hoş bir biçimde biçimlendirmek için kullanılır.

Bu durumda, IBU değişkeninin neredeyse %42'si eksik. Bu, analizinizi etkileyeceği için bilmeniz önemlidir. Çoğu betimsel istatistik bu eksik değerleri yok sayar ve bu da kesinlikle bir önyargıya yol açar.

Minimum/Maksimum Değer

Bir veri setinin minimum ve maksimum değeri, bir Series üzerinde min ve max işlevleriyle kolayca elde edilebilir.

print("Minimum value: ", beers["ibu"].min())
print("Maximum value: ", beers["ibu"].max())

Min/maks değerler, bir değişkendeki değer aralığını anlamaya yardımcı olur. Bu durumda IBU 4 ile 138 arasında değişmektedir.

Mod

Mod, bir veri setindeki en sık görülen değerdir. Bir Series üzerinde mode işlevi kullanılarak elde edilebilir.

print(beers["ibu"].mode())

Normal bir dağılımda mod, mean ve median ile eşittir.

Bu durumda, IBU değişkeninin modu 20'dir. Veri setimizde en sık görülen IBU budur.

Ortalama

Ortalama, merkezi eğilim ölçüsüdür. Değerlerin toplamının, eksik olmayan gözlem sayısına bölünmesini temsil eder.

Bir Series üzerinde mean işleviyle elde edilebilir.

mean = beers["ibu"].mean()

Ortalama, aykırı değerlerden etkilenmeye yatkındır. Birkaç uç değer ortalamayı ciddi şekilde değiştirebilir, onu yukarı veya aşağı çekebilir.

Medyan

Medyan da bir merkezi eğilim ölçüsüdür. Sıralanmış sayısal değerler listesinin tam ortasındaki sayıdır.

median = beers["ibu"].median()

Çarpık dağılımlar söz konusu olduğunda medyan, ortalamaya göre çok daha iyi bir merkezi eğilim ölçüsüdür.

IBU dağılımı söz konusu olduğunda, ortalama ve medyan aynı mertebededir.

Standart Sapma

Standart sapma, yayılım ölçüsüdür. Yüksek standart sapma, veri noktalarının geniş bir değer aralığına yayıldığını gösterir. Standart sapma, değerlerle aynı birimde ifade edilir.

standarddev = beers["ibu"].std()

Bu durumda standart sapma ~26’dır; tam olarak 25.954065911259324. Eğer IBU dağılımı normal dağılım olsaydı, gözlemlerin ~%68’inin ortalamanın bir standart sapması içinde olduğunu bilirdiniz.

Kantil İstatistikleri

Kantiller, bir dağılımı eşit büyüklükte parçalara bölen kesme noktalarıdır. Birçok kantilin kendi adı vardır. Bir dağılımı dört eşit gruba bölerseniz, oluşturduğunuz kantile quartile denir. Bir Series üzerinde quantile işlevini kullanarak kantilleri kolayca oluşturabilirsiniz. Bu işlevi hesaplanacak farklı kantillerin bulunduğu bir diziyle çağırabilirsiniz. Aşağıdaki durumda dağılımımızı dört eşit gruba bölmek istiyoruz.

quantile = beers["ibu"].quantile([.25, .5, .75])
0.2521.0
0.5035.0
0.7564.0
Name: ibu,dtype: float64

Yukarıda gördüğünüz gibi, %50 kantili medyana eşittir. Veri setini ikiye bölen değerdir. Ayrıca, gözlemlerin %75’inin 64 IBU’ya eşit veya ondan küçük olduğunu da not edebilirsiniz. Dahası, dağılımın %50’si 21 ile 64 IBU arasındadır. Bu metriklerde eksik değerlerin dikkate alınmadığını belirtmek önemlidir.

Dağılım Grafikleri

Görselleştirmeler, keşifsel veri analizinde çok kullanışlıdır. Bu yazıda, görselleştirme konusunu ayrıntılı şekilde ele almayacağız. Ancak, bir frekans-dağılım grafiğinin öneminden bahsetmeden veri profillemeden söz edemeyiz. En basit ama en güçlü görselleştirmelerden biridir. Veri setimizdeki her değerin sıklığını gösterir.

Bu görselleştirmeyi oluşturmak için seaborn`` library with thedisplotfunction. This function expects aSeries` with no missing values.

import seaborn as sns
sns.set(color_codes=True)
sns.set_palette(sns.color_palette("muted"))

sns.distplot(beers["ibu"].dropna());

dağılım grafiği

Bu dağılım grafiğinde, daha önce hesapladığımız birkaç değeri açıkça görebilirsiniz. Minimum değer 0 IBU’ya yakın ve maksimum değer 140 IBU’ya yakındır. En sık görülen değerin 20 IBU’ya yakın olduğunu net bir şekilde görüyorsunuz. Buna ek olarak, 60 IBU civarında bir tepe noktası görüyoruz.

Bu dağılımda neden iki tepe var?

Bunu ne açıklayabilir? Bu, keşifsel veri analizinin ikinci aşamasında keşfedebileceğimiz bir yön.

Korelasyonlar

Korelasyonlar, sayısal değişkenler arasındaki ilişkileri keşfetmenin harika bir yoludur. Korelasyonu hesaplamanın çeşitli yolları vardır. Pearson korelasyon katsayısı, iki değişken arasındaki doğrusal bağımlılığı ölçen yaygın bir yaklaşımdır. Korelasyon katsayısı -1 ile 1 arasında değişir. 1 korelasyonu tam pozitif korelasyon, -1 korelasyonu tam negatif korelasyon ve 0 korelasyonu doğrusal olmayan (korelasyonsuz) ilişkiyi ifade eder. Bu hesabı bir Series üzerinde corr işlevini kullanarak yapabiliriz. Varsayılan olarak bu işlev Pearson korelasyon katsayısı hesabını kullanır. Bu işlevle farklı hesaplama yöntemlerini kullanmak da mümkündür.

beers[["abv", "ibu", "ounces"]].corr()
 abvibuounces
abv10.6706210.172529
ibu0.67062110.054691
ounces0.1725290.0546911

Yukarıda gördüğünüz gibi, IBU’nun kendisiyle korelasyonu 1’dir. Elbette sayısal değişkenler kendileriyle mükemmel korelasyona sahiptir. Daha ilginç olarak, ABV ile IBU arasındaki korelasyonun 0.670621 olduğunu görebilirsiniz. Bu tam pozitif bir korelasyon olmasa da hâlâ yüksek bir korelasyondur. Bu, ileride daha ayrıntılı olarak keşfedebileceğimiz ilginç bir yön.

Sayısal Olmayan Değişkenlere Dair Notlar

Önceden çıkardığımız metrikler çoğunlukla yalnızca sayısal değerlere uygulanabilir. Kategorik veriler gibi diğer türlerle uğraşıyorsanız da bazı ilginç ölçümler toplayabilirsiniz. Veri setindeki her değerin sıklığını hesaplayabilirsiniz.

DataFrame'lerin veri setini özetleyen describe adlı bir işlevi vardır. DataFrame'iniz yalnızca kategorik veya metin değerleri içeriyorsa özet, bu veri türüne özel şekilde uyarlanır.

beers[["name", "style"]].describe()
 namestyle
count24102405
unique230599
topNonstop Hef HopAmerican IPA
freq12424

Profilleme Kütüphaneleri

Yukarıda gördüğünüz gibi, betimsel istatistikleri toplamak zahmetli bir süreç olabilir. Neyse ki, sizin için tüm bu veri işlemlerini yapan kütüphaneler var. Verinizin çok net bir profilini çıktılarlar. pandas-profiling bunlardan biridir. Bu kütüphane, veri kümeniz için hazır istatistiksel profilleme sunar. Kullandığımız veri seti düzenli ve standart olduğundan, kütüphaneyi doğrudan veri setimiz üzerinde kullanabiliriz.

import pandas_profiling 

pandas_profiling.ProfileReport(beers_and_breweries)

Daha Fazla Soru

Genellikle, veri kümenizi profilledikten sonra başlangıçta olduğundan çok daha fazla sorunuz olur. Bu harikadır; çünkü bu yeni sorular keşifsel veri analizinizi besleyecektir.

Bu profillemeyi yaparken topladığımız bazı sorular şunlar:

  • IBU değerlerinin %41,7’si eksik. Neden? Bu analizimizi nasıl etkileyebilir?
  • IBU dağılımında iki tepe var. Bunu ne açıklıyor?
  • IBU ile ABV arasındaki korelasyonu ne açıklıyor? Bu korelasyonda bira stilinin etkisi nedir?
  • Coğrafi bölgeler arasında IBU, ABV veya Style açısından farklılıklar var mı? Doğu Kıyısı ve Batı Kıyısı için durum nedir?

Veri profilleme doğrusal bir süreç değildir. Veri kümenizi filtreleyip bölümlendirdikçe, verinizin alt grupları üzerinde betimsel istatistikler toplamak için bu adıma geri döneceksiniz.

Sonraki Adımlar

Bu yazıda bir veri kümesinin nasıl profilleneceğini gördünüz. Değişkenleri belirli veri türü gruplarına nasıl atayacağınızı artık biliyorsunuz. Ayrıca veri seti üzerinde farklı betimsel istatistikler hesapladınız ve bu ölçümlerin nasıl yorumlanacağını anladınız. Son olarak, veri kümenizi profillemek için işlemleri sizin yerinize yapmaya yardımcı olabilecek bazı kütüphaneler olduğunu gördünüz. Daha da önemlisi, keşifsel veri analizinizi beslemek için her zamankinden daha fazla soru ürettiniz.

DataCamp'in Python Keşifsel Veri Analizi Eğitimi'ne göz atın.

Konular

İlgili