見出し画像

Pythonで構成比とリフト値を算出したら面倒なことになった話(自戒)

今回の結論
・集計データ(CSV)が少量の場合はExcelで、大量の場合はPythonで対応する
・group byメソッドの返り値の型はデータフレームではなく
    group byのオブジェクト

下記は私のプロフィールです!
私立理系情報系大学卒業(劣等生…)
Javaをやる(社会人3年目まで)
やりたいデータ分析系の仕事(未経験)を始める(社会人4年目)
分析案件と開発案件とSES営業を行なっている(社会人5年目)←今!!!

とある分析案件の現場で、下記の集計依頼がきたのでその時に面倒なことになり大変な思いをしたので自戒も込めて書きます。

ある商品リストの構成比とリフト値が知りたいからCSVファイルでまとめておいて

件数が大量にあったことからExcelで処理できるレコード数を超えていました。
そのため、Pythonを使って対応しようと考えました。
そこで集計した際に返り値の型を間違えてしまい面倒なことになってしまいました。

下記のコードから構成比、リフト値を算出

#ここでは商品名が同じものが存在している場合、集計を行なっている(ここでつまづいた!)
#全社
x = x.groupby(shohin,as_index=False)['count_all'].sum().reset_index()
#y社
y = y.groupby(shohin,as_index=False)['count_y'].sum().reset_index()

#全体数を取得
x_count_all = x['count_all'].sum()
count_y = x['count_y'].sum()

#構成比(一つの商品数/全体数)
x['全社構成比'] = x['count_all']/x_count_all
x['y社構成比'] = y['count_y']/count_y

#リフト値(y社構成比/全社構成比)
x['全社構成比'] = x['y社構成比']/x['全社構成比']

ここで必要だったのがreset_index()でした。
データフレームに対してgroup byで集計しているから返り値もデータフレームでできるだろうと思っていたら、最後の集計がうまくいかない…
何でだろうと思い、トレースしていったら、group byをした返り値の結果がおかしい事がわかりました。
どうやらgroup byのインプットはデータフレームで受付けるけど、アウトプットはgroup byオブジェクトって型になるみたいです。(知らなかった…)

reset_index()をすることでデータフレームとして扱う事ができるようになりました。
※何やかんや調査して1時間もかかりました…

こういう処理はExcelで処理する方が早かったりしますが、
件数が多かったり、表記ゆれの処理を加えてから集計したい場合はPythonで処理する方が良かったりしますね。

一応、下記はご参考です。

構成比:ある対象の項目が全体に対して占めている割合
リフト値:ある事柄が起こったとき、別の事柄が起こる確率が高くなる割合

こんな感じで今後も分析系の話ができればと思います。
資格関連の話もしていきたいです。
(G検定とった時の話、統計検定勉強中の話etc...)

最後に宣伝です!

株式会社ロンドソルは一緒に働くエンジニアを募集しています!
こんな方募集しております!
自分の目指したい事が今の会社では叶わないエンジニアの方!
業務を選択できる自由が欲しいエンジニアの方!
今の環境を変えてチャレンジしたいエンジニアの方!
私自身はエンジニア兼営業を行なっているので皆さんと一緒に働けますと嬉しい限りです!
以下が会社のURLです⬇︎

株式会社ロンドソル〜毎日の日の出を踊るような気持ちで迎える〜

閲覧ありがとうございました!
また次回もよろしくお願いいたします!