クリスマスにBoostrapのformタグに苦しめられた話
の24日目の記事です。リア充してたら1日遅れました
昨日は男2人で渋谷の焼肉に行きました🍖🍖🍖
BoostrapはCSSを書かなくても最低限のデザインができるのでとても便利です。
が、フォームに<form>
というタグを使うとsubmitされない現象が起きました。
Railsで投稿フォームを以下のように作りました。(わかりやすいようにいらないタグは消しました。)
<form> <%= form_for @post, :url => {:action => :create} do |f| %> <%= f.text_field :title , class: 'form-control', placeholder: 'タイトル' %> <%= f.text_area :content , class: 'form-control' %> <%= f.submit "投稿" %> <% end %> </form>
ただのテキストボックスとテキストエリアとsubmitボタンしかないめっちゃシンプルなerbです。
controllerも書くまでもない普通のcontrollerです。 がこれでsubmitしてもviewは変わらずURLのところが
http://localhost:3000/admin/post/new?utf8=%E2%9C%93&authenticity_token=XXXXX&post%5Btitle%5D=XXXXX&post%5Bcontent%5D=XXXXX&commit=%E6%8A%95%E7%A8%BF
となるだけでcontrollerのcreateメソッドにも入っていませんでした。
原因が<form>
タグを使っていたことでした。
なんでこんな仕様なのかは(まだドキュメント読んでないので)分かりません、、、
誰か知ってたら教えてください。
postできないのはRailsでなんかミスってると思ってずっと悩んでた。
仮説検定ではサンプル数を決めてからやらないとダメですよ!!!!!
大学の授業で気づいたことがあった。ある授業でクラウド会計の認知度が増加していると言っていたグループがあった。 引用先のデータはこのサイトのページ中段の認知度の表である。 www.m2ri.jp
この数値(認知度のパーセンテージ)をみて増加している => クラウド会計の認知度は増加していると判断している。 たしかに認知度のパーセンテージだけ見れば認知度は増加している。
が、あまり認知度は増加していないかなと思う。
簡単に表すとこのようになる。
年 | 知っている | 知らない | 計 | 知っている人の割合 |
---|---|---|---|---|
2015 | 12,705 | 9,420 | 22,125 | 57.4% |
2016 | 12,328 | 7,785 | 20,113 | 61.3% |
一応カイ二乗で見てみると
> prop.test(c(12705,12328),c(22125,20113)) 2-sample test for equality of proportions with continuity correction data: c(12705, 12328) out of c(22125, 20113) X-squared = 65.199, df = 1, p-value = 6.769e-16 alternative hypothesis: two.sided 95 percent confidence interval: -0.04811520 -0.02928403 sample estimates: prop 1 prop 2 0.5742373 0.6129369
この時の帰無仮説は認知度は変わらない、対立仮説は認知度が変わった(増加した)となる。
p値は限りなく0に近いし、パッと見、有意差があるように見える。 しかし、サンプル数が多すぎていわゆる「第一種の過誤」を起こしている。
過誤をせずに仮説検定をするには必要なサンプル数を見積もってから行う必要がある。 今回の例ではどのくらい割合が増加すれば認知度が増加したと判断できるかが難しいが、 (かなり少なめに見積もって)5%くらい上がれば少し認知度が上がったと判断できる(と思う)。
> power.prop.test(p1 = 0.57,p2 = 0.62,sig.level = 0.05,power = 0.8,alternative = "one.sided") Two-sample comparison of proportions power calculation n = 1190.827 p1 = 0.57 p2 = 0.62 sig.level = 0.05 power = 0.8 alternative = one.sided
すると適切なサンプル数は1191であると判断できる。
今回のデータを単純に適切なサンプル数に圧縮するとこのようになる。
> n = 0.05; prop.test(c(n*12705,n*12328),c(n*22125,n*20113)) 2-sample test for equality of proportions with continuity correction data: c(n * 12705, n * 12328) out of c(n * 22125, n * 20113) X-squared = 3.1096, df = 1, p-value = 0.07783 alternative hypothesis: two.sided 95 percent confidence interval: -0.08154433 0.00414509 sample estimates: prop 1 prop 2 0.5742373 0.6129369
2015年と2016年ではあまり差がないようという結果になる。
まとめ
ちゃんとサンプル数を見積もってから検定をしよう!!! おかしなところがあったらコメントかtwitter(@fuji_and_tora)まで
Elastic Stack 5.0がリリースされたのでログの可視化をしようとしたらできなかった話
この間elastic stack 5.0系が出たので使ってみようと頑張ったログです。 技術系のアウトプットは基本的にQiitaにするけど収集できなかったのではてぶに投稿、、、
使うもの
https://www.elastic.co/jp/products
週に500ユーザーくらいのwebサーバーだからBeatいらない気もするけどせっかくなので構成に入れてみた。
したかった構成
共通の環境構築
java
sudo yum update -y sudo yum remove -y java-1.7.0-openjdk sudo yum install -y java-1.8.0-openjdk-devel sudo yum install -y java-1.8.0-openjdk-debuginfo --enablerepo=*debug*
yum
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch sudo vi /etc/yum.repos.d/elastic.repo
[elasticsearch-5.x] name=Elasticsearch repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md
ELKサーバーの構築
Elasticsearch
sudo yum install -y elasticsearch
Kibana
sudo yum install -y kibana sudo vi /etc/kibana/kibana.yml
#server.host: "localhost" を server.host: "XXX.XXX.XXX" に書き換え
起動
sudo service elasticsearch start sudo service kibana start
elasticsearchの起動確認コマンド
$ curl 'localhost:9200' { "name" : "qLGo9hB", "cluster_name" : "elasticsearch", "cluster_uuid" : "XETXNZ0kQTWiw_dFNZWMhg", "version" : { "number" : "5.0.0", "build_hash" : "253032b", "build_date" : "2016-10-26T04:37:51.531Z", "build_snapshot" : false, "lucene_version" : "6.2.0" }, "tagline" : "You Know, for Search" }
Elasticsearch起動エラー
サーバーのメモリが少なすぎてElasticsearch起動時にエラーが出た
Starting elasticsearch: OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006d0660000, 4019847168, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 4019847168 bytes for committing reserved memory. # An error report file with more information is saved as: # /tmp/hs_err_pid21456.log [FAILED]
5.0ではES_HEAP_SIZEをelasticsearch.ymlに書けない
sudo vi /etc/elasticsearch/jvm.options
サーバーのスペックに合わせて設定
-Xms1000m -Xmx1000m
Kibanaにアクセス
http://XXX.XXX.XXX.XX:5601にアクセスするとKibanaの画面がでる
Logstash
sudo yum install -y logstash sudo vi /etc/logstash/conf.d/logstash.conf
動かしてないから雰囲気で
input{ beats{ host => "YYY.YYY.YYY.YY" port => 5044 } } output{ elasticsearch{ hosts => ["localhost:9200"] index => "accesslog-%{+YYYYMM}" } }
起動
sudo initctl start logstash
webサーバー(Railsアプリケーション)
filebeatsでELKサーバーにログを流す
sudo yum install -y filebeat sudo vi /etc/filebeat/filebeat.yml
動かしてないから雰囲気で
filebeat.prospectors: - input_type: log paths: - /var/log/nginx/access.log output.logstash: hosts: ["http://XXX.XXX.XXX.XX:5044"] index: filebeat
起動
sudo /etc/init.d/filebeat start
できなかった理由とかまとめ的な
- そもそもfilebeatから直で別サーバーのlogstashに流せない(?)
- [logfile -> filebeat -> logstash] -> [logstash -> elasticsearch -> kibana]が正しい構成(?)
- サーバーのスペック問題 => AWSのEC2インスタンスを作る
- logstashとbeatの書き方がわからん => 試しに実行するとESが止まっちゃう
- sslでじゃないとforwardできないみたいな情報を見た気がする
free -tmコマンドでメモリ使用量をみるとこんな感じ Logstash elasticsearch kibana起動しただけでの使用量
AWS EC2で構築しなおします。
参考サイト
仮説検定の判断をp値でする危険性
仮説検定とは
「母集団に差がない」とする帰無仮説とそれの逆である「母集団に差がある」という対立仮説をもとに検定を行うことである。
- 帰無仮説(H0)…比較対象に差がない(A=B)
- 対立仮説(H1)…比較対象に差がある(A≠B)
p値とは
検定の結果が偶然か偶然じゃないかを決定する値 => 「まぐれ」な確率 「棄却域の確率」とか「有意水準」という。
検定
検定統計量(求めたp値) < 有意水準 => 帰無仮説(H0)を棄却 = 対立仮説(H1)を採用 => 有意差があるよ!
有意水準を0.05とした時に、「p < 0.05」だった場合は、「5%以下の確率で偶然って判定されるよ(まぐれは5%以下だよ)」= 「95%の確率で偶然じゃなよ」ということである。
有意水準は一般的に0.01 , 0.05 , 0.1が使われる。
データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは?
そこで疑問に思った。データ数が増えるとp値が0に近づき、どんなデータも有意になってしまうのでは? 母集団のサンプル数が増え、p値が0に近づくということは p < 0.05 が成り立ち、どんな検定でも帰無仮説が棄却されて有意差があると判断できてしまうのではないかと思った。 そこで身近な例をもとに検証する。
(例)広告のABテストの母平均の差の検定
- 帰無仮説...AとBに差がない
- 対立仮説...AとBに差がある
有意水準5%で検定する。(5%というのも様々な議論があるが一旦放置)
インプレション数 | クリック数 | クリック率 | |
---|---|---|---|
広告A | 99 | 49 | 49% |
広告B | 102 | 50 | 49% |
> prop.test(c( 49 , 50 ),c( 99 , 102 )) 2-sample test for equality of proportions with continuity correction data: c(49, 50) out of c(99, 102) X-squared = 1.1651e-30, df = 1, p-value = 1 alternative hypothesis: two.sided 95 percent confidence interval: -0.1382439 0.1477508 sample estimates: prop 1 prop 2 0.4949495 0.4901961
p > 0.05なので差がないといえる。
データ数を1000倍に増やしてみる。
インプレション数 | クリック数 | クリック率 | |
---|---|---|---|
広告A | 99000 | 49000 | 49% |
広告B | 102000 | 50000 | 49% |
> n = 1000; prop.test(c( n*49 , n*50 ),c( n*99 , n*102 )) 2-sample test for equality of proportions with continuity correction data: c(n * 49, n * 50) out of c(n * 99, n * 102) X-squared = 4.5226, df = 1, p-value = 0.03345 alternative hypothesis: two.sided 95 percent confidence interval: 0.0003718071 0.0091350259 sample estimates: prop 1 prop 2 0.4949495 0.4901961
p < 0.05なので帰無仮説が棄却されて差があると判断される。
サンプル数が多くなるとp値が限りなく0に近くなり有意(p < 0.05)になってしまい、採用する仮説が異なって( = 結果が逆になる)しまう。
まとめ
- データ数でいくらでも操作できるのでp値だけで判断できない
- サンプル数が多いときに仮説検定をすること自体間違っている
アメリカ統計学会も勧告を出している AMERICAN STATISTICAL ASSOCIATION RELEASES STATEMENT ON STATISTICAL SIGNIFICANCE AND P-VALUES
- P-values can indicate how incompatible the data are with a specified statistical model.
- P-values do not measure the probability that the studied hypothesis is true, or the probability that the data were produced by random chance alone.
- Scientific conclusions and business or policy decisions should not be based only on whether a p-value passes a specific threshold.
- Proper inference requires full reporting and transparency.
- A p-value, or statistical significance, does not measure the size of an effect or the importance of a result.
- By itself, a p-value does not provide a good measure of evidence regarding a model or hypothesis.