【このページは現在作成中です】

第4回:探索的データ分析,教師なし学習

4.1 探索的データ分析

探索的データ分析 (Exploratory Data Analysis)

EDAって何?

データとお友達になる

EDAでやるべきこと

例題:シェアサイクルの需要予測問題

4_bike_sharing_pic.png
出典:神戸コミュニティサイクル「コベリン」

準備

  1. Google Colabを開き,新規ノートブックを作成
  2. ノートブックの名前 Untitled.ipynb を bike-eda.ipynb に変更する
#準備(すべてに共通)
# PandasとNumpyをインポート
import pandas as pd
import numpy as np

# 日本語化Matplotlibもインポート
import matplotlib.pyplot as plt
!pip install japanize-matplotlib
import japanize_matplotlib

# Seabornもインポート
import seaborn as sns

# pickleをインポート(モデルの保存用)
import pickle

# データの取得
data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/bike-sharing-day.csv")
data

(A) データの確認と整形

データ項目の確認

4_bike_data.png

表データの確認

データが構造化された表にちゃんと収まっているかを確認する

表データの整形

分析用のデータセットの作成に向けて,データの型やインデクスを整えていく

シェアサイクルのデータを整形する

#オリジナルデータをコピーして作業
df = data.copy()
#dtedayを日付型に変換
df["dteday"] = pd.to_datetime(df["dteday"])
#確認
df.info()
df
#season, holiday, weekday, workingday, weathersitをカテゴリ型に変換
for col in ["season", "holiday", "weekday", "workingday", "weathersit"]:
  df[col] = df[col].astype("category")
#確認
df.info()
df
#dtedayをインデクスに設定して時系列データにする
df.set_index("dteday", inplace=True)
#確認
df.info()
df
#instant, yr, mnth: 冗長なので削除
df.drop(columns=["instant", "yr", "mnth"], inplace=True)
#確認
df.info()
df

(B) データを眺める

様々な観点からデータを探索(要約・可視化)して,データが持つ性質を理解する

可視化にはpythonのライブラリを使う

1変数を眺める

シェアサイクルのデータを眺める

df.describe()
#カテゴリの列を要約
for col in df.columns[0:5]:
  print(f"\n【{col}の要約】")
  print(df[col].value_counts())
#気象データの分布を箱ひげ図で可視化
sns.boxplot(df[["temp", "atemp", "hum", "windspeed"]]) 
#利用者データの分布を箱ひげ図で可視化
sns.boxplot(df[["casual", "registered", "cnt"]])
#各変数のヒストグラムを描いてみる.サブプロットを使って,1枚の図に並べる
fig, axes= plt.subplots(nrows=4, ncols=2, tight_layout=True, squeeze=False)

for i, col in enumerate(["temp", "atemp", "hum", "windspeed", "cnt", "casual", "registered"]):
  sns.histplot(df[col], ax=axes[i//2, i%2], bins=40)
#利用者データの推移を見てみる
fig, axes = plt.subplots(nrows=2, ncols=1, tight_layout=True, squeeze=False, figsize=(6,8))

#利用者データの推移
df[["casual", "registered", "cnt"]].plot(ax=axes[0,0], title="利用者データの推移(日次)")
#利用者データの月ごとの推移を棒グラフで(登録・都度の内訳)
df[["casual", "registered"]].resample("M").sum().plot.bar(stacked=True, ax=axes[1,0], title="利用者データの推移(月次)")

2変数間の関係を眺める

グループに分けて比較する

4.2 教師なし学習:クラスタリング

教師なし学習

クラスタリング

階層的クラスタリング

非階層的クラスタリング

4.3 教師なし学習:次元削減

次元の呪い

次元削減

主成分分析


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS