<jupyter_start><jupyter_text>VERİ ANALİZİ<jupyter_code>dataFrame.describe()
dataFrame.isnull().sum()
# isnull bize true false şeklinde boş veri var mı onu gösterir sum() ekleyince de 
# bize özetini gösteriyor
plt.figure(figsize=(10,7))
# seaborn matplotlib üzerine kurulduğu için matplotlib den boyutunu arttırdık grafiğin
sbn.distplot(dataFrame["price"])
# ücrete göre grafik çizdirdik. Bu dağılımı gösteren bir grafik
# bu çizdirdiğimiz grafiğe bakarak veri setimizde çok yüksek fiyata satılan ve verinin tutarlılığını bozan verilerin olduğu
# sonucuna vardık. Bu verileri istersek veri setimizden temizleriz istemessek temizlemeyiz. Ama çok hassas bir veri analizi
# yapıyorsak bunları veri setimizden temizlememiz gerekir.
sbn.countplot(dataFrame["year"])
# bu sadece sayılarını gösteren bir grafik
dataFrame.corr()
# bu bize verilerin diğer verilerle arasındaki ilişkiyi gösterir
dataFrame.corr()["price"].sort_values()
# burda ise sadece price kolonunun diğer verilerle alakasını aldık. sort_values() ile ise değerleri
# küçükten büyüğe sırala dedik
sbn.scatterplot(x="mileage", y="price", data=dataFrame)
# çizgi grafiğinde ücretin mileage'e göre değişimini seaborn ile çizdik
dataFrame.sort_values("price", ascending = False).head(20)
# dataFrame'mimizin ücrete göre sıralamaısını yaptırdık ascending false demek en yüksekten en düşüğe göre sıralar
# head(20) ile ilk 20 veriyi getirdik. True yaparsak eğer ucuzdan pahalıya doğru sıralar.<jupyter_output><empty_output><jupyter_text>DATA TEMİZLİĞİ<jupyter_code># şuanki verimizde bizim verimizin bütünlüğünü bozan çok pahalı bir kaç araba var
# bir verinin %99 ile işlem yaparsan o verinin doğruluğunu bozmassın bu yüzden bizde en pahalı 
# 131 arabayı bulup onları datasetimizden atıcaz
yüzdeDoksanDokuzDF = dataFrame.sort_values("price", ascending = False).iloc[131:]
# bizim ihtiyacımız olan şey en pahalı arabaların 131'ini atmaktı yukarıda yaptığımız şeyde pahalıdan düşüğe doğru sıralıyoruz
# sonrasında ise index'e göre sırala diyerek 131. index den başlayarak göster diyoruz bu index row'lar için geçerli
# böylece verimizi elde etmiş oluyoruz.
yüzdeDoksanDokuzDF
plt.figure(figsize=(7,5))
sbn.distplot(yüzdeDoksanDokuzDF["price"])
# yeni verimizi çizdirdik datamız daha iyi oldu.
dataFrame.groupby("year").mean()["price"]
# yıla göre grupla sonra price'ın ortalamasını alarak getir dedik
yüzdeDoksanDokuzDF.groupby("year").mean()["price"]
# bu da pahalı arabaların atılmış hali ama 1970 yılında 25k satılan arabalar var bu arabaların
# bu fiyata satılması verinin bütünlüğünü bozuyor o arabalar muhtemelen özel bir şeye sahip yani tahmin edilmeyi 
# zorlaştırır bu yüzden bu kısmı da atıcaz
yüzdeDoksanDokuzDF[yüzdeDoksanDokuzDF.year !=1970].groupby("year").mean()["price"]
# yukarıda verimizde 1970'e eşit olmayan tarihleri yıla göre grupla ve ücretin ortalamasını alarak getir dedik
# yüzdeDoksanDokuzDF.year yapmak burda işe yarıyor ama normalde yüzdeDoksanDokuzDF["year"] böyle çağırılır normalde
temizDataFrame = yüzdeDoksanDokuzDF[yüzdeDoksanDokuzDF.year !=1970]
temizDataFrame
# 1970 yılı ve gereksiz pahalı olan arabaların atılmış hali olan veri
temizDF = temizDataFrame.drop("transmission", axis=1)
# bu veri numeric değil de kategorik olduğu için bu veriyi düşürdük axis=1 dememizin sebebi ise kolonu komple at demek
temizDF.head()<jupyter_output><empty_output><jupyter_text>MODEL OLUŞTURMA<jupyter_code>y = temizDF["price"].values
# values diyerek bunu bir numpy arrey'ine dönüştürdük
x = temizDF.drop("price", axis=1).values
# price kolonunu komple düşürüp geri kalan kolonları aldık ve numpy arrey'ine dönüştürdük.
from sklearn.model_selection import train_test_split
# train test kümesi oluşturmak için çağırdık
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=10)
# random_state verimizi rastgele bölüyor ama birdahaki sefere aynı rastgelelikde bölmek istersen diye numaralar var
# bu numara ile aynı rastgeleliği kullanabilirsin birdahaki seferede
from sklearn.preprocessing import MinMaxScaler
# verilerimizi ölçeklendirmek için bunları scale edicez x lerden yani değişkenlerden y'leri tahmin ettiğimiz için
# sadece x leri yani değişkenleri tutan değişkeni ölçeklendiriyoruz
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
# bu sefer scaler objemize nasıl scale etmesi gerektiğini hem öğretip hemde scale ettik yani iki işi aynı anda yaptık
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
x_train.shape
# 5 tane özellik olduğu için başlangıç olarak en az 5 nöron ile başlamamız gerek ama biz 12 ile başlıcaz çünkü atıl
# hoca zaten bu veri seti üzerinde çalışmış ve 12'nin daha iyi çalıştığını görmüş
model = Sequential()

