import streamlit as st
import numpy as np
import matplotlib.pyplot as plt
Giriş
Günlük hayatımızda karşılaştığımız verilerin çoğu, birbirleriyle bir şekilde ilişkili olabilir. Bu ilişkileri anlamak ve tahmin etmek, hem akademik araştırmalarda hem de iş dünyasında büyük önem taşır. Yapacağımız korelasyon tahmin oyunu uygulaması ile korelasyonu eğlenceli hale getireceğiz.
Kullanılacak Kütüphaneler
Uygulamanın Tasarımının Oluşturulması
Korelasyon tahmin oyunu yapımında nelere ihtiyacımız olabilir?
Birincisi, iki adet rassal seri üretmeliyiz ve bu serileri üretirken korelasyon katsayısını dikkate almalıyız. Buradaki korelasyon katsayısı Pearson’ı ifade etmektedir. Rassal serileri üretmek için numpy
kütüphanesinin np.random.multivariate_normal
fonksiyonundan faydalanabiliriz.
İkincisi, kullanıcı için bir skorlama yapmalıyız. Bunun için RMSE (Root Mean Squared Error, Kök Ortalama Kare Hatası) metriğini kullanabiliriz. RMSE skoru düştükçe başarı artacaktır.
Üçüncüsü, kullanıcı ile etkileşimde olmalıyız. Etkileşim için Streamlit ile bir web uygulaması yapabiliriz. Uygulamayı lokalde çalıştıracağız.
Korelasyonlu Rassal Serilerin Üretilmesi
def generate_correlated_data():
= int(np.random.uniform(low=100, high=1000))
num_points = round(np.random.uniform(low=-1, high=1), 2)
rho = np.array([[1, rho], [rho, 1]])
cov_matrix = [0, 0]
mu = np.random.multivariate_normal(mean=mu, cov=cov_matrix, size=num_points)
correlated_data return correlated_data, rho
Fonksiyonumuzun ismini generate_correlated_data
olarak belirledik ve fonksiyonumuzun herhangi bir parametresi bulunmamaktadır.
num_points
değişkeni, 100 ile 1000 arasında olmak üzere rassal olarak üretilecek serilere ait verilerin uzunluğunu temsil etmektedir. Bu değeri üretebilmek için numpy
kütüphanesinin np.random.uniform
fonksiyonunu kullandık ve int()
ile değerin tam sayı veri tipinde olmasını sağladık.
rho
değişkeni, -1 ile 1 arasında rassal olarak olarak üretilmiş bir korelasyon katsayısını temsil etmektedir. Bu değeri üretebilmek için np.random.uniform
fonksiyonunu kullandık. rho
değerini noktadan sonra iki rakam gelecek şekilde ayarladık.
cov_matrix
değişkeni, 2x2’lik bir kovaryans matrisini temsil etmektedir.
mu
değişkeni, veri kümesinin her bir boyutu için belirlenen ortalama değeri temsil etmektedir. Bu değer 0 olacağı için X ve Y [0, 0]
’dır.
correlated_data
değişkeni, np.random.multivariate_normal
fonksiyonu yardımıyla üretilen verileri temsil etmektedir. Bu fonksiyon, çok değişkenli bir normal dağılımdan rassal örnekler üretir. Fonksiyonun içerisine parametre olarak ortalama, kovaryans matrisi ve örnek büyüklüğü girilir.
generate_correlated_data
fonksiyonu bize correlated_data
ve rho
değerlerini dönüyor. correlated_data
değişkenindeki ilk seriye correlated_data[:,0]
; ikinci seriye correlated_data[:,1]
ile ulaşılabilir.
Fonksiyonun döndüğü değerleri kullanarak bir görselleştirme yapalım.
= generate_correlated_data()
correlated_data, rho
# print(f'Randomly selected correlation: {rho}')
=(8, 6))
plt.figure(figsize0], correlated_data[:,1], alpha=0.7)
plt.scatter(correlated_data[:,'Scatter Plot of Correlated Data')
plt.title('X')
plt.xlabel('Y')
plt.ylabel(True)
plt.grid( plt.show()
Bir diğer fonksiyonumuz olan ve RMSE değerini hesaplayan calculate_rmse
fonksiyonuna bakalım.
\(\mathrm{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}\)
def calculate_rmse(predictions, actuals):
= np.mean((predictions - actuals) ** 2)
mse = round(np.sqrt(mse), 4)
rmse return rmse
calculate_rmse
fonksiyonu, predictions
ve actuals
olmak üzere 2 adet parametre alıyor. Önce mse
değişkenine tahminler ile gerçek değerler arasındaki farkların karelerinin ortalamasını gönderiyoruz. Ardından da bu ortalamanın karekökünü rmse
değişkenine atıyoruz ve bu değeri noktadan sonra 4 rakam olacak şekilde döndürüyoruz.
Kodların ana yapısını oluşturduk.
Streamlit Web Uygulamasının Yapımı
Web uygulaması tarafında kullanılan kodlar aşağıdadır.
# Oturum durumu değişkenlerinin tanımlanması ve varsayılan değerlerin ayarlanması
'rhos', []) # Korelasyon katsayıları
st.session_state.setdefault('guesses', []) # Kullanıcının tahminleri
st.session_state.setdefault('rmse_values', []) # RMSE değeri
st.session_state.setdefault('plots', []) # Görseller
st.session_state.setdefault(
# Korelasyonlu veri oluşturan fonksiyon
def generate_correlated_data():
= int(np.random.uniform(low=100, high=1000))
num_points = round(np.random.uniform(low=-1, high=1), 2)
rho = np.array([[1, rho], [rho, 1]])
cov_matrix = [0, 0]
mu = np.random.multivariate_normal(mean=mu, cov=cov_matrix, size=num_points)
correlated_data return correlated_data, rho
# RMSE hesaplayan fonksiyon
def calculate_rmse(predictions, actuals):
= np.mean((predictions - actuals) ** 2)
mse = round(np.sqrt(mse), 4)
rmse return rmse
# 'rhos' listesi boş ise yeni bir korelasyonlu veri oluşturulması ve korelasyon katsayısının kaydedilmesi
if len(st.session_state['rhos']) == 0:
= generate_correlated_data()
correlated_data, rho 'rhos'].append(rho)
st.session_state[
# 'plots' listesi boşsa ilk görselin oluşturulması ve kaydedilmesi
if len(st.session_state['plots']) == 0:
=(8, 6))
plt.figure(figsize0], correlated_data[:,1], alpha=0.7)
plt.scatter(correlated_data[:,'Scatter Plot of Correlated Data')
plt.title('X')
plt.xlabel('Y')
plt.ylabel(True)
plt.grid('plots'].append(plt)
st.session_state['plots'][0])
st.pyplot(st.session_state[
# Kullanıcının tahmini
= st.sidebar.text_input(
user_guess ='Your Guess:',
label='0.0'
value
)
# Kullanıcı tahmininin ondalık sayıya dönüştürülmesi
= float(user_guess)
user_guess
# Tahmin butonunun oluşturulması
= st.sidebar.button(label='Guess')
guess_button
# Tahmin butonuna basıldığında yapılacaklar
if guess_button:
= generate_correlated_data()
correlated_data, rho 'rhos'].append(rho)
st.session_state['guesses'].append(user_guess)
st.session_state[= calculate_rmse(np.array(st.session_state['rhos'][:-1]), np.array(st.session_state['guesses']))
rmse 'rmse_values'].append(rmse)
st.session_state[
f'Guess: {st.session_state["guesses"][-1]}, Actual: {st.session_state["rhos"][-2]}, RMSE: {st.session_state["rmse_values"][-1]}')
st.subheader(
=(8, 6))
plt.figure(figsize0], correlated_data[:,1], alpha=0.7)
plt.scatter(correlated_data[:,'Scatter Plot of Correlated Data')
plt.title('X')
plt.xlabel('Y')
plt.ylabel(True)
plt.grid('plots'].append(plt)
st.session_state['plots'][-1]) st.pyplot(st.session_state[
Windows/Visual Studio Code için bir not: Streamlit uygulamasının yapımında kullanılacak olan kodları .py
uzantılı app.py
isminde bir script’e kaydedip terminalden streamlit run app.py
komutu ile çalıştırabilirsiniz.
Gelecek içeriklerde görüşmek dileğiyle.