Translate

ラベル データ前処理、データハンドリング の投稿を表示しています。 すべての投稿を表示
ラベル データ前処理、データハンドリング の投稿を表示しています。 すべての投稿を表示

2020年7月1日水曜日

◆【新型コロナ】ECDCのデータから国別の実効再生産数を計算するRのコード例です

ECDCが公開している新型コロナウイルスの感染確認者数のデータを使って、各国の実効再生産数を計算するコードの例です。

日付のデータを付加するために、コードが長くなっていますが、日付データを付加しなければもっとシンプルにすることができます。

古いノートパソコンを使っていますが、約200カ国の実効再生産数を十数秒程度で計算することができます。

計算で得られたデータは、ダッシュボードで利用しています。

なお、実効再生産数の計算には、「Improved inference of time-varying reproduction numbers during infectious disease outbreaks」という論文で紹介されているRのパッケージ「EpiEstim」を利用しています。

なお、発症間隔のパラメータは、平均を4.8、標準偏差を2.3に設定しています。


【Rコードの例】
library(EpiEstim)

df_ECDC <- read.csv("https://opendata.ecdc.europa.eu/covid19/casedistribution/csv", na.strings = "", fileEncoding = "UTF-8-BOM",stringsAsFactors = FALSE)

geo_list <- unique(df_ECDC$countriesAndTerritories)
df_ECDCtemp <- df_ECDC
df_ECDCtemp1 <- NULL
df_ECDCtemp2 <- NULL
  temp_R <- NULL
  temp_Rt <- NULL
  temp_Date <- NULL
  temp_Case <- NULL
  temp_DC <- NULL
  df_DC <- NULL
  df_Rt <- NULL
  temp_notcal <- NULL
  df_notcal <- NULL


###繰り返しの処理で、多くの国の計算を行います。

for (i in seq_along(geo_list))
 {
 df_ECDCtemp1 <- subset(df_ECDCtemp,df_ECDCtemp$countriesAndTerritories==geo_list[i])
 df_ECDCtemp2 <- subset(df_ECDCtemp1,df_ECDCtemp1$cases >= 0)
 if (length(df_ECDCtemp2$cases) >= 70)
 {rt_parametric_si <- estimate_R(df_ECDCtemp2$cases,method = "parametric_si",config = make_config(list(mean_si = 4.8,
        std_si = 2.3)))
  temp_R <- round(rt_parametric_si$R,2)
  temp_Rt <- mutate(temp_R,countriesAndTerritories=geo_list[i])
  Numa <- nrow(rt_parametric_si$R)
  temp_date <- as.data.frame(df_ECDCtemp1$Date)
  Numb <- nrow(temp_date)
  Numc <- Numb-Numa
  temp_date <- temp_date[-c(1:Numc),]
  temp_Rt <- mutate(temp_Rt,Days=seq(from=1,to=nrow(rt_parametric_si$R), by=1))
  temp_Rt <- mutate(temp_Rt,Date=temp_date)
  temp_Date1 <- matrix(rt_parametric_si$dates,ncol=1)
  colnames(temp_Date1) <- "Days"
  temp_Case <- matrix(rt_parametric_si$I,ncol=1)
  colnames(temp_Case) <- "Cases"
  temp_DC <- cbind(temp_Date1,temp_Case)
  temp_DC <- as.data.frame(temp_DC)
  temp_DC <- mutate(temp_DC,countriesAndTerritories=geo_list[i])
  df_DC <- rbind(df_DC,temp_DC)
  df_Rt <- rbind(df_Rt,temp_Rt)}
  else {temp_notcal <- as.data.frame(geo_list[i])
  temp_notcal <- mutate(temp_notcal,Under70days=nrow(df_ECDCtemp1))
  colnames(temp_notcal) <- c("countriesAndTerritories","Under70days")
  df_notcal <- rbind(df_notcal,temp_notcal)
 }
}

###グラフで「1」の線を引くためのデータを追加します
Const <- c(rep(1,nrow(df_Rt)))
Const <- as.data.frame(Const)
colnames(Const) <- c("C")

df_Rt <- cbind(Const,df_Rt)

