jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

標準偏差と平均偏差の使い分け

本日は、割と当たり前に使っていた統計の知識でも、「なぜ」そうするのかを知らなかったという話です。統計学は、実学としての側面を持っているので、こんなことが起きるんですよね。

標準偏差と平均偏差

標準偏差と平均偏差はどちらもデータのばらつきの指標です。下の定義式を見てもらえば分かりやすいと思います。
標準偏差は、代表値からのズレを2乗したものを足し合わせて、データの個数(またはデータの個数−1)で割ったものの平方根です。

 {SD_x = \sqrt{\frac{\sum_{i = 1}^n {(x_i - \overline{x})^2}}{n}}}

一方、平均偏差は代表値からのズレの絶対値を求めて、すべてのデータの個数(またはデータの個数−1
)で割ったものです。
 {AD_x = \frac{\sum_{i=0}^n {|x_i - \overline{x}|}}{n}}

平均偏差を使わないのはなぜ?

一般的にばらつきの指標は標準偏差が利用されます。平均偏差は使われるのを見たことがありません。検索サイトなどで調べると計算の便利さをとって標準偏差が用いられるとあります。確かに、絶対値は場合分けが実際の計算で場合分けが必要になるので、自乗した和の平方根を取る手続きの方が簡単です。

しかし、よく調べてみるとそれだけではないことがわかりました。以下のサイトでは、各データ要素について代表値からのずれを評価する方法として損失関数というアイデアを挙げています。実証的なデータに統計学を利用する場合、データサンプルもしくは母集団の代表値として最も妥当な値を1つ選びます。その妥当性を評価する上で、損失関数を設定する分けです。

tsujimotter.hatenablog.com


詳しくは、ぜひリンク先を見て欲しいのですが、ここで損失関数として標準偏差のようにずれの自乗を計算するか、平均偏差のようにずれの絶対値をとるかで代表値の推定が異なることが指摘されています。ずれの自乗を計算する場合は、いわゆる最小二乗法なので、平均値が代表値となります。一方、ずれの絶対値を計算すると、最も損が少ない値はデータの中央値になるということです。

シミュレーションで確認してみる

では、簡単な数値シミュレーションをして、標準偏差と平均偏差が最も小さくなるときの代表値がそれぞれ平均値と中央値になることを確かめましょう。
検証にはR言語を使います。今回の検証では、確率分布からデータをランダムに発生させます。ここで正規分布を採用すると、平均値と中央値のずれがほとんどないと予想できるので、あえて違う確率分布(対数正規分布)を用います。

# データの生成
simData <- rlnorm(1000)

シミュレーションでは、生成したデータの最低値と最高値を計算します。最初に最低値を分布の代表値と仮定し、標準偏差と平均偏差をそれぞれ求めます。次に、最低値よりも少しだけ大きな値を代表値にします。そして、データの最大値を代表値とする場合まで、次々に繰り返します。
最後に、すべての計算結果からいつ標準偏差と平均偏差が最小になるかを調べてみましょう。

#最小値と最大値の取得
minData <- min(simData)
maxData <- max(simData)

#繰り返しの回数を求める
numIteration<- round((maxData - minData)/0.0001)

#計算結果の保存用配列を作成
## 標準偏差用
arrSD <- NULL
## 平均偏差用
arrAD <- NULL

for (i in 1:numIteration){
  
  repData <- minData + 0.0001 * i

  resSD <- sqrt(sum((simData - repData)^2)/length(simData))
  resAD <- sum(abs(simData - repData))/length(simData)

  arrSD <- c(arrSD, resSD)
  arrAD <- c(arrAD, resAD)
}

一度手元のPCで計算してみたところ*1、minDataは0.04240865、maxDataは65.70159、numIterationは656592となりました。
標準偏差と平均偏差を保存したデータの中かからいつ値が最小になったのかを求めます。

# SDが最小となるような代表値
minData + 0.0001 * which.min(arrSD)
# ADが最小となるような代表値
minData + 0.0001 * which.min(arrAD)

