Slide 1

Slide 1 text

新卒2年目がデータ分析APIの開発に挑戦した話
 松井 宏典
 株式会社スカラパートナーズ 


Slide 2

Slide 2 text

目次
 ● 自己紹介
 ● 会社紹介
 ● 分析データAPIの実装内容
 • AWSの話
 • クラスタリング
 • Pythonでの実装
 ● まとめなど
 2/24

Slide 3

Slide 3 text

自己紹介
 松井宏典(まつい こうすけ)
 名前
 Python:pandas, scikit-learn, Django
 aws:Lambda, S3
 スキル
 株式会社スカラパートナーズ(2年目)
 所属
 画像認識、データ分析、その他R&D
 主に機械学習に関する案件を担当。
 頑張ってできることを増やしています。
 業務など
 3/99

Slide 4

Slide 4 text

会社紹介 - 株式会社スカラパートナーズ -
 社会課題解決を軸にした共創型のビジネス
 ● 新規事業の立ち上げ
 ● ワーケーション事業
 
 開発部の開発実績
 ● コロナワクチン予約システム
 ● エールラボえひめ
 ● ナンバープレート検出モジュール
 ● データ分析
 4/24

Slide 5

Slide 5 text

目次
 ● 自己紹介
 ● 会社紹介
 ● 分析データAPIの実装内容
 • AWSの話
 • クラスタリング
 • Pythonでの実装
 ● まとめなど
 5/24

Slide 6

Slide 6 text

