FANCOMI Ad-Tech Blog

株式会社ファンコミュニケーションズ nend・新規事業のエンジニア・技術ブログ

1週間のデータ分析インターンを終えて

こんにちは.
F@Nさんの1週間インターンに参加した にしかわです.
インターンで行ったこと、感じたことを書こうと思います.

インターンに参加した理由

・就活イベントでお話させて頂いた時に社員の方が自社のシステムについて楽しそうに話していたので、自分もこんなエンジニアになりたいと思ったから.
・興味のある分野のインターンだったから.

何をしたのか

CTR予測をしました.
アドテクノロジーについて無知だったため、メンターの方にシステムについて丁寧に教えて頂きました.

SQLにつまずく

社内でのデータベースから特徴量を抽出する際に、SQLを使用しました.
アプリを作る際にちょこっと使ったぐらいのスキルだったので、1日目はほぼSQLにつまずきタスクが進みませんでした.

特徴量のエンコードにつまずく

性別・IDなどはone hotする必要があるので、LabelBinarizerというsklearnのメソッドを使いました.
なぜかエンコードできず、ほぼ1日悩んでいました.
原因がデータがfloat型だったことだと気づいた時は、発狂しそうでした.

ロジスティック回帰を使い、CTR予測

sklearnのLogisticRegressionを使用しました.
精度確認するため、ROC曲線、AUC値、Logarithmic Loss、Normalized Entropyという指標を使いました.
詳しいことはこちらを見てください.
https://tech-blog.fancs.com/entry/ctr-prediction-model-evaluation

カーネルとpcが落ちる

初日はjupyter notebookのカーネルが落ちるたびに驚いていましたが、1週間で普通のことだと悟りました.
しかし、pcが落ちるのは絶望ですね...
ダウンサンプリング大事

k-meansで新しい特徴量を作ってみる

特徴量の種類が少ないことが問題ということなので、既存の特徴量を用いて新しい特徴量の作成に挑みました.
サイトIDを使い、クラスタリングを行ってラベルを抽出しました.
以下が結果です.
campaign_id,frequencyを適用
AUC = 0.6726877465581093
Logarithmic Loss = 1.4451557532902062
Normalized Entropy = 2.700788250592528

campaign_id,frequency + 作成した特徴量
AUC = 0.6678840993331718
Logarithmic Loss = 1.366609496859506
Normalized Entropy = 2.6290588331512277

ちょっとよくなってる!

作成した特徴量の傾向を眺める

f:id:fan_a_nishikawa:20180831181154p:plain
gender 1は男性、2は女性を表しています.
クラス1は男性が多くて、2は女性が多いことがわかります.
サイトIDから性別をちょっとだけ予想できることを発見しました.

まとめ

とても良い環境でインターンをさせてもらえた

わからないことだらけでどうなることやらと思っていましたが、メンターの方が丁寧に教えてくださったので、なんとかタスクを進めることができました.
もくもくと作業したい時はほっといてくれるので、自分にとってとても作業しやすい環境でした.
あと、隣の席のインターン生がとても優秀だったので、色々教えてもらいました.←良い刺激になりました!

つまずくことが多かったですが、その分技術力を身につけることが出来ました!
メンターのt_sakaiさん、y_kawasakiさん、面倒を見てくださったa_uchidaさん、ランチに連れて行ってくださった社員さん、本当にありがとうございました.

自作アプリで広告配信

はじめまして、株式会社ファンコミュニケーションズで8月20日~24日の5日間インターン生としてお世話になりました大山です。
私は広告配信用モジュールnendSDKチームで自作アプリへのSDK導入を行ったので、その振り返りをしようと思います。

やったこと

1日目

まずは入社書類を記入し & アドネットワークの仕組みについて簡単に教えていただきました。
その後、今回のインターン課題を設定。私は最近趣味でAndroidアプリ開発を行なっており、ちょうどJavaからKotlinへと移行したところだったので、「Kotlinで開発がしたい!」と申し出ました。
最終的に自分のインターン課題は、現在開発中の自作Androidアプリを完成させ、nendSDKを利用してアプリ内で広告配信をするということに決定。
開発中のAndroidアプリというのは、自分がKotlinの練習も兼ねて作り始めた目覚ましアプリで、ざっくりとした仕様は以下の通り。

  1. 起きたい時間を入力し、アラームセット
  2. 時間になるとアラームが鳴り出し、同時に玉転がしゲームスタート
  3. 端末を傾け、玉を穴に落とさずゴールまで運ぶことでアラーム停止
    (神経を集中させるミニゲームで目を冴えさせて二度寝防止)