計算の結果、SDが最小となるような代表値は1.708909、ADが最小となるような代表値は0.9827087でした。
では、最後にこのデータの平均と中央値を計算してみます。

mean(simData)
median(simData)

計算結果は、平均値が1.708862、中央値が0.9834444でした。正確な一致ではありませんが、おおよそ標準偏差が最小となるような代表値は、データの平均値であり、平均偏差が最小となるような代表値はデータの中央値であることがわかります。

*1:乱数の生成がコードに含まれています。よって計算結果は毎回異なります。

R言語で区切り文字による文字列の分割

今回は、区切り文字を指定して、文字列を分割してリスト化する方法を紹介します。

strsplit関数

strsplit関数を使うと任意の文字を区切り文字として、文字列を分割できます。例えば以下のように使います。

input <- "abc def ghi"
res <- strsplit(input, " ")

区切り文字は正規表現

区切り文字はスペースやタブ(\t)などを指定しますが、実は、正規表現の扱いになっています。なので、+(1文字以上の繰り返し)のような表現を加えると、スペースやタブスペースが連続して入っている箇所を1回の区切りとして扱えます。

#abcの後にはスペースが一つ、defの後にはスペースが2つ入っています。
input2 <- "abc def  ghi"

res2 <- strsplit(input2, " ")
#これだとabc, def,その後に空要素、そしてhgiが続きます。

res3 <- strsplit(input2, " +")
#これだとabc, def, hgiだけになります。スペース2文字を区切り文字扱いするので、空要素ができません。

unlist関数でリスト内容にアクセス

strsplit関数の出力結果は、リストオブジェクトです。このオブジェクトだと、要素数が1で、分割した文字列にアクセスできません。そこでunlist関数を利用して、出力結果を配列にします。

input <- "abc def ghi"
res <- strsplit(input, " ")
length(res)#1がかえります
res2 <- unlist(res)
length(res2)#3がかえります。インデックスで[1]から[3]を指定すると各要素にアクセスできます。

研究者とは何をする人か?それに必要な資質は?

今回は、「研究者って何か?」を考えます。一応研究者であるので、職業としての研究者や自分の経歴を紹介する機会があります。しかし、先日のそのような機会では、そもそも研究者が何かをうまく語れなかったんです。なので、反省文も兼ねて、研究者やその資質について思うことをまとめておきます。

研究って何?

あらためて「研究とは?」と考えてみると、意外に定義が難しいのですが、なるべく短い言葉で言うなら「新たな知の創造」だと思います。今まで誰も知らなかった問題の答えを見つける。または、ある現象を今まで誰も考えなかった方法で説明するといった感じです。言葉としては短いですが、これを成し遂げるのはなかなか大変です。なぜなら、それが信頼できる知識であることを周りに認めてもらわなければならないからです。例えば、新しい知識を裏付けるきちんとした証拠が必要です。それが、実験や調査によって得られるものであれば、誰がやっても結果を再現できるだけの必要十分な手続きの記述がいります。また、結果の解析方法やその解釈に論理の飛躍があってはなりません。そういった一連の作業をまとめ上げたものが論文となります。

次に、知の創造をもう細かく考えると2種類別れると思います。1つは「新しい価値の創造」で、新たな知見が世の役に立つような場合です。もう一つは「新たな知識の創造」で、役に立つかどうかはおいておいて、今までわかっていなかったことを知識として定着させるような場合です。ただし、この2つは排他的なものではなく、両者を兼ね備えることも可能だと思っています。これについては、「パスツールの象限」という記事を以前に書きました。

webbeginner.hatenablog.com


また、「新たな」知の創造となるためには、「今までに何がわかっているか」をきちんと把握することも重要です。よく言われる「巨人の肩に乗る」という言葉が表しているように、歴史を作ってきた大研究者やその人たちが作ってきた知識体系に敬意を払い、さらに自分で新しい何かをそこに加えていくのが研究者なのかなと思います*1

研究者ってどうやってなるもの?

