見出し画像

2-4 散布図と相関・範囲 〜 気温・散布図読み取りクイズ

今回の統計トピック


散布図の読み取りクイズを実施します!
気象庁ホームページから気象データを取得することにも挑戦します。

公式問題集の準備

「公式問題集」の問題を利用します。お手元に公式問題集をご用意ください。
公式問題集が無い場合もご安心ください!
「知る」「実践する」の章で、のんびり統計をお楽しみください!

問題を解く


📘公式問題集のカテゴリ

2変数記述統計の分野
問4 散布図と相関・範囲
(12月1日から50日間の日平均気温・日最高気温・日最低気温)

試験実施年月
統計検定2級 2016年6月 問1(回答番号3)

開いた百葉箱のイラスト:「いらすとや」さんより

問題

公式問題集をご参照ください。

解き方

題意
散布図の読み取りです。

相関係数の計算
問題文の次の点に注目します。

問題文Ⅰ
日平均気温と日最高気温の相関を確認するので、3つの散布図の真ん中「横軸:日平均気温、縦軸:日最高気温」を見ます。
散布図の各点には「右肩上がりの傾向」を確認できます。
右肩上がり=正の相関ですので、この問題文は適切です。

問題文Ⅱ
問題文の「範囲」は、最小値と最大値の範囲のことです。
「日最低気温の範囲」は3つ散布図の左側か右側で確認できます。
最小値がマイナス1度くらい、最高値が10度くらいですので、範囲は11度くらいです。
「日最高気温の範囲」は3つの散布図の真ん中か右側で確認できます。
最小値が5度くらい、最大値が23度くらいですので、範囲は18度くらいです。
日最低気温の範囲は日最高気温の範囲よりも小さいので、この問題文は適切です。

問題文Ⅲ
日平均気温と日最低気温の相関を確認するので、3つの散布図の左側「横軸:日平均気温、縦軸:日最低気温」を見ます。
散布図の各点には「右肩上がりの傾向」を確認できます。
右肩上がり=正の相関ですので、この問題文は適切ではありません。

まとめると、ⅠとⅡが正しいです。

解答

④です。

難易度 やさしい

・知識:散布図、相関、範囲
・計算力:不要
・時間目安:1分

知る


おしながき

公式問題集の問題に接近してみましょう!
ここでは「東京の2022年12月1日から50日間の日別平均気温、日最高気温、日最低気温」を参照データとして利用します。

【出典記載】
出典:気象庁「過去の気象データ検索」サイト
【コンテンツ編集・加工の記載】
記事の記載にあたっては、気象庁「過去の気象データ検索」サイトの情報をを加工して作成しています。

今回は散布図のクイズを出題します。相関を当ててください!

散布図

📕公式テキスト:1.6.1 散布図(26ページ~)

問題です
次の散布図に関するクイズ1~3に答えてみましょう!

東京の2022年12月1日から50日間の気温:問題

【クイズ1】
日平均気温と日最高気温の間には負の相関がある。
YESかNOか?

【クイズ2】
日平均気温と日最低気温の間には正の相関がある。
YESかNOか?

【クイズ3】
日最低気温は日最高気温より範囲が小さい。
YESかNOか?

クエスチョンマークの帽子を被っている男性のイラスト:「いらすとや」さんより

答え

【クイズ1】
NOです。
日平均気温と日最高気温の散布図(中央)をご覧ください。
右肩上がりの傾向=「正の相関」です。
日平均気温と日最高気温の間には正の相関があります。
相関係数は 0.79 です。

【クイズ2】
YESです。
日平均気温と日最低気温の散布図(左)をご覧ください。
右肩上がりの傾向=「正の相関」です。
日平均気温と日最低気温の間には正の相関があります。
相関係数は 0.79 です。

東京の2022年12月1日から50日間の気温:解答

【クイズ3】
NOです。
日最低気温の範囲は 8.5 (最大値 8.4、最小値 -0.1)
日最高気温の範囲は 8.3 (最大値 15.9、最小値 7.6)
日最低気温は日最高気温より範囲が大きいです。
僅差です。難問でした。

最小値・最大値:解答

お疲れ様でした。

散布図と推移で気温の関係を探る

不思議に見えることがあります。
平均気温と日最低気温/日最高気温」の関係は強めの相関(相関係数=0.79)です。
しかし「日最低気温と日最高気温どうし」の関係は弱めの相関(相関係数=0.35)です。

