Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

前回の投稿ではJavaOneへの行き方を中心に書きました。今後数回に渡っていくつかのセッションの内容を紹介します。

Building Angular 2 Applications in Java 8

チュートリアルセッションです。Angular 2とGWT、Spring Bootでアプリケーションを作るには、という内容でした。スライドはこちらにあります。
http://lteconsulting.fr/angular2boot-javaone/#/
Angular 2とGWT 2.8を使う際の問題点と解決策が中心となっています。

内容

Angular 2はJavaScriptに加えてTypeScriptをサポートしている。Modules、Components、Dependency Injection、Change Detectionが基本的なものである。さらにJSR-269のPluggable Annotation Processing APIを使ってコードを生成する。バックエンドは、シンプルで強力なSpring Bootを使う。

GWTは今のWebからは遠いところにあるものなのは事実だ。GWTにあるものは、以下のもので置き換えられる。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-12-59-15

ただ、GWT 2.8は将来の過渡期にある。

  • JsInterop
  • Java 8対応
  • Widgetや古いものをなくす

GWT 3はJ2CL (Java to Closure) となり、今標準となっている多くの機能をなくす。

GWTはモダンで最適化されたJavaScriptへコンパイルしてくれる。JsInteropはJavaScritpとJavaコード間を双方向で統合する。JavaScriptのXMLHttpRequestは以下のようなJavaクラスとなる。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-13-16-14
これを次のように使うことができる。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-13-16-27
そしてSuper Dev Modeには開発用の早いインクリメンタルなコンパイラがある。

JSR-269のPluggable Annotation Processing APIでは、独自のアノテーションプロセッサを登録する。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-13-23-34

そして、Angular2GwtというGWTとAngular 2を統合するライブラリを使う。 Angular2Gwtがすべてやってくれる。User moduleなしのGWTのコンパイルは早い。アプリケーションに依存ライブラリを1つ足すだけでできる。

アーキテクチャは次のようになる。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-13-28-11

デモアプリケーション

セッションではデモもありました。デモのリポジトリはこちらです。
https://github.com/ltearno/angular2boot-demos

デモアプリケーションはいくつかあります。ここではセッションで実行していた”my-first-tree-orchard”を動かしてみましょう。

$ cd my-first-tree-orchard
$ mvn spring-boot:run

僕の環境ではjava.lang.IllegalArgumentException: Can not copy a non-root Methodが出ましたが、起動しました。http://localhost:8080/にアクセスすると、”Application is loading”が出た後、次の画面になります。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-13-53-23

あとは”Roll 6 faces dice”ボタンを押せば動作します。

さて、target/generated-sourcesディレクトリを見ると、コードが生成されています。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-29-14-00-06
ライブラリがPluggable Annotation Processing APIを使って生成したコードですね。

このままではコンポーネントのテンプレートを変更しても、即座に反映されません。Super Dev Modeを使ってみましょう。spring-boot:runはしたままで、別のウィンドウを使って同じディレクトリで次のコマンドを実行します。

$ mvn gwt:run-codeserver
...
[INFO] Super Dev Mode starting up
...

Super Dev Modeが起動しました。画面をリロードします。”Compileing Application”と表示されるようになります。

最後に、起動時のjava.lang.IllegalArgumentException: Can not copy a non-root Methodですが、古いバージョンのSpring Loadedの問題のようです。angular2boot-demosディレクトリにある親pom.xmlのspringloadedを1.2.0から現時点で最新の1.2.6にすると、例外は出力されなくなりました。

感想

Angular 2にもGWTにもほとんど知識はありませんでしたが、おもしろいアプローチではあると感じました。現時点ですぐにJavaにすべてを寄せるアプローチを使う予定はないのですが、こういった方法もあることは知っておいてよいですね。



Hello world! コンテンツ・メディア第1事業部のjyukutyoこと阪田です。

私は昨年に続き、今年もJavaOneに参加しました。

JavaOneとは

JavaOneをご存知の方はここは読み飛ばしてくださいね。

JavaOneは、オラクル社(以前はサン・マイクロシステムズ)が1996年から毎年開催している、Javaに関する最大級のカンファレンスです。サンフランシスコで5日間、400以上のセッションがあります。朝から晩までJavaに浸っていられる、夢のような内容となっています。

毎年9月、10月といった秋に、ユニオンスクエアの近くにあるヒルトンやPark 55といったホテルや、国際会議場モスコーン・センターを会場としています。なお、同時にオラクルのOpen Worldというカンファレンスも開催されています。ビジネスとしてのメインはOpen Worldの方ですね。

モスコーン・センターは道を封鎖して、期間中ずっとイベント会場となっています。
img_2211img_2212

英語について

海外のカンファレンスに参加する際に、私も含めみんなが気になることは英語だと思います。もちろんまったく下地がない状態でセッションの英語を聴くのはおそらく難しいです。ただ、普段から技術文書を少しでも英語で読んでいて、セッションの対象となる技術分野をある程度知っていれば、スライドの文章もあるので大まかには理解できます。

私自身は海外留学の経験もなく、英語が話せるわけではありません。ですがJava Magazineを英語で読んでいたこと、去年参加してからNHKラジオのストリーミングを毎日聴いていたことで、昨年より聞き取ることができるようになりました。

費用について

次に気になる点は費用だと思います。参考までにだいたいの費用を載せますね。

飛行機

日本からサンフランシスコへ直行便を利用すると、2016年9月現在では往復15万円ほどかかります。飛行時間は行きが10時間、帰りが12時間です(関西空港-サンフランシスコ国際空港)。

なお、乗り継ぎ便を利用すると、現実的な乗り継ぎで10万円となり、5万円抑えることができます。私は今年香港経由でサンフランシスコへ行きました(業務での出張ではありましたが)。直行に比べて7時間ほど余計にかかりました。ただ、行きは朝早くの出発、帰りは深夜出発で、とても時差調整がしやすかったです。行きのサンフランシスコ到着時間や帰りの関西空港到着時間も、直行便を利用するときとほぼ同じで出発時間が早くなるだけです。すると帰りの1日分宿泊費がかからないため、ホテル代2,3万円を抑えることができます。

想定費用:10万円〜15万円

img_2198

ホテル代