研究さえしていれば、研究者なので、どうやってという問いは本来成り立たないかもしれないですね。しかし、職業としての研究者を目指すのであれば、基本的には大学学部の卒業に加えて、修士または博士課程の大学院を修了する必要があるでしょう。特に、大学でのポストを望むのであれば、最近は博士号取得がほぼ必須になっています。ただし分野によっては、一度専門職として社会に出てから、研究者として大学・研究所に入るようなキャリアパスも考えられます。

研究者として重要な資質は何?

世の研究者のイメージとしては「勉強が得意・大好きな人」なのかなと思います。確かにそういう人が多いです。でも、勉強が得意・好きなだけでは、「研究者」としてやっていけるかどうかはわからないと思います。私が、研究者になくてはならない資質の一つとして考えるのは、「批判的精神をもっていること」です。ここでいう批判とは、理屈もなく他を否定することでもないですし、揚げ足取りをすることでもないです。上記のような、新たな知となる可能性があるものを「本当にその説明でいいのか」疑ってかかる精神のことを指しています。これは、他に向かうばかりでなく、ときには自分の考え、データ、解析方法も批判的に見る必要があります。例えば、どんなに業績のある人が言ったことでも、教科書に載っていることでも「本当にそれでいいか」自分の頭で一度考えてみるのが、批判的精神です。常に疑ってかかるという意味では、かなり面倒臭い人です。でも、それがあることで、真摯な研究が成り立ちます。

ただ、誤解して欲しくないのは、批判的な精神は、もとからある性格のようなものではなく、トレーニングによって習得するものだと思います。なので、これから研究者を目指すあなたが現時点で批判的精神を持ち合わせていなくても大丈夫。徐々に的確な批判ができるように訓練していきましょう。

*1:google scholar という学術文献検索のサービスのページに「巨人の肩に乗る」という言葉があるのはこの意味でしょう

Dockerを利用してRStudioのRマークダウンファイルを使う

今回は、かなり技術的な内容です。Dockerを利用しながら、RStudioのRマークダウンファイルによる解析環境を構築します。ポイントは、日本語フォントが入っていてもきちんとPDF出力がなされるところです。

Dockerって?

Docker社が提供しているサービスです。 PC内に仮想のコンテナをつくって、コンテナ内でいろいろな情報処理を行います。いわゆる仮想PCと違うのは、必要なサービスだけを高速かつ少ない容量で仮想化しているところです。Docker自体の説明は、詳しいページがいくらでも検索できるのでそちらをごらんください。

bufferings.hatenablog.com

使用環境

今回はMac OSXに Docker Toolboxをインストールした環境で実施しています。 Docker Toolboxは更新が頻繁にあるようで、しかも更新によって動かなかった機能が動くようになっているので、できるだけ最新を使ったほうが良さそうです。

  • Mac OSX 10.10.5(Yosemite)
  • Docker Toolbox 1.10.1a

Dockerfileで環境構築

Dockerfileやベースとなるイメージもすでにきちんと動いているものを利用します。この点もDockerのメリットの1つですね。
RStudioが動くイメージの一つにrocker/rstudioがあります。このイメージでは、ベースのRとRstudioがdebianというLinux OSの中で動きます。

https://hub.docker.com/r/rocker/rstudio/

さらにrocker/rstudioから派生したrocker/hadleyverseというイメージファイルがあります。このイメージのDockerfileを今回利用します。

github.com


このDockerfileをdocker-machineの中でビルドすれば、当然ちゃんと動きます。しかし、実際にやってみたところ、日本語フォントがうまく読めないようです。そこでDockerfileを修正しながら、日本語フォントでもきちんと動作することを目指します。

Hadleyverseというイメージとの差分

  • manというパッケージのインストールを省略(エラーがでたため)
  • texlive-xetex, texlive-luatexをインストール(後でRマークダウンファイルをPDFに変換するのに使います)
  • texlive-font-extraをインストール(rocker/hadleyverseの作成者はファイルが思いので嫌がっていますが、日本語フォントの表示には必要そうです)
  • multcompというRのパッケージのインスールを省略(エラーがでたため)
  • IPAフォントのインストール(Debianの中で使用可能な日本語フォントが不明だったので、ダウンロードして使います)
  • 言語環境を英語から日本語に変更

