Birliktelik Kuralları Analiz Örneği (nan değer sorunu)

Selamun aleyküm arkadaşlar, Veri Madenciliği’nde kullanılan market sepet analizi olarak da bilinen birliktelik kuralları ile ilgili örnekleri inceliyorum. Weka ve RapidMiner gibi hazır veri madenciliği programları ile çeşitli veri setleri üzerinde denemeler yaptıktan sonra Python’da gözlemlemek amacı ile biraz araştırdım. Bir kaç örnek buldum ve kendi sistemimde çalıştırdım. Örneklerle beraber verilen .csv uzantılı veri setleri çalışıyor fakat benim kendi veri setim maalesef çalışmadı. Şunu belirtmek isterim ki kendi veri setimi örneklerdeki veri setine uygun hale getirdim. (virgüllerle ayrılmış değerler haline getirdim.)

Kullandığım örneklerden birisi şu adreste: https://medium.com/@ekrem.hatipoglu/machine-learning-association-rule-mining-birliktelik-kural-çıkarımı-apriori-algorithm-4326b8f224c3
Adresteki örnek veri seti: https://drive.google.com/file/d/1GOesjZbSxCj7EnnV5CMVhDWpKCZKNdki/view?usp=sharing
Örneğin kodları:

# csv dosyalarını okumak için
import pandas as pd

# csv dosyamızı okuduk.
data = pd.read_csv('store.csv',header=None)

# Veriyi [['MILK','Bread'] , ['TEA','JAM'], ...] şekline getirdik
t = []
for i in range(0,len(data)):
    t.append(str(data.values[i][0]).split(","))

# apriori sınıfı import ettik
from apyori import apriori

# apriori sınıfından bir nesne tanımladık ve ilişki bulma işlemini başlattık.
result = list(apriori(t,min_support=0.01,min_confidence=0.2,min_lift=3))

# Sonucu konsola bastık
for i in range(0,len(result)):
    print(result[i].items)

Kendi veri setimi isterseniz indirerek deneyebilirsiniz: store2.csv

Kendi veri setimle kodlardaki minimum destek, minimum güven ve lift değerlerini değiştirip çalıştırdığımda hiç bir sonuç almadım. Çıktı boş görünüyordu. Ben de t listesinin içeriğini print() ile çeşitli denemelerle yazdırınca orjinal veri setinde görünmemesine karşın benim veri setimde ‘nan’ ifadeler gördüm.

Şöyle ki veri setimdeki satırlar arasında en çok değer içeren satır 19 tane veri barındırıyor. Mesela diğer satırlardan birinde 10 tane veri var ise geriye kalan 9 veri alanı nan ile doldurulmuş bunu farkettim. Orjinal veri setinde yaptığım print() denemelerinde böyle birşey görmedim. Ben de bu durumu aşmak için şöyle bir kod yazdım;

# csv dosyalarını okumak için
import pandas as pd

# csv dosyamızı okuduk.
data = pd.read_csv('store3.csv',header=None)

# Veriyi [['MILK','Bread'] , ['TEA','JAM'], ...] şekline getirdik
t = []
tmp = []
#print(len(data.values[0][:]))

""" ORJİNAL KOD [+]
for i in range(0,len(data)):
    t.append(str(data.values[i][0]).split(","))
    ORJİNAL KOD [-] """

#print(len(data.values[47][:]))

""" BENİM DEĞİŞTİRDİĞİM KISIM [+] <<<<<<<<<<<<<<<< """
for i in range(0,len(data)):
    uzunluk = len(data.values[i][:])
    tmp.clear()
    
    for j in range(0,uzunluk):
        if not(pd.isnull(data.values[i][j])):
            tmp.append(data.values[i][j])
            #print(tmp)
        
""" BENİM DEĞİŞTİRDİĞİM KISIM [-] <<<<<<<<<<<<<<< """
    
    t.append(tmp)
    


# apriori sınıfı import ettik
from apyori import apriori

# apriori sınıfından bir nesne tanımladık ve ilişki bulma işlemini başlattık.
result = list(apriori(t,min_support=0.01,min_confidence=0.2,min_lift=0.5))

# Sonucu konsola bastık
for i in range(0,len(result)):
    print(result[i].items)

Belirttiğim kısımda şunu yapmaya çalıştım, her satırda nan olmayan verileri okuyup liste haline getirdim ve her satırın sonunda oluşturduğum listeyi t listesine append ile ekledim. Bu işlemin sonucunda çıktı alabildim.

Lafı uzettığımın farkındayım tek seferde derdimi anlatabilmek adına adım adım ne yaptığımı anlattım. Neden nan değerlerle karşılaştım bunu merak ediyorum. Bilgilerinizden istifade etmek istiyorum. Saygılar…

Ve Aleyküm Selâm,

Sizin de belirttiğiniz üzere, her satırda aynı sayıda değer yok ve geriye kalan değerler NaN olarak değerlendiriliyor çünkü pd.read_csv fonksiyonunun keep_default_na adında bir parametresi var, “boş” veri geldiğinde NaN ile doldurayım mı doldurmayayım mı diye karar vermek için. Default olarak True değerine sahip, dolayısıyla siz de NaN ile karşılaşmışsınız. Dolayısıyla, eğer

kısmını,

data = pd.read_csv('store3.csv', header=None, keep_default_na=False)

ile değiştirirseniz NaN almazsınız.

Bir diğer mevzu da, attığınız linkteki veriler virgülle ayrılıp bir tek sütuna konulmuş şekilde, sizdekiler ise ayrı ayrı sütunlarda barınıyor. Eğer siz de verilerinizi linkteki gibi tek bir sütuna virgülle ayrılmış şekilde eklemek isterseniz,

data = pd.read_csv("store3.csv", header=None)
tek_sutun_data = pd.DataFrame()
tek_sutun_data[0] = data.apply(lambda x: ", ".join(x[x.notnull()]), axis=1)

şeklinde yapabilirsiniz. (bunu yapmanın daha etkili bir yolu da olabilir tabii)

2 Beğeni

Öncelikle cevabın için teşekkür ederim.

Aslında bende de tek sütun, fakat drive üzerinde dosyayı önizlediğinizde öyle gösteriyor. Bilgisayarımdaki csv dosyasında hepsi tek sütunda.

Google Drive uzerinde nasil gozuktugunu bilmiyorum ama store2 birden fazla sutundan olusuyor. store'da tek sutun var:

"MILK,BREAD,BISCUIT"
s1,s2,s5,s6,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s19,s20,s21,s26,s27
1 Beğeni

Sizce yanlışlık var mı hocam? story2.csv de A1 hücresi seçili, formul çubuğunda içeriği görünüyor.

Misillemeyle cevap verecegim:

Aslinda sende de cok sutun, fakat Excel uzerinde dosyayi izledigimizde oyle gosteriyor. Bilgisayarindaki CSV dosyasinda hepsi birden fazla sutunda.
:slight_smile:

CSV’nin uzun sure (hala?) resmi bir formati olmadigi icin yazanlar esnek oldu, okuyanlar da esnek olmayi ogrendi. Microsoft(R) Office™ Excel™ bir sekilde dosyanin ; filan ile ayrildigina karar vermis. Aslinda ayni fikri read_csv’ye versek de olur.

1 Beğeni

Peki üstad teşekkürler