F@N Ad-Tech Blog

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

文系学生がデータサイエンティストを体験した結果

はじめまして。9月3日から9月7日まで5日間のインターンをしていたはなわです。
大学では経済学を学んでおり、プログラミング、統計、機械学習については基本的に独学です。

この度は株式会社ファンコミュニケーションズでデータサイエンティストを体験するというインターンに参加したので、それについて振り返ろうと思います。

インターンの内容

今回のテーマは広告をクリックしてくれる割合を予測するというものでした。
ここでいう広告とは、スマホアプリとかで遊んでいると下であったり、上であったり、時間制限つきで全画面に表示されるようなアレです。

ところで、スマホアプリの広告をミスクリック以外でクリックする人なんているんですかね?という問題提起をしようと思いましたが、私自身、3日程前に気になった広告をクリックしてました。しかし、長い時間スマホを使い、その中で広告をクリックしたことが何回あったでしょうか。私の場合は1年で10回クリックするかどうか程度ではないかと思います。
このようにごく稀にクリックする広告であるからこそ、今回のデータ分析は非常に大変なものでした。この分野だからこそなのですが、データの分布に偏りがあるとそのデータの分布自体を修正しなければならないとは思ってもいませんでした。

また、今までに触ったことのない膨大なデータを分析するため、データを読み込むだけでとても長い時間を費やしました。
私が触ったデータはビッグデータではないのかもしれませんが、これ以上のデータを扱うとは社員さんたちおそるべしです。

5日間で実施したこと

それでは、実際にどのようなことをやっていたかということを書いていこうと思います。

データ加工

5日間のインターンということですが、インターンの課題説明やあいにくの台風の影響などで実作業としては4日程度になります。
データサイエンティストは「業務の80%をデータクレンジングに費やす」という言葉がある通り、実作業の4日間のうち、ほとんどの時間がデータを加工する時間でした。
そもそものデータ加工のプログラムを書く段階でエラーが幾度となく発生したりで、本当にインターン期間の80%をデータ加工に使用していたのではないかと思います。
これほどまでにデータ加工に真剣に立ち向かったのは、初めてでした。

それでは、今回学んだデータ加工の手法を具体的に挙げていきます。

1.そのままデータを持ってくる。
一番簡単なデータ加工です。(これはデータの加工といっていいのでしょうか?)
しかし、これでもそのデータが使えれば問題なしです。 使 え れ ば 。

2.データを数字で分類。
例えば、月曜日を0、火曜日を1、……、土曜日を5、日曜日を6とするようにデータではなく数字で分類する手法です。これをLabel Encodingと言うようです。
ただ、この状態だと数字の大きさに意味のないデータの場合、不都合が生じてしまいます。

3.ダミー変数への加工による分類。
これも同様に曜日を例にあげると月曜だけ1を他の曜日は0とするように、1つの項目だけ1とし他は全て0と分類する手法です。これをOne Hot Encodingと言うようです。
もちろんこの手法にも問題があり、種類が1万あった場合、1個の1と9999個の0を入れるなどと、ただでも大きなデータがさらに大きくなってしまいます。

4.Count Encordingによる特徴量の変換。
これも比較的シンプルな手法で、データに含まれるカテゴリ変数の出現回数を数える手法です。
この手法を使用したのが初めてだったため、どう利用していいかわかりませんでしたが、メンターさんのサポートによりちゃんと理解することができました。

手法によって、どのときに使うのがベストなのかも今回学べたのではないかと思います。
今回学んだのは、この4つの手法ですが、もちろんこれ以上に様々な手法がありますので、今後も学習を続けたいと思います。

(余談ですが、今まで一番英文を読んでいたのは大学受験期に英語を集中的に学習していたときだと思うのですが、その時と等しいかそれ以上の英文を読んだような気がします。英語を読む力、体力も必要だと思いました。)

プログラミング

8割をデータ加工に費やし、残りの2割は機械学習を利用したモデル作成及び、精度検証のためのプログラミングをしました。

