Python ile Veri Analizi
Merhabalar, bir önceki python yazısında veri yapıları, fonksiyonlar, koşullar, döngüler ve comprehension konularına yakından bakmıştık. Bu yazıda ise veri analizi için ihtiyacımız olacak Numpy ve Pandas kütüphanelerine ve teknik konulara değineceğim.
İlk olarak Python projelerinizin düzenli, izole edilmiş ve yönetilebilir olmasına yardımcı olan Sanal Ortamlara ve Paket yönetimi araçları ile başlıyorum.
Virtual Environment (Sanal Ortam)
Sanal ortam, projelerinizi izole etmenize ve projeler arasında çakışmaları önlemenize yardımcı olur. Her proje için ayrı bir sanal ortam oluşturabilir ve her sanal ortamı farklı sürümler ve bağımlılıklarla yapılandırabilirsiniz. Farklı projelerdeki paketleri yönetmeye yarar.
Package Managment (Paket Yönetimi)
Paket yönetimi; yazılım paketlerinin ve kütüphanelerinin kurulum, güncelleme, konfigürasyon, kaldırılması işlemlerinin tutarlı ve stabil bir şekilde yürütülmesini sağlayan olan sistemlerdir.
- Pip (requirement.txt) = venv | virtualenv (sanal ortam oluşturma araçları ) paket yönetim aracı olarak pip’i kullanıyor. Pip sadece paket yönetim aracı olarak kullanılabilir.
- Pipenv (Pipfile) = Hem paket yönetimi hem de sanal ortam yönetimi aracıdır.
- Conda (environment.yaml) = Hem paket yönetimi hem de sanal ortam yönetimi aracıdır.
Sanal ortamların listelenmesi:
# conda env list
Sanal ortam oluşturma:
# conda create –n myenv
Sanal ortamı aktif etme:
# conda activate myenv
Yüklü paketlerin listelenmesi:
# conda list
Paket yükleme:
# conda install numpy
Aynı anda birden fazla paket yükleme:
# conda install numpy scipy pandas
Paket silme:
# conda remove package_name
Belirli bir versiyona göre paket yükleme:
# conda install numpy=1.20.1
Paket yükseltme:
# conda upgrade numpy
Tüm paketlerin yükseltilmesi:
# conda upgrade –all
# pip: pypi (python package index) paket yönetim aracı
Paket yükleme:
# pip install pandas
Paket yükleme versiyona göre:
# pip install pandas==1.2.1
NUMPY
NumPy (Numerical Python), Python programlama dilinin bilimsel hesaplama ve veri analizi alanlarında kullanılan temel bir kütüphanesidir. NumPy, çok boyutlu dizi ve matris yapılarını desteklerken, bu yapılar üzerinde hızlı ve verimli matematiksel işlemler yapmanıza olanak sağlar.
# NumPy Array’i Oluşturmak (Creating Numpy Arrays)
# NumPy Array Özellikleri (Attibutes of Numpy Arrays)
# Yeniden Şekillendirme (Reshaping)
# Index Seçimi (Index Selection)
# Slicing
# Fancy Index
# Numpy’da Koşullu İşlemler (Conditions on Numpy)
# Matematiksel İşlemler (Mathematical Operations)
Aşağıdaki 2 farklı örnek verilmiş. İlki geleneksel yöntemeler ile ab listesine eleman eklerken, Numpy array kullanarak işlemleri nasıl daha basite indirgendiğini inceleyebilirsiniz.
import numpy as np # numpy kütüphanemizi tanımlıyoruz.
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
ab = []
for i in range(0, len(a)): #range() belirli aralıkta bulunan sayıları göstermek için kullanılır. range(0,4) = 0,1,2,3
ab.append(a[i] * b[i]) # a ve b listeleri aynı index’teki verileri birbiri ile çarpar ve ab listesine append’le ekler.
Aşağıda ise numpy kullanarak işlemleri basite indirgiyoruz. arrey’leri birbiri ile çarpar ve listeler.
a = np.array([1, 2, 3, 4])
b = np.array([2, 3, 4, 5])
a * b
NumPy Array’i Oluşturmak (Creating Numpy Arrays)
import numpy as np
np.array([1, 2, 3, 4, 5])
type(np.array([1, 2, 3, 4, 5])) #typle tipine bakıyoruz.
np.zeros(10, dtype=int) #10 tane 0 içeren numpy arrey’i oluşturur.
np.random.randint(0, 10, size=10) #0–10 (0 dahil, 10 dahil değil) arasında eleman sayısı 10 olacak şekilde rastgele dize oluşturur.
NumPy Array Özellikleri (Attibutes of Numpy Arrays)
# ndim: boyut sayısı
# shape: boyut bilgisi
# size: toplam eleman sayısı
# dtype: array veri tipi
Yeniden Şekillendirme (Reshaping)
import numpy as np
np.random.randint(1, 10, size=9)
np.random.randint(1, 10, size=9).reshape(3, 3) # Tek boyutlu matris’i reshape(3,3) ile 3*3'lük bir matrise dönüştürür.
ar = np.random.randint(1, 10, size=9)
ar.reshape(3, 3)
Index Seçimi (Index Selection)
import numpy as np
a = np.random.randint(10, size=10)
a[0] #0. index’i seçir.
a[0:5] # 0 ile 5. index arası verileri getirir. Beşinci index dahil değil.
a[0] = 999 #Sıfırıncı index’teki değeri 999 değeri ile değiştirir.
m = np.random.randint(10, size=(3, 5))
m[2, 3] # 2. satır 3. sütundaki veriyi getirir.
m[0:2, 0:3] # 0–2(2 dahil değil) satır ve 0–3 (3 dahil değil) sütun aralığındaki verileri getirir.
Fancy Index
Dışardan dizideki belirttiğimiz index’lere ulaşmak için kullanılır.
import numpy as np
v = np.arange(0, 30, 3) #arange(), Belirtilen başlangıç değerinden başlayıp, her seferinde adım sayısı kadar arttırarak ,bitiş değerine kadar olan sayıları bulunduran bir numpy dizisi dödürür. np.arange(0, 30, 3), 0'dan 30'a kadar 3'er adım atlayarak dizi oluşturur.
catch = [1, 2, 3] #fancy index
v[catch] # v dizisinin içerisindeki 1, 2, 3. index’teki verileri getirir.
Numpy’da Koşullu İşlemler (Conditions on Numpy)
import numpy as np
v = np.array([1, 2, 3, 4, 5])
Klasik döngü ile
ab = []
for i in v:
if i < 3:
ab.append(i)
Numpy ile
v < 3 # çıktı array([ True, True, False, False, False])
v[v < 3] # array([1, 2, 3, 4, 5])
v[v > 3]
v[v != 3]
v[v == 3]
v[v >= 3] # array([3, 4, 5])
Matematiksel İşlemler (Mathematical Operations)
import numpy as np
v = np.array([1, 2, 3, 4, 5])
v / 5
v * 5 / 10
v ** 2
v — 1
np.subtract(v, 1) #subtrack çıkarma işlemi yapar. v dizesinin tüm elemanlarından 1 değerini çıkartır.
np.add(v, 1) #v dizesinin tüm elemanlarından 1 değerini ekler.
np.mean(v) # v dizesinin ortalamasını alır.
np.sum(v) #v dizesinin tüm değerlerini toplar.
np.min(v) # v dizesinin minimum değerini getirir.
np.max(v) # v dizesinin maksimum değerini getirir.
np.var(v) # v dizesinin varyansını bulur.
PANDAS
Pandas, Python programlama dilinde veri analizi ve veri işleme için kullanılan açık kaynaklı bir kütüphanedir. Pandas, temel veri yapıları ve veri analizi araçları sunar, böylece büyük miktardaki veriyi kolayca içe aktarabilir, düzenleyebilir, analiz edebilir ve görselleştirebilirsiniz.
DataFrame ve Series: Pandas, iki ana veri yapısı olan DataFrame ve Series’e sahiptir. DataFrame, bir tabloyu veya veri çerçevesini temsil ederken, Series, tek bir sütunu veya veri serisini temsil eder.
Pandas Series
import pandas as pd
s = pd.Series([10, 77, 12, 4, 5])
type(s) # s’in tipini gösterir. pandas.core.series.Series
s.index
s.dtype # s’in veri türünü gösterir. dtype(‘int64’)
s.size #eleman sayısı
s.ndim #boyut bilgisi
s.values #değerleri gösteririr array([10, 77, 12, 4, 5], dtype=int64)
type(s.values) #numpy.ndarray
s.head(3) # ilk 3 değeri index’leri ile birlikte gösterir.
0 10
1 77
2 12
s.tail(3) # son 3 değeri index’leri ile birlikte gösterir.
2 12
3 4
4 5
Pandas’ta Seçim İşlemleri (Selection in Pandas)
import pandas as pd #kütüphaneleri okutuyoruz.
import seaborn as sns #kütüphaneleri okutuyoruz.
df = sns.load_dataset(“titanic”) #sns kütüphanesinin içindeki titanic veri setini load_dataset ile okutuyoruz.
df.head() #ilk 5 değerine bakıyoruz.
df[0:13] # 12. index’e kadar tüm verileri çağırıyoruz.
df.drop(0, axis=0).head() # index numarasını 1'den başlatıyoruz.
delete_indexes = [1, 3, 5, 7] #fancy index belirliyoruz.
df.drop(delete_indexes, axis=0).head(10) # Belirlediğimiz fancy index’i DataFrame’den düşürüyoruz.
df = df.drop(delete_indexes, axis=0) #Kalıcı bir değişim olmasını istiyorsak df olarak tekrar kaydediyoruz.
df.drop(delete_indexes, axis=0, inplace=True) #Kalıcı bir değişim olmasını istiyorsak diğer bir yol inplace=True ile belirtmek.
Değişkeni Indexe Çevirmek
df[“age”].head()
df.index = df[“age”] #age sütununun index olarak atıyoruz. Şimdi hem sütunda hem de satırda age değişkeni var. Columns’tan düşürmemiz gerekiyor.
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
age
22.00000 0 3 male 22.00000 1 0 7.25000 S Third man True NaN Southampton no False
38.00000 1 1 female 38.00000 1 0 71.28330 C First woman False C Cherbourg yes False
26.00000 1 3 female 26.00000 0 0 7.92500 S Third woman False NaN Southampton yes True
35.00000 1 1 female 35.00000 1 0 53.10000 S First woman False C Southampton yes False
35.00000 0 3 male 35.00000 0 0 8.05000 S Third man True NaN Southampton no True
df.drop(“age”, axis=1).head() # axis=1 sütun’u, axis= 0 satır’ı temsil eder. age, sütundan düşer.
survived pclass sex sibsp parch fare embarked class who adult_male deck embark_town alive alone
age
22.00000 0 3 male 1 0 7.25000 S Third man True NaN Southampton no False
38.00000 1 1 female 1 0 71.28330 C First woman False C Cherbourg yes False
26.00000 1 3 female 0 0 7.92500 S Third woman False NaN Southampton yes True
35.00000 1 1 female 1 0 53.10000 S First woman False C Southampton yes False
35.00000 0 3 male 0 0 8.05000 S Third man True NaN Southampton no True
Index’i, Değişkene Çevirmek
1. Yol
Yukarıda, index değerlerini age olarak yeni bir değişken olarak kaydettik. Ve artık columns’larda index değerlerini age sütunu altında görebiliriz.
df[“age”] = df.index # index’i age değişkeni olarak tanımlıyoruz.
df.head()
2.Yol
df.drop(“age”, axis=1, inplace=True) # aynı veri setinden ilerlediğimiz öncelikle için columns’tan age değişkenini düşürüyoruz.
survived pclass sex sibsp parch fare embarked class who adult_male deck embark_town alive alone
age
22.00000 0 3 male 1 0 7.25000 S Third man True NaN Southampton no False
38.00000 1 1 female 1 0 71.28330 C First woman False C Cherbourg yes False
26.00000 1 3 female 0 0 7.92500 S Third woman False NaN Southampton yes True
35.00000 1 1 female 1 0 53.10000 S First woman False C Southampton yes False
35.00000 0 3 male 0 0 8.05000 S Third man True NaN Southampton no True
df.reset_index().head() # reset_index ile index’te yer alan age değişkeni verilerini columns’a atıyoruz ve eskisi gibi sıralı index numaralarına erişiyoruz.
age survived pclass sex sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 22.00000 0 3 male 1 0 7.25000 S Third man True NaN Southampton no False
1 38.00000 1 1 female 1 0 71.28330 C First woman False C Cherbourg yes False
2 26.00000 1 3 female 0 0 7.92500 S Third woman False NaN Southampton yes True
3 35.00000 1 1 female 1 0 53.10000 S First woman False C Southampton yes False
4 35.00000 0 3 male 0 0 8.05000 S Third man True NaN Southampton
df = df.reset_index() #kalıcı olarak kaydediyoruz.
df.head()
Değişkenler Üzerinde İşlemler
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None) # tüm sütunlarını ekranda görüntülemek için
df = sns.load_dataset(“titanic”)
df.head()
“age” in df # age değişkeni df içinde mi?
df[“age”].head()
df[“age”].head()
type(df[“age”].head()) # pandas.core.series.Series
df[[“age”]].head()
type(df[[“age”]].head()) #pandas.core.frame.DataFrame
df[[“age”, “alive”]] #birden fazla değişken seçmek için
col_names = [“age”, “adult_male”, “alive”]
df[col_names] #birden fazla değişken seçmenin farklı bir yolu
df[“age2”] = df[“age”]**2 # var olan age değişkeni üzerinden age2 değerinde yeni bir değişken tanımlamış olduk.
df.drop(“age2”, axis=1).head() # sütunlardan age2 değişkenini düşürür/siler.
df.drop(col_names, axis=1).head() #birden fazla değişkeni düşürür.
df.loc[:, ~df.columns.str.contains(“age”)].head() # Loc, label based seçim işlemi yapar. Bütün satırları seç, columns içindeki str veri yapısındaki sütunları gez, age içeriyorsa onları çıktı olarak verme. Tilda işareti ~ ‘değildir’ demek.
iloc & loc
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None)
df = sns.load_dataset(“titanic”)
df.head()
# iloc: integer based selection
df.iloc[0:3] # 0'dan 3'e kadar 3.index dahil değil.
who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
# loc: label based selection
df.loc[0:3] #3 dahil.
who adult_male deck embark_town alive alone
0 man True NaN Southampton no False
1 woman False C Cherbourg yes False
2 woman False NaN Southampton yes True
3 woman False C Southampton yes False
df.iloc[0:3, 0:3] # iloc integer based olduğu için string yazamayız.
survived pclass sex
0 0 3 male
1 1 1 female
2 1 3 female
df.loc[0:3, “age”]
0 22.0
1 38.0
2 26.0
3 35.0
Name: age, dtype: float64
col_names = [“age”, “embarked”, “alive”]
df.loc[0:3, col_names]
Koşullu Seçim (Conditional Selection)
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None)
df = sns.load_dataset(“titanic”)
df.head()
df[df[“age”] > 50].head()
df[df[“age”] > 50][“age”].count() # age değeri 50'nin üstünde olanların sayısı
df.loc[df[“age”] > 50, [“age”, “class”]].head() # age değeri 50'nin üstünde olanların age ve class verileri
df.loc[(df[“age”] > 50) & (df[“sex”] == “male”), [“age”, “class”]].head() # # age değeri 50'nin üstünde olanların ve cinsiyeti erkek olanların age ve class verileri
df[“embark_town”].value_counts() # embark_town değerlerinin eşsiz değerleri sayısı
Southampton 644
Cherbourg 168
Queenstown 77
Name: embark_town, dtype: int64
Toplulaştırma ve Gruplama (Aggregation & Grouping)
# — count() #sayı belirtir.
# — first() #ilk değer
# — last() #son değer
# — mean() # ortalama
# — median() # ortanca değer
# — min() #minimum değer
# — max() #maksimum değer
# — std() #standart sapma
# — var() #varyans
# — sum() #toplam
# — pivot table #istatistik tablo
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None)
df = sns.load_dataset(“titanic”)
df.head()
df.groupby(“sex”).agg({“age”: [“mean”, “sum”],
“survived”: “mean”}) # sex değişkenine göre age değerinin ortalamasını ve toplamını , survided değerinin ortalamasını gösterir.
age survived
mean sum mean
sex
female 27.91571 7286.00000 0.74204
male 30.72664 13919.17000 0.18891
df.groupby([“sex”, “embark_town”, “class”]).agg({
“age”: [“mean”],
“survived”: “mean”,
“sex”: “count”})
age survived sex
mean mean count
sex embark_town class
female Cherbourg First 36.05263 0.97674 43
Second 19.14286 1.00000 7
Third 14.06250 0.65217 23
Queenstown First 33.00000 1.00000 1
Second 30.00000 1.00000 2
Third 22.85000 0.72727 33
Southampton First 32.70455 0.95833 48
Second 29.71970 0.91045 67
Third 23.22368 0.37500 88
male Cherbourg First 40.11111 0.40476 42
Second 25.93750 0.20000 10
Third 25.01680 0.23256 43
Queenstown First 44.00000 0.00000 1
Second 57.00000 0.00000 1
Third 28.14286 0.07692 39
Southampton First 41.89719 0.35443 79
Second 30.87589 0.15464 97
Third 26.57477 0.12830 265
Pivot table
Pivot Table’ın ön tanımlı değeri ortalamadır.
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None)
df = sns.load_dataset(“titanic”)
df.head()
df.pivot_table(“survived”, “sex”, “embarked”) # sex ve embarked değerine göre hayatta kalma ortalaması.
embarked C Q S
sex
female 0.876712 0.750000 0.689655
male 0.305263 0.073171 0.174603
df.pivot_table(“survived”, “sex”, [“embarked”, “class”])
df.head()
embarked C Q S
class First Second Third First Second Third First Second Third
sex
female 0.97674 1.00000 0.65217 1.00000 1.00000 0.72727 0.95833 0.91045 0.37500
male 0.40476 0.20000 0.23256 0.00000 0.00000 0.07692 0.35443 0.15464 0.12830
df[“new_age”] = pd.cut(df[“age”], [0, 10, 18, 25, 40, 90]) #pd.cut age değişkenini girdiğimiz değer aralıklarına göre böler.
new_age (0, 10] (10, 18] (18, 25] \
class First Second Third First Second Third First
sex
female 0.0 1.0 0.500000 1.000000 1.0 0.523810 0.941176
male 1.0 1.0 0.363636 0.666667 0.0 0.103448 0.333333
df.pivot_table(“survived”, “sex”, [“new_age”, “class”])
pd.set_option(‘display.width’, 500)
Apply ve Lambda
import pandas as pd
import seaborn as sns
pd.set_option(‘display.max_columns’, None)
pd.set_option(‘display.width’, 500)
df = sns.load_dataset(“titanic”)
df.head()
df[“age2”] = df[“age”]*2
df[“age3”] = df[“age”]*5
df[[“age”, “age2”, “age3”]].apply(lambda x: x/10).head() # “age”, “age2”, “age3” değerlerini 10'a böler.
df.loc[:, df.columns.str.contains(“age”)].apply(lambda x: (x — x.mean()) / x.std()).head()
Birleştirme (Join) İşlemleri
import numpy as np
import pandas as pd
m = np.random.randint(1, 30, size=(5, 3))
df1 = pd.DataFrame(m, columns=[“var1”, “var2”, “var3”])
df2 = df1 + 99
Concat ile Birleştirme İşlemleri
# concat alt alta ve yan yana birleştirme yapar.
pd.concat([df1, df2]) # alt alta birleştirme.
pd.concat([df1, df2], axis=1) # yan yana birleştirme
pd.concat([df1, df2], axis=1 , ignore_index=True) # ignore_index ile index’leri düzenleriz.
Merge ile Birleştirme İşlemleri
Detaylı olarak birleştirme işlemleri yapar.
df1 = pd.DataFrame({‘employees’: [‘john’, ‘dennis’, ‘mark’, ‘maria’],
‘group’: [‘accounting’, ‘engineering’, ‘engineering’, ‘hr’]})
df2 = pd.DataFrame({‘employees’: [‘mark’, ‘john’, ‘dennis’, ‘maria’],
‘start_date’: [2010, 2009, 2014, 2019]})
pd.merge(df1, df2)
pd.merge(df1, df2, on=”employees”) #neye göre birleştireceğini özellikle belirtmek istersek, on= deyip neye göre birleştireceğini söylüyoruz.
# Amaç: Her çalışanın müdürünün bilgisine erişmek istiyoruz.
df3 = pd.merge(df1, df2)
df4 = pd.DataFrame({‘group’: [‘accounting’, ‘engineering’, ‘hr’],
‘manager’: [‘Caner’, ‘Mustafa’, ‘Berkcan’]})
pd.merge(df3, df4)
Evet, kabul ediyorum uzun bir yazıydı ama değdiğini düşünüyorum.
Bir sonraki yazıda gelişmiş fonksiyonel keşifçi veri analizine yakından bakıyor olacağız.
Kaynak olarak katılımcısı olduğum Data Scientist Bootcamp kurs içeriği kullanılmıştır. Vahit Keskin’e teşekkürü borç bilirim.
Linkedin’de daha yakından tanışabiliriz :) yaseminderyadilli