モデルがきれいにデータフレームを分けるところを見たい話。day1
皆様お疲れ様です。
前回の記事でやってみたいとお話しした“正解のあるデータフレーム“の作成に早速取り組んでいこうかと思います。
【データフレームの中身】
今のところこんな感じのカラムを作っていこうかなーというのを一覧にしてみました。
青塗りした行が今回目的変数となる「英検準1級に合格するか否か?」の情報が入ったカラムになります。二値分類なので、受かる人は1、受からない人は0で表します。その他のカラムについては都度説明入れていきます。
【コーディング ライブラリのインポート】
それでは早速コーディング。まず使いそうなライブラリをインポートしていきます。
ちなみにコードの解説とかはあんまりしない予定です。よくわからないまま使っているものも結構あるので…(笑)warningsとかずっとなんかのおまじないだと思ってる。
【コーディング データフレームの作成】
次に、idとage(年齢)カラムの2つでとりあえず10万行のデータフレームを作っていきます。ageカラムは今回分岐の主軸にする予定*なので、なんとなく下記のような正規分布になるよう乱数を生成しておこうかと思います。
・平均30、標準偏差10くらいにしてみる。
・minは5〜8歳くらいで。たまに受けてる子いるよね!
・対称性から考えるとmaxは52〜55歳辺りになりそう。
かなり適当に考えているので、一応統計学的に妥当かどうか?も検証しておきます。
年齢が平均30、標準偏差10の正規分布に従っているとすると、
Z=(30-5)/10=2.5
標準正規分布表から5歳児の出現率は6.21%。(計算合ってます…よね…?)全体が10万人だと6210人。あれ…結構いるな…。まあいっか。
*ここで「分岐の主軸にする」というのは、後工程で目的変数に1を立てる時必ず「年齢が〇〇代で」という条件を入れる、ということを意味しています。今はよくわからなくても後々何のことかわかると思うので、一旦は読み飛ばしてOKです。
というわけでこんな感じでコードを書いてみました。-1が25回選ばれた時5歳になるので、それより若くなることはないという考え。もっといいコードがあるかもしれません。多分ある。
中身を見てみるとこんな感じに。平均は目論見通りになっているものの、ばらつきがやや小さい。
というわけでばらつきを大きくするべくコードを変えて再試行。ノイズを半分にして試行回数を2倍にしてみる。
あ…れ……?ばらつき小さくなったな…。
よくよく考えたら、試行回数が増える=増加or減少に偏りにくくなるわけだから、それはそうなるか。
ということは逆にノイズを大きくして試行回数を減らしたいところだけど、そうすると年齢が2歳刻みで分布してしまう。うーん。
迷った結果ChatGPTに相談。標準偏差って指定できるんだ…!プロンプトでmin5〜8って書いたらmax80だと思われちゃったけど、まあ最大値は何でもいいのでこのまま実行してみる。
いい感じでは…?!
と思って中身を見てみたら整数じゃなかった…。型変換してもう一度統計量を確認。
平均がちょっと下がったけど、まあこれくらいならいいでしょう。ちょっと…疲れちゃったし…。
データフレームに格納して、再度統計量を確認。中央値は30歳だけど、最頻値が28歳になっちゃったな…。まあいいか…疲れちゃったし…(2回目)
今後不具合が出るようなら調整しようかと思います。
カラム一個作るだけで3時間くらいかかってしまいました。先が思いやられる…。
【追記】
次回無事に不具合が出て作り直します!乞うご期待!
【おまけ】
アウトプット力向上を目的の一環としているため、今回もChat GPTに記事を評価してもらいました。
• 試みが伝わるか: 9/10
• 伝わりやすい内容ですが、「正解のあるデータフレーム」という概念を冒頭で少し補足するとさらに良いです。
• 興味を引く内容か: 9/10
• 試行錯誤やユーモアが魅力的で興味を引きますが、調整の目的に少しだけ補足を入れるとさらに分かりやすくなります。
• 初学者にも読んでもらえるか: 8/10
• 初学者にも読みやすいですが、計算過程やおまじない的コードに簡単な補足があると、より親切です。
• 全体の魅力: 10/10
• 試行錯誤のリアルさと親しみやすい語り口が、このブログの大きな強みです。
最終評価: 9/10
試行錯誤のリアルな記録が初心者にも共感を呼ぶ魅力的な記事です。若干の補足や初心者向け解説を加えれば、さらに幅広い読者に届く内容になると思います。
すごく褒めてくれる…次回も頑張ろう…。