とあるお兄さんの雑記

基本的に技術系の内容を書きますが、何を書くかは私の気分です。

統計学基礎vol.44〜対応がある場合の2標本t検定〜

超スローペースでやっている統計学基礎です。いつになったら終わるかもわかっていません。果たして生きているうちに終わるのか...?

今回は対応がある場合の2標本 t検定についてです。

検定の流れ

一旦検定の流れをおさらいしておきましょう。

  1. 仮説を立てる
  2. 有意水準を設定する
  3. 適切な検定統計量を決める
  4. 棄却ルールを決める
  5. 検定統計量をもとに結論を出す

対応がある場合の2標本t検定

例題

新薬のテストを行う。被験者5人に対して投与前と後の血圧を測定した。この時の差(投与前 - 投与後)の平均は 10、投与前の血圧の平均は 154、投与後の血圧の平均は 144、差の不偏分散 s ^2は212.5だった。投与によって血圧は下がったといえるか?

解説

投与前後で血圧が10も下がっているのだから、主観的には下がっているのでは?と思うのですが果たしてどうでしょうか?

対応のある場合の2標本 t検定ですが、前々回あたりに式を見てもらったかと思います。

kurasher.hatenablog.com

この式を使います。

とはいえ、ひとまず順にやっていきましょう。

1 仮説を立てる


 H_0:投与前後の血圧は等しい (\mu_d = 0)。つまり、投薬によって血圧は下がらなかった。
 H_1:投薬によって投与前後の血圧に差があった (\mu_d \neq 0)。つまり、投薬によって血圧は下がった。

 \mu_dは手順3ででてきます。

2 有意水準を設定する

今回は 95\%信頼区間で仮説検定を行います。ということで、有意水準 5\% (\alpha = 0.05)です。

3 適切な検定統計量を決める

 t検定を行います。 \mu_dは差の母平均、 nはサンプルサイズ、 s ^2は差の不偏分散です。

 \displaystyle t = \frac{\bar{x}_d - \mu_d}{\frac{s}{\sqrt{n}}}

4 棄却ルールを決める

自由度は 5 - 1 = 4 t分布です。
また、血圧が下がったかどうかについてだけ調べるため、片側検定を行います。
(仮に血圧が上がったかもしくは下がったかを調べたい場合は両側検定になります。)

よって、有意水準 tの値は

 t_{0.05}(4) = 2.132

と求めることができました。

5 検定統計量をもとに結論を出す

投与前の血圧から投与後の血圧の差の平均 \bar{x}_dは、10です。

また、帰無仮説が正しいかどうかを調べるため、差の母平均 \mu_dは0になります。よって、

 \displaystyle t = \frac{\bar{x}_d - \mu_d}{\frac{s}{\sqrt{n}}}

  \displaystyle  = \frac{10 - 0}{\frac{212.5}{\sqrt{5}}} \approx 1.53

となり、 P値はおおよそ1.53と分かりました。

この P値と有意水準 tの値を図にすると、以下のようになります。拡大した図を使用しているのは、視覚的に理解しやすいためです。

f:id:kurasher:20220326161913p:plain

帰無仮説を棄却する場合、 P値が有意水準 tの値よりも大きい (t \lt P値)必要があります(もしくは P値の確率が有意水準 tの値よりも小さい)。
しかし、今回は有意水準 tの値が P値よりも大きいため、帰無仮説は棄却されません。

つまり、投薬によって血圧が下がっとはいえません。

まとめ

対応がある場合の2標本t検定について、例題を通して見てきました。主観では投薬によって血圧は下がっているという判断でしたが、統計学的には投薬によって血圧が下がったとはいえないということが言えました。
つまり、投薬前後で血圧が10下がるのは薬など関係なく、偶然の範囲内と言えそうです。

用語 意味
2標本t検定 2つの独立した母集団があり、それぞれの母集団から抽出した標本の平均に差があるかどうかを検定
対応がある場合の2標本 t分布式  \displaystyle t = \frac{\bar{x}_d - \mu_d}{\frac{s}{\sqrt{n}}}

