データ穴リストのブログ

文系へっぽこリサーチャーから穴リストへジョブチェンジ中。渋谷の片隅でニヤニヤしております。・・・動いたら、ね。

多重コレスポンデンス分析やってみた。

本日二投目。

※本記事は下記のサイトを参考に書いてみただけで、なんらオリジナルな話はありません。 まあそもそもオリジナルなものなんて書いてないか。

sugioka.wiki.fc2.com

別事業部からの依頼で普段はやらないジャンルのゲームについて、 「ユーザの分類をしてみたい」ってな依頼が来たので興味本位でやってみよう、 というのが動機でした。

素材はアンケートデータなんですが、
よくあるこのMCAとかこの辺の手法って、
何でもかんでも分析者のお気持ち次第っていうか、
それにしたってぶっこむ変数によって世界観が360°変わる厄介者な認識です(笑っていいんだよ?)。

で、MCAをするにはみんな大好きSPSSのオプションとかをご購入してもれなくIBMさんに重課金するのか、我らの心の友(勝手に認定)、HADでも可能ですね。

ただし、我らがHADをもってしても、一回一回まわしていくのは面倒。 ということで、そう、Rの出番ですね!

データを適当に区切っておく

上のサイトでもいくつか紹介されていましたが、 FactoMineRというのが手軽そう&便利そうなのでそちらでやってみました。

まずはどんな変数をぶっこむか、先にリストを作っときます。

install.packages("FactoMineR")
require(FactoMineR)

# data teaの読み込み
data(tea)

# これらの行を選び、newteaに代入

tea_list <- list(c("Tea", "How", "how", "sugar", "where", "always"),
                 c("Tea", "How", "how", "sugar", "where"),
                 c("Tea", "How", "where", "always"),
                 c("where", "always"))

コレポンをぐるぐる、可視化まで。

で、あとはこいつをコレポンしてggplotのグラフオブジェクトを量産すれば…!

って思ったら上手くいかなかったのでとりあえずそちらを↓

for(i in 1:length(tea_list)){
  #描画準備
  newtea <- tea[, tea_list[[i]]]
  cats <- apply(newtea, 2, function(x) nlevels(as.factor(x)))
  mca1 <- MCA(newtea, graph = FALSE)
  mca1_vars_df <- data.frame(mca1$var$coord, Variable = rep(names(cats), cats))
  mca1_obs_df <- data.frame(mca1$ind$coord)
  
  #plot
  assign(paste0("tea_gg", i), ggplot(data = mca1_obs_df, aes(x = Dim.1, y = Dim.2)) +
    geom_hline(yintercept = 0, colour = "gray70") +
    geom_vline(xintercept = 0, colour = "gray70") +
    geom_point(colour = "gray70", alpha = 0.7) +
    stat_density2d(colour = "gray80", aes(fill = ..level.., alpha = 0.5), geom = "polygon") +
    geom_text(data = mca1_vars_df, 
              aes(x = Dim.1, y = Dim.2, 
                  label = rownames(mca1_vars_df), colour = Variable))+
    scale_fill_gradient(low = "grey80", high = "darkblue"))
}

# 見てみると…
tea_gg1 #エラー: Aesthetics must be either length 1 or the same as the data (17): x, y, label, colour
tea_gg2 #エラー: Aesthetics must be either length 1 or the same as the data (15): x, y, label, colour
tea_gg3 #エラー: Aesthetics must be either length 1 or the same as the data (12): x, y, label, colour
tea_gg4 #最後だけ正常出力

で、悩んで悩んでr-wakalangで聞いてみたところ、 教えていただいた解決策がコチラ↓

do_plot <- function(i) {
  #描画準備
  newtea <- tea[, tea_list[[i]]]
  cats <- apply(newtea, 2, function(x) nlevels(as.factor(x)))
  mca1 <- MCA(newtea, graph = FALSE)
  mca1_vars_df <- data.frame(mca1$var$coord, Variable = rep(names(cats), cats))
  mca1_obs_df <- data.frame(mca1$ind$coord)
  
  #plot
  ggplot(data = mca1_obs_df, aes(x = Dim.1, y = Dim.2)) +
    geom_hline(yintercept = 0, colour = "gray70") +
    geom_vline(xintercept = 0, colour = "gray70") +
    geom_point(colour = "gray70", alpha = 0.7) +
    stat_density2d(colour = "gray80", aes(fill = ..level.., alpha = 0.5), geom = "polygon") +
    geom_text(data = mca1_vars_df, 
              aes(x = Dim.1, y = Dim.2, 
                  label = rownames(mca1_vars_df), colour = Variable))+
    scale_fill_gradient(low = "grey80", high = "darkblue")
}

