- 投稿日:2021-04-25T19:52:51+09:00
マインドフルネスの記事は新月にアップされるのが多いのか?を検証してみた!
はじめに 4日前にJavaScriptを始めたばかりの初心者です。 これがQiita初めての投稿です。 まだまだ未熟者ではありますが、これからも興味のあるものをどんどんアウトプットしていければと思っています。 ご指摘、アドバイスなどいただけると嬉しいです! 目的 ・Qiita上で「マインドフルネス」というキーワードを見つけたので、マインドフルネスに関連している記事がどれぐらい投稿されていて、その投稿している日が新月と関係があるかを可視化します。 ※私たちは少なからずとも月の影響を受けて生活をしていますが、新月の日は新月のパワーが背中を押してくれるため、何かにチャレンジしようとか、願いごとをするなどの影響を受ける人が多くなるため、記事を書くパワーと関係性があるのではないか?という単純な疑問からです。 サンプルコード キーワードは「マインドフルネス」の他に「mindfulness」や「瞑想」でも記事を取得しました。 const axios = require("axios"); async function main() { let response = await axios.get( "https://qiita.com/api/v2/items?per_page=100&query="+encodeURIComponent("瞑想"||"マインドフルネス"||"mindfulness") ); for(let i = 0; i < response.data.length; i++){ console.log(response.data[i].created_at); 抽出結果と考察 今回は意外にも対象件数が多かったので2020年1月~のデータのみを対象にしました。 グラフがちょっと見づらくなってしまいました。 ・新月の当日に投稿されてはいないものの、その近い日に投稿されているのがよくわかりますね。前述でも記載したように新月にはマインドが突き動かされるのだと考察します。 ・また、新月との関わりの他に第3回目の緊急事態宣言前にかなりの記事が投稿されているのもわかります。これは、「不安への対処法としてマインドフルネスが推奨される」というのも関係しているのではないかと推察します。 おわりに やりたいことがいっぱいなのに技術が伴わないため焦るばかりで、結局は授業で教わったロジックしか組めませんでした。(涙) 今後もいろいろな検証をしていきたいので、もっとスキルを磨いてチャレンジします!
- 投稿日:2021-04-25T17:56:34+09:00
QiitaAPIでユーザーの属性情報を抜いて”居住地”という切り口で考察してみる
はじめに 5年ほどまともな開発(≒プログラミング)から離れていたシステムエンジニアです。 久方ぶりにモノヅクリがしたいと殆ど開発経験のないJavaScript&APIの活用に挑んでいます。 生暖かい目でご覧ください。 目的 何をするにもやっぱり一人じゃ無理!ってことでQiitaには色々お世話になっています。 そのQiitaの偉大な先輩方は「どの辺に住んでいるんだろう?」ということで調べて行きます。 あと、せっかくモノヅクリやるんだから発信していかないとね!ということで、 Qiita投稿にも初挑戦です。 使用した環境 Visual Studio Code v1.55.2 node.js v15.12.0 axios v0.21.1 nodeplotlib v0.7.3 ユーザー情報を取得してみる 先ずはデータを見てみようということで、QiitaのAPI仕様を確認。 ユーザー情報の取得方法を探すと以下の記載がありました。 GET /api/v2/users 全てのユーザの一覧を作成日時の降順で取得します。 page ページ番号 (1から100まで) Example: 1 Type: string Pattern: /^[0-9]+$/ per_page 1ページあたりに含まれる要素数 (1から100まで) Example: 20 Type: string Pattern: /^[0-9]+$/ GET /api/v2/users?page=1&per_page=20 HTTP/1.1 Host: api.example.com とりあえず1件取得してみます。 const axios = require('axios'); async function main() { let response = await axios.get('https://qiita.com/api/v2/users?page=1&per_page=1'); console.log(response.data); } main(); 取得したデータを確認すると、ほとんど何も入っていない・・・ 作成日の降順でしか取得できないので、同じようなデータが続きそうですね。 なので、居住地が入ってるユーザーをピンポイントで抜き出すことを考えました。 それなりに読まれている記事を書いているユーザーの方が期待値が高いだろうということで、 記事のストック数で条件を付けて抜き出してみました。 書いたコードは以下の通りです。 const axios = require('axios'); const api_token = [自分のAPIトークン]; const per_page = 100; const fs = require('fs'); async function main() { var users = new Array(); for(let page=1;page<=100;page++){ //ストック数500以上の記事を取得 let response = await axios.get('https://qiita.com/api/v2/items?page=' + page + '&per_page=' + per_page + '&query=stocks:' + encodeURIComponent('>=500'),{headers:{Authorization: 'Bearer ' + api_token}}); //取得した記事データ分繰り返し for(item of response.data){ //記事の投稿者でユニークにしつつ、居住地が入っていないデータを除く if(users.indexOf(item.user.id)==-1 && item.user.location){ //配列にIDを追加 users.push(item.user.id); //ファイルにIDと居住地を書き出し try{ fs.appendFileSync("qiita_users.csv",item.user.id + "," + item.user.location + "\n"); }catch(e){ console.log(e); } } } } }; main(); これで750件程度の居住地入りユーザー情報を取得することができました。 可視化と考察 可視化にはnodeplotlibを使いました。 ※参考にした記事はこちら Node.jsでお手軽グラフ表示 どんなデータが入っているかをヒストグラム形式で可視化してみます。 const npl = require('nodeplotlib'); const csvSync = require('csv-parse/lib/sync'); const fs = require('fs'); //CSVファイルを読み込む let data = fs.readFileSync('qiita_users.csv'); let res = csvSync(data, { columns: true, skip_empty_lines: true }); let locations = new Array(); //居住地を配列に格納 for(item of res){ locations.push(item.location.trim()); }; //ヒストグラム形式に設定 const hist = [{ x:locations, type: 'histogram' }]; //描画 npl.stack(hist); npl.plot(); 結果はこのようになりました。 圧倒的東京率ですね。 「Tokyo」が多いのに加えて、「Tokyo~」や「東京~」みたいなのもあって、これらを統合するとかなりの割合を東京在住の方が占めているようです。 東京以外だと大阪や神奈川の方が多いようです。海外の方も居ますね。 個人的に気になったのが以下の3つ。遊び心に溢れていてステキです。 ・心の小宇宙・・・聖闘士の方でしょうか。 ・あざばぶ市・・・ぷりきゅあでしたか。。。ここは守備範囲外ですね。 ・のんほいパーク・・・愛知県豊橋市にある動植物園らしいです。私はお隣の三重県出身なのですが知りませんでした。 最後に 久しぶりのプログラミングで中々大変でしたが非常に楽しかったです。 今回はヒストグラムにして終わりましたが、折角居住地を取ったので地図を使った可視化にもチャレンジしてみたいですね。
- 投稿日:2021-04-25T17:21:17+09:00
よそ様の情報を簡単に参照できるWEBAPIが本当に簡単なのか体験してみた。
WEBAPIとやらを使うと簡単に情報を参照したりサービスを受けられるというので体験してみました。 今回、Qiitaのアカウントも作ってみたので、やってみたことを投稿します。 1.やってみたかったこと WEBAPIを使うと簡単にインターネット上の情報を参照したり、サービスを受けたりできるらしいが、本当に簡単なのか体験してみたい。 具体的には、Node.js+axsiosを使って、今後お世話になるであろうQiitaのWEBAPIを呼んでみる。 2.Qiitaの記事一覧を呼び出してみた APIリファレンスを参考に、記事の一覧を取得してみる。 API.js const axios = require('axios'); async function main() { let response = await axios.get('https://qiita.com/api/v2/items?page=1'); for(var i in response.data){ console.log(response.data[i].title); //記事のタイトル } } main(); たったこれだけのコードでQiitaのサーバから記事の一覧(タイトル)を取得できた!これは本当に簡単だわ。 これは面白い!といろいろ呼びまくっていたら、なにやらエラーしか返らなくなった。。。 3.認証しないといろいろ実験できないぞ! さすがに、「だれにでも」「いくらでも」は使わせてくれないようです。 APIリファレンスに以下の記載が。 利用制限 認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます 認証をしないとトライ&エラーできない。初心者なので、めちゃめちゃトライ&エラーしてしまいました。。。 Qiitaさんよくわからずめちゃめちゃ叩いてごめんなさい。 というわけで認証しました。(アクセストークンを取得する) 1.Qiitaの設定画面 2.アプリケーションをクリック 3.新しいトークンを発行をクリック 4.アクセストークンを発行する 5.呼び出すときに、↓こんな感じにする。 XXXXXに発行したアクセストークンを設定する。 Auth.js const axios = require('axios'); async function main() { let response = await axios.get('https://qiita.com/api/v2/items?page=1', { headers: { 'Authorization': `Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` } }) for(var i in response.data){ console.log(response.data[i].title); //記事のタイトル } } main(); これでお試しが捗るようになりました。 4.WEBAPIは簡単に情報を参照できるけれど、なんでも参照できるわけではない。 せっかくだから何か作ろうと思って妄想してみた ・人はだいたいどれくらいの期間でQiitaに投稿しなくなるのか?を分析し、自分の今後のQiitaLifeに活かす!とか。 →APIリファレンスを参照してみたけれど、必要な情報がとれなそうな。。 ・どんな投稿をきっかけにフォロアーがつき始めるのか?ターニングポイントみたいなのがわかると面白そう →おなじくそこにたどり着くためのデータがとれなそう??? ・などなどいろいろ妄想してみたり、データをとってみたりしたのだけれど、 QiitaのAPIだけでは必要な情報を参照できない様子。もうちょっと時間をかけて調べたら意外といけたりするのだろう。 そんなこんなで、「WEBAPIがあればなんでもできちゃう!」わけではないということがわかった。 こんなデータ欲しいのだけれど、、とお願いすればAPIを作ってくれるのかしらね。 5.というわけで、とりえあず作ってみた。 つくったもの これから「くる」タグ発見機。 タグについては、 ・フォローしている人数、 ・タグがつけられた記事の数 などがAPIで参照できるようなので、これらの数値を統計・分析することで 「 このタグ来てるぜ!くるぜ!を早期検知して、トレンドを先取りだ!うしし」 としたいぜ! ただ、、取得できるのは履歴ではなく、現時点(ナウ)のようにみえるので、とりえあず蓄積してみることにした。 axiosでQiitaから情報を参照して、node-adodbというライブラリを使って、パソコン内のmdb(MS-Access)に保存することにした。 これを毎日エージェントかなにかで定期実行して、日ごとの値の変化を別途解析する!という考え方だ! なかなかしょぼいぜ! TAG.js const axios = require('axios'); const ADODB = require('node-adodb'); const connection = ADODB.open('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DB.mdb;'); async function main() { //TAGの情報を保管した日付を取得する(処理日) var date = new Date(); var year_str = date.getFullYear(); var month_str = 1 + date.getMonth(); var day_str = date.getDate() //見やすいように日付をフォーマット var format_regdate = 'YYYY-MM-DD'; format_regdate = format_regdate.replace(/YYYY/g, year_str); format_regdate = format_regdate.replace(/MM/g, month_str); format_regdate = format_regdate.replace(/DD/g, day_str); //タグの一覧を取得する ひとまずお試しで100件とってみよう。 let parm = 'https://qiita.com/api/v2/tags?page=1&per_page=100' let response = await axios.get(parm, { headers: { 'Authorization': `Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` } }) //取得したタグ一覧(レコード)からタグの情報を取得 for(var i in response.data){ let id = response.data[i].id; //タグID=タグの名称 let items_count = (response.data[i].items_count); //タグがつけられた記事の数 let followers_count = (response.data[i].followers_count); //タグをフォローした人のかず //データベース(TBL1)のスキーマ TAG,RegDate,DocCount,FolCount// //とりあえずDBに保存しよう。 connection.execute('INSERT INTO TBL1 VALUES ("' + id + '","' + format_regdate + '",' + items_count + "," + followers_count + ');'); } } main(); 素敵な統計理論(?)をつかって、「これから来る!」をロジカルに発報してほしいのだが、その手の知識なんて持ち合わせているわけがなく、、 ・とりえあずDB(MS-Accedd)を参照して、 ・「タグ付けされた文書数」が前日よりも大幅に増えていたら発報する テーブルぐりぐりscriptを別途作成。ぐーりぐーり、、、 結果(テストデータ使用) うーん 効果は皆無だ! こんなんじゃ、うしうしでけない!! データ分析のスキルも欲しいものですなぁ。 そんなこんなしているうちに、本日はタイムアップ!!! おつかれさまでしたー 感想 ・APIで情報を取得するのは意外と簡単。でも、ほしい情報がサクッと取得できるわけではないので、目的達成までの道のりは簡単ではない ・Markdown記法を初めて使った!こっちのほうが実は新鮮な体験だったりして・・・ こうやってるのねマークダウン。