空間データの可視化と集計

  • 今回の演習では、スポーツデータ(サッカー)を事例として空間データの可視化と集計を行います。
  • まず、サッカーのピッチを可視化し、次にコドラート法などを使ってポイントデータの集計を行います。

データのダウンロード

  • SFC-SFSの課題ページからデータをダウンロードして下さい。
  • ダウンロード先のフォルダは、この授業の演習用フォルダを作成してください。

ライブラリをダウンロードし読み込む

# ライブラリのダウンロードと読み込み
install.packages("spatstat", dependencies=TRUE)
library(spatstat)
install.packages("plotrix", dependencies=TRUE)
library(plotrix)
# source("http://aoki2.si.gunma-u.ac.jp/R/src/plot.R", encoding="euc-jp")

RまたはR studioを起動する。

# 作業フォルダの指定
setwd("...") # ""内に上記でダウンロードしたファイルが含まれているフォルダのパスを指定してください。

ピッチの作成

#コートの大きさの設定
# タッチライン、ゴールライン
tl0 <- 105 
gl0 <- 68  
#ペナルティエリア
paxl0 <- 16.5
payl0 <- 40.32
#payl0 <- 13.84
#ゴールエリア
gaxl0 <- 5.5
gayl0 <- 18.32
# ゴール
ggyl0 <- 7.32
# センターサークル
ccircle0 <- 9.15
# ペナルティマーク
pmark <- 11
# 選手速度(表示用)
sp <- 25
#座標を設定する
# 倍率
size <- 100
tl <- tl0/2*size
gl <- gl0/2*size
xl <- tl+500
yl <- gl+500
paxl <- paxl0*size
payl <- payl0/2*size
gaxl <- gaxl0*size
gayl <- gayl0/2*size
ggyl <- ggyl0/2*size
ccircle <- ccircle0*size
#ピッチの描画
plot(c(-tl, -tl, tl, tl), c(-gl, gl, gl, -gl), xlab="", ylab="",
 xlim=c(-xl-1000, xl), ylim=c(-yl, yl), cex=0,   bty="n",xaxt="n",yaxt="n", asp=1)
# ピッチ
rect(-tl,-gl,tl,gl,col="green3", border="white")
#センターサークル
# plot.circle(0,0,ccircle, col="white")
draw.circle(0,0,ccircle, col=NA,lty=1,lwd=1, border="white")
points(0, 0, pch=16, cex=0.8, col="white")
#センターライン
lines(c(0,0), c(-gl, gl), col="white")
# ゴール
rect(-tl-300,-ggyl, -tl, ggyl, lwd=1)
rect(tl,-ggyl, tl+300, ggyl, lwd=1)
# ペナルティエリア
rect(-tl,-payl, -tl+paxl, payl, col=NULL, border="white")
rect(tl,-payl, tl-paxl, payl, col=NULL, border="white")
# ゴールエリア
rect(-tl,-gayl, -tl+gaxl, gayl, col=NULL, border="white")
rect(tl,-gayl, tl-gaxl, gayl, col=NULL, border="white")
# ペナルティマーク
points(-tl+pmark*size, 0, pch=16, cex=0.8, col="white")
points(tl-pmark*size, 0, pch=16, cex=0.8, col="white")
# ペナルティアーク
draw.arc(-tl+pmark*size,0,ccircle, deg1=-52,deg2=52,col="white",lwd=2)
draw.arc(-tl+pmark*size,0,ccircle, deg1=180-52,deg2=180+52,col="white",lwd=2)
# plot.circle(-tl+pmark*size, 0,ccircle, start=-52, end=52, col="white")
# plot.circle(tl-pmark*size, 0,ccircle, start=180-52, end=180+52, col="white")
# タッチライン・ゴールライン
rect(-tl,-gl,tl,gl, lwd=2, col=NULL, border="black")
# 矢印
lines(c(-tl+500,-tl),c(yl-200,yl-200))
lines(c(-tl+200,-tl),c(yl-100,yl-200))

パスデータの描画とコドラートカウント

# 分析対象選手のパス位置データを読み込む
pass <- read.table("pass1.csv", sep=",", header=TRUE, row.names=1)
# コドラートカウント用にポイントパターンデータに変換する
PPP_pass <- ppp(pass[,3]*-10,pass[,4]*10,c(-tl,tl),c(-gl,gl))
# ピッチ上にポイントを描画する
points(PPP_pass, pch=16, cex=0.8, col="grey")
# コドラート法を使ってポイント数をカウントする
nx=6; ny=4
plot(quadratcount(PPP_pass, nx=nx,ny=ny), main="", add=TRUE)
# 確率分布を描画する
Quad_pass <- as.matrix(quadratcount(PPP_pass, nx=6,ny=4))
pitch_rect <- owin(c(-tl,tl),c(-gl,gl))
# nx=6; ny=4
pitch_quad <- quadrats(pitch_rect, nx, ny)
plot(pitch_quad, add=TRUE)
Quad_pass_prob <- round(Quad_pass / sum(Quad_pass) *100, digits=2)
for(i in 1:nx){
 for(j in 1:ny){
   text(-tl+tl*2/nx*(i-0.5),gl-gl*2/ny*(j-0.5),Quad_pass_prob[j,i], cex=0.8)
 }}
text(0, yl+100, "Probability Map of Pass (%)", cex=0.8)

選手データの描画とコドラートカウント

# 分析対象選手の位置データを読み込む。
source("plotpitch_green.R")
Pos1NAis9 <- read.table("Pos1NAis9.csv", sep=",", header=TRUE, row.names=1)
Pos1NAis9[,3]<- -1*Pos1NAis9[,3]
PlayerXY1 <- cbind(Pos1NAis9[,2]*-10,Pos1NAis9[,3]*-10)
points(PlayerXY1, pch=16, cex=0.8, col="grey")
PPP_player <- ppp(PlayerXY1[,1],PlayerXY1[,2],c(-tl,tl),c(-gl,gl))
points(PPP_player, pch=16, cex=0.8, col="grey")
nx=6; ny=4
plot(quadratcount(PPP_player, nx=nx,ny=ny), main="", add=TRUE)
text(0, yl+100, "Quadrat Count of Player Position")

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-10-11 (日) 11:52:25 (740d)