idx <- seq_along(tea_list)
names(idx) <- paste0("tea_gg", idx)

l <- purrr::map(idx, do_plot)
l$tea_gg1 #できたー!

f:id:cun-wang:20180715131647p:plain

どうやらグローバル環境とかそのあたりのお話なようで、 教えていただいた解決策は「処理を関数化する」ということでした。

それにしてもリスト処理、こんなん出来るんだなーと目からウロコでした。。。

ってことに触発された記事を書こうとしたんだけどさっきいったん断念。

ちなみに

どんなジャンルのゲームかっていうと、こういうのです↓

socialappsupport.com

え…アメリカで…?そうなの?ってかヘーシャ入ってn…

そろそろリストに手を出したい(たぶん2年くらい言ってる)

どうも、おじさん@低浮上です。

最近はRばかり触っていられる状況でもなくなってきて、 ちゃんと政治せえや、という政治力により慣れない政治を意識高めワードを用いながらごまかそうと画策中です。

さて、そんななか、ますますRでの分析ライフをサクサクしていきたいわけで、 今までなかなか手が出てなかったリスト型についても勉強していきたい所存です(しているとは言ってない)。

というのも、相変わらずslackでは教えて厨上級者として時たま聖人たちに質問を投げかけているのですが、 僕の好きなggplotオブジェクトを量産する際に華麗にpurrrを使われた式を拝見して、 こんなawesomeを少しでも書ければ…僕の仕事も捗るはず…!

ということで、以下を見ながらいろいろやってみようと思った次第です。

speakerdeck.com

…で、これをもとに考えてわからんなぁと思ったコードを以下に載せようと思ってたんだけど、 読んでみたらこれはdplyrの操作についてじゃね?

書いてみて「あーこれ記事ネタにしよー」と思ったのが数週間前だったんだけど、 そのころの僕はいったい何を考えていたのか全く分からない。 ちょっともうわかんないからそのまま載せよう(こんなのばっかり)

# テストデータ
a1 <- c("A","B","C")
a2 <- c("りんご","みかん","いちご", NA)
a3 <- c(0,1,10,100)
a4_1 <- c("好き", NA)
a4_2 <- c("食べたことがある", NA)
a4_3 <- c("買ったことがある", NA)

test_dat <- data.frame(a1 = sample(a1, 10, replace = TRUE),
                       a2 = sample(a2, 10, replace = TRUE),
                       a3 = sample(a3, 10, replace = TRUE),
                       a4_1 = sample(a4_1, 10, replace = TRUE),
                       a4_2 = sample(a4_2, 10, replace = TRUE),
                       a4_3 = sample(a4_3, 10, replace = TRUE)
                       )

# ↓これダメだった

# a4_1~3のテキストのある部分を1にしたい。ついでにNAを0にしたい(けど他のa1・a2は変換したくない)
# out <- test_dat %>% mutate_if(is.factor, as.numeric) %>% mutate_if(is.na, 0)


# 素直にatを使うべき…?
require(tidyverse)
out <- test_dat %>% mutate_at(4:6, as.numeric)

colnames(out)[4:6] <- as.character(map(test_dat[4:6], levels))

out[is.na(out) & is.numeric(out)]<-0

とりあえず次の記事で教えていただいたシャキッとした書き方は載せるとして、 ここで何がしたかったかってえとたぶんアンケートデータをMCAするときの前処理みたいなことをしたかったはず。

まぁ、とりあえずいいか。*1

*1:そんなんだから前回のflexdashboardもRPubsまで持ってったけどちゃんと表示されてないってのに。。。

flexdashboardで出来ることを試してみる

どうも、なかなかブログ投稿しないでツイッターでどうでもいいことばっかり呟いてるマンです。

あんまり時間経ち過ぎてはてなのアカウントもパスもハテナ っていう。*1

思えば学部生時代、院生時代も書いてたシャカイガクお勉強ブログをテキトーに更新して放置して……ってことを繰り返してた。 彼らは今もまだネットの海を彷徨ってる。。。*2

