Rの16進数カラー値の指定には「#」が必要

macだとエクセルやパワーポイントで自分で作った色の16進数カラーコードを簡単に確認できます。

f:id:aiuchi0703:20180930155213p:plain

こうして得た16進数カラー値を使ってRで作図しようとしたのですが、エラーが出ました。

plot(x = 1:10, y = 1:10, pch = 16)

#macで表示されるカラーコードをそのまま使用するとエラー
plot(x = 1:10, y = 1:10, pch = 16, col = "FF9933")
#plot.xy(xy, type, ...) でエラー:  色名 'FF9933' が不正です 

どうやら16進数カラー値の前に「#」が必要なようです。

plot(x = 1:10, y = 1:10, pch = 16, col = "#FF9933")

16進数カラーコードのサイトを見るとどれも「#」がついているので、通常は#つきで表現するんですかね?
だとしたらなぜmacは#つきで表示しないんだろう。
f:id:aiuchi0703:20180930155555p:plain:w500

P.S
Rで関数を使って色を作成すると16進数で8桁のコードが出てきますが、最後の2桁が透明度なんですね。今回調べてて初めて知りました。「00」が透明で「FF」が不透明ですので試しに「55」と設定すると薄くなりました。

rainbow(3)
#[1] "#FF0000FF" "#00FF00FF" "#0000FFFF"

plot(x = 1:10, y = 1:10, pch = 16, col = "#FF993355")

f:id:aiuchi0703:20180930161400p:plain:w500

Rで例外処理

Rのbaseパッケージのt.test関数は、2群が全て同じ定数だとエラーとなる。
他変数のデータを網羅的に検定するときなど、ここで処理止まると面倒くさい。。。

group1 <- rep(1, 5)
group1 <- rep(0, 5)
t.test(group1, group2, var.equal = T) #スチューデントのt検定を実施
t.test.default(group1, group2, var.equal = T) でエラー: 
   データは本質的に定数です 


そこで、例外処理でエラーが出る際にはNAを返すようにする。
Rではtry関数あるいはtryCatch関数で例外処理できるので、

tryCatch({
        t.test(group1, group2, var.equal = T)$p.value
        }, 
        error = function(err){
                return(NA)
})
[1] NA


参考:
例外処理 | R の try 関数あるいは tryCatch 関数で例外処理

【アニメ感想】リズと青い鳥

圧倒的なリアリティで描かれる苦しくて美しい少女の成長物語。

 
 
2015年と2016年にアニメ化もされた『響け!ユーフォニアム』の劇場版です。
時系列的にはTV版2期の後、3年生になった希美・みぞれの夏くらいまでが描かれています。
 
僕の中でユーフォは『王道のスポ根』作品という印象があるのですが、本作では大きな出来事は起こりません。
あくまで女子高生の日常を切り取っている、のですが『女子高生の日常』を見てここまでつらい気持ちになったことは初めてです。
 
主にみぞれの言動で(笑)。
 
TV版のみぞれは「口数の少ない不思議系キャラ」として描かれているので基本的にかわいく見れるんですよね。
でも本作ではキャラデザやBGM, SEが相まって、みぞれの不安定性がとてもリアリティを持っていて、ちょっと怖いと感じるシーンさえあります。
 
この印象はTV版のキャラデザでは出せなかったと思います。
 
 
そんな日常の中でのいつものやり取り、でもいつもとほんの少しだけ違う、その違いが希美とみぞれの関係性に徐々に影を落としていきます。
 
 
と、概要だけ書くとものすごく地味で暗い話のようにも見えるかもしれませんが、個人的には本作のエピソードはユーフォ屈指の成長物語だと思っています。
 
全て見終わった後にここまで清々しい気持ちになれる作品はそうはありません。
 
 
上映館がそこまで多くないのが残念ですが、是非見て欲しい映画です。
 
 
P.S.
京都アニメーション、というか山田監督は高校生の繊細な心情を描かせたら右に出る者はいないんじゃないかと思います。
世間的にはけいおん!の監督で通っていますが、個人的にはたまこラブストーリー、や聲の形、それに今作のような作品での演出が好きですね。
あと、京アニは『作画』が評価されていることが多いですが、聲の形あたりから『音』にも相当力を入れているように感じます。

