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
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 :
Aydınlatıcı bir çalışma. Emeğinize sağlık.