Построить столбцы из многоуровневого индекса Pandas DataFrame - PullRequest
0 голосов
/ 27 октября 2018

У меня есть следующий фрейм данных

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...