【りゅうおうのおしごと!7巻感想】非現実的な舞台で描かれるリアルな心情

今話題の将棋界を舞台にしたライトノベルの第7巻です。



あらすじ

B級2組の8回戦を大悪手によって敗北した清滝鋼介は挽回の糸口を得ようと棋士室へ赴く。しかし『名人挑戦者』のプライドを纏った清滝の言動は現役の奨励会員にとって到底受け入れられるものではなかった。


「先生は俺達に命の対価として何を払えますか?」


自分が奨励会員だった時代には考えられない言葉に強い憤りを覚えると同時に、自分が『老害』となってしまったことを自覚し清滝は落胆する。
しかしその言葉の『熱』は消えかけていた清滝の心を再び燃え上がらせていく。


C級への降格がかかった最終試合の相手は順位戦無敗の神鍋歩夢。
清滝の棋士人生を賭した大一番が今始まる・・・!


弟子の八一や銀子から絶大な信頼を寄せられているものの、第1巻の幕開けを放尿シーンで飾るなどどちらかと言うとギャグ要員だった清滝鋼介九段がメインです。


『過去の栄光にすがり若者に疎んじられる』というのは棋士だけでなくどの業界でもある話だと思います。この状況を打開する方法は至ってシンプルです。『過去の栄光を捨て現実を受け入れた上で若者の教えを請う』に尽きます。


しかし、実際に実行に移すのは非常に困難です。
過去の栄光を捨てるのはある意味自分の人生を否定することですし、例え本人がそうできたとしても周りの若者が受け入れるとは限りません。

この状況を清滝がどう打開するかは本作を読んで頂きたいのですが、非常に将棋界らしい(と言っても将棋には疎いですが)エピソードだと感じました。


僕も含めた大部分の人にとって将棋界は非現実的な場所だと思います。
最近将棋界がよく報道されていますが、そこで活躍する棋士たちに敬意や畏怖の念を抱いても、共感や感情移入をできる人はそう多くないと思います。*1


そんな非現実的な場所や人を舞台にしているにも関わらず、この作品のキャラの心情には圧倒的なリアリティがあります。
読み終わると熱いと感じずにはいられません。


このシリーズの面白さを改めて認識した巻でした。


今月から放送しているアニメも毎週楽しみです。
www.ryuoh-anime.com



追伸
銀子かわいいんだけど6巻の引きを考えると精神状態が心配になったのは僕だけじゃないはず笑

*1:少なくとも将棋に疎い僕はそうです。将棋が好きな人はまた違うのかもしれませんが。。。

2017年で最も「たーのしー!」かった日は?

今年も残すところわずかですね。

今年も多くのアニメが放送されましたが、2017年最も話題を集めたのは「けものフレンズ」ではないでしょうか?
kemono-friends.jp

本作で特徴的なセリフの1つに「たーのしー!」があります。
そこでけものフレンズに関するツイートから2017年で最も「たーのしー!」かった日を求めてみたいと思います*1






1.Twitter APIキー・トークンの取得

ツイートを取得するにはTwitter APIキーとトークンを取得する必要があります。APIキー・トークン・ツイート取得までは下記の記事を参考にさせて頂きました。
www.randpy.tokyo

#使用するライブラリをダウンロード
library(rtweet)
library(dplyr)
library(ggplot2)
library(tidyverse)
library(scales)

#APPNAME, CONSUMERKEY, CONSUMERSECRETは前もって取得しておきます
APPNAME <- "xxxxxxxxxx"
CONSUMERKEY <- "xxxxxxxxxx"
CONSUMERSECRET <- "xxxxxxxxxx"

#トークンを取得
twitter_token <- create_token(
        app <- APPNAME,
        consumer_key <- CONSUMERKEY,
        consumer_secret <- CONSUMERSECRET)


