【このページは現在作成中です】
#準備(すべてに共通) # 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 #データフレームをきれいに表示するメソッド from IPython.display import display #標準化はよく使うのでインポート from sklearn.preprocessing import StandardScaler
#データの取り込み data = pd.read_csv("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/exam-pca.csv", index_col="受験番号")
display(data) df = data.copy() #要約統計量 display(df.describe()) #ヴァイオリン・プロット sns.violinplot(df) plt.show() #相関係数 sns.heatmap(df.corr(), annot=True)
#5科目の合計を計算 total = pd.DataFrame(df.sum(axis=1), columns=["合計"]) display(total) #total.columns=["合計"] #横棒グラフに可視化する total.sort_values("合計").plot.barh(title="5科目の合計", figsize=(8,16)) #積み上げ棒グラフで表示する(オプショナル) #df.loc[total.sort_values("合計").index].plot.barh(stacked=True, figsize=(8,16))
#66番と19番の得点を表示 display(df.loc[[66,19],:]) display(total.loc[[66,19]])
新しい軸 = w1*国語 + w2*数学 + w3*英語 + w4*物理 + w5*化学
from sklearn.decomposition import PCA pca = PCA(ハイパーパラメータ) #標準化されたデータフレームで学習させる pca.fit(df_sc)
#主成分のラベル (データフレームの列・行に名前を付ける際に使う) labels = [f"第{i+1}主成分" for i in range(pca.n_components_)] #主成分得点に変換.データフレームに入れなおす df_pca = pd.DataFrame(pca.transform(df_sc), index=df_sc, columns=labels) #主成分得点を表示 print("【主成分得点】") display(df_pca) #主成分負荷量 df_comp = pd.DataFrame(pca.components_, index=labels, columns=df_sc.columns) #主成分負荷量を表示 print("【主成分負荷量】") display(df_comp)
#まずは標準化 sc = StandardScaler() sc.fit(df) df_sc = pd.DataFrame(sc.transform(df), index=df.index, columns=df.columns)
#主成分分析を行う.次元数はデフォルトで元データの次元数(5)になる from sklearn.decomposition import PCA pca = PCA() pca.fit(df_sc) #主成分のラベル (データフレームの列・行に名前を付ける際に使う) labels = [f"第{i+1}主成分" for i in range(pca.n_components_)] #主成分得点に変換.データフレームに入れなおす df_pca = pd.DataFrame(pca.transform(df_sc), index=df_sc.index, columns=labels) #主成分得点を表示 print("【主成分得点】") display(df_pca) #主成分負荷量 df_comp = pd.DataFrame(pca.components_, index=labels, columns=df_sc.columns) #主成分負荷量を表示 print("【主成分負荷量】") display(df_comp) #分散,寄与率 df_var = pd.DataFrame(pca.explained_variance_, index=labels, columns=["分散"]) df_var["寄与率"] = pca.explained_variance_ratio_ df_var["累積寄与率"] = pca.explained_variance_ratio_.cumsum() print("【分散・寄与率】") display(df_var)
【売上データ】
【問題】
→ 特徴量エンジニアリングによって,新しい特徴量を作る
#準備(すべてに共通) # 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 # pandasのデータフレームを表示する関数 from IPython.display import display
#データをロードする(エクセルデータの読み込み) data = pd.read_excel("https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/yogurt.xlsx") data
#型チェック data.dtypes
#整形 df = data.copy() #売上日付をインデクスに df = df.set_index("売上日付") df
#売上個数を可視化 #箱ひげ図 df["売上数"].plot.box()
#時系列 df["売上数"].plot()
#月別に可視化 for y in [2021, 2022]: for i in range(1,13): df[(df.index.year==y)&(df.index.month==i)]["売上数"].plot.bar(title=f"{y}年{i}月", figsize=(8,6)) plt.show()
ヨーグルトAの売上数に関係ありそうなものは何か?
df["曜日"] = df.index.day_of_week
df["日"] = df.index.day
df["月"] = df.index.month
df["単価"] = df["売上額"] / df["売上数"]
n=3 for i in range(1, n+1): df[f"売上数-{n}"] = df["売上数"].shift(n)
#天気のデータを拾ってくる.インデクスを日付に data_weather = pd.read_csv("どこかの天気のデータ.csv") df_w = data_weather.set_index("日付") #売上データとマージする (参考:Python基礎演習6.2) df_merged = pd.merge(df, df_w, left_index=True, right_index=True)
多項式を使って,特徴量を作成するライブラリ
from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(ハイパーパラメータ) #データフレームをフィットさせる poly.fit(df) #dfは特徴量作成の元になる列を含んだデータフレーム #データフレームを変換して,データフレームに入れなおす df_poly = pd.DataFrame(poly.transform(df), index=df.index, columns=poly_features_names_out()) #確認する df_poly
#データフレームを適当に作る df_sample = pd.DataFrame(data={"a":[1,2,3,4,5], "b":[60,70,80,90,100]}) df_sample
#多項式特徴量を作成する from sklearn.preprocessing import PolynomialFeatures poly=PolynomialFeatures(degree=3,include_bias=False) poly.fit(df_sample) df_poly = pd.DataFrame(poly.transform(df_sample), index=df_sample.index, columns=poly.get_feature_names_out()) df_poly
# X, yのそれぞれを訓練データ、検証データ、テストデータに分ける from sklearn.model_selection import train_test_split
# まず、訓練・検証データとテストデータに分ける (訓練・検証:テスト=8:2) X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# さらに、訓練データと検証データに分ける (訓練:検証=7:3) X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.3, random_state=1)
# KFoldの処理で分割時の条件を指定 from sklearn.model_selection import KFold kf = KFold(n_splits = 3, shuffle = True, random_state = 0)
# cross_validate関数で交差検証を行う from sklearn.model_selection import cross_validate
# 線形回帰モデルの選択 from sklearn import linear_model model = linear_model.LinearRegression() result = cross_validate(model, X, y, cv = kf, scoring = 'r2', return_train_score = True) print(result)
#平均値を計算する sum(result['test_score']) / len(result['test_score'])
from sklearn.model_selection import StratfiedKFold skf = StratfiedKFold(n_splits = 3, shuffle = True, random_state = 0)