第4回

第4回演習課題

課題提出のページを熟読したうえで,以下の演習課題に取り組みなさい

基礎問題

【注意】課題提出サイトにおいては,選択肢の順番がシャッフルされることがあるので注意してください.

Q4-1【箱ひげ図】

Q4-2【ヒストグラム】

Q4-3【相関係数】

Q4-4【データの整形】

【データの整形】

  1. pandasのデータフレームに読み込む
  2. 各列の型をチェックする
  3. 日付の列をdatetime型に変換
  4. 最大風速風向,天気概況・昼の列をcategory型に変換
  5. 日付の列をインデクスにセット

【プログラムのスケルトン】

# Pandasをインポート
import pandas as pd

#1. pandasのデータフレームに読み込む
data = pd.###########("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/kobe_weather_202210_202309.csv", encoding="UTF-8")
#オリジナルのデータをコピーしておく
df = data.copy()

#2. 各列の型をチェックする
print("【整形前】\n", df.dtypes)

#3. 日付の列をdatetime型に変換
df["日付"] = pd.###############(df["日付"])

#4. 最大風速風向,天気概況・昼の列をcategory型に変換
df["最大風速風向"] = df["最大風速風向"].########("#######")
df["天気概況・昼"] = df["天気概況・昼"].########("#######")

#5. 日付の列をインデクスにセット
df = df.###########("日付")

#再び,各列の型をチェックする
print("【整形後】\n", df.dtypes)

#確認
df

Q4-5【データの欠損値処理】

  1. 【合計降水量】 0で埋める
  2. 【最大風速】 前後の値の線形補間で埋める
  3. 【最大風速風向】 同月の最も頻度の高い風向で埋める
  4. 【日照時間】 前日の日照時間で埋める
#ここから
#
# Q4-4のコードをそのまま貼り付ける
#
#ここまで
#欠損値をチェックする
print("【欠損値の確認】\n", df.isnull().sum())
#【合計降水量】 欠損値を0で埋める
df["合計降水量"] = df["合計降水量"].########(#)
#【最大風速】 欠損値を線形補間で埋める
df["最大風速"] = df["最大風速"].##########()
#【日照時間】 前日の日照時間で埋める
df["日照時間"] = df["日照時間"].#######(###########)
#【最大風速風向】欠損している日付のデータを見つける
df[df["最大風速風向"].isnull()]
#その月の最大風速風向の最頻値を見つける
df.loc["20##-##-##":"20##-##-##", "最大風速風向"].#######()
#見つかった最頻値で埋める
df.loc["20##-##-##", "最大風速風向"] = "######"
#再びチェックする
print("【欠損値処理後】\n", df.isnull().sum()) 

応用問題

【データの説明】

Q4-6 【データを眺める】

【プログラムのスケルトン】

#準備(すべてに共通)
# PandasとNumpyをインポート
import pandas as pd
import numpy as np

# 日本語化Matplotlibもインポート
import matplotlib.pyplot as plt
# ↓の1行は提出時には削除すること
!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/wholesale_customers.csv")

#オリジナルデータをコピーしておく
df = data.copy()
df
#以降,EDAを行う

Q4-7 【ポルトの購買層】

【プログラムのスケルトン】

### Q4-6からそのまま再利用
#準備(すべてに共通)
# PandasとNumpyをインポート
import pandas as pd
import numpy as np

# 日本語化Matplotlibもインポート
import matplotlib.pyplot as plt
# ↓の1行は提出時には削除すること
!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/wholesale_customers.csv")

#オリジナルデータをコピーしておく
df = data.copy()
df
### ここまで #####

# デンドログラムを描く関数(基本的に触らないこと)
from scipy.cluster.hierarchy import dendrogram
def plot_dendrogram(model, **kwargs):
    counts = np.zeros(model.children_.shape[0])
    n_samples = len(model.labels_)
    for i, merge in enumerate(model.children_):
        current_count = 0
        for child_idx in merge:
            if child_idx < n_samples:
                current_count += 1  # leaf node
            else:
                current_count += counts[child_idx - n_samples]
        counts[i] = current_count

    linkage_matrix = np.column_stack(
        [model.children_, model.distances_, counts]
    ).astype(float)
    dendrogram(linkage_matrix, **kwargs)
### ここまで
#Step1. ポルトのデータに絞って,df2を得る
# dfからRegionが2の行と,"Fresh"以降の列を取り出す
df2 = df.loc[df[#######]==##, "Fresh":].copy()
#確認する
print("【ポルトの売上データ】\n", df2)

#Step2. 標準化する
from sklearn.preprocessing import StandardScaler
sc = ##############()
# 標準化して,データフレームに入れる
df2_sc = pd.DataFrame(sc.fit_transform(#####), index=########, columns=#########)
# 確認する
print("\n【標準化したデータ】\n", df2_sc)
# Step3. 階層的クラスタリングを適用し,デンドログラムを描く
#凝集型階層的クラスタリングのモデル
from sklearn.cluster import AgglomerativeClustering
#クラスタ数の指定なし.distance_threshold=0 とすると,最後までクラスタリングを続ける
model = AgglomerativeClustering(n_clusters=None, distance_threshold=0)
#標準化したデータで学習.教師なしなので,yが不要
model.fit(#######)
#デンドログラムを描画する
plot_dendrogram(#######, labels=df2.index)
#Step4. 上記のデンドログラムを参考に,クラスタ数を7でクラスタリングする
k = 7
model2 = AgglomerativeClustering(n_clusters=####)
model2.fit(#######)
#元データにクラスタのラベルを付けてみる
df2["クラスタ"] = model2.#########
print("\n【クラスタリング結果】\n", df2)
# Step5. クラスタ毎にデータを表示・要約する
#各クラスタの内容を表示する
for i in range(###):
  print(f"\n\n【クラスタ No. {i}】")
  print(df2[df2["クラスタ"]==i])

#各クラスタの記述統計量(平均)を計算して表示
df_mean = df2.########("#########").mean()
print("\n【各クラスタを平均で要約】\n", df_mean)

#積み上げ棒グラフでプロットする(オプショナル)
#df_mean.plot.bar(stacked=True)

発展問題

Q4-8 【特異な顧客を見つける】


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