Python ile Zaman Serisi Analizi

Merhabalar,

Bu gün sizlere pythonda Prophet kütüphanesi yardımı ile nasıl zaman serisi analizi yapabileceğinizden bahsedeceğim.

Öncelikle Zaman Serisi Analizi nedir?

  • Bir zaman serisi,ilgilenilen bir büyüklüğün zaman içerisinde sıralanmış ölçümlerinin bir
    kümesidir.Zaman serisi ile ilgili bu analizin yapılma amacı ise, gözlem kümesince temsil edilen
    gerçeğin anlaşılması ve zaman serisindeki değişkenlerin gelecekteki değerlerinin doğru bir şekilde
    tahmin (forecast) edilmesidir*

Öncelikle ilgileneceğim veri setinden bahsetmek istiyorum.

  • Avocado Prices : Historical data on avocado prices and sales volume in multiple US markets

Verimizin içeriği ise şu şekilde ;

Verimizin Veri Tiplerine ve İçeriğine bakalım, ona göre eksik veri aksiyonu alacak mıyız? ona karar verelim.

burada baktığımızda date değişkeni’nin datetime şeklinde olmadığının farkına vardım. Onu datetime yapacağım, onun dışında sorun yaşatacak başka bir durum yok, missing value yok.

dates = [datetime.datetime.strptime(ts, "%Y-%m-%d") for ts in data['date']]
dates.sort()
sorteddates = [datetime.datetime.strftime(ts, "%Y-%m-%d") for ts in dates]
data['date'] = pd.DataFrame({'date':sorteddates})
data['Year'], data['Month'],  data['Day'] = data['date'].str.split('-').str
data.head(10)


Herşey hazır şekilde burada birde 3 tane ek sutün ekledim, Yıl-Ay-Gün diye, görselleştirme kısımlarında ihtiyacım olacak. 

Şimdi elimizdeki veriyi görselleştirmeye başlayalım.

Fiyatlar için Dağılım Grafiği

plt.figure(figsize=(12,5))
plt.title("Price Distirbution Graph")
ax = sns.distplot(data["avprice"], color = 'y')

Fiyatlar için Violin Grafiği

fig, ax = plt.subplots()
fig.set_size_inches(10,5)
sns.violinplot(data.dropna(subset = ['avprice']).avprice)

4 Ocak 2015 - 25 Mart 2018 Arasındaki Avokado Fiyatlarının Değişimi

dategroup=data.groupby('date').mean()
plt.figure(figsize=(12,5))
dategroup['avprice'].plot(x=data.date)
plt.title('Average Price')

Avokado Fiyatlarının Aylara Göre Değişimleri

dategroup=data.groupby('Month').mean()
fig, ax = plt.subplots(figsize=(12,5))
ax.xaxis.set(ticks=range(0,13)) # Manually set x-ticks
dategroup['avprice'].plot(x=data.Month)
plt.title('Average Price by Month')

Avokado Fiyatlarının Günlere Göre Değişimleri

dategroup=data.groupby('Day').mean()
fig, ax = plt.subplots(figsize=(12,5))
ax.xaxis.set(ticks=range(0,31)) # Manually set x-ticks
dategroup['avprice'].plot(x=data.Day)
plt.title('Average Price by Day')

Şehirlere Göre Yıllık Averaj Avokado Fiyatları

plt.figure(figsize=(20,20))
sns.set_style('whitegrid')
sns.pointplot(x='avprice',y='region',data=data, hue='year',join=False)
plt.xticks(np.linspace(1,2,5))
plt.xlabel('Region',{'fontsize' : 'large'})
plt.ylabel('Average Price',{'fontsize':'large'})
plt.title("Yearly Average Price in Each Region",{'fontsize':20})
Şehirlerde Tiplere Göre Averaj Avokado Satış Fiyatları

plt.figure(figsize=(12,20))
sns.set_style('whitegrid')
sns.pointplot(x='avprice',y='region',data=data, hue='type',join=False)
plt.xticks(np.linspace(1,2,5))
plt.xlabel('Region',{'fontsize' : 'large'})
plt.ylabel('Average Price',{'fontsize':'large'})
plt.title("Type Average Price in Each Region",{'fontsize':20})
Verisetindeki Tiplerin Dağılımları

print(data['type'].value_counts())
plt.figure(figsize=(12,5))
sns.countplot(data['type'])
plt.show()
conventional    9126
organic 9123

 

Görselleştirmelerin Ardından artık, Prophet kütüphanesi ile zaman serisi analizine başlayabiliriz.

