R筋

プログラミング、金融、育児

アフィリエイト自動化で無限の富を手に入れる

アフィリエイトを自動化して寝ていてもお金が増えりゃあなぁと考え、色々と調べていると各種APIを組み合わせて利用するとそれなりに形にできそうだなということがわかったので、使いみちを持て余していたraspberry piを活用し、やったことをメモ。

 

できたもの

イメージ図だが、こんな感じでアフィリエイトのリンクを定期的にツイートするBOTを作成した。

f:id:anpontan382:20200808235855j:plain

(ちなみにこのイメージはpowerpointで図形と画像を組み合わせて作成した。パワポはオブジェクトを任意に配置するのには適しているため、簡単なイメージならすぐに作れて便利だよ。)

 

仕組み

raspberry pi で以下の処理を定期実行。

raspberry pi からAPIを提供しているECサイト(DMM、楽天、アマゾン、ヤフーショッピング等)から掲載している商品の情報(商品画像、商品の説明文、画像、アフィリンク)の情報を取得

②ツイート内容の作成やツイート済商品のDB登録

twitter api あてにツイート

f:id:anpontan382:20200809000416p:plain

(ちなみにこのイメージはdrow.ioを用いて作成した。フローチャートやネットワーク図などシステム関連の一般的な図形のサンプルが豊富であり、これも簡単なイメージであればすぐにつくることができて便利だよ。)

 

稼働結果

7月は1ヶ月稼働させてみたが、楽天の場合、約1,300円分の収益が生まれた。他のECサイトからも同程度の報酬が計上されており、1ヶ月で約3,000円ほど儲かった!

f:id:anpontan382:20200809001133j:plain

BOTの開発に5~6時間要しているため、時給換算でまだ元はとれていないが、アフィブログと違い、稼働してからはほどんど実働がない点は優れている。アカウントが凍結されない限りは、自動的に売上が発生するのではないか。

 

 

注意点

amazonアフィリエイトシステムであるアマゾンアソシエイト、twitterで自動投稿を実現するためのtwitter apiなどは、利用にあたって事前審査がある。またアマゾンAPIは利用したい場合直近30日で1円以上のアフィリエイト収益が出ている必要があるため、最初は手動でアフィリンクを貼って売上を発生させる必要がある。

qiita.com

www.seo-pro.jp

yurukata.com


どの商品をなんと言って紹介するかという点も収益におおきな影響があるだろう。楽天APIなどは売上げランキングの情報もまとめて取得できるので、ランキング上位から順番に紹介していくなどを実装すればいいが、アマゾンのAPIはそういう機能がないため別途売れ筋商品を取得するロジックを考える必要がある。また、なんども同じツイートをしてもクリック率が上がらないため、すでにツイート済の内容はDBに登録して管理できるようにするなどの工夫も行った。大した収益があるわけではないが、このあたりがこのBOTのキモなのでしばらくは企業秘密とし、収益が上がらなくなったら情報商材として公開することで2度美味しいところを得ることとしたいグヒ。

以下に参考にしたURLを貼っておくことにする。

qiita.com

webservices.amazon.com

it.fudebaco.com

review-of-my-life.blogspot.com

 

 

SFTPサーバ構築時の注意点

先日SFTPサーバを構築したのだが、色々と罠にハマりなかなかに一苦労だった。
ただ全てネットの先の諸先輩方の力で解決策が示されており、なんとかなるに至ったため、感謝を込めて、ハマりどころと解決してくれたページを紹介したい。

 

・「error: subsystem: cannot stat /usr/libexec/openssh/sftp-server: No such file or directory」
参考になったサイト:https://tksm.org/wp/archives/3806

tksm.org


sshd_configのMath句内で、ForceCommand internal-sftpを指定していたとしても、OSによっては、subsystemのsftp-serverが採用されてしまうそうだ。
そのためsubsystem internal-sftpの指定をしないといけない。

 

・「fatal: bad ownership or modes for chroot directory」
参考になったサイト:https://tksm.org/wp/archives/3806

tksm.org


4. SFTP用ディレクトリの作成と権限変更の
ディレクトリ所有者が root で且つ 他のユーザに書き込みさせない 設定が必要」
SFTPでログインするディレクトリは、「drwxr-xr-x(755) root:root」という状態であるということが必要ということ。
ログインディレクトリより上も含めて、755にしないといけない。これは777でもだめで、所有者以外が書き込みできないフォルダ
である必要がある。

 

・複数のユーザで同じディレクトリにログインできるようにしたい
参考になったサイト:https://qiita.com/fallout/items/b702524f2cc0909d92f9

qiita.com