過去に学んだ際には、書かれているコードを写経しただけで、実際にどのような処理が行われているのかについては一切考えていませんでした。
(正確には、考えた瞬間に頭がショートして何も考えられなくなりました。)
今回は、統計について学習を行なっていたこと、予めデータ分析入門のテキストが渡されていたこと、
そして都度メンターさんが教えてくれたこともあり、以前よりは理解できるようになり、手法という観点からも考えられるようになったと思います。
0か1かを判別するということが基本であったため、期間中はロジスティック回帰を用いた分析をしていましたが、この記事を書きながら、最後に一つ、別の手法を使って機械学習の処理しています。
また、精度検証については決定係数を今まで使っていましたが、それ以外にも多様な検証方法があるということを教わり、Log Loss、normalized entropyを用いた検証を行いました。
この normalized entropy を計算する関数のプログラミングを行ったのですが、意味を理解していないとコードを書くこともできないと実感しました。
また、今回のデータには0と1で偏りが存在したので、バランスを修正したデータを検証に使いました。

これを書いているまさに今、先ほどの機械学習の処理が出たわけですが、期間中ずっと使っていたモデルよりもはるかにいい精度が出ました。
色々な機械学習の手法を学ぶことでより精度が出せる訳ですね。

社内の様子

インターンの内容はもちろん大切ですが、インターンの目的のもう一つには社内の様子を見るということもあります。
そこで私なりの社内の様子についての感想を一つ。

すごく作業がしやすい


このように思う理由としては四つ。
1.社内の雰囲気がいい。
静かすぎないという点とかは個人的によかったですね。
怒号が飛んでいるとか、社員さんたちが私語をしているというわけではなく、互いに相談しながら、笑いながら作業をしていたというのは外からきた私にとってはかなり居心地がよかったです。

『 寂 し が り な 訳 で は な い で す 』

2.質問を気軽にできる。
私のデスクの隣が今回指導をしてくれたメンターさんのデスクだったので、すぐに質問をすることができました。また、必要そうな資料を教えてくださったり、こちらから質問しなくても定期的に確認をしてくれたのはすごくありがたかったです。
また、そのメンターさんがデスクにいない場合であっても、Slackで質問をすると他の社員さんが答えてくれたりと私たちをサポートするという点では完璧であったとさえ思います。

『 コ ミ ュ 障 な 訳 で は な い で す 』

3.デスクの高さが変えられる。
私はこのタイプのデスクを初めて使いましたがすごいですね。高さが変えられるということは姿勢を調整できるということでもあり、このようなずっとパソコンに向かって作業をしていると同じ姿勢で疲れてしまうということがあります。家でも使いたいと思うほどに素晴らしかったですね。
私は可動範囲の最低まで下げて作業をしていました。この方が背筋が伸びて肘もつけられ、姿勢という観点からの疲れはなかったように思います。

『 背 丈 が 低 い 訳 で は な い で す 』


4.ノートPCの他にディスプレイが一枚使える。
パソコンを使うときにモニターが一つの人には想像できないことかもしれませんが、マルチモニターの人には理解していただけると思います。モニターが二つあるということは非常に作業しやすいです。
作業はメインモニターに、資料などすぐには使わないものをサブモニターに映すことで作業に集中できます。全て一つのモニターで行おうとすると画面が散らかって、気が散ってしまう私にはとてもよかったです。
ちなみに、私のサブモニターは常に六つ以上のウィンドウが開かれていました。

『 整 理 下 手 な 訳 で は な い で す 』

しつこいですか?
すみませんでした。

結論

初日は説明していることの半分程度の意味がわからず、このまま一週間大丈夫か?と胃が痛くなりかけましたが、わからないことにぶつかった際には詳しく説明をしてくださったため、徐々に意味もわかり、最終的には大方理解できたのではないかと思います。思っています。思わせてください。
上記の通りの素晴らしい環境であり、他では得られないような密度の高い5日間だったため、興味のある方にはオススメなインターンだと思います。
文系の私でもどうにか学んでこれたため、(大変かもしれませんが)やる気さえあれば多くのことを学べます!

5日間本当にお世話になりました!

1週間でFlutterを使ってアプリ開発させていただいた話

こんにちは。初めまして。
9月3日〜9月7日までの5日間で1週間インターンでお世話になりました澤です。

1週間のインターンの内容を紹介させていただきます。

F@Nにたどり着くまで

何社もインターンに応募しましたが、実力不足でなかなか決まらずに焦っていた矢先
偶然、WantedlyでF@Nの募集サイトを見つけ応募させていただきました。
運よく拾っていただいたので非常に感謝しています。

