R筋

プログラミングと時々育児

【R】クラスタ分析の解説とRによる実装

クラスタ分析について整理しました。

クラスタ分析とは

クラスタ分析とは、「データのパターンが似ている個体を同じグループにまとめる分析方法」である。機械学習では、正解となる教師データを定めずデータの構造を把握する「教師なし学習」の代表的な手法の一つだ。

先日こんなツイートがバズっていた。


この方を含め、この図を見た大体の人は各都道府県を「東京」「東京以外」というグループに分けた上で、物事を考えるのだと思う。
ただこういう平面上にプロットできるデータであれば、視覚的に判断ができるが、第3軸として「満足度」などがある3次元のグラフになると、直感的にグループ化することは難しくなる。
この問題をクラスタ分析により、「いくつのグループにするか」「各個体(都道府県)をどのグループに所属させるか」を示すことができる。
注意が必要なのは、クラスタ分析によってグループ化した結果は、機械がアルゴリズムに従って出力したものであり、データを解釈した上で何らかの根拠に基づいて分類しているものではないという点である。
「東京」「東京以外」というグループ分けを行ったとしても、「東京」と「東京以外」にどのような違いがあるのかは人間が考えなくてはならない。

サンプルデータ

上記ツイートの出典を参考に年収と物価の表を作成。
f:id:anpontan382:20200225001239p:plain
Rで読み込んで、散布図を作成してみる。

library(maptools)
plot(cluster$収入,cluster$物価)
pointLabel(cluster$収入,cluster$物価,cluster$都道府県)

f:id:anpontan382:20200225224821p:plain
若干ずれていますが、もとのグラフに近いものができた。

階層的クラスタ分析

階層的クラスタ分析とはクラスタ分析の手法の一つである。個体間の類似度に基づき、最も似ている個体から順次クラスタを作る。クラスタが作成されていく過程は樹形図(デンドログラム)で表示される。
とりあえずやってみるとこうなった。

rownames(cluster) <- cluster$都道府県
cluster.d <- dist(cluster)
 hc1 <- hclust(cluster.d, "ward.D2")
plot(hc1)

f:id:anpontan382:20200225233245p:plain

階層的クラスタ分析は次のステップによる。
1)データから距離を求める(dist関数)
2)分析の手法(よく使われるのはウォード法)を決め、
コーフェン行列を求める(hclust関数)
3)樹形図を作成する(plot関数)

距離行列を求める手法にはいくつかあり、用いる手法によって結果がクラスタリングの結果が異なる。
最短距離法を用いる場合は、heclust関数のmethodに"single"を指定する。

rownames(cluster) <- cluster$都道府県
cluster.d <- dist(cluster)
 hc2 <- hclust(cluster.d, "single")
plot(hc2)

f:id:anpontan382:20200225233131p:plain
ウォード法の結果と若干異なることがわかる。
いずれが妥当かを判断する方法として、(1)で作成した距離の行列と(2)で作成した樹形図のもととなるコーフェン行列とのコーフェン相関係数を求める方法がある。

cor(cluster.d,cophenetic(hc))
#0.6607074
cor(cluster.d,cophenetic(hc1))
#0.8553172

コーフェン相関係数が大きいほど、コーフェン行列への変換における歪みが小さいといえる。
歪みが小さくても妥当であるとは言えない。前述のクラスタ分析の課題に記載の通り、どの妥当な手法は得られた結果をもとに人間が判断する必要がある。

ただ、やはりいずれの手法でも「東京」と「東京以外」のグループで最大の違いがあることがわかる。
もう少し、「東京以外」を掘り下げてみよう。cutreeにより、樹形図をもとに指定したグループ数に個体を分類することができる。

as.data.frame(cutree(hc1,k=4))

f:id:anpontan382:20200225235147p:plain

非階層クラスタ分析

データ数が増えると、全組み合わせの距離行列を計算する階層的クラスタ分析では計算量が膨大になるため、非階層的クラスタ分析が用いられる。
代表的な方法としては、k平均法(k-means)がある。
先程のデータフレームを3グループに分ける場合は、