対象のユーザを同じグループに所属させた上で、sshd_configにMatch grop ○○と記載することで、複数ユーザが同じchrootDirecotryを
設定できる。

 

・SFTPユーザAは、書き込み可能、SFTPユーザBは参照のみのディレクトリを作りたい
参考になったサイト:https://ti-tomo-knowledge.hatenablog.com/entry/2018/08/17/010813

ti-tomo-knowledge.hatenablog.com


ログインディレクトリに対してログインユーザは書き込み権限がない。そのためログインディレクトリの下にディレクトリを作成し、
そのディレクトリでユーザAは書き込みできる、ユーザBは参照のみできるという設定を行う。
ユーザAをディレクトリの所有者として、パーミッションを755に設定するということになる。

2020年6月版 TLS1.0/TLS1.1サポート状況

もう世の中は大半が対応し終わって、あまり興味もないだろうが、TLS1.0/TLS1.1の無効化状況について書いた。

・世の中全体

medium.com


によると、2020年2月時点では世界中でTLS1.0/TLS1.1の通信は、0.8%しかないそうだ。
というか既にもっと先を行ってて、TLS1.3がもう50%近くまで達している。
僕の身の回りでいうと、TLS1.0/TLS1.1使用率80%くらいあり、周回遅れなところで仕事している身としては、世の中の変化の激しさに驚くばかりである。
そろそろ本当に対応しないとまずい状況になった気がしてきたため、ブラウザのサポート状況を調査した。

chrome

次リリースのchrome 84でTLS1.0/TLS1.1の廃止が決定している。
developers.google.com
chrome 84の安定版は7/14からリリース開始。
www.chromestatus.com

firefox

firefox 74で廃止される予定だったが、コロナの影響で、廃止撤回。
www.mozilla.org
現行の5/5リリースのfirefox 76までは、方針に変更なし。
6/2のfirefox 77も大丈夫そう。6/30のfirefox 78あたりからは怪しくなるか・・
wiki.mozilla.org

safari

2018年の記事では、2020年5月にサポート終了となっている。
www.macrumors.com
その後の情報が調べても分からないが、twitterなどを覗いても特に騒いでる人がいないので、
現時点では無効化されていないと考える。

IE/Edge

当初2020年前半に終了と周知されていたが情勢を踏まえて以下の通りとなった。
新Edge    2020年7月頃
旧Edge/IE11  2020年9月8日
blogs.windows.com

office365
2020年5月終了と周知されていたが、一時的に保留。
docs.microsoft.com

・まとめ

殆どのブラウザが当初の終了予定から延長しているようであった。
理由としては、リモートワークの増加で混乱が生じることや、TLSに未対応な政府ホームページからコロナ関連情報が取得できなくなるというようなものがあるようだ。
もちろんセキュリティのため、速やかに廃止することに越したことはないのだけど、、未対応の情シス担当のみんなは、今このすきに頑張っていこう!

raspberry pi にHTTP/HTTPSプロキシサーバを構築する

三台目を購入

自粛のため、家でネットショッピングばかりしており、勢い余ってraspberry pi 4 model Bを買ってしまった。

これで今家にあるラズパイは全部で3台となった。一応、過去のラズパイはIOT機器として、毎日ちゃんと稼働しているので、決して無駄な買い物ではない。
1台目:
anpontan382.hatenablog.com

2台目:
anpontan382.hatenablog.com

今回は、今までのraspberry pi zeroと比べるとメモリで言えば、8倍(512MB→4GB)というハイスペックマイコンであるため、もう少し高度な使い方をしてみたい。
ということで、とりあえず勉強も兼ねて、プロキシサーバとして稼働させることにした。
家庭で(というか僕の環境で)プロキシを利用するメリットは以下が挙げられるだろう。

・ネット通信量の削減
前述の通り、最近は自粛や在宅勤務といった事情で、自宅に籠もりネットばかりしているため、wimax環境の僕はすぐに10GB/3日の制限に達し、低速インターネッツを余儀なくされている。そのため、プロキシサーバの持つキャッシュ機能により、一度みたことのあるページはわざわざ再度、同じ通信をせずとも表示させることができる。

アクセスログから、妻のネット通信を覗き見る
我が家は、私のPC・スマホ、妻のPC・スマホ、の4台がwifiに接続されている。これらをすべてプロキシ経由にすることで、すべてのネット接続はプロキシ経由になるためaccess.logにいつ誰がどのページにアクセスしていたのか丸見えとなり、弱みを握ることが可能となる。

・勉強になる
以前DNSサーバを作ったときにも書いたが、プロキシサーバを作るということは、それはその道程において、普段のネット接続で意識することのないプロキシサーバに感謝するという行為である。
anpontan382.hatenablog.com