インターン開始時点でゲーム部分はほぼ完成していたので、今回は主に目覚ましアプリとしての部分を実装していくということに。
他には、広告の表示タイミングや広告形式の決定、Androidアプリの開発環境構築などを行って初日は終了。

2日目

ゲーム部分の微調整を行なった後、アラーム設定画面の作成開始。
アラームをセットした時間が来たら、当然他のアプリを起動していたり端末がスリープ状態であってもアラームが鳴ってくれないといけません。そこで、アプリがバックグラウンドにいる際に、設定時刻が訪れたという端末からの通知を受け取るレシーバー等も作成。
あまり使い慣れてはいないKotlinでの開発でしたが適宜ググりつつ大きな問題もなく進行。というか諸々Javaで書くよりシンプルになっててKotlin万歳!

3日目

 アラーム起動時の音楽再生処理も実装しアプリの主要機能は完成。
いよいよ広告表示機能の実装に移りました。
アプリやWebサイトで広告配信をするといった経験はゼロだったので、ここの作業が一番苦労するだろうと予測していました。
スケジュールとしては3日目をほぼ全部費やすつもりでいました。

 

結果としては、10分足らずでサンプル広告の表示に成功

f:id:fan_k_oyama:20180824181828p:plain

わかりやすい公式ドキュメントも用意されており、作業も単純でした。
特にバナー広告なんてレイアウトファイルやらに数行ちょちょっと足してあげるだけで作業が終了し、なんというか拍子抜け...。
広告表示が予想外に早く終わったので、その後はアラームのキャンセル機能追加だったりゲーム部分のステージ追加だったりといった細かい所を詰めていく段階に入りました。

4日目

 とりあえずアプリは仮完成。ということでSDK開発チームの方々にレビューしていただくことになりました。
しかし、コード共有のためにGitHubのリポジトリにプッシュしようとしているときに問題発生。(正確には初日の段階でローカルリポジトリに問題が発生していた)
強引に歴史改変を繰り返しながらなんとかコードレビューをしていただける所まで持って行けたのですが、この一連のGit作業にこの日の大半を費やすこととなり、Git力不足を痛感しました。精進します。

5日目

最終日ということでレビューしていただいた点を時間の許す限り修正。
加えて退社手続き書類を書いて、このブログを書いて、インターンは無事終了!

感想

nendSDKを使った広告表示は思いのほか簡単で、東京メトロの乗り換えは思いのほか大変でした。

インターンへの参加は今回が初めてだったんですが、オフィスは綺麗で作業環境は自宅より快適で全く不自由なく開発できました。
自分の書いたコードをレビューしてもらう機会は普段なかなか無いのでドキドキでしたがいい経験になりました。
また、お昼にはランチにも連れて行ってもらったりと社員の方々には大変お世話になりました。ありがとうございました!

1週間のSSP構築インターン by Scala を終えて

どうも、僕です。
え?知らない?それはそう。はじめまして倉林です。
5日間のScalaを使ってのSSP構築インターンということで色々やってきましたが、技術の突っ込んだことを書くとどうせ間違ったこと書きそうで怖いのでやったことを日記みたいな感じにまとめたいと思います。

この5日間でやったこと

1日目

Scalaはほんの少しだけ触ったことがあるくらいで、書き方に困ったら関数型ガン無視の脳筋コードを書くレベルです。
サーバーに関してもいじったことはないので、仕様書を渡されてまず何をするかを考えました。
「とりあえず、サーバーに必要なものを打ち込んでいくべ」的なノリで必要なもののインストール作業から入りました。(のちにこれが裏目にでる・・・)

今回、使ったのは
scala : 2.12.2
Play Framework : 2.6.18
です。

2日目

この日でSDK -> SSP -> DSPの流れを想定したリクエスト、レスポンスの受け渡しの大枠ができた感じです。
ただ、Scalaの非同期処理についてまったく理解ができていなかったので電車と自宅で頑張ってました。なお結局理解ができなかった模様。
この日はそこまで進捗という進捗を出すことができなかった。

