結婚式がどのぐらい延期されているか調べようとしましたが断念した。
tl;dr
ドキュメント読みましょう
どうやって調べるか
最近、本当にこの日に結婚式をあげて良いのか&周囲で結婚式が多いけどみんな延期しているのかというのが気になって不安になってきた。友人の話を聞くだけではサンプル数として少ないし、式場のプランナーに聞いても補正入りそうなので意味なし。なので世間的にどのぐらい結婚式が延期されているのか調べてみた。
てきとうに考えた結果、延期した件数と決行した件数の推移が欲しいと思った。そもそもどのぐらいの割合で結婚式を決行/延期しているのか、それらがコロナの1年間でどう推移しているのかが知りたい。
結婚式の延期は、結婚式はクローズドなイベントであるため一般的にはネットには載っていないと考えた。が、Instagramで試しにハッシュタグを検索するとハッシュタグが存在あるらしい。
結婚式の決行も同様に調べるとハッシュタグが出てきた。
この時点で、 #結婚式延期
の投稿が8万件、#結婚式決行
の投稿が1.5万件存在していることがわかった。単純な割合は 8:1.5。結構な割合で延期されている。。。ただしよく考えると1組の夫婦が、2回延期してその後決行しそれぞれのタイミングでインスタに投稿している場合、延期を2回・決行を1回しているしている計算になる。
ここで色々問題に気づいた
- よくよく考えると、そういう今までの累計で比較したデータははあんまり今の自分には意味がない
- 実世界では、1組の夫婦は延期を複数回行っている可能性がある
#結婚式決行
のハッシュタグは、決行を決めたタイミングから結婚式のタイミングまでずっとハッシュタグつけて投稿してそう
なので、結婚式延期の日毎の件数がどのように推移しているかを調べてみることにした。
InstagramのAPIで取得可能か調べた
Instagramが提供しているAPI(正確には、Facebookが提供するInstagramグラフAPI)を使えばハッシュタグを基に投稿を検索できる。グラフAPIエクスプローラを使ってタグを検索してみる
https://graph.facebook.com/v9.0/ig_hashtag_search?user_id=XXXXXXXXX&q=結婚式延期&access_token=XXXXXX
{
"data": [
{
"id": "17841541513099488"
}
]
}
このidはハッシュタグのIDを表す。このidをもとにハッシュタグの最近の投稿を取得するAPIを叩く
https://graph.facebook.com/v9.0/17841541513099488/recent_media?user_id=XXXXX&limit=50&c&access_token=XXXXXX
{
"data": [
{
"caption": "xxxx",
"timestamp": "xxxx",
"id": "xxxx"
}
],
"paging": {
"cursors": {
"after": "NGU2NzRkMTBmYmU4NDBmZAGJhYjVkNjMzYjQxOTYwODEZD"
},
"next": "https://graph.facebook.com/v9.0/17841541513099488/recent_media?access_token=xxxxxxx&pretty=0&fields=caption%2Ctimestamp&user_id=xxxxxx&limit=1&after=NGU2NzRkMTBmYmU4NDBmZAGJhYjVkNjMzYjQxOTYwODEZD"
}
}
captionに投稿文、timestampに日時、idに投稿を表す数値が入ってきたのでこれを収集することにした。
Node.jsで収集してCSVに
上記のAPIを使って、投稿を全てCSVに落とし込んだ
いつものts-node。csvに出力するだけ。typescriptの恩恵はあまりないコードで残念
import axios from "axios";
const createCsvWriter = require("csv-writer").createArrayCsvWriter;
(async () => {
// #結婚式延期
let targetUrl = `https://graph.facebook.com/v9.0/17841541513099488/recent_media?user_id=xxxxxx&limit=50&fields=caption,timestamp&access_token=xxx`;
let index = 1;
while (true) {
const response = await axios.get(targetUrl);
const postList = response.data.data;
if (postList.length===0) {
break;
}
const formeattedPostList = postList.map((post: any) => {
return [post.id, post.caption.replace(/\n/g, " "), post.timestamp];
});
const csvWriter = createCsvWriter({
append: true,
path: "log.csv",
header: ["id", "content", "timestamp"],
});
console.log(formeattedPostList);
await csvWriter.writeRecords(formeattedPostList);
const nextUrl = response.data.paging?.next;
if (nextUrl === undefined || nextUrl === null || nextUrl === "") {
break;
}
console.log("got to next page", index);
index++;
targetUrl = nextUrl;
}
console.log("end");
})();
実行した結果、230件ほど溜まった👏👏👏
スプレッドシートでグラフにしてみた
データが2日分しかない😇。どうやら最近の投稿は24時間分の投稿しか取得できないらしい。
Only returns media objects published within 24 hours of query execution.
https://developers.facebook.com/docs/instagram-api/reference/ig-hashtag/recent-media
反省
- ドキュメントはほんとによく読まないといけない
- 幾度となく同じことをやっているのでそろそろ自分が学んで欲しい
- データ取得元を考える作業やデータの有効性を考える作業がデータ分析の仕事っぽい気がした(低レベルすぎて怒られそう)
- もしかしたらこれ毎日実行すれば推移がわかるんちゃう?と思ったけど、ちょうどここでやる気がお亡くなりになったので終了