ゼロから始めるプログラミングの学習日記

未経験の状態からプログラミング初めます

ChatGPT(3.5)とRでのプログラミング

貧乏性なので課金してない

とっても貧乏なので、「3.5でいいだろう!」とお布施を払わずに使っている。
そのせいか、R4.0以降はなんだか見放されてると感じる瞬間もしばしば、特にテキストマイニング(ここは諦めてpython)


そんなわけで、表題の話。
3.5で問題はないのだけれど、会話がループするときがある。
設定で解決できるのかもしれないけれど、VScodeのターミナルが、長いプログラムを$で省略するせいで
「プログラムが間違っています」と$以降を書いてくれる時がある。


すると会話が堂々巡りになるので、必ず元のプログラムとエラーを書くようにする。


あとは、プログラムを信用しないこと。
変数名というかオブジェクト名とか大体間違えているし、勝手にダミーデータ作ってくれるから…
確認にはありがたいけど、自分で作ったくせに、ダミーデータでもエラー出たりする。だから、要注意


基本的には、そんな感じなんだけど、「一般名詞の,区切りだるいな」、とかいうときは投げればやってくれるのでありがたい。
これも変なところ省かれるけど…


そんな具合で、仲良くさせてもらっている。
次は、お金を出して、Github Copilotと仲良くしたいな…

R言語:並列処理

処理をしていると激烈に重いときがある

時間がかかる処理については、並列処理をする。
並列処理とは、使用可能なコアを並列で使うこと。

使用可能なコアの確認は、

# 必要なlibrary
library(parallel)
# 使用可能なコアの数を取得する
cores <- detectCores()
print(cores)

で、print結果が出る。
あまり気にしなくても良いのだろうけれど、自分は3/4のコアだけ使用して並列処理している。

library(parallel)
library(foreach)

# 使用するコアの数を指定
cores_to_use <- detectCores() * (3/4)  #フルで使うなら、* (3/4)を省く
print(cores_to_use)
# パラレルバックエンドの設定
cl <- makeCluster(cores_to_use)  # 指定した数のコアをクラスターに追加
registerDoParallel(cl)  # foreachでのパラレル処理に使用


#並行処理用のプログラム書く
#(普通のプログラムじゃなくて、foreachとか盛り込む感じ)

# 終了処理
stopCluster(cl)  # クラスターを閉じる

という具合。
途中の処理プログラムの構文がよく分からなくて悩んでる。
本当にわからないときは、GPTに聞いたりで対応。


どのくらいかかっているかを確認するために、開始時刻と終了時刻を記録してます。

start <- Sys.time()
print(start)


#プログラム

end <- Sys.time()
print(end)

print(end - start)

という感じ。


並列処理しないで、朝見たら13時間回っていて、かつ期待した結果になってなかったときは、結構へこんだ。

プログラム作成遍歴

まったく更新していなかった

全く更新していませんでした。
HTMLやCSSなど趣味で書いていましたが、デザイン系はあまり合わないことが分かってきたので、
もともと大学・大学院で触れていたRに近い(?)統計のためのプログラムを書くことにしました。
でもいきなり「Rが書けます!データに触れるの仕事させてください!」と言ったところで転職活動では箸にも棒にもかからず…
最終的に、未経験ながらSASのプログラマとして拾ってもらいました。

SASってなんじゃい!

SASってのは、よくわかりませんでしたが、librayを読み込む必要もなく、
procだけで完結することが多かったので、非常に書きやすい印象でした。
が! Rやpythonのようなオープンソースではないため、サンプルコードなどは公式のサイトか、ユーザー総会の記事か、
「忘備録」や「100万回(?)」というような無償で分かりやすい解説を載せてくれている有難い方々に頼ることがほとんどでした。
というか、それしかなかった…
あとは、先輩が作成したマクロを回して作業するというか…そんな感じでした。
マクロの導入や他のプログラムを呼び出す、図表の作成などは非常にやりやすかった印象です。
しかし、オープンソースではないこと、かなり業界が絞られていることから、古巣のRに戻りたいな、という気分になってしましました。

ということで転職

SASの経験が少しでもある、ということでデータ周りの仕事を任せてもらうことになりました。
現在は、Rとpythonでプログラムを書いています。
基本的には、「csvで出力されたデータを結合したり加工したりして、データを整える」という割と簡単な作業になります。
まあ、データ周りの仕事に飛び込んでからまだ日が浅いので、少しずつ、少しずつ、という感じです。

今後の更新について

