axjack's blog

### axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz ###

2019年6月 統計検定準一級 問1

はじめに

本番で解けなかった問題を解いてみます。今回は問1です。この問題で問われていることは

  • 確率分布の和
  • 条件付き確率分布

です。似たような問題ないかなぁと調べてみるとなんと、アクチュアリーの昭和39年数学1の問3にほぼ同じような問題があったので、これを見つつ今回の問題を解いてみることにしました。

問題を解く

以下、

  • λ1 : 3
  • λ2: 2
  • Z : 4

を代入すると記述1〜記述4の解となります。

ポアソン分布の性質

ポアソン分布P(X = k ; {\lambda}) = exp(-{\lambda}) \Big( \frac{ {\lambda}^k }{k!} \Big) は、

  • 平均 : λ
  • 分散 : λ

です。

ポアソン分布に従う確率変数の和の分布

P(X = k ; \lambda_1), P(Y = k ; {\lambda}_2)の時、P(X + Y = Z )が従う分布を求めます。

(はてなのmathjax記法がエラるので画像にて。。)

となるので、

が和の分布となる(ポアソン分布の再生性が確認できた)。よって、和の分布は

  • 平均 : λ1 + λ2
  • 分散 : λ1 + λ2

となる。

条件付き確率分布

求めるのは、

という確率分布である。計算すると、

となるので、この条件付き確率分布は二項分布となる。

したがって、平均値は

となる。

2019年6月 統計検定準一級 問10

Rでロジスティック回帰

テーマはロジスティック回帰。問題文に記載された出典を調べると、Risk Analysis of the Space Shuttle: Pre-Challenger Prediction of Failureがヒットするので、このデータを用いれば再現が出来る(のだろうか)。ひとまずやってみると、

データの読み込み

# Field Erosion or blowby ####
yF <- c(0,1,0,0,0,0,0,0,1,1,1,0,0,2,0,0,0,0,0,0,1,0,1)
TD <- ifelse(yF > 0, 1, 0)
Temperature <- c(66,70,69,68,67,72,73,70,57,64,70,78,67,53,67,75,70,81,76,79,75,76,58)
r <- glm(TD ~ Temperature, family = binomial(link = logit))

結果

> summary(r)

Call:
glm(formula = TD ~ Temperature, family = binomial(link = logit))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.0665  -0.7679  -0.3844   0.4541   2.2047  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)  
(Intercept)  14.9246     7.4235   2.010   0.0444 *
Temperature  -0.2302     0.1087  -2.117   0.0343 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 28.267  on 22  degrees of freedom
Residual deviance: 20.511  on 21  degrees of freedom
AIC: 24.511

Number of Fisher Scoring iterations: 5

やや違うがおおよそ問題文の出力結果と合致している。

作図

plot(Temperature, TD)
points( Temperature,fitted(r), col='red')

問10の小問を解く

[1][2]

y_i は 互いに独立な確率変数Y_i の実現値であり、Y_i は (ア) に従う。
π_i( 0 < π_i < 1 ) について、構造式(イ) を仮定する。

とある。ロジスティック回帰なのでY_iはポアソン分布に従い、構造式(リンク関数?)はロジットなのでlog( (π_i / ( 1 - π_i) ) =である。

[3]

0 = 15.0429 - 0.2322 x_i をx_i について解くと、x_i = 64.78423772

[4]

確率を求めるのでロジットではなくロジスティック関数に戻して解いてみる。すると、π_i = 1 / ( 1 - exp( - (15.0429 - 0.2322x_i) ) )x_i <- 31 としてπ_iを求めれば良い。結局、

> 1/(1+exp(-7.8447))
[1] 0.9996083

となる。

終わりに

試験㆗、「聞いたことあるけど自分で解いたことないんだよなぁ、でも解けたら応用範囲が広そうだなぁ」と思っていた問題の1つ。

2019年6月度 統計検定準一級受験記録

記録

  • 受験日:2019/6/16(日)
  • 会場:中央大学 後楽園キャンパス

感想

  • 人生で一番難しい数学の試験だった
  • 手ごたえは皆無
  • 開始の合図とともに終了の合図が聞こえる
  • 試合開始直後に殺されていたがゾンビとして生きている気分(統計学的ゾンビ)
  • 分からなさすぎて「アハハ」って脳内から聞こえた(アハ体験?)
  • 1時間で退室
  • 年齢層は20代後半、ぱっと見社会人かなぁという人が多かった
  • 論述問題は大学の期末試験でよく見る横罫線な解答欄だった
  • 解けない問題・理解の浅い知識が分かった、という点では大変有意義な試験
  • (解けなかったものの)良い問題が多い
  • 試験開始前に勉強してる人が、2級の時より遥かに多かった

次回も受験しますか?

受験します。

反省点・改善すべき点

  • 基礎知識の深い理解をしよう
  • 統計検定なので統計と確率、とにかくこれに尽きる
    • 前回は機械学習寄りだった気もするが今回はTHE 統計というラインナップ
    • しっかり統計勉強しろよ?というメッセージ、か?
  • 「この分析方法見たことある」レベルで受験してしまったので、この手のモヤリティを失くすことが合格に繋がる気がした
  • インプットは知識の定着に結びつかない see アウトプット大全
    • とはいえアウトプット(=問題を解く)が容易に出来る範囲ではないというもどかしさ
    • しかし半年の勉強と今回の受験にて、真面目に真っ向からしっかり勉強するしかないことがわかった(大きな収穫)
    • 昔から言われているように、定義・定理・証明・理論・アルゴリズム・実装を大事にしよう

おわりに

ということでまた一年間みっちり勉強しようと思う所存です。とはいえずっと勉強だとアレなので、適宜Rを用いながらenjoyしようかとも思います。

初期値1から始めたニュートン法による平方根の近似値計算は、7回ほど反復計算しておけば大丈夫そうです。 

はじめに

今日で令和元年ゴールデンウィークも無事終了です。

前回に引き続きニュートン法平方根を求めてみました。今回は、N = [1,1000] の範囲でニュートン法を用いて10回反復近似計算する時、真の値と近似値との残差はどんな感じになるのか、を調べてみます。

全てのNに対して初期値1から始めると、Nが大きくなればなるほど収束が遅れるような気配もありますが、まぁそこは部屋の片隅に置いておきましょう。

ニュートン法による平方根の近似

aの平方根を求めるには、初期値x_0を設定し、


\displaystyle x_{n+1} \leftarrow x_n - \frac{ x_n^{2} - a }{ 2 x_n}

を順次反復計算します。今回はx_0 = 1とおきました。

a = 2, x_0 = 1の時、


\displaystyle x_{1} \leftarrow (1) - \frac{ ( 1 ) ^{2}   - 2 }{ 2 \times ( 1 )} = 1.5


\displaystyle x_{2} \leftarrow (1.5) - \frac{ ( 1.5 ) ^{2}   - 2 }{ 2 \times ( 1.5 )} = 1.416666667


\displaystyle x_{3} \leftarrow (1.416666667) - \frac{ ( 1.416666667 ) ^{2}   - 2 }{ 2 \times ( 1.416666667 )} = 1.4142158687


\displaystyle x_{4} \leftarrow (1.4142158687) - \frac{ ( 1.4142158687 ) ^{2}   - 2 }{ 2 \times ( 1.4142158687 )} = 1.414213563

結論

初期値が1であっても、7回ほど反復計算しておけば問題なさそう。

コード

#rm(list=ls())

# f(x) = x^2 - a をニュートン法で求める更新式
fnewton <- function(xn=1,a=2){
  return ( xn - ( xn^2 - a )/( 2 * xn ) )
}

# 初期化
how_many_times_rep <- 10
N <- 1000
xs <- 1:N
root_xs <- sqrt(xs)
zeros <- rep(0,length(xs))

# 結果格納用行列
mat.x <- cbind( 
  matrix(c( xs,root_xs ),nrow = length(xs))
  ,matrix( rep(zeros, how_many_times_rep), nrow = length(zeros))
)

mat.x[,3] <- fnewton(xn = 1, a = mat.x[,1])

# ニュートン法にて更新
for(i in 4:(how_many_times_rep+2) ){
  mat.x[,i] = fnewton(xn = mat.x[,i-1], a = mat.x[,1])
}

#mat.dif <- matrix(0, nrow = nrow(mat.x), ncol = ncol(mat.x))
mat.dif <- mat.x

# 真の値 - 近似値
for(i in 3:(how_many_times_rep+2)){
  mat.dif[,i] <- mat.x[,2] - mat.x[,i]
}

# 結果確認
summary(mat.dif[,-c(1,2)])

par(family="Osaka")
boxplot(mat.dif[,-c(1,2)],
        col="lightpink",
        names=paste0(1:how_many_times_rep,"回目"),
        las=2,
        main=paste0("真の値と近似値との残差の箱ひげ図(N = 1 ~ ",N,")")
)

結果確認

要約統計量

summary の値を書き出すと、

V1               V2               V3               V4                V5         
 Min.   :-468.9   Min.   :-219.6   Min.   :-95.99   Min.   :-36.103   Min.   :-9.6226  
 1st Qu.:-348.2   1st Qu.:-161.4   1st Qu.:-69.00   1st Qu.:-24.697   1st Qu.:-5.8550  
 Median :-228.4   Median :-104.0   Median :-42.79   Median :-14.052   Median :-2.7105  
 Mean   :-229.7   Mean   :-105.3   Mean   :-44.04   Mean   :-15.158   Mean   :-3.3997  
 3rd Qu.:-110.0   3rd Qu.: -48.1   3rd Qu.:-18.09   3rd Qu.: -4.824   3rd Qu.:-0.5632  
 Max.   :   0.0   Max.   :   0.0   Max.   :  0.00   Max.   :  0.000   Max.   : 0.0000  

       V6                  V7                   V8                   V9            
 Min.   :-1.122493   Min.   :-1.924e-02   Min.   :-5.849e-06   Min.   :-5.400e-13  
 1st Qu.:-0.515571   1st Qu.:-4.763e-03   1st Qu.:-4.140e-07   1st Qu.:-3.553e-15  
 Median :-0.146451   Median :-4.762e-04   Median :-5.069e-09   Median : 0.000e+00  
 Mean   :-0.293577   Mean   :-3.268e-03   Mean   :-5.871e-07   Mean   :-3.005e-14  
 3rd Qu.:-0.009673   3rd Qu.:-2.953e-06   3rd Qu.: 0.000e+00   3rd Qu.: 0.000e+00  
 Max.   : 0.000000   Max.   : 0.000e+00   Max.   : 0.000e+00   Max.   : 3.553e-15  
      V10            
 Min.   :-3.553e-15  
 1st Qu.: 0.000e+00  
 Median : 0.000e+00  
 Mean   : 3.242e-17  
 3rd Qu.: 0.000e+00  
 Max.   : 3.553e-15  

でした。

  • V6列(6回目の反復)で残差の絶対値の最小値がほぼ1
  • 7回目で  〃  ほぼほぼ0

ですね。7回電卓ぽちぽちすれば平方根が得られそうです。

箱ひげ図

f:id:axjack:20190506230038p:plain

残差の範囲は反復回数が増す毎にどんどん小さくなっていきますね。5回目あたりで箱が見えなくなり、6回目あたりでヒゲもぺっちゃんこに見えます。

おわりに

計算方法覚えておけばルート機能要らない気もしないでも無いですね。脳内記憶容量を節約するならやはりルート付き電卓を買いましょう。

ニュートン法で平方根の値を求める

きっかけ

電卓のルートってどうやって求めるんだっけ? → たぶんニュートン法だろうなぁ。ということで、Rで簡単に実装して計算してみました。

実装

ニュートン法

fnewton <- function(xn=1,p=2,a=2){
  return ( xn - ( xn^p - a )/( p * ((xn)^(p-1)) ) )
}

反復計算からグラフ作成

solve_with_fnewton <- function(a, p = 2, n, xn = 1 ){
  xs <- c(xn,xn+1:n)
  for(i in xs){
    xs[i+1] <- fnewton(xs[i],p,a)
  }
  last_xs <- xs[n]
  
  plot(xs,type="o")
  title(main=bquote(sqrt(.(a), .(p)) %~~% .(last_xs) ),sub = "")
  abline(h=a^(1/p) ,col="red")
  print( xs )
}

関数呼び出し

solve_with_fnewton(a = 2,n = 10,p = 2)

結果

f:id:axjack:20190430235037p:plain

f:id:axjack:20190430235121p:plain

感想

6回目の反復あたりでほぼ答えが電卓と一致して驚いた。

ソフトバンクからOCNモバイルONEにMNPで乗り換える

はじめに

平成もそろそろ終わりそうな今日この頃、ソフトバンクから格安SIMなOCNモバイルONEにMNPしながら乗り換える*1ことにした。端末も同時に切り替える。

この記事を書いている現在(3/19)はOCNモバイルONEからSIMカードが届くのをまだかまだかと待っている最中である。 OCNモバイルONEからSIMカードが届いたので追記する。

なお、本記事は手続きが進み次第随時追記していく。

手続き

諸元

手続き経過

日時 イベント
3月16日(土) Apple 公式サイトにてiPhone 8を購入する
3月18日(月) ソフトバンクMNP予約の電話をかける
3月18日(月) OCNモバイルONEに申し込む
3月18日(月) iPhone 8 が家に届く
3月25日(月) SIMカードを届けに来た旨の不在通知を佐川急便より受領
3月26日(火) SIMカードを佐川急便より受領
3月26日(火) 構成プロファイルをインストール
3月26日(火) MNP開通手続き

SIMカードが届いてから

構成プロファイルのインストール

構成プロファイルのダウンロードはこちらの案内に従い、http://s.ocn.jp/ltecfg へアクセス、構成ファイルをダウンロードした。この時、端末のSIMカードソフトバンクのままの状態。

MNP開通手続き

MNP開通手続きのご案内に従い、http://s.ocn.jp/mnp01 へアクセス、申し込み時に発行されたocnのメールアドレスとパスワードを入力し、MNP開通手続きを実行した。この時、端末のSIMカードソフトバンクのままの状態。

実行後、iPhoneアンテナマークの右にある回線事業者名:Softbankが消えた。(この時点でMNP開通手続きが完了した、と思われる。)

SIMカード入れ替え

iPhone8はナノSIMなのでSIMカードをナノサイズに切り取り、iPhone8からソフトバンクSIMカードを取り出して交換した。

すると、回線事業者名がdocomoに!

OCN関連のアプリをインストール

  • OCNモバイルONE
  • OCNでんわ

の2つのアプリをインストールした。

各種疎通テスト

以下を問題なく実施できた。

  • wifiを切断してOCNモバイルONEからインターネットに接続する
  • SMSメッセージを受信する
  • iMessageを受信する
  • iMessageを送信する
  • OCNでんわから電話をかける
  • 他社携帯から電話を受ける

おわりに

簡単だったこと

手続きがものすごく簡単だった。SIMカードが届くまで1週間掛かったものの、スマホは何事もなく使えたしなんら問題なく。

難しかったこと

SIMカードの取り出しが難しかった。慣れてないとコツをつかむまでに苦労しますね。まぁ、勢いよくぐいっと押せば蓋が開くのですが・・・。

*1:乗り換えた理由:[1]ソフトバンク、10年ぐらい使ったけど月額料金がやっぱり高い[2]ソフトバンクショップ店員の態度が気に食わなかったのが最大のきっかけとなった[3]OCNモバイルONEのトップ3かけ放題というサービスを使えば電話代もあまり気にしなくても良さそう

固定長ファイルをテキストエディタで分割する

はじめに

3月もあと10日ほどで終わりですね。

本日は、COBOLの時代からひっそりと伝わる固定長ファイル分割術を、記憶が薄れる前にここに書き留めておこうという趣旨の記事です。

で、Linux環境だったら伝家の宝刀ddコマンドを駆使するわけですが、Windows環境となるとそのような手軽なツールは準備されていませんね。ということで、テキストエディタでグリッとこなす技を記載します。

分割ってどういうこと?

こんな感じの一行ファイルを、

1HHHHHHHHHHHHHHHHHHHHHHHHHHHHH21DDDDDDDDDDDDDDDDDDDDDDDDDDDD22DDDDDDDDDDDDDDDDDDDDDDDDDDDD23DDDDDDDDDDDDDDDDDDDDDDDDDDDD24DDDDDDDDDDDDDDDDDDDDDDDDDDDD25DDDDDDDDDDDDDDDDDDDDDDDDDDDD26DDDDDDDDDDDDDDDDDDDDDDDDDDDD27DDDDDDDDDDDDDDDDDDDDDDDDDDDD28DDDDDDDDDDDDDDDDDDDDDDDDDDDD29DDDDDDDDDDDDDDDDDDDDDDDDDDDD8TTTTTTTTTTTTTTTTTTTTTTTTTTTTT9EEEEEEEEEEEEEEEEEEEEEEEEEEEEE

このように区切ることを、

1HHHHHHHHHHHHHHHHHHHHHHHHHHHHH
21DDDDDDDDDDDDDDDDDDDDDDDDDDDD
22DDDDDDDDDDDDDDDDDDDDDDDDDDDD
23DDDDDDDDDDDDDDDDDDDDDDDDDDDD
24DDDDDDDDDDDDDDDDDDDDDDDDDDDD
25DDDDDDDDDDDDDDDDDDDDDDDDDDDD
26DDDDDDDDDDDDDDDDDDDDDDDDDDDD
27DDDDDDDDDDDDDDDDDDDDDDDDDDDD
28DDDDDDDDDDDDDDDDDDDDDDDDDDDD
29DDDDDDDDDDDDDDDDDDDDDDDDDDDD
8TTTTTTTTTTTTTTTTTTTTTTTTTTTTT
9EEEEEEEEEEEEEEEEEEEEEEEEEEEEE

分割と称することにします。

想定するデータの形式

ありがちな、

  • ヘッダレコード
  • データレコード
  • トレーラレコード
  • エンドレコード

の全銀フォーマット的な形式とします。何がありがちなのかよくわからな人は全銀フォーマット 固定長でggってください。

文字種は半角アルファベット・半角数字、ファイルに改行は含まれず、各レコードは30byteとします。

やりかた

ヘッダ→エンド→トレイラー→データの順に分割します。

ヘッダレコード

ヘッダレコードはファイルの先頭に陣取るレコードなので、

^.{30}

正規表現を使って検索すれば、頭30byteが取得できます。

エンドレコード

エンドレコードはファイルの末尾に陣取るレコードなので、

.{30}$

正規表現を使って検索すれば、お尻30byteが取得できます。

トレイラーレコード

エンドレコードを切り取ってからもう一度エンドレコードと同じやり方で検索すると、トレーラレコードが取得できます。

データレコード

ヘッダ・エンド・トレーラを前述の手順で切り出してしまえば、 .{30} で引っかかるのがデータレコード、となります。

レコード種別に関係なく30byteずつ分割する

(.{30})\1\nと置換すると、30byte引っかかるごとに改行を挟むことになるので、結果的に分割できます。なお改行コードが気になる方は文字コード環境に合わせて\nなり\r\nなり¥r¥nなりに変更してください。

おわりに

機械学習人工知能の波が押し寄せようと来まいと、データフォーマットの変換がなくなることはないでしょう。固定長・CSVXML・JSOなど、どんな何が来てもグリっと変換できるようにしておけば、平成の次の時代でも困ることはないはず(たぶん)。

唐突にテキストファイルだけ渡された時、しれっとフォーマット変換しなければいけない、だが手元にテキストエディタしかないのだが?な時にこの記事が役に立ったら幸いです。

【追記】分割されたファイルから改行を消す

\nをブランク(≠半角スペース)で置換すれば元に戻ります。

ggplot, geom_point, facet_gridの練習

はじめに

ggplotやqplotを日々練習しています。ggplot, geom_point, facet_gridを組み合わせると、

  • グラフ内側のx軸(量的)
  • グラフ内側のy軸(量的)
  • グラフ外側の横側(質的)
  • グラフ外側の上側(質的)
  • 点の色(質的・量的)

のように5変数くらい同時に、割と分かりやすく表示することができる。分割が煩わしいなら、facet_gridの項を消せば1つの散布図色付きのように表示することができる。

コード

例1

library(dplyr)
library(ggplot2)
ggplot(mpg) + geom_point(aes(cty,displ,colour=fl)) + facet_grid(year~cyl)

f:id:axjack:20190228230847p:plain

例2

library(ISLR)
a1 <- Auto %>% mutate(year_ = ifelse(year <= 80, 70, 80))
ggplot(a1) + geom_point(aes(displacement,horsepower,colour=weight)) + facet_grid(year_~origin) 

f:id:axjack:20190228231005p:plain

axjack is said to be an abbreviation for An eXistent JApanese Cool Klutz.