開発背景
 BUSINESS-ALLIANCE株式会社と共同開発
 アンケートデータの分析・可視化サービス
 分析処理を担うAPIの開発を担当
 
 2つのAPIを開発
 ● クラスタリング
 ● テキストマイニング
 6/24 引用:BUSSINESS-ALLIANCE「事業概要」 (https://business-alliance.co.jp/service/)

Slide 7

Slide 7 text

バックエンドのAWSの構成について
 ①csv保存 ②HTTPリクエスト csvの保存場所と 分析パラメータを渡す ③リクエスト 分析処理をリクエスト ④レスポンスを返す 成功時:分析結果の場所 失敗時:エラー文 分析が終わったら 結果をS3に保存 7/24

Slide 8

Slide 8 text

担当部分
 ①csv保存 ②HTTPリクエスト csvの保存場所と 分析パラメータを渡す ③リクエスト 分析処理をリクエスト ④レスポンスを返す 成功時:分析結果の場所 失敗時:エラー文 分析が終わったら 結果をS3に保存 8/24

Slide 9

Slide 9 text

AWS SAMを使って構築(CloudFormationの拡張)
 
 メリット / 選んだ理由
 ● 使用リソースをコード上で管理
 ○ 同一設定のテスト環境と本番環境を作成できる
 ○ APIのコード(Lambda)をgitで管理できる
 ● Lambdaをローカルでテストやデバッグができる
 開発環境
 9/24

Slide 10

Slide 10 text

目次
 ● 自己紹介
 ● 会社紹介
 ● 分析データAPIの実装内容
 • AWSの話
 • クラスタリング
 • Pythonでの実装
 ● まとめなど
 10/24

Slide 11

Slide 11 text

クラスタリングとは
 11/24 本をよく買う 服をよく買う 本をよく買う 服をよく買う クラスタリング:データをグループ分けする分析手法(教師なし学習)
 市場調査、マーケティングへの活用によく使われる


Slide 12

Slide 12 text

クラスタリングAPIについて
 アンケートのようなデータを分析する想定
 クラスタリングのために、データ間の距離(類似度)を定義・計算する
 
 12/24 ID お米が好き? 野菜が好き? 果物が好き? 肉が好き? 魚が好き? 0001 好き 嫌い 好き とても好き 好き 0002 好き 普通 普通 嫌い 好き 0003 とても好き とても好き 好き 普通 普通 : 0123 嫌い 嫌い とても好き 嫌い とても嫌い

Slide 13

Slide 13 text

数値に変換することで、データ間の距離を計算できるようになる
 
 入力データについて
 13/24 ID お米が好き? 野菜が好き? 果物が好き? 肉が好き? 魚が好き? 0001 4(好き) 2(嫌い) 4(好き) 5(とても好き) 4(好き) 0002 4(好き) 3(普通) 3(普通) 2(嫌い) 4(好き) 0003 5(とても好き) 5(とても好き) 4(好き) 3(普通) 3(普通) : 0123 2(嫌い) 2(嫌い) 4(とても好き) 2(嫌い) 1(とても嫌い) 距離:5

Slide 14

Slide 14 text

入力データについて
 複数選択肢から1つを選ぶ、かつ回答が段階的でない設問はどうするのか
 こういった変数をカテゴリカル変数といい、ダミー化という処理をする
 
 Q.以下の料理ジャンルで最も好きなものを選んでください
 -> 和食 / 洋食 / 中華 / イタリアン …etc
 14/24 ID 好きな料理 0001 和食 0002 洋食 0003 イタリアン : 和食 洋食 中華 イタリアン 1 0 0 0 0 1 0 0 0 0 0 1 : (1=はい、0=いいえ)


Slide 15

Slide 15 text

入力データについて
 複数選択可能な設問も考えられます。
 
 Q.自炊をする理由として該当するものを全て選んでください。(複数選択可) 
 ->食費を抑えたいから / 料理が好きだから / 健康的な食材を使いたい …etc
 15/24 ID 食費を抑えた い 料理が好き 健康的な食材 を使いたい 好きなものを 食べたい その他 0001 1 0 1 0 0 0002 1 1 0 0 0 0003 0 0 0 0 1 : (1=はい、0=いいえ)


Slide 16

Slide 16 text

目次
 ● 自己紹介
 ● 会社紹介
 ● 分析データAPIの実装内容
 • AWSの話
 • クラスタリング
 • Pythonでの実装
 ● まとめなど
 16/24

Slide 17

Slide 17 text

● pandas
 ○ データ解析を容易にするライブラリ
 ○ DataFrame型は、二次元のテーブルデータを表す
 ○ 数表および時系列データの操作が簡単
 ● scikit-learn
 ○ オープンソースの機械学習ライブラリ
 ○ 今回はクラスタリングで使用
 ○ 他にも、分類、回帰などのアルゴリズムも使える
 ● boto3
 ○ AWSをPythonから操作するためのライブラリ
 ○ 今回は、Lambda上からS3にアクセスするのに使用
 主な使用ライブラリ
 17/24

Slide 18

Slide 18 text

クラスタリングのコード例
 18/24

Slide 19

Slide 19 text

● フロント側からパラメータを受け取る
 ○ クラスタリングする数など
 ● 解析結果を可視化できるような出力
 ○ クロス集計
 ○ レーダーチャート
 ● テキストマイニングのAPIを別で作成
 ○ 自由回答のあるアンケートを想定
 ○ 単語集計、共起ネットワークの生成
 その他の実装内容
 19/24

Slide 20

Slide 20 text

目次
 ● 自己紹介
 ● 会社紹介
 ● 分析データAPIの実装内容
 • AWSの話
 • クラスタリング
 • Pythonでの実装
 ● まとめなど
 20/24

Slide 21

Slide 21 text

距離定義の話
 ● 距離をどう定義するのが”一般的か”で悩んだ
 ● 結論、細かい調整はデータや調査の目的次第
 ○ 質量混在データはgower距離
 ○ 標準化(平均0, 分散1)して相対的に距離計算
 苦労したこと
 21/24 回答者 肉が好き? 野菜が好き? 好きな料理 A 4 3 中華 B 4 5 中華 C 4 3 イタリアン BさんとCさんのどちらが
 Aさんに近い(似ている)か?
 
 カテゴリ変数と数値変数の
 距離をどう比べるのか?


Slide 22

Slide 22 text

苦労したこと
 subprocessをLambda上で使用した際のメモリエラー
 ● テキストマイニングAPIで、コマンド実行するためにsubprocessを使っていた
 ● 連続でAPIを叩くとメモリ不足のエラー
 ○ なぜか再現性がなく、とりあえずメモリ拡張したけど再発した 
 ● subprocess.run(‘ls’)みたいなコマンドでも同様のバグ発生 
 ○ コマンドの内容ではなく、subprocessの挙動の問題
 ● subprocessが子プロセスをコピーして生成する、みたいなのがエラーの原因? 
 ○ 加えて、Lambdaのライフサイクルがブラックボックス 
 ○ メモリ容量を監視することで、ちゃんとエラー発生を追えるようになった 
 ● 結局メモリ解放する処理を加えたら直った 
 ○ Lambdaでsubprocessは非推奨とのことだった
 22/24

Slide 23

Slide 23 text

まとめ
 ● データ分析の知識がかなりついた
 ○ 適した手法、適していない手法などは知識が重要
 ○ 基礎的な数学知識はあって良かった
 ● awsのサーバーレスアプリケーションの知識もついた
 ○ Lambda, SAMなど
 ● 保守性などに難ありかも
 ○ テスト設計をあまりせずに開発をしていた
 ○ 1人で書いていて可読性を犠牲にするときもしばしば....
 23/24