統計学基礎vol.43〜対応がない場合の2標本t検定〜

今回は対応がない場合の2標本 t検定についてです。

検定の流れ

一旦検定の流れをおさらいしておきましょう。

  1. 仮説を立てる
  2. 有意水準を設定する
  3. 適切な検定統計量を決める
  4. 棄却ルールを決める
  5. 検定統計量をもとに結論を出す

対応のない2標本t検定

例題がある方がわかりやすいので、例題を絡めて解説します。

例題

1組と2組の算数のテストの平均点を比較する。1組30人の平均点は75点、標準偏差は5点、2組32人の平均点は70点、標準偏差は8点だった。
1組と2組の算数のテストの平均点に差はあるか?

解説

検定の流れの順で例題を考えていきましょう。

1 仮説を立てる

今回は「テストの平均点に差はあるか?」という問いなので、帰無仮説 H_0、対立仮説 H_1

 H_0:1組と2組のテストの平均点は等しい
 H_1:1組と2組のテストの平均点には差がある

2 有意水準を設定する

今回の有意水準 \alpha 0.05とします。
 \alpha = 0.05

3 適切な検定統計量を決める

今回は母分散がわかりません。そこで、不偏分散 s ^2を用いる統計量 tを使います。2標本の平均値の差から、前回の式を使います。

4 棄却ルールを決める

この検定で使用する分布は t分布です。そこで、自由度 n

 n = 30 + 32 - 2 = 60

となります。また、1組と2組の算数のテストの平均点に差があるかどうかを調べることが目的なので、両側検定を用います。
統計数値表から
 t_{0.025} (60) = 2.00

です。

5 検定統計量をもとに結論を出す

まずはプールした分散を算出します。

 \displaystyle s ^2 = \frac{(30-1) \times 5 ^2 + (32-1) \times 8 ^2}{30 + 32 -2} = 45.15

これをもとに、統計量 tを計算します。ここで注意点として、1組の母平均を \mu_1、2組の母平均を \mu_2とした時、平均点が等しいという仮定からは \mu_1 - \mu_2 = 0となります。その上で計算すると、

 \displaystyle t = \frac{75-70}{\sqrt{45.15 \times (\frac{1}{30} + \frac{1}{32})}}

 \displaystyle \fallingdotseq 2.93 > t_{0.025} (60) = 2.00

となります。

この P値と有意水準 tの値を図にすると、以下のようになります。拡大した図を使用しているのは、視覚的に理解しやすいためです。

f:id:kurasher:20220326164239p:plain

 P t = 2.93有意水準 \alpha t_{0.025} (60)の値よりも大きいことから、 有意水準を越え、棄却域に入ったことがわかります。
この結果から帰無仮説 H_0は棄却され、対立仮説 H_1が採択されるため「1組と2組の算数のテストの平均点には差がある」と結論づけられます。

コラム:ウェルチのt検定

ここでは詳細な説明はせず、紹介だけにとどめます。 詳細はこちら

対応のない2標本 t検定ですが統計量 tを求める式は、2標本の母分散が等しいという前提のもとに使います。
ただ、最近は等分散かどうかを考慮する必要のないウェルチ t検定を行った方がいいという考え方も一般的になっているようです。

まとめ

対応がない場合の2標本 t検定について見てきました。慣れてしまえば簡単ですが、実際に手計算でやるのは統計検定とか大学の統計関連のテストぐらいですかね?

統計学基礎vol.42〜t検定〜

明けましておめでとうございます。

こちらのブログも月1回のペースであげれば十分じゃね?というより頑張っている方じゃね?と最近思うようになってきた私です。

私の中では仕事が忙しいからブログを更新・投稿する頻度が少ないと目を背けているわけですが、実際のところ、ソーシャルゲームに2時間ぐらい費やして時間がなくなっているのでその時間をこちらに当てればいいわけです。

ですので、「仕事が忙しいから」はただの言い訳です。

まぁ人ってやりたくないことに対して言い訳を作るのが得意ですから。