1日目

入社書類をたくさん書いた後、アドネットワークとは何かの説明を受けました。
今まで、何気なくアプリなどの広告を見ていましたが、裏ではこんなドラマがあるのかと非常に感動しました。
アドネットワークの世界は奥が深いのだと感じました。 

今回私は、nendSDKのチームにお世話になりました。
1日目は、nendSDKを理解するために、簡単な時計アプリを作成しました。
公式ドキュメントが充実しており、短時間で非常に簡単に広告を埋め込むことができて、感動しました。

 f:id:fan_k_sawa:20180907143901p:plain

今後アプリを開発した時は、是非とも広告を入れてみたいです。

2日目〜5日目

さて、ここからが本題です。
今回、定期テストの範囲を共有できるアプリをFlutterとFirebaseを使って作成しました。
 

Flutterとは?

Googleがオープンソースとして提供しているクロスプラットフォーム開発ツールです。
簡単に言えば、1つのコードで、iOS、Android両方のアプリを作れちゃう優れものです。
開発言語は、Dartという言語を使います。
僕の感想としては、Javaに似ている印象です。

Firebaseとは?

こちらもGoogleが提供しているモバイルアプリ開発のためのプラットホームです。
通常実装しようと思うと手間と時間がかかるユーザ認証やデータアクセス管理などを
簡単に実装することができる優れものです。
今回のアプリでは、リアルタイムデータベースを使用しました。
文字通りリアルタイムにデータベースを更新できるので、非常に便利でした。

2日目

テスト範囲共有アプリの大まかな構造とデザインを決めました。
Flutterとは何かということから、調べながら進めていきます。
また、FlutterとFirebaseの導入もしました。
FlutterもFirebaseもやらなければならない設定が多くて大変でした。
初めてのFlutterでのアプリ開発で慣れないことだらけでしたが、徐々にDartの作法などに慣れていきたいと思いました。

3日目

若干デザインを変更しつつ、
Firebaseを用いてテスト範囲を共有できる簡単なチャットのような機能を実装しました。
FirebaseとFlutterの連携は難しかったですが、様々なサイトを参考にしながら進めていきました。
また、この日はAndroidのエミュレータだけでなく実機でも正常に動かすことができました。
Dartに触れるのが初めてなのですが、Dartの作法などがJavaとは少し違い悪戦苦闘しました。
ドキュメントなどで調べながら慣れていきたいと思います。

4日目

アプリケーションのUIの細かな修正を入れつつ、全科目に対応できるよう機能拡張しました。
また、iOSのエミュレータでも動作することを確認しました。
今までAndroidのみでデバッグしてきましたが、iOSでも同じものが簡単に動きクロスプラットホーム開発の凄さを実感しました。
Flutterってすごい!
ただ、前日同様、Dart言語の作法に悪戦苦闘し、多くの時間をかけてしまいました。

5日目

複数科目のテストに対応できるように機能拡張し、科目詳細を表示できるようにしました。
また、テスト範囲共有ページで、一度投稿したものを編集できるようにもしました。
Flutterは、日本語の文献が少なく悪戦苦闘しましたが、無事編集もできるようになって嬉しかったです。

5日間で作ったアプリ

以下のようなリアルタイムでテスト範囲の共有ができるアプリを作りました。
5日間で、一通りの機能をつけることができました。iOSでもAndroidでも動きます。

まず、アプリを開くと、どの時期のテストなのかを聞かれます。
 f:id:fan_k_sawa:20180907181048p:plain

その後いくつかのステップを踏んで、科目一覧が表示されます。
 f:id:fan_k_sawa:20180907181213p:plain

科目を選ぶと、チャット形式で試験範囲や科目の情報を共有することができます。
 f:id:fan_k_sawa:20180907181604p:plain

コメントをタップすると編集画面になり、編集を行うことができます。
 f:id:fan_k_sawa:20180907182139p:plain

やり残したこと

投稿の削除機能の追加

編集はできるけど、削除はできないので、今後追加していきたいです。

日本語の表示がおかしくなる

Android、iOSで実行すると文字が中国語っぽくなってしまいます。
Flutterの仕様のようなので、改善されるのを待ちます。

ログイン機能の追加

