2022/12/31 データ分析備忘〜スポーツのチケット価格の適正化〜

今年はデータ分析コンペの主催者であるSIGNATEの講座復習をしてからコンペに臨むことにします。
今年意識していることはショートカットキーでいかに指の動きを少なくタイピングするかです。例えばdeleteはctr+dとか、これをすることで時間のロスを防げます。

2023/1/1付けで、講座修了しました。特徴量エンジニアリングで、セグメント知識が必要になることがわかった。有名選手が入団した年以降は観客が多くなるので、この年にこの選手が入団しているとか。この辺りは各チームとか年で考えるとかなり時間がかかりそうだし、Jリーグに興味ない私にとっては不利だなと感じています。
でも、この講座をやったことで、pandasの使い方とかメソッドコードの書き方とか色々思い出せた。


量的変数同士の相関を確認するには、散布図
質的変数と量的変数の相関は、箱ひげ図:外れ値があると表示される。J1より、J2の方が中央値がたかいとか、月別の中央値とかが目視できる。

数の条件を満たす時にはdata[(data['カラム名'] == 値]) & (data['カラム名'] == 値])]と書けます。

# 節数を抜き出し、int型に変換する関数get_match()を作成してください。
def get_match(x):
return int(x[x.find('第')+1:x.find('節')])
# 節数を表すmatch_numカラムを作成してください。
data['match_num']=data['match'].apply(get_match)
# match_numカラムが正しく作成されたか確認。
print(data['match_num'].unique())

複数カラムを抜き出すには、DataFrame[['列名1', '列名2',・・・]]とします。取り出したいカラムをリストで指定する。

data['weather'][data['weather'] == '雪'] = '雨'

pandas.DataFrameのinfo()メソッド

Pythonの組み込み関数len()でpandas.DataFrame

pandas.DataFrameの列数はcolumns属性に対してlen()
print(len(df.columns))

pandas.DataFrameのshape属性で行数と列数をタプル(行数, 列数)で取得

MSEの特徴は、複数の予測対象のうち1つでも大きく予測を外すと、評価関数における評価が大きく悪化します。その為、予測したいタスクにおいて予測を大きく外すことが弊害となるような課題においてRMSEを採用することは良い選択と言えます。

モデルの箱を代入する変数名をlrとし、モデルを表す箱を準備しましょう。
model = LinearRegression()
これはコンストラクタを呼び出している(=初期化メソッド)(=インスタンス化されたときに最初に呼ばれる特別なメソッド)。modelをインスタンス化(=オブジェクト化)する。
インスタンス化することでmodel.メソッド名でメソッドが使えるようになる。

モデル名.coef_
とすることで偏回帰係数を表示することができます。
また、モデル名.intercept_とすると切片を表示できます。
回帰係数だけを表示させても、それがどのカラムに対応しているのか分かりづらいです。
なので、indexにカラム名を、係数カラムにcoef_の値(係数)をもつデータフレームを作成しましょう。
pd.DataFrame(lr.coef_, index=X_train.columns)
とすることで、X_train.columnsをindexに持ち、lr.coef_をカラムにもつデータフレームを作成できます。

過学習が起きているかの見極め方の1つとしては、学習データと評価データそれぞれの予測精度のギャップを見ることです。過学習では学習データへの予測精度は高いが、評価データへの予測精度が著しく低くなる現象の為、両方の評価値を見ることで、過学習が発生していそうかどうかをある程度推測する事ができます。

カラム名を元に結合するにはmergeを使いましたが、indexを元に結合する際はconcatを使います。
X_trainの下にX_testを結合してtmpというデータフレームにしてください
tmp = pd.concat([X_train,X_test])
元々の変数dataの右にtmpのpredカラムとresカラムをindexを元に結合してdataに再代入してください
data = pd.concat([data,tmp[['pred','res']]],axis=1)

# 空欄を埋めて最後の2節なら1、それ以外なら0であるlast_matchカラムを作成してください
data['last_match'] = 0
data['last_match'][((data['match_num'] == 31) | (data['match_num'] == 32)) & (data['stage'] == 'J1')] = 1
data['last_match'][((data['match_num'] == 41) | (data['match_num'] == 42)) & (data['stage'] == 'J2')] = 1
data['last_match'].value_counts()

# last_matchカラムが作成できたか確認して、last_matchに該当する(1になっている)試合数を変数chkに入力してください。
chk = 80
セレッソ大阪の箱ひげ図はこのように描けます。
sns.boxplot(data=data[data['away'] == 'セレッソ大阪'], x='year', y='y')

X_train.columnsをindexに持ち、lr.coef_をカラムにもつデータフレームはこのように書けます。pd.DataFrame({'係数':lr.coef_},index=X_train.columns)

この記事が気に入ったらサポートをしてみませんか?