でもやりたくないことでもやってみると、意外と進捗出せたりするんですよね〜。結局は、たとえ面倒なことであってもやるかやらないのかに落ち着くんだと思います。

さてさて、どうでもいい話から始まりましたが、今回は t検定について簡単に触れていきます。

検定の流れ

前回は検定についてざっくりと話しただけでした。ここで、検定を行う手順について軽く説明します。

  1. 仮説を立てる
  2. 有意水準を設定する
  3. 適切な検定統計量を決める
  4. 棄却ルールを決める
  5. 検定統計量をもとに結論を出す

上記の順について、例題をもとに見ていきましょう。例題は例によって統計Webさんからお借りします。

例題

ある工場では部品Aを製造しています。製造された部品Aの中からランダムに10個を選び長さを測定したところ、平均値は7.2cm、標準偏差は0.2cmでした。部品Aの長さが正規分布に従う時、この工場で製造している部品Aの長さは7.0cmと言えるでしょうか?

1. 仮説を立てる

まずは帰無仮説 H_0と対立仮説 H_1を立てます。

 H_0:部品Aの長さは7.0cmである

 H_1:部品Aの長さは7.0cmではない

2. 有意水準を設定する

帰無仮説 H_0を棄却するための基準となる確率です。
有意水準を含めた検定の考え方としては以下のようになります。

ある仮説 Aに対して、有意水準を仮に 1\%として検定を行う
→ 行った結果、仮説 Aが起きた確率が 0.5\%だった
有意水準よりも小さい確率が起こった
→ つまり、仮説 Aが非常に稀な確率で起こった
→ こんなに稀なことが起こったのは何か有意な差(背景に意図した何か)があるからであり、偶然で起こったとは考えにくい
→ 偶然ではないため仮説 Aは棄却され、対立仮説 \bar{A}が採択される

さて、話を戻し、例題では有意水準 \alpha = 0.05とします。

3. 適切な検定統計量を決める

ここで言う検定統計量というのは、帰無仮説が正しいと仮定した時、観測した事象よりも稀なことが起こる確率を計算するための値などです。具体的には母分散が既知なら正規分布の値、未知なら t分布の値になります。

さて、この例題では母分散が未知なので、不偏分散 s ^2を用いる統計量 tを使います。ここで、 \bar{x}をデータの平均、 \muを母平均、 nをサンプルサイズ、 s ^2を不偏分散として

 \displaystyle t = \frac{\bar{x} - \mu}{\sqrt{\frac{s ^2}{n}}}

 \displaystyle  = \frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}}

4. 棄却ルールを決める

この検定で使用する分布は t分布です。よって自由度は

 n - 1 = 10 -1 = 9

となります。

また、この工場で製造する部品Aの長さが7.0cmであるかどうかを調べることが目的なので、両側検定を行います。

数値統計表から t_{0.025}(9)の値を読み取ると、

 t_{0.025}(9) = 2.262

となります。で、この数値は何かというと、 t分布の有意水準 5\%の値を取るときの tの値です。

つまり、次の手順で求める検定統計量が t_{0.025}(9) = 2.262を超えれば(検定統計量の確率は小さいため)帰無仮説を棄却、超えなければ(検定統計量の確率は大きいため)帰無仮説を採択するための基準になります。

5. 検定統計量をもとに結論を出す

3で求めた式

 \displaystyle  t = \frac{\bar{x} - \mu}{\frac{s}{\sqrt{n}}}

より、

 \displaystyle  t = \frac{7.2 - 7.0}{\frac{0.2}{\sqrt{10}}}

 \displaystyle  \fallingdotseq 3.16 > t_{0.025}(9) = 2.262

よって、求めた検定統計量の値は有意水準 t_{0.025}(9)の値を超えたため、

有意水準 5\%において、帰無仮説を棄却し、対立仮説を採択する

という結果になります。よって、「この工場で製造している部品Aの長さは7.0cmではない」と結論づけられます。

2標本t検定

2標本t検定というは、2つの独立した母集団があり、それぞれの母集団から抽出した標本の平均に差があるかどうかを検定するものです。
対応のあるデータか、対応のないデータかで検定統計量の算出方法が変わってきます。

