2013年1月30日水曜日

Rによる統計解析ハンドブック 第4章演習問題解答

This post is solutions of chapter 4 of `A Handbook of Statistical Analyses Using R, Second Edition'.

このポストはRによる統計解析ハンドブック(第2版)の第4章の解答になります。

1

Test based on chi-square can't reject independency of region and site of lesion, but Fisher's exact test rejects that.

カイ2乗値に基づく検定では地域と病変部位は独立でないと言えないが、Fisherの正確検定では棄却される。

data("orallesions", package="HSAUR2")
chisq.test(orallesions) # p-value = 0.1096, accept
fisher.test(orallesions) # p-value = 0.01904, reject

2

labels in graph warp each other, so should I change row names of the dataframe to avoid wapping in advance?

グラフのラベルが重なるのですが、予めrownames関数でデータフレームの行名を変えなければならないのでしょうか。

library("vcd")
data("orallesions", package="HSAUR2")
assoc(orallesions)
mosaic(orallesions)
HSAUR2_ch4_q2_assoc HSAUR2_ch4_q2_mosaic

3

Difference of p-value is derived from the that of mean. To check this, boxplot is helpful. By executing sum(p.diff>0) in R, it turns out that elements of p.diff is always larger than 0.

違いは平均値の差の大きさに由来する。これを確認するためには箱ひげ図が便利である。Rでsum(p.diff>0)とすることで、すべて0より大きな値をとっていることが分かる。

library("coin")

n.test <- 100 # number of test
p.diff <- matrix(nrow=n.test, ncol=4) # matrix to store the difference of p-value
colnames(p.diff) <- c("diff=0.5", "diff=1", "diff=1.5", "diff=2")
sz <- 12 # 15 is upper limit on my computer. Be sure to make sz less than 15!
for( i in 1:n.test ){
  for( j in 1:4 ){
    g1 <- rnorm(sz, mean=0, sd=1)
    g2 <- rnorm(sz, mean=j/2, sd=1)
    lev <- c(rep(1, sz), rep(2, sz))
    ddd <- c(g1, g2)
    gs <- as.data.frame(cbind(ddd, lev))
    colnames(gs) <c("value", "gr")
    gs$gr <- factor(gs$gr)
    p.diff[i, j] <pvalue(wilcox_test(value ~ gr, data=gs, distribution=exact()))
               - pvalue(independence_test(value ~ gr, data=gs, distribution=exact()))
  }
}

boxplot(p.diff)
HSAUR2_ch4_q3

2013年1月27日日曜日

Rのpairs関数の出力をカスタマイズする

pairs関数(対散布図とも言う)はデフォルトの設定では黒い点でプロットするだけなので、グラフにより情報を持たせるため、グラフをカスタマイズする。対散布図は行方向、列方向に同じ数の図が描かれるが、i行j列の位置にある図とj行i列の位置にあるグラフは実質同じなので、工夫したグラフを試してみようということである。

ここではおなじみのirisデータを基に、右上のグラフには相関係数の絶対値、左下のグラフにはデータを色で分けたグラフと、直線性が強い組についてのみ回帰直線を描いてみることにする。

右上、左下のグラフを制御するのはpairs関数の引数のうち、panel、upper.panel、lower.panelである。デフォルトではpanelは散布図を描くようになっており、upper/lower.panelはそれを使うようになっているので、点による散布図が書かれることになる。upper/lower.panelの引数に与える関数を書き換えることで、グラフに手を加えることができる。

upper <- function(x, y, ...){ # 右上の散布図を設定
  oldpar <- par(usr = c(0, 1, 0, 1)) # 3行下でテキストの位置を(0.5, 0.5)にするための調整
  v <- abs(cor(x, y))
  sz <- 1 + v * 2 # テキストのサイズを直線性の強さで調整
  text(0.5, 0.5, sprintf("%.3f", v), cex = sz)
  par(oldpar)
}

lower <- function(x, y, ...){ # 左下の散布図を設定
  points(x, y, pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])
  if( abs(cor(x, y)) > 0.8 ){ # 直線性の強いデータの組だけ回帰式を作成
    lmobj <- lm(y~x)
    abline(lmobj)
  }
}

pairs(iris[,1:4], upper.panel=upper, lower.panel=lower)

気をつける必要があるのは、lower関数の1行目で、ここでplotを用いて書こうとするとエラーになる点である。低水準作図関数を使うようにすること。また、lower関数内で用いたpoints関数のbgパラメータのように、データをそのまますべて渡せば、すべての散布図で自動的にうまく描いてくれる。1つ1つの散布図を気にしてパラメータを変更する必要はない。

上のコードを実行すると、次のような画像が得られる。

Rのpairs関数を用いたグラフ

2013年1月25日金曜日

TopCoder SRM455 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

ペーチャは蜘蛛が好きである。彼は蜘蛛を長方形の格子の各セルに1匹づつ置いた。ペーチャは何年も蜘蛛について研究してきたので、すべての蜘蛛の動きを予想した。各秒の初めにすべての蜘蛛がセルから隣り合うセルのどれか1つに移動する(あるいは格子から離れる)。各セルにペーチャは蜘蛛の動きの方向を書いており、それはA[]という文字列型配列で与えられる。i番目の要素のj番目の文字はNSEWのいずれかであり、それぞれ北、南、東、西方向への移動を表している。もし格子の外側に移動したら、床に落ちる。1秒後に空いているセルの数を返せ。

私の解答はこちら。

public class SpidersOnTheGrid {

 public int find(String[] A) {
  int nRow = A.length;
  int nCol = A[0].length();
  boolean[][] isFilled = new boolean[nRow][nCol]; // 蜘蛛でそのセルが埋まっているかを記録
  for( int i=0 ; i<A.length ; i++ ){
   for( int j=0 ; j<A[0].length() ; j++ ){
    int xpos = i; // 蜘蛛の位置
    int ypos = j;
    if( A[i].charAt(j) == 'N' ){ // セルの内容に応じて蜘蛛を動かす
     xpos--;
    }else if( A[i].charAt(j) == 'S' ){
     xpos++;
    }else if( A[i].charAt(j) == 'E' ){
     ypos++;
    }else{ // West
     ypos--;
    }
    if( xpos < 0 || xpos >= nRow || ypos < 0 || ypos >= nCol ) continue; // 床に落ちる
    isFilled[xpos][ypos] = true; // 動いた先の座標をtrueに変える
   }
  }
  
  int nFilled = 0;
  for( int i=0 ; i<A.length ; i++ ){
   for( int j=0 ; j<A[0].length() ; j++ ){
    if( isFilled[i][j] == true ) nFilled++;
   }
  }
  return nRow*nCol-nFilled; // 空セルは全体から埋まっているセル数を引く
 }

}

得点は183.69/250、2回目のsubmitでシステムテストクリア。breakとcontinueを間違える凡ミスをした。

2013年1月24日木曜日

TopCoder SRM456 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

アップルワードというのは、A、P、L、Eの文字のみからなり、ちょうどその順になっている単語をいう。Aは1つ、Pは2つ以上、LとEは1つである。大文字か小文字かは問題でない。例えば"apPpPPlE"はアップルワードであり、"ABCDE"はそうではない。wordというアップルワードに変えなければならない文字列型変数が与えられたとき、アップルワードに変換するのに最小限変換しなければならない文字数を返せ。もし変換できないのであれば、-1を返すようにせよ。

私の解答はこちら。

public class AppleWord {

 public int minRep(String word) {
  int len = word.length();
  if( len < 5 ) return -1;
  int nReplace = 0;
  if( word.charAt(0) != 'A' && word.charAt(0) != 'a' ) nReplace++;
  if( word.charAt(len-2) != 'L' && word.charAt(len-2) != 'l' ) nReplace++;
  if( word.charAt(len-1) != 'E' && word.charAt(len-1) != 'e' ) nReplace++;
  for( int i=1 ; i<len-2 ; i++ ){
   if( word.charAt(i) != 'P' && word.charAt(i) != 'p' ) nReplace++;
  }
  return nReplace;
 }

}

得点は222.52/250、1回のsubmitでシステムテストクリア。変換できない状況は、wordの長さが4以下のときとなる。

2013年1月23日水曜日

Rによる統計解析ハンドブック 第3章演習問題解答

This post is solutions of chapter 3 of `A Handbook of Statistical Analyses Using R, Second Edition'.