気温の推移グラフを見てみましょう。
赤点線はおおまかな傾向を示す補助線です。

気温の推移グラフ

グリーンの最低気温とオレンジの最高気温の変動幅は一定とは言えないようです。
1日24時間の全体の平均気温は安定的としても、一瞬一瞬の時点の最低気温・最高気温はピョンと大きなジャンプをするかのような振り幅を持っています。
大きな振り幅を持つ最低気温・最高気温の間の相関は弱くなるようです。

一方で、平均気温は1日の平均を取ることで振り幅が弱まります。
「振り幅の弱い平均気温」と「最低気温・最高気温」との間の相関は強くなるようです。


実践する


気象庁のサイトから日気温情報を取得してみよう

「東京の2022年12月1日から50日間の日別平均気温、日最高気温、日最低気温」のデータは気象庁のホームページで公開されています。

「過去の気象データ検索」のページで気象データを閲覧できます。

日平均気温等のデータの検索
「都道府県の選択」と「地点の選択」を行って、気象観測地点を選びます。
「年月日の選択」で「年」と「月」を選びます。
ここまで進むと「データの種類」のエリアのリンクが活性化されます。
この例では「2022年12月の日ごとの値を表示」を実行します。

気象庁ホームページより

東京の2022年12月の日ごとの値
毎日の気圧、降水量、気温、湿度、風、雪、天気概況の情報が一覧表示されます。

気象庁ホームページより

データのダウンロード
「過去の気象データ・ダウンロード」のページでCSVファイル形式でデータをダウンロードできます。

過去の気象データ・ダウンロード画面イメージ
検索条件を指定して(記載を省略しています)、画面表示できます。
「CSVファイルをダウンロード」ボタンを押すと、ファイル保存画面が表示され、CSVファイルをダウンロードできます。

気象庁ホームページより


CSVファイルのダウンロード

こちらのリンクから整形後のCSVファイルをダウンロードできます。
Pythonサンプルファイルを利用する方は、このCSVファイルをダウンロードしてください。


電卓・手作業で作成してみよう!

気象庁のホームページで気温などの気象データを表示したり、ファイルダウンロードをしてみましょう。

EXCELで作成してみよう!

今回はお休みです。

EXCELサンプルファイルのダウンロード
今回はファイル提供はありません。

Pythonで作成してみよう!

プログラムコードを読んで、データを流したりデータを変えてみたりして、データを追いかけることで、作表ロジックを把握する方法も効果的でしょう。
サンプルコードを揃えておけば、類似する作表作業を自動化して素早く結果を得ることができます。

今回は、クイズで使用した散布図・推移グラフの作成と統計量の表示に取り組みます。

①ライブラリのインポート
主にpandasとnumpyを利用します。
回帰直線の作成にscikit-learnのLinearRegressionを使用します。

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'MS Gothic'
%matplotlib inline

②CSVファイルの読み込み
まず、上述のダウンロードリンクより、CSVファイルをダウンロードします。
その後、次のコードを実行して、CSVファイルをpandasのデータフレームに読み込みます。

datafile = './sample_data.csv' # CSVファイルの格納フォルダとファイル名を設定
df = pd.read_csv(datafile, index_col='日付')
print(df.shape)
display(df.head())
出力イメージ

③x、yの統計量の表示1
pandasのdescribeで要約統計量を表示します。

# describe()の標準偏差stdは標本標準偏差(不偏分散の正の平方根)。1/(n-1)で計算
df.describe()
出力イメージ

④x、yの統計量の表示2
pandasの以下の関数で統計量を取得します。

  • var: 分散

  • std: 標準偏差

  • cov: 共分散

  • corr: 相関係数

# 分散、標準偏差、共分散、相関係数の計算
# 引数ddof=0とすることで母標準偏差等を計算。1/nで計算
# 引数ddof=1とすることで標本標準偏差等を計算。1/(n+1)で計算

# 分散・標準偏差の表示
print('【分散・標準偏差】')
for col in df.columns:
    print(f'{col:16}  分散 : {df[col].var(ddof=0):7.2f}, '
          f'標準偏差: {df[col].std(ddof=0):5.2f}')

# 共分散・相関係数の表示
print('\n【分散共分散行列】')
print(df.cov(ddof=0))
print('\n【相関係数行列】')
print(df.corr())
出力イメージ