今後は、Rやpythonでの作業の忘備録をつけていきたいと思います。
仕事上でもメモを残したりはしていますし、簡単な説明文を書いたりはしているのですが、
自前のPCやらスマホから確認するために書いていきます。

もうゼロから始まってないじゃないか!
あと、markdownの書き方忘れてる…

課題:Rの基本的な準備・処理

Rにおける統計処理の準備・基礎

Rで統計処理していくための準備と基礎

目次

  1. 集計表の作り方
  2. .csvデータの読み込み
  3. データの種類
  4. データの整理
  5. パッケージの使用
  6. 演算子や関数など


集計表の作り方

基本的にデータは 縦方向(行)に被験体 / 横方向(列)に試験項目がくるようにテーブルを作る。
例としては以下の通り

試験項目1 試験項目2 試験項目3
被験体1 XXX YYY ZZZ
被験体2 XXX' YYY' ZZZ'
被験体3 XXX'' YYY'' ZZZ''


集計データ(csvファイル)の読み込み

集計されたデータは、csvファイルにして(txtの場合もあるので、そこは臨機応変に)取り込みたい。
今回は、irisのデータセットを使って練習したいので、

write.csv(iris, "Sample_iris.csv")
でirisのデータセットをSample_iris.csvというフォルダ名で書き出す。

excle,csv,txtなどのデータは必ず作業しているディレクトリ(同じファイル内)に保存すること。
そうでないとRは認識してくれない。
同じディレクトリに保存されたファイルを読み込むには、

read.delim("ファイル名.拡張子")を使う。
これだと、,で区切られたテキストデータとして読み込まれるようだ。
csvファイルを読み込むには、
read.csv("ファイル名.csv")を使う。
この場合は、テーブルの体裁を保って読み込まれる。


Rにおけるデータの種類

ここで、Rにおけるデータの種類を確認しておく

  • numeric型
    数値データのこと
    • 実数の場合はdouble型
    • 整数の場合はintegar型 となる。
  • factor型
    カテゴリデータのこと。
    factor型では、文字配列のカテゴリをダミー変数として扱うことができる。
    作図や統計解析の対象の場合はこちらを使用。
  • charactor型
    文字列を文字として扱う場合に使用し、変数としてカウントされない。
    注意書きのような文字データの場合はこちらを使用する。

基本的な統計では、上記3種類を使用するが、日付や時刻を扱う場合など、使う場面において様々な種類のデータの形がある。


データを整理する

  • ベクトル
    複数のデータの集合をベクトルという。
    このベクトルは必ずしも数値である必要はなく、文字列もベクトルとして扱われる。
文字、数値をベクトルとして扱いたい場合、
c()を使って、
c(1,2,3,4)
c("文字1","文字2","文字3")
とする。
  • データフレーム
    データフレームは行と列の2つの要素からなり、列が変数、行ごとに各変数の値が入力された構造となっている。
    例を挙げると

変数1 変数2 変数3
サンプル1 サンプル1の変数1 サンプル1の変数2 サンプル1の変数3
サンプル2 サンプル2の変数2 サンプル2の変数2 サンプル2の変数3
サンプル3 サンプル3の変数1 サンプル3の変数2 サンプル3の変数3

という感じ。
例えば、

性別 体重 身長
63.2 172.3
50.0 149.5
70.4 173.8

というデータフレームを作成したい場合は、

data.frame(
性別=c("男","女","男"),
体重=c(63.2,50.0,70,4),
身長=c(172.3,149.5,173.8)
)
とする。

  • オブジェクトの作成
    結果やデータを取り出すためにオブジェクト化する。
    例えば、先のデータフレームをdataという名前のオブジェクトに保管したい場合、

data <- data.frame(
性別=c("男","女","男"),
体重=c(63.2,50.0,70,4),
身長=c(172.3,149.5,173.8)
 )

とする。


パッケージを使用する

パッケージをインストールしたい場合は、

install.package()
パッケージをラブラリから呼び出す場合は、
library()
で呼び出す。
ライブラリからの呼び出しは、ファイル毎に行う。
「前回呼び出したから、今回は大丈夫かな?」とはならないので要注意。