3日目

この日は非同期処理で苦戦してました。
Future[List[Future[Hoge]]]みたいなネストした型をどう処理するかとかで悩んでたのですが、色々な方にフォローを受けながらなんとか解決をして仕様を完全に満たしてないですがローカル環境でリクエスト、レスポンスのできるSSPを作れました。
ひとまず安心して、整理のためにPlayで自動生成される使わないファイル群を削除したら。。。

Unexpected exception
ProvisionException: Unable to provision, see the following errors:
1) Error injecting constructor, Configuration error: Configuration error[Cannot load class filters.ExampleFilter]

ふぁーーーー!!!消したファイル別に使ってないやんけ!!!!って心で叫んでました。

まぁ、conf/application.confファイルのExample.Filterをenabledにしたら直ったんですけどね。
どうでもいいところで時間を取られた。。。
でもこういったエラーにはこう対処するって知識はめっちゃ大事だと思うので逆に今回で知れてよかったと思うことにしました。
つーか、Play2.6のリファレンスくそやんな。

4日目

寝坊しました。
この日は一番Scalaを書いた日です。
正直、Play使ってると便利すぎて毎回決まり切ったコードしか書かないような感じになってしまうのですが(個人の感想)受け取ったレスポンスに対する処理とかは紛れもなくScalaでした。
Optionをどう使ったらよいか、いかにScalaらしく書くかなどを考えさせられる1日でした。
普段はJavaを書いているのですが、Scalaに触れてみるとこんな書き方ができるのか、イミュータブルになるとどんな利点があるのかなどを調べたりして他の言語とはまた違った興味深さや面白さがありました。

5日目

実際に本番環境に移してテストをする日です。
ここまでは思ったよりも順調(そんなことはない。)だったのですが、いざ本番のサーバーに移して実行するとまぁ動かないこと。
サーバーにインストールしたsbtのバージョンが悪かった、そもそもコードの書き方が悪かった(ブロッキング、ノンブロッキングをここで知った)etc...があり、なかなかうまく動かず、社員の方につきっきりになってもらい最終的にしっかりと動くものが作れました!!!
ただ、動くものは作れたがここからどうパフォーマンスをあげていくのかなどのことを考えたら「ここからがめっちゃ楽しいじゃん!」という気持ちになりました、いつもは単に動くコードを書くということだけを考えていて、どういう処理にしたらより高速になる、どういう非同期処理にしたら効率よくリクエストが捌けるなどは考えたこともなかったのでとても新鮮で面白いと感じました。

最後の方はこの記事を書くのだったりでバタバタしてしっかりしたSSPのテスト結果とかは用意できなかったです。ごめんなさい。
あ、ブランチでよいのならGithubのURLをあげておきます。
github.com

これ書いているときはまだ最新版をpushしていない罠
まだ自分なりに書き直したりしたいのでこれで許してください。

感想

5日間という短い時間でしたが、内容の濃く、楽しいインターンにすることができたと思います。
普段耳にするけど実際に触れたことのないアドテクについて触れられてとてもよかったです。
社員の方々も色々教えていただき本当にありがとうございました!!!
ここで学んだことをこのインターンで終わりにしないで、自分なりに復習して他でも活かせるように今後も努力していきたいと思います!
本当にありがとうございました!

クリック数の異常検知

こんにちは、株式会社ファンコミュニケーションズで8月6日から8月10日までインターンをしていた桐畑です。
クリック数の異常からシステムなどの異常を検知できないかというインターンをやったので、それについてとインターンの感想などを書いていこうと思います。
ブログはほとんど書いたことがないので、読みづらいかもしれませんが、ご了承ください。

1. 異常検知とは

基本的に3つあり、それぞれ外れ値検知、異常部位検知、変化点検知のことを異常検知と言います。
・外れ値検知
突発的なおかしい値を検知するもの
例) 一瞬だけサーバーのネットーワークが切れたなど
・異常部位検知
異常な値がある程度の長さ連続して起こっているのを検知するもの
例) アップデートをしたがミスがあり、再び修正したなど
・変化点検知
ある時点以降時系列の特徴が変わってしまう時点を検知するもの
例) テレビに出て、知名度が急激に上がったなど

