Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Pysparkで始めるデータ分析

3,284 views

Published on

Pysparkで始めるデータ分析
A/BテストをテーマにPysparkを使ってデータ分析を始めてみましょう。
Jupyter Notebookのサンプルは以下になります。
https://apsportal.ibm.com/analytics/notebooks/44b83c22-b6d6-4327-97d8-f5070d3f1c74/view?access_token=23d67e4f92799086c02e5692f920679a5207dd3e46cbc563d0ca76205a5fe5d6

Published in: Technology
  • Be the first to comment

Pysparkで始めるデータ分析

  1. 1. © 2016 IBM Corporation Pysparkを使ったデータ分析 Tanaka Y.P 2017-4-12
  2. 2. © 2016 IBM Corporation2 自己紹介 田中裕一(yuichi tanaka) 主にアーキテクチャとサーバーサイドプログラムを担当 することが多い。Hadoop/Spark周りをよく触ります。 Node.js、Python、最近はSpark周りの仕事でScalaを書く ことが多い気がします。 休日はOSS周りで遊んだり。 詳解 Apache Spark
  3. 3. © 2016 IBM Corporation3 自己紹介
  4. 4. © 2016 IBM Corporation4 アジェンダ • データ分析のお話 • BigDataとApache Spark • 今日やること • A/Bテストをテーマにデータ分析業務を見ていこう • データサイエンスのサイクルとDSX,WatsonMachineLearningのご紹介
  5. 5. © 2016 IBM Corporation5 データ分析のお話 データ分析の目的は • データから情報を吸い出し、ビジネス課題の理解、データの理解する • 情報をもとに改善・新規施策の仮説を構築 • 仮説をもとに施策を行い評価可能なデータを収集 • 評価をもとにさらなる改善を行う • 継続的な一連の流れを新たな価値とする
  6. 6. © 2016 IBM Corporation6 分析アプローチ 健康診断 探索 検証 現在の状態を把握する『なぜ』の裏付け • 基礎集計 • 売り上げ分析 • 顧客分析 • サイト分析 何らかの「目的」を持った探索 基礎集計・機械学習的手法 • 有料会員化のためのフロー • 離脱ユーザーのカムバックフロー • UI・UXのためのセグメンテーション 何らかの「仮説」に基づいた検証 定量的な観測 • Stepup施策の効果検証 • カムバック施策の効果検証 • 離脱抑制施策の効果検証
  7. 7. © 2016 IBM Corporation7 ビジネス課題やド メインの理解 データ取得 データ 探索・理解 データ クレンジング データ変換 (加工) 評価 分析・モデル 作成 結果を共有 モデル適用 アプリ作成 データ・ エンジニア データ・ サイエンティスト ビジネス・アナリスト アプリ開発者 データサイエンスのサイクル
  8. 8. © 2016 IBM Corporation8 BigDataとはどんなものか
  9. 9. © 2016 IBM Corporation9 Sparkとは 従来Hadoopでは難しかったBigDataにおける アドホック分析やニアリアルタイム処理を実現するための InMemory分散並列処理フレームワーク。 • HDFSを筆頭にCassandraなど分散ストレージのデータと相性が良い • YARN,Mesos,Standaloneの3種類の分散処理基盤の上で動作 • SparkSQL,Streaming,MLlib,GraphXといった処理の拡張を持つ
  10. 10. © 2016 IBM Corporation10 • Java, Scala, Pythonを利用してETLを実行可能 • RDD(Reslient Distributed Datasets)はScalaのコレクションの Seqのようなもので、データを順番に保持 • RDDの内部はパーティションに分かれている。パーティション 毎にデータを保持(HDFSブロック数に依存) • 分散処理する際にはパーティション毎に並列に処理 • mapやfilter等の基本的な操作の場合、データの順序は変わ らない。 val csv = spark.textFile("tokyo.csv") val pairs = csv.map(line => (line.split(","))) .map(x => (x(0).take(8), (x(4).toFloat, 1))) .reduceByKey( (x,y) => (x._1 + y._1, x._2 + y._2) ) .map(x => (x._1, x._2._1/x._2._2) ) .sortByKey()  Spark CoreはSparkのエンジン Spark Core 20150614 22:00:00,0,1,8,20.9,8,3.0,8,南南西,8,85,8 20150614 23:00:00,0,1,8,20.9,8,2.6,8,南南西,8,86,8 20150615 00:00:00,0,1,8,20.5,8,1.0,8,南,8,86,8 20150615 1:00:00,0,1,8,20.4,8,0.7,8,南,8,88,8 (2015/6/14,22.565218) (2015/6/15,24.550001) (2015/6/16,23.358332) (2015/6/17,21.583334) 例:平均気温の計算
  11. 11. © 2016 IBM Corporation11 • SQLを利用したデータ操作が可 能 • トランザクションなし • Parquet 、Json、Hive だけで なくJDBCやODBCもサポート • Thrift JDBC/ODBCによる外部 からの接続 • 後述のDataFrameをラップする 形で実装 {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {"name":"土屋", "address":{"city":"豊洲", "state":"東京"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} {"name":"岸代", "address":{"city":"後楽園", "state":"東京"}} val people = sqlContext.jsonFile("test.json") people.registerTempTable("people") val nameAndAddress = sqlContext.sql("SELECT name, address.city, address.state FROM people WHERE address.state="神奈川"") nameAndAddress.collect.foreach(println) {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} 例:住所データ(json)からの特定データの抽出 • SparkSQLによるデータ操作 Spark SQL
  12. 12. © 2016 IBM Corporation12 • Sparkによるミニ(マイクロ)バッチの実行 • DStreamと呼ばれるRDDを操作 • 指定間隔ごとにまとめられたRDDを処理(Windows処 理も可能) • 通常のSparkプログラミングとほぼ同様 たとえば、定期的に流入するデータの「移動平均値」の連続計 算 val tstream = ssc.socketTextStream(hostname, port) var mdtxt = tstream.map(x => x.split(",")) .map(x => ( x(0), (x(0), x(1), x(2).toInt) ) ) .updateStateByKey(updateFunc _) mdtxt.print() センサーデータ: (Dev1, 201501010000, 0) (Dev2, 201501010000, 0) (Dev1, 201501010001, 1) Alert: Dev1 Status changed : 1  Sparkでストリーム処理 Spark Streaming 例:センサーデータの出力値変更時にアラート DStream RDD data data RDD data data RDD data data
  13. 13. © 2016 IBM Corporation13 • MLlibとRが利用可能 MLlibはScalaで、SparkRはRで 記述可能 • アルゴリズム(MLlib) • SVM、ロジスティック回帰、決定木、K- means、ALSなど • IBMはSystemMLをSparkに提供 val data = spark.textFile("kdata.txt") val parsedData = data.map(x => Vectors.dense(x.split(',').map(_.toDouble))).cache() val numClusters = 3 val numIterations = 10 val clusters = KMeans.train(parsedData, numClusters, numIterations)  Sparkで機械学習 SparkR, Mllib データ: ( 直近購買月[n日前], 期間内購買回数 ) (5,1),(4,2),(5,3),(1,2),(2,4),(2,5),(2,6),(1,4),(1,5),(1,2),(1,5),(5,5) クラスタ結果: ([中心], 人数) ([1.0, 2.0], 2), ([1.5, 4.833333333333333], 6), ([4.666666666666666, 2.0], 3), ([5.0, 5.0], 1) 例:顧客のクラスタ分け 0 2 4 6 0 2 4 6
  14. 14. © 2016 IBM Corporation14 • グラフデータを並列分散環境で処理するための フレームワーク • グラフ構造データを用いた解析を行う • 「点」と「辺」からなるデータ • SNSでのつながり、データ間の関連性 など • 表構造では扱うことが難しい関係を見つけ出す • データ間のつながりの抽出 • 輪の抽出 • 距離の計測 • 影響の計測 • グラフDBとの兼ね合い(これから) val graphWithDistance = Pregel( graph.mapVertices((id:VertexId, attr:Int) => List((id, 0))), List[(VertexId, Int)](), Int.MaxValue,EdgeDirection.Out)((id, attr, msg) => mergeVertexRoute(attr, msg.map(a=> (a._1, a._2 + 1))),edge => { val isCyclic = edge.srcAttr.filter(_._1 == edge.dstId).nonEmpty if(isCyclic) Iterator.empty else Iterator((edge.dstId, edge.srcAttr)) },(m1, m2) => m1 ++ m2 )  Sparkでグラフ処理を Spark GraphX つながりの検索 例: つながりと距離を見つけ出す 1,((1,0), (6,1), (9,1), (7,1), (4,2)) 1 2 3 4 5 6 7 89
  15. 15. © 2016 IBM Corporation15 DataSet API • Spark v1.6で追加された新しいAPI • 登場背景 • RDDとDataFrameという二つの抽象概念ができてしまった。 • RDDとDataFrameにそれぞれ長所があること • 2つの抽象概念を行き来する為のコストがかかる • 二つの抽象概念をいいとこ取りしたDataSetAPIの登場 • DataFrameの速さはそのまま • オブジェクト・メソッドはコンパイル時のタイプセーフ提供 • DataFrameとのシームレス変換
  16. 16. © 2016 IBM Corporation16 Structured Streaming • Spark v2.0で追加された新しいAPI • Datasetの上に実装されたHigh-levelのStreamingAPI • Streamingデータを構造化データとして継続的に処理可能 val in = spark.readStream .schema(schemaImp) .format("csv") .option("header", true) .option("maxFilesPerTrigger", 1) .load("csv-logs") Jacek Warszawa, Polska, 42,true Jacek Warszawa, Polska, 42,true ------------------------------------------- Batch: 0 ------------------------------------------- +-----+--------+-------+---+-----+ | name| city|country|age|alive| +-----+--------+-------+---+-----+ |Jacek|Warszawa| Polska| 42| true| +-----+--------+-------+---+-----+ complete output delta output
  17. 17. © 2016 IBM Corporation17 今日のお話し サンプルデータを使ってPysparkで健康診断と探索を行ってみよう • Pysparkを簡単に書いてみよう • 顧客分類について知ろう • A/Bテストユーザーの抽出をやってみよう • A/Bテストユーザーの抽出にKMeansを使ってみよう アクセス ログ.csv 顧客マス タ.csv 購買ロ グ.csv 顧客セグメント A/Bテスト 用ユー ザーグ ループ
  18. 18. © 2016 IBM Corporation18 A/Bテストとは何ぞや? A/Bテスト(英: A/B testing)とは、主にインターネットマーケティングで行われる、施策判断 のための試験の総称である。 狭義ではA/Bテストは仮説検定を指す俗称である[1]が、広義のA/Bテストはインターネット マーケティングにおける施策の良否を判断するために、2つの施策同士を比較検討する行 為全般を指す。 by wikipedia 参考: https://ja.wikipedia.org/wiki/A/B%E3%83%86%E3%82%B9%E3%83%88 大人気! ダイエットドリンク 大人気! ダイエットドリンク ○○で第一位! ○○で第一位! 健康に優しい成分 10種類配合 リピート購入続出 たった1ヶ月で -10キロ 下の内どちらがより効果的か?
  19. 19. © 2016 IBM Corporation19 DATA SCIENCE EXPERIENCE goo.gl/6iVeoZ
  20. 20. © 2016 IBM Corporation20 ビジネス課題やド メインの理解 データ取得 データ 探索・理解 データ クレンジング データ変換 (加工) 評価 分析・モデル 作成 結果を共有 モデル適用 アプリ作成 データ・ エンジニア データ・ サイエンティスト ビジネス・アナリスト アプリ開発者 データサイエンスのサイクル(再) goo.gl/6iVeoZ
  21. 21. © 2016 IBM Corporation21 IBM Data Science Experienceの特徴 コミュニティオープンソース IBM Value adds - チュートリアル、データセットの探 索 - データサイエンティストとの共創 - 質問をする:Ask Question - 情報を収集する (記事、論文、技術情報) - プロジェクトの共有 - Scala/Python/R/SQL - Jupyter / Zeppelin* Notebooks - RStudio IDE / Shinyアプリ ケーション - Apache Spark - その他のライブラリ • Object Storage • 生産性を高める追加機能 - 高度なビジュアライゼーショ ンライブラリ - The DSX Canvas - IBM Machine Learning goo.gl/6iVeoZ

×