出来上がったDockerfile

Dockerfileは"Dockerfile"という名前で保存する必要がありそうです。

FROM rocker/rstudio

MAINTAINER "jnobuyuki" 


RUN apt-get update 
RUN apt-get install -y --no-install-recommends \
    ibus-mozc \
    manpages-ja 

RUN apt-get install -y --no-install-recommends imagemagick \
	lmodern \
	texlive \
	texlive-lang-cjk \
    texlive-luatex \
    texlive-xetex \
	xdvik-ja \
	dvipsk-ja \
	gv \
	texlive-fonts-recommended \
	texlive-fonts-extra \
	&& apt-get clean \
	&& cd /usr/share/texlive/texmf-dist \
	&& wget http://download.forest.impress.co.jp/pub/library/i/ipafont/10483/IPAfont00303.zip \
	&& unzip IPAfont00303.zip \
	&& echo "Map zi4.map" >> /usr/share/texlive/texmf-dist/web2c/updmap.cfg \
  	&& mktexlsr \
  	&& updmap-sys




## Install some external dependencies. 
RUN apt-get update \
  && apt-get install -y --no-install-recommends -t unstable \
    default-jdk \
    default-jre \
    gdal-bin \
    icedtea-netx \
    libatlas-base-dev \
    libcairo2-dev \
    libgsl0-dev \
    libgdal-dev \
    libgeos-dev \
    libgeos-c1v5 \
    librdf0-dev \
    libssl-dev \
    libmysqlclient-dev \
    libpq-dev \
    libsqlite3-dev \
    libv8-dev \
    libxcb1-dev \
    libxdmcp-dev \
    libxml2-dev \
    libxslt1-dev \
    libxt-dev \
    netcdf-bin \
    qpdf \
    r-cran-rgl \
    ssh \
  && R CMD javareconf \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/ \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

## Install the Hadleyverse packages (and some close friends). 
RUN install2.r --error \
    broom \
    DiagrammeR \
    devtools \
    dplyr \
    ggplot2 \
    ggthemes \
    haven \
    httr \
    knitr \
    lubridate \
    packrat \
    pryr \
    purrr \
    reshape2 \
    rmarkdown \
    rmdformats \
    rticles \
    rvest \
    readr \
    readxl \
    testthat \
    tibble \
    tidyr \
    tufte \
    shiny \
    stringr \
    xml2 

