散布図は、縦軸と横軸に2種類の量や大きさなどを対応させ、データを点でプロットしたグラフです。
2種類の値の関係を確認したいときに利用します。
散布図の描画は、DataFrameであるdf
に対し以下のように実行します。
df.plot.scatter(x=x軸に使う列の列名, y=y軸に使う列の列名, オプション)
本問で使用するオプションは、x
とy
です。
引数x
とy
は、必ず指定する必要があります。
演習
%matplotlib inline import pandas as pd from datetime import datetime df = pd.read_csv('dataset/attendances.csv', parse_dates=["Date"])
新しく列DayOfWeek
を作成して曜日(df.Date.dt.weekday
)を代入します。0は月曜日に当たります。
df["DayOfWeek"] = df.Date.dt.weekday df[:6]
Out[2]:
Date | Office | Tele | DayOfWeek | |
---|---|---|---|---|
0 | 2019-06-03 | 19 | 21 | 0 |
1 | 2019-06-04 | 2 | 38 | 1 |
2 | 2019-06-05 | 11 | 29 | 2 |
3 | 2019-06-06 | 8 | 32 | 3 |
4 | 2019-06-07 | 6 | 33 | 4 |
5 | 2019-06-10 | 8 | 32 | 0 |
x軸を列DayOfWeek
に、y軸を列Officee
にして散布図を描画します。 木曜日(3.0
)や金曜日(4.0
)は、出社している人が少ないのがわかります。 また、土曜日(5.0
)と日曜日(6.0
)がないことから、土日のデータは含まれていないことがわかります。In [3]:
df.plot.scatter(x="DayOfWeek", y="Office");
補足
今回描画した散布図を見ると、列DayOfWeek
の値が0から4(月曜から金曜の平日)で5と6(土日)がないことから、土日のデータが存在しないことがわかります。
下記のように実際に確認すると、列Date
には2019-06-08
や2019-06-09
のような土日のデータがありません。
df[:6]
Date | Office | Tele | DayOfWeek | |
---|---|---|---|---|
0 | 2019-06-03 | 19 | 21 | 0 |
1 | 2019-06-04 | 2 | 38 | 1 |
2 | 2019-06-05 | 11 | 29 | 2 |
3 | 2019-06-06 | 8 | 32 | 3 |
4 | 2019-06-07 | 6 | 33 | 4 |
5 | 2019-06-10 | 8 | 32 | 0 |
このように欠けている日付がある場合、グラフ上で意図しない位置にデータがプロットされることがあるので注意が必要です。
たとえば、下記のように列Date
の要素の型を文字列として散布図を描画すると、横軸の2019-06-07
の隣は2019-06-10
になります。
これは、横軸に列Date
の値を順番に表示しているからです。
df = pd.read_csv('dataset/attendances.csv')
df[:6].plot.scatter(x="Date", y="Office", rot=20)
一方、本問の列Date
は日付時刻型になっているので、下記のように散布図を書くと横軸は時系列に沿って描画されます。
すなわち、横軸の2019-06-07
と2019-06-10
の間に(データはありませんが)2019-06-08
と2019-06-09
のスペースが空きます。
df = pd.read_csv('dataset/attendances.csv', parse_dates=["Date"])
df[:6].plot.scatter(x="Date", y="Office", rot=20)
このように、型によってグラフ上でプロットされる位置が変わることがあります。グラフ描画時には、描画した結果を確認し、意図しない位置にデータがプロットされていないか確認しましょう。
コメント