import streamlit as st
import numpy as np
import matplotlib.pyplot as pltGiriş
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():
num_points = int(np.random.uniform(low=100, high=1000))
rho = round(np.random.uniform(low=-1, high=1), 2)
cov_matrix = np.array([[1, rho], [rho, 1]])
mu = [0, 0]
correlated_data = np.random.multivariate_normal(mean=mu, cov=cov_matrix, size=num_points)
return correlated_data, rhoFonksiyonumuzun 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.
correlated_data, rho = generate_correlated_data()
# print(f'Randomly selected correlation: {rho}')
plt.figure(figsize=(8, 6))
plt.scatter(correlated_data[:,0], correlated_data[:,1], alpha=0.7)
plt.title('Scatter Plot of Correlated Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
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):
mse = np.mean((predictions - actuals) ** 2)
rmse = round(np.sqrt(mse), 4)
return rmsecalculate_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ı
st.session_state.setdefault('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
# Korelasyonlu veri oluşturan fonksiyon
def generate_correlated_data():
num_points = int(np.random.uniform(low=100, high=1000))
rho = round(np.random.uniform(low=-1, high=1), 2)
cov_matrix = np.array([[1, rho], [rho, 1]])
mu = [0, 0]
correlated_data = np.random.multivariate_normal(mean=mu, cov=cov_matrix, size=num_points)
return correlated_data, rho
# RMSE hesaplayan fonksiyon
def calculate_rmse(predictions, actuals):
mse = np.mean((predictions - actuals) ** 2)
rmse = round(np.sqrt(mse), 4)
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:
correlated_data, rho = generate_correlated_data()
st.session_state['rhos'].append(rho)
# 'plots' listesi boşsa ilk görselin oluşturulması ve kaydedilmesi
if len(st.session_state['plots']) == 0:
plt.figure(figsize=(8, 6))
plt.scatter(correlated_data[:,0], correlated_data[:,1], alpha=0.7)
plt.title('Scatter Plot of Correlated Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
st.session_state['plots'].append(plt)
st.pyplot(st.session_state['plots'][0])
# Kullanıcının tahmini
user_guess = st.sidebar.text_input(
label='Your Guess:',
value='0.0'
)
# Kullanıcı tahmininin ondalık sayıya dönüştürülmesi
user_guess = float(user_guess)
# Tahmin butonunun oluşturulması
guess_button = st.sidebar.button(label='Guess')
# Tahmin butonuna basıldığında yapılacaklar
if guess_button:
correlated_data, rho = generate_correlated_data()
st.session_state['rhos'].append(rho)
st.session_state['guesses'].append(user_guess)
rmse = calculate_rmse(np.array(st.session_state['rhos'][:-1]), np.array(st.session_state['guesses']))
st.session_state['rmse_values'].append(rmse)
st.subheader(f'Guess: {st.session_state["guesses"][-1]}, Actual: {st.session_state["rhos"][-2]}, RMSE: {st.session_state["rmse_values"][-1]}')
plt.figure(figsize=(8, 6))
plt.scatter(correlated_data[:,0], correlated_data[:,1], alpha=0.7)
plt.title('Scatter Plot of Correlated Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
st.session_state['plots'].append(plt)
st.pyplot(st.session_state['plots'][-1])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.