Bu yazımızda bayes teoremini kullanarak sonuç olasılıklarını hesaplayacağız. Algoritma, CoLab ortamında Python programlama dili ile geliştirilmiştir.

Algoritma akışında kullanacağımız bazı kütüphaneleri tanımlıyoruz.

import pandas as pd
import datetime
import random
import json
import math
import csv
import seaborn as sns
import matplotlib.pyplot as plt

Öğrenme gerçekleştirebilmek için bir veri setine ihtiyacımız vardır. Bu projemizde, öğrencilerin farklı yeteneklerine bağlı aldıkları notlardan oluşan bir veri seti kullanıyoruz. Veri setimiz 1000 kayıttan oluşmaktadır. Veri setinin içeriği:

Cinsiyet: öğrencilerin cinsiyeti (erkek/kadın)
Irk/etnik köken: öğrencilerin etnik kökeni (Grup A, B, C, D, E)
Ebeveyn eğitim düzeyi: ebeveynlerin son eğitimi (Lisans, bazı kolejler, yüksek
lisans, ön lisans, lise)
Öğle yemeği: sınavdan önce öğle yemeği (standart veya ücretsiz/indirimli)
Sınava hazırlık kursu: sınav öncesi kurs tamamlama durumu
(tamamlandı/tamamlanmadı
Matematik puanı
Okuma puanı
Yazma Puanı

Veri setini kullanabilmek için öncellikle CoLab dosyalarına fiziksel olarak kopyalamamız gerekmektedir. Veri setine indir butonuna tıklayarak erişebilirsiniz.

Fiziksel olarak aktardığımız veri setini, df isimli bir değişkene atıyoruz.

df = pd.read_csv('study_performance.csv')
df.head(1000)

Kod çıktısı:

Veri Seti Analizi

Boş ve yinelenen değerlerin kontrolünü sağlıyoruz. isna fonksiyonu boş bilgiyi (None, NULL) tespit etmemizi sağlar. Algoritmada kullandığımız veri setinde “none” değerler mevcut fakat bunlar bir text olduğu için bu fonksiyon ile tespit edilememiştir.

df.isna().sum()

Kod çıktısı:

Boş olmayan bilgileri ve bilgilerin data tiplerini inceliyoruz.

df.info()

Kod çıktısı:

Intager tipinde ki kolonların istatistiklerini inceliyoruz.

mean: Aritmetik Ortalama

std: Standart Sapma

df.describe()

Kod çıktısı:

Birazdan oluşturacağımız algoritmada, olasılığı etkileyen bilgilerin dağılımını inceliyoruz.

plt.rcParams['figure.figsize'] = (30, 12)

plt.subplot(1, 5, 1)
size = df['gender'].value_counts()
labels = 'Female', 'Male'
color = ['red','green']

plt.pie(size, colors = color, labels = labels,autopct = '.%2f%%')
plt.title('Gender', fontsize = 20)
plt.axis('off')

plt.subplot(1, 5, 2)
size = df['race_ethnicity'].value_counts()
labels = 'Group C', 'Group D','Group B','Group E','Group A'
color = ['red', 'green', 'blue', 'cyan','orange']

plt.pie(size, colors = color,labels = labels,autopct = '.%2f%%')
plt.title('Race/Ethnicity', fontsize = 20)
plt.axis('off')

plt.subplot(1, 5, 3)
size = df['lunch'].value_counts()
labels = 'Standard', 'free/reduced'
color = ['red','green']

plt.pie(size, colors = color,labels = labels,autopct = '.%2f%%')
plt.title('Lunch', fontsize = 20)
plt.axis('off')

plt.subplot(1, 5, 4)
size = df['test_preparation_course'].value_counts()
labels = 'None', 'Completed'
color = ['red','green']

plt.pie(size, colors = color,labels = labels,autopct = '.%2f%%')
plt.title('Test Course', fontsize = 20)
plt.axis('off')

plt.subplot(1, 5, 5)
size = df['parental_level_of_education'].value_counts()
labels = 'Some College', "Associate's Degree",'High School','Some High School',"Bachelor's Degree","Master's Degree"
color = ['red', 'green', 'blue', 'cyan','orange','grey']

plt.pie(size, colors = color,labels = labels,autopct = '.%2f%%')
plt.title('Parental Education', fontsize = 20)
plt.axis('off')

plt.tight_layout()
plt.grid()

plt.show()

Kod çıktısı:

CSV olarak aktardığımız dosyayı işlemlerde sorun yaşamamak için JSON formatına çevirmemiz gerekmektedir.

study_performence = []
with open("study_performance.csv") as file:
  reader = csv.DictReader(file)
  for row in reader:
    study_performence.append(row)

Algoritma Fonksiyonu

Naive bayes sınıflandırma mantığı kullanılarak algoritma geliştirilmiştir. Algoritma içerisinde öğrencilerin ebeveyn geçmişi, öğle yemeği, kurs bitirme durumları girdi olarak kabul edilerek yazma puanları olasılıkları hesaplanmıştır. Girdi parametrelerinin hepsi birbirinden bağımsız, sonuç ilişkili olarak hesaplanmıştır. Fonksiyon çağırılarak tahmin edilmesi beklenen parametreler yollandığında öğrenme ile paralel çalışacaktır.

total_rows = len(open("study_performance.csv", "r").readlines()) - 1  #Total satır sayısını buluyoruz. -1 yapmamızın sebebi sütunu da satır olarak saymasıdır.
total_possibility = 0
probability = []

def get_probalitiy(gender, race_ethbicity, parental_level_of_education, lunch, test_preparation_course):
  for t in range(0,101):
    score_list = list(filter(lambda x: x == t,  df['writing_score'])) #Döngüde ki değerin kontrolünü yapıyoruz. // Önsel olasılık buradan bulunabilir
    #önsel olasılık için tekrar eden puanları tespit etmemiz gerekiyor
    if len(score_list) != 0:
      x01 = list(filter(lambda x: x.get('gender') == gender and x.get('writing_score') == str(t), study_performence)) #Cinsiyet ile sonuç ilişkisi yapılıyor.
      x01_possibility = len(x01) / len(score_list)
      x02 = list(filter(lambda x: x.get('race_ethnicity') ==  race_ethbicity and x.get('writing_score') == str(t), study_performence)) #Irk ile sonuç ilişkisi yapılıyor.
      x02_possibility = len(x02) / len(score_list)
      x03 = list(filter(lambda x: x.get('parental_level_of_education') ==  parental_level_of_education and x.get('writing_score') == str(t), study_performence)) #Aile eğitim düzeyi ile sonuç ilişkisi yapılıyor.
      x03_possibility = len(x03) / len(score_list)
      x04 = list(filter(lambda x: x.get('lunch') == lunch and x.get('writing_score') == str(t), study_performence)) #Öğle yemeği durumu ile sonuç ilişkisi yapılıyor.
      x04_possibility = len(x04) / len(score_list)
      x05 = list(filter(lambda x: x.get('test_preparation_course') == test_preparation_course and x.get('writing_score') == str(t), study_performence)) #kursa gitme durumu ile sonuç ilişkisi yapılıyor.
      x05_possibility = len(x05) / len(score_list)
      # x06 = list(filter(lambda x: x.get('math_score') == 90 and x.get('writing_score') == str(t), study_performence)) #Matematik puanı ile sonuç ilişkisi yapılıyor.
      # x06_possibility = f"{len(x06) / len(score_list):.3f}" #Koşullu olasılık
      # x07 = list(filter(lambda x: x.get('reading_score') == 90 and x.get('writing_score') == str(t), study_performence)) #Okuma ile sonuç ilişkisi yapılıyor.
      # x07_possibility = f"{len(x07) / len(score_list):.3f}" #Koşullu olasılık
      c01 =  f"{ ( len(score_list) / float(total_rows) ) * ( x01_possibility *  x03_possibility * x03_possibility * x04_possibility * x05_possibility ):.5f}"
      #Her bir durum için olasılığı hesaplıyoruz
      probability.append({
          'point' : t,
          'c': float(c01)
      })

  return probability

Parametre Kontrolü

Olasılıkları tahmin etmesi için aktardığımız parametrelerin, öğrenme işleminde kullandığımız veri setinde kontrolünü sağlıyoruz. Bu testimizde parametre kombinasyonunun, veri setinde olmamasına dikkat edilmiştir.

def value_control(gender, race_ethbicity, parental_level_of_education, lunch, test_preparation_course):
  search_list = list(filter(lambda x: x.get('gender') == str(gender) and \
                            x.get('race_ethbicity') == race_ethbicity and \
                            x.get('parental_level_of_education') == str(parental_level_of_education) and\
                            x.get('lunch') ==  str(lunch) and \
                            x.get('test_preparation_course') ==str(test_preparation_course), study_performence))
  return search_list

Parametre fonksiyonu kontrolü için oluşturduğumuz yapıyı çağırıyoruz.

search_list = value_control("male", "group C", "some college", "free/reduced",  "completed")


for i in search_list:
  print("Cinsiyet: {0}, Irk/Etknik köken: {1}, Ebeveyn eğitim düzeyi: {2}, Öğle yemeği: {3}, Sınava hazırlık kursu: {4}, Matematik puanı: {5}, Okuma puanı: {6}, Yazma puanı: {7} ".format(i['gender'], i['race_ethnicity'], i['parental_level_of_education'], i['lunch'], i['test_preparation_course'], i['math_score'], i['reading_score'], i['writing_score']))
print("Bulunan sonuç:  {0}".format(len(search_list)))

Kod çıktısı:

Olasılıkların Hesaplanması ve Görselleştirilmesi

Oluşturmuş olduğumuz get_probalitiy fonksiyonuna olasılıkların hesaplanması için parametreleri aktarıyoruz. Hesaplanan olasılıkları grafik üzerinde görselleştiriyoruz.

numbers = []
results  = []
probability = get_probalitiy("female", "group A", "associate's degree", "standard",  "none")
# probability = get_probalitiy("male", "group C", "some college", "free/reduced",  "completed")

for i in probability:
  numbers.append(i['point'])
  results.append(i['c'])

plt.figure(figsize=(25,8))
sns.barplot(x=numbers, y= results, color='blue')
plt.xlabel('Yazma Puanı', fontweight ='bold', fontsize = 20)
plt.ylabel('Olasılık', fontweight ='bold', fontsize = 20)
plt.show()

Kod çıktısı:

İkinci bir olasılık hesaplama durumu olarak “male”, “group C”, “some college”, “free/reduced”, “completed” parametrelerini yollayarak olasılıkları hesaplayalım.

Görüldüğü gibi istediğimiz parametreleri yollayarak bayes teoremine göre sonuç olasılıklarını hesaplamış olduk. Görselleştirme işlemi için farklı grafikler tercih edilebilir.