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.