目的
Apache Spark の MLlib による機械学習を用いて、気象条件が与える甲子園球場におけるプロ野球観客動員数への影響を調べてみます。
※こちらの投稿はデータの準備段階までです
データの準備
気象データ
2019年3月29日から9月30日までの気象データを気象庁のページより取得しました(ありがとうございます)。
ただ、西宮市のデータには気温や風速などの情報が無かったため、代わりに大阪市のデータを取得しています。
過去の気象データ・ダウンロード
色んなデータが指定出来るようですが、とりあえず今回指定した項目は以下です。
観客動員数データ
2019年シーズンの成績データを以下のページを参考にさせていただきました(ありがとうございます)
プロ野球Freak
使用したいデータは甲子園の観客動員数のみでしたが、ついでに勝敗や対戦相手なども取得しました。
ここで開始時刻と勝敗については、以下のように変換しています。
[開始時刻]
14:00(デイゲーム) -> 0
18:00(ナイトゲーム) -> 1
それぞれのファイル(weather.csv, game.csv) を HDFSに保存しておきます。
今回は /data/mllib/input/ 配下に保存しました。
また、予めフィールド名を以下のように変更しておきました。
weather.csv
game.csv
spark-shell の起動
/usr/hdp/2.6.2.0-205/spark2/bin/spark-shell --master yarn --deploy-mode client --packages org.apache.lucene:lucene-kuromoji:3.6.2 --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
バージョンは以下のとおりです。
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1.2.6.2.0-205
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_232)
気象データを読み込む
Weather の case class を定義しておきます。
case class Weather(
date: String,
dayOfWeek: String,
rainfall: Double,
aveTemp: Double,
aveWindSpeed: Double)
spark のライブラリを使用して、DataFrame として読み込みます。
scala> import org.apache.spark.sql.Encoders
scala> val schemaWeather = Encoders.product[Weather].schema
scala> val weatherCSV = spark.read.option("header","true").schema(schemaWeather).csv("/data/mllib/input/weather.csv").as[Weather]
scala> weatherCSV.first
res0: Weather = Weather(2019/3/29,金,0.0,12.1,2.0)
観客動員数データを読み込む
BaseballGame の case class を定義しておきます。
case class BaseballGame(
date: String,
startTime: Integer,
result: Integer,
opponent: String,
startingPitcher: String,
audience: Integer,
gameTime: Double)
spark のライブラリを使用して、DataFrame として読み込みます。
scala> val schemaGame = Encoders.product[BaseballGame].schema
scala> val gameCSV = spark.read.option("header","true").schema(schemaGame).csv("/data/mllib/input/game.csv").as[BaseballGame]
scala> gameCSV.first
res6: BaseballGame = BaseballGame(2019/4/9,1,0,DeNA,ガルシア,46298,3.5)
スキーマの確認
気象データ、観客動員数データそれぞれのスキーマを確認しておきます。
scala> weatherCSV.printSchema
root
|-- date: string (nullable = true)
|-- dayOfWeek: string (nullable = true)
|-- rainfall: double (nullable = true)
|-- aveTemp: double (nullable = true)
|-- aveWindSpeed: double (nullable = true)
scala> gameCSV.printSchema
root
|-- date: string (nullable = true)
|-- startTime: integer (nullable = true)
|-- result: integer (nullable = true)
|-- opponent: string (nullable = true)
|-- startingPitcher: string (nullable = true)
|-- audience: integer (nullable = true)
|-- gameTime: double (nullable = true)
データの結合
date カラムを使って、気象データと観客動員数データを結合します。
観客動員数データの方が少ないため、これに対して気象データを結合していきます。
scala> val gameAndWeather = gameCSV.join(weatherCSV, "date")
scala> gameAndWeather.show
+---------+---------+------+--------+---------------+--------+--------+---------+-----------+-------+------------+
| date|startTime|result|opponent|startingPitcher|audience|gameTime|dayOfWeek|rainfall|aveTemp|aveWindSpeed|
+---------+---------+------+--------+---------------+--------+--------+---------+-----------+-------+------------+
| 2019/4/9| 1| 0| DeNA| ガルシア| 46298| 3.5| 火| 0.0| 12.3| 3.2|
|2019/4/10| 1| 1| DeNA| 青柳| 40116| 3.23| 水| 16.0| 9.3| 3.5|
|2019/4/11| 1| 1| DeNA| 秋山| 38078| 3.27| 木| 0.0| 11.4| 3.3|
データを結合するところまでできました。
こちらのデータを用いて、引き続き分析を進めていきます。