write.csv(df_Rt,"Rt.csv",fileEncoding = "UTF8")

          ------------------------------------------------------------------------------

 
------------------------------------------------------------------------------
-------------------------------------------------------------------

--------------------------------------------------------------------

2020年4月26日日曜日

◆​グーグルのデータポータルのダッシュボードの地図グラフで、国コード、州コードから国名、州名を表示させる方法

​グーグルのデータポータルのダッシュボードの地図グラフ(コロプレス地図・塗分け地図)で、国コードや州コードの表示を国名や州名の表示に変更できる「TOCOUNTRY」「TOREGION」の関数を利用してみました。

ECDCのデータを利用したダッシュボードでは、国別コードで国別の塗り分け地図グラフを作成していましたが、マウスオーバーした際の表示は国名ではなく国コードになっていました。

「TOCOUNTRY」の関数を利用すれば、国名を表示できるようになるというので、試してみました。

ダッシュボードで、「TOCOUNTRY(国コード)」の関数によって新しいフィールドを作成して、そのフィールドの属性を国コードに設定します。そして、そのフィールドを地図グラフの地域ディメンションに設定することで、マウスオーバーした際に国名を表示させることができるようになりました。

Examples
Formula Input Output
TOCOUNTRY(Country Code) PE Peru
TOCOUNTRY(Region ID, 'REGION_ISO_CODE') US-CA United States

同様に、ジョンズ・ホプキンス大学のデータを利用したダッシュボードの地図グラフでは、アメリカの州別の塗り分け地図で、州別コードが表示されていました。

「TOREGION(州コード)」の関数で、新しいフィールドを作成し、その属性を地域コードに設定します。そのフィールドを州別塗り分け地図グラフの地域ディメンションに設定すると、地図グラフで州名表示にすることができました。

Examples
Formula Input Output
TOREGION(Region ID, 'REGION_ISO_CODE') US-CA California

また、ジョンズ・ホプキンス大学のデータを利用したダッシュボードの地図グラフで、緯度・経度情報による郡別のデータを表示する地図グラフでは、「CONCAT(緯度・経度, "(",郡名, ")")」の関数で新しいフィールドを作成し、その属性を緯度・経度に設定します。そのフィールドを地図グラフの地域ディメンションに設定すると、地図グラフで郡名を表示することができました。

データポータルには、色々と、知らない機能があるので、少しずつダッシュボードを改善していきたいと思います。

 
------------------------------------------------------------------------------
-------------------------------------------------------------------

--------------------------------------------------------------------

2020年4月25日土曜日

◆データの自動更新などに役立つ「arrayformula()関数」:データが増えても自動対応なので便利です

新型コロナウイルスの感染確認者数などのデータを扱う、ダッシュボード「データポータル」の元データを、グーグルのスプレッドシートで管理していますが、日々データが更新、追加される場合には「arrayformula()関数」の機能が便利です。

仕組みとしては、「データポータル用データシート」から「更新用のデータシート」にあるデータを参照しています。更新用のデータは、「R」でダウンロードから前処理まで済ませてCSVファイルとして保存したデータをスプレッドシートに読み込んでいます。

データポータルでは、元データの更新がうまくいかないと、エラーになるので、直接更新データを「データポータル用データのシート」に書き込まないようにしています。

そこで、「更新用のデータシート」に更新データを書き込んで、「データポータル用データシート」から参照しています。

データが日々追加される(データの行が増える)場合には、その都度、セル参照の数式を追加していく必要があります。

当初、更新のたびに、セル参照をコピペやオートフィル操作で追加していたのですが、さすがに面倒なので、「arrayformula()関数」を利用することにしました。

例えば、「データポータル用データシート」のA列から、「更新用のデータシート」の「Conf」のA列のデータを参照する場合は、「データポータル用データシート」のA2のセルに「=arrayformula(INDIRECT("Conf"&"!A2:A"))」という式を入れるだけです。A2以下にデータが読み込まれます。なお、A1のセルは「変数名(フィールド名)」で、固定のものです。

B列の場合は、「=arrayformula(INDIRECT("Conf"&"!B2:B"))」となります。この関数を使えば、各変数(列)の1行目だけにこのような関数式を入れるだけで済みます。