現在は、誰でも読み書き可能な設定にしているので、セキュリティ的に問題が残ります。
Firebaseを使って簡単に実装できるそうなので、今後実装してみたいです。

などなど更に実装を進めていきたいです。

まとめ

今回のインターンでは、初めて一からアプリ開発を行いました。
インターン前はとても不安でしたが、1週間やり遂げることができてよかったです。

自分のやりたいことを比較的自由にやらせていただいたので、非常に感謝しています。

メンターの方には、Flutterを使った開発を行なったことがないにも関わらず、
Flutterでの開発を勧めてくださったり、レビューまでしていただいて感謝の気持ちでいっぱいです。
質問にも的確に答えてくださり、開発を効率よく進めることができました。
nendSDKが使えないアプリになってしまい申し訳ないです。

社員さんも皆優しく接してくださり、非常に居心地がよかったです。

F@Nのインターンに応募するか迷っているあなた、ぜひ応募することをおすすめします。

5日間という短い期間でしたが、ありがとうございました。
 

PythonによるSSP構築インターン!!

こんにちは、8月27日~8月31日の1週間インターンに参加した、みしまです!!

インターンの課題は、SSP構築でした。サーバ構築など研究以外の技術を学びたいと思い、今回のインターンに参加させて頂きました。

インターンの詳細は「目的・目標」、「概要」、「成果」、「まとめ・感想」の順で書きます。

目的・目標

今回、インターンでの個人的な目的・目標を以下に示します。

  • サーバ構築ができるようになる
  • バックエンドの技術を学ぶ

概要

インターンの課題はSSP構築でした。構築に利用したWebサーバやフレームワークなどを以下に示します。

Flask

Flaskは、Djangoより軽量で自由度が高い特徴があります。
課題ではSDK-SSP、SSP-DSPのやり取りにはjsonファイルのみだったので軽量で扱いやすいFlaskを利用するのが良いと思いました。

Gunicorn

Gunicornは、Python製のWSGIサーバの一種です。WSGIサーバはWebサーバとWebアプリケーションの間を最適化するためのものです。 FlaskはPythonで構築を行うためGunicornが適しています。

Nginx

Nginxは、メモリ使用量の少ない高速なWebサーバです。並列処理で負荷分散が可能になっています。SDKからのアクセスが多くなった時に1つのサーバでは処理できません。そのため、Nginxでアクセスを複数のサーバで処理するために利用します。今回はメモリの関係上、2つのSSPを構築しました。


システム全体を図に示します。

f:id:fan_t_mishima:20180903180053j:plain

成果

作成したシステムのパフォーマンスを確かめるために「1秒で処理できるリクエスト数」を指標として、値が大きいほどパフォーマンスが良いことを示します。
検証として以下の4通りの状態でパフォーマンスの変化を測りました。
①Nginx・Gunicornなし
②Gunicornなし
③Nginx・Gunicornあり・プロセス
④Nginx・Gunicornあり・スレッド
①~③はSSPから複数DSPにRequestsを送る際の並列処理をプロセスで行い、④ではスレッドで行いました。結果を以下に示します。

f:id:fan_t_mishima:20180903211741j:plain

結果から並列処理をプロセスからスレッドに変更した際に大幅にパフォーマンスが向上しました。両方の違いとしてスレッドは1つのプロセスで並列処理を行います。プロセスは同じプロセスを生成して、並列処理を行います。そのため、スレッドはCPU使用率が低いためパフォーマンス向上に繋がりました。

まとめ・感想

「目的・目標」に示したサーバ構築ができるようになりました。サーバ構築にはインタプリタ言語であるPythonを使用しました。これを並列処理が得意なコンパイラ言語にすることで、さらにパフォーマンス向上に繋がると考えられます。個人的にコンパイラ言語でサーバ構築をしようと思います。
 バックエンドの技術「Nginx」、「Gunicorn」は、研究では使わないため貴重な経験ができて良かったです。
最後に、サーバサイドの技術を多く学ぶことができてすごく楽しいインターンとなりました。
1週間、本当にありがとうございました。

アドテクの会社でCTR予測をしてみた。

はじめまして!5日間インターンとして参加させて頂いた中島です。
データ分析のインターンは初めてだったのですが、簡単に紹介させて頂きます。
今回はCTR予測を行いました。

CTR予測

