

## 前提条件・実装したい事

Pythonを使用して、既存のDataFrame(下記の「加工前のデータセット(df)」)を基に相関係数  
を排出したいと思っています。  
具体的なデータセットのイメージとしては、下記の「加工後のデータセット」の様な感じです。

### 加工前のデータセット(df)

[code]

    |Weight(g)|Long axis|Short axis|Grain thickness|Sumple_vert|BeanNumber_vert|
    |:--|:--:|--:|--:|--:|--:|
    |0.43|0.92|0.91|0.73|くるみ豆|B2|
    |0.4 |0,90|0.89|0.56|くるみ豆|B2|
    |0.45|1.04|0.97|0.63|くるみ豆|B2|
    |0.41|...||||
    ||0.4|0.97|0.92|0.74|五葉黒豆|B6|
    |0.35|0.97|0.88|0.51|五葉黒豆|B6||
    |0.43|...||||   
    |0.51|1.21|0.95|0.77|濃緑丸豆|B39|
    |0.43|0.92|0.85|0.83|濃緑丸豆|B39|
    |0.43|0.93|0.90|0.55|濃緑丸豆|B39|
    |0.48|1.10|0.96|0.67|濃緑丸豆|B39|
    |0.38|0.91|0.85|0.54|濃緑丸豆|B39|
    
[/code]

### 加工後のデータセット

[code]

                         Weight(g)  Long axis  Short axis  Grain thickness
    B2  Weight(g)         1.000000   0.088743   -0.085762        -0.048301
    B2  Long axis         0.088743   1.000000    0.027861         0.210807
    B2  Short axis       -0.085762   0.027861    1.000000         0.401890
    B2  Grain thickness  -0.048301   0.210807    0.401890         1.000000
    -----------------------------------------------------------------------                 
    B6  Weight(g)         1.000000   0.088743   -0.085762        -0.048301
    B6  Long axis         0.088743   1.000000    0.027861         0.210807
    B6  Short axis       -0.085762   0.027861    1.000000         0.401890
    B6  Grain thickness  -0.048301   0.210807    0.401890         1.000000
    
[/code]

### 実装するにあたり考えたアプローチ

・ブーリアンインデックスを用いて、各「"BeanNumber_vert"」ごとに(B2,B3,B4...というように)相関係数を排出しようとしましたが、df3が以下の様な画像になりました。その際に識別のために右端の列に対応する「"BeanNumber_vert"」の列が作成できませんでした。

[code]

    lst5 = []    
    for BeanNumber in list(df["BeanNumber_vert"]):
        df1 = df[df["BeanNumber_vert"] == BeanNumber].corr()
        lst5.append(df1)
    df3 = pd.concat(lst5)
    
[/code]

[![実際に作成されたデータセット](https://i.stack.imgur.com/qOVVV.png)](https://i.stack.imgur.com/qOVVV.png)

・ブーリアンインデックスで上手く「"BeanNumber_vert"」の塊ごとに相関係数を排出できないのであれば、groupbyで解決をしようと試みました。  
相関係数を求めるにあたり、相関係数 ＝ 共分散 ÷ （要素１の標準偏差 ×
要素２の標準偏差）の式を実装する際にgroupbyで標準偏差までは求められても、共分散を出すにあたって、偏差を出す事ができませんでした。  
分散に√をつければ、実装できなくもなさそうですが、あまりにかけ離れている気がしたので断念しました。

[code]

    Basedata=df.groupby('BeanNumber_vert')
    Std_data =Basedata.std()
    Std_data = Std_data.rename(columns=lambda s: s+"_Std")
    
    Var_data = Basedata.var()
    Var_data = Var_data.rename(columns=lambda s: s+"_Var")
    
[/code]

### 教えて頂きたい事

相関係数を算出するにあたってブーリアンインデックスを使っての実装を試みていたのですが、上記の「加工後のデータセット」の様に右端にBeanNumberを追加できません。  
算出される相関係数を識別するためのBeanNumberを追加する方法を教えて頂きたいです。  
これに限らず、実装できればそれで良いので、これ以外の方法でも大丈夫ですので、教えて頂けたら幸いです。

### 補足情報（FW/ツールのバージョンなど）

Python3.7  
Jupyter NoteBook  
お忙しいとは思いますが、よろしくお願いいたします。  
情報に不足がありましたら、ご指摘お願いいたします。


CC BY-SA 4.0
2019-09-01T00:55:43.523
57744
2019-09-11T14:45:37.177
2020-06-17T08:14:45.997
-1
35668
question
python python3 pandas numpy
Python3で各サンプルごとに相関係数を算出する方法


`BeanNumber_vert`でグループ化した相関行列を出力したい、ということだと思います。  
とするなら、`groupby()`して`corr()`すればよいのではないでしょうか。

### コード

[code]

    import pandas as pd
    df = pd.read_csv('./input.csv')
    df.groupby('BeanNumber_vert').corr().to_csv('./output.csv')
    
[/code]

### 入力(input.csv)

(データは一部整形してCSVにしました)

[code]

    Weight(g),Long axis,Short axis,Grain thickness,Sumple_vert,BeanNumber_vert
    0.43,0.92,0.91,0.73,くるみ豆,B2
    0.4 ,0.90,0.89,0.56,くるみ豆,B2
    0.45,1.04,0.97,0.63,くるみ豆,B2
    0.4,0.97,0.92,0.74,五葉黒豆,B6
    0.35,0.97,0.88,0.51,五葉黒豆,B6
    0.51,1.21,0.95,0.77,濃緑丸豆,B39
    0.43,0.92,0.85,0.83,濃緑丸豆,B39
    0.43,0.93,0.90,0.55,濃緑丸豆,B39
    0.48,1.10,0.96,0.67,濃緑丸豆,B39
    0.38,0.91,0.85,0.54,濃緑丸豆,B39
    
[/code]

### 出力(output.csv)

[code]

    BeanNumber_vert,,Grain thickness,Long axis,Short axis,Weight(g)
    B2,Grain thickness,1.0,0.030914695237867187,0.14056187114809407,0.5115817956786485
    B2,Long axis,0.030914695237867187,1.0,0.9939440959288618,0.8746392856766498
    B2,Short axis,0.14056187114809407,0.9939440959288618,1.0,0.9226129063148781
    B2,Weight(g),0.5115817956786485,0.8746392856766498,0.9226129063148781,1.0
    B39,Grain thickness,1.0,0.4043482990643013,0.1278383720578066,0.5512019722722461
    B39,Long axis,0.4043482990643013,1.0,0.8770055593992221,0.929472557441718
    B39,Short axis,0.1278383720578066,0.8770055593992221,1.0,0.8820368706875384
    B39,Weight(g),0.5512019722722461,0.929472557441718,0.8820368706875384,1.0
    B6,Grain thickness,1.0,,1.0,1.0
    B6,Long axis,,,,
    B6,Short axis,1.0,,1.0,1.0
    B6,Weight(g),1.0,,1.0,1.0
    
[/code]

もうちょっと詳しいことは[python - Pandas Correlation Groupby - Stack
Overflow](https://stackoverflow.com/questions/28988627/pandas-correlation-
groupby)に記載があります。


CC BY-SA 4.0
2019-09-11T14:41:48.537
59001
2019-09-11T14:41:48.537
12561
57744
answer