演算子・条件式・数学関数・関数

  • 演算子

    加算 減算 乗算 除算 べき乗
    + - * / ^
    整数範囲での除算 整数範囲での除算数の剰余
    %/% %%
    代入 永続代入
    <- <<-

    代入では関数終了後に無効となるが、永続代入では代入終了後も有効。

  • 条件式

    等号 否定等号(≠) 以上 以下 より大きい より小さい 否定
    = != >= <= > < !

    論理積 条件での論理積 論理和 条件での論理和 排他的論理和 含まれる
    & && || xor() %in%
    • 要素の指定

    データセット中の要素の指定 ベクトル中の要素の指定
    $ []
  • 数学関数

    • 三角関数

    正弦関数 余弦関数 正接関数 sinの逆関数 cosの逆関数 tanの逆関数
    sin(x) cos(x) tan(x) asin(x) acos(x) atan(x)
    • 対数
    対数 yを底とした対数 10を底とした常用対数 2を底とした常用対数
    log(x) log(x,base=y) log10(x) log2(x)
    • 指数・平方根・絶対値
    指数(ex) 平方根 絶対値
    exp(x) sqrt(x) abs(x)
    • 整数部分・切り捨て
    整数部分 小数点以下yで切り捨て 切り捨て 切り上げ
    trunc(x) round(x,y) floor(x) ceiling(x)
    • 数列

    xからyまでの公差1の等差数列 xからyまでのz間隔の数列 ベクトルxをy回繰り返した数列
    x:y seq(x, y, by=z) rep(x, y)

課題:markdownで備忘録を残す

markdownの使い方

markdown記法で備忘録をつけながら言語の勉強ができれば「あれ?どうやるんだっけ」という問題を解決できる。
ここでは、VScodeでのmarkdownの書き方を備忘録として残しておく。

目次

  1. 目次の作り方
  2. シンタックスハイライトの使い方
  3. 見出しの設定と改行
  4. テーブルの作成
  5. 文字の大きさや色を変える
  6. 画像の挿入
  7. PDF化



目次の作り方

markdownで目次を作るのは以下の通り

