データのお砂場(41) R言語、airquality、ニューヨークの空気の品質?とな

Joseph Halfmoon

R言語所蔵のサンプルデータセットをABC順(大文字先)で端から眺めております。今回のデータも古いです。1973年の5月から9月にかけてのニューヨークでの「空気の品質」データです。空気の品質といってオゾン濃度を調べてるんです。最初は意味不明でした。NOx濃度とかでないの?でも調べてみたら根拠がありーの。知らんけど。

※「データのお砂場」投稿順Indexはこちら

さて、今回のデータセットの解説ページが以下に。

New York Air Quality Measurements

5月から9月にいたる毎日1回測定しているのは以下の4項目です。

    1. オゾン濃度(ppb)
    2. 日射量(ly)
    3. 風速(mph)
    4. 温度(華氏)

まずオゾン濃度が「空気の品質」に関係しているという点には根拠を見つけることができました。国立環境研究所様の以下のページをどうぞ。

大気中でのオゾン生成プロセス

素人が勝手にかいつまめば、地表近く(対流圏)でのオゾンの生成は、波長の短い紫外線による成層圏(オゾン層)のオゾンの生成メカニズムとは違うらしいです。地表近くでのオゾンの生成にはNOxとかCO、メタンなどの物質が深くかかわっている、ということであります。NOxとか確かに有害物質だもんね。そやつらの存在あって初めてオゾンが生成されるのだ、と。

しかしです、データをちょいと吟味してみると結構ツッコミどころ満載のデータに見えます。まずは「ニューヨーク」とひとくくりにしていますが、測定項目毎の測定場所が違います。オゾン濃度は、Roosevelt Island(イースト・リバーの中州的な島?だいたいニューヨーク行ったことないんですけど。。。)、日射量はセントラル・パーク、風速と気温はラガーディア空港です。地図を見る限り10kmやそこら離れているし、川を渡ってもいます。木々に囲まれたセントラル・パークとだたっぴろい滑走路のある空港では環境も違いすぎるような気がします(個人の感想です。)そういうツギハギだらけのデータを集めて大丈夫なのか疑問を持ちます。

また1973年のデータなので致し方ないのですが、単位がSIじゃないです。日射量の単位ラングレー、この年寄りにして何それという感じ。1カロリー毎平方センチメートルだそうです。さらに、ラングレーは毎平方センチメートルだけれど、風速は時速マイルで、気温はファーレンハイト(華氏。)米国で一般的な単位系といえばそれまでですがSIで首尾一貫した若者には奇異に映るかと。

単位だけならまだしも、測定時間やその処理も異なります。風速は平均だけれど朝の3時間の平均、日射量は午前の4時間分、オゾン濃度は午後の2時間の平均、温度はその日の最高気温です。これまたバラバラ。

さらにコマケーことに気づいてしまいました。日射量の測定についてです。日射量は4000オングストロームから7700オングストローム(オングストロームという単位にはそこはかとなく懐旧の情がこみあげます。若者のために注釈すれば0.1nmであります)のバンドとかかれてます。しかし、これって、ほぼほぼ可視光のバンドじゃん!先ほどの国立環境研究所様のページによると、波長の短い紫外線はオゾン層でフィルタされるので対流圏まで届かないけれども、NOとオゾンとの作用の引き金を引いているのは近紫外線みたいです。UV-A、Bの放射強度を測定するべきじゃないかと思われます(もう少し短い波長のバンドね。)可視光のバンドで測っているのも相関なしとは言わないけれど怪しいデス。

まあコマケーことは気にするなよ、Rのお勉強用のデータセットだし。ごもっとも。なお処理にあたっては、以下のページ(同志社大の先生ご作製)を参照させていただいとります。

Rと重回帰分析

まずは生データ

まずは生データをロードしてみました。データ形式は「普通の」データ・フレームです。rawData

データセットの解説ページには処理例が1行だけのっています。「対散布図」を描くもの。pairGraphOpr

描いた対散布図が以下に。pairGraph

上記をみて、まず思ったのは、MonthとDay、とりあえず邪魔だなと。MonthとDay単独でなく通算日数的なものであれば、季節変動的なものを捉えるのに使えそうではあります。まあMonth単独でもアリかも。でもDay単独は無いでしょう。

結局、以下のような関係で分析すべきでないかと思います。

    • 被説明変数(目的変数):Ozone
    • 説明変数:Solar.R、Wind、Temp

ただし、Solar.Rが高い方が温度も高くなりそうだったり、天気が悪いとSolar.Rは低くて、風速が大きくなりそうだったりもするので説明変数が完全に独立ということは無いだろう、と思われます。

欠損値アリ

グラフを描いていてウォーニングがでて気づいたのですが、データに欠損値NAが含まれています。こんな感じ。NA

先ほどの対散布図は欠損値含めて描いてしまいました。以下は、欠損値のあるデータフレームの行を取り除く(そのついでにMonthとDayも取り除き)操作を「一歩づつ」やってみたものです。D3にはNA無のデータがつまってます。結構怪しい(個人の意見です)データなので、欠損あるやつらにはお引き取り願った方が良かろうという勝手な判断です。

D0 <- airquality[!is.na(airquality$Ozone),1:4]
D1 <- D0[!is.na(D0$Solar.R),]
D2 <- D1[!is.na(D1$Wind),]
D3 <- D2[!is.na(D2$Temp),]
単回帰(線形)でオゾン濃度と放射、風速、温度のグラフ

各説明変数(候補)とオゾン濃度に関してプロットして線形な回帰直線を描いてみる操作が以下に。

library(ggplot2)
g10 <- ggplot(data=D3, aes(x=Solar.R, y=Ozone))+geom_point()
g11 <- g10 + geom_smooth(method="lm")+labs(title="airquality", x="Solar.R", y="Ozone")
g11
g20 <- ggplot(data=D3, aes(x=Wind, y=Ozone))+geom_point()
g21 <- g20 + geom_smooth(method="lm")+labs(title="airquality", x="Wind", y="Ozone")
g21
g30 <- ggplot(data=D3, aes(x=Temp, y=Ozone))+geom_point()
g31 <- g30 + geom_smooth(method="lm")+labs(title="airquality", x="Temp", y="Ozone")
g31

まずは太陽光の放射に対するオゾン濃度のグラフ。相当にバラついていますが、正の相関があるような雰囲気があり。でも正直よく分からんな~

SolarR

こちらは風速に対するオゾン濃度。風が強いとオゾンが吹き飛ばされて薄まるってか?ホントか。こちらのグラフの方が上よりは雰囲気でている?

Wind

最後は温度とオゾン濃度、こちらは割とまともに?正の相関っぽい。

Temp

計算するだけならタダなので、やってみました重回帰分析(線形。)結果は以下に。lmSummary

Estimateの欄を使えば「回帰式」をでっち上げることはできそうです。しかし、何だね、相当怪しい。信じちゃイケないやつかも。

データのお砂場(40) R言語、airmiles、米国の航空会社の旅客マイルとな、昔の へ戻る

データのお砂場(42) R言語、anscombe、平均、分散、線形な回帰直線、同じだけど違う へ進む