そういうわけで、raspberry pi 4にsquidを入れて、設定を行ってみることにする。

サーバ設定

プロキシサーバソフトsquidをインストールする。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install squid -y

プロキシサーバの設定をする

基本的にすべての設定は「/etc/squid/squid.conf」で行う。
今回最小限の必要な変更のみだが、squid.confのデフォルト設定に従って
変更した箇所の変更前↔変更後を記述する。

①ローカルネットワークの定義

#デフォルト
acl localnet src 0.0.0.1-0.255.255.255	# RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8		# RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10		# RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16 	# RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12		# RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16		# RFC 1918 local private network (LAN)
acl localnet src fc00::/7       	# RFC 4193 local private network range
acl localnet src fe80::/10      	# RFC 4291 link-local (directly plugged) machines
#カスタマイズ
#自分が使っているLANのネットワーク範囲を記載する。
#僕の家はLAN内部が192.168.100.XXXである。
acl localnet src 192.168.100.0/24

②許可ポートの定義

#デフォルト
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 70		# gopher
acl Safe_ports port 210		# wais
acl Safe_ports port 1025-65535	# unregistered ports
acl Safe_ports port 280		# http-mgmt
acl Safe_ports port 488		# gss-http
acl Safe_ports port 591		# filemaker
acl Safe_ports port 777		# multiling http
acl CONNECT method CONNECT
#カスタマイズ
#ホワイトリストプロキシの場合、接続を許可するポートを記載する。
#いらなそうなものはコメントアウトした。
acl SSL_ports port 443
acl Safe_ports port 80		# http
acl Safe_ports port 21		# ftp
acl Safe_ports port 443		# https
acl Safe_ports port 1025-65535	# unregistered ports
#SSL通信時のCONNECTメソッドはトンネル化して通す
acl CONNECT method CONNECT

③許可ポートに対する制御

#デフォルト
http_access deny !Safe_ports
#カスタマイズ
#Safe_portsで定義したポート以外のアクセスを拒否する定義
#変更無し
http_access deny !Safe_ports

④許可メソッドに対する定義

#デフォルト
http_access deny CONNECT !SSL_ports
#カスタマイズ
#SSL_portsで定義したポート以外のコネクト接続を拒否する定義
#変更無し
http_access deny !Safe_ports

⑤キャッシュマネージャ関連

#デフォルト
http_access allow localhost manager
http_access deny manager
#カスタマイズ
#キャッシュマネージャ(squidの統計情報をCGIで見れる機能)へは
#ローカルホストのみがアクセスできるという設定
#使わないので削除
#http_access allow localhost manager
#http_access deny manager

⑥接続元の制御、その他の制御