### 目次
1. [項目1](#item1)
2. [項目2](#item2)
各項目の(#)、#のあとには、
<div id="item1"></div>

### 項目1

のように各項目に<div id=""></div>で指示したidを記入。<div></div>の後は必ずenterで改行する。
この時、idを日本語にしてしまうと、VScodeのMarkdown PDFでは、ハイパーリンクしないので英数を使う。


シンタックスハイライトの使い方

例えばマークダウンでシンタックスハイライトを使いたい場合、
```markdown
内容
```
と書く。`は本来半角だが、半角で書くと即シンタックスハイライトになってしまうのでここでは全角。 `はshit+@。
もちろん、markdownだけでなくhtmlやR、pythonなどにも対応している。
小文字じゃないと反映されないということもあるので、うまくできない時は都度調べる。


見出しの設定と改行

見出しを設定するためには、

# の数で見出しの大きさが決まる。
# なら見出し1
## なら見出し2
### なら見出し3

enterでは改行されない。
行の最後にスペース(␣)二回で改行。
見出しと見出しの間に一行空白を入れたい時は、

</br>

で対応する。

見出し1

見出し2

見出し3

行1␣␣
行2


テーブルを作成する

テーブルを作るには、

||head1|head2|head3|
|:---:|:---|:---:|---:|
|label|data1|data2|data3|
で書き込んでいく。  
|:---|で右、|:---:|で中央、|---:|で左揃え。
テーブルを閉じるには、ダブルスペースの後に改行。
例のようにhead部分最初に||を入れると空白のセルができる。
head1 head2 head3
label data1 data2 data3

テーブルのサイズを調整したい場合にはhtmlで対応する。

  <style>
  .smalltable > table, .smalltable > th, .smalltable > td {
   font-size: 90%;
  }
  </style>
  <div class="smalltable">   
  
  テーブル
  </div>

先ほどのテーブルを60%に縮小すると、

head1 head2 head3
label data1 data2 data3

という感じ。 テーブル全てに適用されてしまうので、samalltable1,2などナンバーをつけて対応する。
はてなブログでは、divを閉じてしまうとhtmlが反映されない。
styleの前に2つ半角スペースを入れる必要もあるみたい。
VScodeとの違いなのか、web的にはそっちが当たり前なのか…


文字の大きさや色を変える

これもhtmlで対応する。

<span style="font-size:x%;color:xxx">
文字
</span>
で書く。
この時はhtml形式になるようでダブルスペースで改行が効かないので</br>で改行する。
試しに文字を200%拡大して赤くしてみる。
文字


画像の挿入

これもhtmlで対応する。

<img src= "">
の""内に画像のパスを入力する。
画像をコピーしたものをペーストすればいい。
この時、画像は画面の幅いっぱいのサイズで挿入される。
試しにmarkdownのロゴを挿入してみると以下のようになる。 2枚の画像を横並びにしてサイズを調整して中央寄せしたい場合、
<div style="text-align: center;">
<img src= "" width=""><img src= "" width="">
</div>
とする。img srcの""には画像バス、widthの中にはサイズを入れる。
htmlなのでwidthには、画面に対する%でもpxでも指示できる。
markdownのロゴを200pxで中央横並びに設定すると
という感じになる。


VScodeで書いたmarkdownをPDF化する

MarkdownPDFという拡張機能をインストールしてあれば、 shift + comand + Pでコマンドパレットを開いて、 markdown-pdf: Export (pdf)を選択すれば、PDFとして保存される。 Markdown PDFでは、id=を日本語で指示したリンクはハイパーリンクとして表示されない。idは必ず英数で指示すること。

課題:pythonで(簡単な)仮説検定をしたい

パッケージのインストールはpip3 installで

pythonでの仮説検定も基本的にはRと同じでpackage頼りです。
肝になる部分は「どのpackageをどこで使うの?」ということだと思います。
簡単な仮説検定まで一気に紹介していきましょう。
スクリプトの詳しい内容や検定の説明については、統計の参考書や他のサイトに任せて、
「なんだか分からないけどできるわ」を目指しました。

検定する前の準備

「よし、検定しよう!」と思っても何かしらデータがなければ意味がありません。
ここで、データの整理の仕方を確認していきましょう。

必要そうなpackageはimportしていく

Rと違う点は、まずpythonファイル上でpackageをimportする指示を出すところです。
installさえされていれば、import ほにゃららと書くだけで非常に簡単です。

import pandas as pd  
# dataframeを作るのに必要  
import numpy as np  
# 平均・中央値・分散・偏差などが計算できる
import statistics  
# importする必要があるのかはよく分からなかったけど最頻値を計算するのに使った
import matplotlib.pyplot as plt  
# ヒストグラムなど図表を描く
from scipy import stats  
# ほとんどの仮説検定するのに使った
from statsmodels.stats.multicomp import pairwise_tukeyhsd
# チューキークレイマー検定をするのに使った
import scikit_posthocs as sp 
# スティール・ドゥワス検定をするのに使いたかったがうまくrunできず
お作法がありそうです

例えば、

import pandas 

とすれば、pandasがimportされ指示が出せますが、pdとしてimportするのが普通みたいです。
numpy (ナンピーじゃなくてナンパイなんだってさ)の場合もnpとしてimportします。
上述の通りですが、名前を付けてimportする場合は、as ほにゃほにゃとしてimportしておきます。 正直、この辺はよく分かっていないので、周囲の人に聞くか仕様書に合わせて書くのが無難そうですね。
(他の人が見たときに「なんじゃこりゃ」となると非常に迷惑をかけるので)

csvファイルの読み込み

pythonでcsvファイルを読み込むとき、2行目の列だけ読み込みたい場合は、

pd.read_csv('practice.csv',usecols=[1])
# ここでは、practiceという名前のcsvファイルの2行目の列を読み込んでいます。
# 2行目なのになんで[1]なの?と思うかもしれませんが、これはpythonが0始まりでカウントするからです。  

ちなみに…毎回自分もこんがらがるのですが「行が横(水平方向)」で「列が縦(垂直方向)」らしいです。
英語では「行がrow」で「列がcolumn」です。
じゃぁ、userowsで指定した行が読み込まれるのか?というとそういう訳ではないようです。

データフレームと次元の平坦化

前述のpractice.csvというファイルを読み込む時にこれにAという名前をつけるとします。

A = pd.read_csv('practice.csv',usecols=[1])
# Aという名前にpractice.csvの2行目の列が格納されました。

このうちの1-30行のデータをA1to30として読み込みたい場合、numpyを使います。
numpyはnpとしてimportしているので、

A1to30 = np.array(A[0:29])
# arrayは配列という意味の英語です。
# くどいようですが、0始まりなので0〜29で1から30行を抜き出していることになります。

次に抜き出したA1to30という配列からA1to30dfというデータフレームを作るとします。
A1to30のDataFrameなのでA1to30dfです。

A1to30df = pd.DataFrame(data=A1to30)  
# Dataframeを作るには、pandasを使います。  

説明しやすいかな?と思ってAとかA1to30とか直感的な名前を使ってしまったので少し冗長な説明になってしまいましたね。

配列の次元?

配列には次元という考え方があります。
例えば、 AさんとBさんとCさんの走った距離について考えましょう。
「Aさんは3km走った」「Bさんは1.5km」「Cさんは6km走った」という場合、1行(行は横でした)だけで管理できそうですね。
これが1次元データです。
ここにAさん、Bさん、Cさんが走るのにかかった時間をデータとして足してみましょう。
「Aさんは3kmを30分で走った」「Bさんは1.5kmを10分で走った」「Cさんは6kmを60分で走った」とすると、
今度は、2行で管理することになります。これが2次元データです。
さらにAさん、Bさん、Cさんが走りながら飲んだ水の量をデータとして足すとどうなるでしょうか。
「Aさんは3kmを30分で走りながら100ml飲んだ」「Bさんは1.5kmを10分で走りながら50ml飲んだ」「Cさんは6kmを60分で走りながら150ml飲んだ」
となると、今度は3行のデータになります。これが3次元データです。
このようにデータの種類(観測点)が増えていくほど、配列の次元も増えていきます。

多次元配列を平坦化する

配列には次元があり、多次元のままでは比較ができません。そこで、多次元のデータを平坦化して1次元にしてやります。
※この辺りは自分もよく分かっていませんが、仮説検定のいくつかは平坦化したデータでしか実施できないものがありました。
practice.csvというファイルのデータAの中から2列目を抽出して、1から30行目を読み込みA1to30として名前をつけます。

A = pd.read_csv('practice.csv',usecols=[1])
A1to30 = np.array(A[0:29]) 

これでは、行が1から30ある多次元のデータ(独立したデータ)ということになってしまうので、これを平坦化します。

A1to30fl = A1to30.fatten

これでpracticr.csvから抜き出した1から30行のデータが1行の平坦化されたデータとしてA1to30flとして格納されました。

いよいよ統計処理(記述統計?)

平均 / 中央値 / 最頻値 / 分散 / 不偏分散 / 標準偏差の計算

まずは記述統計の範囲(?)です。簡単な部分から触れていきたいと思います。
ここではAというデータに対して処理を行なっていきます。

#ここでは、データフレームAdfから配列Aをすでに準備しているものとします。

import numpy as np
import statistics 
#numpyとstatisticsをimportしています。

np.mean(A) #配列Aの平均
np.median(A) #配列Aの中央値
statistics.mode(Adf) #データフレームAの最頻値
np.var(A,ddof=0) #配列Aの分散
np.var(A,ddof=1) #配列Aの不偏分散
np.std(A,ddof=1) #配列Aの標準偏差

以上です。
データさえ整っていれば、計算は一瞬で終わります。

ヒストグラム・qqプロット

視覚的に正規性を確認する場合、まずはヒストグラムとqqプロットします(マイルールなのかな?)

#ここでは、データフレームAdfから配列Aをすでに準備していて、Aを平坦化した配列Aflが準備されているものとします。

import matplotlib.pyplot as plt
from scipy import stats
#matplotlib.pyplotをpltとしてscipyからstatsをimportしています。

plt.hist(Afl) #ヒストグラムが描けます。これはデータフレームでもOK。

fig = plt.subplots(figsize=(8,8))
stats.probplot(Afl, dist="norm", plot=plt) #qqプロットが描けます。平坦化されたデータのみ。

plt.show() #作成したヒストグラム・qqプロットを表示する。

やはり、データが整ってさえいれば後は簡単ですね。
plt.show()で指示を出せば一気にヒストグラムとqqプロットの結果を表示してくれます。
ヒストグラムは裾の長さが等しい山形に近いか?qqプロットは直線上か?で正規性が視覚的に分かりそうですね。

複数のデータを比べる(箱ひげ図と散布図)

ここまでは、1つの標本について正規性だとか平均だとかを見てきましたが、多数の標本について比べる場合、
まずは箱ひげ図を書いてみたり、散布図を書いて「どういうデータなのかなー」とイメージを持つようにしています。
余計な憶測をすることになるかもしれないけど…

#ここでは、平坦化された配列Afl、Bfl、Cfl、Dflが準備されているものとします。

import matplotlib.pyplot as plt
#matplotlib.pyplotをpltとしてimport

plt.boxplot([Afl, Bfl,Cfl,Dfl]) #箱ひげ図が描ける。

plt.scatter(Afl, Bfl),plt.title("散布図のタイトル"),plt.xlabel("X軸の名称"),plt.ylabel("Y軸の名称"),plt.grid(True) 
#散布図が描ける。複数の処理は,で区切ってやるといい。

箱ひげ図や散布図を見るとなんとなーくこれから比べたいデータの傾向が見えてきます。

仮説検定の実施

さて、複数のデータを比べることにしたいので有意差が気になります。
ここで扱うのは、自分が普段使うような仮説検定だけになります。
そもそも自分のための備忘録か…

正規性の検定(シャピロウィルク検定とコルモゴロフ・スミルノフ検定)

データを比べる前に正規性の検定から。
一般にサンプルサイズが小さい時には、シャピロウィルク検定、1000を越える時にはコルモブロフ・スミルノフ検定を用いるようです。

#ここでは、  配列Aとそれを平坦化した配列Aflが準備されているものとします。

from scipy import stats 
#scipyからstatsをimportします。

stats.shapiro(A) #シャピロウィルク検定

stats.kstest(Afl, "norm") #コルモブロフ・スミルノフ検定

statsを使えば正規性の検定は簡単にできますね。p値を確認して正規性がありそうか確認できそうです。

相関に関する検定

相関係数に関して確認しておきたいこと
相関係数の基準 0~0.3未満:ほぼ無関係
0.3~0.5未満:非常に弱い相関
0.5~0.7未満:相関がある
0.7~0.9未満:強い相関
0.9以上:非常に強い相関
決定係数は、相関係数の2乗値で1に近いほど回帰直線の説明力が高い。 これを踏まえて、相関を見ていきます。

#ここでは、平坦化された配列AflとBflが準備されているものとします。  

import numpy as np 
from scipy.stats import spearmanr 
#numpyとscipy.statからspearmanrをimportします。  

np.corrcoef(Afl, Bfl) #ピアソンの積率相関係数  

spearmanr(Afl, Bfl) #スピアマンの順位相関分析

ピアソンは正規性が仮定できる場合に、スピアマンは正規性が仮定できない場合に用いるようです。

等分散性の検定

多群の等分散性の検定のバートレットとルビーンしかないけど、統計的には問題ない(らしい)。

#ここでは、平坦化された配列Afl、Bfl、Cfl、Dflが準備されているものとします。  

from scipy import stats 
#scipyからstatsをimportします。

stats.bartlett(Afl,Bfl,Cfl,Dfl) #バートレット検定

stats.levene(Afl, Bfl,Cfl,Dfl) #ルービン検定

バートレットは正規性が仮定できる時、ルービンは正規性が仮定できない時の検定。
pythonはF検定をカバーしていないようなので、これらで検定します。

正規性・等分散性が仮定できる場合の仮説検定(パラメトリック)

やっと本題というか、なんというか…
ここで一旦区切ろうとも思ったのですが、スクリプト見ているとそこまで長い説明にはならなそうなので、一気に書いていきます。

t検定

まずは、2群の比較です。t検定には対応がある場合とない場合がありますね。
対応があるというのは、
例えば、同じ人の血糖値が薬を飲む前と後で差があるか?というのを調べるような時です。
対応がないというのは、
例えば、2人の血糖値に差があるか?というのを調べるような時です。

#ここでは、平坦化された配列AflとBflが準備されているものとします。

from scipy import stats
#scipyからstatsをimportします。  

stats.ttest_rel(Afl,Bfl) #対応あり

stats.ttest_ind(Afl,Bfl) #対応なし

これだけです。p値で仮説を確かめましょう。

チューキー・クレイマー検定

Rと同じですが、データにそれぞれラベルをつけていく必要があります。
Rと同じとか言ってもあれか…

#ここでは、平坦化された配列Afl、Bfl、CflとDflがそれぞれサンプルサイズ30で準備されているものとします。

import numpy as np
from statsmodels.stats.multicomp import pairwise_tukeyhsd
#numpyとstatsmodels.stats.multicompからpairwise_tukeyhsdをimportします。

name = np.array(["A","B","C","D"]) #データの名前のセットをnameとして作る。
name_rep = np.repeat(name,[len(Afl),len(Bfl),len(Cfl),len(Dfl)]) 
#作ったセットをそれぞれの配列分の長さ分繰り返す配列をname_repとして作る。

value = np.array([Afl,Bfl,Cfl,Dfl]) #Afl、Bfl、CflとDflを一つの配列にvalueとしてまとめる。
#valueはこのままでは4次元配列。
valuefl = value.reshape(1,120)
#valueを1行120列(4配列がそれぞれサンプルサイズ30なので120)にvalueflとして平坦化します。

pairwise_tukeyhsd(valuefl[0],name_rep).summary() #チューキー・クレイマー検定

チューキー・クレイマーをするには少しテクニック?というかなんか小手先で対応する必要がありました。
Rで多重比較するときもラベルつけたりベクトルをいじったりするので、それと同じだと思います。
あとは、summary()をつけないと結果が表示されないので注意です。

正規性・等分散性が仮定できない場合の仮説検定(ノンパラメトリック)

いつも感動するのは、正規性も等分散性も仮定できないのに標本から母数が推測できる仕組みを作った人がいるんだな、ということです。
なんか、雑多なデータというか規則性がないように見えるデータにも法則を見出すことができるのは素直にすごいと思います。

welchのt検定

正規性は仮定できるけど等分散性は仮定できないような場合にするt検定です。

#ここでは、平坦化された配列AflとBflが準備されているものとします。

from scipy import stats
#scipyからstatsをimportします。  

stats.ttest_ind(Afl,Bfl, equal_var=False) #welchのt検定 

内容はすごく簡単で、t検定にequal_varがfalseですよ、つまり「等分散じゃないですよ」と指示するだけです。

ノンパラメトリックだけど対応あるなし2群比較

正規性も等分散性も仮定できないけれど、2群の比較をしたい場合に
対応がある場合、ウィルコクソンの符号順位検定
対応がない場合、マンホイットニーのU検定をします。

#ここでは、平坦化された配列AflとBflが準備されているものとします。

from scipy import stats
#scipyからstatsをimportします。

stats.wilcoxon(Afl, Bfl, alternative="two-sided").pvalue #ウィルコクソンの符号順位検定

stats.mannwhitneyu(Afl, Bfl, alternative="two-sided").pvalue #マンホイットニーのU検定  

ここまでで2群の比較はほぼ説明し終わりました。

ノンパラメトリックの多重比較

と、言いたいところですが、
チューキー・クレイマーのノンパラ版的なスティール・ドゥワスの検定はpackageがあるようですが実行できず。
多群と1つの対照群を比較するダネットの検定は探してもどうにも出てきませんでした。残念。
今回は、ここまでです。少し悔しいですが、RならサクッとできるのでやっぱりRの方が好き!という感じです。

まとめ

データの準備からノンパラメトリックな2群の比較までサラッと小手先で描いてみました。
Rをいじっている時やExcelでデータをなんやかんやしている時から感じていることですが、
データをうまく準備できさえすれば、あとはpackage任せです。
これでいいとは思えませんが、自分には0からスクリプトを書く技量もありませんし、とりあえずはこれでp値を見ていこうかな?と思います。
そもそもR studioが使えさえすれば見向きもしなかったpythonなので、一つ良い勉強になりました。
ノンパラメトリックな多重比較はRでやりたいし、そもそも検定ならRのほうが直感的で使いやすい気がしました。
また勉強し直したら全く逆のことを思っている可能性もありますが…

ちょっと調べるとpythonは予測することに長けていて、機械学習だとかそういうところで真価を発揮するようです。
Rは逆にこういった仮説検定とかすでにあるデータの説明が得意だとか。
今回仮説検定をpythonでできるようにしてみましたが、なんだかどのサイトもさっぱりしているというか、Rほど体系的にまとまっていないような印象を受けたのは、そのためかもしれません。

いつもなら「このサイトを引用したよ」とか「このサイトが分かりやすいよ」という引用元を示すのですが、
あまりにも多くのサイトを参考にしながらまとめたので、もう何がなんだか、どのサイトを見たんだか見ていないんだか分からないので、
今回は出来ませんでした…
もし、剽窃だと感じて「これはここにあるじゃないか!」と思う人がいたら是非コメントしてください。
ソース元を書く方が役に立つことの方が多いので。
あー疲れた!今回はおしまい。
次は、VSCodeでRの統計処理をしようかなと思ってます。
macが古すぎて、Rstudioが使えないのでね…

課題:macOS下ATOMを使ってpythonを動かしたい

macOS High Sierra(ver. 10.13.6)でpythonの環境構築

約9年間使ってきている古いmac book airのため、R studioのサポートも終了していました。
仮説検定やら何やらは今までRでやってきましたが「R studioも使えないしpythonの勉強でもしようかな」という気持ちになったので、pythonの環境構築をすることにしました。
お金があれば新しいmacを買えばいいんですが、お金もありませんし9年の間に留学やら学士論文やら修士論文やらを乗り切ったこのmacに愛着があるのでなかなか手放せずにいます。
まぁ、お金ができれば新型airを買います。

ちなみにこのエントリーはMarkdownで書いている

ブログを書いていない間に出来るようになったこととして、Markdownがあります。
Markdownの説明は、ダウンなのにマークアップ言語の一種で、HTMLよりも直感的に書ける気がして非常に便利です。 はてなブログには「見たまま」「はてな記法」「Markdown」「HTML」とあって、「見たまま」が一番楽かな。
が、備忘録としてスクリプト書いたりなんだりするのに、シンタックスハイライト(スクリプトに色をつける機能)があると便利なので、Markdownで書けるようにしました。
結構簡単です。
このブログを参考にしたわけではないですが、どれを参考に書いたか忘れてしまったので、一応書き方の参考として載せておきます。
Markdownにしても「箇条書き」とか「リンク」とか「ん?」という部分ははてなブログがしっかりサポートしてくれるのでとても有り難い。

本題の環境構築 (ATOM)

さて、すこし主旨からズレましたが、macでpythonの環境構築をしていく話をしましょう。
使ったことないのでかなり無責任ですが、多分Anacondaを使うのが一番楽です。
が、自分の場合は音楽でストレージがかなり圧迫されており、残り10GBとかなので余計なものはインストールしたくなかったので、これまで使っていたテキストエディタのATOMでpythonを動かせるので「それで行こう」と決めました。
難しいことはなく、調べてやればとても簡単だったので書いていきます。

macにpythonのインストールする

そもそもmacには標準でpythonがインストールされているらしいのですが、かなり奥地というか根幹のシステムと結びついているらしく(?)ターミナルからバージョンを確認します。

python --version

と書いてreturnを押せばバージョンが返ってきます。
今の自分の環境では、

Python 3.10.4

と返ってきます。最初はなんだったかなpython 1...とかそんなだった気がします。
バージョンを確認してpythonは1系とか2系とか3系とか(よくわからないけど)あるらしくて、とりあえず新しい物好きな自分は新しそうなpythonに更新することにしました。

さて、ターミナルからインストールしたいわけですが、どうやったらいいのか全く分からなかったので調べていきました。
するとどうやらHomebrewという何かよくわからないビールのやつ(パッケージマネージャー)をまずはインストールしろということでした。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

備忘録やらブログやらに書かれているまま素直にターミナルへコピペしてreturnを押します。
"Press RETURN to continue or any other key to abort"と言われ、なんやかんやでとりあえずインストールされたらしいということが分かりました。
ということで、このビールのやつをインストールできたので、次はpythonのインストールです。

pythonの最新版をインストールしたい場合brewさんにお願いして、

$ brew install python3

とターミナルに打ち込みreturnを叩きます。
するとなんかインストールされます。
これでpython3系(?)の最新版がインストールされました。
またもや読んだサイトを失念してしまったのでググりなおして良さそうなサイトを参考としておきます。

pythonで使うパッケージをインストールしたい

Rでもそうですが、自分の場合スクリプトをゴリゴリ書くというよりライブラリからパッケージを呼び出して処理してもらいます。
というかそれがRやらpythonの良さな気がします。
ということで使いそうなパッケージをインストールしたいわけです。
これは超簡単です。
「あ、これ良さそうだな」とか調べて書いたときに「えーこんな処理できないよ」という時にはターミナルに

pip3 install インストールしたいパッケージ

と書くだけです。

pythonはインストールしたのでATOMで使う

ここまでやれば、macに入っているpythonは3系の最新版ということになります。
さて、それではATOM上で動かすときに便利なのが(必須なのか?) jupyterというカーネルを利用して「パッ」と実行結果を出してくれるHydrogenというパッケージをインストールすると吉です。
というわけでjupyterをpip3下にインストールしましょう。

pip3 install jupyter

はい、終わりです。これでインストールされます。
ATOMから指示を出してjupyterをインストールしてHygrogenを動かすことも出来るみたいですが、自分の場合は「カーネルがないです!」みたいに言われて何もできなかったので諦めました。
Hydrogenの説明とjupyterの関係?みたいのはこのサイトが割と分かりやすかったです。

これで環境構築ができた!けど元の木阿弥…

ここまでやれば、終わりです。ATOMでpythonが動きます。
が、残念ですねATOMは開発が終了し2022年12月15日にアーカイブされてしまいます。
憎きVidual Studio Code(VS Code)の台頭が原因だとか言われていますね。
残念ですが、Microsoftに魂を売ることにしました…

ということで次回は、pythonで出来るようになったことをまとめていきます。