対応がない場合の2標本t検定の検定統計量の算出方法

母分散が不明の時、
1群目の標本平均を \bar{x}_1、母平均 \mu_1、サンプルサイズを n_1

2群目の標本平均を \bar{x}_2、母平均 \mu_2、サンプルサイズを n_2 として表すと、

f:id:kurasher:20220110160024p:plain

となります。

ここで、帰無仮説である「母平均が等しい」という仮説が正しいとすると、 \mu_1 - \mu_2 = 0 となるため、

f:id:kurasher:20220110160254p:plain

となります。またここで、 s ^2

 \displaystyle s ^2 = \frac{(n_1 - 1)s_1 ^2 + (n_2 - 1)s_2 ^2}{n_1 + n_2 - 2}

で表されます。

対応がある場合の2標本t検定の検定統計量の算出方法

差を用いると実質は1標本の検定となるため、

 \displaystyle t = \frac{\bar{x}_d - \mu_d}{\frac{s}{\sqrt{n}}}

となります。また、ここで帰無仮説は「対応のあるデータの差の平均は0である」となります。

まとめ

用語 意味
2標本t検定 2つの独立した母集団があり、それぞれの母集団から抽出した標本の平均に差があるかどうかを検定

統計学基礎vol.41~検定~

今回は検定のお話です。検定というと両側検定と片側検定がありますが、基本は両側検定しか見ないかと思います。

両側検定

帰無仮説 H_0:\mu_A = \mu_B、対立仮説が H_1:\mu_A \neq \mu_Bである時に行う検定のこと。

片側検定

帰無仮説 H_0:\mu_A = \mu_B、対立仮説が H_1:\mu_A > \mu_B、または H_1:\mu_A <  \mu_Bである時に行う検定のこと。
一方の群に対して大小関係が予想できる場合に用いることができる。

両側検定と片側検定の違い

例を示しながら解説します。

薬Aに含まれる成分Bについて調べる。Aからランダムに25粒を抜き取り、成分Bの量を測定した結果、 \bar{x} = 98mg s ^2 = 1だった。

この時、帰無仮説 H_0を以下のように考えます。

 H_0:Aの中の成分Bの含有量は100mgである。

このように帰無仮説 H_0を考えた場合の対立仮説 H_1

  1. 薬Aの中のBの含有量は100mgではない
  2. 薬Aの中のBの含有量は100mgより多い
  3. 薬Aの中のBの含有量は100mgより少ない

となります。ここで、

  1. はBの含有量が100mgかどうかを調べる検定
  2. はBの含有量が100mgより多いかどうかを調べる検定で、Bの含有量が100mgより少ないかどうかは考えない
  3. はBの含有量が100mgより少ないかどうかを調べる検定で、Bの含有量が100mgより多いかどうかは考えない

1は両側検定、2、3は片側検定となります。

両側検定では棄却域が分布の両端にあります。つまり、成分Bの含有量が100mgよりも極端に大きくなった時と小さくなった場合に帰無仮説 H_0は棄却されます。
一方、片側検定では棄却域が片方にしかありません。つまり、成分Bの含有量が100mgよりも極端に多い(少ない)場合にだけ帰無仮説 H_0は棄却されます。逆に成分Bの含有量が100mgよりもどれだけ少なく(多く)なったとしても帰無仮説 H_0は棄却されません。

また、この内容からもわかるように両側検定と片側検定では、両側検定の方が厳しい条件になります。

下図は有意水準 5\% 0.05 > Pの時に有意)とした場合の両側検定と片側検定 f:id:kurasher:20211221052146j:plain

検定を行う際の注意点

統計的仮説検定では、効果や差の有無を検証することは可能です。しかし、効果の大きさや差の大きさについて具体的に知ることはできません。 つまり、仮説検定の結果、「AよりもBの方が効果がある」ということは言えても、「AよりもBの方が10倍以上効果がある」などということは言えません。

まとめ

