Python ile PISA Matematik Puanlarının Değişimi Grafiği
Merhaba,
Bu yazımda Python kullanarak PISA Matematik Puan Ortalamalarının 2015-2018 arasında cinsiyete göre nasıl bir değişim gösterdiğini grafikleyeceğiz.
Bu yazıda elde edeceğimiz grafikler ulusal veya uluslararası raporlarda sıklıkla görebileceğiniz bir türden. Ülke ülke cinsiyete göre nasıl bir değişim olmuş onları göstereceğim. Değişimlerde bir azalma olursa yanı 2015’ten 2018’e bir azalma olursa kırmızı ile, bir artma olursa mavi çizgi ile belirteceğim. Böylece sadece renklere bakarak artış ya da azalışlar hemen farkedilebilir olacaktır ki veri görselleştirmenin en önemli amaçlarından birisi de budur. Ancak bununla da kalmayacağız ve yüzde olarak ne kadar bir fark olmuş onu da belirteceğim. Gelin “veriyi konuşturalım”.
Verilerin Elde Edilmesi
Verileri Dünya Bankası sayfasından 6 mayıs 2020 tarihinde aldım. 269 ülkeden oluşan veride ben sadece 2015 ve 2018 verileri olanları aldım ve diğerlerini eledim. Veride 2003,2006, 2009, 2012 yıllarına ait PISA verileri de vardı ancak onları bu çalışmada kullanmadım. İsteyen onlarla da çalışabilir.
Kullanılan Python Kütüphaneleri
Python ile veri görselleştirme yapılırken ben matplotlib, ve seaborn kütüphanelerini kullandım. İstenilirse plotly ile de grafikler çizilebilir. Veri analizinde ise pandas ve numpy kullandım.
Python Kodları
İlk olarak kütüphaneleri çağırarak işe başlıyorum. import komutu ile kullandığım paketleri as kullanarak da kısaltmalarını belirleyerek işleme başlıyorum.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid") # grafikler için beyaz zemin oluşturma.
Kullanacağım kütüphaneleri yükledikten sonra verileri pandas kullanarak Github sitesinden çekiyorum. Bunun için
pandas.read_csv()
fonksiyounu kullandım. Hem kızlar hem erkekler için iki ayrı veri setini kız ve erkek nesnesine kaydedip 2018-2015 yılı arasındaki artışı görmek adına veriye fark değişkenini de ekleyeceğim. Hem kız hem de erkek verilerini aşağıda görebilirsiniz.
kız = pd.read_csv('https://raw.githubusercontent.com/rnzbrk/R-files-/master/pisafemale.csv', sep=";")
kız = kız.set_index("Country").sort_values("2018")
kız["fark"] = kız["2018"] / kız["2015"] - 1
kız
2015 | 2018 | fark | |
---|---|---|---|
Country | |||
Kosovo | 356.729450 | 363.776533 | 0.019755 |
Argentina | 400.443116 | 371.848368 | -0.071408 |
Brazil | 369.549307 | 379.269456 | 0.026303 |
Colombia | 384.488336 | 381.365275 | -0.008123 |
Indonesia | 387.444975 | 383.446725 | -0.010320 |
... | ... | ... | ... |
Netherlands | 511.015941 | 518.547572 | 0.014739 |
Estonia | 516.872753 | 519.187027 | 0.004477 |
Japan | 525.495995 | 522.034617 | -0.006587 |
Singapore | 564.254534 | 566.893619 | 0.004677 |
China | 528.194648 | 585.753111 | 0.108972 |
63 rows × 3 columns
erkek = pd.read_csv('https://raw.githubusercontent.com/rnzbrk/R-files-/master/pisamale.csv', sep=";")
erkek = erkek.set_index("Country").sort_values("2018")
erkek["fark"] = erkek["2018"] / erkek["2015"] - 1
erkek
2015 | 2018 | fark | |
---|---|---|---|
Country | |||
Kosovo | 366.189422 | 367.993933 | 0.004928 |
Indonesia | 384.779279 | 373.734527 | -0.028704 |
Argentina | 418.388361 | 387.279360 | -0.074354 |
Brazil | 385.040591 | 387.871670 | 0.007353 |
North Macedonia | 368.237357 | 390.933269 | 0.061634 |
... | ... | ... | ... |
Netherlands | 513.497847 | 519.910895 | 0.012489 |
Estonia | 522.080414 | 527.638015 | 0.010645 |
Japan | 539.267257 | 532.156110 | -0.013187 |
Singapore | 564.129004 | 571.041480 | 0.012253 |
China | 534.010671 | 596.553872 | 0.117120 |
63 rows × 3 columns
İki yeni veri yarattım. Fark1 ve Fark2 verisi kızlarda ve erkeklerdeki Matematik puanlarının toplam değişim yüzdesini göstermekte. Bu iki ifadeyi text olarak her iki grafiğe ekleyip 2015-2018 arasında Matematik puanları genelinde nasıl bir durum oluşmuş onu görebiliriz.
Fark1 = str(round(kız['fark'].mean()*100, 2))
Fark2 = str(round(erkek['fark'].mean()*100, 2))
Grafiği çizerken hangi fonksiyonları kullandığımı kısaca burada anlatacağım
plt.figure # Grafiğin boyutunu belirler.
y_range # Y sütununda ülkeler olacak. Kaç ülke olacağını belirleyip ona göre bir ranj belirler
colors # np.where() komutu ile koşullu renklendirme yaptım. Eğer 2018 verisi 2015 verisinden büyük ise #0b6af4 değilse #E1152A kullanmasını istedim.
plt.hlines # yatay çizği için kullanılan grafik fonksiyonu
plt.scatter # saçılım grafiği fonksiyonu. 2018 ve 2015'e ait verilerin saçılımını gösterir.
plt.legend # legend yani tanımlama kutularının çizimi
plt.yticks # Y sütunundaki değişkenleri yerleştirme
plt.title #grafiğin başlığı
plt.xlim # x başlanğıç ve bitiş noktaları
plt.text # Fark1 ile hesapladığımız Matematik puanlarının toplam değişim yüzdesini belirtmek için kullanılır
plt.figure(figsize=(15,25))
y_range = np.arange(1, len(kız.index) + 1)
colors = np.where(kız['2018'] > kız['2015'], '#0b6af4', '#E1152A')
plt.hlines(y=y_range, xmin=kız['2015'], xmax=kız['2018'],
color=colors, lw=10)
plt.scatter(kız['2015'], y_range, color='#E1152A', s=200, label='2015', zorder=3)
plt.scatter(kız['2018'], y_range, color='#0b6af4', s=200 , label='2018', zorder=3)
for (_, row), y in zip(kız.iterrows(), y_range):
plt.annotate(f"{row['fark']:+.0%}", (max(row["2015"], row["2018"]) + 4, y - 0.25))
plt.legend(ncol=2, bbox_to_anchor=(1., 1.01), loc="lower right", frameon=False)
plt.yticks(y_range, kız.index)
plt.title("PISA Matematik Puanlarının Ülkelere Göre Değişimi\n2015-2018 Kız Öğrenciler", loc='left')
plt.xlim(350, 615)
plt.gcf().subplots_adjust(left=0.35)
plt.tight_layout()
plt.text(501,0.2,"Genel Ortalama Değişim " + Fark1+"%",bbox=dict(facecolor='#ccc9c9', alpha=0.5))
plt.show()
plt.figure(figsize=(15,25))
y_range = np.arange(1, len(erkek.index) + 1)
colors = np.where(erkek['2018'] > erkek['2015'], '#0b6af4', '#E1152A')
plt.hlines(y=y_range, xmin=erkek['2015'], xmax=erkek['2018'],
color=colors, lw=10)
plt.scatter(erkek['2015'], y_range, color='#E1152A', s=200, label='2015', zorder=3)
plt.scatter(erkek['2018'], y_range, color='#0b6af4', s=200 , label='2018', zorder=3)
for (_, row), y in zip(erkek.iterrows(), y_range):
plt.annotate(f"{row['fark']:+.0%}", (max(row["2015"], row["2018"]) + 4, y - 0.25))
plt.legend(ncol=2, bbox_to_anchor=(1., 1.01), loc="lower right", frameon=False)
plt.yticks(y_range, erkek.index)
plt.title("PISA Matematik Puanlarının Ülkelere Göre Değişimi\n2015-2018 Erkek Öğrenciler", loc='left')
plt.xlim(350, 615)
plt.gcf().subplots_adjust(left=0.35)
plt.tight_layout()
plt.text(501,0.2,"Genel Ortalama Değişim " + Fark2+"%",bbox=dict(facecolor='#ccc9c9', alpha=0.5))
plt.show()
Grafiklerin ve Verinin Yorumlanması
İlk gözüme çarpan kızların Matematik Puan ortalamalarının erkeklere göre daha fazla arttığıdır (Kız= %0,83; Erkek=%0,33). Türkiye verisine bakacak olursak kızlar ve erkeklerin %8 oranında arttığını görüyoruz. Birçok ülkede örneğin Kanada’da; kızların puanları değişmezken erkeklerin puanlarında bir gerilemenin olduğunu görebiliriz. Yorumlamalar size kalmış.