これでツイート取得する準備は整いました。当初はsearch_tweets関数でハッシュタグ「#けものフレンズ」を含むツイートを全て取得しようと思っていたのですが、helpのdescriptionによると

ONLY RETURNS DATA FROM THE PAST 6-9 DAYS.

とのことで最高で6-9日までしか遡れないようです。*2

そこで、公式アカウント(@kemo_anime)のツイートを取得し、そのリツイートやいいねの数を見ることにします。


2.ツイート取得・前処理

#get_timeline関数を使用
#user:ユーザー名
#n:取得したいツイート数
#home:ユーザーのツイートを取得する場合はF
#token:token_createで取得したオブジェクト

tl <- get_timeline(user = "kemo_anime", n = 3200, home = F, token = twitter_token)
dim(tl)
[1] 2575   42

2575ツイートを取得できました*3。42変数の中にツイート日、文章、いいねの数などが含まれています。
アカウント名からてっきりアニメ専用アカウントかと思っていましたが、ツイート日が格納された変数(created_at)を見ると最初のツイートは2015年2月(アプリ時代?)でした。


以下解析のために前処理としてデータを整形します。

#リツイートを除外
tl <- tl[tl$is_retweet == F, ]
#APIで取得するとグリニッジ標準時なので日本時間に変更
tl$created_at <- as.POSIXlt(tl$created_at, tz = "Japan")
#アニメの影響を見たいので期間を2017年1月1日以降に
tl <- tl[tl$created_at > "2017-01-01 02:00:00", ]
#日ごとにまとめる
tl$day <- as.POSIXct(substring(tl$created_at, 1, 10))
tw_per_day <- table(tl$day) %>% as.data.frame()




3.ツイート解析

下図は公式アカウントの1日あたりツイート数のヒストグラムです。
この1年で公式アカウントからは570ツイートあり、1日あたりのツイート数は1〜9件ということが分かります*4

#合計ツイート数を算出
sum(tw_per_day$Freq)
[1] 570

#1日あたりツイート数の概要
summary(tw_per_day$Freq)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000   2.000   2.317   3.000   9.000 

#ヒストグラムのプロット
ggplot(tw_per_day, aes(x = Freq)) + 
        ggtitle("けものフレンズ公式アカウント ツイート数/日") + 
        theme(plot.title = element_text(family = "HiraginoSans-W3", 
                                        hjust = 0.5), 
              axis.title = element_text(family = "HiraginoSans-W3", 
                                        size = 10)) +
        geom_histogram(bins = 9, binwidth = 1) + 
        scale_x_continuous(breaks = 1:9, labels = 1:9) + 
        xlab("ツイート数/日") + ylab("頻度")

f:id:aiuchi0703:20171231204616p:plain

いいね数とリツイート数をプロットしてみます。

day_df <- data.frame(day = rev(unique(tl$day)), 
                     favorite_count = tapply(tl$favorite_count, tl$day, sum), 
                     retweet_count = tapply(tl$retweet_count, tl$day, sum))

#ggplot用に整形
day_plot <- tidyr::gather(day_df, key = "group", value = "value", 
                           c("favorite_count", "retweet_count"))

#プロット
ggplot(data = day_plot, aes(x = day, y = value, colour = group)) + 
        ggtitle("けものフレンズ公式アカウント いいね数・リツイート数") + 
        theme(plot.title = element_text(family = "HiraginoSans-W3", 
                                        hjust = 0.5), 
              axis.title = element_blank(),
              axis.text.x = element_text(family = "HiraginoSans-W3", 
                                         size = 8), 
              legend.text = element_text(family = "HiraginoSans-W3")) +
        geom_line() + 
        scale_x_datetime(breaks = as.POSIXct(paste("2017-", 1:12, "-01", sep = "")), 
                         labels = paste(1:12, "月", sep = "")) +
        scale_y_continuous(labels = comma) + 
        scale_colour_discrete(name = element_blank(), labels = c("いいね", "リツイート"))

#いいねとリツイートの相関係数を算出
cor(day_df$favorite_count, day_df$retweet_count) %>% round(digits = 2)
[1] 0.93