Öncelikle Prophet Kütüphanesi nedir? ne işe yarar? bu kavramlardan bahsedeyim,

1- Prophet Nedir?

  • Prophet, lineer olmayan eğilimlerin yıllık, haftalık ve günlük değişimlerine uygun olduğu bir katma modele dayanarak zaman serileri verilerini tahmin etmek için kullanılan bir kütüphanedir. Kısaca elimizdeki datalardan güncel çıkarımlar yapar. Bunu yaparken sklearn modelin’in API’nı kullanıyor. Prophete veri girişi her zaman 2 sütun içeren veri çerçevesidir. Ds ve y, bunlardan DS= tarihi, y= sayısal olarak tahmin etmek istediğiniz değeri temsil etmelidir. Aynı zamanda prophet diğer tahminleme mekanizmalarına göre eksik veriye ve kaymalara karşı daha sağlamdır ve daha iyi çalışır.*

Ardından Propheti Çağıralım.

 

from fbprophet import Prophet

df = data.loc[:, ["date","avprice"]]
df['date'] = pd.DatetimeIndex(df['date'])
df.dtypes

date       datetime64[ns]
avprice           float64

Bu Kısımda Veri Setimizi, Tahmin etmeyi hedeflediğimiz fiyat, ve gün olarak sınırlandırıyoruz., ardından date sutün’unu datetime olarak düzenliyoruz. ( Yukarıda da yapmıştık)

Prophet Kütüphanesinde Date ve Price(Hedeflediğimiz Sutün)’ların adları belli bir kurala göre değiştirilmesi gerekiyor. Date sutünü = ds, Hedef Sutün = y olarak düzenledikten sonra elimizdeki veriye bir göz atalım.

df = df.rename(columns={'date': 'ds',
                        'avprice': 'y'})

ax = df.set_index('ds').plot(figsize=(20, 12))
ax.set_ylabel('Monthly Average Price of Avocado')
ax.set_xlabel('Date')
plt.show()

Görselleştirmeden sonra prophet modelinin konfigürasyonunu yapalım.

my_model = Prophet()
my_model.fit(df)

future_dates = my_model.make_future_dataframe(periods=900)
forecast =my_model.predict(future_dates)


Modeli çağırdıktan sonra, artık ilk forecast’ımızı yapmaya hazırız.

fig2 = my_model.plot_components(forecast)

Ben burada prophet’in bize sunduğu grafiklerin dışında daha anlaşılır bir grafik oluşturmak istiyorum. Bunun için tahmin edilen değerleri bir veri olarak tanımlıyorum. ve bunları zamansal olarak sınırlandırıyorum. (Bu kısım ekstra biraz sizde üstteki grafikler ile yetinmek istemiyorsanız. Bu yolu tercih edebilirsiniz.)

forecastnew = forecast['ds']
forecastnew2 = forecast['yhat']

forecastnew = pd.concat([forecastnew,forecastnew2], axis=1)

mask = (forecastnew['ds'] > "2018-03-24") & (forecastnew['ds'] <= "2020-09-10")
forecastedvalues = forecastnew.loc[mask]

mask = (forecastnew['ds'] > "2015-01-04") & (forecastnew['ds'] <= "2018-03-25")
forecastnew = forecastnew.loc[mask]

 

Sınırlandırdıktan sonra artık görselleştirmeye hazırız. Bakalım elimizde neler var.


fig, ax1 = plt.subplots(figsize=(16, 8))
ax1.plot(forecastnew.set_index('ds'), color='b')
ax1.plot(forecastedvalues.set_index('ds'), color='r')
ax1.set_ylabel('Average Prices')
ax1.set_xlabel('Date')
print("Red = Predicted Values, Blue = Base Values")

KIRMIZI = TAHMİN EDİLEN DEĞERLER        MAVİ = ANA DEĞERLER

Bütün Kodlar’ın olduğu Kernele Erişmek için TIKLAYIN

Okuduğunuz için teşekkürler, Başka Analizlerde Görüşmek Üzere,

İlginizi Çekebilecek Diğer Yazılarım :

Yazar Hakkında
Toplam 7 yazı
Yunus Emre GÜNDOĞMUŞ
Yunus Emre GÜNDOĞMUŞ
Machine Trainer & Junior Data Scientist
Yorumlar (1 Yorum)
Hakan
Hakan Yanıtla
- 00:09

Aydınlatıcı bir çalışma. Emeğinize sağlık.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara