『統計で転ばぬ先の杖』

島田めぐみ・野口裕之(2021)『統計で転ばぬ先の杖』ひつじ書房

統計を用いるためのお作法と言うよりは,論文などでどのように示すかを具体例を挙げながら解説している本。統計分析が終わり,さて,論文に図表や検定結果を入れる場面で役に立つ。特に,表での桁合わせへの注意は,他の統計関係の本では見ない。これは論文を書く人にとっては当然だからなのだけれど,修論などで初めて書く人にとっては気が付きにくいところかもしれない。同様に,検定結果も何をイタリックにすべきか,小数点の位置やスペースを入れるかなど,細かいけれど,それ大事という点が書かれている。卒論・修論を書く前に読んでおくと良い

ただし,最初に述べたように,統計手法そのものについての説明はそれほど多くない。タイトルにある「転ばぬ先」は検定などを終えた後の論文のそのものであり,検定そのものを必ずしも指していない点は注意。

第1章 統計分析を行う前に
第2章 そのグラフ、大丈夫ですか
第3章 その表、大丈夫ですか
第4章 有意差の意味を理解して、正しい記述を!
第5章 統計記号や参照マークも正確に!
第6章 t 検定にまつわるDon’ts
第7章 相関係数の検定(無相関検定)にまつわるDon’ts
第8章 χ2 検定にまつわるDon’ts
第9章 分散分析にまつわるDon’ts
第10章 サンプル数が検定結果に影響を及ぼす!

ちなみに,ひつじ書房のサイトで連載をしていたものの書籍化なので,以下のサイトで連載版を見ることが出来る。

https://www.hituzi.co.jp/hituzigusa/category/rensai/toukei/

Nicklin, C., & Vitta, J. P. (2021)

Nicklin, C., & Vitta, J. P. (2021). Effect‐Driven Sample Sizes in Second Language Instructed Vocabulary Acquisition Research. The Modern Language Journal, 10.1111/modl.12692

本研究では、指導による第二言語語彙獲得(L2 IVA)の研究81件を2つの段階に分けて分析した。第1段階では、研究の効果量を分類し、コード化した。基本的な被験者間デザインと被験者内デザインの二分法では、観察された効果の不均一性を捉える感度が不足していたため、より詳細なアプローチを採用した。被験者間デザインと被験者内デザインの両方において、指導と比較の対照は、L2 IVA実験で最も関心の高い比較を最もよく表しており、効果量(g)の中央値は0.62(被験者間)と0.25(カウンターバランスを取った被験者内)であった。第II段階では、第I段階で観察された効果量の集計値を、一般的なL2 IVA分析のおおよそのサンプルサイズを示すために、事前に行うパワー分析のシミュレーションに利用した。保守的なパワーを与えた被験者間デザインでは、シミュレーションでは292~492人のサンプルサイズが提案された。カウンターバランスを取った被験者内デザインでは、反復測定の間に想定される相関関係に応じて、95~203人の被験者が必要であった。これらのシミュレーションの包括的な意味合いは、将来のL2 IVA実験では、先行研究の効果量を参照して,より大きなサンプルが必要であることを示唆している。本研究では,より大きなサンプルを得るという問題に対して3つの可能性のある解決策を提示している。

ggplot2の備忘録

毎回,グラフを作るときに忘れてしまうので,メモとして書き残しておこう。

まずは,サンプルデータで,基本的な折れ線グラフを書く。

library(ggplot2)
data.frame(day = 1:10, access =c(1,2,4,6,8,10,12,14,16,18))
ggplot(dat,aes(x=day, y=access))+geom_line()

見た目の変更1

ggplot(dat,aes(x=day, y=access))+geom_line()+ylim(0,30)+xlim(0,10)+labs(x="日付", y="アクセス数", title="アクセス記録分析")+theme_bw()

見た目の変更2

ggplot(dat, aes(x=day, y=access)) + geom_line()+ylim(0,30)+xlim(0,10)+labs(x="日付", y="アクセス数", title="アクセス記録分析")+theme_bw()+theme(panel.grid.major = element_line(colour = "#AAAAAA"), text=element_text(size=12, family="mincho"), axis.text.x = element_text(size=12),axis.text.y = element_text(size=12))

ポイント