このポストはRによる統計解析ハンドブック(第2版)の第3章の解答になります。

1

To decide which is superior, I chose wilcox.test as relative merit is decided by the absolute difference from 43 meters. t.test doesn't tell us which index is better estimator. conf.int in wilcox.test is needed to get estimated value which indicates the difference of rank. In below code execution printed value(=-3.1999...) shows that feet is superior than meter though null hypothesis couldn't rejected as p-value is slightly greater than 0.05.

どちらが優れているかを決めるため、wilcox.testを選んだ。というのも、優劣は43からの絶対誤差で決まるからである。t.testはどちらの指標が優れた推定量であるかを示してはくれない。wilcox.testのconf.intは順位の違いを示す推定値を得るために必要である。p値が0.05よりわずかに大きいため帰無仮説(2群は順位差がない)は棄却できないものの、実行時に表示される値はfeetがmeterよりも優れていることを示している。

data("roomwidth", package="HSAUR2")
convert <- ifelse(roomwidth$unit == "feet", 1, 3.28)
wt <- wilcox.test(I(abs(width*convert-43))~unit, data=roomwidth, conf.int=TRUE)
print(wt$estimate) # =-3.200

2

data("water", package="HSAUR2")
by(water, water$location, function(x){ return(cor(x$mortality, x$hardness))})

