質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

680閲覧

pythonで顧客のランク付けをする方法

takec

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/21 15:04

顧客と購買金額が紐づいたデータに対して、
購買金額(合計)の大きさでHigh(上位30%)・Middle・Light(下位30%)の3層に
顧客をランク付けし、その列を新たにデータフレームに加える方法を
教えていただけますでしょうか。

*分析ツールはpythonを使用しております。

*groupbyで顧客別に集計してランキングの番号をつける方法は思いついたのですが、
上記の通り上位30%層~中間層~下位30%層に分類する方法がわかりませんでした。

*最終的には以下のようなデータフレームを得たいと思っております。
|#|顧客id|購買金額|ランク(追加した列)
|:--|:--:|--:|
|1|1|100|Middle
|2|2|150|Middle
|3|3|50|Middle
|4|4|500|High
|5|1|100|Middle
|6|5|500|High
|7|6|100|Middle
|8|3|100|Middle
|9|7|100|Light
|10|8|100|Light

お忙しいところ恐れ入りますが、
ご助言いただけますと幸いです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

groupby().sum() した結果に対して pandas.qcut() を使用してカテゴリ変数を追加すると良いかと思います。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.qcut.html

あとは元のデータにランク情報をDataFrame.join()DataFrame.merge()を使って反映させるだけです。

以下に簡単ですがサンプルを書きましたので参考にしてください

Python

1import pandas as pd 2import numpy as np 3 4N=100 5# 適当なデータを生成 6df = pd.DataFrame({ 7 '顧客id': np.random.randint(1,11,N), 8 '購買金額': np.random.choice(range(50,1000+1,50),N), 9}) 10print(df.head()) 11# 購買金額 顧客id 12#0 800 2 13#1 300 4 14#2 650 10 15#3 600 1 16#4 250 9 17 18# 購入金額の合計に応じてユーザーにランクのラベルを付ける 19user_df = df.groupby('顧客id')['購買金額'].sum().to_frame() 20user_df['ランク'] = pd.qcut(user_df['購買金額'], [0., 0.3, 0.7, 1.], labels=['Light','Middle','High']) 21print(user_df) 22# 購買金額 ランク 23#顧客id 24#1 7050 High 25#2 3800 Light 26#3 3700 Light 27#4 6000 Middle 28#5 7500 High 29#6 1300 Light 30#7 6400 Middle 31#8 5600 Middle 32#9 4100 Middle 33#10 7300 High 34 35# 元のデータにランクのラベルを反映 36df = df.merge(user_df.loc[:,['ランク']].reset_index(), on='顧客id', how='left') 37print(df.head()) 38 購買金額 顧客id ランク 39#0 800 2 Light 40#1 300 4 Middle 41#2 650 10 High 42#3 600 1 High 43#4 250 9 Middle

投稿2019/03/22 00:11

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2019/03/22 00:14

なるほど、ビニングでできるんですね。勉強になりました。
guest

0

pandas.DataFrame.quantile — pandas 0.24.2 documentation
pandas.Series.quantile — pandas 0.24.2 documentation

を使って0.3と0.7の分位数を求め、それに基づいて条件式を組み立てればよいかと思います。

補完してくれるみたいなので、単純には使えないか、適していないかもしれません。

投稿2019/03/21 15:12

編集2019/03/21 15:22
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問