theme(panel.grid.major = element_line(colour = “#AAAAAA”), text=element_text(size=12, family=”mincho”), axis.text.x = element_text(size=12),axis.text.y = element_text(size=12))

theme(panel.grid.major = element_line(colour = "#AAAAAA"), #補助線の目盛りのある方(major)の色を少し濃い目のグレーにする
text=element_text(size=12, family="mincho"), #図に中の文字フォントのサイズとフォントを変更
axis.text.x = element_text(size=12),#x軸の目盛りの数字を大きく
axis.text.y = element_text(size=12))#y軸の目盛りの数字を大きく

集計データを使って信頼区間付きのグラフを描く

タイトル通りで、95%信頼区間付きのグラフを描くのだけれど、今回は、集計したデータが手元にあって、それをggplot2を用いてグラフにする。エラーバーとかも同じ方法でよい…と言うか、エラーバーを95%信頼区間にしているだけ。

データとして、以下のような感じで平均点と[95%信頼区間]が与えられているとする。

  事前テスト平均点 事後テスト平均点
A群 30 [28, 32] 40 [38,42]
B群 50 [48, 52] 65 [63, 67]
C群 70 [68, 72] 85 [83, 87]

 

まずは、データの読み込み

x = data.frame (
time =c(1,2,1,2,1,2), #事前と事後
group =c("A", "A", "B", "B", "C", "C"),#群
means =c (30, 40, 50, 65, 70, 85),#平均点
lower =c (28, 38, 48, 63, 68, 83),#信頼区間の上限
upper =c (32, 42, 52, 67, 72, 87) #信頼区間の下限
)

それをグラフにする。

g = ggplot(x, aes(x = time, y = means, group = group))+ #データの読み込み
geom_line(aes(linetype=group),size=1)+ #折れ線グラフの作成。線種は群ごと。
geom_point(aes(shape=group),size=3)+ #折れ線の先に印を付ける。印の種類は群ごと
scale_x_continuous(breaks=seq(1,2,1), labels= c("事前", "事後")) + #x目盛りの制御
ylim(0,100) + #y軸の範囲指定
scale_linetype_manual(values=c("solid","twodash", "dotted")) + #線種の指定
theme_classic() + #全体のテーマ
geom_errorbar(aes(ymin = lower, ymax = upper,linetype=group), width = 0.8, size =1,) #信頼区間の付加

それを描画する。

plot(g)

リッカートスケールで得たアンケート・データの視覚化:likert Package + HH package (その2)

以前のブログ記事で,likert packageを使った視覚化について書いたけれど,今度はHH packageも使う方法。データとしては以前と同じ,以下のイメージ。質問項目は,Q1からQ5まであって,例えば,1が「全く良くない」で,5が「とても良い」のような5件法だとする。データのcsvはこちら

Q1Q2Q5
145
533
….
library(HH)
library(likert)
library(plyr)
dat=read.csv("likert_test.csv", header= T) #データの読み込み
  dat2=data.frame(lapply(dat, factor, levels=1:5)) 
#datの中身をfactor(文字列)に変換。その際に,五件法なので範囲を1から5までとする。つまり,ある設問への反応として1が含まれていない場合などでも,1が0回とするための処置。その上で,データ・フレームにする
  HH::plot.likert(  #HHでPlotを出す
  likert::likert(dat2), #likert packageで集計する
  col=rev(grey(seq(0,1,0.25))), #1を白,5を黒,中間がグレーの指定。revをしているので,これを外すと5が黒,1が白。また,1から5段階なので,0.25ずつグラデーションにする。
  main ="TEST1" タイトルはTEST1とする
  )

Itemの順番がQ5からQ1になっているのが気になるのと,1が白字なので,枠線がないと見えない。これらを解消。

HH::plot.likert(
  likert::likert(dat2),
  col=rev(grey(seq(0,1,0.25))),
  main ="TEST2", 
  reverse=F,  #Itemの順番を上からQ1の順に
  border = c("#111111", "#111111", "#111111", "#111111", "#111111") #グラフの周りを黒枠で囲む
  )

グラフの中に%で数値を入れたい。

以下のFunctionはStakFlowのこちらの答えから引用し,変更したもの。グラフ内に数値%を表示する。

myPanelFunc = function(...){
  panel.likert(...)
  vals <- list(...)
  DF <- data.frame(x=vals$x, y=vals$y, groups=vals$groups)
  
  ### some convoluted calculations here...
  grps <- as.character(DF$groups)
  for(i in 1:length(origNames)){
    grps <- sub(paste0('^',origNames[i]),i,grps)
  }
  
  DF <- DF[order(DF$y,grps),]
  
  DF$correctX <- ave(DF$x,DF$y,FUN=function(x){
    x[x < 0] <- rev(cumsum(rev(x[x < 0]))) - x[x < 0]/2
    x[x > 0] <- cumsum(x[x > 0]) - x[x > 0]/2
return(x)
}) subs <- sub(' Positive ,'',DF$groups) collapse <- subs[-1] == subs[-length(subs)] & DF$y[-1] == DF$y[-length(DF$y)] DF$abs <- abs(DF$x) DF$abs[c(collapse,FALSE)] <- DF$abs[c(collapse,FALSE)] + DF$abs[c(FALSE,collapse)] DF$correctX[c(collapse,FALSE)] <- 0 DF <- DF[c(TRUE,!collapse),] DF$perc <- round(ave(DF$abs,DF$y,FUN=function(x){x/sum(x) * 100})) ### panel.text(x=DF$correctX, y=DF$y, label=paste0(DF$perc,'%'), cex=1.0,col=c("black","black","black","white","white")) } #ここは数値と%の表示色を決める。今回は白字とグレーと黒なので,それに合わせて変更している。

以下がPackageを使用したスクリプト

origNames=rownames(dat) #Functionで使うデータの定義
HH::plot.likert(
  likert::likert(dat2), 
  col=rev(grey(seq(0,1,0.25))),
  main ="TEST3", 
  reverse=F, 
  border = c("#111111", "#111111", "#111111", "#111111", "#111111"), 
 panel =myPanelFunc #上で定義したFunctionを使う。
 )

リッカートスケールで得たアンケート・データの視覚化:likert package (その1)

Google formでアンケートデータを取ることが増えているので,その視覚化のための備忘録。使うパッケージはlikert
データとしては,以下のイメージ。質問項目は,Q1からQ5まであって,例えば,1が「全く良くない」で,5が「とても良い」のような5件法だとする。

Q1 Q2 Q5
1 4 5
5 3 3
….
library(likert)
library(plyr)

dat=read.csv("likert_test.csv",na.strings=c("", "NULL")) #データの読み込み。実際のデータでは,空白,つまり無回答ということもあるので,空白をNAと判定させる。
dat2 <- data.frame(lapply(dat, factor, levels=1:5)) #datの中身をfactor(文字列)に変換。その際に,五件法なので範囲を1から5までとする。つまり,ある設問への反応として1が含まれていない場合などでも,1が0回とするための処置。その上で,データ・フレームにする。
dat2 <- na.omit(dat2) #念のため,NAデータを削除

dat3 <- likert(dat2) #各設問への反応をまとめる
likert.bar.plot(dat3, #対象データファイル
        ordered=FALSE, #反応の順番。1から5の順。
        group.order=c("Q1","Q2","Q3","Q4","Q5"), #今回の場合,指定しないと反応1が少ない順に並べられる。ここでの指定では,Q1からQ5への並べる 
        plot.percent.high=FALSE,#指定しないと,高い反応(4と5)の割合(%)を表示
        plot.percent.low=FALSE, #指定しないと,低い反応(1と2)の割合(%)を表示
        plot.percent.neutral=FALSE, #指定しないと,中間の反応(3)の割合(%)を表示
        plot.percent=TRUE #指定すると,各反応の割合を表示
)
+theme_bw() #プロットの背景色などのスタイルを指定。今回は白黒。
+theme(legend.position = "bottom", #凡例をプロットの下に表示。
legend.direction = "horizontal" #水平に配置。
)

Radar Chartを描く(plotrix) その3

備忘録その3ですが,その2の落穂拾い。凡例をつけて見やすくする。なので,データ例は,その2と同じ。

library(dplyr)
library(plotrix)

dat=read.csv("test2.csv") #データ読み込み

dat2 = dat %>% #datを対象とした以下の処理をして,それをdat2へ入れる
   gather(Section_Year,Score, -ID) %>% #縦長のデータにする。Section_Yearという新しい変数を作り,SectionX_20xxデータを並べる。Scoreはの横に配置。IDは入れない。
   separate(col="Section_Year", sep="_", into=c("Section", "Year"))%>% #Section_Yearを_を区切りに分けて,SectionとYearを別々の列とする 
   group_by(Section,Year) %>% #SectionとYearでグループ化する
   summarize(mean=mean(Score)) %>%  #Scoreの平均を出す
   spread(Section, mean) #横向きデータに変更

 dat3 = select_if(dat2, is.numeric) #数値しか入れられないので,数値以外は削除。

 radial.plot(dat3, #データ入力
       rp.type = "p",  #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
       start = pi/2, #グラフを始める位置。Section1を12時にする。
       radial.lim=c(40,60), #軸の範囲。
       labels=colnames(dat3), #項目名
       line.col=1:2, #線の色。ここでは1(黒)と2(赤)。
       lwd=2, #線の太さ。
       lty=1:2 #線の種類。ここでは1(実線)と2(点線)。
              show.grid.labels =FALSE #軸のラベル(数値)が邪魔な場合はFALSEで表示させない。

)
legend("bottomright", #表示させる位置
    legend=c("2016", "2017"), #表示させるもの 
    col=1:2, #線の色(グラフ本体と合わせる)
    lty=1:2  #線のスタイル(グラフ本体と合わせる)
)

Radar Chartを描く(plotrix) その2

備忘録その2。よくもらうデータのタイプとしては,以下のようなものもある。

ID Section1_2016 Section4_2016 Section4_2017
1 49 71 8
2 98 28 5
3 55 51 30
4 91 2 47
5 60 20 56
30 90 17 44
library(dplyr)
library(tidyverse)
library(plotrix)

dat=read.csv("test2.csv") #データ読み込み

dat2 = dat %>% #datを対象とした以下の処理をして,それをdat2へ入れる
      gather(Section_Year,Score, -ID) %>% #縦長のデータにする。Section_Yearという新しい変数を作り,SectionX_20xxデータを並べる。Scoreはの横に配置。IDは入れない。
      separate(col="Section_Year", sep="_", into=c("Section", "Year"))%>% #Section_Yearを_を区切りに分けて,SectionとYearを別々の列とする 
      group_by(Section,Year) %>% #SectionとYearでグループ化する
      summarize(mean=mean(Score)) %>%  #Scoreの平均を出す
      spread(Section, mean) #横向きデータに変更
 
dat3 = select_if(dat2, is.numeric) #数値しか入れられないので,数値以外は削除。

radial.plot(dat3, #データ入力
     rp.type = "p",  #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
     start = pi/2, #グラフを始める位置。Section1を12時にする。
     radial.lim=c(40,60), #軸の範囲。
     labels=colnames(dat3), #項目名
     line.col=1:2, #線の色。ここでは1(黒)と2(赤)。
     lwd=2, #線の太さ。
     lty=1:2 #線の種類。ここでは1(実線)と2(点線)。
)

うーん、もっとスマートな整形の仕方はないものか。

Radar Chartを描く(plotrix) その1

Radar Chartを描く方法をいくつか試したので、備忘録的に書いておく。
今回は,plotrixを使用した。

データとしては、個人的にエクセルでもらうことの多い、以下のような形式。ファイル名は取り合えず、test.csvとしておく。

ID Section1 Section2 Section3 Section4
1 40 30 50 79
2 72 65 24 77
3 24 15 10 31
30 26 14 97 53

 

library(dplyr)
library(plotrix)

dat=read.csv("test.csv")
dat$ID=as.factor(dat$ID) #IDはfactorに変換

dat2=dat %>% summarize_if(is.numeric, funs(mean)) #dplyrのsummarizeで、numericの列だけ平均を出す。

radial.plot(dat2, #データの入力
     rp.type="p", #表示方法。オプションは、r (中心から直線が出る),p (線で結ぶ),s (点のみ)
     start = pi/2, #グラフを始める位置。Section1を12時にする。
     radial.lim = c(50,56), #軸の範囲。
     labels = colnames(dat2), #項目名
     clockwise = TRUE #時計回りに表示
)