Military: China’s military expenditure by year, R, gganimate,ggplot2,reshape

日本では中国の軍事費拡大が問題視されます。

 

I.ドル建ての軍事費の推移

 

確かに増えていますが、米国が断然多いです。

 

source: https://data.worldbank.org/indicator/MS.MIL.XPND.CD

 

Rのスクリプト

# import libraries
library(reshape2)
library(ggplot2)
library(gganimate)
# read the data military expenditure
data.dollars <- read.csv("/YOURFILE.csv", check.names = FALSE)
head(data.dollars)
# selct the four countris
data.dollars.four <- data.dollars[c(118,39,201,250),]
data.dollars.four <- data.dollars[c(118,39,250),]
head(data.dollars.four)
# transform the data from wide to long
data.dollars.four.long <-melt(data.dollars.four, id.vars=c("Country Name"))
head(data.dollars.four.long)
# change column names
colnames(data.dollars.four.long) <- c("country", "year", "expenditure")
head(data.dollars.four.long)
# create a muliple line chart and animate it
ggplot(data=data.dollars.four.long, aes(x=year, y=expenditure, group = country, colour = country)) +
  geom_line() +
  geom_point(size=1, shape=21, fill="white")

 

スクリプトの説明

アニメーションにはできませんでした。エラーメッセージを見るとx軸のyearが数でないためアニメーションにできないようです。

これは結構手強くて修正するのに数時間かかりました。IIではアニメーションにしました。

 

 

II.軍事費のGDP比率の推移

 

中国のGDPの伸びに比べれば特段軍事費が伸びているということは言えないようです。こちらも米国の軍事費割合が高いです。ロシアはさらに高いです。

 

source: https://data.worldbank.org/indicator/MS.MIL.XPND.GD.ZS

 

 

Rのスクリプト

# import libraries
library(reshape2)
library(ggplot2)
library(gganimate)
# read the data military expenditure
data.dollars <- read.csv("/FILENAME.csv", check.names = FALSE)
head(data.dollars)
# selct the four countris
data.dollars.four <- data.dollars[c(118,39,201,250),]
data.dollars.four <- data.dollars[c(118,39,250),]
head(data.dollars.four)
# transform the data from wide to long
data.dollars.four.long <-melt(data.dollars.four, id.vars=c("Country Name"))
head(data.dollars.four.long)
# change column names
colnames(data.dollars.four.long) <- c("country", "year", "expenditure")
head(data.dollars.four.long)
# create a muliple line chart and animate it
ggplot(data=data.dollars.four.long, aes(x=year, y=expenditure, group = country, colour = country)) +
  geom_line() +
  geom_point(size=1, shape=21, fill="white")
last_plot() + 
  transition_reveal(year)

# read the data military expenditure /GDP
data.gdp <- read.csv("/Users/hirofumishibata/Downloads/militaryGdp.csv", check.names = FALSE)
# select the four countries
data.gdp.four <- data.gdp[c(118,39,201,250),]
# transcorm the data from wide to long
data.gdp.four.long <-melt(data.gdp.four, id.vars=c("Country Name"))
head(data.gdp.four.long)
# change column names
colnames(data.gdp.four.long) <- c("country", "year", "expenditure.gdp")
# show the structure of the data
str(data.gdp.four.long)
# change year from factors to numerals
D <- transform(data.gdp.four.long, year = as.numeric(as.character(year)))
head(D)
# show the structure of the data
str(D)
# create a mulipleline chart
ggplot(data=D, aes(x=year, y=expenditure.gdp, group = country, colour = country)) +
  geom_line() +
  geom_point( size=1, shape=21, fill="white")
last_plot() + 
  transition_reveal(year)
# save the animation
anim_save("military.gif")

 

スクリプトの説明

 

いくつかクリアすべき課題がありました。

 

1.ヘッダーが数字ではじまる

check.namesで列名チェックを外す

2.ヘッダーにスペースがある

colnames()で列名を変更

3.tidyrでデータを縦長にできない

reshape2のmeltを用いる

4.x軸が数でないとアニメーションを作成できない

transform(DATA, year = as.numeric(as.character(year)))として、一旦文字にしてから数にする

 

データをヘッダーをつけて読み込むのですが、ヘッダー行に数字があります。Rではヘッダーの先頭に数字をおけないんので、読み込むとX2018のように自動的にXが付きます。

これを避けるために、check.names=FALSEを書き入れて列名チェックを外すと、Xなしの数字がヘッダーになります。

ただし、このデータの場合、チェックを外すとCounty Nameも列名になります。Rでは列名にスペースは禁じられているので、tidyrで横長から縦長へ変形できませんでした。

ちなみに、列名チェックがオンであればCountry.Nameとなります。

いろいろ対応はあると思いますが、列名チェッックを外してデータを読み込み、tidyrではなくて、reshape2のmeltを用いて縦長にしました。データを縦長にするのはggplot2でグラフを描くためです。

次にタイトル名のCountry Nameをスペースを含まないcountryに変更しました。

これでグラフは描けるのですが、アニメーションではエラーがでます。

エラーメッセージを読むとx軸が数でないといけないということなので、year列を数に直します。

Rを始めた頃にこのエラーが出て苦労したことを思い出しました。よくあるエラーですので、しばらくお目にかからなかったのが不思議です。

year列の数字はファクターというタイプのデータですが、factorは見た目の数に加えてレベルを持っています。文字の場合にはっきりわかりますが、昇順とか降順とか並べ変えられるのは見た目の文字とは別に並べ替えるための情報、つまり数字を持っているからです。factorをas.numericで直接数にしようとするとこのレベルの数に変える仕様になっています。

ですから、一旦、文字に変更してレベルを削除してから数に直す手間をかけます。

今回はちょっと手間がかかりましたが、美しいアニメーションを作成できたのでよしとしましょう。

 

About shibatau

I was born and grown up in Kyoto. I studied western philosophy at the University and specialized in analytic philosophy, especially Ludwig Wittgenstein at the postgraduate school. I'm interested in new technology, especially machine learning and have been learning R language for two years and began to learn Python last summer. Listening toParamore, Sia, Amazarashi and MIyuki Nakajima. Favorite movies I've recently seen: "FREEHELD". Favorite actors and actresses: Anthony Hopkins, Denzel Washington, Ellen Page, Meryl Streep, Mia Wasikowska and Robert DeNiro. Favorite books: Fyodor Mikhailovich Dostoyevsky, "The Karamazov Brothers", Shinran, "Lamentations of Divergences". Favorite phrase: Salvation by Faith. Twitter: @shibatau

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.