3

There is a mistake in the textbook written in Japanese. The numerator of formula in the question should be (njk-Ejk)/sqrt(Ejk). Otherwise it can't take a nagative value.

日本語版テキストの公式は間違いで、分子の方は(njk-Ejk)/sqrt(Ejk)が正しい。そうしないと(N(0, 1)の分布なのに)負の値がとれないよね~

data("pistonrings", package="HSAUR2")

calc.res <- function(x){
  sta.res <- chisq.test(x)$residuals
  x.exp <- outer(rowSums(x), colSums(x))/sum(x) # creates Ejk
  rr <- rowSums(x)
  cc <- colSums(x)
  nn <- sum(x)
  adj.res <- matrix(nrow=nrow(x), ncol=ncol(x))
  for( j in 1:nrow(x) ){
    for( k in 1:ncol(x) ){
      adj.res[j,k] <- (x[j,k]-x.exp[j,k])/sqrt(x.exp[j,k])/sqrt((1-rr[j]/nn)*(1-cc[k]/nn))
    }
  }
  adj.res <- as.data.frame(adj.res)
  rownames(adj.res) <- rownames(x)
  colnames(adj.res) <- colnames(x)
  return(list("sta.res"=sta.res, "adj.res"=adj.res))
}
pis.res <- calc.res(pistonrings)

4

The result of prop.test indicates that null hypothesis couldn't be rejected because p-value is greater than 0.05.

prop.testの結果はp値が0.05より大きいことから、(比率が一定という)帰無仮説が棄却できないことを示している。

data("rearrests", package="HSAUR2")
prop.test(rearrests, correct=FALSE)

2013年1月22日火曜日

TopCoder SRM454 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

整数の桁の和は10進数で書かれた桁の和である。例えば1234は1+2+3+4=10になる。さて、A、B、Cという3つの整数が与えられる。AとBの間にあるXという整数で、Xの桁の和とCの桁の和の差の絶対値が最小になるものを返せ。もし複数のXがあり得るなら、その中で最小のものを返せ。

私の解答はこちら。

public class MinimalDifference {

 public int findNumber(int A, int B, int C) {
  int target = digit_sum(C);
  int diff = Integer.MAX_VALUE;
  int ans = A;
  for( int i=A ; i<=B ; i++ ){
   int currentDiff = Math.abs(target - digit_sum(i)); // 差の絶対値の計算
   if( currentDiff < diff ){ // Xの更新作業
    diff = currentDiff;
    ans = i;
   }
  }
  return ans;
 }
 private int digit_sum(int num){ // 桁の和を計算する関数
  // while文で0になるまで10で割った余りを足し、10で割ることを繰り返す方法もある
  String snum = "" + num;
  int s = 0;
  for( int i=0 ; i<snum.length() ; i++ ){
   s += snum.charAt(i) - '0';
  }
  return s;
 }
}

得点は235.47/250、1回のsubmitでシステムテストクリア。Xの更新作業では、複数の候補から最小値を返すので、<=としないように注意。

2013年1月20日日曜日

