gepuro.net
gepulog

データ分析エンジニアによる備忘録的ブログ

Japan.R 2015を開催しました

R advent Calendarの12月6日担当です。更新日が12月7日になってしまいました。(寝落ちしてた)

12月5日にJapan.R 2015を開催しました。ATNDでの登録数は197人と昨年同様の盛り上がりでした。 スタッフの皆さん、参加者のみなさん、ありがとうございます。

懇親会の参加者は約70人で、二次会の参加者は約40人でした。眠かったので帰りましたが、三次会もあったようです。

また、会場提供をして頂いた株式会社リクルートコミュニケーションズさん、ありがとうございます。

当日の様子はtogetterにまとめています。

http://www.ustream.tv/channel/kbWLTTuAtLhに当日の録画もあります。

また、僕自身もLT大会に参加しました!

gepuro task views from Atsushi Hayakawa

今年もR言語にお世話になりました。来年以降もR言語コミュニティに貢献していけたらと思います。来年もJapan.Rを開催しますので、よろしくお願いします。

Enjoy R!

ioslidesにおけるロゴのサイズを変える

スライドをRmdで書くgepuroです。

デフォルトのままでは、ロゴのサイズがピクセル単位で固定されているので、画像によっては歪んで表示されてしまう。 それでは困るので、 CSSを弄りました。

また、 タイトル以外のページに現れるロゴは邪魔なので、 background-size: 0px 0px;として、消しています。

slide.Rmd

title: "タイトル"
author: "@gepuro"
output_format:
  ioslides_presentation:
    css: logo.css
    logo: logo.png

mystyle.css

/* トップのロゴの大きさを変える */
aside.gdbar img {
width: 180px;
height: 47.2px;
position: absolute;
right: -5px;
top: 15px;
margin: 8px 15px;
}

/* 他のページのロゴの大きさを変える */
slides > slide:not(.nobackground):before {
font-size: 12pt;
content: "";
position: absolute;
bottom: 20px;
left: 60px;
background: url(logo.png) no-repeat 0 50%;
-webkit-background-size: 30px 30px;
-moz-background-size: 30px 30px;
-o-background-size: 30px 30px;
background-size: 0px 0px;
padding-left: 40px;
height: 30px;
line-height: 1.9;
}

Rmarkdownのioslidesで右下に画像を配置する方法

もう少し綺麗な方法があると思うけど、下で出来た。

<style>
.bottom_right img {
    position: relative;
    left: 500px;
    top: 180px;
}</style>
<div class="bottom_right" markdown="1">
<img src="logo.png", width="300px">
</div>

kazutanさんに教えてもらった方法

<aside class="gdbar right bottom"><img src="hoge.png"></aside>

ありがとうございます!

library("ranger")とlibrary("randomForest")の速度を比較する

Predicting Titanic deaths on Kaggle V: Rangerを読んでいたら、 「ranger早いぜ」というのを見つけたので試してみた。

library("ranger")
library("randomForest")
## randomForest 4.6-10
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## 
## The following object is masked from 'package:ranger':
## 
##     importance
data("iris")

# http://d.hatena.ne.jp/a_bicky/20101225/1293258748
test <- function(code, ic = 1000) {
    expr <- substitute(code)
    print(system.time(for (i in 1:ic) {
        eval(expr)
    }))   
}
test(
  ranger(Sepal.Length~., data=iris, mtry=2, num.trees = 500,
         write.forest=TRUE)
)
##    user  system elapsed 
##  71.426  26.430  53.740
test(
  randomForest(Sepal.Length~., data=iris, mtry=2, ntree = 500)
)
##    user  system elapsed 
## 136.479   0.000 140.745

確かに早いですね。

RでCSVファイルを一行ずつ読み込む

メモリを節約するんじゃ

学習データはサンプリングするからメモリに載せられるけど、 予測対象はメモリに乗らない時に一行ずつ読み込んで処理をさせたい。

f <- file("data.csv", "r")
while(1){
  line <- readLines(f, n=1)
  if(length(line) == 0){
    break
  }else{
    line.f <- textConnection(line)
    line.df <- read.csv(line.f, header = FALSE, sep=",")
  }
  write.table(line.df, stdout(), row.names=F, col.names=F, sep=",")
}

標準入力から受け取る時は、

file("data.csv", "r")

file("stdin")

にすれば良さそう

参考

追記

奥村先生版です。

追記2

hoxo_mさんバージョンです。 勝手に添削:RでCSVファイルを一行ずつ読み込む #rstatsj

「Japan.R開催のお知らせ 」と 「Rでワンライナー」というタイトルで第49回R勉強会@東京(#TokyoR)にて発表してきました

「Japan.R開催のお知らせ 」と 「Rでワンライナー」 from Atsushi Hayakawa

kmeansとkmedoidsを比較してみる

やったこと

kmeansとkmedoidsの比較をしてみました。 アルゴリズムの詳細は下の参考文献を見てください。

ざっくりとした説明をすると、 kmeansはクラスタの中心を重心として距離を2乗で評価するのに対して、 kmedoidsはクラスタの中心をデータ点として距離を1乗で評価します。

パッケージの読み込み

library("ggplot2")
library("cluster")

サンプルデータ作成、可視化用関数

makeSampleData <- function(sd){
  df1 <- data.frame(x = rnorm(20, mean=1, sd=sd),
                    y = rnorm(20, mean=1, sd=sd),
                    cluster = rep(1, 20))

  df2 <- data.frame(x = rnorm(20, mean=1, sd=sd),
                    y = rnorm(20, mean=3, sd=sd),
                    cluster = rep(2, 20))

  df3 <- data.frame(x = rnorm(20, mean=3, sd=sd),
                    y = rnorm(20, mean=1, sd=sd),
                    cluster = rep(3, 20))

  df4 <- data.frame(x = rnorm(20, mean=3, sd=sd),
                    y = rnorm(20, mean=3, sd=sd),
                    cluster = rep(4, 20))

  df5 <- data.frame(x = c(-2),
                    y = c(-2),
                    cluster = rep(1, 1))
  sample.df <- dplyr::bind_rows(df1, df2, df3, df4, df5)
  sample.df  
}

plot_clustering <- function(result){
  g <- ggplot2::ggplot(data = result,
                       ggplot2::aes(x = x,
                                    y = y,
                                    group = as.factor(cluster_forecast),
                                    col = as.factor(cluster_forecast))) +
    ggplot2::geom_point(
      ggplot2::aes(shape = factor(cluster))
    )
  print(g)
}

サンプルデータのプロット

sample.df <- makeSampleData(sd=0.3)

sample.df$cluster_forecast <- sample.df$cluster
plot_clustering(sample.df)

kmeansを何度か実行

for( i in 1:5){
  sample_kmeans <- kmeans(sample.df[,-c(3,4)], 4)
  sample_kmeans$centers
  sample.df$cluster_forecast <- sample_kmeans$cluster
  plot_clustering(sample.df)
}

たまに上手くクラスタリングしてくれない。

kmedoidsを何度か実行

for( i in 1:5){
  p2m <- pam(sample.df[,-c(3,4)], 4)
  p2m$medoids
  sample.df$cluster_forecast <- p2m$clustering
  plot_clustering(sample.df)
}