【Numpy・Pandas・Scikit-learn】成績表からランダムにクラス分けしたバラツキ具合を標準偏差で確認するこの広告は、90日以上更新していないブログに表示しています。標準偏差でクラス間のバラツキを見る今回は、クラス分けしたグループ間のバラツキ具合を、標準偏差を用いて見ます。5教科の成績表をもとに100人を4つにクラス分けする方法を考えています。1回目、2回目、3回目につづく、シリーズ4回目。クラス分けをする際、人数は同じに、成績表の合計点と教科ごとでも適度に分散し平均的になるように分けたい。「標準偏差」を用いればバラツキが抑えられるのではないか。方法の手順として、データフレームをランダムにシャッフルして、クラス番号を順に割り振るクラスごとで教科や合計等の平均値を出すクラス間で平均値の標準偏差を出しバラツキを見るクラス間の教科や合計の標準偏差の更に標準偏差を出し、その最小値を探すでやってみようと思います。前回は1をやりましたので、今回は上の2と3。クラスごとで平均値を出し、クラス間のバラツキを見るために標準偏差を出します。Notebook6.4.0使用ライブラリnumpy1.20.2、pandas1.2.4、matplotlib3.3.4、scikit-learn0.24.2、japanize-matplotlib(グラフの日本語表示用)Anacondaをインストールすると今回使うライブラリは最初から全部入っているようなので(japanize-matplotlib以外は)インストールは不要です。japanize-matplotlibなど環境に合わせてインストールしておきます。100点満点のテストの成績表を100人分、一様分布のランダムな値で生成します。5教科の合計点を個人ごとに算出し、その値の大きい順から順位付けを行います。成績表を行でランダムにシャッフルし、4つのクラスに分けクラス番号を割り振ります。columns以上、前回までの内容。deviation)をクラスごとで出すここからが今回の内容です。↑のデータフレームに対して、Pandasのgroupby().mean()メソッドでクラス別の平均点を算出します。次に、算出された各クラスごとの平均点に対し、std()メソッドで標準偏差を出します。float64これらの値はクラス間の各列(科目など)における標準偏差を示しています。「社会」の標準偏差は1.89になっており、他の科目と比べて低い。いうことは「社会」はクラス間のバラツキが抑えられていることを示しています。↑で表示した平均値のデータフレームを見ると「社会」の列はクラスごとで平均値の差がなく、44.52~48.24の狭い範囲に収まっている。「国語」の標準偏差は9.85で比較的大きい。↑の平均値のデータフレームの値も34.68~57.68の広い範囲。クラス間で差があり、バラついたクラス分けになっているといえる。「合計」の標準偏差は更に大きく10.31なので、クラス間の学力差のバラツキが大きいことを示しています。「国語」~「順位」までの列で、クラス間の標準偏差のさらに標準偏差を出してみる。最終的にこれが小さければ、理想的に平均化したクラス分けと言えるんじゃないか。全体的な標準偏差を算出df_shuffled_class.groupby('クラス番号').mean().std().std()3.0957634438346426この値が小さければ、教科別でも合計点平均でもクラス間の差がないということになる。最終的な全体の標準偏差を算出の工程を何度か繰り返し、最終的に出した全体的な標準偏差が最も小さくなるクラス分けを探せば、最もバランスの取れたクラス分けとなる。最終的な標準偏差を求めるまでの工程を関数で書いて、その関数をfor文でぶん回し、グラフ描けばなんか見えてくるだろう。mean_df.std().std()できたので、ひとまず2回だけ工程を繰り返してクラス分け結果とバラツキ具合の標準偏差をみてみる。========================================試行回数ごとに、成績表とクラスごと平均値のデータフレーム、バラツキ具合を示す標準偏差の値がちゃんと返ってきている。メンバーもランダムに組み替えられている。クラス分け後のバラツキ具合を積み上げ棒グラフで見るクラス別平均値の積み上げ棒グラフを、試行回数ごとに描きます。最終的な標準偏差が小さければクラス間のバラツキの押さえられた棒グラフになっているはずです。クラス分け後のクラス別平均値データフレームから、クラス別の積み上げ棒グラフを描く関数を用意する。できたので、for文でグラフ作図を回す。6.982852234342911========================================最終的な標準偏差の大きいクラス分けは、クラス間の平均点積み上げ高にも差が出てバラツキがある。機械学習のk-means法(k-平均法)を使ったクラスタリングをやると偏ったクラス分けになる。pythonバラツキの抑えられたクラス分けが得られたとして、そのデータフレームを再現しなければならないが、ランダムを再現できないんだろう。よって試行回数ごとに生成されているデータフレームを何らかの形で保存せねばならない。次回はそこからにします。python追記ランダム生成とセキュリティに関する話題。関連してそうなので貼ります。Registerの記事。今回は、Pandasで移動平均というものを出す方法。Android追記しました。Pandas】売上データからドロップダウンメニューで担当者を指定して抽出、ページに表示する【Flask】複数のinputタグのname属性を同じにしてリストで取り出す【Flask】送信ボタンを押してテキスト送受信を行う【Flask】render_templateでpyファイルとhtmlファイルを分ける目次はてなブログをはじめよう!chayarokurokuroさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。