## Manually install (useful packages from) the SUGGESTS list of the above packages.
## (because --deps TRUE can fail when packages are added/removed from CRAN)
RUN install2.r --error \
    -r "https://cran.rstudio.com" \
    -r "http://www.bioconductor.org/packages/release/bioc" \
    base64enc \
    BiocInstaller \
    codetools \
    covr \
    data.table \
    downloader \
    gridExtra \
    gtable \
    hexbin \
    Hmisc \
    htmlwidgets \
    jpeg \
    Lahman \
    lattice \
    lintr \
    MASS \
    PKI \
    png \
    microbenchmark \
    mgcv \
    mapproj \
    maps \
    maptools \
    mgcv \
    nlme \
    nycflights13 \
    quantreg \
    Rcpp \
    rJava \
    roxygen2 \
    RMySQL \
    RPostgreSQL \
    RSQLite \
    testit \
    V8 \
    XML \
  && r -e 'source("https://raw.githubusercontent.com/MangoTheCat/remotes/master/install-github.R")$value("mangothecat/remotes")' \
  && r -e 'remotes::install_github("wesm/feather/R")' \
  && rm -rf /tmp/downloaded_packages/ /tmp/*.rds

RUN echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

Dockerでの手順

1. Docker-machineを起動する
2. cd で Dockerfileがあるディレクトリに移動する
3. 以下のようにDockerfileからイメージをビルドする

docker build -t <レポジトリ名/イメージ名> .

4. 以下のようにイメージを起動する。-p オプションはホスト側とコンテナ側のポート番号のマッピングです。両方8787でオッケーです。

docker run -d -p 8787:8787 <レポジトリ名/イメージ名>

5. webブラウザを起動し、Docker-machineのIP:8787 でRstudioのログインが出てきます。デフォルトはID,PASSともにrstudioです。

以上でRSutdioが起動すると思います。

RStudioでの手順

1. New FileでRmarkdown形式のファイルを作る
2. Global optionのSweave項目でviewerをデフォルトのRstudio viewerからSystem Viewerに変更する *1
3. preamble(ヘッダのような部分)を以下のようにします。タブスペースの個数がポイントです。

---
title: "Document Title"
author: "autho"
date: "****/**/**"
output:
  pdf_document:
    latex_engine: xelatex
monofont: IPAPGothic
mainfont: IPAPGothic
---

このDockerイメージはIPAフォントをダウンロード・インストールしているので、これを使います。latex_engineはlualatexかxelatexが使えます。
5. knit PDFのボタンを押すか、ショートカット(Command + Shit + k)を実行します。

考察:Dockerを使うメリットとデメリット

手順は以上ですが、 Dockerを利用して解析することのメリットとデメリットを考えておきましょう。

メリット
  • 突然母艦 PCが亡くなっても、1時間あれば解析環境が完全復活する。
  • 共同研究者に同一解析環境を丸ごと渡せる。
  • 授業で学生に開発環境をデータ込みで配布できる。
  • 古いバージョンのアプリケーションによる解析環境を安全に保存できる。
デメリット
  • 別に仮想環境がなくてもmacで十分動くものについてわざわざコンテナを組むのは多少面倒
  • 共同研究者にDockerのメリットを理解してもらい、最低限のコマンドを覚えてもらうよう説得しなければならない。
  • ダブルクリックと比較するとCUIで RStudioを実行するのは面倒

今のところ、多少の学習コストとタイピングを我慢すれば、大きなメリットを得らえる気がします。macはどんなに良い製品であっても、使い続ければ必ずダメになる日が来るので、その時の手間を大幅に節約できるだけでも便利な気がします。

*1:RStudio viewerは日本語フォントが文字化けする気がします

学会・研究会における保育サービスについて思うこと

今回は、子育て世代研究者あるあるのような話題で、それについて思うことを書きます。

学会における保育サービス

学会や研究会において、子連れでの参加を促すために保育サービスが提供されることがあります。子育て世代の研究者にとって、このサービスはその学会への参加を大いに助けてくれる貴重なものだと言えます。しかし、実際にサービスを利用できるかは、料金次第であるというのが本音です。

サービスの使用料金はいろいろ

まず、このようなサービスは学会・研究会参加者全員へのサービスではないので、受益者負担が生じるのはしかたないと思います。それにもかかわらず、日本教育心理学会第57回総会や第79回日本心理学会大会のように無料でサービスが提供されることもあります*1
confit.atlas.jp
実際には、いくらか利用料がかかることがほとんどです。高くて利用できなかった例としては、1時間当たり1500円と言われたことがあります*2

学会でサービスが提供されない場合

大きな学会では、保育サービスは当たり前になりつつあると思いますが、小さな研究会ではまだ少ないです。それでもどうしても参加したい研究会があります。では、どうするか?私の場合は、所属している企業・大学の福利厚生サービスの利用を考えます。実際に、提携している認証保育所へ一時間300円で預かってもらったこともあります。差額を企業の福利厚生サービスで負担してくれているわけです。1時間当たり300円なら半日預けても2000円もかからないので、負担可能な範囲かなと思います*3

現状の問題とそれへの提案

学会が提供するサービスや会社の福利厚生サービスは、貴重なのですが、それが受けられないケースは結構あると思います。例えば、大学院生は福利厚生サービスを受けられないと思うので、学会が保育サービスを提供していないといきなり行き詰まります。あとは、福利厚生サービスを利用できたとしても、何をどうやって利用するかの手続きが煩雑な場合がほとんどです。学会発表、宿泊先の確保に加えて、保育サービスの手配とその助成手続きとなるので、手続きのための時間を確保できないことがあります。このような問題が生まれる背景として、大学や企業による保育サービスへの支援が、個人を対象としていることが挙げられます。
例えばこれを、保育サービスを提供しようとしている学会・研究会を対象にしたとします。すると、サービスを利用したいと考えている人たちをより確実にサポートできる気がします。では、どうすればこれを確立できるか?最近の学会では、使用費目を明らかにしたスポンサー企業があるようです。
http://www.anlp.jp/nlp2016/#sponsor
上記の懇親会・茶菓スポンサーと同様の扱いで「保育サービススポンサー」を募るのはどうでしょうか?スポンサー企業によっては、保育サービススポンサーになることの宣伝効果を期待できる場合がある気がします。もちろん文部科学省がこのような保育サービス支援助成金の制度を作ることもありだと思います。

*1:本年開催の日本教育心理学会第58回総会でもこのサービスは無料で提供されるようです

*2:もちろんないよりずっと良いですが、5時間預けて7500円は負担としてかなりのものとなるでしょう

*3:何を高いまたは安いと思うかは当然個人によります

10万PVになりました。ありがとうございます。

今回は、このブログを見てくださった皆様へのお礼です。

100,000PV

100,000PVは、このブログを始めた時、そして始めてしばらくの間には考えもつかなかった数字です。しかも2014年11月に10,000pv達成だったので、1年1〜2ヶ月の間に指数的にpvが伸びています。割と思いついたこと、書きたいこと、書いておいた方が良いと思うことを自由に書いています。いわゆるブロガーを志しているわけでもないですし、アフィリエイトなども一切やっていません。そう考えると、100,000pvはできすぎな数字と言えます。

webbeginner.hatenablog.com

どんな人が見てくださったのか?

これは10,000pv達成した時にも書きましたが、平日のアクセスと休日のアクセスの落差がかなりあります。休日は平日の半分以下のアクセスです。内容としては、基本的な内容を検索で見つけた人が多いように思います。本ブログのタイトルは「webbeginner」なのでその趣旨にかなりあった結果となっています。嬉しい限りです。

そろそろ「ビギナー」ではないのでは?

確かに、「ビギナー」とは言えないなと思う部分(例えばR言語の使い方)とまだまだ初心者同然の部分(例えばD3,p5などのJavaScriptライブラリ)が混在しています。しかし、R言語の使い方については、自分が初学者ということではなく、自分に関わりのある初学者の皆様がウェブから検索で偶然拾ってくれないかなという淡い期待を込めつつ記事を投稿しています。なので「初心者むけ」というポリシーに広い意味で合致していると思っています。

1,000,000pvは現実的にありえないので

あと一桁増やすためには、どう考えても増やすための努力が必要です。最初に書いたようにプロブロガーを目指してこのブログを運営しているわけではなく、このペースが保たれれば十分だと考えています。今後は、少し込み入った内容についても、本業に支障のでない限りで書いてみたいと思っています。そのような内容は、「初心者向け」ではないので、投稿先をqiitaに変えるかもしれません。というわけで、以下が私のqiitaへのリンクです。こちらもぜひよろしくお願いします。

qiita.com

R言語でサイズの大きいファイルの読み込み

今回は、ファイルの入力に関するヒントを書きます。

ファイルからの入力はread.table関数

R言語では、baseパッケージの中にread.table関数、read.csv関数などがあります。これを利用すれば、簡単にテキストファイルとして保存されているデータを読み込めます。しかし、read.table関数で作成されるdata.frameオブジェクトは容量制限が結構きびしく、20変数で100万行あるようなデ−タだと容量ぎりぎりになります。問題は、ファイルを中までしか読んでいなくても警告しか出ないことです。そのままコードが走ってしまうので、きちんと確認しないと実はファイルがうまく読み込めていなかったということになりかねません。

data.tableパッケージの利用

そこで、data.tableパッケージを利用します。data.tableオブジェクトは、data.frameよりも大きなデータを高速に読み込むことができます。
data.tableオブジェクトに入力するにはfread関数を用います。

#data.tableパッケージの起動
library(data.table)

#ファイルの読み込み
dat <- fread("filename.txt", sep = "\t")