続けるって大事。

今回はflexdashboardおさらい

だらだら書く癖はどうにかしないとなので、 さっぱりいきます。

今回は、flexdashboardです。

これまでもとりあえずテキトーに使えるトコだけ使っとけーとやってきたんですが、 まぁなんというか、コンテンツが貧弱なのでここらで今一度整理しておこう、 という腹づもりで調べてたので、折角なのでこんなゴミブログにすらすがらないといけないような人が僕以外にいるのかよく分かりませんが、 そんな人のために残しておく。です。

とはいえ大体のことはもう余所に書いてあります

とりあえず公式は充実してます。 説明ないトコもあるにはあるけど。 他にもこれは出来る/出来ないみたいなことは大体ニッポンのRおじさんも色々紹介してくださっていて、 中でもやはりぞうさんことkazutan先生の資料には本当にいつもお世話になっております。

じゃぁ何をするのか

もちろん自分の手習いを記載するのがこのブログの第一目的ですが、 それだけじゃぁブログにする意味もない。

ブログにするからには、どなたか読者を想定するのが筋。

で、元から劣化版なんだからRおじさんたちの素晴らしい記事を劣化コピーすることはない。 ポジショニングとしちゃニッチを攻めるってのが後発フォロワーの定石ってことで、その辺を進めます。

そう、ほかの人が敢えて書かないくらいの基礎中の基礎。それを敢えて書く、ということをやります。

やってみた

んー、はてなMarkdown記法で書いてたら、Rmdファイルのchunkがシンタックスハイライトとかぶって残念な感じになってしまった。。 ホントはちゃんとgitなりRPubsなりで現物見本示せよって話なんですけど、とりあえずまぁRmdファイルのリンク貼っときます。

storyboadtest.Rmd - Google ドライブ

…本編で一気にダレるorz

まぁその、チラシの裏的にいろいろ試してみたからとりあえずknitしてみるとあーこんな感じかってのがわかるかと思います。

おわり。

追記:RPubsあげてみた。けどあがんない。

あげてみたよ!でもちゃんと表示できないんだ。。。

RPubs - flexdashboardのテスト

ローカルでやってるのはできるのに、なぜだろう。。。 まだまだわかんないよとーさん。。。

*1:ログインできなくて何度も失敗して一時垢凍結を喰らうほどに…

*2:微かな記憶を頼りにググってみたら案の定あったのでそっ閉じ。。。ログイン情報なんて覚えてないし。

cronRで自動化にちゃれんじ

アイがなくてもエーねん*1

そもそも僕がRをちゃんと頑張ろうと決心したのは、世の中のエンジニア氏たちはみんな、 ぱそこん君と対話的だけでなく、パシリのようにこき使えていいな、という思いから始まりました。

やりたいこと、やらないといけないことはいっぱいあるのに、 - そろそろ月末だからアレださなきゃ! - …またこの季節か。。またあの人に頭下げて作業お願いしなきゃ。。 - 前回と同じでいいから、あのファイルはコピーぺして使おう

…とか、そういうの、ストレスでした。 考える時間が欲しい。 考えなくてよい手作業は極力やりたくない。 人に作業振ってもやれ今は他の仕事がだの、やれメンドくさいだの、そういう心のケアばかりにはいい加減付き合ってられない!

ということで、タスクスケジューラを使いたかったのです。

  • cronとは 世のエンジニア氏たちには今更ですね。 非エンジニアの僕と同じような皆さんにはコチラが分かったような分からないような気になってちょうどよろしいかと思います。

Error 403 (Forbidden)|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

で、crontabがどうとかbin/crontabとかetc/crontabとか色々書いてあるけど結局我々はどこに、どう書いたらパシられてくれるのか、それが知りたいのだよ。

そゆこと、前提のないヒト向けの資料はなかなかないですね。

書き方とかは書いてあるんだけどね。

  • cronRとは

そんな痒いところにもうちょっと届きそうで届かない、けどちょっと届くネット社会ですが、 cronRはじゃあなんなのかというと、

これらの2つのパッケージを使用すると、RプロセスをRから直接スケジュールすることができます。これは、基本的なLinux / Unixジョブスケジューリングユーティリティであるcronに直接コマンドを渡すか、Windowsのタスクスケジューラを使用して行います。パッケージはRのスクリプトは、非対話的に実行することができ、できることその事実を知らないRのユーザー始まるために開発された自動化を。