rownames(cluster1) <- cluster$都道府県
cluster.km <- kmeans(cluster1,centers = 3)
cluster.km$cluster

f:id:anpontan382:20200227233826p:plain
ずれていて少し分かりづらいが今回は「東京」「大阪」「愛知」「神奈川」が一つのグループになっている。
これはk平均法のアルゴリズムが、最初に決めたクラスタ数(3個)をプロットし、一番近くクラスタに個体を所属させるというものであるからだ。
このあたり、前述の階層的クラスタ分析の結果や、直感とはズレる部分であるが、含まれているのは全部人工の多い都市がある自治体という点をみると、これも妥当な視点なのかもしれない。どの手法を使うにしても、クラスタ化の結果の解釈が重要だということである。

またk平均法では、事前にいくつのグループに分けるかというクラスタ数を指定する必要がある。適切なクラスタ数を決める方法には、シルエット分析とエルボー法といったものがある。
非階層クラスタ分析について可視化するには、clusplot関数を使う。

clusplot(cluster1, cluster.km$cluster, color=TRUE, shade=TRUE, labels=2, lines=0)

f:id:anpontan382:20200228000357p:plain

参考文献

ジュニアNISAで買うならやっぱりタカラトミー!

皆さん、ジュニアNISA口座作ってますか?
株式や投資信託で子供の資産を作ろうと考えていれば、作っておいて損はないとても美味しい制度である。僕も息子が生まれてから口座を開設し、いくつかの株や投資信託を買って運用している。

ジュニアNISAには、毎年80万円✕5年分の投資枠が非課税というメリットが有る一方、18歳まで引き出しはできないなどのデメリットもあり、投資対象選びは重要だ。

そこで僕が買った中で一番おすすめできる銘柄「タカラトミー」をご紹介しよう!
ジュニアNISAの投資先を考えている皆様の参考になれば幸いである。

f:id:anpontan382:20191216233615j:plain

タカラトミーといえば、プラレールトミカ・リカちゃんなど、全日本人があそんだことがあるであろうおもちゃメーカーです。
現在の株価は1287円(12月16日終値)、単元株は100株なので、12万8,700円で株主になれる。

そんなタカラトミーはとにかく株主優待が素晴らしい。詳しくはこちら。
www.takaratomy.co.jp

まとめると、株主になることで2つの特典がある。
①おもちゃがもらえる
100株を保有する我が家にも夏頃に、息子の名前宛に小さい小包が届き、「平成」「令和」が書かれた2台のトミカが届いた。息子が好きな色である黄色のスープラは自分でギコギコ動かし、灰色のシビックは「とーちゃん遊んでね」と僕にくれ、楽しく遊んでいる。
f:id:anpontan382:20191218002421j:plain

タカラトミーモールでの買い物が最大40%割引
保有期間2年目の我が家は、30%の割引が受けられるのだが、これはかなり大きい。トーマスのプラレールを次々欲しがり、ソドー島にいる機関車をコンプリートする勢いの息子がいるため、定価3,000円超えの機関車が大体2,000円で買えるこの制度は、3台買えば1台分がもらえる計算になるわけで、大変にお得だ。

この2大優待の力(+配当金)がどれだけの威力を持つかを次の表で計算してみた。
結論から言うと、僕の理論によれば、ジュニアNISAでタカラトミーを買って18年間持てば、18年後の株価がたとえ1円だったしても約6,000円儲かることになる!!!!

f:id:anpontan382:20191216231628p:plain
f:id:anpontan382:20191216231647p:plain

順番に説明しよう。

①まず、タカラモールで年齢毎に1~3万の買い物をすると仮定する。(15歳以上は、おもちゃをあまり買わなくなるだろうから0円)
タカラモールは株の保有期間に応じて、買物額の10%~40%の割引を受けられるため、割引額の合計87,000円は実質の利益となる。

②つぎに配当金だが、過去5年間の年間配当平均は約15円であるため、今後もこの水準が続くと仮定し、年間1,500円の配当収入の合計額28,500円が見込まれる。

③最後に、100株の場合優待でもらえるトミカ2台は1台500円の価値があると見込み1,000円分なので、18年で18,000円となる。