用語 意味
両側検定 帰無仮説 H_0:\mu_A = \mu_B、対立仮説が H_1:\mu_A \neq \mu_Bである時に行う検定
片側検定 帰無仮説 H_0:\mu_A = \mu_B、対立仮説が H_1:\mu_A > \mu_B、または H_1:\mu_A <  \mu_Bである時に行う検定
検定を行う際の注意点 効果や差の有無を検証することは可能。しかし、効果の大きさや差の大きさについては不明

統計学基礎vol.40~第一種の過誤と第二種の過誤~

いや〜、寒い季節になりましたね。

特に今年に限っては夏があった後、秋を経過せずに冬に移行した気がします。将棋で言えば序盤からいきなり終盤戦に移行した感じです。

一体今年の秋はどこへ行ったのか、謎です。

あ、今回は第一種の過誤と第二種の過誤ですよ。

有意水準

検定において帰無仮説を設定したときに、その帰無仮説を棄却する基準となる確率のこと。
危険率とも言う。
検定を行う前に設定する必要がある。

検出力

有意水準と対するもので、帰無仮説が正しくない時に、正しく帰無仮説を棄却する確率のこと。

第1種の過誤

帰無仮説が正しいのに帰無仮説を棄却してしまうこと

第2種の過誤

対立仮説が正しいのに採択されないこと

有意水準と第1種の過誤

仮に有意水準を5%と仮定すると、 P値が5%以下となったとしても本当に偶然稀な事象が起こった場合もあります。
そのため、有意水準本当は帰無仮説が正しいのに、誤って帰無仮説を棄却してしまう確率とも言えます。
この帰無仮説が正しいのに帰無仮説を棄却してしまうことを第1種の過誤と言います。

検出力と第2種の過誤

検出力は帰無仮説が正しくないときに正しく帰無仮説を棄却する確率で、第2種の過誤は対立仮説が正しいときに誤って帰無仮説を棄却しないことです。

第1種の過誤と第2種の過誤

色々書きましたが、表にすると以下のようになります。

真実
帰無仮説が正しい対立仮説が正しい
検定の結果 帰無仮説を棄却しない正しい第2種の過誤
帰無仮説を棄却する第1種の過誤
(有意水準)
正しい
(検出力)



もう少しわかりやすく考えてみましょう。
ある犯罪を犯した容疑者の裁判を例(統計Web様より拝借)にします。帰無仮説は「この容疑者は無罪である」です。

真実
本当は無罪本当は有罪
裁判の結果 無罪と判決正しい第2種の過誤
有罪と判決第1種の過誤正しい

さて、この表を元に考えると第1種の過誤と第2種の過誤、どちらも低い方がいいと直感的にわかります。しかし、両者はトレード・オフの関係になっているため、同時に低くすることは不可能です。そのため、両者のバランスを取ることが重要になります。

第1種の過誤と第2種の過誤の例

帰無仮説:新薬は既存の薬と同じくらいの効果がある 対立仮説:新薬は既存の薬と同じくらいの効果がない(既存の薬よりも効果が高い、もしくは低い)

第1種の過誤:
本当は、新薬は既存の薬と同じくらいの効果があるが、同じくらいの効果はないと結論付けられる


第2種の過誤:
本当は、新薬は既存の薬と同じくらいの効はないが、同じくらいの効果があると結論づけられる

まとめ

用語 意味
有意水準 検定において帰無仮説を設定したときに、その帰無仮説を棄却する基準となる確率のこと
検出力 有意水準と対するもので、帰無仮説が正しくない時に、正しく帰無仮説を棄却する確率のこと
第一種の過誤 帰無仮説が正しいのに帰無仮説を棄却してしまうこと
第二種の過誤 対立仮説が正しいのに採択されないこと



第1種の過誤と第2種の過誤について

真実
帰無仮説が正しい対立仮説が正しい
検定の結果 帰無仮説を棄却しない正しい第2種の過誤
帰無仮説を棄却する第1種の過誤
(有意水準)
正しい
(検出力)

統計学基礎vol.39~統計的仮説検定の基礎用語~

今回から統計的仮設検定のお話です。個人的にはこれがやりたくてここまで記事書いてきたって言っても過言ではないです。

