У меня есть следующий фрейм данных
In [259]: data
Out[259]:
campaign previous y
0 1 0 no
1 1 0 no
2 1 0 no
3 1 0 no
4 1 0 no
... ... ... ...
45206 3 0 yes
45207 2 0 yes
45208 5 3 yes
45209 4 0 no
45210 2 11 no
[45211 rows x 3 columns]
Это набор данных маркетинговой кампании, где:
кампания = количество звонков (клиенту) по текущей кампании
previous = количество звонков, совершенных в предыдущей кампании
y = переменная ответа (да = успех)
Мне нужно получить представление или ... ответы:
- Являются ли номера контактов (звонки) связаны с успехом
кампании
- Звонки, сделанные в предыдущей кампании, влияют на кампанию
успех
- и т.д.
Для этого я сделал:
import pandas as pd
from tabulate import tabulate, tabulate_formats
# Insert column for total calls
tt_contacts = data.campaign+data['previous']
data.insert(loc=2, column='tt_contacts', value=tt_contacts)
# Copy for conveniency
data1 = data.copy()
# Remove outliers
q = data1['tt_contacts'].quantile(0.99)
data1 = data1[data1['tt_contacts']<q]
# contingency table of observed counts
ct_total = pd.crosstab(data1.y, data1.tt_contacts)
# column percentages
colsum=ct_total.sum(axis=0)
colsum.astype(int)
colpct=ct_total/colsum
colpct_t = colpct.T.sort_values(by=['yes'], ascending=False)
colpct_t.insert(loc=0, column='Freq.', value=colsum)
In [269]: print(tabulate(colpct_t.head(), tablefmt='fancy_grid',\
headers='keys', numalign="decimal"))
╒═══════════════╤═════════╤══════════╤══════════╕
│ tt_contacts │ Freq. │ no │ yes │
╞═══════════════╪═════════╪══════════╪══════════╡
│ 9 │ 546 │ 0.842491 │ 0.157509 │
├───────────────┼─────────┼──────────┼──────────┤
│ 11 │ 321 │ 0.853583 │ 0.146417 │
├───────────────┼─────────┼──────────┼──────────┤
│ 5 │ 2514 │ 0.863564 │ 0.136436 │
├───────────────┼─────────┼──────────┼──────────┤
│ 6 │ 1819 │ 0.86641 │ 0.13359 │
├───────────────┼─────────┼──────────┼──────────┤
│ 7 │ 1099 │ 0.867152 │ 0.132848 │
╘═══════════════╧═════════╧══════════╧══════════╛
Эта таблица может привести меня к мысли, что количество звонков связано с успехом кампании, и если это правда, лучшее количество звонков - девять.
Для подтверждения этого я сделал тест хи-квадрат, см. мой репо .
Теперь я хотел бы создать визуализацию возможного влияния вызовов предыдущей кампании на успех текущей.
для этого я сделал:
In [274]: grouped = pd.DataFrame(data1.groupby(by=\
['tt_contacts','campaign','previous', 'y']).size())
In [275]: grouped
Out[275]:
0
tt_contacts campaign previous y
1 1 0 no 12006
yes 1523
2 1 1 no 1180
yes 351
2 0 no 9333
... ...
17 8 9 no 6
9 8 no 1
12 5 no 1
17 0 no 63
yes 6
[231 rows x 1 columns]
В этом df каждая частота tt_contacts может иметь 1 или более записей и 2 уровня, один для «нет», а другой для «да».
Как построить визуализацию с суммой «да» и «нет» для каждой частоты tt_contacts, например:
tt_contacts campaign previous no yes
1 1 0 12006 1523
2 1 1 1180 351
... ...
17 8 9 71 6