サンフランシスコは大変物価が高いところです。ホテルも同様で、通常でも日本のビジネスホテルより設備が悪いところが1万円以上します。そして、数万人集まるOpenWorldとJavaOneの期間中は、ホテル代が高騰します。最低でも1泊2万円はかかると考えてください。ただし、安くて会場に近いホテルはすぐに埋まるため、よほど早く準備するか、会場からとても遠いホテルでないとこの価格では泊まれないと考えてください。

私は1ヶ月前にホテルを予約しましたが、会場から5分のところでやや広い部屋しかなく、1泊3万5千円でした。会場からかなり遠いところであれば、2万5千円もあります。Uberを使えば20ドル前後で会場まで移動できるので、その方法を使うのも一手です。その分移動に時間は取られてしまいますが…

宿泊期間は土曜日から金曜日まで、6泊となります(日曜日から木曜日の夕方までが開催期間)。前述の通り、木曜日の夜便を使えば5泊にできます。

想定費用:13万円〜20万円(3万円前後 * 5,6泊)

img_2200

パス代

JavaOneのパスは、直前に購入すると2050ドル、つまり20万円以上します。ですが、早期に購入すると割引があります。登録開始から1ヶ月ほどは、1650ドルでした。4万円抑えられます。ただ、まだJUGディスカウントもあります。JUG、つまりJavaユーザグループにはディスカウントコードが発行され、それを使うとさらに200ドル安くなります。JavaOne登録開始から数ヶ月経った後JUGに配布されますので、日本のJUG、JJUGあるいは関ジャバのTwitterアカウントをフォローしておくとよいかと思います。関ジャバの会長は私ですので、私に直接問い合わせていただいても大丈夫です。

ただし、スピーカーになればパスが無料でもらえます!スピーカーは公募制、Call for Papersを通過すれば誰でもなることができます。

このパスには、月曜日から木曜日のランチ、日曜日の夜のWelcomeレセプション、水曜日の夜のAppreciation Eventが含まれます。食事代がいくらか浮きます。

想定費用:15万円〜20万円

総費用

合計すると安くても38万円となります。安くはない金額ですね。また、食事も高い物価の影響で、ファーストフードであっても10ドルはします。レストランでは30ドルは見ておいたほうがよいです。

どんなことが得られるのか?

まず、日本でこの規模のカンファレンスはありません。そして、JavaOneには世界各国から人が集まってきています。日本人とか外国人とかそういったものは関係なく、すべての人が英語で発表し、質問もします。日本語母語の人も、英語でスピーカーをしています。これが世界的には普通だという感じられます。みなネイティブのように話すわけではありません。きれいな発音でなくても、堂々と大きな声で質問しています。参加すれば、きっと自分もそうなるのが普通であり、これからも技術と英語を深めていけばそうなる、と思えます。これは、言葉で読むよりももっと大きなインパクトです。私は若い方ではありませんが、とても大きな体験でした。できる限り若い年齢で行ってみれば、さらに大きな体験となります。少し無理をしてでも、ぜひ行ってみてほしいです。

もちろん、JavaやJVMの最新情報を手に入れることができます。それだけでなくJava Platform GroupチーフアーキテクトであるMark Reinholdさんなどに直接質問できるQ&Aセッションもあります。また、JCP(Java Community Process)メンバーになっていれば、夜に会員限定のパーティもあり、各国のJUGメンバーやJava Championに話かけることができます。こういったことは、ここに来ないとできません。

ただ参加するだけではそう得られるものはありません。年間を通じてJavaコミュニティに関わっていればいるほど、JavaOneで得られるものは指数関数的に大きくなります(私自身もまだまだです)。JavaOneとJavaコミュニティへの参加を通じて、フィードバックサイクルを回しながら進めば、とんでもないところに行けるのではないかと思っています。

次回予告

次回からは時系列順ではなく個別のセッションをいくつかピックアップして記事を書いていきます。お楽しみに!



AWSにはS3やCloudFrontという良いものがあり、サーバーを持たぬ者でも静的コンテンツを大規模に効率良く配信する事が可能です。
S3は大容量のコンテンツサーバー、CloudFrontは多拠点型のキャッシュサーバーで、共にAWSのサービスです。
一昔前はこのような事ができるのは一部の人間に限られており、良い世の中になったなあと思います。

S3とCloudFrontで静的コンテンツを扱うと、コンテンツ更新時のキャッシュコントロールに難しさがあります。
「新しくファイルアップロードしたのに、なんでヒョージ変わらへんねん」というアレです。
CloudFrontのキャシュの生存期間はコントロール可能で、TTLの設定を変えてみたり、AWSのコンソールでキャッシュの削除(invalidation)したり。
色々方法はありますが「コンテンツが更新されたら、キャッシュも更新される」をLambdaで自動化できるっぽいのでやってみました。

Lambdaとは

Lambda(ラムダ)を使うと、AWSで起こる色々なイベントを起点にプログラマが書いたプログラムを実行する事ができます。
プログラム実行に使うコンピュータをプログラマが意識する必要は無く、むきだしのサーバーはAWSに隠蔽されている事から「サーバレス○○」だ!と呼ぶ人もいます。
Lambdaはトリガー的に使えるので、invalidateを自動化するプログラムを書けばなんとかなりそうです。

 

 

ロールの作成

Lambdaの実行とCloudFrontの操作が必要になるので、これが可能なロールをIAM(権限コントロール)から作成しておきます。

Lambdaの実行権限から

cf5

ラムダ基本実行権とCFへのフルアクセスを選択します。

cf8
こんなかんじのロールができればオッケーです。

cf10b

LambdaFuntionの設定

AWSコンソールからLambdaFunctionの作成へと進みます。
BluePrint(一般的な利用用途のテンプレ)を使わずに「Configure triggers」に進みます。

cf1
AWSのどのサービスでどのような状態変化が起こった場合にトリガーを発動するのか、を設定します。
ここではS3を選択します。

cf1-5
「furyu-sandbox」というS3バケットに「拡張子がjpgのファイルが作られた(Object Created(All))」場合の設定はこんなかんじです。

cf2
いよいよラムダ関数の登録です。

実行環境はPython2.7を選択します。
コードは下記をそのままコピペして、XXXXXXXXXXの箇所をCFのディストリビューションIDに書き換えます。

 

print()された文字列は、CloudWatchでログとして出力されます。(後述)