これらを合計した134,000円はタカラトミーをジュニアNISAで18年間持った場合ノーリスクで手に入れられる収益となるのだあ!!

そして、収益総額から現在の株価に基づく最低購入金額を引くと、5,800円。これはつまり株価が1円となったとしても約6,000円儲かるということを意味している。実際タカラトミーのような国民的メーカーの株価が暴落することは考えにくいわけで、今の水準以上になることもあるだろう。その場合は、「13万4,000円+値上がり益(非課税)」分が儲かる計算になる。
素晴らしい!みんなもタカラトミーの株をいっぱい買って株価を上げよう!(含み損中)
ここに記載した株主優待の内容、配当額の予想はあくまで現時点の予測であり、当然将来において変更される可能性はあります。最終的な投資決定は、お客さまご自身の判断でなさるようにお願いいたします。当サイトの使用及び閲覧は、お客様自身の自己責任でなされるものであり、本情報に基づいて被ったいかなる損害についても一切責任を負いません。

と、色々おバカ計算を書いてきたが、ジュニアNISAを使う最大のメリットは投資教育に活かすことができる、ということだと思う。
まだ2歳の息子は全然理解できていないが、子供の名義の証券口座があり、子供の名前宛に、株主優待の商品や配当の支払い通知、さらには決算報告や株主総会の招集通知が届くということは、今後小学生・中学生になったとき投資に興味をもついいキッカケになるのではないか。今もタカラトミーから郵便が届くと「わっちゃん(息子)あてにトミカの人がおもちゃくれたよ」などと説明してあげており、息子も少なくとも父や母が買ってくれたものとは少し違う特別なおもちゃであるという感覚を持って株主優待トミカで遊んでいるような気もする。(たぶん気のせい)
タカラトミーの場合は約13万円でそのような機会を提供してくれている会社といえる。
だからタカラトミーに限らずだが、ジュニアNISAで子供が好きなものを作っている会社の株を持つことに大きな価値があると感じられる。
f:id:anpontan382:20191217084553j:plain

2歳の息子の為に、amazonで買ってよかったもの3選

amazonでの商品購入には、もともと躊躇がなかったほうですが、「子供の為に」とあなると更に勢いよく次々と商品をポチっているこの頃です。そこで、総額に怯えながら、購入履歴を見返し、「買ってよかったな~」と思える商品を皆様にも広められたらなと思います!

これを参考にすれば、子供も大満足だね!!!

それではいきましょう!

f:id:anpontan382:20191103232903j:plain

目次

 

フロッシーこども専用フロス60本

f:id:anpontan382:20191104223304j:plain

1歳の歯科検診のときに、歯医者さんに「デンタルフロスも定期的にやってあげるといいですよ」と言われ、買ってみた商品。殆どの乳歯が生えた今では1周間に1~2回使っています。嫌がるだろうなと思っていたものの、6種類のフルーツのフレーバーで、「今日はどれを使う?」なんて言いながら本人に選ばせると「りんご!」などと言いながら、喜んで口を開けてくれます。なんでもそうですが、自分で選んだものというのはイヤイヤ言うことなく素直に聞いてくれるんですよねー。

そして3日おきでも、歯の間をゴシゴシすると、結構な食べかすが出てきます。これやってる子供とやってない子供ではだいぶお口の健康に差が出そうだなぁと感じます。

食べかすは無いほうがいいんだけど、いっぱい取れると楽しくなっちゃうんだよね!!!

おすすめポイント

■フレーバが豊富!

 

クツワ STAD はさみ きっちょん ブルー SS112BL

f:id:anpontan382:20191104223242p:plain

我が家では、作って代用できるおもちゃは作る!という方針のもとダンボールや画用紙でおままごとセットなどを自作しています。親がはさみで色々なものを作り出している姿を見て、息子もはさみに興味津津で、好きあらば大人のはさみを使おうとしてきますが、2歳にはまだ危ないなぁと思い購入しました。触れ込みの通り、指を切ったり、先端が刺さったりする心配がなく、息子も心置きなく紙を切れるようになりました。本当に切ることが大好きみたいで息子に与えたものの中で唯一「○○(息子のフルネーム)くんのチョキチョキ」と名前をつけて読んでいます。

