satopoooonのブログ

自分向けの備忘録

t検定,プールした分散

対応がない場合のt検定

参考文献は以下、

http://www012.upp.so-net.ne.jp/doi/biostat/CT39/ttest.pdf

 

二つのグループをt検定する。

まず前提として、二つのグループ等分散、母分散は不明であるとする。

等分散じゃないと、t検定が使えない。

二つのグループのそれぞれの偏差平方和(s1,s2)から、プールした不偏分散を作る。

 

等分散なんだから、

二つのグループのデータを使って分散を求めた方が精度が良くね、

っていうモチベーションでプールする。

 

二つのグループをまとめた偏差平方和s = s1+s2

自由度はn = (n_1-1)+(n_2-1) 

よって、プールした分散はs = (s1+s2) / {(n_1-1)+(n_2-1)} 

となる。 

これを使ってt検定する。

 

なお、等分散じゃない場合はウェルチの検定となる。

等分散じゃなくてかつ母分散も不明の場合、

厳密に従う統計量は存在しない。

→近似的にはウェルチの検定でいける、

 

このへんは、

永田本「統計的方法の仕組み」p.185に記載している。

 

 

SQLで文字列を置換する方法

以下で可能、

REPLACE(column名,"置換前の文字列","置換後の文字列")

 

条件が複数の場合は、

REPLACE(REPLACE(column名,"置換前の文字列","置換後の文字列"),"置換前の文字列","置換後の文字列")

というように入れ子にする。

 

上記の方法だと、いちいちcolumn名を指定する必要がある。

→テーブルすべてに同一処理をしたい場合は、columnの数だけ上記の処理をする必要がありそう。

下のリンクでも、同じような悩みを持っている人が質問している。

回答としては、やっぱりcolumnの数だけsqlを書く必要がありそう。

全てのフィールドを一括置換する方法

C#、VB.NETでエクセル操作

#エクセルを操作
C#でエクセル操作をする.
開発環境は、Visual studio2017です。

エクセル操作のためのdllがあるんですが、
それはつかいませんでした。
今回は、NPOIというモジュール(?)を使います。
以下参考サイトです。

【C#】NPOIを使ってExcelファイルを作成・編集する - Qiita

Excelファイルを C# と VB.NET で読み込む "正しい" 方法 - Qiita

NPOIのインストール方法から掲載しています。

拡張子がxlsとxlsm両方に対応できているのがgood、

古いエクセル(EXCEL2013)しか対応していないPC用にPGを作成しようと思ったんですが、
Visual sturio2017からは対応のdll(Microsoft.Office.Interop.Excel)がインストールできなさそう。
調べてみたら、NPIOというものがあるぞということで使うことにしました

Sourcetree,Bitbucketの環境構築

ソースコードのver管理をどうする?

以下、Sourcetree、Bitbucketの環境構築および使い方についてのメモです。
参考サイトは以下です。

【連載Git入門 第2回】SourceTreeでGitを始めよう!まずは試しに使ってみよう! | naichilab - Android iOSアプリ開発メモ

ローカルリポジトリの作成

ソースコードの編集自体は、適当なIDEを使ってます。
pythonの編集の場合、僕はpycharmを使用しています。
pycharmでもgitの機能は使えるみたいですが、
Sourcetreeが使いやすいそうなので、そちらを使用することにしました。

以下、sourcetree使用の流れです。
まずは、pycharmで適当なプロジェクトを作成します。
プロジェクトは特定のフォルダ下に置かれます。

次にSourcetreeを立ち上げて、
「新規/ローカルリポジトリを作成」を選択します。
プロジェクトのパスを聞かれるので、
入力してあげるとローカルリポジトリが作成されます。
f:id:satopoooon:20180513134016p:plain

コミット、チェックアウト

ソースコードをpycharm上で編集します。
コミットしてあげると、それがブランチとして繋がります。
コミット履歴が羅列していますが、前のコミットを選択すると、
pycharm上のソースコードも、前のものに変わります(チェックアウト)。
詳細は参考サイトに書いてあります。

注意点として、前のコミットに戻した状態(チェックアウト)で新たにコミットすると、
以下のようになります。
最新版であるコミットの新1から、コミット古にチェックアウトします。
その状態で、新たにコミットすると、コミット新1は消えて、新2しか残りません。
これを防ぐには、チェックアウトしたときに、新2用のブランチを作成してからコミットすることです。

古→新1

→→新2
新2しか残らない。

ブランチを切る、mergeする、

ブランチを切ることで、サブの枝を作ることができます。
メインの枝が安定verのPGだとすると、サブの枝は開発verの枝というイメージです。
詳細は参考サイトに書いてあります。

リモートリポジトリを作成する。リモートリポジトリからクローンを作成する。

まずはBitbucketにアカウントを作成します。
アカウトを作成したら、sourcetreeからリモートリポジトリを作成します。
まずは、メニューバーの「Sorcetree/環境設定/アカウント/追加」で先ほど作成したBitbucketのアカウントを追加します。
通信方法がsshhttpsと設定できますが、とりあえずhttpsにしました。