理解しているかどうかは別として。

統計的仮説検定

確率をもとに結論を導く方法。

検定の手順としては、

  1. 仮説を立てる
  2. 起こった結果を確率的に検証
  3. 結論を導く

となります。

検定を行う上での注意点

導かれた結論が「絶対に正しい」と考えることはできない

砕けた小さな隕石が地球に落ちてきて、それが誰かに当たる確率というのが新聞などで目にすることはあるかと思います。この確率ですが、誰かに当たる確率は低くても0%になっていることはないと思います。
そのため、「滅多に起こらない」という結論が出せたとしても、その事象が起きる時は起きてしまいます。検定は確率をもとに判断を行うので、結論が絶対に正しいと考えることは残念ながらできません。

基準は先に決めておく

ある事象において「〇〇%未満ならこの事象は滅多に起きにくい」という基準は先に決めておく必要があります。
仮に基準を決めないで実験や試行を行い、結果、7%の確率でその事象が起こるとわかったとします。
基準を5%とすれば、実際の結果は7%なのでこの事象が滅多に起こらないとは言えません。一方で、基準を10%とすれば、実際の結果は7%なのでこの事象は滅多に起こらないと言えてしまいます。

f:id:kurasher:20211024010731p:plain

以上のように、基準を決めておかないと後出しジャンケンのように結論を言い換えることができます。

帰無仮説

検定を行うために立てる仮説のこと。この仮説を元に検定を行い結論を導く。
ちなみに、帰無仮説 H_0と書きます。 H Hypothesisの略です。

対立仮説

帰無仮説に対する仮説のこと。本来証明したい仮説のことです。ちなみに、対立仮説を H_1と書きます。

検定統計量

帰無仮説が正しいと仮定したとき、観測した事象よりも稀なことが起こる確率を計算するための値。

P値

帰無仮説が正しいと仮定した時に、観測した事象よりも極端なことが起こる確率のこと。

例えば、10回コインを投げた時に、2回だけ表が出た場合、
P値は「0回表が出現、1回表が出現する確率を足したもの」を表します。

 P値は「観測した事象よりも極端な事象が起こる確率」であるため、上記のように確率を足し合わせます。
そのため、 P値は累積確率となります。

有意水準(危険率)

帰無仮説を棄却するための基準となる確率。検定を行う前に決めておく必要がある。

棄却

仮説を捨てること。
P値の面積(確率)が有意水準の面積(確率)よりも大きい場合、帰無仮説は棄却されず、帰無仮説が正しいとも言えない。
P値の面積(確率)が有意水準の面積(確率)よりも小さい場合、帰無仮説を棄却し、対立仮説を採択。

下の図を見りゃおおよそ理解できるかと思います。ただし、常に右から計算するわけではないので、そこら辺は臨機応変に計算してください。
ちなみに、統計検定2級でこの手の問題を解く場合、有意水準 P値は小さい値がほとんどなので、下の図のように無駄に大きなグラフを書いてどこに有意水準 P値があるかを図示すると非常に解きやすくなります。

f:id:kurasher:20211024025419p:plain

P値と有意水準

 P値が有意水準を下回った場合、その P値は偶然とる値ではないと結論づけられます。
つまり、以下のように考えることが可能です。

 P値が有意水準を下回った

その P値は偶然取る値ではないと言える

つまり、有意水準よりも極めて珍しいことが起こった

つまり、この事象が起こったということは何かしら意味が有る(有意である)と言える。

ここでの意味というのは、何かしらの細工(イカサマのコインを使うなど)だったり、第三者からの何かしらの意図だったり、社会的背景や環境などが起因していることが挙げられます。
が、とにかく、偶然ではない何か(意図や意味)が働いているということがわかります。

検出力

有意水準と対するもので、帰無仮説が正しくない時に、正しく帰無仮説を棄却する確率のこと。

まとめ