model.add(Dense(11,activation="relu"))
model.add(Dense(11,activation="relu"))
model.add(Dense(11,activation="relu"))
model.add(Dense(11,activation="relu"))
# bunlar ara katmanlar

model.add(Dense(1,activation="relu"))
# bu çıkış katman

model.compile(optimizer="adam", loss="mse")
# bu da compile ederken kullandığımız optimizer bunu bu sefer adam olarka seçtik. Loss fonksiyonu olarak ise
# mse seçtik.
model.fit(x=x_train, y=y_train, validation_data=(x_test, y_test), batch_size=250, epochs=300)
# burda öğretme işleminde validation_data değerlerine x_test ve y_test vererek daha önce manuel olarak yaptığımız
# x_test'den tahmin edilen ile gerçek y_test verisi değerlerininin kıyaslanma işlemini daha kolay bir hale getiricek
# batch_size=300 vermemizin sebebi ise elimizde 13k veri var bu 13k veriyi aynı anda modelimize vermek modelimizi yorabilir
# bu yüzden 300 300 vericez modelimize
# test veri kümelerini de vermemiz val_loss'un ortaya çıkmasına sebep oldu bu da doğrulama loss'u oluyor.
# eğer bunu bir kaç defa çalıştırırsak sanırsam ezberlemeye gidiyor. Bu da iyi bir şey değil.
kayipVerisi = pd.DataFrame(model.history.history)
kayipVerisi
# loss ve val_loss aynı anda veriyor bu model.history.history şeysi
kayipVerisi.plot()
# eğer aşağıdaki tabloda val_loss ve loss birbirinden ayrılıyorsa sonlara doğru bir sıkıntı var demektir ya overfitting olmuş ya
# da başka bir sıkıntı.
from sklearn.metrics import mean_squared_error, mean_absolute_error
tahminDizisi = model.predict(x_test)
tahminDizisi
mean_absolute_error(y_test, tahminDizisi)
# tahminimizle gerçek değerimiz arasında 3387 pound'luk bir fark var. Bu fark önemli mi değil mi buna biz karar veririz
# önemliyse o zaman daha başarılı bir model oluşturmaya çalışırız. Değilse modelimizle devam ederiz.
mean_squared_error(y_test, tahminDizisi)
plt.scatter(y_test, tahminDizisi)
plt.plot(y_test,y_test,"g-*")
# verimizin ortasından geçen çizgiyi çizdik
yeniArabaSeries = dataFrame.drop( ["transmission","price"], axis=1).iloc[2]
yeniArabaSeries
# bu arabanın price değerini tahmin ettirerek bulmaya çalışıcaz
yeniArabaSeries = scaler.transform(yeniArabaSeries.values.reshape(-1,5))
# serimizi reshape yaparak -1,5 ne demek bilmiyorum. values ile onu bir seriye dönüştürdük. Scale ettik aynı zamanda da
model.predict(yeniArabaSeries)
# arabamızın fiyatı 53113 pound olcakmış
dataFrame.iloc[2]
# yakın bir tahmin yaptık 4k pound sapma olmuş.<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.066016713091922, 'fraction_numerical': 0.014623955431754874, 'mean_word_length': 6.639361702127659, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '633856', 'license': 'MIT', 'n_tokens_mistral': 3317, 'n_tokens_neox': 3013, 'n_words': 770, 'path': '6-TensorFlowCarAnalyz.ipynb', 'repo_name': 'Omezkan/CarPriceAnalysisWithTensorflow', 'size': '7180'}