緯度、経度を「,」でつなげる場合は次のような式です。
E列とF列のデータを「,」でつなげる場合は、下記の式をG列(他の列でも同じ)の1行目入力します。「=arrayformula($E$2:$E&","&$F$2:$F)」

そして、「更新用のデータシート」のデータの行数が増えても、自動的に「データポータル用データシート」に反映されます。



 
------------------------------------------------------------------------------
-------------------------------------------------------------------

--------------------------------------------------------------------

2020年2月4日火曜日

◆【更新版】新型コロナウイルス感染者総数の日ごとの推移のグラフを作成する「R」のコード例


グラフのデータは、Kaggleの「Novel Corona Virus 2019 Dataset」のcsvファイルに基づいています。

新しいデータファイルには、「Date」という変数が付加されて、日付別の集計がしやすくなりました。

ただし、498行目以降の追加データの日付の形が「"%Y/%d/%m"」と、元々の日付の形「"%m/%d/%Y"」ではなかったり、元々あるデータの日付の一部の「年」が4桁でなくて、2桁だったりしました。2桁の年を4桁にするのは、Excelのシートで手作業で処理してしまいましたが、形が異なる元のデータ行と追加データ行の日付データを処理するのは、コードで行っています。

最初、「as.Date(df_cov2$Date1,format="%Y/%d/%m")」のところで、「%Y」を「%y」というようにYを小文字にしていてうまく動かず、はまってしまいました。日付の変数は、扱いが面倒だと思います。



<Rのコードの例:gganimateなどのパッケージを利用しています。>

df_cov <- read.csv("2019_nCoV_data0203.csv")

df_cov <- df_cov %>% tidyr::separate(Date, c("Date1","time"), " ",convert = TRUE)

view(df_cov)

df_cov1 <- df_cov %>% filter(Sno <= 497)
df_cov2 <- df_cov %>% filter(Sno >= 498)

df_cov1$Date1 <- as.Date(df_cov1$Date1,format="%m/%d/%Y")
df_cov2$Date1 <- as.Date(df_cov2$Date1,format="%Y/%d/%m")

df_cov3 <- rbind(df_cov1,df_cov2)

view(df_cov3)

df_cov_date <- df_cov3 %>%  group_by(Date1) %>% summarise(Conf = sum(Confirmed))

df_cov_date<- mutate(df_cov_date,Val_lbl = paste0(" ",Conf))

view(df_cov_date)

