2013年4月8日月曜日

【Python】Pythonを学習するための教材

ずっとRを使って解析をしているのですが、そろそろ他の言語も勉強しようと思って、Pythonを勉強中です。
使っている教科書は、Wes McKinneyのPython for Data Analysis

Web上にないかなーと探しているところ
Data Science 101にPython初心者のための良記事が載ってました。
Web上のPython教材を2つ紹介しています。

---
  1. Getting started with Python: Tips, Tools and Resources - Python初心者にぴったり
  2. Getting Started with Python for Data Scientists - こちらはデータサイエンティスト向け
---

2013年2月23日土曜日

【読書メモ】思わずジャケ買いの経済書


某有名ブランド、ポール・○ミスを彷彿とさせる装丁です。


プリン人間ではなく、バケツを頭からかぶってます。


熊が頭を抱えている姿に癒される人は多いはず!
応援よろしくです。

2013年2月8日金曜日

【統計】【R】データセットをwide形式からlong形式に変換する

R-bloggerでConverting a dataset from wide to long(データセットをwide形式からlong形式に変換)という記事が投稿されていました。以下は、その記事をまとめたものです。

この記事の要旨は、
Rのreshape関数を使って、wide形式のデータをlong形式のデータに変換する
ということです。

wide形式とは、複数の個体のデータ系列が横方向に接続されたデータで、例えば以下のようなデータセットのことを言います。

> births.wide
  caseid v012 b2_01 b2_02 b2_03 b4_01 b4_02 b4_03
1      1   30  2000  2005    NA     1     1    NA
2      2   29  2001  2010    NA     1     2    NA
3      3   32  1999  2002  2006     1     1     1
4      4   35  1999  2009    NA     2     1    NA
5      5   34  1998    NA    NA     2    NA    NA
6      6   23    NA    NA    NA    NA    NA    NA
7      7   25  2000    NA    NA     1    NA    NA
>


v012は母親の年齢を表している列です。b2は子どもが生まれた年が記入されていて、b2_01は1人目の子どもが、b2_02は2人目の子どもが、b2_03は3人目の子ども生まれた年を表しています。b4は子どもの性別を表していて、先ほどと同様に、b4_01は1人目の子どもの、b4_02は2人目の子どもの、b4_03は3人目の子どもの性別を表しています。欠損値は子どもがいないことを示しています。たとえば、最初の被験者(caseid=1)の年齢は30で、子どもが2人おり、最初の子どもは2000年に、二番目の子どもは2005年に生まれたことがわかります。3人目は生まれていないので、b2_03とb4_03は欠損値になっています。

このデータをRのreshape関数を使って、long形式(複数の個体のデータの集合が縦方向に接続されたデータ)に変換します。

reshape(data, varying = NULL, 
        timevar = "time", idvar = "id", direction, sep = "")

  • data:変換したいデータフレームの指定
  • varying:long形式の列と対応するwide形式の列を指定
  • timevar:指定された変数をwideあるいはlongに変換する際に、その順序を指定
  • idvar:同じ被験者を表すデータフレーム中の変数の指定
  • direction:wide形式かlong形式にするかの指定
  • sep:列名を分ける記号の指定

たとえば

  1. b2_01、b2_02、b2_03
  2. b1、b2、 b3
  3. year.1、 year.2、 year.3

という複数の列をそれぞれ一つにまとめたい場合を考えます。

第一に、b2_01、b2_02、b2_03を一つの列に変換したい場合、sep="_"を指定します。
第二に、b1、b2、 b3という列を一つの列に変換したい場合、sep=""には何も指定しません。
第三に、year.1、 year.2、 year.3という列を一つの列に変換したい場合はsep="."を指定します。

それでは先ほどのbirths.wideをlong形式に変換します。

> births.long1 <- reshape(births.wide, varying=c("b2_01","b2_02","b2_03", "b4_01", "b4_02", "b4_03"), direction="long", idvar="caseid", sep="_")


> births.long1
    caseid v012 time   b2 b4
1.1      1   30    1 2000  1
2.1      2   29    1 2001  1
3.1      3   32    1 1999  1
4.1      4   35    1 1999  2
5.1      5   34    1 1998  2
6.1      6   23    1   NA NA
7.1      7   25    1 2000  1
1.2      1   30    2 2005  1
2.2      2   29    2 2010  2
3.2      3   32    2 2002  1
4.2      4   35    2 2009  1
5.2      5   34    2   NA NA
6.2      6   23    2   NA NA
7.2      7   25    2   NA NA
1.3      1   30    3   NA NA
2.3      2   29    3   NA NA
3.3      3   32    3 2006  1
4.3      4   35    3   NA NA
5.3      5   34    3   NA NA
6.3      6   23    3   NA NA
7.3      7   25    3   NA NA


これで、long形式に変換できていますが、被験者順で並び替えるにはorder関数を使うと上手くいきます。


> births.long2 <- reshape(births.wide, varying=c(3:8), direction="long", idvar="caseid", sep="_")
> births.long2<-births.long2[order(births.long2$caseid),]

> births.long2
    caseid v012 time   b2 b4
