```{python}
# japanize_matplotlibとpolarsのインストール
!pip install -qq japanize_matplotlib
!pip install -qq polars pyarrow
```
2 データの可視化
# 利用するライブラリを読み込む
# as で別名をつけることができる(長いライブラリ名の省略)
import japanize_matplotlib # matplotlibの日本語化
import matplotlib.pyplot as plt # データ可視化
import numpy as np # 数値計算用
import pandas as pd # 表形式データの操作
import polars as pl # pandas と同じく表形式データの操作
データフレームの操作にはpolars
とpandas
の2つのライブラリを使用すると便利です。
# データ(csvファイル)の読み込み
# ファイルがある場所(パス)を指定する
# ウェブ上のデータを読み込む場合はURLを指定する
= pl.read_csv(
df "https://raw.githubusercontent.com/uribo/cue2022aw_r104/main/data-raw/shikoku_kome_sisyutu2019to2021/20221121T014749Z-f75ff/shikoku_kome_sisyutu2019to2021.csv"
)
# 読み込んだデータの確認
# shape: データの行数と列数を確認する
df.shape
(864, 6)
# 型の確認
df.dtypes
[Int64, Utf8, Int64, Utf8, Utf8, Int64]
2.0.1 データの可視化
コードセルでdf
と入力して実行すると、データフレームの中身が表示されます。 一方、行数の多いデータを出力すると画面が埋まってしまうので、一部だけを確認したいこともあります。 その場合、headやtailを使います。これにより、データフレームの先頭行や末尾行を表示することができます。括弧内の値は表示する行数です。
# 先頭3行を表示する
3) df.head(
ym | 品目分類 | 市区町村コード | 市 | 項目 | value |
---|---|---|---|---|---|
i64 | str | i64 | str | str | i64 |
201901 | "アイスクリーム・シャーベット… | 36201 | "徳島市" | "支出金額_複数単位" | 367 |
201901 | "アイスクリーム・シャーベット… | 36201 | "徳島市" | "購入頻度_100世帯当たり" | 123 |
201901 | "殺虫・防虫剤" | 36201 | "徳島市" | "支出金額_複数単位" | 7 |
# 末尾2行を表示する
2) df.tail(
ym | 品目分類 | 市区町村コード | 市 | 項目 | value |
---|---|---|---|---|---|
i64 | str | i64 | str | str | i64 |
202112 | "米" | 39201 | "高知市" | "支出金額_複数単位" | 1557 |
202112 | "米" | 39201 | "高知市" | "購入頻度_100世帯当たり" | 73 |
続いて、簡単なグラフを作成してみましょう。matplotlib
にはPythonでグラフを作成する際に便利な関数をまとめたpyplot
というモジュールがあります。pyplot
をplt
という名前でインポートしておきます。
# import matplotlib.pyplot as plt # 最初のコードセルで実行済み
plt
には、plot
やscatter
などの関数があります。plot
は折れ線グラフを、scatter
は散布図を作成します。今回は棒グラフを作成したいのでbar
が対応します。
これらの関数の引数には、グラフに描画するx軸の値とy軸の値(変数)を指定します。
matplotlibがサポートするグラフの種類や詳しい関数の利用方法は公式ドキュメントを参照してください。
# 棒グラフを作成
# x軸には品目分類、y軸にはvalueを指定する
"品目分類"], df["value"])
plt.bar(df[# plt.show() # グラフを表示する
別のグラフを作成してみましょう。
polarsライブラリのデータ操作関数を使い、一部のデータを抽出してグラフを作成してみます。
= df.filter((pl.col("項目") == "支出金額_複数単位") & (pl.col("市区町村コード") == 36201))
df2 = df2.select("ym", "品目分類", "value")
df2 4) df2.head(
ym | 品目分類 | value |
---|---|---|
i64 | str | i64 |
201901 | "アイスクリーム・シャーベット… | 367 |
201901 | "殺虫・防虫剤" | 7 |
201901 | "米" | 1138 |
201902 | "アイスクリーム・シャーベット… | 244 |
上記のコードは以下のコードの実行結果と同じです。 polarsでは、.
を使って処理内容をつなげて記述することができます。こうすることで変数への代入の手間がなくなるとともにコードを簡潔に記述できる利点があります。
= df.filter((df["項目"] == "支出金額_複数単位") & (df["市区町村コード"] == 36201)).select(
df2 "ym", "品目分類", "value"
)4) df2.head(
ym | 品目分類 | value |
---|---|---|
i64 | str | i64 |
201901 | "アイスクリーム・シャーベット… | 367 |
201901 | "殺虫・防虫剤" | 7 |
201901 | "米" | 1138 |
201902 | "アイスクリーム・シャーベット… | 244 |
データの加工が済んだのでグラフを作成します。品目分類別に折れ線グラフを作成したいので、groupby
関数を使います。groupby
関数は、指定した列の値ごとにデータをグループ化します。今回はitem
列の値ごとにグループ化します。
# pandasデータフレームに変換
= df2.to_pandas()
df_pnd # 年月の表現を変換 (i64クラスの年月をdatetime形式に変換)
"ym"] = pd.to_datetime(df_pnd["ym"], format="%Y%m")
df_pnd[
# 品目ごとにデータフレームをグループ化
= df_pnd.groupby("品目分類")
grouped
# グループごとにプロット
for item, group in grouped:
"ym"], group["value"], label=item)
plt.plot(group[
"年月")
plt.xlabel("金額")
plt.ylabel("徳島市における品目分類別の支出金額の推移")
plt.title(
plt.legend()True)
plt.grid( plt.show()
2.0.1.1 棒グラフの塗り分け
# グループごとに値を集計
= df2.groupby("品目分類").agg(total_value=pl.col("value").sum())
grouped_df # グループ名と集計された値を取得
= grouped_df.get_columns()
groups, aggregated_values
# カラーマップを作成
= plt.cm.viridis(np.linspace(0, 1, len(groups)))
colors
# 棒グラフを描画し、グループごとに塗り分け
=colors)
plt.bar(groups, aggregated_values, color
"品目")
plt.xlabel("総支出金額")
plt.ylabel("徳島市における品目別支出金額総計")
plt.title( plt.show()
2.0.2 インタラクティブに操作可能な図の作成
plotlyライブラリを使うとインタラクティブに操作できるグラフを作成できます。
import plotly.graph_objects as go
# 棒グラフを作成
= go.Figure(data=[go.Bar(x=groups, y=aggregated_values)]) fig
# グラフのタイトルと軸ラベルを設定
fig.update_layout(="徳島市における品目別支出金額総計",
title="品目",
xaxis_title="総支出金額",
yaxis_title
)
# グラフを表示
fig.show()