課題提出のページを熟読したうえで,以下の演習課題に取り組みなさい
【注意】課題提出サイトにおいては,選択肢の順番がシャッフルされることがあるので注意してください.
Q4-1【箱ひげ図】
Q4-2【ヒストグラム】
Q4-3【相関係数】
Q4-4【データの整形】
【データの整形】
【プログラムのスケルトン】
# 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【データの欠損値処理】
平均気圧 0 合計降水量 187 平均気温 0 最高気温 0 最低気温 0 平均湿度 0 最大風速 1 最大風速風向 1 日照時間 2 天気概況・昼 0
#ここから # # 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 【卸売業者のデータを眺める】
【データの説明】
#0: Channel: 販売チャンネル 1: Horeca (ホテル,レストラン,カフェ) 2: Retail (小売店) #1: Region: 消費地域 1: リスボン 2: ポルト 3: その他 #2: Fresh: 生鮮品の年間売上 #3: Milk: 乳製品の年間売上 #4: Grocery: 食料雑貨の年間売上 #5: Frozen: 冷凍品の年間売上 #6: Detergents_Paper: 洗剤,紙製品の年間売上 #7: Delicatessen: 惣菜の年間売上
Channel 1 (Horeca): ___ 件 2 (小売店): ___ 件 Region 1 (リスボン): ___ 件 2 (ポルト): ___ 件 3 (その他): ___ 件
1位: __(品目)__ __(金額)__ 2位: __(品目)__ __(金額)__ 3位: __(品目)__ __(金額)__
Fresh: Horeca/小売店 Milk: Horeca/小売店 Grocery: Horeca/小売店 Frozen: Horeca/小売店 Detergents_Paper: Horeca/小売店 Delicassen: Horeca/小売店
Fresh: リスボン/ポルト Milk: リスボン/ポルト Grocery: リスボン/ポルト Frozen: リスボン/ポルト Detergents_Paper: リスボン/ポルト Delicassen: リスボン/ポルト
___(品目)___ ___(相関係数)___
Fresh: __________ Milk: __________ Grocery: __________ Frozen: __________ Detergents_Paper: __________ Delicassen: __________
【プログラムのスケルトン】
#準備(すべてに共通)
# 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.head(10))
#Step2. 標準化する
from sklearn.preprocessing import StandardScaler
sc = ##############()
# 標準化して,データフレームに入れる
df2_sc = pd.DataFrame(sc.fit_transform(#####), index=########, columns=#########)
# 確認する
print("\n【標準化したデータ】\n", df2_sc.head(10))
# 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.head(10))
# 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 【特異な顧客を見つける】