Foursquare Verileri ile Ankara Restoranları Mekansal Analizleri
--
TÜBİTAK BİLGEM YTE bünyesinde geliştirdiğimiz coğrafi büyük veri görselleştirme aracı BATUTA üzerinde analiz modüllerini test etmek için FourSquare kullanabileceğimizi düşündük ve Ankara restoranlarını görsel ve sözel çıktılarla analiz ettik. Bir süredir pandemi ile restoranların olumsuz etkilendiğini biliyoruz ve bunun bölgesel olarak nerelerde daha güçlü yaşandığı da belki görülmüş olur.
Hemen kimseyi sıkmadan analiz sonuçlarına geçeyim, verinin üretimi ve analizi ile ilgili teknik detay isteyenler yazının devamına göz gezdirebilir.
Üstteki bilgiler tamamen FourSquare’den İNDİREBİLDİĞİMİZ kadar verinin üzerinden analizdir. Hiçbir yorum yoktur ve doğruluğu ispat edilecek bir dayanak yok. FourSquare’de bol “like” almış olmak ne o mekanın kalitesini, gösterir ne de gerçekten sık tercih edildiğini. Ama bir yaklaşımdır diyebiliriz. Peki BATUTA ya da başka araçlarla bu şekilde analizler yapmak için neler yaptık?
Foursquare Api altyapısı zaman zaman değişse de ilgili veriyi çektiğimiz koda aşağıda linkten erişilebilir. Bu arada aylarca sabırla bu veriyi indiren çalışma arkadaşımızın hesabıdır ve ilgili uygulamayı zaman zaman güncelliyoruz, isteyenler projeyi takip edebilir.
https://github.com/oguzcanbudumlu/foursquare
Api detayına çok girmeyeceğim temelde bir bölge tanımlayıp bu bölge içinde kalan işletme — mekanları konumları ile indirebiliyorsunuz, daha sonra ilgili bir işletmenin yorum ve like bilgilerine ulaşabiliyorsunuz. Tabi verileri ücretsiz indirmek için günlük sorgu limiti var, limitlere takılmamak için ücret ödemelisiniz. Bu durumda sosyal medyanın para kazanma kaynaklarından birini öğrenmiş olduk ve oldunuz.
Sonuç olarak farklı “venue” tiplerinden restoranları seçerek Ankara kentsel yerleşim alanını kapsayan bir dikdörtgen sınır belirleyip, bu sınır içinde 1km kenarlı kareler oluşturduk. Her bir küçük kare için istekte bulunup, karelerin içerisinde kalan 12k küsür noktayı (uzunca bir sürede) indirdik. İşletme ismi, adresi, like ve toplam yorum sayısı bilgisine eriştik.
Bu veriyi görselleştirmede birkaç farklı gösterim metodu kullanılabilir. YTE Harita’da (https://yteharita.bilgem.tubitak.gov.tr/ ilgili haritayı coğrafi veri analizi ihtiyacı duyan tüm kullanıcıların erişimine açtık) hazır analizlerden nokta bazlı veride “like” bilgilerine göre nokta tematik gösterim, bubble gösterim, ısı haritası ve 2–3 boyutlu grid gösterimler mevcut. Görseller Uber Firması’nın geliştirdiği KeplerGL harita analiz aracı ve kendi geliştirdiğimiz harita araçlarıyla yapılabilir ki açık kaynak kodlu olduğu için KeplerGL mevcut projemizden ulaşılır durumda. Bu arada geliştirdiğimiz Yte Harita altyapısında MapLibre kullanıldı, nokta gruplama (aggregation) yöntemleri için TurfJs ve D3js kullanıldı.
Sonuç olarak noktalara eriştik. Noktaları diğer coğrafi objelerle ilişkilendirerek, daha anlaşılır ifadeyle ilgili işletmeler hangi yolda ve hangi mahallede oldukları da bulunabilir. Böylece yalnız nokta bazında değil yol ve mahalle bazında tematikler de üretilir. En çok “like” alan ve en çok işletme barındıran yol ve mahalle bu şekilde çıkarılabilir.
Farklı coğrafi veriler ve özellikle yol bilgisi OpenStreetMap’de mevcut ve farklı araçlarla bu veri edinilebilir. Osm verisi ülke bazında Geofabrik’den, belli bir bölge seçerek Bbbike’dan edinilebilir.
Bunun yanında ara yüz tarafındaki grid gösterim gibi veritabanında da gridler oluşturarak grid içine düşen noktalara göre analizler yapılabilir, böylece arayüze ya da analiz yapılacak uygulamaya noktaların tümünü yüklemeye gerek kalmaz. Bunu için güzel bir çözüm şurada;
https://github.com/imran-5/PostGIS-Grids
İlgili gridlere düşen noktalar için gerekli sorgunun aynısı mahalle verisi için yazının devamında var. Bu arada Ankara içerisinde gridler oluşturup her bir grid için FourSquare’den istek yapmak için de kullandık üstteki çözümü.
Tabi bundan çok daha iyi bir çözümü altyapımızda kullanıyoruz ama özet geçeyim, detaya girmeyeceğim. Uber H3 hexagon grid indeksleri. H3 sayesinde ölçek bazlı nokta gruplama yapılabiliyor, hem ara yüz hem sunucu tarafında entegre çalışıyor. Statik veriden üretilebildiği gibi akan bir veride de çalıştırılabilir.
Elimizde Foursquare’den gelen nokta veriler ve yollar var. Noktaların en yakın yol ile ilişkilendirilmesi gerekir. Burada birkaç iterasyon gerekiyor yollara 15 metre, 20 metre, 50 metre yakın noktalara yol bilgisi yazdırılabilir.
update fsq_points set rid = ankara_yol.gid from ankara_yol where st_dwithin(ankara_yol.geom,fsq_points.geom, 0.0015) and fsq_points.rid is null and fsq_points.id between n and n+1000
Buradaki 0.0015 değeri yaklaşık 15 metreye denk geliyor. Bu değeri arttırıp sorguyu tekrar çalıştırarak yola daha uzak noktaları da bir yola bağlamış olduk. n değeri de tüm tabloyu güncellemek yerine belli parçalaraa ayırmak için kulanılabilir.
Şimdi yol bazında işletme sayısı ve ilişkili işletmelerin toplam “like” bilgisini elde edelim.
select count, sum, adi, geom from (select count(1), sum(p.likes) as sum,r.adi, r.geom from ankara_yol r inner join fsq_points p on p.rid = r.gid group by r.adi, r.geom) as foo where adi is not null and sum > 0 order by sum desc
Bir de point-in-polygon analizi yapalım. Elimizde mahalle poligonları var, yola uyguladığımız benzer bir işlemi poligonlara da uyguladık. Bu sefer intersection kullandık, yani herhangi bir şekilde coğrafi ilişkisi (temas, teğet, içinde, vs.) olması sorgusu kullandık.
select sum(p.likes), count(1),l.gid,l.adi, l.geom from ankara_mahalle l, fsq_points p where st_intersects(l.geom,p.geom) group by l.adi, l.gid, l.geom
Bundan sonra yapılan iş liste, grafik ve haritaları oluşturan BATUTA üzerindeki hazır sorguları kullanmak oldu.