今回はあまりそれぞれを区別せずに異常なものをなんでも検知しようという試みでした。
アプローチとしては、機械学習的なアプローチと統計学的なアプローチがあり、今回は統計学的アプローチを用いました。
細かい手法は以下を参考にしました。
異常検知と変化検知 9章 部分空間法による変化点検知

2. 結果

0時の日付が変わるタイミングでのスパイクを除けば、検知したい4つの異常のうち3つを見つけることが出来ました。
4つ異常でないものも検知してしまっていたので、適合率= 3/7、再現率= 3/4ということになります。

スパイクは以下のようなもので、これと異常値を区別するのが物凄く大変でした。
正直、最終的にもあまり出来ていないです。
0時にクリック数が急激に多くなるのは、漫画アプリとか色々なアプリのポイントなどの更新が0時だからなのかなと思ってます。

f:id:fan_m_kirihata:20180810174742p:plain

3. 実際にやったこと

FacebookのProphetというライブラリを使ってモデルを組んで、残差が大きいところを異常とみなしました。
なので、より良くデータにfitしているモデルを組むことが重要です。
Prophetでは、
 y(t) = g(t) + h(t) + s(t) + \epsilon_t
という式でモデルを推定します。
g(t):トレンドを表す関数
h(t):周期性を表す関数,
s(t):イベントの効果を表す関数
 \epsilon_t:誤差項

クロスバリデーションなんかで変数選択をして誤差を見てみるとこんな感じになりました。
yが実際の値(Box-Cox変換はしている)、yhatが推定値、residualが残差です。
f:id:fan_m_kirihata:20180810182142p:plain

異常なところで誤差が大きくなりました。
ただ、スパイクのときと区別がつきにくいです。
f:id:fan_m_kirihata:20180810182147p:plain

1次の自己相関を入れていたせいで、異常な値をすぐに補正してしまっているのだと思い、
1次の自己相関の項のみ移動平均で平滑化してみました。
すると、スパイクと異常部で残差の連続度に違いが出ました。
f:id:fan_m_kirihata:20180810182410p:plain
f:id:fan_m_kirihata:20180810182413p:plain

なので、残差が大きいところが連続するかどうかで異常を判定するとそこそこ上手くいきました。

ただ、スパイクの影響はまだまだ出ているので、その辺は今後の課題かなと思います。
あと、長い期間の異常も見つけられなかったので、それはどうしたらいいか時間がある時にでも考えてみようと思います。

4. 感想

インターンをするのは初めてなので、他のところとは比べられないですが、全体的に来てよかったなと思います。
良かったなと思ったところを2つ紹介したいと思います。
1つ目は、会社がすごく自由だったところです。僕は結構縛られるのが嫌なので、好き勝手やらして欲しいタイプなのですが、本当に好き勝手やらせてくれたので、すごくやりやすかったです。時系列の研究をしているので、それに関係する内容をやらせてもらえたし、やり方も特に指定されずにやらせてもらえたので、色々知識がついて良かったです。
2つ目は、データサイエンティストの仕事がどんなものか知れたことです。データサイエンティストという名前は良く聞くのですが、業務としてどのようなことをやっているのか謎だったので、それが一部でも知れたことは良かったなと思います。データをひたすら眺めて、おかしなところを探すのは凄く大変でしたが、いい経験でした。

スパイクに苦しめられた時は大変だなと思いましたが、全体的には楽しくて、色々な経験が出来たインターンだったなと思います。
ありがとうございました。

IT用語辞典アプリの作成とnendSDKによる広告表示

こんにちは、はじめまして。

8月6日から8月10日の1週間、ファンコミュニケーションズさんでインターンに参加しました、ししどです。

このインターンでの活動について綴ろうと思います。

なぜ、インターンに参加することになったか

 6月の中旬に東京で行われた「逆求人フェスティバル」に参加しました。
就職活動サイト[逆求人ナビ] 就活セミナー 2021年卒,2020年卒,2019年卒,2018年卒, 就職活動 逆求人フェスティバル

 そこで、ファンコミュニケーションズの社員の方とお会いしました。ファンコミュニケーションズさんの名前は知らなかったのですが、nendというサービスがあることは知っていました。社員の方からお話をきき、nendSDKを導入するインターンを行うことを知りました。

 私はもともと、スマートフォンアプリを趣味で作っていたのでこのインターンに非常に興味を持ちました。

 後日インターンの詳細メールを頂き、参加することを決めました。
 特別選考枠に合格したため、交通費や宿泊費等の補助が出、遠方住みの私には非常にありがたいお話でした。