Scheduling R scripts and processes on Windows and Unix/LinuxChromeさんの翻訳のまま引用

相変わらずちょっとカタコトだけどそこは愛嬌ということで。 ちなみに「2つの」といってるのはまぁ書いてありますがWindowsの場合は別なタスクスケジューラというのがあるのでパッケージは別だよ、というだけですね。 今回はそっちはムシです。 もうWindowsでRstudioほとんどいじってないんだもの。

cronの設定、しなきゃしなきゃ…とは思ってたんだけど、腰が重くてなかなかたどり着かず状態だったので、Rstudio内でこの操作を完結できるのはとてつもなくありがたかったですね。 無論、ちゃんとしたLinuxユーザにはどうでもいいパッケージだというのはよく分かるけど。

あと、このパッケージはRstudioAddinもあって、今回初めてRstudioAddinを使ってみました。

  • 導入

スクショとか入れると親切でしょうけど面倒なのでいれません。

  • RstudioのAddinボタンをポチるのもいいけど、install.package("Addinslist")がステキ
  • Addinlistでアドイン一覧を眺める。
  • cronRをインストール

ちなみにAddinslistの紹介はこちら www.karada-good.net

…さあ!これで使えるのかな?と思ったら「ShinyFilesがないよ」とエラーが出る。 パッケージを入れようにもできない。

なんだこりゃ?と思っていたら、先の開発者さんのgithubを見たら、 どうやらアドインを使うには更に別のパッケージも必要だとか。 ということで下記を実行

install.packages('miniUI')
install.packages('shiny')
install.packages('shinyFiles')

これで準備が出来ました。

結論からいうと、Rスクリプトファイルが消えました。

  • 自動実行するスクリプトを選択して、
  • ジョブの名前を書いて、
  • ジョブのタイミングを設定して、
  • リポジトリだかってとこのパスを指定して

ポチッ!

としたら、同名の空のファイルの出来上がり。

ふぁ!?!?!?!?!?!?!?!?!?!?!?

どうしようどうしよう…

そういえばバックアップとか全然とってない…

git管理もしようと思ってたけど全然理解してない…

指定したスクリプトはかなり前に作って定期的にポチポチ実行していた 自分の中では割と重宝しているものだったので、頭真っ白。

ああ、イチからコード書き直さなきゃなのか…金曜の夜に…もうムリ… と思ったら、Dropboxさんが復元してくれた。…ギリギリセーフ。。。

なにがいけなかったって、 リポジトリのパスを設定する際に、元ファイルと同じ場所に指定なんかしたもんだから*2、 まっさらなファイルを上書き保存してくれたってだけだった。。。

というわけで、今一度上記の引用先*3の動画を見て、 リポジトリ用のディレクトリを作って、ようやく自動化できた。

あの時の衝撃をぼくはわすれない。

バックアップもそうだけど、まずテストスクリプトで試せよってね。

とにもかくにも、これでパソコン君をパシらせることが出来るようになりました。

さぁどんどんパシらせよう。

*1:AI、つまりインテリジェンスがなくたってA、AIだと人工的ってなるけどここではAutomationだったらいいんだよ、というユーモアです。それを説明するというね。

*2:結果のlogファイルが出来る場所くらいに思ってたので…

*3:http://www.bnosac.be/index.php/blog/64-scheduling-r-scripts-and-processes-on-windows-and-unix-linux

cut関数にキャッとしてカッとなって書いた

どうも。

ようやくモバイルPCを買いました。 なのに、まだこのPCで分析環境を整えておらず、現状はただのネットブック

さて、久々の更新ですが、今日は今更な気づきをポエみます。

続きを読む

書きたいことリストだけ書く

仕事と家庭が忙しくって、勉強会にも行けないし全然書けてません。

書けてないのは自由に使えるモバイルPCがないからだ(持ってるのは古いディスプレイ一体型と初代surfacepro…とてもあの重たくて安定しないヤツでコード書きたくない…)。

というのを言い訳に、モバイルPCゲットのために日夜仕事に家庭に励んでおりますが、まだまだ道は長そうです。

なのにもかかわらず、なぜか、この更新されていないブログへのアクセスをそれなりにいただいているようでなんだか本当にごめんなさい。