gra <- ggplot(df_cov_date, aes(x = Date1, y = Conf)) + geom_bar(stat = "identity",fill = "darkred") +
  geom_text(aes(y=Conf,label = Val_lbl,vjust =-0.25, hjust=0.5),size = 5.25 ) +
  labs(x="Date",y="Confirmed Cases",title="Confirmed cases of 2019-nCoV",caption="Data source:
       https://www.kaggle.com/sudalairajkumar/novel-corona-virus-2019-dataset/data")

gra <- gra + theme(axis.line=element_blank(),
        axis.text.x=element_text(colour="black", size=12),
        axis.text.y=element_text(colour="black", size=12),
        axis.ticks=element_blank(),
        axis.title.x=element_text(colour="black", size=14),
        axis.title.y=element_text(colour="black", size=14),
        legend.position="none",
        panel.background=element_blank(),
        panel.border=element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.grid.major.x =element_blank(),
        panel.grid.minor.x =element_blank(),
        panel.grid.major.y = element_line( size=.2, color="grey" ),
        panel.grid.minor.y = element_line( size=.2, color="grey" ),
        plot.title=element_text(size=20, hjust=0.5, face="bold", colour="black", vjust=-1),
        plot.subtitle=element_text(size=16, hjust=0.5, face="italic", color="black"),
        plot.caption =element_text(size=9, hjust=1, face="italic", color="black"),
        plot.background=element_blank(),
        plot.margin = margin(0.5,0.5, 0.5, 0.5, "cm"))

plot(gra)

gra <- gra + transition_states(Date1, transition_length = 4, state_length = 1) +
  shadow_mark() + enter_grow() + enter_fade()

animate(gra, nframes = 200,fps = 15,start_pause = 20,duration = 20, width = 740, height = 520,renderer = gifski_renderer("ncov2.gif"))

----------------------------------------------------

---------------------------------------------------
-

2020年2月3日月曜日

◆新型コロナウイルス感染者の日ごとの推移のグラフを作成する「R」のコード例




グラフのデータは、Kaggleの「Novel Corona Virus 2019 Dataset」のcsvファイルに、「JJohns Hopkins university」のダッシュボードの最新データを追加したものです。KaggleのデータもJohns Hopkins universityのデータに基づいているようです。

「JJohns Hopkins university」のダッシュボードの最新データは、最新の日付が混在しているため、日別の集計にとっては、WHOの日報のデータを加工した方がよさそうです。

<Rのコードの例:gganimateなどのパッケージを利用しています。
日別のデータにするために、便宜的に2月2日の日付を2月1日に置き換える処理をしています。

df_cov <- read.csv("2019_nCoV.csv")

df_cov <- df_cov %>% tidyr::separate(Last_Update, c("Last_Update1","time1"), " ", convert = TRUE)

df_cov$date1 <- lapply(df_cov$Last_Update1, gsub, pattern="2/2/2020", replacement = "2/1/2020")

df_cov$date1 <- as.Date(as.character(df_cov$date1),format="%m/%d/%y")

view(df_cov)

df_cov_date <- df_cov %>%  group_by(date1) %>% summarise(Conf = sum(Confirmed))

view(df_cov_date)

gra <- ggplot(df_cov_date, aes(x = date1, y = Conf)) + geom_bar(stat = "identity") + labs(x="Date",y="Confirmed Cases",title="Confirmed cases of 2019-nCoV")

plot(gra)

gra <- gra + transition_states(date1, transition_length = 4, state_length = 1) +
  shadow_mark() + enter_grow() + enter_fade()  

animate(gra, nframes = 200,fps = 15,start_pause = 20,duration = 20, width = 740, height = 520,renderer = gifski_renderer("ncov.gif"))

◆【更新版】新型コロナウイルス感染者の日ごとの推移のグラフを作成する「R」のコード例
----------------------------------------------------

---------------------------------------------------
-

2020年1月27日月曜日

◆「R」コード 実戦Tips :週次レポートなどの作成時に便利な「R Markdown」の機能:「インラインコード」の活用で、文章中に数字、計算結果を自動入力

「R Markdown」には、定型の週次レポートなどを作成する時に便利な機能があります。

 「インラインコード」を活用することで、定型の文章中に当該週の数字、前年比、前週比などの計算結果を自動入力することができます。

 文章中にある `r wnumt`や`r if(Z > Y) "増加" else "減少"` `r round(Z/X*100,digits=2)` などがインラインコードです。Rの変数の値やRの処理結果が、その部分に表示されます。

 `r if(Z > Y) "増加" else "減少"`の記述によって、今週の数字(Z)が前週(Y)を上回っていたら、「増加」、下回っていたら「減少」というように表示させることができます。

 下記に記述例と出力結果例がありますが、数字や計算結果が自動で表示されるので、定型レポートの作成が非常に簡単になると思います。

<変数の設定>
wnumt <- 3

#df_infは、行が年、列が週のデータ

Z <- df_inf[12,wnumt+1] #12行、4列目に今週(第3週)のデータがある場合
Y <- df_inf[12,wnumt]   #前週のデータ 
X <- df_inf[11,wnumt+1]  #前年のデータ 

<R Markdownでのレポート本文の記述例>
「インフルエンザの定点当たり報告数」は、2020年の第`r wnumt`週(1月13日~1月19日)では`r Z`で、前週の`r Y`から`r if(Z > Y) "増加" else "減少"`しました。

 第`r wnumt`週は、前年比`r round(Z/X*100,digits=2)`%、前週比`r round(Z/Y*100,digits=2)`%となっています。
   
下のグラフは、第`r wnumt`週(1月13日~1月19日)のものです。

---------------------------------------------------------------------------

<レポート本文の出力結果>
「インフルエンザの定点当たり報告数」は、2020年の第3週(1月13日~1月19日)では16.73で、前週の18.33から減少しました。

 第3週は、前年比31.03%、前週比91.27%となっています。

下のグラフは、第3週(1月13日~1月19日)のものです。

---------------------------------------------------------------------------

        
◆インフルエンザの流行は一進一退が続いています:この時期としては、例年を下回る水準で推移:インフルエンザの「定点当たり報告数」の20年第4週(1月20日~1月26日)までの推移です

◆新型コロナウイルス感染者の日ごとの推移のグラフを作成する「R」のコード例

グラフのデータは、Kaggleの「Novel Corona Virus 2019 Dataset」のcsvファイルに、「JJohns Hopkins university」のダッシュボードの最新データを追加したものです。

---------------------------------------------------------------------------


---------------------------------------------------
-

2020年1月26日日曜日

◆「R」コード 実戦Tips :インフルエンザの「定点当たり報告数」のデータ更新時に便利な「eval()関数」

 週別に年ごとの推移のグラフを作成する場合、「週」の変数を指定します。例えば、第2週では「df_inf$W02」、第3週では「df_inf$W03」というように、データを更新する際にコードの中の変数名を書き換える必要があります。

Weekts <- ts(df_inf$W03,start=c(2009,1), frequency = 1)
plot(Weekts)

 それはそれで、いいのですが、もっとわかりやすく、間違えることが少ない方法を探ってみました。できれば、命令文中の変数名を書き換えたくありません。

 もし、文字列を変数名として利用することができれば、文字列に当該週の数字を入れることで、週単位のデータ更新がしやすくなるはずです。

 このように、変数名に連番の要素があり、連番の指定で変数名を指定できれば便利になります。

 しかし、いろいろと調べても、「変数名の文字列」を「変数名として利用する」方法は見つかりませんでした。何か方法はあるのかもしれませんが。 

 とりあえず、文字列を命令文として利用できるeval()関数というものがありましたので、変数名の文字列を含んだ文字列全体を命令文にすることによって、所期の目標を達成できました。

 「大(命令文全体の文字列)は、小(命令文中の変数名の文字列)を兼ねる」といった感じです。


 まず、wnumという変数に、当該週の数字「03」を代入し、「W03」という文字列を作成し、xwという変数に代入します。

wnum <- "03"
xw <- paste0("W", wnum, sep = "")

wnumt <- 3

 下記の、eval()関数の中に、命令文の文字列全体を入れていますが、「get(xw)」という形で、「W03」という文字列を反映させています。wnumに「04」を代入すれば、「W04」になるので、第4週のデータに更新する場合は、「wnum <- "04"」とすればいいことになります。
 
eval(parse(text = paste("Weekts <- ts(df_inf$",get(xw), ",start=c(2009,1), frequency = 1)")))

eval(parse(text = paste("plot(Weekts,xlab='year',ylab='定点当たり報告数',main='各年のインフルエンザ:第",wnumt,"週の推移')")))

  下記のグラフの更新が、「読み込むデータの更新」と「wnum <- "03"」「wnumt <- 3」の数字の更新だけで可能になりました。



 これで、データ更新時に、命令文中の変数名を変更しなくて済みます。

 また、別のところで、グラフ化するデータを「第n週まで」に絞り込む必要があるので、「wnumt」はその場合にも利用できます。

df_inftidys4 <-  df_inftidys4 %>% filter(week_n >= 36 | week_n <= wnumt)

◆新型コロナウイルス感染者の日ごとの推移のグラフを作成する「R」のコード例

グラフのデータは、Kaggleの「Novel Corona Virus 2019 Dataset」のcsvファイルに、「JJohns Hopkins university」のダッシュボードの最新データを追加したものです。


----------------------------------------------------


---------------------------------------------------

2020年1月17日金曜日

◆Excelを使わないデータ分析・処理:国立感染症研究所のインフルエンザの「定点当たり報告数」の時系列データを「年単位」から「シーズン単位」にする「R」のコード

 国立感染症研究所のインフルエンザの「定点当たり報告数」の時系列データは、「年単位」で、週別になっています。

 例えば、10月から12月の推移をグラフ化するのであれば、何の問題もないのですが、インフルエンザは、12月から2月にかけて流行するので、12月から2月にかけての推移をグラフ化したくなります。

 年別の週別データなので、年別の折れ線グラフの場合、例えば2019年12月の週と2019年1月の週が結び付いてしまいます。

 2019年12月と2020年1月を結び付けるには、「年単位」を「シーズン単位」にする必要があります。

 方法はいろいろあると思いますが、とりあえず、「R」のコードで「年単位」を「シーズン単位」にしてみました。

 以前であれば、Excelのシート上で、コピペしたりして表を整形していたところですが、その方法は繰り返し作業には向いていませんし、ミスをする可能性も高いです。

 「R」のコードで対処する方法は、繰り返し作業に向いていて、コピペのミスも防げます。


とりあえず、「R」を始めるのに参考になります


1:まず、行が年、週が列というワイド型(横型)のデータをロング型(縦型)にします。

df_inftidy <- df_inf %>% gather(key=weeks,influ,2:54)
df_inftidy <- as.data.frame(df_inftidy)


2:インフルエンザシーズンは「第36週から翌年の第35週まで」なので、各年の第36週以降の「年」をそのままとし、第1週から第35週までの「年」から1を引き算した「年」の値の列(インフルエンザシーズンの列)を追加します。
 このことによって、例えば、2019年のデータの場合、第36週以降は2019年シーズンのもの、第35週以前は2018年のシーズンのものにすることができます。

 つまり、第36週以降はそのままの「年」の数字の列(インフルエンザシーズンの列)、第1週から第35週は、「年マイナス1」の数字の列(インフルエンザシーズンの列)を作成します。

 そのための方法としては、「第36週以降」のデータフレームと「第1週から第35週」のデータフレームの2つを作成して合体させる方法にしてみました。

df_inftidys1 <- df_inftidy %>% mutate(influ_season1=year_n -1) %>% filter(week_n <= 35)
df_inftidys2 <- df_inftidy %>% mutate(influ_season1=year_n) %>% filter(week_n >= 36)

df_inftidys3 <- rbind(df_inftidys1,df_inftidys2 )
df_inftidys3 <- df_inftidys3 %>% mutate(influ_season = paste0(influ_season1,"年シーズン"))

df_inftidys4 <- df_inftidys3 %>%  filter(influ_season1 >= 16)
df_inftidys4 <- na.omit(df_inftidys4)
df_inftidys4 <-  df_inftidys4 %>% filter(week_n >= 36 | week_n <= 1)


3:インフルエンザシーズンは、「第36週から翌年の第35週まで」なので、グラフの軸で「週」を用いる場合に、その順番に並べるために、「週」の変数をファクター型にして、順番を定義します。

 なお、下記のような文字列は、Excelで「"」「W36」「",」といった3列を用意し、各セルを「&」で文字列結合して、できた列を行方向に変換して作成すると、手早く作成できます。

df_inftidys4$weeks <- factor(df_inftidys4$weeks, levels=c("W36", "W37", "W38", "W39", "W40", "W41", "W42", "W43", "W44", "W45", "W46", "W47", "W48", "W49", "W50", "W51", "W52", "W53", "W01", "W02", "W03", "W04", "W05", "W06", "W07", "W08", "W09", "W10", "W11", "W12", "W13", "W14", "W15", "W16", "W17", "W18", "W19", "W20", "W21", "W22", "W23", "W24", "W25", "W26", "W27", "W28", "W29", "W30", "W31", "W32", "W33", "W34", "W35"
))




----------------------------------------------------

---------------------------------------------------
-

2020年1月11日土曜日

◆国立感染症研究所のインフルエンザの「定点当たり報告数」のデータを「ts」形式のデータにする「R」のコードの例

 国立感染症研究所のインフルエンザの「定点当たり報告数」の11年間のデータを時系列形式(「ts」形式)にしてみました。

 「11年間」のデータなので、時系列データなのかというと、そんなことはなく、行が年(2009年~2019年)、列が週(1週~53週)といった形のデータです。1行が1年分のデータです。

 11年分のデータが1列に並ぶ形にして、「ts()」で、時系列データに変換するための「R」のコードです。「53週の場合」の問題がありますが、とりあえず、時系列分析をすることができると思います。


df_inf <- read.csv("week52-trend.csv",skip=15,nrows=11)

colnames(df_inf)[1] <- c("year")
colnames(df_inf)[2:10] <- c(paste0("W0", 1:9))
colnames(df_inf)[11:54] <- c(paste0("W", 10:53))

df_inf <- as.data.frame(df_inf)

df_inf$year_n <- str_replace_all(df_inf$year,"年","")
df_inf$year_n <- as.integer(df_inf$year_n)

df_inflong <- gather(df_inf, weekg, influ, ”W01”:"W53")
df_inflong <- df_inflong[order(df_inflong$year_n),]
df_inflong <- na.omit(df_inflong) %>% mutate(num = row_number())

Influenza  <-  ts(df_inflong$influ,start=c(2009,1), frequency = 52)

plot(forecast(Influenza,h=12))



----------------------------------------------------

---------------------------------------------------
-

2019年12月25日水曜日

◆レーシング・バーチャート作成の「R」のコードの例です

 インフルエンザの「週別の定点当たり報告数」のレーシング・バーチャートを作成する「R」のコードの例です。ランキングによって、棒グラフの位置が入れ替わるタイプのアニメーションのグラフを作成するためのコードです。

 まず、ランキングの推移の動きを出すためには、データの前処理として、ランキングの列を追加する必要があります。データの数値を表示させるためには、スコア表示用の数字の列を追加する必要があります。
 スコア表示用の数字の列を作成せずに、「geom_text(aes(y=influ,label = sprintf("%4.2f",influ))」といった形で表示させる方法もあるようです。

1)ランキングの推移をグラフのアニメーションに反映させるために、週別のランキングの列を追加します。

df_inftidyra <- df_inftidy %>%  group_by(weeks) %>% mutate(rank = rank(-influ), Val_lab = paste0(" ",influ)) %>% group_by(year) %>%  filter(rank <= 11)


2)整備したデータを基に、グラフを作成します。