先ほど作成したロールを選択します。
こんなかんじになります。

cf11
作成したLambdaFunctionの実行とモニタリング

ファイルS3バケットにアップロードし、反応を観察してみます。
S3へのファイルのアップロード後、作成したFunctionを選択して「Monitoring」タブを選択します。
LambdaFunctionの実行状況が確認できます。

cf12
「View Logs in Cloud Watch」で、詳細なログを確認できます。

cf13

printの内容やエラーもここに出力されます。

cf14

 

CloudFrontの対象ディストリビューションのInvalidationsタブにInProgressが見えます。

cf15

キャッシュ削除が起動された事が確認できます。

 

「雲の上のクラウドに向かってラムダ式を唱えると全ては計算された。サーバーから開放された人々は最も人らしくなった」
ミステリアスなイメージを持つラムダですが、利用用途は無限、うまく使うとAWSと仲良くする事ができます。
日宇


Posted bySatoKeita

2016年09月27日

SatoKeita

SPAJAM決勝に参加しました

カテゴリ
参加レポート

はじめましての方も、そうでない方も、こんにちは。フリューの佐藤こと、ジョンです。
遅くなりましたが、SPAJAM決勝戦に参加してきましたので、ご報告です。
予選については、こちらをご覧ください。SPAJAMについては、http://spajam.jp/をご覧ください。

予選から本戦にむけての準備

以前の予選を踏まえ、振り返ってその対応を試みました。

  • そもそもツールが使いこなせていなかった
    • 勉強するのにも時間が足りないため、使い慣れているツールに変更しました
  • アイデアが少し弱かった
    • 予めアプリの方向性を考えておく。今回はVRを使ったアプリにしていこうという方向性

果たしてこの方法が正しいことなのかは、さておき。
今度はディスプレイを持たず、新調してもらったMacBookをもって出発です。

本戦当日

会社の都合上、前日は金沢の旅館にいましたので、朝早く北陸新幹線で移動となりました。旅館から、旅館へ。温泉から、温泉へ。
向かう先は、埼玉県熊谷市ホテルヘリテイジ 四季の湯温泉です。
熊谷までつくとSPAJAM用の臨時バスが来ましたので、それに乗りました。

本戦会場は地下でした(高所恐怖症の方は安心です)

会場の雰囲気

荷物をとりあえず置いてから、別部屋に移動後、各チームの紹介、テーマ発表、アイデアソンという流れでした。
この辺りはニコニコ生放送でも放送されていたようです。
DSC_0817[1]

浴衣来てますが、すぐ脱ぎます。テレビ用ですね。
お昼もおいしく頂きました。ビールも提供されていました。ですが、流石にこの後二日間あると思うと飲めませんでした。

一日目の昼食
今回のテーマは「」でした。
予選よりも抽象度が高く、アイデアソンでのアイデア出しは、困難を極めました。

単純に音を鳴らす、ということではダメだろうという話はチームでも出ていましたが、打破する案も浮かばず。
ということで、前準備で考えていたVRを使った○○ということで、無理矢理にでも進めました。

各人の担当は、前回とほぼ同じくではありますが、今回はVRと言うことで、OpenGLを使ったプログラミングです。
行列の計算やシェーダの実装などを行いました。テーマに沿うように、音声認識もつかいました。

OLYMPUS DIGITAL CAMERA

目の前に温泉がありつつも黙々と作業をしていきます。
1日目の夕食、2日目の朝食、昼食……と食事はすべて用意されていたので、ありがたかったです。

予選と同様に、時間がないうちにどれだけ完成に近づけるか、プレゼンで発表される部分を意識して作成をしていきました。
そして、やはり予選と同様に、最終的には各自、自分の担当範囲だけではなく、今何が足りていないのか、時間が決まっているなかで、何ができて、何ができないのかを考え行動していけていました。

2日目の夜には、各チーム作成したアプリのプレゼンテーションをしました。その後、懇親会も踏まえ実際にアプリを触ってもらえる実演会が用意されていました。
同時に他チームの方との交流もでき、アプリも触ることができました。

他チームも、技術レベルが高くおもしろいアイデアのアプリを作られていました。もちろん、プレゼン途中でアプリが動かなかったりなどのハプニングもあり、同時にハッカソンの難しさを味わいました。

そして、時間が過ぎると、ハッカソンイベントの主要部は終了となります。

ようやく温泉にありつけました。部屋も用意されてあります。
ちなみに、温泉に入るタイミングは自由ですし、皆がアプリを必死で作成している間に温泉に入っても何も問題ありません。

成果物について

今回作成したアプリは、以下です。

logo01

音(歌)から広がる世界を楽しめるアプリというコンセプトで進めました。子供向けのVRという、将来的な展望も兼ねていました。
VRゴーグルは、Google Cardboard V2です(目はデザイナさんに描いてもらってます)。こちらを装着してVRの世界を見て回ります。

img_20160914_191945

始める前にまずBGMを選択します。

screenshot_20160914-172114

そうすると、そのBGMにあったVRの世界が表示されます。
スマートフォンには2つの画面が表示されますが、VRゴーグルを通すと2つの画面の差分により立体視ができます

screenshot_20160914-172727

技術的な部分としては、先ほど書きましたが3DCGを描画するためにOpenGLを使用しています。
他には、GoogleのCLOUD SPEECH APIを使っており、特定のキーワード(例えばリス、くま、など)に対して中の動物たちがリアクションを取ってくれたり、音楽が変わったりします。

結果