ググったら出て来ちゃったんですよね。
そうです、このサイトはハズレです。
すみません。

……という気持ちなのでとっとと書きたいのですが、書けません。
iPhoneでコードが書けるとも思えません(今はiPhoneで書いてますが)

なのでなので、とりあえず、「今後書いていきたいこと」をメモします。

だからなんだと言われると、ただの、自分用の備忘録です。

  • 集計にまつわる利用側と提供側のあれこれ&dplyr
  • leafletで遊びたい
  • 時系列解析を初歩の初歩の初歩の入門からやってみる
  • はやくベイジアンになりたい
  • 自分の受信メールから特徴を割り出す
  • 複数ダッシュボードを一気にknitしたい
  • クロスバリデーションについてのギモン
  • list型を使いこなしたい
  • 結果をいかにして伝えるか
  • ぼくのかんがえたさいきょうのR布教法
  • Reproducible Research と使い(使われ)勝手の間
  • EXCELあるいはEXCEList、もしくはエンジニアとの分析コミュニケーション一考察
  • 分析の生産性をあげるためにできること
  • visualstudioでR、powerBIでR
  • 自由に使えるデータ収集
  • 一気に報告書までknitしたい。ホントそうしたい


とりあえずこんなものだろうか。
もう最寄駅に着く。。

とにかく、がんばって書く。
書くために、PC購入の決裁申請をしなきゃ。。。
ウチの大蔵大臣に。


以上

データサイエンティストでもなんでも良いんだけど


下書き書いてるネタは3つほどあるのだが、なかなか更新がままならないので、もういっそ与太話でも書く。
…今まで通りだけど。

ということで、データ分析関係のスキルマップ的なものの概念をイイカンジにしたい。

とりあえず狭い僕の知識から無理やりひねり出してみる。
基本的には妄想です。
適切でなかったら切り捨てるがいいよ。
どうせ根拠は脳内なんで。

一般職種

  • データサマナー(召喚士)

データを精神世界から呼び出す。生み出す。
詠唱を間違えると害なす魔物が出来る。
マーケティングリサーチャーはこの辺の一部。
COMPを使って呼び出したり合体させたり出来る人とはコンゴトモヨロシク。

  • データ戦士

データと格闘する。叩き上げる。
ログを解析したりDBに突っ込んだりする処理をゴリゴリ書くエンジニアなイメージ。

  • データ僧侶

傷ついたデータと人々を癒す。
データクレンジングとリファクタリング
マエショリスト。

  • データハンター

データの鍵を開け(統計解析)、お宝(情報)を獲る。
マイニング屋さん。
盗賊だとよそから奪うイメージなので。。。

  • データマジシャン

データに魔法をかけて不思議なチカラを生み出す。
ビジュアライズ領域。
悪い魔法使いはグラフマジック(禁呪)で世の中を恐怖に染める。

  • データ遊び人

みんなのチカラを借りてばかりだが、ムードメーカーとして機能。
関連部署との連携構築を進める。
実は賢者への近道。

上位職種

データによってカネを生み出す。
もしくはデータ分析環境整備のためにカネを引っ張る。
勘のいいガキは嫌い。

戦士と僧侶の両要素を併せ持つ。
理想的なマエショリストですね。

  • データ賢者

僧侶、ハンター、マジシャンを兼ねそなえる。
正しさと見目麗しさのバランス感覚を持ち、更にそれを凌駕する強い情報を生み出す。
ある意味データサイエンティストとして思いえがかれる理想像。

  • データ勇者

能力全てが中途半端。
だが逆になんでもそこそこ理解があり、
かつそれをもってパーティを引っ張ることができる。
「デイン」系呪文が使える。
あるいは自在にペルソナチェンジが出来る。

ダークサイド

  • データ暗黒騎士

自らの命を削って(長時間労働で)ゴリゴリする戦士。
人のHPを吸い取る吸血系も。

  • データネクロマンサー

死んだデータを未だに生かそうとする。
過去の知見を学ばない。
たまにホントに転生させる。

  • データ吟遊詩人

謳う。
それだけの人。


とりあえずこんなところだろうか。
根拠は何もないが、ビジネス的には割とそれっぽい気もしなくもない。

酔った勢いで一気に書いたけど、炎上すれば幸い。