最高気温と熱中症の搬送人数との間に相関関係はあるだろうか.熱中症で救急搬送された人数は総務省の消防庁のサイトにある.これと気象庁のデータを結合してみた.
日別最高気温のデータをダウンロードする
気象庁の過去の気温をダウンロードするには過去の気象データ・ダウンロードがよいだろう.複数の地点のデータをまとめてダウンロードできる.
地点を選ぶ
後で出てくるが,消防庁の熱中症搬送人員は都道府県別であるため,地点は都道府県庁所在地にした.気温を代表する観測所というよりも,人口が最も多いのが都道府県庁所在地だろうという推測からである.
項目を選ぶ
日最高気温にチェックを入れる.
期間を選ぶ
消防庁の熱中症の統計は年々期間が拡大される傾向にあるが,最近では5月から9月までが一般的である.1年ずつずらして選択するとファイル容量をオーバーフローすることはない.
表示オプションを選ぶ
ここは少し注意が必要である.不要なデータ列をダウンロードしないために,下記に注意されたい.
利用上注意が必要なデータの扱い
「値を表示(格納)しない」にチェックし直す.
観測環境などの変化の前後で,値が不均一となったデータの扱い
「観測環境などの変化前の値を表示(格納)しない」にチェックし直す.
その他
「都道府県名を格納(CSVファイルダウンロード実行時)」をチェックする.
熱中症の搬送人員をダウンロードする
総務省消防庁の熱中症情報のうち救急搬送状況のページにEXCELのファイルがある.これらをダウンロードして一つのフォルダーにまとめておく.ダウンロードしたてのファイル名は data.csv, data(1).csv … となっているはずだが,2008.csv, 2009.csv … などと変更しておいたほうが良い.
データクレンジング
日最高気温をPower Query で読み込む
csvファイルをメモ帳で開く.
最初の2行を削除する.
「データの取得」「ファイルから」「フォルダーから」と進む.
ダイアログに該当ディレクトリを指定し「データの変換」をクリックする.
「列の追加」「カスタム列」へと進む.
「カスタム列の式」にCsv.Documentとタイプする.
引数に[Content], [Encoding=932]を指定する.
「列の削除」「他の列の削除」で Table 以外の列を削除する.
カスタム列のTableを展開する.「元の列名をプレフィックスとして使用します」のチェックは外しておく.
展開した結果である.
1行目をヘッダーに昇格させる.
テキストフィルターで他のファイルのヘッダー行を除く.
行のフィルターで「指定の値と等しくない」に「年月日」とタイプする.
「空の削除」でデータのない行を除く.
「その他の列のピボット解除」で年月日以外の列をピボット解除する.
「値の置換」で「石狩」を「北海道」に置換する.
結果
都道府県の日最高気温が読み込まれる.ここでは手順を省略しているが,クエリのマージで都道府県コードを追加している.
熱中症による救急搬送人員に関するデータをPower Queryで読み込む
一方,総務省消防庁の「熱中症による救急搬送人員に関するデータ」は第一正規形を満たしているものの,ファイル内にワークシートが複数あり,これらを UNION する必要がある.
下図はEXCELのファイルをフォルダーから読み込んだ後の状態であり,ワークシートと印刷領域が見えている.これはデータとしては重複した状態であり,いずれかを除く必要がある.
ここでは「テキストフィルター」でワークシート以外を除く方針とする.
「指定の値で始まる」に20とタイプする.
Data列を選び「他の列の削除」を選ぶ.
Data 列が残り,ここからTableを展開する.
結果
熱中症による救急搬送人員に関するデータが読み込まれる.
SQL Server で結合する
この後,クエリのマージで気温テーブルと熱中症テーブルを結合するには年月日と都道府県コードをつないだキー列を作成する必要があるのだが,下図のエラーが発生してなぜか作成できなかった.
仕方なく,気温テーブルと熱中症テーブルをテキストファイルにエクスポートして SQL Server にインポートする方針に変更した.この辺りの詳細については テキストファイルからSQLServerに気象データをインポートするを参考にしてほしい.
クエリ
USE EMERGENCYDB; GO SELECT T.年月日 , T.都道府県 , T.都道府県コード , T.日別最高気温 , E.[搬送人員(計)] , E.軽症 , E.中等症 , E.重症 , E.死亡 FROM dbo.Temperature AS T INNER JOIN dbo.Emergency as E ON E.日付 = T.年月日 AND E.都道府県コード = T.都道府県コード WHERE T.日別最高気温 IS NOT NULL
SQL Server でデータクレンジング
救急搬送人員
上記コードから分かるように,救急搬送人員にもデータ欠損があり,NULL として格納されているレコードがある.幸いにも搬送人員(計)のみであり,目視で確認した限り,0 で置換して良さそうである.
SELECT *
FROM dbo.Emergency
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (388 行処理されました)
NULL を 0 で置換する.
UPDATE dbo.Emergency SET dbo.Emergency.[搬送人員(計)] = 0
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (388 行処理されました)
NULL の格納されたレコードが存在しないことを確認する.
SELECT *
FROM dbo.Emergency
WHERE dbo.Emergency.[搬送人員(計)] IS NULL (0 行処理されました)
気象庁の気温データ
気象庁の気温データ欠損はいかんともしがたく,クエリで削除する他ない.
SELECT *
FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (105 行処理されました)
日別最高気温が欠損しているレコードを削除する.
DELETE FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (105 行処理されました)
日別最高気温が欠損しているレコードがないことを確認する.
SELECT *
FROM dbo.Temperature
WHERE dbo.Temperature.日別最高気温 IS NULL (0 行処理されました)
EXCEL の散布図で可視化する
クエリで得られた結果をEXCELにコピペして散布図を描く.分布を見る限り,日最高気温と搬送人員との間には指数関数的増加傾向があるように見える.
縦軸を対数にしてみると更にその傾向が強まる.
愛は測定できるか?でも述べたが,片対数グラフで直線が見られた場合は何らかの自己組織化が起きている.この場合,熱中症が人体の体温調節機構の破綻であるという病態と密接に関連しており,人体はある一定以上の外気温には耐えられないという生物学的特性を示している.
閾値を求める
最高気温を表側に,搬送人員を表頭にして四分表を書く.周辺度数は一定であり,検査値の閾値,ここでは最高気温の閾値を変化させて四分表の中身がどう変化するかでROC曲線を描き,閾値を求めることができる.このときの四分表の変化を超幾何分布といい,1 つが決まれば残り 3 つも決まるので自由度は 1 である.サンプルサイズが大きいのでχ二乗検定を行うとよい.
真 | 偽 | ||
---|---|---|---|
検査陽性 | a | b | a+b |
検査陰性 | c | d | c+d |
a+c | b+d | N |
四分表を作成する
検査値と真の値が分かっている場合,四分表を作成して検定にかけるのが一般的である.この場合は観測所の日最高気温を検査値として表側に配置し,救急搬送の有無を真の値として表頭に配置する.上図から 15 ℃から 40 ℃の範囲にあるため,1 ℃ずつ変化させてROC曲線を描く.1 – 特異度を横軸,感度を縦軸に取る.
最高気温 28 ℃あたりが閾値として適切なようである.このときの感度は 0.74, 特異度は 0.78 であった.冷房の推奨設定温度となぜか一致しているが,これは救急搬送人員の閾値であることを忘れないほうがよい.人体にとって安全な温度はおそらくもう少し低いところにあるはずだ.
ちなみに,最低気温でも同様に ROC 曲線を描いてみたが,閾値 21 ℃での感度 0.67, 特異度 0.77 であった.平均気温だと閾値 24 ℃での感度 0.70, 特異度 0.81 であった.
参考までに,最高気温でのデータを記しておく.感度 (Sensitivity) は a/(a+c), 特異度 (Specificity) は d/(b+d) で求まる.
閾値 | a | b | c | d | a+c | b+d | a+b | c+d | N | Sensitivity | Specificity | 1-Specificity |
---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | 58672 | 18697 | 18 | 92 | 58690 | 18789 | 77369 | 110 | 77479 | 1.000 | 0.005 | 0.995 |
16 | 58660 | 18621 | 30 | 168 | 58690 | 18789 | 77281 | 198 | 77479 | 0.999 | 0.009 | 0.991 |
17 | 58634 | 18521 | 56 | 268 | 58690 | 18789 | 77155 | 324 | 77479 | 0.999 | 0.014 | 0.986 |
18 | 58586 | 18316 | 104 | 473 | 58690 | 18789 | 76902 | 577 | 77479 | 0.998 | 0.025 | 0.975 |
19 | 58529 | 18011 | 161 | 778 | 58690 | 18789 | 76540 | 939 | 77479 | 0.997 | 0.041 | 0.959 |
20 | 58415 | 17484 | 275 | 1305 | 58690 | 18789 | 75899 | 1580 | 77479 | 0.995 | 0.069 | 0.931 |
21 | 58194 | 16758 | 496 | 2031 | 58690 | 18789 | 74952 | 2527 | 77479 | 0.992 | 0.108 | 0.892 |
22 | 57743 | 15738 | 947 | 3051 | 58690 | 18789 | 73481 | 3998 | 77479 | 0.984 | 0.162 | 0.838 |
23 | 56980 | 14317 | 1710 | 4472 | 58690 | 18789 | 71297 | 6182 | 77479 | 0.971 | 0.238 | 0.762 |
24 | 55750 | 12548 | 2940 | 6241 | 58690 | 18789 | 68298 | 9181 | 77479 | 0.950 | 0.332 | 0.668 |
25 | 53920 | 10497 | 4770 | 8292 | 58690 | 18789 | 64417 | 13062 | 77479 | 0.919 | 0.441 | 0.559 |
26 | 51395 | 8325 | 7295 | 10464 | 58690 | 18789 | 59720 | 17759 | 77479 | 0.876 | 0.557 | 0.443 |
27 | 47930 | 6111 | 10760 | 12678 | 58690 | 18789 | 54041 | 23438 | 77479 | 0.817 | 0.675 | 0.325 |
28 | 43400 | 4090 | 15290 | 14699 | 58690 | 18789 | 47490 | 29989 | 77479 | 0.739 | 0.782 | 0.218 |
29 | 38397 | 2555 | 20293 | 16234 | 58690 | 18789 | 40952 | 36527 | 77479 | 0.654 | 0.864 | 0.136 |
30 | 33018 | 1376 | 25672 | 17413 | 58690 | 18789 | 34394 | 43085 | 77479 | 0.563 | 0.927 | 0.073 |
31 | 27439 | 664 | 31251 | 18125 | 58690 | 18789 | 28103 | 49376 | 77479 | 0.468 | 0.965 | 0.035 |
32 | 21436 | 254 | 37254 | 18535 | 58690 | 18789 | 21690 | 55789 | 77479 | 0.365 | 0.986 | 0.014 |
33 | 15452 | 70 | 43238 | 18719 | 58690 | 18789 | 15522 | 61957 | 77479 | 0.263 | 0.996 | 0.004 |
34 | 9965 | 20 | 48725 | 18769 | 58690 | 18789 | 9985 | 67494 | 77479 | 0.170 | 0.999 | 0.001 |
35 | 5457 | 4 | 53233 | 18785 | 58690 | 18789 | 5461 | 72018 | 77479 | 0.093 | 1.000 | 0.000 |
36 | 2517 | 0 | 56173 | 18789 | 58690 | 18789 | 2517 | 74962 | 77479 | 0.043 | 1.000 | 0.000 |
37 | 883 | 0 | 57807 | 18789 | 58690 | 18789 | 883 | 76596 | 77479 | 0.015 | 1.000 | 0.000 |
38 | 217 | 0 | 58473 | 18789 | 58690 | 18789 | 217 | 77262 | 77479 | 0.004 | 1.000 | 0.000 |
39 | 35 | 0 | 58655 | 18789 | 58690 | 18789 | 35 | 77444 | 77479 | 0.001 | 1.000 | 0.000 |
40 | 4 | 0 | 58686 | 18789 | 58690 | 18789 | 4 | 77475 | 77479 | 0.000 | 1.000 | 0.000 |
ストアドプロシージャ
SQL Server で上記データを算出するためにストアドプロシージャを作成した.プロシージャ内で宣言した変数 @Temperature に 15 から 40 まで 1 ずつ変化させて代入する.
CREATE PROCEDURE [dbo].[QuarterTable] @Temperature int AS BEGIN SELECT @Temperature AS '閾値' , SUM(CASE WHEN E.[搬送人員(計)] > 0 AND T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END) AS a , SUM(CASE WHEN E.[搬送人員(計)] = 0 AND T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END) AS b , SUM(CASE WHEN E.[搬送人員(計)] > 0 AND T.日別最高気温 < @Temperature THEN 1 ELSE 0 END) AS c , SUM(CASE WHEN E.[搬送人員(計)] = 0 AND T.日別最高気温 < @Temperature THEN 1 ELSE 0 END) AS d , SUM(CASE WHEN E.[搬送人員(計)] > 0 THEN 1 ELSE 0 END) AS 'a+c' , SUM(CASE WHEN E.[搬送人員(計)] = 0 THEN 1 ELSE 0 END) AS 'b+d' , SUM(CASE WHEN T.日別最高気温 >= @Temperature THEN 1 ELSE 0 END) AS 'a+b' , SUM(CASE WHEN T.日別最高気温 < @Temperature THEN 1 ELSE 0 END) AS 'c+d' , COUNT(*) AS N FROM dbo.Emergency AS E INNER JOIN dbo.Temperature AS T ON E.日付 = T.年月日 AND E.都道府県コード = T.都道府県コード END
χ二乗検定を行う
上の表を元にχ二乗検定を行う.閾値が 28 ℃のレコードを四分表に直した観測値 (O) が下表である.
観測値 | 搬送人員あり日数 | 搬送人員なし日数 | |
---|---|---|---|
最高気温が閾値以上の日数 | 43400 | 4090 | 47490 |
最高気温が閾値未満の日数 | 15290 | 14699 | 29989 |
58690 | 18789 | 77479 |
帰無仮説は「閾値以上の日と閾値未満の日で熱中症による救急搬送人員に差がない」であり,期待値 (E) を計算すると下表のようになる.
期待値 | 搬送人員あり日数 | 搬送人員なし日数 | |
---|---|---|---|
最高気温が閾値以上の日数 | 35973 | 11517 | 47490 |
最高気温が閾値未満の日数 | 22717 | 7272 | 29989 |
58690 | 18789 | 77479 |
χ2=Σ{(O-E)2/E} であり,計算すると 16334 となる.
χ二乗値 | 搬送人員あり | 搬送人員なし |
---|---|---|
最高気温が閾値以上 | 1533.17 | 4789.064 |
最高気温が閾値未満 | 2427.898 | 7583.869 |
EXCEL の CHISQ.DIST.RT 関数で p 値を求めると p = 0.000 と統計的有意であり帰無仮説は棄却され,対立仮説の「日最高気温が 28 ℃以上と未満とでは,熱中症による救急搬送人員に有意差がある」が採択される.
実際には熱中症以外でも救急搬送は発生していて,それと比較して熱中症による搬送の増加があるかどうかを検定しないと意味がないのだが,これは全出動回数のデータがないので今回は省略する.
まとめ
気象庁のサイトから最高気温をダウンロードし,総務省消防庁のサイトから熱中症救急搬送人員をダウンロードし,両者を結合して散布図に示した.
最高気温の上昇に従い,救急搬送人員は指数関数的増加を示す傾向が認められた.
最高気温を閾値として ROC 曲線を描くと 28 ℃で感度 (0.74) と特異度 (0.78) のバランスが取れ,最高気温が 28 ℃以上では救急搬送人員が有意に増加したが,28 ℃が人体にとって安全な温度であるか否かは別の議論が必要である.
重症度別に検討した結果は日最高気温と熱中症の重症度別の搬送人員数を検討するに詳しい.
“熱中症の搬送人員と最高気温との相関関係を可視化し閾値をχ二乗検定する” への6件の返信