TopCoder SRM453.5 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

あなたは大工さんで、家具をいくつか作りたいと思っている。不幸なことに、すべての道具を無くしてしまった。need[]という、i番目の要素は、スペースで区切られた家具を作るのに必要な道具のリストが与えられる。すべての家具を作るのに買わなければならない異なる道具の数を返せ。

私の解答はこちら。

import java.util.HashSet;

public class ToolsBox {

 public int countTools(String[] need) {
  HashSet<String> hs = new HashSet<String>();
  for( int i=0 ; i<need.length ; i++ ){
   String[] tools = need[i].split(" "); // スペース区切りのリスト
   for( int j=0 ; j<tools.length ; j++ ){
    hs.add(tools[j]); // ハッシュに放り込む
   }
  }
  return hs.size(); // ハッシュのサイズ=買わなければならない道具の数
 }

}

得点は246.90/250、1回のsubmitでシステムテストクリア。

2013年1月16日水曜日

TopCoder SRM453 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

ジョンとブラスはチームスポーツのトーナメントに興味を持っている。彼らは現在のトーナメントの中間順位を調べている。これまでにどの試合が行われたかについては知らない。彼らはトーナメントが以下のルールに基づいて行われたことだけを知っている: 各ゲームは2チームで行われ、一方の勝利または引き分けの結果になる。もしあるチームが試合に勝つと、2ポイントを得て、相手は0ポイントを得る。引き分けの場合には、各チームに1ポイントずつ入る。チームの得点は試合から得たポイントの総和である。どのチームとやりあうかということについての制限はなく、各チームの組で何試合してもよい(0の可能性もある)。

points[]というトーナメントの中間順位を表す整数型の配列が与えられる。i番目の要素はチームiの得点を表す。この順位を作成するのに必要となる試合の最小数を返せ。もしpointsが妥当な状態を表していないのであれば、-1を返すようにせよ。

私の解答はこちら。

public class TheTournamentDivTwo {

 public int find(int[] points) {
  int sum = 0;
  for( int i=0 ; i<points.length ; i++ ){
   sum += points[i];
  }
  if( sum % 2 == 1 ) return -1;
  return sum / 2;
 }

}

得点は246.97、1回のsubmitでシステムテストクリア。-1になるのは、合計点が奇数のときだけである。これは、1試合するたびに合計2点が2チームに入るためである。最小の試合数は合計点/2でよい。

2013年1月15日火曜日

Rによる統計解析ハンドブック 第2章演習問題解答

This post is solutions of chapter 2 of `A Handbook of Statistical Analyses Using R, Second Edition'. Note that my interpretations of data may differ from yours, but they are not the only solutions.

このポストはRによる統計解析ハンドブック(第2版)の第2章の解答になります。私のデータの解釈はあなたのそれらとは異なるかも知れませんが、唯一の解答ではないことに注意してください。

1

I aggregated expenditure for each gender. Compared to men, women tend to spend much money on housing and less on food.

性別ごとに支出金額を集計した。男性と比較して、女性は住まいへの費用が多く、食費への支出が少ない傾向にある。

lst <- split(household, household$gender)
expenses <- sapply(lst, function(x){colSums(x[,1:4])})
normalize <- matrix(rep(colSums(expenses),4), ncol=2, byrow=T)
ratios <- expenses/normalize
xpos <- barplot(ratios)
ypos <- diff(rbind( c(0, 0), apply(ratios, 2, cumsum)))/2 + 
        rbind( c(0, 0), apply(ratios, 2, cumsum))[1:4,] # calculate y coord to insert strings
text(rep(xpos, each=4), ypos, rep(rownames(ratios), 2))
HSAUR2_ch2_q1

2

As men get older, suicide rate increases. All of outliers belong to Hungary. Assume that library(HSAUR2) is already done. If not, execute data("suicides2", package="HSUAR2").

年齢が上がるに連れて自殺率が上がる。外れ値はいずれもハンガリーになっている。library(HSAUR2)は実行済みと仮定してください。もししていなければ、data("suicides2", package="HSUAR2")を実行するように。

boxplot(suicides2)
HSAUR2_ch2_q2

3

This answer shows how to change points into strings when using function pairs. By controlling parameter `panel', we can control both lower.panel and upper.panel. In case of changing counterpart, we should define functions for each panel. q2 required me to plot Life.Expectancy - Homicide relationship conditioned by Income, but no indication about it in text book. So I divided data whether it is higher or lower than the median income.