「ちょきちょき~」と言いながら一生懸命紙を切る姿がとてもかわいいですよ!!

おすすめポイント

安全で好きなだけ切らせてあげられるはさみ!

[アシックス スクスク] ベビーシューズ メキシコナロー BABY

f:id:anpontan382:20191104224118p:plain

同い年の子に比べて頭のサイズが一回り大きい息子…そのせいなのかわかりませんが、なんとなく歩く姿がおぼつかず、足元がフラフラしている気がしていました。妻と色々と調べた結果、アシックスのスクスクシリーズがいいらしいと聞き、取扱店で履いてみると、確かに他の靴と比べて足首まで支える作りになっており、すごく安定感がありました。色、デザインもですが、歩きやすさは靴選びで一番大切です。靴が歩きやすいとお散歩が楽しくなり、足が強くなると思います。親も子もとても気に入り、新調してイヤイヤ言われたくないというのもあり、このシリーズで同じ色のものを13cm、13.5cm、14cm、14.5cmとずっと買い続けています。

asicsで4000円以下で買えるのは良心的だし、サイズを変えてリピ買いすれば迷う必要もないですよ!!

おすすめポイント

数少ない足首を支える靴!

 

 いかがだったでしょうか?

本記事では2歳の息子の為に、amazonで買ってよかったもの3選を紹介しました。

どれも我が家ではほぼ毎日使っているものですので、自信を持っておすすめできます。

よかったら買ってみてくださいね!

それではまた!

 

皆さん優しい心を育みましょうね

息子が少しづつ言葉を話し、意思疎通ができるようになってきた。息子も息子の考えがあって、その考えに基づいて言葉を発しているのだなぁと感じる場面があり、しみじみすることがなんどかあった。その中でも特に衝撃を受けるときっていうのは、僕がもう無くしてしまった優しい心を息子はまだ持っているんだなぁという場面である。自分が少しでも優しい心を取り戻せるように、印象に残っているエピソードを2つここに記し、折に触れて見返すことにしようと思う。

光る星のおもちゃの話。
5個セットの光る星のおもちゃを買ってきて、息子と遊んでいたときのこと。僕、妻、息子の間で「はいどうぞー」「ちょうだいー」などといい、その星をやりとりしていたのだが、優しい心を失った僕は、この5個を妻、僕、息子の3人で分けようという提案をしたらどう分けるのだろうという、いじわるな発想が湧いてきた。そこで、その5つの星を「1個目は、わっちゃん(息子)の」といって1つ息子に渡し、「2個目は、とと(僕)の」といって1つ自分の前に置き、「3個目はかか(妻)の」といって1つ妻の前に置いた。その上で「あと2個どうしたらいい?だれにあげよっか?」と息子に訪ねた。この時点では、「全部、わっちゃんの!」とって残りを自分のものにするだろう(自分ならそうする)と思っていたのだが、息子は「これは、じじの!」「これは、ばばの!」といって、別居しておりその場にいない祖父、祖母用の星にしたのであった。大人が思いつく優しい心なら「これはとと、これはかか」と目の前の2人に残りをあげるというのが限界だろう。本当に優しい心の持ち主は、その場にいるか(同居しているか)いないかという点で制限をかけることになんの意味もなく、どこにいてもwe are the world

