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()

png

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()

png


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ış.

İlişkili