1.1      1   30    1 2000  1
1.2      1   30    2 2005  1
1.3      1   30    3   NA NA
2.1      2   29    1 2001  1
2.2      2   29    2 2010  2
2.3      2   29    3   NA NA
3.1      3   32    1 1999  1
3.2      3   32    2 2002  1
3.3      3   32    3 2006  1
4.1      4   35    1 1999  2
4.2      4   35    2 2009  1
4.3      4   35    3   NA NA
5.1      5   34    1 1998  2
5.2      5   34    2   NA NA
5.3      5   34    3   NA NA
6.1      6   23    1   NA NA
6.2      6   23    2   NA NA
6.3      6   23    3   NA NA
7.1      7   25    1 2000  1
7.2      7   25    2   NA NA
7.3      7   25    3   NA NA

これで被験者順に並び替えることができました。わかりやすく名前を付け替えるなら

names(births.long2) <- c("subject","age","order", "birthyear", "childsex")
で、欠損値を除くには
births.long2<-na.omit(births.long2)
と入力すればオッケーです。
詳細は、Converting a dataset from wide to longを参照してください。

応援よろしくです。

2013年2月3日日曜日

【読書メモ】【行動遺伝学】遺伝子の不都合な真実

人間は生まれながらにして(遺伝子によって)能力や性格が決まっている?という、誰もあからさまに口にしない事実:
「人間の能力や性格などひとりひとりの心の働きや行動の特徴が遺伝子の影響を受けている」
を明らかにしているのが安藤先生の「遺伝子の不都合な真実」。

「すべての能力は遺伝である」という副題も衝撃的です。本書の表紙だけを見れば、遺伝子は選ぶことはできないで、絶望的になったり、優生学の復活?となってしまいそうですが、本書を読み進めれば、そうした先入観は間違いだとすぐに気づきます。

本書では、行動遺伝学的に遺伝子の能力や性格に与える影響を紹介することで、双生児法を用いた実証研究によると、遺伝と行動の関係には次の3つの原則があるそうです:

  1. 行動にはあまねく遺伝の影響がある
  2. 共有環境(家庭の雰囲気など)の影響がほとんど見られない
  3. 個人差の多くの部分が非共有環境(交友関係など)から成り立っている

本書によると、遺伝によって能力、性格、行動が決まるのですが、遺伝のそれらに与える影響の出方は環境に左右されるようです。これを行動遺伝学では、遺伝・環境間交互作用と呼ぶそうです。たとえば、落ち着きがないなどの感情問題を遺伝的に抱えやすかったり、そうでない子ども(3〜4歳)がいることは確かですが、親の養育態度のあたたかさで、その出方は変化するようです。つまり、同じ遺伝的特徴を持っていたとしても、親の養育態度があたたかい場合、つめたい場合と比べて感情問題を引き起こしにくくなるようです。

遺伝子と環境、遺伝子と能力など複雑な関係を示してくれるすばらしい一冊です。

*双生児法
遺伝子をほぼ100%共有する一卵性双生児(MZ: monozygotic twins)と、約50%だけ共有する二卵性双生児(DZ: dizygotic twins)の類似性を比較することによって具体的に遺伝子を特定しなくても、ある行動に対する遺伝要因と環境要因の効果を統計的に推定する方法
(双生児法を用いた研究では、たとえば数学の能力は約90%が遺伝によるもの!)


応援よろしくです.

2013年1月15日火曜日

【統計】世界がもし100人の村だったら…

データの視覚化について勉強してるときに見つけた「世界がもし100人の村だったら」のインフォグラフィックス。

言葉だけの説明よりも、やっぱりわかりやすい。統計の知識だけじゃなくて、こういう視覚化の技術も磨いていかなくては…


応援よろしくです.

2013年1月12日土曜日

【気になる記事】【Economist】お金を出しているのに健康になれない

お金を出しているのに健康になれない…そんな現状を抱えるアメリカの保険医療費と死亡の関係についての記事が、2013/1/11Economist.comのDaily chartで紹介されました。

図のトップには非感染症(がんや心臓病)の死亡者数、下の左図では事故による死亡者数、右図にはGDPに占める保険医療費の割合を示しています。



まず右図を見ると、アメリカの保険医療費の割合は、他の富裕国に比べてかなり大きいことがわかります。具体的には、アメリカの保険医療費の支出はGDPの17.9%で、2.7兆米ドルに達してます(これはイギリスのGDP、2.4兆ドルより大きい!)にもかかわらず、図のトップと左図では、非感染症の死亡者と事故による死亡者が多いことを示しています。

米国医学研究所と全米研究委員会は、なぜこんなことが起こっていのるかを説明しようとしています。

・制度の問題

  1. アメリカの医療保険制度の非効率性

・アメリカ人の行動

  1. アメリカ人は、他の国の人と比べて、食べる量が多く、ドラッグを使い、銃を所有し、飲酒運転の事故を起こす傾向にある
  2. 若くして多くのパートナーと性交渉をしている(避妊をせずに)

などなど、いろんな要因が複雑に絡まっているようで、
最初にどの問題から取り組むかについて同意することが求められています。


応援よろしくです.

2013年1月7日月曜日

【統計】Goodデータサイエンティストになるには?

元記事はこちら(Data Science 101, What Makes a Good Data Scientist?)です。


データサイエンティストの定義はさておき、Goodデータサイエンティストになるために必要な素質が紹介されていました。
インタビューに答えているのはDJ Patilで、Goodデータサイエンティストには以下の2つの素質が必要だそうです。

・ストーリーテリング
・好奇心



応援よろしくです.