f:id:aiuchi0703:20171231205214p:plain

いいね数とリツート数は強い相関があること(相関係数:0.93)、どちらも日によって数に大きな差があることが分かります。
多少荒っぽいかもしれませんが、以降は単純のためにいいね・リツイート数の合計したものを基準にします。

#いいねとリツイートを合算
day_df$fav_rt <- day_df$favorite_count + day_df$retweet_count

#プロット
ggplot(data = day_df, aes(x = day, y = fav_rt, group = 1)) + 
        ggtitle("けものフレンズ公式アカウント いいね+リツイート数") + 
        theme(plot.title = element_text(family = "HiraginoSans-W3", 
                                        hjust = 0.5), 
              axis.title = element_blank(),
              axis.text.x = element_text(family = "HiraginoSans-W3", 
                                         size = 8), 
              legend.text = element_text(family = "HiraginoSans-W3")) +
        geom_line() + 
        scale_x_datetime(breaks = as.POSIXct(paste("2017-", 1:12, "-01", sep = "")), 
                         labels = paste(1:12, "月", sep = "")) +
        scale_y_continuous(labels = comma)

#いいね+リツート数の多い日トップ5を算出
day_df$Freq <- tw_per_day$Freq
head(day_df[order(day_df$fav_rt, decreasing = T), -1], 5)

           favorite_count retweet_count fav_rt Freq
2017-03-29          65440         61601 127041    4
2017-12-25          76554         49895 126449    3
2017-07-21          45296         53329  98625    3
2017-04-24          33692         48750  82442    2
2017-04-27          36986         42759  79745    4

僅差ではありますが最も「いいね+リツイート数」が多いのは3月29日でした。ただし、3月29日のツイート数は4、2位の12月25日のツイート数は3ですので、1ツイートあたりの平均では12月25日がトップになります。
トップ5のうち放送期間中(1〜3月)のツイートが1件しかないのも興味深いです。

f:id:aiuchi0703:20171231205548p:plain


それでは、3月29日や12月25日にどのようなツイートがされたのか見ていきます。

tl$fav_ret <- tl$favorite_count + tl$retweet_count

#いいね+リツイート数の多いツイートトップ5を表示
tweets <- data.frame(tl[, c("favorite_count", "retweet_count", "fav_ret", "text")], 
row.names = as.character(tl$created_at))

head(tweets[order(tweets$fav_ret, decreasing = T), -4], 5)
                    favorite_count retweet_count fav_ret
2017-12-25 00:00:21          68438         45488  113926
2017-07-21 15:01:22          42581         51385   93966
2017-04-07 17:00:24          30064         44505   74569
2017-04-24 10:05:39          26132         38002   64134
2017-03-29 02:18:57          35350         25957   61307

ツイート単位で最もいいね+リツイート数が大きいのは12月25日の「ようこそジャパリパーク」のクリスマスver.を告知するツイートです。
3月29日のツイートは最終回直後のものですね。




4.まとめ

  1. 2017年で最も「たーのしー!」かった日は3月29日。
  2. 最もいいね+リツイートされたのはOPのクリスマスver.告知のツイート。
  3. 放送終了後も根強い人気がある。




放送終了後も人気があるのは分かっていましたが、こうして可視化してみるとよりはっきりしますね。
放送から1年近く経った現在でも万単位でいいねやリツイートされるのは凄まじいです。。。
こんなデータを見ると思わず言いたくなります。


すっごーい! と(笑)



2018年も面白いアニメに出会えますように。

*1:RによるTwitterテキストマイニング、ggplot2で時系列データを描く練習を兼ねて

*2:このゆらぎは何だろう。あと公式の7日間制限との差は。。。

*3:2017年12月31日17:00時点

*4:実データでここまできれいな階段状のヒストグラムは初めて見ました

JupyterでRを使おうとしたら詰まった話

すでに分かりやすい説明がいくつもありますが、自分の環境では詰まったのでまとめてみる。


