EXCELに溜め込まれた訪問先の最初の担当者の様々な役職データを「経営層」、「管理職層」、「一般職(その他)」に 分類して、どの層にアポを取れてアプローチすれば、次のセルステージにつなげる確率が高いかを分析しました。

仮説&立証

仮説「経営層から最初に攻めるトップダウンアプローチが有効である」
立証「各層のセルステージ成功率に有意な差がある」


分析そのものは簡単でしたが、手間取ったのは、担当者の様々な役職データの分類作業です。

会社には様々な役職名があります。 どんな役職名(肩書)を「経営層」とし、どんな役職名を「管理職層」とするか 意見の分かれるところだと思います。今回は、サンプルとして以下のような分類としました。

層別名  条件
経営層 代表取締役、理事長、社長、取締役、理事、執行役員いずれかの役職名を持つ
管理職層 係長、課長、部長いずれかの役職名を持つ
一般職層 上記の役職を持たないすべて

そして「経営層」でも「管理職層」いずれでもないのを「その他」と三つの層に集約しました。 参照するデータは、ございません。 サンプルのデータでそのあらましを説明します。


チートシート

やりたいこと 方法
代表取締役,理事長,社長,取締役,理事,執行役員
のいずれかの文字列があれば Trueを返し、経営層としてカテゴリ化する。
1. executive = '代表取締役|理事長|社長|取締役|理事|執行役員'
2. df['executive'] =s.str.contains(executive, na=False)
Trueを1に変換する
Falseを0に変換する
1. df['executive'] = df['executive'] * 1

サンプルオペレーション

サンプルデータとして、最初の列にeから始まる社員番号(4桁)と訪問先役職名を用意しました。訪問相手が複数の場合はそれぞれの役職名が入ることを想定します

1
2
3
4
5
6
7
8
#サンプルのデータです 社員番号と訪問先役職です
df = pd.DataFrame({'社員番号': ['e0001','e0002','e0003','e0004','e0005','e0006','e0007','e0008','e0009','e0010',
                          'e0011','e0012','e0013','e0014'],
                    '訪問先役職': ['課長','課長','部長, 代表取締役社長','代表取締役社長','取締役営業担当','営業部長',
                               '担当員','係長','執行役員','係長','課長, 常務取締役', '部長','理事長','理事']})

#作成したデータフレームを出力します
df

結果は以下のとおりになりました。

df_start

1
2
# 訪問先役職の内訳をみます
df['訪問先役職'].value_counts()
課長             2
係長             2
営業部長           1
担当員            1
代表取締役社長        1
部長, 代表取締役社長    1
理事長            1
取締役営業担当        1
理事             1
部長             1
課長, 常務取締役      1
執行役員           1
Name: 訪問先役職, dtype: int64

以下が登録した「語」で分類するプログラムになります。 10行目の 調べる列を変数「s]とするstr.containsメソッドs.str.contains(executive, na=False) で語群「executive」に含む語があれば、Trueを返し、なければFalseを返すところがポイントです。

同様に、17行目ではs.str.contains(management, na=False)で語群「management」を調べています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#経営層(executive),管理職(management)、その他(executive でもmanagementでない=allでない)を語を登録し、それぞれ変数に代入します
executive  = '代表取締役|理事長|社長|取締役|理事|執行役員'
management = '係長|課長|部長'
all        = '係長|課長|部長|代表取締役|理事長|社長|取締役|理事|執行役員'

#調べる列を「変数s」に代入します
s = df['訪問先役職']

#列'executive'を新たに作り、変数executive の各語のいずれかが含まれていれば、'True'を返します。含まれない場合は'False'を返します
df['executive'] =s.str.contains(executive, na=False)
# True/FalseのBloole 値を 1/0に変換します(1をかけるだけです)
df['executive'] = df['executive'] * 1
#列'executive' の1/0のそれぞれの個数をプリントします
print(df['executive'].value_counts())

#列'management'を新たに作り、変数management の各語のいずれかが含まれていれば、'True'を返します。含まれない場合は'False'を返します
df['management'] =s.str.contains(management, na=False)
# True/FalseのBloole 値を 1/0に変換します(1をかけるだけです)
df['management'] = df['management'] * 1
#列'management' の1/0のそれぞれの個数をプリントします
print(df['management'].value_counts())

#列'other'を新たに作り、変数all の各語のいずれかが含まれていない時、'True'を返します。含まれれば'False'を返します
df['other'] =~s.str.contains(all, na=False)
# True/FalseのBloole 値を 1/0に変換します(1をかけるだけです)
df['other'] = df['other'] * 1
#列'other' の1/0のそれぞれの個数をプリントします
print(df['other'].value_counts())

# データフレーム'df'を表示します
df
1    7
0    7
Name: executive, dtype: int64
1    8
0    6
Name: management, dtype: int64
0    13
1     1
Name: other, dtype: int64

df_end

上記のことから、以下のように分類できます。

役職レベル 人数
経営層 7
管理職層 8
一般職層 1
経営層、管理職層の両者 1
トータル 14

参照 pandas.Series.str.contains


ひとこと

今回は、「経営層」、「管理職層」、「一般職層」の3つのカテゴリーに分類しましたが、大企業ではあれば、管理職にもいわゆる「課長」、「支店長」といった中間管理職、「執行役員」とか「本部長」といった事業責任者を分けて分析したいというニーズも当然でてきます。その場合は、従業員数が1000人を超える大企業に対して分類を細かく分けるというようなデータスライスと一緒に行うのが効果的です。しかし、社員数が1000人以上では、セールストップの訪問でも社長といった役員との訪問はほとんどなく、事業責任者が実質、経営層とするのが妥当である場合も少なく無いと思います。


参照ページ一覧

このブログを作成するにあたり、以下のページを参考にしています。併せてご覧ください。

1) 複数の行を連結して重複行を削除する
2) カテゴリカル変数の要約
3) Pandas 列内のデータをN分割して、それぞれをセミコロンで連結した新しい列を作成する
4) データクリーニングの備忘録(Updated)