対散布図で描画するときに、点を文字に変えるにはどうしたら良いかという解答がこれになります。panelを制御することで、lower.panelとupper.panelを両方とも制御することができます。一方だけ変えたい場合は、それぞれに対して関数を定義してやる必要があります。q2では、平均収入を条件とした平均余命と殺人率のプロットを描くのですが、平均収入を条件とするということに関する指示がありません。ここでは、収入が中央値より高いか低いかでデータを分けました。

# states.abb <- abbreviate(rownames(USstates), minlength=2)
# q1
states.abb <- c("AL", "CA", "IA", "MS", "NH", "OH", "OR", "PA", "SD", "VT")
pairs(USstates, panel=function(x, y, ...){ text(x, y, states.abb) })
# q2
cond <- ifelse(USstates$Income < median(USstates$Income), "Lower", "Upper")
xyplot(Life.Expectancy ~ Homicide | cond, data=USstates)
HSAUR2_ch2_q3_1 HSAUR2_ch2_q3_2

4

When I used pairs, I found counterfeits were slightly short in diagonal length. To confirm that, I used boxplot.

対散布図を使ったところ、偽物がわずかに対角線の長さが短いことに気づきました。それを確認するために、箱ひげ図を利用してみました。

data("banknote", package="alr3")
pairs(banknote, col=banknote$Y+1) # black=genine, red=fake
boxplot(banknote$Diagonal~banknote$Y)
HSAUR2_ch2_q4_1 HSAUR2_ch2_q4_2

2013年1月11日金曜日

Rによる統計解析ハンドブック 第1章演習問題解答

This post is solutions of chapter 1 of `A Handbook of Statistical Analyses Using R, Second Edition'. As far as I know, there's no solutions on Web, so I decided to post my answers and hope to sophiscate them through discussing if needed.

このポストはRによる統計解析ハンドブック(第2版)の第1章の解答になります。私の知る限り、解法はWeb上にありませんので、私の解答を掲載することを決心しました。必要があれば議論して解答をより良くしたいと思っています。

Because almost no contents in the text book is written in this post, so please get one previously.

テキストに書かれている内容はほぼこのポストにありませんので、本は予め入手しておいてください。

1

library(HSAUR2)
prof.meds <- tapply(Forbes2000$profits, Forbes2000$country, median, na.rm=T)
print(prof.meds[c("United States", "United Kingdom", "France", "Germany")])

In the following answers, assume that `library(HSAUR2)' is already executed.

以後library(HSAUR2)は既に実行されていることを仮定せよ。

2

ger.deficit <- Forbes2000$country == "Germany" & Forbes2000$profits < 0
print(Forbes2000[ger.deficit, ])

3

Insurance Company is majority of this data (bermuda).

bermuda <- Forbes2000$country == "Bermuda"
print(table(Forbes2000[bermuda, "category"]))

4

big.profit <- Forbes2000[Forbes2000$profits >= sort(Forbes2000$profits, dec=T)[50],]
big.profit <- big.profit[!is.na(big.profit$profits),]
plot(big.profit$assets, big.profit$sales, log="xy", type="n")
text(big.profit$assets, big.profit$sales, abbreviate(big.profit$country))

5

print(tapply(Forbes2000$profits, Forbes2000$country, mean, na.rm=T))
larger <- function(x, th){
  return(length(which(x > th)))
}
print(tapply(Forbes2000$profits, Forbes2000$country, larger, 5))

2013年1月9日水曜日

TopCoder SRM452 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

2種類の卵のカートンがある。1つは6つの卵を、もう1つは8つの卵を含んでいる。ジョンはちょうどn個の卵を買いたいと思っている。ジョンが買わなければならない最小のカートンの数を返せ。もしちょうどn個の卵を買うことができないのであれば、-1とせよ。

私の解答はこちら。

public class EggCartons {

 public int minCartons(int n) {
  int nCarton = 0;
  if( n % 2 != 0 ) return -1;
  if( n == 2 || n == 4 || n == 10 ) return -1;
  return (int)Math.ceil(n / 8.0);
 }

}

