Rでplotlyを使い、Amazonの2021年Q1業績を対話型ウォーターフォール図で可視化

##業績データを用意

米アマゾン.ドット.コムの20201年第一四半期は大幅増州となり、売上高は44％増の1085億ドル（約11兆8600億円）だったそうです。

https://s2.q4cdn.com/299287126/files/doc_financials/2021/q1/Amazon-Q1-2021-Earnings-Release.pdf

>Net sales increased 44% to $108.5 billion in the first quarter, compared with $75.5 billion in first quarter 2020.
Excluding the $2.1 billion favorable impact from year-over-year changes in foreign exchange rates throughout the
quarter, net sales increased 41% compared with first quarter 2020.  

>※上記をGoogle翻訳↓
第1四半期の純売上高は44％増の1,085億ドルで、2020年第1四半期の755億ドルに比べて増加しました。
全体の為替レートの前年比の変化による21億ドルの有利な影響を除く
四半期の純売上高は、2020年第1四半期と比較して41％増加しました。

上記PDFから業績の数字を取得しました。

| Consolidated | 連結 | Q1 2021 |
|:-:|:-:|:-:|
| Net sales  | 純売上高  | 108,518  |
| Operating expenses  | 営業経費  | 99,653  |
| Operating income  | 営業利益  | 8,865  |
| Total non-operating income (expense)  | 営業外収益合計  | 1,403  |
| Provision for income taxes  | 法人所得税引当額  | (2,156)   |
| Equity-method investment activity, net of tax  | 持分法による投資損益  | (5)  |
| Net income  | 当期純利益  | 8,107  |

#Plotlyで可視化

以前、ウォーターフォール図を「ggplot2」と「wratefall」で可視化しました。
今回は「Plotry」を使います。
まず「Plotry」について情報週数牛ました。
以下、参考にさせて頂いたサイトです。

https://plotly.com/r/getting-started/

https://blog.revolutionanalytics.com/2014/09/how-to-publish-r-and-ggplot2-to-the-web.html

http://tomoshige-n.hatenablog.com/entry/2014/08/26/201939

https://ksmzn.hatenablog.com/entry/2013/12/12/000100

plotlyライブラリを使えるように準備します。

```R
install.packages("plotly")
library(plotly)
```

ウォーターフォールを使った可視化は以下を参考にさせて頂きました。

https://plotly.com/r/waterfall-charts/

集計・可視化用データを用意します。

```R
x <- list("純売上高", "営業経費", "営業利益", "営業外収益合計", "法人所得税引当額", "持分法による投資損益", "当期純利益")
measure= c("relative", "relative", "total", "relative", "relative", "relative", "total")
text= c("+108,518", "-99,653", "+8,865", "+1,403", "-2,156", "-5", "Net income")
y= c(108518, -99653, 0, 1403, -2156, -5, 0)
data = data.frame(x=factor(x,levels=x),measure,text,y)

data
                     x  measure       text      y
1             純売上高 relative   +108,518 108518
2             営業経費 relative    -99,653 -99653
3             営業利益    total     +8,865      0
4       営業外収益合計 relative     +1,403   1403
5     法人所得税引当額 relative     -2,156  -2156
6 持分法による投資損益 relative         -5     -5
7           当期純利益    total Net income      0
```

x軸に項目、y軸に「直前の棒グラフからの増減値」を設定します。
データラベルの設定は「text」で設定しています。
「name」は凡例に使われるようです。

```R
#plotlyでウォーターフォール描画
fig_wf <- plot_ly(
  data, name = "waterfall_fig", type = "waterfall", measure = ~measure,
  x = ~x, textposition = "outside", y= ~y, text =~text,
  connector = list(line = list(color= "rgb(63, 63, 63)"))) 
fig_wf <- fig_wf %>%
  layout(title = "Amazon Q1 2021",
        xaxis = list(title = ""),
        yaxis = list(title = ""),
        autosize = TRUE,
        showlegend = TRUE)

fig_wf
```

ブラウザが立ち上がり、インタラクティブなグラフが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/99bab7b3-baba-baad-0359-c911d9523a2c.png)

##クラウドで保存・表示

Plotlyでは、APIの利用登録することで、クラウドに描画データをアップロードできます、

以下を参考にさせて頂きました。

https://plotly.com/r/getting-started-with-chart-studio/

https://qiita.com/Ringa_hyj/items/fbadf065f053348614b1

登録はこちら[「Chart Studio」のサイト](https://plot.ly/api_signup)から行います。
Chart Studioは、Web状で可視化データを共有するための、Plotly社が提供するクラウドサービスです。
「Usename」と「API key」を取得します。
取得したら、PlotlyのAPIを叩けるように準備します。

```R
Sys.setenv("plotly_username"="your_plotly_username")
Sys.setenv("plotly_api_key"="your_api_key")
```

描画の設定をし、API経由でChart Studioにアップロードします。

```R
library(plotly)
p <- plot_ly(グラフ描画設定)
api_create(p, filename = "アップロードするファイル名")
```

下記サイトで確認できます。

https://chart-studio.plotly.com/organize/home


##検索して見つけた方法でうまくいかなかった

当初、Googleで検索して、下記のような方法でクラウドに保存できると紹介しているサイトをいくつか見つけました。

```R
library(plotly)
p <- plotly("Username", "API Key")
response = p$plotly(描画設定)
#ブラウザで表示
browseURL(res$url)
```

ただ上記方法では、p$plotlyを実行した段階で以下のようなメッセージが表示されます。

```R
エラー:  関数でないものを適用しようとしました 
```

しばらく解決できませんでしたが、検索を繰り返した結果、上述の「Sys.setenv」と「api_create」にたどり着きました。
詳細は調べていませんが、仕様が変わったのかもしれません。

##api_createを実行

今回行った手順を、plotlyを使用するところから一通り記載します。

```R
library(plotly)

#plotlyでウォーターフォール描画
fig_wf <- plot_ly(
  data, name = "waterfall_fig", type = "waterfall", measure = ~measure,
  x = ~x, textposition = "outside", y= ~y, text =~text,
  connector = list(line = list(color= "rgb(63, 63, 63)"))) 
fig_wf <- fig_wf %>%
  layout(title = "Amazon Q1 2021",
        xaxis = list(title = ""),
        yaxis = list(title = ""),
        autosize = TRUE,
        showlegend = TRUE)

fig_wf

Sys.setenv("plotly_username"="Username")
Sys.setenv("plotly_api_key"="API Key")

options(browser = 'false')
api_create(fig_wf, filename = "fig_waterfall_01")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/2182ec1a-6085-fa5e-92fd-8b18a7e1a7c6.png)


Chart Studioで共有されているのが確認できました。
「options(browser = 'false')」とすると、ブラウザを立ち上げずにChart Studioに共有できます。
記述しないと、ブラウザが起動し、グラフが表示されます。
なお、「options(browser = 'false')」を設定すると、クラウドに保存せずローカルの環境で描画しようとしてもブラウザが起動しなくなります。
無効化する方法がわからなかったので、後ほど調べる予定です。

##iframeでembed

グラフの右下からembedコードを取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/d844eeba-0459-dd6f-3249-c422c4aa9589.png)

>`<iframe width="900" height="800" frameborder="0" scrolling="no" src="//plotly.com/~＊＊＊＊＊/3.embed"></iframe>`


※Qiitaでは、plotlyのiframeは埋め込めないようです。
　[こちらを参照](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF)。

**了**