grarank <-ggplot(df_inftidyra,aes(x = rank, group = year))+ geom_tile(aes(y=influ/2,height = influ,fill = year,width = 0.8))+labs(y="国立感染症研究所資料から",title="インフルエンザ_定点当たり報告数:Week:{closest_state}") + geom_text(x = -10, y = 48,aes(label = weeks), size = 14, col = "navy") + geom_text(aes(y = 0, label = paste(year, " ")), vjust = 0.2, hjust = 1, size = 8)+ geom_text(aes(y=influ,label = Val_lab, hjust=0),size = 5.5 ) + coord_flip(clip = "off", expand = TRUE) + scale_x_reverse() +  theme_light() +  theme(legend.position = 'none')

3)グラフの外観を整えます

grarank <- grarank + theme(axis.line=element_blank(),
        axis.text.x=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks=element_blank(),
        axis.title.x=element_text(colour="navy", size=18),
        axis.title.y=element_text(colour="navy", size=18),
        legend.position="none",
        panel.background=element_blank(),
        panel.border=element_blank(),
        panel.grid.major=element_blank(),
        panel.grid.minor=element_blank(),
        panel.grid.major.x = element_line( size=.1, color="grey" ),
        panel.grid.minor.x = element_line( size=.1, color="grey" ),
        plot.title=element_text(size=20, hjust=0.5, face="bold", colour="black", vjust=-1),
        plot.background=element_blank(),
        plot.margin = margin(0.5,0.5, 0.5, 3.5, "cm"))

4)アニメーションGIFのファイルを作成します

grarank <- grarank + transition_states(weeks, transition_length = 4, state_length = 1) + ease_aes('sine-in-out')+  enter_fade() +  exit_fade()

gganimate::animate(grarank, nframes = 100, fps = 20, duration = 30, width = 720, height =480, renderer = gifski_renderer("anime_rank.gif"))


 ↓アニメーションを動画ファイルにしたものです。



----------------------------------------------------

---------------------------------------------------
-