環境
・OS:MacOS Sierra(10.12.6)
・R:3.4.2
・Jupyter:4.3.0
 ※pyenvでanaconda3-5.0.1をインストールして使用


参考
qiita.com


ターミナルでRを立ち上げ以下のコマンドを入力すれば良い、はずなのですが自分の場合は1行につき1回詰まりました。。。

> install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
> devtools::install_github('IRkernel/IRkernel')
> IRkernel::installspec()


まず1行目を入力すると

 警告メッセージ: 
 doTryCatch(return(expr), name, parentenv, handler): 
   共有ライブラリ '/Library/Frameworks/R.framework/Resources/modules//R_X11.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/modules//R_X11.so
  Reason: image not found 


どうやらX11がないと怒られているようです。
調べてみると以前のmacOSではX11が標準で入っていたようですが、現在は別途インストールする必要があるようです。
macos - Can't load X11 in R after OS X Yosemite upgrade - Stack Overflow
Mac 用の X11 について - Apple サポート


アップル公式サイトからダウンロードサイトへ移動してインストールします。


f:id:aiuchi0703:20171225001626p:plain


インストールすると「/opt/X11/lib/libSM.6.dylib」が生成され無事にパッケージのインストールはできました。
次に2行目のコマンドですが

> devtools::install_github('IRkernel/IRkernel')
Skipping install of 'IRkernel' from a github remote, the SHA1 (dfa7f4ef) has not changed since last install.
  Use `force = TRUE` to force installation


`force = TRUE`と言われたのでとりあえずその通りに実行してみます。

> devtools::install_github('IRkernel/IRkernel', force = T)
Downloading GitHub repo IRkernel/IRkernel@master
(中略)
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (IRkernel)
 警告メッセージ: 
GitHub repo contains submodules, may not function as expected!


警告メッセージは出たものの、一応インストールはできたようなので先に進んでみます。

> IRkernel::installspec()
 IRkernel::installspec() でエラー: 
  jupyter-client has to be installed but “jupyter kernelspec --version” exited with code 127.

エラー文を検索してみてもよく分からない。。。


で、2時間くらい悩んだのですが、これは完全に私の不注意でした。
最初に書いたようにpyenvのanacondaでjupyterをインストールしていたのですが、実行環境がanacondaじゃなかった(笑)

anaconda環境でRを立ち上げて上記コマンドを実行し、ターミナルに戻って

$ jupyter notebook


これで新規ファイル作成時にRを選択できるようになりました。


f:id:aiuchi0703:20171225005925p:plain:w150

Airmailで自動的にBCC送信

AirmailOS XiOSメーラーです*1

f:id:aiuchi0703:20171207223954p:plain

App Storeより

 

今までは何となくoutlookを使っていたのですが、シンプルで見やすいUI(Mac標準のメーラーよりMacっぽい感じがします)とカスタマイズ性に惹かれて乗り換えてみました。

outlookでは「送信の際に自動で自分(任意のアドレス)をBCCに追加する」設定が簡単にできたのですが、同様の設定で少し詰まったので書き留めておこうと思います。

 

ネットでは該当しそうなページを見つけられなかったので、Airmailの公式HPにあるチャットで質問してみました(私の英語力でも通じた)。

f:id:aiuchi0703:20171207220833p:plain

Preferences > Accounts > [Account] まではいいとして「Composer」なんてあったかなあと思い確認してみてもそれっぽいタブはありません。

 

f:id:aiuchi0703:20171207221527p:plain

 

結論から言うと日本語表示での「エディタ」が「Composer」でした。

 

んー、これはさすがに「コンポーザー」か「構成」と訳すべきではないでしょうかね。どうりで自力では見つけられなかったはずだ。。。

 

「エディタ」タブの「送信済みメール」で「自動BCC」を選択し、その横に自分のアドレスを記載すると、自動で自分にBCCできるようになりました。

 

 

めでたし、めでたし。

 

 

*1:無料のbeta版と有料版がありますが機能の差はほとんどないようです。私もbeta版を利用していますが機能面で不満を感じたことはありません