Pandas グループ化
グループ集約の原則:
1, groupby メソッドを使用してグループを集約します。
グループ化:このメソッドは、グループ化集計ステップで分割機能を提供し、インデックスまたはフィールドに従ってデータをグループ化することができます。一般的なパラメータと使用されるフォーマットは以下のとおりです。
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)
groupbyパラメータの説明
by | グループ化の基準を決定するために、リスト、文字列、マッピング、ジェネレータを受け取ります。 |
axis | intを受け取る、操作の軸を示す、ライン上のデフォルト操作、デフォルトは0 |
level | タグのレベルを表す int またはインデックス名を受け取ります。 |
as_index | タグをDataFrameのインデックスとして出力するかどうかを指定します。 |
sort | グループ化ラベルに基づいてソートするかどうかを示す boolearn を受け取ります。デフォルトは True。 |
グループID | グループ化ラベルの名前を表示するかどうかを示す boolearn を受け取ります。デフォルトは True。 |
名称 | hight |
groupbyメソッドの引数とその説明 - by引数の特別な説明:
関数が渡された場合、インデックスが計算され、グループ化されます。
辞書または系列が渡された場合、その辞書または系列の値がグループ化の基準として使用されます。
NumPyの配列が渡された場合、データの要素はグループ化の基準として使用されます。
文字列または文字列のリストが渡された場合、それらの文字列で表されるフィールドがグループ化の基礎として使用されます。
集計:groupbyメソッドでグループ化した結果は直接見ることはできませんが、メモリ上に保存され、メモリアドレスが出力されます。 実は、グループ化されたデータオブジェクトgroupbyは、SeriesやDataFrameと似ており、pandasが提供するオブジェクトの一種です。
groupbyオブジェクトの記述統計量
高さ | 欠損値を含むサブグループの数の計算 | 試験結果 | 各サブグループのグループメンバーのラベル付け、0~n-1 |
首 | 各グループの最初のn個の値を返します。 | mean | 各グループのサイズを返します |
max | 各グループの最大値を返します。 | mean | 各グループの最小値を返します。 |
mean | 各グループの平均を返します | std | 各グループの標準偏差を返します |
std | 各グループの中央値を返します。 | mean | 各グループの合計を返します。 |
2、agg関数を使用してデータを集計します。
agg パラメータの理解
aggメソッドは、Pythonの組み込み関数やカスタム関数を含む関数を各グループに適用することをサポートしており、どちらのメソッドもDataFrameに直接関数を適用することができます。
DataFrame.agg(func, axis=0, *args, **kwargs)
agg パラメータの説明
func | 各行/列に適用される関数を示すリスト、dict、function を受け取ります。 |
axis | 操作の方向について0または1を受け取り、デフォルトは行の方向について0。 |
2.統計指標のアグ方法論
生徒情報の表を作成し、統計指標にagg法を使用します。
学生情報シート
Stu_0 | A | 1 | zs | 071 | 99.0 |
Stu_1 | A | 1 | ls | 271 | 98.0 |
Stu_2 | A | 1 | ww | 581 | 97.5 |
Stu_3 | A | 2 | zl | 091 | 96.0 |
Stu_4 | A | 2 | xx | 371 | 89.0 |
Stu_5 | A | 2 | zl | 651 | 85.0 |
Stu_6 | B | 1 | zz | 261 | 99.0 |
Stu_1 | B | 1 | zs | 561 | 78.0 |
Stu_8 | B | 1 | zs | 981 | 89.0 |
Stu_5 | B | 2 | ii | 871 | 88.0 |
Stu_10 | B | 2 | tt | 571 | 92.0 |
Stu_11 | B | 2 | 671 | 94.0 |
学生情報テーブル データフィールドの説明
cls_id | クラスID |
グループID | グループID |
名称 | hight |
高さ | score |
試験結果 | 試験結果 |
コードの実装:
import pandas as pd
import numpy as np
# グループ化と集計:まずグループ化し、次に集計する ---。>グループ分けの方法は? 統計指標は?
# dfを作成する
df = pd.DataFrame(
data={
'cls_id': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
'group_id': [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2],
'name': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'oo'],
'hight': [170, 172.5, 168, 192, 181.5, 156, 154, 162, 180, 179.5, 173, 176.5],
'score': [99, 92, 85, 71, 59, 76.5, 89, 95, 93, 79, 70, 84]
},
index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5', 'stu6', 'stu7', 'stu8', 'stu9', 'stu10', 'stu11']
)
print('df:
', df)
print('df:
', type(df))
print('*' * 100)
# グループを指定し、統計指標を指定する
# groupbyを使ってグループ化を指定できる --by パラメータ -- グループ化の列を指定する
# 単一列のグループ化に従って、単一列の指標の統計をとる
# クラスIDでグループ化し、各クラスの平均成績を数える
res = df.groupby(by='cls_id')['score'].mean()
print('res:
', res)
# 複数の列でグループ化し、単一列のメトリクスをカウントする
# 最初にクラスIDで、次にグループIDで、グループ化し、各グループの平均スコアで統計する
res = df.groupby(by=['cls_id', 'group_id'])['score'].mean()
print('res:
',res)
# 単一列でグループ化、複数列の指標で統計する
# クラスIDでグループ分けし、学年と身長の平均を数える
res = df.groupby(by='cls_id')[['score','hight']].mean()
print('res:
',res)
# 複数の列でグループ化し、複数の列でメトリクスをカウントする
# まずクラスIDでグループ化し、次にグループIDでグループ化し、各グループの成績と身長の最大値を数える。
res = df.groupby(by=['cls_id', 'group_id'])[['score', 'hight']].max()
print('res:
',res)
1、aggメソッドを使用して、DataFrameカラムの複数の統計指標を一度に見つけることができます。
# agg --->グループ化されていない --- 列のメトリクスを取る
# 注: agg = aggregate
# 複数の列の複数のメトリクスを取得する
# 得点と身長の平均値、最大値、最小値を求める。
res = df.loc[:, ['score', 'hight']].agg([np.mean, np.max, np.min])
print('res:
', res)
2、DataFrameの異なる列の異なる統計指標を一度に取得するために、aggメソッドを使用することができます。
あるフィールドの平均だけを計算し、別のフィールドの合計だけを計算したい場合は、各フィールド名をキーとし、NumPyライブラリのsum関数とmean関数を値とする辞書を使用することができます。
# 列ごとに異なる指標を見つける
# 得点欄の最大値と高さ欄の平均値を求めよ。
res = df.agg({'score': [np.max, ], 'hight': [np.mean, ]})
print('res:
', res)
3.aggメソッドを使用すると、DataFrameの異なる列について、一度に異なる数の統計指標を取得することができます。 また、あるフィールドに対して複数の統計情報を取得したい場合や、あるフィールドに対して1つの統計情報しか取得したくない場合、この時点では、辞書の対応するキーの値をリストに変更するだけでよく、リストの要素は複数のターゲットの統計情報です。
# 列ごとに異なる指標の数値を求めよ。
# 得点欄の最大値と平均値、高さ欄の最小値を求めよ。
res = df.agg({'score': [np.max, np.mean], 'hight':[np.min,]})
print('res:
',res)
aggメソッドにカスタム関数を追加します:
agg メソッドには、読者が定義した関数を渡すことができます。
カスタム関数を使用する際の注意点として、NumPyのライブラリ関数であるnp.mean、np.median、np.prod、np.sum、np.std、np.varはaggで直接使用することができますが、カスタム関数の中で使用すると、計算が単一の系列に対して行われる場合、望ましい結果が得られません。複数の列が同時に計算される場合はこの限りではありません。
aggメソッドを使用すると、各フィールドと各グループに同じ関数を使用できます。 異なるフィールドに異なる関数を適用する必要がある場合は、Dataframeと同じ方法でaggメソッドを使用できます。
4、変換メソッドを使用してデータを集計します。
transformメソッドは、DataFrame全体の全ての要素を操作することができます。そして、transformメソッドのパラメータは、DataFrameを操作する関数を意味する "func "のみです。
同時に、transformメソッドは、DataFrameのグループ化されたオブジェクトのGroupByを操作することもでき、グループ内の偏差の正規化などの操作が可能になります。
ダイバージェンスの正規化を計算した結果にNaNがある場合、ダイバージェンスの正規化の式によれば、最大値と最小値が同じであれば分母は0となり、分母が0の数値はPythonではNaNと表記されるからです。
コードの実装:
# aggカスタム関数を使用できる
res = df.agg({'score': [lambda x: max(x), ]})
print('res:
',res)
# カスタム関数を使いたい場合
# apply
# transform
res = df.loc[:, ['score', 'hight']].apply(lambda x: x + 1)
print('res:
',res)
res = df.loc[:, ['score', 'hight']].transform(lambda x: x + 1)
print('res:
', res)
# 算術 ---- 算術>整数演算
#
res = df.groupby(by='cls_id')['score'].apply(lambda x: max(x))
print('res:
', res)
print('*' * 100)
res = df.groupby(by='cls_id')['score'].transform(lambda x: max(x))
print('res:
', res)
II.ケース:店舗転売のケース
注文明細データを例にして、加盟店の日別回転率データをカウントしますか?注文明細テーブルには、回転率特性フィールドはありませんが、回転率=価格*料理の数量で各料理の回転率を計算し、日ごとにグループ化して、毎日の回転率データをカウントすることができます。
コードの実装:
import pandas as pd
# 詳細テーブルを例に取る,--->店の1日の売上高を計算する?
# place_order_time
# 数量 単価
# グループ化 集計
# データを読み込む
detail = pd.read_excel('./meal_order_detail.xlsx', sheet_name=0)
print('detail:
', detail)
print('detail:
', detail.columns)
# 日々のデータを取得する
# まず場所を設定する_order_time pandasがデフォルトでサポートする時系列に変換する
detail['place_order_time'] = pd.to_datetime(detail['place_order_time'])
# h日付属性を取得する
detail['day'] = detail['place_order_time'].dt.date
# 回転率を計算する
# 単価 数量
detail['price'] = detail['amounts'] * detail['counts']
print('detail:
', detail)
# 1日の売上高を求める
# 日ごとにグループ分けし、価格の合計を数える。
res = detail.groupby(by='day')['price'].sum()
print('res:
', res)
# 11:30 --->11 --->[9,12) --->'9:00 - 12:00' --->グループ化 集計
Pandasのピボットテーブルとクロスタブ
1、pivot_table関数の使用は、ピボットテーブルを達成することができます
pivot_table() 関数の一般的な引数と、その使用形式を以下に示します:
pands.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',ill_value=None,marginins=False,dropna=True,marginins_name=')。すべて')
pivot_table 関数パラメータ説明表
data | テーブルを作成するためのデータを表す DataFrame を受け取ります。 |
values | 文字列を受け取ります。集計するデータ・フィールドの名前を指定するために使用します。デフォルトではすべてのデータが使用されます。 |
index | 行のグループ化キーを表す文字列またはリストを受け取ります。 |
列 | 列のグループ化キーを表す文字列またはリストを受け取ります。 |
aggfunc | 集計関数を表す関数を受け取ります。 |
margins | boolearn を受け取ります。これは集約関数のオン/オフスイッチで、True に設定すると、"ALL" という名前の行と列が結果セットに表示されます。 |
dropna | NaN の列をすべて削除するかどうかを示す boolearn を受け取ります。 |
pivot_table 関数の主なパラメータ規定:
aggfuncが指定されない場合、集計関数はデフォルトでnumpy.meanを使用し、numpy.meanは数値以外のデータを自動的にフィルタリングします。aggfuncパラメータを指定することで、集約関数を変更することができます。
groupby メソッドと同様に、pivot_table 関数は、複数のグループ・キー・インデックスを持つピボット・テーブルを作成します。
列のグループ化は、columnsパラメータを設定することで指定できます。
データ列が多いときに特定の列だけを表示したい場合は、valuesパラメータを指定します。
NaNはデータが存在しない場合に自動的に埋められるので、fill_valueパラメータを指定することで、値が存在しない場合に指定した値で埋められることを示すことができます。
マージンパラメータを変更すると、サマリーデータを見ることができます。
生徒情報テーブルを作成し、それを使用してピボット・テーブルを作成します。
コードの実装:
import pandas as pd
import numpy as np
# クロスタブ:2列のデータの相対頻度を比較する - 行と列の両方のケースを満たすデータの数
# グルーピング集計機能
# dfを作成する
df = pd.DataFrame(
data={
'cls_id': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
'group_id': [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2],
'name': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'oo'],
'hight': [170, 172.5, 168, 192, 181.5, 156, 154, 162, 180, 179.5, 173, 176.5],
'score': [99, 92, 85, 71, 59, 76.5, 89, 95, 93, 79, 70, 84],
'weight': np.nan, # (float
},
index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5', 'stu6', 'stu7', 'stu8', 'stu9', 'stu10', 'stu11']
)
print('df:
', df)
print('df:
', type(df))
print('*' * 100)
# ピボットテーブル:グループ化集計のプラス版
# グルーピング 集計
# クラスIDでグループ化し、各クラスの平均成績を数える
res = df.groupby(by='cls_id')['score'].mean()
print('res:
', res)
# ピボットテーブル ----pd.pivot_tableピボットテーブルの実装
res = pd.pivot_table(data=df, # ピボット・テーブルの作成に使用したデータ
index='cls_id', # 行インデックスを指定する
values='score', # 興味のあるテーマ
aggfunc=np.mean, # 対象の統計指標について
)
print('res:
', res) # dataframe
# まずクラスIDでグループ化し、次にグループIDでグループ化し、各グループの成績と身長の最大値を数える。
res = df.groupby(by=['cls_id', 'group_id'])[['score', 'hight']].max()
print('res:
', res)
res = pd.pivot_table(data=df, # ピボット・テーブルの作成に使用したデータ
index=['cls_id', 'group_id'], # 行インデックスを指定する
values=['score', 'hight'], # 興味のあるテーマ
aggfunc=np.max, # 対象の統計指標について
)
print('res:
', res) # dataframe
# ピボットテーブル、インデックスと列のみ、値とaggfuncのみ。
# 行インデックスだけでなく、列インデックスも指定できる。
res = pd.pivot_table(data=df, # ピボット・テーブルの作成に使用したデータ
index='cls_id', # 行インデックスを指定する
columns='group_id', # 列インデックスを指定する
values=['score', 'hight', 'weight'], # 興味のあるテーマ
aggfunc=np.max, # 対象の統計指標について
# margins=True, # サマリースイッチ
# margins_name='All', # マスタースイッチの名前
# dropna=True, # 空の列をすべて削除する。
# fill_value=0, # コントロールを0に置き換える
)
print('res:
', res) # dataframe
2、crosstab関数の使用は、クロス集計を生成することができます
クロスタブはピボットテーブルの一種で、主にグループ化頻度を計算するために使用されます。pandasが提供するクロスタブ関数を使用してクロスタブを作成することができます。クロスタブ関数の一般的なパラメータとフォーマットは以下のとおりです。
クロスタブはピボットテーブルの一種であるため、クロスタブ関数のインデックス、列、値がすべてデータフレームの対応する列で埋められることを除けば、そのパラメータは基本的に同じです。
pandas.crosstab(index,columns,values=None,rownames=None,colnames=None, aggfunc=None, margins=False, dropna=True, normalize=False)
crosstab パラメータ 説明 テーブル
index | 文字列またはリストを受け取り、行インデックスキーを表します。 |
列 | 文字列またはリストを受け取り、行インデックスキーを表します。 |
values | デフォルトは None。 |
aggfunc | デフォルトは None。 |
rownames | 行のグループ化キー名を示します。 |
colnames | 列のグループ化キー名を示します。 |
dropna | NaNであるすべての列を削除するかどうかを示す boolearn を受け取ります。 |
margins | boolearn を受け取ります。これは、集約関数のオン/オフスイッチで、True に設定すると、"ALL" という名前の行と列が結果セットに表示されます。 |
normalize | 値を正規化するかどうかを示す boolearn を受け取ります。 |
学生情報表を例にして、クロス集計表を作成してください。
コードの実装:
import pandas as pd
import numpy as np
# クロスタブ 2列のデータの相対頻度を比較する - 行と列の両方のケースを満たすデータの数
# グルーピング集計機能
# dfを作成する
df = pd.DataFrame(
data={
'cls_id': ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'],
'group_id': [1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2],
'name': ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'oo'],
'hight': [170, 172.5, 168, 192, 181.5, 156, 154, 162, 180, 179.5, 173, 176.5],
'score': [99, 92, 85, 71, 59, 76.5, 89, 95, 93, 79, 70, 84],
'weight': np.nan, # (float
},
index=['stu0', 'stu1', 'stu2', 'stu3', 'stu4', 'stu5', 'stu6', 'stu7', 'stu8', 'stu9', 'stu10', 'stu11']
)
print('df:
', df)
print('df:
', type(df))
print('*' * 100)
# クロスタブを作成する ----pd.crosstabクロスタブを作成する
#
# index : 行インデックスを指定する
# columns 列インデックスを指定する
res = pd.crosstab(index=df['cls_id'], columns=df['group_id'])
print('res:
', res)
# クロスタブのインデックスとカラムを指定しなければならない。
# クロスタブ内の値は、agggfunc付き、またはagggfuncなしで表示されなければならない!
res = pd.crosstab(index=df['cls_id'],
columns=df['group_id'],
values=df['score'], # 興味のあるテーマ
aggfunc=np.max, # 対象者が実施した統計指標について
)
print('res:
', res)
IV.ケース:TGI指数分析ケース
TGI: ターゲットグループ指数。
TGI指数=[ある特性を持つ対象集団の割合/同じ特性を持つ集団の割合] * 標準化数001
例えば、ある地域の15〜24歳をターゲット層とし、【映画サイトA】に行くことが同じ特性である場合、その地域の15〜24歳の8.9%が【映画サイトA】に行ったことがあり、その地域の全人口の6.6%が【映画サイトA】に行ったことがあるとすると、15〜24歳の【映画サイトA】のTGI指数は134.9となり、金額が大きいほどターゲット層の適合性が強い。15-24歳の[映画サイトA]のTGI指数は134.9で、大きいほどターゲットグループの適合性が強い。
TGI指数は、異なる特性を持つユーザーの懸念の違いを特徴付けるもので、TGI指数が100に等しい場合は平均的なレベルを示し、100を超える場合は、あるタイプの問題に対するこのカテゴリーのユーザーの懸念のレベルが全体のレベルよりも高いことを意味します。
以下は、TGI分析が実施されたブランドの取引注文データです。
ブランドの貿易注文データシート
viva la vida | 簡単ポッキーライス | 2019/4/18 0:03 | 取引成功 | 22.32 | 0 | 東京 | 東京都 | 1 |
zs | 071 | 2019/2/17 0:03 | 取引成功 | 87.00 | 0 | 東京 | 東京都 | 1 |
zs | 071 | 2019/4/18 0:01 | 取引成功 | 97.66 | 0 | 旧称:フーチョーまたはフーチョー | 2 | |
zl | ビューティーショッパーとして。 | 2019/1/11 23:35 | 取引成功 | 37.23 | 0 | 安陽市 | 3 | |
viva la vida | ビューティーショッパーとして。 | 2019/2/18 14:16 | 取引成功 | 29.50 | 0 | 安陽市 | 2 | |
zl | 091 | 2019/6/16 4:15 | 取引成功 | 42.50 | 0 | 東京 | 3 | |
viva la vida | 団子部屋 | 2019/6/1619:35 | 取引成功 | 87.00 | 0 | 東京都 | 1 | |
zs | 071 | 2019/1/11 16:56 | 取引成功 | 4.50 | 0 | 内モンゴル自治区 | 内モンゴル自治区フルンブイル県級市 | 1 |
zs | 餃子の部屋 | 2019/1/11 6:29 | 取引成功 | 11.68 | 0 | 東京都 | 東京都 | 1 |
zs | ゾー・オ・ゾー | 2019/1/11 11:51 | 取引成功 | 59.50 | 0 | 東京都 | 1 | |
zs | ゾー・オ・ゾー | 2019/6/23 5:47 | 取引成功 | 11.86 | 0 | 東京都 | 1 | |
zs | 左であって右でない(慣用句);図:隠された意図 | 2019/1/11 4:57 | 取引成功 | 84.50 | 0 | 中国南東部、浙江省の省都。 | 1 |
ブランドの取引データについて質問することができます:
個人ユーザー支払額
ユーザーが支払った金額に基づいて、ユーザーが低顧客オーダーに属するか、高顧客オーダーに属するかを判断します。
ピボットテーブルの方法を使用して、各都道府県と市区町村の顧客注文が少ない人と多い人の数を数えます。
合計人数と、それに対応する都市ごとの高額顧客注文の割合を計算します。
各都市の高顧客オーダーTGI指数の算出
コードの実装:
import pandas as pd
# TGI:特定の調査エリア内でのターゲットグループの強さや弱さを反映することができる。
# TGI [ある特性を持つターゲットグループの割合/同じ特性を持つグループ全体の割合。]*標準100
# TGI この指標は、さまざまなプロフィールを持つユーザーの関心の違いを特徴づける。,
# TGI指数は100に等しく、これは平均的なレベルを意味し、100を超えると、このカテゴリーのユーザーは全体のレベルよりもある種の問題に注意を払うことを意味する。
#
# データを読み込む
data = pd.read_excel('./TGIインデックスケースデータ.xlsx', sheet_name=0)
# print('data:
', data)
# これはトランザクションデータである。リサーチデータとして使用するためには、トランザクションが成功しなければならない。
# pd.value_counts --->対応する列の値と、その値の出現回数を見ることができる
res = pd.value_counts(data.loc[:, '注文状況'])
print('res:
', res)
# res:
# トランザクションの成功 27792
# 支払いが行われた後、利用者に払い戻しが行われ、取引は自動的に終了する 1040
# Name: 注文状況, dtype: int64
# 取引失敗のデータを排除する
# (1)削除方法 - 選択
# aブール配列を決定する
mask = data.loc[:, '注文状況'] == '支払い後、ユーザーは正常に払い戻され、取引は自動的に終了する。
# bトランザクションが失敗した行の名前を特定する
drop_labels = data.loc[mask, :].index
# c失敗した取引データを削除する
data.drop(labels=drop_labels, axis=0, inplace=True)
print('取引に失敗したデータを排除した結果は次のようになる:
', data)
print('列のインデックス
', data.columns)
# (2)
# 自己実装
#
# (1)シングルユーザーの支払額
# 購入者のニックネームでグループ分けし、自己負担額の合計をカウントする。
pay = data.groupby(by='バイヤーニックネーム')['自己負担額'].sum()
print('pay:
', pay) # series
# 要件が「ユーザー一人当たりの平均支払額」だったらどうするか? ---- 購入者のニックネームの総数/重複を除いた数を自己負担額について求める。
# (2)利用者が支払った金額から、その利用者が低客注利用者に属するか、高客注利用者に属するかを判断する。
# しきい値を設定する:しきい値より大きい場合、支払額---。>高顧客の注文ユーザー;もし閾値より小さければ------。>アクセス数の少ないユーザー
# しきい値の設定:平均、中央値、複数、カスタム
# カスタムしきい値は50
def is_kedan(x):
"""
ユーザーの支払い金額から、そのユーザーが高額の買い物をするユーザーかどうかを判断する。
:param x:
:return: 客の注文が多い/少ない
"""
if x >= 50:
return '顧客の注文が多い
else:
return '顧客の注文が少ない
# まずpayをdfに変換する
df = pd.DataFrame(data=pay.values.reshape((-1, 1)),
columns=['支払い金額],
index=pay.index)
print('df:
', df)
df.loc[:, '顧客レベル] = df.loc[:, '支払い金額].transform(is_kedan)
# インデックスの再作成 - 元のインデックスをデータとして使用する
df = df.reset_index()
print('df:
', df)
# データ中の顧客の都市 df中の顧客が大口顧客かどうか
# スプライスとマージ - まずバックナレッジを借りる!
df = pd.merge(left=df, right=data[['バイヤーのニックネーム」、「県名]], on='バイヤーのニックネーム, how='inner')
print('df:
', df)
# (3)ピボットテーブルを使って、各都道府県と市区町村の低客数と高客数の注文数をカウントする。
res = pd.pivot_table(data=df,
index=' ,
columns='顧客レベル,
values='バイヤーのニックネーム,
aggfunc='count')
print('res:
', res)
# (4)各都市の総人数と、それに対応する各都市の高額客の注文の割合を計算する。
# 各都市の総人口 = 大口顧客 + 来店客の少ない時間帯
res['人の総数] = res['顧客の注文が多い] + res['顧客の注文が少ない]
print('res:
', res)
#
kedan_city = res['顧客の注文が多い] / res['人の総数]
print('各都市の通行量の多い利用者の割合
', kedan_city)
# (5)全体の高顧客注文の割合を計算する
# 総人数を計算する
all = df.shape[0]
# 高額顧客の注文数
all_kedan = res['顧客の注文が多い].sum()
#
kedan_Japan = all_kedan / all
print('人通りの多い客の割合は
', kedan_Japan)
# (6)各都市の高顧客注文のTGI指数を計算する。
# 顧客からの注文が多い場合のTGI指数 = 各都市の高顧客注文の割合/高顧客注文の割合 * 100
TGI = kedan_city / kedan_Japan * 100
print('各都市の来店客の多い時間帯のTGI指数は次の通りである:
',TGI )
# ソート - 降順
# デフォルトは昇順,ascending=False 降順に変更できる
# ソートするときは、ソートルールに従ってデータの行全体を移動させる。
# dfでソートする場合は、byで列によるソートを指定しなければならない。
# 直列の場合、列は一つしかない
print('ソート後の結果はこうなる:
',TGI.sort_values(ascending=False))
# TGI指数が高ければ高いほど、その都市の大量利用者の割合が高いことを意味する。 ,
# 市内の総客数を求める > 1000 調査に戻る、客単価の高いユーザーのTGI指数
V. 事例:スーパーマーケットチェーンの統計分析
スーパーマーケットチェーンデータ
zs | 25.23 | 0.823 | 2017/1/3 9:56 | CDLG000210052759 |
計算機設計言語 | 2 | 2 | 2017/1/3 9:56 | CDLG000210052759 |
96.0 | 19.62 | 0.23 | 2017/1/3 9:56 | CDLG000210052759 |
安陽市 | 2.8 | 2.440 | 2017/1/3 9:56 | CDLG000210052759 |
計算機設計言語 | 47.41 | 0.622 | 2017/1/3 9:56 | CDLG000210052759 |
このスーパーマーケットのデータについて質問することができます:
どのカテゴリーがより売れるのか?
売れ筋商品は?
各店舗の売上比率を確認
スーパーマーケットの混雑のピークはどの時間帯ですか?
コードの実装:
import pandas as pd
# データを読み込む
data = pd.read_csv('./order.csv', encoding='ansi')
print('data:
', data)
print('data:
', data.columns)
# データを表示する---売上データが存在する <=0のデータを取り出す。
# 削除方法 削除<=0売上データ
# リテンション法 リテンション>0の売上データ
# ブール配列を決定する
mask = data.loc[:, ' ] > 0
# データのフィルタリング
data = data.loc[mask, :]
print('data:
', data)
print('data:
', data.columns)
# (1)どのカテゴリーがよく売れるか?
# カテゴリーIDでグループ化 売上合計 降順でソートする
# res = data.groupby(by='カテゴリーID')[' ].sum().sort_values(ascending=False).head(10)
# print('res:
', res)
res = pd.pivot_table(data=data,
index='カテゴリーID',
values=' ,
aggfunc='sum').sort_values(by=' , ascending=False).head(10)
print('res:
', res)
# (2)どの商品が売れ筋か?
# 商品IDでグループ化 売上合計 降順でソートする
# res = data.groupby(by='商品ID')[' ].sum().sort_values(ascending=False).head(10)
# print('res:
', res)
res = pd.pivot_table(data=data,
index='商品ID',
values=' ,
aggfunc='sum').sort_values(by=' , ascending=False).head(10)
print('res:
', res)
# sort_index() # インデックスされた値の大きさでソートする。大きさの比較のために利用可能でなければならない。
# reindex() # パラメータはデータの列であり、データは行インデックスとして使用される
# (3)店舗別の売上比率を求める
# 売上欄はない ---。>単価の存在、販売量の存在
# 個別商品の売上 = 商品の単価 * アイテムの売上
# a各商品の売れ行きを調べる
data.loc[:, '売上の] = data.loc[:, ' ] * data.loc[:, ' ]
print('data:
', data)
print('data:
', data.columns)
# b各店舗の売上を調べる = 店舗番号、グループ分け、全商品の店舗売上統計の合計による。
se = data.groupby(by='ショップ番号')['売上の].sum()
print('se:
', se)
# cパーセンテージを計算する
print('各ショップの割合は
', (se / se.sum()).apply(lambda x: format(x, '.2%')))
# (4)スーパーマーケットで客足がピークになるのはどの時間帯か?
# 客の流れのピーク---。>スーパーマーケットで最も人出が多いのはどの時間帯か---。>どの時間帯の注文数が最も多いか?
# 注文データに従ってデータを重複除去する。
# drop_duplicates
# subset : これは、dfが指定された列によって重複排除されることを意味する。
# keep="first":デフォルトでは
# inplace : Trueの場合、元のdfを直接修正する。Falseの場合、元のdfは影響せず、新しい修正されたdfを返す。
data.drop_duplicates(subset='オーダーID', inplace=True)
print('重み付け除去後の結果はこうなる:
', data.shape)
# 異なる時間帯の
# 毎時間を1時間として数える
data.loc[:, 'トランザクション時間'] = pd.to_datetime(data.loc[:, 'トランザクション時間'])
# 時間属性を取得する
data.loc[:, 'hour'] = data.loc[:, 'トランザクション時間'].dt.hour
print('data:
', data)
# 時間でグループ化する --- オーダーIDをカウントする
res = data.groupby(by='hour')['オーダーID'].count().sort_values(ascending=False)
print('res:
', res)
# 8 9 10 ポイントは客足のピークである