アカウントを追加したら、
「新規/リモートリポジトリを作成」でリモートリポジトリを作成できます。
f:id:satopoooon:20180513134016p:plain

このとき、下記のエラーがでました。
「Too many invalid password attempts.〜〜〜〜〜(以下省略)」
Bitbucketのサイトに、ログインしなおしたら解決できました。

また、リモートタブを選択すると(上図参照)、リモートリポジトリの一覧が表示されます。 ここから、ローカルリポジトリにクローンすることができます。

一人で開発する分にはこれくらい使いこなせれば良いかと思います。

また、以下別の参考サイトも書いておきます。

Gitのインストール【チュートリアル1 Gitの基本】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

絶対できる!Source Treeの使い方を初心者向けに説明してみた! | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト

複数のグラフを一度に書く

seabornのグラフを一度に複数書く、

あるパラメータで層別して、複数のグラフを一度に描きたいです。 seabornのfacetgridを使います。 参考サイトは以下です。

Python でデータ可視化 - "Facet"で属性別グラフを一気に描く方法が便利すぎる - Qiita Python - seaborn.facetgridでの文字追加|teratail seaborn.FacetGrid — seaborn 0.9.0 documentation

以下コード

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

bins = np.arange(0, 65, 5)
tips = sns.load_dataset("tips")

#層別のパラメータが2種類ある場合は、col、rowで指定します。
#1種類の場合は、colのみで良いと思います。
g = sns.FacetGrid(tips, col="time",  row="smoker")
g = g.map(sns.distplot, "total_bill", bins=bins, color="r")

#各gridに対する、axisを読んで、テキストを埋め込みます。平均値とかを記載したときに良いかと、
for i in range(2):
    for j in range(2):
        ax = g.facet_axis(i, j)
        ax.text(40,0.04,"hoge")

plt.show()

f:id:satopoooon:20180416173350p:plain

sns.displot,sns.kdeplot でエラー(slice indices must be integers or None or have an __index__ method)

よくわからないエラーがでました。

statsmodelsを再インストールしたら治りました。

以下、参考サイト

https://qiita.com/currypurin/items/44ce22102af4eda45622

 

deming regression

回帰直線を引くときに、横軸にも誤差がある場合はdeming regressionという方法で 回帰直線をひく必要があります。 deming regressionとタイトルにありますが、 別名で直行回帰(Orthogonal distance regression)ともいうらしいです。

scipyにOrthogonal distance regressionが実装されていたのでそいつを活用、

以下参考サイト、 ・scipyの公式サイト https://docs.scipy.org/doc/scipy/reference/odr.html ・deming regressionの説明 産総研の方による説明です。 https://staff.aist.go.jp/t.ihara/deming0.html ・deming regression

import numpy as np
from pandas import DataFrame

from sklearn.datasets import load_boston
from scipy.odr import Model, RealData, ODR
import matplotlib.pyplot as plt

from scipy.stats import linregress
#%matplotlib inline

#例によってボストンのデータを使います
boston = load_boston()

# 説明変数をDataFrameへ変換
df = DataFrame(boston.data, columns = boston.feature_names)
#目的変数をデータフレームに追加
df['MEDV'] = np.array(boston.target)

x = df["RM"].tolist()
y = df["MEDV"].tolist()

#deming regressionで使用する、関数を定義
def f(B, x):
    '''Linear function y = m*x + b'''
    # B is a vector of the parameters.
    # x is an array of the current x values.
    # x is in the same format as the x passed to Data or RealData.
    #
    # Return an array in the same format as y passed to Data or RealData.
    return B[0]*x + B[1]

linear = Model(f)

#scipyのlinregressで線形回帰、
##odrする際の、初期値を決めるためです、
linreg = linregress(x, y)
mod = Model(f)

#生データの代入、sx,syは,目的変数、説明変数のばらつきの標準偏差です。
#odrメソッドの引数に、目的変数、説明変数のばらつき、初期値を入力します。
dat = RealData(x, y,sx=1,sy=1)
od = ODR(dat, mod, beta0=linreg[0:2])
out = od.run()

fig = plt.figure()
subplot = fig.add_subplot(1,1,1)

subplot.scatter(x,y)
#linex = np.linspace(6.5,8,100)
#liney = out.beta[0]*linex + out.beta[1]
#subplot.plot(linex,liney)
subplot.plot(out.xplus,out.y,color='red')

#普通に線形回帰した場合の直線もひいてみます。
x_max = max(x)[f:id:satopoooon:20180326230958p:plain]
x_min = min(x)
linex = np.linspace(x_min,x_max,100)
liney = linreg[0]*linex + linreg[1]
subplot.plot(linex,liney,color='yellow')

plt.show()

実行すると、こんな感じになります。 f:id:satopoooon:20180326230958p:plain