インターンで何をしたのか

 大まかにやったことはこの3つです。

  • 作成済みのiOSアプリにnendSDKを導入、ネイティブ広告を表示
  • IT用語辞典アプリを新規作成
  • IT用語辞典アプリにnendSDKを導入、ネイティブ広告を表示

 以下は各日の詳細です。

1日目

 午前中はアドネットワークに関する大まかな仕組みについて教えて頂いた後、1週間の課題を設定しました。

 午後は自分が作ったiOSアプリにnendSDKを導入しました。バナー広告は既にこのアプリに実装していたので、動画ネイティブ広告をリストの一番上に表示される様にしました。

f:id:fan_t_shishido:20180810155718p:plain

2日目

 iOSアプリへのnendSDKの導入の残り作業を少しやった後、新たに作成するAndroidアプリの仕様を確認しました。新たにアプリを作るアイディアは特に持っていなかったので、社員の方が事前に考えておられたものを作ることになりました。IT用語の一覧が閲覧できるというアプリで、最低限実装する内容は以下の様な感じです。

  • WikipediaのAPIを使って「プログラミング用語一覧」を取得、リスト表示
  • リストの用語をタップ → WebViewの画面に遷移して詳細を表示
  • nendSDKを使って広告を組み込み

 これ以外にも単語のお気に入り機能など、付加機能をいくつか考えていましたが、期間的に実装できる量は限られるので、余裕があればやることにしました。Androidアプリを作成するための言語はKotlinを選びました。JavaでAndroidアプリを作成したことはあって、Kotlinも少し触ったことはあったので、せっかくなので新しい方のKotlinで作ることにしました。

 この日に出来たのは、プロジェクトの作成と使用するライブラリ等の導入、Wikipediaからプログラミング用語一覧をJSONで取得することでした。

 まだ、使ったことのないアーキテクチャを利用してみてはと、社員の方から参考文献やこんな技術があるというのを教えて頂きました。リアクティブプログラミングやDataBindingなど、目を通してみましたが、自分の技量ではすぐに開発に利用するのが難しいと思ったので、とりあえず、やったことのあるやり方で実装しました。余裕があれば、新しいアーキテクチャも取り入れたいと思いました。

3日目

 Wikipediaから取得したプログラミング用語一覧はJSONで取得した後、パースする必要がありました。スクレイピングは上記のiOSアプリでも利用していたので、特に戸惑うことはなかったです。あとは、ListViewに取得した用語一覧を表示して、用語の詳細を表示するWebViewを作成しました。用語一覧と詳細の画面はどちらもフラグメントとして作成したのですが、遷移の処理がうまく出来なかったので、アドバイス頂いた結果、詳細画面はActivityとして発行することに決めたところで、3日目が終わりました。

4日目

 詳細画面をアクティビティとして発行させて遷移するように実装しました。用語を選択すると、その用語のWikipediaのページが表示されるようになりました。あとは、1日目にやったのと同じようにnendSDKを導入して、用語一覧の一番上の行にネイティブ広告が表示されるようにしました。あとは、細かなところだと、用語一覧をあかさたなでセクション分けされるように処理を追加しました。

5日目

 用語一覧のセクションヘッダやタブの色、行の間隔などデザインの調整を軽く行って、アプリの実装作業としては終了にしました。
 残った午後の時間は1週間のフィードバックと今後についてお話ししたあと、この記事を作成しました。
 
 最終的に出来上がったアプリのスクリーンショットです。

f:id:fan_t_shishido:20180810170228p:plain
f:id:fan_t_shishido:20180810170236p:plain

感想、所感

 1週間、非常にあっという間でした。メンターとして面倒を見てくださった福岡さん、他社員の皆さんありがとうございました。自由に自分のやり方で作業を進めることができたので、とても居心地の良い空間でした。ランチにも毎度誘って頂き、お話ができたのでとても楽しかったです。nendSDKを実際に組み込むことで、どのようにして広告をアプリにあった形で表示するかを知ることができました。1週間の作業としてはいくつか心残りもありますが、インターンに参加できたことをとても感謝しています。