#デフォルト
include /etc/squid/conf.d/*
http_access allow localhost
http_access deny all
#カスタマイズ
#追加でオリジナルルールを追加するときは、以下に記載する
#今は何もなし
include /etc/squid/conf.d/*
#ローカルホスト、localnetからのHTTPアクセスを許可する
http_access allow localhost
http_access allow localnet
#ここまで、どの定義にも該当しなかった通信はすべて拒否する
http_access deny all

⑦プロキシとの通信ポート

#デフォルト
http_port 3128
#カスタマイズ
#クライアント↔プロキシサーバ間の通信を行うポート
#8080などもよく使われるが、セキュリティ的には変更したほうが良い
http_port 3129

⑧キャッシュの保存量に関する定義

#デフォルト
# cache_dir ufs /var/spool/squid 100 16 256
# cache_mem 256 MB
# maximum_object_size_in_memory 512 KB
#カスタマイズ
#キャッシュサーバと利用するときに、キャッシュデータを置く場所
#数字は、左からキャッシュで使用する容量(MB)、ディレクトリを分割するサブディレクトリ数、サブディレクトリを分割する数
cache_dir ufs /var/spool/squid 100 16 256
#キャッシュのメモリサイズを指定
cache_mem 256 MB
#メモリ内に保存できるキャッシュの最大を指定
maximum_object_size_in_memory 512 KB

⑨X-Forwarded-Forヘッダーのセキュリティ対策

#デフォルト
# forwarded_for on
#カスタマイズ
#接続元のIPアドレスの情報をHTTPヘッダ上で隠す
forwarded_for off

⑩コアダンプ関連

#デフォルト
coredump_dir /var/spool/squid
#カスタマイズ
#コアダンプファイルの出力先
#変更なし
coredump_dir /var/spool/squid

⑪キャッシュの保存期間

#デフォルト
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320
#カスタマイズ
#キャッシュの保存期間
#基本はデフォルトのままにしておく、gopherはいらなそうなので削除した
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

⑫再起動

sudo systemctl restart squid

クライアント設定

・windows10のプロキシ設定
「プロキシの設定を変更する」→「プロキシサーバを使う」
アドレス:raspberry pi IPアドレスを記載
ポート:squid.confのhttp_portで指定したポート番号を記載
f:id:anpontan382:20200422000745j:plain

・InternetExplorerの設定
IE→設定→インターネットオプション→接続→「LANの設定」
→「LANにプロキシサーバを使用する」→上記と同様にアドレス・ポートを指定
f:id:anpontan382:20200422000856j:plain

確認

・この状態で普通にWEBサイトが見れるなら、とりあえず動いている。

・「/var/log/squid/access.log」を開いてみると、時間、アクセス先、ポート、メソッドがわかる。

1587304260.711   5780 192.168.100.XXX TCP_TUNNEL/200 15658 CONNECT anpontan382.hatenablog.com:443 - HIER_DIRECT/13.230.115.161

・キャッシュが取れているかを調べるには、squidclientというsquidの挙動を確認するソフトを使う。

sudo apt install squidclient
squidclient -h localhost -p 3129 mgr:client_list
squidclient -h localhost -p 3129 mgr:info

のコマンドにより、キャッシュの利用料、利用率等様々なステータスが確認できる。

・X-Forwarded-Forヘッダーの隠蔽ができているかは、以下にアクセスするとわかる。
tools.up2a.info
unknownが表示されている。
f:id:anpontan382:20200422000808j:plain



保育園が休園になった2歳の息子に買い与えたもの

 


f:id:anpontan382:20200418001956j:plain

緊急事態宣言後から文京区の保育園も臨時休園の措置が取られた。
2歳半になる息子も、新学期早々保育園に通えなくなり、4月10日から妻と交互に家で遊ぶ日々を過ごしている。
コロナウィルスに伴う休校措置では保育園に関わらず、全国の多くの学生が煮え切らない思いを抱いていると思うが、特に世の中の事情がよくわからない保育園・幼稚園世代は、かわいそうだなぁと感じる。最近なぜなぜ期に入りかけの僕の息子も臨時休園の始まった数日は「今日は保育園行くの?」とよく聞いてきた。僕らは、「保育園には最近'ゲホゲホくん'っていうお友達が来るようになっちゃって、その子に合うと、わっちゃんもゲホゲホくんになっちゃうんだよ。だからゲホゲホくんがいる間は保育園に行かずにお家で遊ぼうね」などと説明した。そうすると息子も「ゲホゲホくんがいるから保育園いかないんだよね」と息子なりに納得してくれているようであったが、家で手持ち無沙汰になると「ゲホゲホくんがいるから入らないけど、お散歩で保育園見に行こう!」などと息子なりに知恵を絞った提案をしてきたりして、やっぱり保育園に行けないことで、少なからず寂しい思いをしているのではないのかなぁと感じる。

そんな中、僕ら夫婦ができるのは、在宅勤務の立て付けの元、家で息子と色々な遊びをしてあげることである。
息子の遊び道具の予算は青天井で、散財によるストレス発散の効果もあり、思い立ったらamazonでポチるが加速している。
まぁ安倍総理が10万くれるしね。10万までなら先に使ってもOKですよ皆さん。在庫が無くなる前に、先に買っとこう。

そんなわけで、自宅待機後にamazonで買ったものを紹介します。

アンパンマン ぴょんぴょんジャンプ

やはり1日家で過ごすととにかく体力が有り余っているようで、ぐるぐる回転したり、できないのに逆立ちしようとしたりしていたため、体を動かせるものとしてトランポリンを購入。息子は、初めてにしては、上手に使いこなしており、思ってた以上のジャンプ力を披露してくれた。自分がジャンプするだけでなく、ぬいぐるみをジャンプさせてみたり、トランポリンから飛び出してクッションに着地してみたりと、以外と遊び方がたくさんあって、すぐに飽きず使ってくれている。
しっかりした作りで結構固めに張ってあるため、息子もジャンプのときにバランスを崩すことなく安定感がある。大人が乗っても大丈夫。

f:id:anpontan382:20200418010104j:plain

アンパンマン うちの子天才 カンタン折りたたみブランコパーク

これも室内の運動用。賃貸の狭い我が家に無理やり設置したため、滑り台を滑るとすぐ壁にぶつかるという環境である。だが息子は大喜びで、汗だくでハァハァ言いながら遊んでくれて、大変満足度が高い買い物だった。高いところに登って「トーチャンと同じ大きさになったよ!」と教えてくれたり、公園では危ないからやっちゃだめと言われている滑り台の逆走ができたりと、延々と遊んでいた。相当体力を使ったのか、その日は、ご飯を2倍位食べて大量のうんちをしていた。室内で運動するならジャングルジム最強である。

f:id:anpontan382:20200418010037j:plain



裁縫セット

時間ができた妻が急に裁縫を始め、フェルト生地を縫って綿を詰め息子のおもちゃを量産し始めた。
マジックテープでバナナ・みかん・を変更できるケーキや、真ん中に穴が空いていて、梅・高菜・からあげ・鮭の具材を変更できるおにぎりを作っている。
息子も食べ物とごっこ遊びが好きなので、遊んでくれていたが残念ながらすぐ飽きていた。写真の一式を妻は5時間位かけて作っていたので、コスパは最悪という結論に至る。

f:id:anpontan382:20200418010123j:plain

f:id:anpontan382:20200418005828j:plain

学習時計 生徒用

家での生活もある程度規則正しくなってきて、12時にお昼、13時にお昼寝・・・と決まった時間に行動をすることが多くなったため、時計のおもちゃを購入。
最近は数字をトーマスの番号で覚えつつあり、「短い針が、このジェームズのところまでいったらお風呂行こうね」などと説明している。ただ、時間の概念はまだわからないようだ。

子供向けパズル きかんしゃトーマス せんろをつなげて3

過剰に褒めてあげるとまんざらではないみたいで、完成させてはバラバラにするを何度も繰り返して遊んでいる。一人でも静かに遊んでくれるし、3つあるので家族3人で遊んだりもできるし、どっちにも対応している。ただ本人的には、組み立てる作業より、ひっくり返してバラバラにする作業のほうが好きなようで、完成させて終わりではなく、バラバラにして終わりのため、最後は散らかることになる。

(自分メモ用)ケア用品

あまり自宅待機とは関係ないが、普段利用しているケア用品をまとめて貼っておく。

 

 

 

 

新型コロナですることない人の為の家での過ごし方5選

休みの日の定番だった動物園が長期休園しており、週末のほとんどを家の中で過ごさざるを得なくなった。子供がいる家ではみんな家での過ごし方を持て余してるのではないかと思うので、我が家の家での過ごし方5選を公開します。

 

 

 

・工作する

おかげさまでamazon空き箱に関しては大量のストックがあるため、妻は相変わらずスロープを作っていた。 

あと、お弁当も本物は作りませんが、工作なら一からつくります。

f:id:anpontan382:20200216100817j:plain

 

・お風呂で遊ぶ

近所の100円ショップにお風呂で膨らむカプセルというのが売っていた。12種類の動物が入っているんだけど、それが水族館・動物園など5パターンくらいある。息子はお風呂に行くのはだいたい嫌がるんだけど、これを見せてから誘うと「ハイ分りました!」とめちゃめちゃ素直になる。

f:id:anpontan382:20200308225417j:plain

 

・スライム作り

いにしえより家で遊ぶときの定番。我が家では不気味な色味で作るのがルールです。

f:id:anpontan382:20200218080754j:plain

 

・子供の言い間違いを記録する。

家だとのんびり話をする。2歳半は色々おしゃべりするんだけど、間違って覚えてたり、言えてなかったして面白いので「本来の言葉→息子の言葉」をメモしている。後で見返すと思い出とセットで面白いんじゃないかと思う。

 

飛鳥山公園→あすぱらごれん
タツノオトシゴ→たつのおしごと
お箸→おかし
ただいま→おかえり
ワイルドボア(イノシシ)→わいるどぼーや
タクシー→ヘイタクシー
店員→いらっしゃいませ
客→ひと
しらないひと→だれだれまん
うんち→おしっこ
まよなか→まろやか
ライオン→がいおん
はだかんぼ→はらかんぼう
マヨネーズ→まのやーじ
マフラー→まくら
くろこだいる→くろこだよ
ブロッコリー→ブロッキー
フラット→ぐらっと
エイ→ドクロちゃん
レスキューセンタ→れくすーせんたー

 

・DVDを見せる

最後に頼れるのはDVD。親が一息つきたいときにも欠かせないアイテムです。最近ハマっているのは、NHKクインテットのDVD。30代前後の人はすごく懐かしい番組だと思うんですが、今見ても完成度がすごく高いし、2歳の子供もとても集中してくれるし、大変おすすめです。

f:id:anpontan382:20200308233901p:plain

僕が一番好きな曲は「ネンガラネンジュウ クインテット」に収録されている「なんでもアリものがたり」。神曲なんでみんな見よう!

【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

参考文献