Python ile Veri Analizi

Yasemin Derya Dilli
10 min readNov 5, 2023

--

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

--

--

Yasemin Derya Dilli
Yasemin Derya Dilli

Written by Yasemin Derya Dilli

Data Analyst | Engineer | Content Writer

No responses yet