結果発表は、プレゼンテーションから夜が明けた3日目。会場を東京浅草にある HULIC HALLに移し行われました。
その前に、結果発表の前にドローンを使っての写真撮影をしました。すごかったです(詳しくは http://spajam.jp/final/result/ に動画がありますのでこちらを参照ください)。

本戦計12チームがありましたが、結果

ファイナリスト賞

を頂きました。大文字で書いておきながら、残念ながら、いわゆる参加賞です。

審査員の方から評価を聞いたところ、やはりアイデアでの点で弱かったようです。

ちなみに、最優秀賞は ちゅらゴンズさん の 音録(オドロク)でした。

感想

業務ではWebアプリケーションを触っており、スマートフォンのアプリ開発に携わることがありませんでした。
しかし、今回の予選から本戦までを体験でき、以下の知見を得ることができました。

  • 会社の中でも特に関わりが少ない人とのチームを組めた(大きな組織になってくるとなおさら!
  • 今までやったことのない技術を使う機会があった(特に本戦で使用した音声認識は個人的にはとても興味深く、業務にも活かせそう
  • 社外の方との交流を持てた(名刺は持って行きましょう!

以上いろいろありましたが、プラスしか無いです。(もちろん、疲れたとかはありますが
興味のある方は、次回SPAJAMに参加してみてください!

%e9%9b%86%e5%90%88%e5%86%99%e7%9c%9f


Posted byaraki

2016年09月26日

araki

SQLBriteの紹介

カテゴリ
Android

コンテンツ・メディア第1事業部の荒木です。ピクトリンクというプリントシール画像を使ったアプリのAndroid版を開発しています。今回は、RxJava好きのAndroid開発者なら知っておきたいライブラリSQLBriteの紹介をしたいと思います。

SQLBriteとは?

https://github.com/square/sqlbrite

SQLBriteは、Android端末内のデータベース管理に使われるSQLiteOpenHelperをラップするライブラリです。最大の特徴は、テーブルに対するSQLクエリをRxJavaのObservableとして購読できることです。対象のテーブルに変更があるとSQL文が再度実行されて結果が流れてきます。これによって、テーブルのデータをストリームのように扱うことが可能になります。

 

使い方

ダウンロード

build.gradleのdependenciesに以下の行を追加してください。2016/09/15時点の最新バージョンは0.7.0です。

BriteDatabaseの取得

まずは、SQLiteOpenHelperをラップしているBriteDatabaseを取得します。

SQLBrite#wrapDatabaseHelper(helper, scheduler)メソッドでBriteDatabaseを取得できます。第1引数のhelperには、SQLiteOpenHelperを継承した自作クラス(ここにテーブルの作成やマイグレーション処理を書く)を入れます。第2引数にはテーブル変更の通知を行うスレッドを指定してください。通常はSchedulers.io()で良いと思います。

クエリの購読

クエリの購読には、BriteDatabase#createQuery()メソッドを利用します。

たとえば、usersテーブルの全てのレコードを取得するSQLクエリを購読する場合は、以下のようになります。insert、update、deleteなどでusersテーブルに変更があるたびに、call(Query query)メソッドに実行可能なクエリが流れてきます。

( https://github.com/square/sqlbrite#usage より引用)

 

また、mapToList(Func1<Cursor, T> mapper)メソッドを使うとクエリの実行結果がCursorとして流れてくるので、エンティティへの変換処理を書いてやれば購読時にエンティティのリストを得ることができます。

結果が1件だけの場合はmapToOne(Func1<Cursor, T> mapper)メソッドを使えば、単一のエンティティに変換できます。

Pros / Cons

私の考えたSQLBriteのメリット(Pros)とデメリット(Cons)です。

Pros – 画面間のデータの共有に使える

たとえば、画像などのコンテンツにユーザーがコメントしたときに、その画像を表示している全ての画面でコメントを更新したい状況を考えます。SQLBriteを使って、コメントテーブルに対するSQLクエリを購読すれば、コメントの追加(insert)、修正(update)、削除(delete)に対して全ての画面で最新の状態に更新することができます。また、RxLifecycleと併用すれば、Activityが破棄されている場合は変更イベントを受け取らず次の生成時に再購読する、というようにActivityのライフサイクルに対して安全に通知を受け取ることができます。

Cons – SQLを書くコスト

SQLBriteはORMライブラリではないので、データを取得するために、いちいちSQLを書く必要があります。これまでORMを使っていて、そこから乗り換える場合はSQLの学習コストがかかると思います。私はSQLBriteのシンプルさが好きですが、人によってはORMのような手軽さがなくて苦手かもしれません。このあたりは好みの問題だと思います。

まとめ

この記事では、SQLiteのテーブル変更をストリーム化するライブラリSQLBriteを紹介しました。RxJava好きの方は、ぜひ実際に使ってみてストリームの気持ち良さを味わってください。



コンテンツ・メディア第1事業部の荒木です。ピクトリンクというプリントシール画像を使ったアプリのAndroid版を開発しています。最近、AndroidAnnotationsのDependency Injection部分をDagger2に移行したので、そのレポートを書きたいと思います。技術的な話よりも、なぜ移行に踏み切り、どのように進めていったかという過程について詳しく書いていきます。

移行する理由

AndroidAnnotationsとは、コード量を削減して開発効率を上げることを目的としたライブラリです。アノテーションをつけることで、さまざまなコードを自動生成してくれます。ピクトリンクのAndroidアプリでは、View Binding、クリックリスナーの設定、savedInstanceStateの管理、画面間の値渡し、Dependency Injection (以下、DI) にAndroidAnnotationsを利用していました。実際、コード量の削減に大きく貢献しているように思います。

 

では、なぜAndroidAnnotationsから移行するのか。一番の理由は、AndroidAnnotationsの影響範囲がアプリケーション全体に及んでいたからです。一つのライブラリの影響範囲が広いと、もし何らかの理由(人気が低下して更新がなくなる、他のライブラリとの相性が悪いなど)でそのライブラリ使えなくなった場合、アプリケーション全体に影響してしまうので大きな技術的負債となってしまいます。そこで、AndroidAnnotationsの各機能を少しずつ他のライブラリに移して影響範囲を減らしたいと考えました。もともとDI機能の一部にDagger2を導入していたので、今回はAndroidAnnotationsのDI部分を全てDagger2に移行することにしました。

 

また、

  • ビルド時間の増大
  • Hoge_のような Hogeを継承したクラスが自動生成される → 自動生成されたクラスを意識する必要がある

といった点も移行の理由として挙げられます。

移行の流れ

AndroidAnnotationsの@Bean@RootContextによってクラスやContextをインジェクトしている部分をDagger2を利用したコードに置き換えていきたいと思います。

前提

私の所属するチームでは、GitおよびGithubでコードを管理しています。書いたコードは、必ずPull Request(以下、PR)によるレビューを通してからプロジェクトにマージするというルールで開発をしています。今回は、PRを作成するときや、継続的にコミットするために意識したことを書きたいと思います。

方針を示すPRを作成する

完全に移行が完了した状態でPRを投げた場合、

  • 差分が大きくてレビューが大変になる
  • 指摘があった場合、修正箇所が大きくなる

といった問題が出てくると考えたので、まずは一部の画面にだけDagger2を導入したPRを投げることにしました。実際に投げたPRのメッセージは以下です。

Dadder2導入のPR

今後のコードの書き方に大きく影響するので、他のメンバーに受け入れてもらえるように目的や動作について詳しく書きました。

継続的にコミットを進める

PRが無事マージされたので、次は移行作業に入りました。対象クラスが多くて一気に移行するのは難しい状況だったので、毎日少しずつ移行していくことにしました。一度パターンができてしまえば、移行作業は単純作業の繰り返しでつまらないものです。そのため、日々の業務の中でコツコツ進めるのはモチベーションの維持が大変でした。

そこで、1クラスだけ移行した状態でPRをあげて、PRのメッセージに移行すべきクラスのリストを作り、完了したものにチェックをしていくようにしました。こうすることで、いくつ終わったか、いつ終わりそうかが目に見えるようになったので、モチベーションを維持しながら毎日コツコツと移行を進めることができました。

Inject完了リスト

さいごに

この記事では、Androidアプリ開発をする中でAndroidAnnotationsから移行する判断に踏み切ったこと、そして段階的に移行作業を進めたことについてレポートしました。一度に全てを移行することを考えると終わりがないように見えますが、段階的に取り組むことで確実に前に進むことができると思います。千里の道も一歩からという言葉があるようにリファクタリングも一歩ずつ確実に取り組んでいく必要があると感じました。今後は、View Bindingの部分や画面間の値渡しに対して、リファクタリングを進めていきたいです。



こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、前回のブログで紹介したデータマイニング用のデータを用いてよく行われているデータマイニング手法を紹介します。

 

前回紹介した準備したデータの5種類は、以下の通りです。

①ユーザーのイベントデータ

②ユーザーのステータスデータ

③ユーザーイベントの定期要約データ

④ユーザーのステータスの時系列変化

⑤システム要約データ

上記の5種類のデータを使って、どのようなデータマイニング手法を用いてユーザー分析をしているかを説明します。

ユーザーイベントデータ

ユーザーイベントをそのまま使える分析手法としては、アソシエーション分析があります。

①アソシエーション分析

ユーザーが同時に、あるいは一定の期間内に行うアクションを抽出するマイニング手法です。Aアクションを行うユーザーはBアクションも行うような関連性のあるアクションを洗い出します。例えば、サービス内では、Bアクションを増やしたいという施策を考えています。その場合、ユーザーが同時にしている他のアクションを分かっていれば、Bアクションの動機が何かを把握できたり、Aアクションを促進することによって、Bアクションを増やしたりすることが可能になります。アソシエーション分析によく出る例としては、スーパーマーケットの買い物で、ビールを買うユーザーは同時に子供用のおむつも購入するという有名な例があります。同時に何を購入する把握することで、スーパーの品物の並べ方を効率的に計画できます。アソシエーション分析は、R言語のarulesパッケージを使って実施できます。

ユーザーイベントはそのままアソシエーション分析以外のデータマイニングに使うのは中々難しいです。データマイニングは、基本的に説明変数を基に色々分析を行う。ユーザーイベントは用いて、ユーザーの特性を定義できるように変数化する必要があります。

ユーザーのステータスデータとユーザーイベントの定期要約データ

ユーザーのステータスデータとユーザーイベントの定期要約データには、大きく以下のような種類の分析手法に使います。

①予測分析

予測分析とは、ユーザーの現在のステータスや直近の行動状況によって、将来どのような行動をするかを予測する分析手法です。ユーザーの現在のステータスや直近の行動状況をは、変数で表します。この変数は、説明変数と呼びます。予測する値は、目的変数と呼びます。目的変数が連続型変数の場合は回帰分析と呼び、不連続型変数の場合は分類と呼びます。予測分析の応用例としては、サービスの利用を離脱しそうなユーザーを把握して離脱対策を計画したり、課金する可能性の高いユーザーを優先的に有料コンテンツへと誘導したりして、動的にオンラインサービスをユーザーの特性に合わせた最適なサービス設計が可能となります。予測分析に利用できるアルゴリズムには、様々なアルゴリズムがあります。例として、線形回帰分析、logistic回帰分析、ニューラルネットワーク、SVMなどがあります。私達のチームでは、オンラインサービスのデータに最も使いやすい「ランダムフォレスト」をよく使って分析を行います。別ブログ記事で、「ランダムフォレスト」を用いた予測分析方法の詳細を記述するので、ここでは詳細を省略します。

 

②クラスター分析

クラスター分析は、似たような特性、あるいは似たような行動をしているユーザーのグループを把握するための分析手法です。ユーザーのグループを把握することによって、ある特定のグループのユーザーだけをターゲットにして施策を計画することができます。きちんとユーザーの特性に合わせたサービス設計することによって、ユーザー満足度を上げることができます。このクラスター分析は、マーケティングではセグメンテーションとも呼ばれます。クラスター分析にも色々なアルゴリズムが存在します。よく使われるものとしては、kmeans等があります。

 

③相関分析

相関分析は、ユーザーの行動に相関が高いものを抽出します。オンラインサービスを例に挙げると、ソーシャルゲームでよく課金するユーザーは、どのようなプレイしているか、サイト滞在時間でよく見ているコンテンツはどういうものが多いか等が挙げられます。

R言語のcor()関数などを使って、相関分析を行っています。相関分析で気を付けないといけないことは、相関関係は高いけれども、因果関係があるとは限らないということです。因果関係に関しては、サービスの詳細も考えて、判断しないといけないです。

 

ユーザーのステータスの時系列変化

ユーザーのステータスの時系列データを扱う分析は、縦断データ分析と呼びます。ユーザーの行動の変化には、どのような変数が影響しているかが分析可能です。

オンラインサービスを例でいうと、

  • 毎月サービスの滞在時間が伸びているユーザーの特性は何か
  • 継続して使うユーザーと飛び飛びに使うユーザーの違いは何か

この要因を把握することで、ユーザーの満足度を高めるために重要な要因が把握できたりします。

 

システム要約データ

このデータは、各ユーザーごとの特性は表してないため、ユーザーレベルでの詳細分析に使うことはできないです。しかし、サービス全体として予測やトレンドを把握する、施策の効果測定などには非常に重要です。システム要約データは、時系列の一次元のデータとなっています。そのため、その他のデータと違い時系列データの分析手法を用いて分析します。

①時系列データ分析

長期トレンドを把握

時系列データは、長期トレンド、季節要因とその他の部分とを分解することができます。そのために、R言語のdecomposeなどの関数を用いています。時系列データから長期トレンド分をだけを観測することによって、サービスが長期的にどんな変化が起きているかなどが分かります。この長期トレンドは、特に外部要因による変化が多いです。そのため、早めに市場の長期トレンドを把握することによって、サービスの長期的なビジネスチャンスを把握できたり、危機的な状況が見つかったりして、早期対応が可能ともなります。

 

季節要因を把握

時系列データは、季節部分を把握することにより、特にサービスの需要が高くなる時期などを把握し、それに合わせた施策を計画したり、新しいビジネスチャンスを見つけることができます。たとえば、クリスマス時期に需要が高くなるとわかった場合、クリスマスを対象にした特別商品やサービスを計画することが可能となります。

 

施策の効果測定

時系列データから長期トレンドと季節要因部分を除外することにより、その他の要因によるサービスの利用状況の変化が分かりやすくなります。特にサービスの改善や変更施策を実施した場合、それによってどれ位サービスの利用状況の変化があったか等を調べたい時にはかなり有効です。

 

将来予測

サービスの時系列データはかなり複雑で、以前説明した長期トレンド、季節要因とその他の部分によって形成されています。サービスの将来予測をしたい場合は、その部分の要因を参考に計算した方が精度の高い予測が可能です。R言語のHoltwinters関数などを使って、時系列データの予測計算が可能です。

 

終わりに

本日は、データマイニング用に準備したデータを基に、どのような分析をしているかを軽く説明しました。今後、一個一個のデータマイニング手法を、R言語を用いた実施方法に関して詳細に説明する予定です。

 

 

 



 

こんにちは、コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、データマイニングを始めるためにはどのようにデータを準備する必要があるかを紹介します。

 

オンラインサービスのデータについて

簡単に分けると、オンラインサービスから蓄積されるデータには大きく2つのタイプがあります。

  1. データベース - サービス運用のために必要なデータが保存される。ユーザーのステータスやユーザーのアクションの結果等が記録されていることが多い
  2. アクセスログ - ユーザーのページアクセスやタップイベント等が記録されている。ウェブサーバーやアプリケーションサーバーに、ログファイルとして保存されている。

データベースのデータは、サービスを維持するために必要なデータが保存されています。しかし、このデータは分析用としてそのまま使うには難しいケースが多いです。アクセスログは、ユーザーがサービスを利用する上で、どのように使ったか(UIの操作履歴)の履歴となっています。ほとんどの場合は、そのまま分析するには複雑すぎることが多いです。では、データベースとアクセスログデータから、データマイニングあるいは分析用にどうデータを変換した方が良いかを説明します。私達のチームでは、この元のデータを加工して、データ分析用のデータベースに(データウェアハウス)保存しています。データ加工とテーブル設計等は、どのようにした方が良いか等を紹介します。

データマイニング用のデータ設計方法

サービスのデータを以下のようなデータ構造に変換してから、データ分析に使っています。

  1. ユーザーのイベントデータ
  2. ユーザーのステータスデータ
  3. ユーザーのイベントの定期要約データ
  4. ユーザーのステータスの時系列変化
  5. システム要約データ

データマイニングは、ほとんどの場合、ユーザーの行動あるいは体験を分析するために行います。そのため、①~④のテーブルは、ユーザーの行動あるいは体験をどう表すかを意識して設計しています。上記のデータの5種類について詳細に見ていきましょう。

①ユーザーイベントデータ

このデータは、ユーザーのアクションと体験を表します。アクションと体験は、サービスのUX設計等をベースに考えると考えやすいと思います。一つのデータレコードは、一つのアクションと体験を表します。しかし、場合によっては、この一レコードは、ユーザーの複数のUIアクセスやタップによって行う操作を、一つのアクションして抽象化しているものもあります。例えば、画像管理と投稿できるようなSNSアプリを参考に考えてみましょう。

主に考えられるユーザーイベント

  • 新規でアプリ登録する
  • チュートリアルを完了する
  • 友達を検索する
  • 友達をフォローする
  • 友達にフォローされる
  • 画像をアップする
  • 画像をアルバムに振り分け保存する
  • 画像を投稿する
  • 友達の画像にコメントする
  • 自分が投稿した画像に「いいね」される

このイベントを見ると、大きく2タイプのものがあることに気が付くと思います。ユーザーが自分の意思で行うアクション、ユーザーが体験することの2つです。一つのイベントが複数のアクションを完了することによって発生することもあります。例えば、画像投稿のイベントは、画像を選ぶ、タイトルを入力する、コメントを入力する、カテゴリー設定、ハッシュタグ設定、公開範囲の設定、等の複数のアクションによって完了されます。もちろん、このアクションを別々にイベントとして保存するということもできます。しかし、分析という意味では、細かいアクションの単位では、なかなか分析が難しくて複雑になりやすいです。そのため、ユーザーの行動は、ある程度に抽象化した形で、ユーザーイベントを定義した方が効果的だと思います。

ユーザーイベントデータの形式:

データは、5W2Hで保存します。誰が(Who)、何を(what)、どこで(Where)、いつ(when)、どの位(How many)、なぜ(Why)、どのように(How)の項目を記録します。イベントによって、5W2Hのすべてが存在しない時もあります。

SNSアプリを例にして、画像を投稿した場合を考えてみると、

Who – ユーザーID

What – 投稿ID

When – 投稿時刻

Where – どこのページで投稿したか

How many – 画像が何枚か

Why – 目的

How – なし

定義が難しいものもあります。特にWhere、WhyやHowの定義はイベントに依存します。

②ユーザーのステータスデータ

ユーザーのステータスデータとは、ユーザーの現在の状態を表すデータを保存するテーブルを意味します。このデータは、毎日のユーザーの行動によって変化するものもあります。そのため、いつも最新状態で保存されています。データを管理する単位は、現在私達のチームでは、データウェアハウスのデータを一日単位で管理しているため、一日一回更新されています。

ユーザーステータスには、二種類のデータがあります。

  • 固定情報:年齢、地域、性別、職業などのユーザーの情報
  • ユーザーの行動から生まれてくるステータス 例:サービス利用期間、友達の人数、保存されている画像枚数の合計等

このデータの特性は、その時刻であるユーザーを説明できるということです。特に、短期間では、著しく変化しない、あるいは、短期間での行動を表すというよりも、長期的な行動状況を表すようなデータを表す変数にした方が良いユーザーの特性に関しては意味があります。

悪い例:最終アクセス時刻

良い例:月間平均滞在時間

データマイニング手法などに使うときは、ユーザーの特性として使えるかという意味で評価します。

 

③ユーザーイベントの定期要約データ

データマイニング手法を用いたデータ分析には、ユーザーは説明変数を用いて表さないといけません。そのためには、ユーザーのイベントデータをそのままデータマイニング手法に使うことはできないことが多いです。その問題を解決するためには、イベントデータを何らかの形で変数化しないといけません。ユーザーの行動イベントは、定期的に要約して変数に変換します。

例:ユーザーのイベントデータから、一ヶ月間でユーザーのある特定のアクション数をカウントして変数として保存します。アプリ起動回数、「いいね」した件数、画像を投稿した件数、新規フォロー作成件数

 

このように変数化することによって、ユーザーの行動イベントの情報量を減らし、説明変数として使えるようになります。私達のチームのデータウェアハウス上では、ユーザーのイベント情報を集約して、ユーザーイベントの定期要約データを作成し保存されるようにしています。現在は、データの集約期間は一ヶ月を期間としています。データ分析を行いたい時には、この定期要約データを使うことが多いです。

④ユーザーのステータスの時系列変化

ユーザーのステータスデータの値は、日々変化していきます。そのため、ユーザーの状態が過去はどうだったか、あるいはどのように変化していたかを後で見るとわからなくなります。そのため、ユーザーのステータスデータを一定期間ごとに、スナップショットとして保存するようにしています。私達のチームのデータウェアハウスでは、スナップショットの保存間隔は一ヶ月間としています。1ユーザー当たり一ヶ月に一回、ユーザーのステータレコードとしてテーブルに挿入されます。このデータを使うと、ユーザーの成長あるいはサービスの利用頻度の変化等はユーザーごとに時系列のデータとして作成できます。

⑤システム要約データ

ユーザーベースのデータだけではなく、サービス全体として集約するデータを作成しています。このデータは、ユーザーの特性や予測には使いませんが、時系列データとして、サービスとしては将来予測に使います。

例:

デイリーアクティブユーザー数、マンスリーアクティブユーザー数、PV数、

新規登録ユーザー数、課金したユーザー数

データによって、一日ごとに集計するものと一ヶ月に一回集計するものがあります。

 

終わりに

本日は、データマイニング用のデータ準備方法に関して説明しました。サービスのデータベースとアクセスログを用いて、ユーザーの行動や体験を表すようなデータの加工方法に関して説明しました。今後は、このデータをどのようなデータマイニング手法に用いて分析しているかを説明します。

 

 

 



こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、予測モデルの構築方法として、「ランダムフォレスト」アルゴリズムについて紹介します。

ランダムフォレストのアルゴリズムについて

ランダムフォレストのアルゴリズムは、「決定木モデル」が基になっています。決定木モデルとは、よくプログラムで書くif then elseのような簡単な説明変数の値によって結果を決める手法のことです。ランダムフォレストは、複数の「決定木モデル」を足し合わせる(平均化)するようなアンサンブル学習(Ensemble learning)というアルゴリズムを利用します。そのため、決定木モデルよりも高性能な予測が可能となっています。ランダムフォレストのアルゴリズムは、以下のような特性があるためオンラインサービスのログ分析に適していると言われています。

  • 的変数と説明変数の型に(連続、不連続、バイナリー)何でも対応している

オンラインサービスの場合は、変数はユーザーの年齢(整数)、性別(不連続)、滞在時間(連続)であったりして、混ざったタイプの変数が多いです。そのため、何でも使えるランダムフォレストは便利です。

  • 変数の分布に依存しない

分析手法によって、変数の分布に制約はあります。例:ガウス分布

データの分布の判断は難しいようなケースが多いため、分布の制約は無い方が安心です。

  • 外れ値や欠損値などに強い

オンラインサービスの場合は、データが入っていなかったり、場合によっては、間違ったデータが入っていることがよくあります。例:値の代わりにnullが入っている等ランダムフォレストの予測モデルは、このようなデータによって影響を受けにくいため、データの前準備の手間を減らせます。

  • 説明変数の数が非常に多いケースにも応用できる

サービスユーザーの特性を表す変数の数は、20個も30個もあることはよくあります。そのため、説明変数の数が多くてもきちんと機能する手法が不可欠です。

  • 関係ない説明変数はモデルのパフォーマンスに影響しない。

線形回帰分析やニューラルネットワーク等は、目的変数と関係のない説明変数をモデル構築に使った場合、予測制度にかなり影響します。そのため、関係性のある目的変数だけを選ぶ等のデータの前準備が必要となります。しかし、ランダムフォレストは、そのような準備をする必要はあまりありません。

  • ビッグデータに対応しやすい

最近、オンラインサービスデータは数百万も数千万件もあることがよくあります。ランダムフォレストは、複数の「決定木」モデルを合わせるような計算手法になっているため、分散計算プラットフォーム(Hadoop, Spark)を使って大量のデータでも扱いやすいです。

 

R言語を用いたランダムフォレストのアルゴリズムの利用

R言語とは、統計解析を得意とする(Libraryが多くある)スクリプト言語です。無料でダウンロードして、Windows, Mac, Linux等どんな環境でも利用できます。CRANからオープンソースのライブラリを無料でダウンロードしインストールすることによって、データマイニングや統計解析手法のほとんどを無料で利用することができます。ランダムフォレストを利用するにはパッケージのインストールが必要です。

 

RandomForestのインストール:

install.packages(“randomForest”, dependencies = TRUE)

library(randomForest)

 

データサンプル:

ランダムフォレストに入力するデータを、CSV形式で以下のように準備する。

一行目がヘッダーとして変数名、二行目から変数の値をCSV形式で記述する。

v1は目的変数、v2~v6は説明変数

data.csv(データサンプル)

v1,v2,v3,v4,v5,v6

n11,n12,n13,n14,n15,n16

n21,n22,n23,n24,n25,n26

CSVデータの読み込み:

datacsv <-read.csv(file=”data.csv”,header = T)

 

モデル構築:

RFmodel <- randomForest(v1 ~ v2+v3+v4+v5+v6, data= datacsv)

N二番目の変数に、説明変数を‘+’で組み合わせて記述する。V1は目的変数、V2~v6は説明変数を表します。

全ての説明変数を予測モデル構築に使う場合は、

RFmodel <- randomForest(v1 ~ ., data= datacsv)

 

モデル評価:

予測モデルの評価方法には色々あります。しかし、Rのprint関数を使うだけで簡単にモデル評価ができます。

例えば、ランダムフォレストを、バイナリーの目的変数を予測に用いた場合は、以下のような結果が表示されます。

Call:

randomForest(formula = v1 ~ ., data = datacsv, ntree = 2000)

Type of random forest: classification

Number of trees: 2000

No. of variables tried at each split: 10

OOB estimate of  error rate: 28.82%

Confusion matrix:

continue redatsu class.error

r1     5573    1092   0.1638410

r2      2026    2128   0.4877227

真ん中のerror rate: 28.82%と出力されているのは、目的変数の予測の精度です。

100件を予測れば、28件の誤りが出る可能性があると出力されています。

モデルを用いた予測:

構築された予測モデルを用いて、結果(目的変数)の分からないユーザーのデータdata2を入力することで、予測値が出力されます。

Results <-  predict(RFmodel ,data2)

 

モデル構築時の注意点:

  1. 目的変数の情報が説明変数に漏れないこと。目的変数と同じ情報が説明変数にも入ってしまった場合は、予測モデルの結果の精度が高くなると評価されますが、実際にデータ予測を行った場合、非常に精度が悪くなる場合があるため、注意して変数を定義しないといけません。
  2. ラベルとして扱わないといけないラベルタイプ(不連続型データ)の変数を、R言語のfactor()を用いて、ラベルとして認識させる必要がある。
  3. パラメータのntree(決定木の数)の値が小さい場合、結果が不安定な時がある。特に、説明変数の数が多い時は、十分に大きな値のntreeを設定する必要がある。

 

終わりに

今回は、ランダムフォレストをR言語で用いた予測モデル構築方法に関して軽く説明しました。今後、ランダムフォレストを「要因分析」へ応用する方法に関して説明していきます。

 

参考資料:

Rのダウンロード

https://www.rstudio.com/

R言語について

http://qiita.com/stkdev/items/6aba2c1db2fa056170ae

RandomForestについて

https://www1.doshisha.ac.jp/~mjin/R/32/32.html



こんにちは。コンテンツ・メディア第1事業部の開発課のログチームのラヒルです。

本日は、データマイニング手法として予測モデルの構築方法について紹介します。

 

予測モデルとは

まず初めに、予測モデルとはどのようなものかを軽く説明します。 予測モデルとは、ユーザーの現在の行動や属性によって、将来どのようなアクションを起こすか予測が立てれるような数学的な手法のことです。

オンラインサービスで例を挙げると、

  • 将来、サービスを使わなくなる可能性のある(離脱する)ユーザーはどんなユーザーかを予測する。
  • 将来、課金する可能性の高いユーザーは誰かを予測する。

などが挙げられる。

予測モデルの結果の形によって、大きく2つのタイプがあります。

予測したい結果は、

  • 連側型変数 - 回帰分析(Regression analysis)
  • 不連続型変数 - 分類 (Classification)

予測モデルの結果を表す変数は、目的変数とも呼びます。予測モデルは、将来を予測するために色々なデータを利用します。そのデータを変数として定義して、予測モデルに入力します。このデータを表す変数は、目的変数と呼びます。目的変数にも、連続型と不連続型変数があります。

オンラインサービスで例を挙げると、

  • ユーザーの年齢、性別(不連続型変数)
  • 一日当たりの滞在時間(連続型)
  • 一ヶ月間での課金総額(連続型)

 

予測モデルの使い方

では、この予測モデルをどのように使うかを説明します。 予測モデルを用いて将来予測を行うためには、予測モデルを学習させないといけません。 そのために、目的変数と説明変数は既に知っているデータを用います。 オンラインサービスで例を挙げると、過去のユーザーのデータを用います。 各ユーザーが、将来どの位サイトで課金するかを予測するケースを考えましょう。 そのためには、過去のサイト利用者のデータを用います。

  • 目的変数:各ユーザーの総合課金額
  • 説明変数:ユーザーの年齢、性別、一日当たりの滞在時間等

既に結果を知っているデータを使い学習させることを、予測モデル構築と言います。 過去の結果を既に知っているユーザーのデータを使って学習させたモデルに、今後、結果(目的変数)を知らないユーザーのデータ(目的変数)を入力して、結果の予測(Predict)を行います。それによって、将来サービスでどのようなことが起きるかという予測を立てられます。この予測を使い、サービスの改善や将来の計画がしやすくなります。

 

予測モデルのアルゴリズムについて

予測モデルを構築できる手法は世の中には、たくさんあります。例をあげると、線形回帰、logistic回帰分析、ニューラルネットワーク、決定木、サポートベクターマシーンなどがあります。アルゴリズムは、すべてが万能ではありません。手法によって、目的変数と説明変数の形(連続、不連続)が限られたり、変数の値のデータ分布の制約があったり、データのノイズや欠陥への対応が苦手だったりします。そのため、予測モデルのアルゴリズムの選び方は、きちんとデータの中身を理解してそれにあった手法を選ばないといけません。データマイニングでよく言われるのは、「ごみを入れるとごみが出てくる」(Gabage-in,garbage-out)ので、注意して応用しないといけません。この記事では、分析手法の詳細は説明しませんが、今後別の記事でR言語を用いて予測モデルの構築する方法を説明する予定です。

 

終わりに

今回は、予測モデル構築とはどういうものか、変数の定義方法等についてオンラインサービスをケースとして軽く説明しました。今後、具体的に各予測モデル構築手法に関する手法に関して説明していきます。