CTRとは「ユーザに広告を表示しクリックされる確率」を言います。
広告配信の最適化は、限られた広告予算の中でクリック率を最大化することであり、そのためにはCTRを正しく予測することが不可欠です。
この5日間で、より精度の高いCTR予測をするモデルの設計に取り組みました。

5日間の流れ

1日目 事務処理と大規模データベースへのアクセス

午前には事務手続きをし、その後アドテクについて教えて頂きました。

本格的に業務が始まったのは午後から。
まず、CTR予測をするためのデータの取得をします。Treasure Dataに接続し、SQLを用いて必要なデータを取り出しました。ここで、はじめてPrestoに触れました。

なんとなくSQLが書けるようになったら、今度はjupyter notebookから接続し、データをローカルの環境に引っ張ってきます。

広告のリクエスト数が1億以上あったため、
データをうまくサンプリングしないとカーネルが落ちて大変でした。

引っ張ってきたデータを眺めながら、広告のクリックされる確率の低さ(0.5%くらい?)に驚きつつ1日目を終えました。

2日目 データ整形とネガティブダウンサンプリング

この日は昨日とってきたデータの整形とネガティブダウンサンプリングを行いました。
ネガティブダウンサンプリングとは、意図的に負データを減らすことで、正データとの比を揃えることです。
今回のCTR予測ではクリックされない広告のリクエストを100分の1程度に減らしました。

その後欠損データの修正などデータハンドリングを行い、ロジスティック回帰を用いて学習しました。

モデルの評価に使うのはAUC, LogLoss, NEの3つ

AUC Area under the curve 予測した際のROC曲線の下側部分の割合。大きいほどよい。
LogLoss Logarithmic Loss 予測値と正解との距離を対数とった値。小さいほどよい。
NE Normalized Entropy モデルにより予測されたLogLossを、平均から予測されたCTRのLogLossで割った値。1より高いと平均から予測した方がまし。

それぞれの違いは今回メンターについてくださったsakaiさんの記事を参考にしてください。

tech-blog.fancs.com

3日目 特徴量の追加とグリッドサーチ

2日までは限られた特徴量のみを使っていたのですが、3日目から特徴量を増やしました。

そしてグリッドサーチを用いてロジスティック回帰モデルのパラメタチューニングを行いました。

が、大して成果が出ることはなくこの日は悲しみの帰宅。

4日目 他の学習モデルを試す

3日目まででロジスティック回帰に限界が見えてきた(個人的な特徴量エンジニアリング力不足)ので、他の手法を試してみることにしました。
今回試したのがLightGBMです。
Welcome to LightGBM’s documentation! — LightGBM documentation

LightGBMはXGBoostなどと同じ勾配ブースティングの一つです。
XGBoostと同程度の性能でありながら、より高速で機械学習コンペなどでもよく目にすることから使ってみました。

ワンホットエンコーディングなど色々勝手にやってくれるのでとても楽(特徴量エンジニアリングとは、、)

5日目 特徴量選択とパラメータチューニング

昨日試したLightGBMのモデルのスコアを上げるため、もう一度使用する特徴量を見直すことにしました。
LightGBMには訓練データのそれぞれの特徴量の重要度を測るメソッドがあるので、それを用いて特徴量の選別を行いました。

f:id:fan_k_nakashima:20180831182033p:plain
特徴量名は伏せてますが、こんな感じで可視化できます。

その後特徴量を選択し、簡単なパラメタチューニングを行った最終的な結果がこちら

f:id:fan_k_nakashima:20180831182110p:plain

訓練データ:2018年7月1日~31日のログ
テストデータ:2018年8月1日~7日のログ

学習モデル AUC LogLoss NE
XGBoost 0.71 0.0326 0.9557
LightGBM 0.74 0.0320 0.9391

同時に試したXGBoostのスコアも載せてあります。
スタッキングなどをすればもっと上がったんでしょうが、5日間ということもあってここでタイムアップ。
NEが0.9391なので平均から予測するよりは良いモデルになってくれました。

まとめと感想

  • LightGBMを用いてそこそこ精度の高いモデルができた
  • ビックデータのハンドリングはサンプリングが大事