得点は137.04/250、2回目のsubmitでシステムテストクリア。紙に書いて規則性を見つけるのが一番早いかと。

2013年1月8日火曜日

TopCoder SRM451 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

リックは固くいくつかの数字に関係する魔法のパターンがあると信じている。この信念はそこらじゅうで奇妙なパターンを見つける彼の傾向の結果である。リックは最近いくつかの数字に"魔法の源"があると考えた。例えば、1370974という数字は、以下の手順により、1234に等しい魔法の源を持つ。これは1234+12340+123400+1234000=1370974という計算ができることによる。n個の数字の数列で、i番目の数字が1234に10^iをかけたものの総和が1370974になるものがあることから、公式に1234は1370974の魔法の源である。この定義により、正の整数はそれ自身の魔法の源でもあることに注意。さて、sourceとAという正の整数が与えられたとき、Aより大きく、sourceがxの魔法の源となるような最小の数を返せ。

私の解答はこちら。

public class ReverseMagicalSource {

 public int find(int source, int A) {
  int num = source;
  int i = 1;
  while( true ){
   if( num > A ) break;
   num += source * Math.pow(10, i);
   i++;
  }
  return num;
 }

}

特に注意点はなし。言われた通りに書くだけですね。強いて言うなら、最小の数を判定するときに、Aより大きくの場所でうっかり=をつけないぐらいですが...

2013年1月6日日曜日

TopCoder SRM450 Div2 250Pts

このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。問題文についておおまかに説明する。

あなたはとてもおかしなコンピュータを与えられた。コンピュータのメモリはいくつかのビットからなり、それぞれは0で初期化されており、以下の操作の種類のみ振る舞うことができる:メモリのあるビットを選び、0か1の値を選択する。メモリの選択されたビットと最後のビットの間のすべてを選んだ値にする。さて、memという文字列が与えられる。memの文字の数はコンピュータのメモリの数に等しい。コンピュータのメモリをmemと同じにするのに必要となる最小の操作の回数を返すメソッドを作成せよ。

私の解答はこちら。

public class StrangeComputer {

 public int setMemory(String mem) {
  int nChange = 0;
  char bit = '0';
  for( int i=0 ; i<mem.length() ; i++ ){
   char c = mem.charAt(i);
   if( bit != c ){
    nChange++;
    bit = c;
   }
  }
  return nChange;
 }

}

この問題では先頭から順に直前の文字と比較して、0と1が反転した回数を数えればよいことになる。先頭の文字の前の文字はすべて0に初期化するという条件から、0と考えておけばよい。

2013年1月5日土曜日

2012年12月の学習記録

2012年12月に学習した主な本一覧。忘年会を何回やったことでしょうか。

入門・演習 数理統計(演習問題39問)
いよいよ最終章。来月で終わりそうな感じです。そろそろ昔解けなかった問題に挑戦するときかも。
カウントデータの統計解析(pp.112~152)
テキストにところどころ出てくる反復解法の妥当性がいまだによく分かりません。どういうときに収束することが保証できるんですかね。それとテキストやWebで公開されている解答にタイポが3ヶ所ぐらいありました。
JavaScriptワークブック(pp.120~159読了)
Webのテーブルや画像はすべてオブジェクトなので、それをどういじるのかということを学んだ。ただしjQueryとかライブラリには立ち入ってないので、ここでは概要のみ学んだ感じ。
Pythonスタートブック(読了)
復習を兼ねて読んでみたが、オライリーと「みんPy」の本で十分そうだ。
Beautiful Visualization(pp.1~25)
インフォグラフィックスの一例を学ぶ。アメリカ大統領の選挙で政党が獲得した州はそのままのサイズでなく、州の議員数に比例したサイズで地図を書くと情報量が増えるとか。
初めてのLISP(pp.1~32)
carやcdrとは何かということが最初の32ページに載っていて、初めて知りました。奥が深そうなので、あまり手を突っ込み過ぎたくはないのですが、SICPなんかを将来的に読もうとしているので、遅かれ早かれ手を出さないといけない感じですね。

その他、TopCoderの過去問を約15問解く。英文ドキュメント翻訳の作業は約40%まで到達。今年度中には何とかリリースできそうか...?

フォロワー

ブログ アーカイブ

ページビューの合計