⑤散布図の表示
相関係数等の表示なし版です。

# 相関係数等の表示なし
xy_pair = [['日平均気温', '日最低気温'],
           ['日平均気温', '日最高気温'],
           ['日最低気温', '日最高気温']]

fig, ax = plt.subplots(1, 3, figsize=(10, 4))

for idx, (x_col, y_col) in enumerate(xy_pair):
    x, y = df[x_col], df[y_col]
    corr_coef = np.corrcoef(x, y)
    ax[idx].scatter(x, y, s=50, c='steelblue', ec='darkblue', alpha=0.3)
    ax[idx].set_xlabel(x_col)
    ax[idx].set_ylabel(y_col)
    
fig.suptitle('東京の2022年12月1日から50日間の気温(℃)')
plt.tight_layout()

# plt.savefig('./scatter1.png') # グラフ画像ファイルの保存
plt.show()
出力イメージ

相関係数等の表示あり版です。

# 相関係数等の表示あり

# 初期化
reg = LinearRegression()
result_dic = {}

# 描画
fig, ax = plt.subplots(1, 3, figsize=(10, 4))

for idx, (x_col, y_col) in enumerate(xy_pair):
    # 散布図のプロット
    x, y = df[x_col], df[y_col]
    corr_coef_ = np.corrcoef(x, y)
    ax[idx].scatter(x, y, s=50, c='steelblue', ec='darkblue', alpha=0.3)
    ax[idx].set_xlabel(x_col)
    ax[idx].set_ylabel(y_col)
    
    # 回帰直線のプロット
    x, y = df[[x_col]], df[[y_col]]
    reg.fit(x, y)
    y_pred = reg.predict(x)
    ax[idx].plot(x, y_pred, c='red', lw=0.5)

    # 回帰直線の式と決定係数の表示
    r2, coef, intercept = reg.score(x, y), reg.coef_[0][0], reg.intercept_[0]
    corr_coef = corr_coef_[0][1]
    result_dic[f'x軸:{x_col} y軸:{y_col}'] = {'corr_coef': corr_coef,
                                              'reg_coef': coef, 'reg_int': intercept,
                                              'reg_R2': r2, }
    ax[idx].set_title(f'$r={corr_coef:.2f}:\ '
                      f'y={coef:.2f}x{intercept:+.2f},\ '
                      f'R^2={r2:.2f}$', fontsize=10)
    
fig.suptitle('東京の2022年12月1日から50日間の気温(℃)')
plt.tight_layout()

# plt.savefig('./scatter2.png') # グラフ画像ファイルの保存
plt.show()
出力イメージ

⑥気温の時系列推移(5日移動平均線付き)
pandasのrollongを利用して5日移動平均を算出します。

# 5日移動平均データの生
df_5move_ave = df.rolling(window=5).mean()

plt.figure(figsize=(7, 4))
# 日平均気温・日最高気温・日最低気温のプロット
plt.plot(df, label=df.columns, lw=0.5)
# 5日移動平均のプロット
plt.plot(df_5move_ave, c='red', lw=0.5, ls='--')
# 修飾
plt.xticks(np.arange(0, 51, 7))
plt.grid(axis='both', c='gray', lw=0.1)
plt.title('東京の2022年12月1日から50日間の気温の推移(赤点線:5日移動平均線)')
plt.xlabel('日付')
plt.ylabel('気温(℃)')
plt.legend(loc='best')
plt.tight_layout()

plt.savefig('./plot.png') # グラフ画像ファイルの保存
plt.show()
出力イメージ


Pythonサンプルファイルのダウンロード

こちらのリンクからJupyter Notebook形式のサンプルファイルをダウンロードできます。



おわりに

今年の冬は寒かったですね。冬らしい冬だったと思います。
今回取り扱った期間では、年末年始の日最低気温が冬らしい寒さを示しています。
取り扱い外ですが別途、1月20日以降のデータを見ますと、日平均気温が5℃以下の日が続いていました。
日平均気温が氷点下の日もありました(1月25日)。
吸湿発熱繊維(ヒートテック)のインナーのおかげで暖かく過ごすことができました。

最後までお読みいただきまして、ありがとうございました。


のんびり統計シリーズの記事

次の記事

前の記事

目次

この記事が参加している募集

私のストレス解消法

この記事が気に入ったらサポートをしてみませんか?