さるかに合戦の話。
さるかに合戦の本を読んであげていたときのこと。冒頭で、さるに柿を投げつけられ、カニが死んでしまうシーンがあるが、これがラストでさるに仕返しする理由であることをしっかり伝えねばと思った僕は、執拗に息子にそのシーンを解説した。「さるの柿がバーン!ってあたっちゃったの」「カニがイテテテ~!って言ってるの」「こまったねぇ」などと話していると、だんだん息子の表情が険しくなり、カニが死んでしまうことの深刻さが伝わったようであったので続きの、栗と臼と蜂とウンチに合うシーンに進もうとしたところ、息子は本を奪い「戻して戻して」と前のページへ戻した。そこでは、死ぬ前の元気なカニがいてサルから柿の種とおにぎりの交換を持ちかけられているシーンであった。それを見た息子は満足そうな表情に戻り、本を閉じたのであった。大人の発想は、さるへの仕返しという物語のゴールがあって、それに向けてカニは死ぬ必然があるため、カニが死ぬ際、悲しみを覚えても疑問を持つことはない。気にしているのは、仕返しが成功し、さるが確実に死ぬことである。だがそこに残るのは、さるとカニ2つの死骸でである。日本人は敵討ちが好きなどという話をよく聞くが、そもそも敵討ちをする理由が生まれないようにする、未然に対処しようという発想は大人にはないのか!さるかに合戦とは物語ではなく、合戦である。合戦反対!we are the world!

raspberry pi 定点カメラ

毎日19時30分にgoogle homeが「ハイチーズ!」と言い、ラズパイのカメラで部屋の写真が撮られ、ファイルサーバ上にアップロードする仕組みを作った。
f:id:anpontan382:20190309212541p:plain

参考にしたのはこの記事
www.moyashi-koubou.com

では手順を大公開!

①ラズパイはすでにあるので、追加でカメラモジュールを買う。

②壁に取り付ける
f:id:anpontan382:20190309213543p:plain
画鋲と糸を使い見事にレンズの角度を調整するのことに成功した。

③GoogleHomeにしゃべらせるスクリプトを作成

const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.***.***");
googlehome.notify('写真とるよー!ハイ、チーズ、カシャ', function(res) {
  console.log(res);
});

これをhiCheese.jsとして保存する。

④写真を取るスクリプトを作成

#!/bin/bash
sudo node /home/pi/camera/hiCheese.js
today=$(date "+%Y%m%d%H%M")
filename="/home/pi/nas/dailyphotos/${today}.jpg"
echo $filename
raspistill -o $filename

当日の日付の文字列を作成し、それをファイル名として写真をNASに保存するシェル
これをphoto.shとして保存
⑤cronに登録

30 19 * * * sudo sh /home/pi/camera/photo.sh

毎日19時30分にphoto.shが実行される。

Google Homeがはいチーズって行ってからカメラモジュールがシャッターを切るまでのタイムラグの調整が難しかった。
カメラモジュールの起動に時間がかかるので、「こっちむいてー」「写真を取るよー」「ハイチーズ」「カシャ」の言葉でGoogle Homeが喋り終わる時間を調整しながらシャッターが切れるベストタイミングを探した。
完成して一ヶ月ほど動かしたので、フォルダに30枚ほど同じ角度で撮った部屋の写真がたまったが、スライドショーで連続して見ると思った以上に面白い!前日大泣きしている息子が翌日は大笑いしていたり、お気に入りのオモチャは毎日場所が変わっているのに、興味無いオモチャはずっと同じ場所にあったり、油断していたり、カメラ目線だったり、特別ではない毎日の普通の時間、いつもの場所だからこそ撮れる写真の良さというのがあるなぁと感じる。1年単位で続けたら息子の成長も感じられるだろう。

2019/3/25 追記
撮影と同時に、画像を縮小し、妻と自分が見れるslackにアップロードできるようにした。
f:id:anpontan382:20190325231202p:plain

convert -resize 10% -unsharp 2x1.4+0.5+0 $filename today.jpg
curl -F file=@today.jpg -F channels=dailyphotos -F token=XXXXXXXXXXXXXXXXX https://slack.com/api/files.upload

【R】グループ化して集計するあれこれ

部署ごとの社員数を求めるとか
地域ごとの売上1位の店舗を求めるとか、グループ化して集計するという場面は多いので、
メモ。

これ(iris)↓から
f:id:anpontan382:20190216105955p:plain
SpeciesごとにSepal.Lengthが最大になる行だけを取り出したい。
つまり↓
f:id:anpontan382:20190216110022p:plain
とするには、

library(dplyr)
iris %>% group_by(Species) %>% filter(Sepal.Length == max(Sepal.Length))

が、手っ取り早し。