まともにデータ分析を行ったのは初めてでしたが、メンターのsakaiさんが丁寧に教えてくださったおかげで全体の流れがみえました。
レベルに合わせて教えて頂けるので、聞きたいことを聞きつつ伸び伸びやらせて頂きました。
生データを使ってデータ解析をしたい人、自分のペースに合わせて進めたい人にはとても良いインターンなのではないかと思います!
5日間お世話になりました!

SSP構築インターンに参加してきた

初めまして、森です。
8月20日~24日の5日間、SSP構築インターンに参加させて頂きました。
一緒に参加した倉林くんは日記形式のブログでした。
インターンの詳細なレポートにつきましてはそちらを参照して頂けると幸いです。
tech-blog.fancs.com

私はこのインターンに参加しようか考えている人に向けて書きたいと思います。

はじめに、結論から申しますと

めっちゃオススメのインターンです!!

サーバサイドの開発やアドテク業界に興味のある方は、是非参加を検討してほしいと思いました。

内容も勿論ですが、交通費や宿泊費についても殆ど全て支給して頂けるので、私のように遠方の学生でも安心です。
どうやら、私は特別選考枠に合格したようです。

内容

SSP (Supply-Side Platform) を少し簡単な仕様にしたMini-SSPの開発インターンです。
Mini-SSPをざっくりと説明すると、『広告のリクエストを受けて、DSPに広告の入札リクエストを投げて、最も入札金額の高い広告をレスポンスとして返すサーバサイドのプログラム』です。
開発したMini-SSPは最終的には、用意して頂いたSDK(広告をリクエストする部分)、DSPでテストします。

開発言語はかなり柔軟に対応して頂けるようでした。
今回私は、オススメして頂いたこともありScalaを選択しました。なおScalaは未経験の模様。かなり難しくて苦労しました

日程は5日間。
初日は入社書類の記入や社内案内、SSPに関するイントロダクションが主でした。残った時間で開発をしますが、開発環境は殆どまっさらな状態から始まるため、実際には開発環境を整えるところから始まります。
2日目~4日目はすべて開発に時間を使うことができました。
5日目は本番環境でテストをする日……

だったのですが、私は3日目の夜に食べたご飯があたったのか、胃腸炎になりダウン。
後になって分かったのですが、4日目の実習中に見舞われていた関節痛は、寝違えたのではなく胃腸炎の炎症に由来するもの?だったそうです。まさに馬鹿は風邪をひかない
インターン中はとても充実していて楽しかった分、悔いを残しての幕引きとなってしまいました。二度と炙りサーモンは食べない。

オフィス

オフィスは東京都渋谷区の青山ファーストビル4F。
通りに面していて、駅からも遠くない、コンビニや食事処が近くにある好立地でした。
とても綺麗なオフィスで、コーヒーやお茶などが飲み放題、オフィス中央には社員の人が補充した軽食などが置かれていました。
お茶の飲み放題がとても良かったので、作業に疲れたら気分転換にお茶を汲みに行っていました。

オフィスの机は自動昇降機能付きの机で、高さを調整する機能付きでした。
オフィス内にはこの机を高くして立って業務に取り組んでいる方もおられました。

ファンコミュニケーションズさんの社員の皆さん

社員の皆さんはとても気さくで優しい方ばかりでした。
Scalaらしいコードの書き方についてアドバイスを頂いたり、親身になって一緒にデバッグして頂いたりと、お世話になりっぱなしでした。

まとめ

  • 学生に合わせた柔軟な実習
  • かなりガッツリ開発を体験
  • 社員さんが優しい

いいところばっかりの紹介になってしまいましたが、本当にいいところばっかりのインターンシップでした。

いろいろ助けて頂いてようやく完成させることができたMini-SSPをテストすることができなかったのは悔やまれますが、とても充実した4日間でした。
知らないことづくめでしたが、様々な新しいことに挑戦することができ、とてもいい刺激になりました。
これを読んでいる貴方の参加する一助となれば幸いです。

謝辞

実習中は色々と教えていただきました。
とても良い経験になり、沢山の刺激を受けることができました。
この場をお借りしてお礼を申し上げたいと思います。
ありがとうございました。

また、最終日には関係者の方々に多大なご心配とご迷惑をおかけしてしまいました。
今ではすっかり元気になりました。
まだまだ残暑の厳しい季節ですので、ご自愛ください。
生ものには要注意です。