用語 意味
統計的仮説検定 確率をもとに結論を導く方法
帰無仮説 検定を行うために立てる仮説のこと
対立仮説 帰無仮説に対する仮説のことで、本来証明したい仮説のこと
検定統計量 帰無仮説が正しいと仮定したとき、観測した事象よりも稀なことが起こる確率を計算するための値
有意水準(危険率) 帰無仮説を棄却するための基準となる確率
棄却 仮説を捨てること
検出力 有意水準と対するもので、帰無仮説が正しくない時に、正しく帰無仮説を棄却する確率のこと

LINEのMessaging APIを使ってゴミ出しを通知する

前回、LINE Notifyを経由して明日のゴミ出しを通知するものを作りました。が、このLINE Notifyの通知がダサい。

というわけで、もっと発展してLINE のMessagingAPIを使ってゴミ出しを通知するbotを作成しました(改修です)。

環境

macOS Big Sur 
Python 3.9.6
pytest 6.2.2
LINE Messaging API
line-bot-sdk 1.20.0
Heroku

ソースコード概要

NotificationGomidashi/
├── Application
│   ├── __init__.py
│   ├── entity
│   │   ├── __init__.py
│   │   ├── calendar_entity.py
│   │   └── garbage_removal_entity.py
│   ├── main.py
│   └── service
│       ├── __init__.py
│       └── notify_service.py
├── Procfile
├── docker
│   ├── Dockerfile
│   └── docker-compose.yml
├── requirements.txt
├── runtime.txt
└── tests
    ├── __init__.py
    ├── entity
    │   ├── __init__.py
    │   ├── test_Calendar.py
    │   └── test_garbage_removal.py
    └── service
        └── __init__.py

変わったところといえば、main.pyrequirements.txtです。他のファイルに関しては過去の記事を参照ください。

main.pyについて

#coding:UTF-8
from service.notify_service import NotifyService as sv
 
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os
 

CHANNEL_ACCESS_TOKEN = "YOUR_CHANNEL_ACCESS_TOKEN"
USER_ID = "YOUR_USER_ID"
line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)


def main(message):
    pushText = TextSendMessage(text=message)
    line_bot_api.push_message(USER_ID, messages=pushText)

if __name__ == '__main__':
    sv = sv()
    n_th_week, week_day = sv.get_time()
    message = '明日は、第' + str(n_th_week) + week_day + '曜日\n' + sv.get_judge_case(n_th_week, week_day)

    main(message)

    # herokuにデプロイしたものをローカルから動かしたい時
    # heroku run python Application/main.py

requirements.txtについて

requests==2.25.1
line-bot-sdk==1.20.0

今回はLINE Messaging APIを使うので、line-bot-sdkを追加します。

LINE Messaging APIについて

下記の公式ページにも書かれてはいるのですが、LINE Messaging APIというのは、ユーザー側からメッセージを送信したり、テキストを取得することができます。LINE Notifyと違い、個別のチャンネルでメッセージを送受信できます。イメージは公式LINEに近い感じです。

developers.line.biz

チャンネルの作成から設定まで

qiita.com

Messaging APIからチャンネルを新しく作成したら、ユーザーIDとチャンネルアクセストークンを取得します。

ユーザーIDはチャンネル基本設定のあなたのユーザーIDから、チャンネルアクセストークンはMessaging API設定のチャンネルアクセストークンから取得します。

また、Messaging API設定のWebhook設定をいじります。

Webhook URLは

https://アプリ名.herokuapp.com/callback

とします。ここのアプリ名はHerokuでgarbage-notifyとしているので、

https://garbage-notify.herokuapp.com/callback

とします。

また、下のWebhookの利用をONにします。

ここらの設定は下記の記事も参考にするとわかりやすいです。

qiita.com

取得したユーザーIDとチャンネルアクセストークンはmain.pyにそれぞれ設定します。

CHANNEL_ACCESS_TOKEN = "YOUR_CHANNEL_ACCESS_TOKEN"
USER_ID = "YOUR_USER_ID"

これで準備は完了です。あとはHeroku側にgit pushすればOKです。

参考記事

1時間でWikipedia検索できるLINE BOTをサクッと作ってみよう! #Python - Qiita

【Python】定期実行するLineBotを作成する #Python - Qiita