標準のarrregate関数というものもあるが、対象列(Sepal.Length)のみの集計になってしまう。

aggregate(iris$Sepal.Length, list(iris$Species), max) 

これを実行すると、
f:id:anpontan382:20190216113118p:plain
こうなって、Sepal.Length以外は消えてしまう。
これをもとにもとの、irisと結合させれば同じことができる

A <- aggregate(iris$Sepal.Length, list(iris$Species), max) 
colnames(A) <- c("Species","Sepal.Length")
left_join(A , iris ,by=c("Sepal.Length","Species"))
#Sepal.LengthとSpeciesをキーに内部結合

f:id:anpontan382:20190216114223p:plain

tapplyでは、

tapply(iris$Sepal.Length,iris$Species,max)

によって、配列が返される

    setosa versicolor  virginica 
       5.8        7.0        7.9 

行ったり来たりで申し訳ないが、dplyrのsummariseでaggregateと同じ結果を求めるには

 iris %>% group_by(Species) %>% summarise(max(Sepal.Length))

とする。

健康についての当たり前の話

僕は体は丈夫なほうだと思っていて、風邪を引くのも年に1回あるかないかという程度だったんだけど、今年は体調を崩して1周間以上回復しないということがもう4回も起きている。すべて、子供が保育園に行き始めてから起きていて、どうやら子供が保育園でもらってきた風邪をすべて僕ももらっているようだ。しかも子供が回復しても僕はなかなか回復しないということが多く、それにより、仕事が片付かずストレスが増えたり、妻の育児負担が増え険悪になったりしていて、育児をする上でもちろん子供の健康は重要だが、自分の健康も同じくらい重要であるということをしみじみと感じている。書いてみると当たり前か。とはいえ、こういう内容だと当たり前の話しか書くことはないわけだから、引き続き当たり前のことを書くと、いろいろと忙しいと食事が適当になりがちだが、30近くなると偏った食生活がたちどころに体調に影響してくることを実感する。昼飯にパンのみという生活をしていたのは本当によくなかった。みんなも気をつけてほしい。あと、保育園にはいろいろな菌がいることも実感を持った。みんなも手洗いうがいをしっかりやろうな!そして、子供の体調が悪いと眠りが浅くなり、それに伴って親の睡眠も減るということは良くあった。それはすなわち共倒れを意味するわけで、子供の体調が悪いときは親も早く寝ような!これについてはなかなか実行できないが、あとで何日も長引く風邪になると思えば、今日の夜だけ早寝することは、合理的だ。
最近の僕の例でいくと、この辺を守らなかったばっかりに、子供がRSウィルスになったのをきっかけに、僕の咳も止まらなくなり、2周間くらい酷い喘息状態だった。喘息は、春頃にも、子供の風邪をきっかけに発症していて長引いたので、今回も辛くはあったが、気長に構えていた。だが、咳という症状は実はとても恐ろしくて、体に大きな負担がかかるようだ。咳しまくっているとまず酷い頭痛になった。そのへんは頭痛薬でなんとかなったが、今度は対局にあるお尻に異変が起きた。痔になったのだ。風邪で下痢気味になっていたところに、咳の衝撃が肛門に受けた結果、外痔核の診断を受けるところとなった。更に咳を続けていると今度は肋骨に激痛が走り始めた。これも咳あるあるで、肋骨への負担が神経痛を起こしていた。幸い疲労骨折などには至らかなったものの、鎮痛剤の量を増やすところとなった。そんなわけで、体中に諸症状を起こし一時期7~8種類の薬を飲んだり塗ったり貼ったりする日々を過ごすところとなっていた。そんな日々を過ごして、病は気からとは言うが、逆に気は病からということを痛感した。体調が芳しくないと、とにかく何もやる気が起きず、仕事も放置、勉強も手につかず、育児も妻まかせで寝込んでいた日々は、何も得るものがなかった。追い打ちをかけるように、健康診断の結果で、コレステロール値で再検査となっていた。健康はある日突然崩壊するということがよくわかった。これを読んでいるあなた、充実した日々は、健康が基本だということをよく覚えておくことだまじで。