Leitura dos Dados

[ ]:
path = '/content/drive/MyDrive/Trabalho/Cancer/Datasets/colorretal.csv'

df = read_csv(path, drop_id=True)
df.head(3)
(68013, 68)
ESCOLARI IDADE SEXO UFNASC UFRESID IBGE CIDADE CATEATEND DTCONSULT DIAGPREV ... RECNENHUM RECLOCAL RECREGIO RECDIST REC01 REC02 REC03 REC04 IBGEATEN HABILIT
0 3 19 2 SP MG 3100104 ABADIA DOS DOURADOS 2 2000-01-05 1 ... 1 0 0 0 NaN NaN NaN NaN 3550308 CACON
1 4 19 2 SP SP 3539301 PIRASSUNUNGA 9 2001-06-08 2 ... 0 1 0 0 NaN NaN NaN NaN 3525300 CACON
2 4 19 2 SP SP 3550308 SAO PAULO 9 2002-02-04 2 ... 1 0 0 0 NaN NaN NaN NaN 3550308 CACON

3 rows × 68 columns

Análise dos dados

Nesta seção serão analisadas informações dos dados com gráficos e verificação de dados faltantes.

Informações

[ ]:
data = df.copy()
[ ]:
data.shape
(68013, 68)
[ ]:
data.head(3)
ESCOLARI IDADE SEXO UFNASC UFRESID IBGE CIDADE CATEATEND DTCONSULT DIAGPREV ... RECNENHUM RECLOCAL RECREGIO RECDIST REC01 REC02 REC03 REC04 IBGEATEN HABILIT
0 3 19 2 SP MG 3100104 ABADIA DOS DOURADOS 2 2000-01-05 1 ... 1 0 0 0 NaN NaN NaN NaN 3550308 CACON
1 4 19 2 SP SP 3539301 PIRASSUNUNGA 9 2001-06-08 2 ... 0 1 0 0 NaN NaN NaN NaN 3525300 CACON
2 4 19 2 SP SP 3550308 SAO PAULO 9 2002-02-04 2 ... 1 0 0 0 NaN NaN NaN NaN 3550308 CACON

3 rows × 68 columns

[ ]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 68013 entries, 0 to 68012
Data columns (total 68 columns):
 #   Column         Non-Null Count  Dtype
---  ------         --------------  -----
 0   ESCOLARI       68013 non-null  int64
 1   IDADE          68013 non-null  int64
 2   SEXO           68013 non-null  int64
 3   UFNASC         68013 non-null  object
 4   UFRESID        68013 non-null  object
 5   IBGE           68013 non-null  int64
 6   CIDADE         68013 non-null  object
 7   CATEATEND      68013 non-null  int64
 8   DTCONSULT      68013 non-null  object
 9   DIAGPREV       68013 non-null  int64
 10  DTDIAG         68013 non-null  object
 11  TOPO           68013 non-null  object
 12  TOPOGRUP       68013 non-null  object
 13  DESCTOPO       68013 non-null  object
 14  MORFO          68013 non-null  int64
 15  comportamento  68013 non-null  int64
 16  DESCMORFO      68013 non-null  object
 17  EC             68013 non-null  object
 18  ECGRUP         68013 non-null  object
 19  T              68013 non-null  object
 20  N              68013 non-null  object
 21  M              68013 non-null  object
 22  META01         17092 non-null  object
 23  META02         5431 non-null   object
 24  META03         1513 non-null   object
 25  META04         379 non-null    object
 26  DTTRAT         68013 non-null  object
 27  NAOTRAT        68013 non-null  int64
 28  TRATAMENTO     68013 non-null  object
 29  TRATHOSP       68013 non-null  object
 30  TRATFAPOS      68013 non-null  object
 31  NENHUM         68013 non-null  int64
 32  CIRURGIA       68013 non-null  int64
 33  RADIO          68013 non-null  int64
 34  QUIMIO         68013 non-null  int64
 35  HORMONIO       68013 non-null  int64
 36  TMO            68013 non-null  int64
 37  IMUNO          68013 non-null  int64
 38  OUTROS         68013 non-null  int64
 39  NENHUMANT      68013 non-null  int64
 40  NENHUMAPOS     68013 non-null  int64
 41  CIRURAPOS      68013 non-null  int64
 42  RADIOAPOS      68013 non-null  int64
 43  QUIMIOAPOS     68013 non-null  int64
 44  HORMOAPOS      68013 non-null  int64
 45  TMOAPOS        68013 non-null  int64
 46  IMUNOAPOS      68013 non-null  int64
 47  OUTROAPOS      68013 non-null  int64
 48  DTULTINFO      68013 non-null  object
 49  ULTINFO        68012 non-null  float64
 50  CONSDIAG       68013 non-null  int64
 51  TRATCONS       63852 non-null  float64
 52  DIAGTRAT       63852 non-null  float64
 53  ANODIAG        68013 non-null  int64
 54  FAIXAETAR      68013 non-null  object
 55  DRS            63763 non-null  object
 56  RRAS           68013 non-null  int64
 57  DTRECIDIVA     68013 non-null  object
 58  RECNENHUM      68013 non-null  int64
 59  RECLOCAL       68013 non-null  int64
 60  RECREGIO       68013 non-null  int64
 61  RECDIST        68013 non-null  int64
 62  REC01          8610 non-null   object
 63  REC02          2479 non-null   object
 64  REC03          693 non-null    object
 65  REC04          0 non-null      float64
 66  IBGEATEN       68013 non-null  int64
 67  HABILIT        68013 non-null  object
dtypes: float64(4), int64(34), object(30)
memory usage: 35.3+ MB
[ ]:
data.describe().T
count mean std min 25% 50% 75% max
ESCOLARI 68013.0 4.388896e+00 2.841315 1.0 2.0 3.0 9.0 9.0
IDADE 68013.0 6.180885e+01 13.390723 0.0 53.0 63.0 71.0 105.0
SEXO 68013.0 1.483393e+00 0.499728 1.0 1.0 1.0 2.0 2.0
IBGE 68013.0 3.544946e+06 327098.843433 1100015.0 3518404.0 3541000.0 3550308.0 9999999.0
CATEATEND 68013.0 4.324967e+00 3.382186 1.0 2.0 2.0 9.0 9.0
DIAGPREV 68013.0 1.554056e+00 0.497073 1.0 1.0 2.0 2.0 2.0
MORFO 68013.0 8.190125e+04 1272.052137 80003.0 81403.0 81403.0 82113.0 97583.0
comportamento 68013.0 2.984032e+00 0.125351 2.0 3.0 3.0 3.0 3.0
NAOTRAT 68013.0 7.816506e+00 0.877419 1.0 8.0 8.0 8.0 9.0
NENHUM 68013.0 6.434064e-02 0.245361 0.0 0.0 0.0 0.0 1.0
CIRURGIA 68013.0 7.033361e-01 0.456790 0.0 0.0 1.0 1.0 1.0
RADIO 68013.0 2.431006e-01 0.428959 0.0 0.0 0.0 0.0 1.0
QUIMIO 68013.0 6.194404e-01 0.485528 0.0 0.0 1.0 1.0 1.0
HORMONIO 68013.0 5.616573e-03 0.074734 0.0 0.0 0.0 0.0 1.0
TMO 68013.0 1.176246e-04 0.010845 0.0 0.0 0.0 0.0 1.0
IMUNO 68013.0 1.337980e-03 0.036554 0.0 0.0 0.0 0.0 1.0
OUTROS 68013.0 5.701851e-02 0.231880 0.0 0.0 0.0 0.0 1.0
NENHUMANT 68013.0 9.996030e-01 0.019921 0.0 1.0 1.0 1.0 1.0
NENHUMAPOS 68013.0 9.456869e-01 0.226636 0.0 1.0 1.0 1.0 1.0
CIRURAPOS 68013.0 7.307427e-03 0.085171 0.0 0.0 0.0 0.0 1.0
RADIOAPOS 68013.0 2.209872e-02 0.147006 0.0 0.0 0.0 0.0 1.0
QUIMIOAPOS 68013.0 1.664388e-02 0.127934 0.0 0.0 0.0 0.0 1.0
HORMOAPOS 68013.0 1.029215e-04 0.010145 0.0 0.0 0.0 0.0 1.0
TMOAPOS 68013.0 0.000000e+00 0.000000 0.0 0.0 0.0 0.0 0.0
IMUNOAPOS 68013.0 1.029215e-04 0.010145 0.0 0.0 0.0 0.0 1.0
OUTROAPOS 68013.0 1.321806e-02 0.114208 0.0 0.0 0.0 0.0 1.0
ULTINFO 68012.0 2.523584e+00 0.855408 1.0 2.0 3.0 3.0 4.0
CONSDIAG 68013.0 4.002275e+01 112.661516 0.0 6.0 21.0 43.0 5558.0
TRATCONS 63852.0 5.118128e+01 109.315691 0.0 8.0 30.0 63.0 5608.0
DIAGTRAT 63852.0 6.226381e+01 107.534186 0.0 5.0 42.0 84.0 4828.0
ANODIAG 68013.0 2.011722e+03 5.407356 2000.0 2008.0 2012.0 2016.0 2021.0
RRAS 68013.0 1.497524e+01 22.078279 1.0 6.0 10.0 13.0 99.0
RECNENHUM 68013.0 8.784203e-01 0.326802 0.0 1.0 1.0 1.0 1.0
RECLOCAL 68013.0 3.614015e-02 0.186640 0.0 0.0 0.0 0.0 1.0
RECREGIO 68013.0 3.317013e-02 0.179082 0.0 0.0 0.0 0.0 1.0
RECDIST 68013.0 6.179701e-02 0.240788 0.0 0.0 0.0 0.0 1.0
REC04 0.0 NaN NaN NaN NaN NaN NaN NaN
IBGEATEN 68013.0 3.534135e+06 18508.158101 3502804.0 3516200.0 3543402.0 3550308.0 3555000.0
[ ]:
plt.figure(figsize=(20, 8))
plt.bar(height = data.ANODIAG.value_counts().sort_index(), x=np.sort(data.ANODIAG.unique()))
plt.xlabel('Year', size=14)
plt.xticks(np.sort(data.ANODIAG.unique()))
plt.ylabel('Number of patients', size=14)
plt.title('Number of patients by year of diagnosis', size=16)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.show()
_images/Colorretal_-_preprocessing_10_0.png
[ ]:
masc = data[data.SEXO == 1]
fem = data[data.SEXO == 2]

mascx = np.sort(masc.ANODIAG.unique())
mascy = masc.ANODIAG.value_counts().sort_index()

femx = np.sort(fem.ANODIAG.unique())
femy = fem.ANODIAG.value_counts().sort_index()
[ ]:
fig, ax = plt.subplots(figsize=(20, 8))
width = 0.35
ax1 = ax.bar(mascx + width/2, mascy, width, label='Men')
ax2 = ax.bar(femx - width/2, femy, width, label='Women')
ax.set_xlabel('Year', size=14)
ax.set_xticks(mascx)
ax.set_ylabel('Patients', size=14)
ax.set_title('Patients per year of diagnosis', size=16)

ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()
_images/Colorretal_-_preprocessing_12_0.png
[ ]:
# Replacing the string format for the age group column
before = ['00-09', '10-19', '20-29', '30-39', '40-49', '50-59', '60-69']
after = ['00 to 09', '10 to 19', '20 to 29', '30 to 39', '40 to 49', '50 to 59', '60 to 69']

masc.FAIXAETAR.replace(before, after, inplace=True)
fem.FAIXAETAR.replace(before, after, inplace=True)

mascx = np.sort(masc.FAIXAETAR.unique())
mascy = masc.FAIXAETAR.value_counts().sort_index()

femx = np.sort(fem.FAIXAETAR.unique())
femy = fem.FAIXAETAR.value_counts().sort_index()
[ ]:
fig, ax = plt.subplots(figsize=(20, 8))
ax1 = ax.plot(mascx, (mascy/masc.shape[0])*100, label='Men', marker='o')
ax2 = ax.plot(femx, (femy/fem.shape[0])*100, label='Women', marker='*')
ax.set_xlabel('Age', size=14)
ax.set_ylabel('% of patients', size=14)
ax.set_title('Patients by age', size=16)

ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()
_images/Colorretal_-_preprocessing_14_0.png
[ ]:
EC = list(np.sort(data.ECGRUP.unique()))[:5] # Categories 0, I, II, III, IV, without X and Y

mascEC = masc.loc[masc.ECGRUP.isin(EC)]
femEC = fem.loc[fem.ECGRUP.isin(EC)]

mascx = np.sort(mascEC.ECGRUP.unique())
mascy = mascEC.ECGRUP.value_counts().sort_index()

femx = np.sort(femEC.ECGRUP.unique())
femy = femEC.ECGRUP.value_counts().sort_index()
[ ]:
x = np.arange(len(mascx))
fig, ax = plt.subplots(figsize=(20, 8))
width = 0.35
ax1 = ax.bar(x + width/2, (mascy/mascEC.shape[0])*100, width, label='Men')
ax2 = ax.bar(x - width/2, (femy/femEC.shape[0])*100, width, label='Women')
ax.set_xlabel('Clinical stage', size=14)
ax.set_ylabel('% of patients', size=14)
ax.set_title('Patients by clinical stage', size=16)

ax.legend()
ax.set_xticks(x)
ax.set_xticklabels(list(mascx))
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()
_images/Colorretal_-_preprocessing_16_0.png
[ ]:
df_diag1 = data[data.DIAGPREV == 1] # without diagnosis/without treatment
df_diag2 = data[data.DIAGPREV == 2] # with diagnosis/without treatment

x = np.sort(df_diag1.ANODIAG.unique())
y = df_diag1.groupby('ANODIAG')['CONSDIAG'].median()
[ ]:
plt.figure(figsize=(20, 8))
plt.plot(x, y, marker='o')
plt.xlabel('Year', size=14)
plt.xticks(x)
plt.ylabel('Number of days', size=14)
plt.title('Time (in days) between consultation and diagnosis for each year', size=16)
for xi, yi in zip(x,y):
    label = '{:.0f}'.format(yi)
    plt.annotate(label, # this is the text
                 (xi, yi), # this is the point to label
                 textcoords='offset points', # how to position the text
                 xytext=(0, 10), # distance from text to points (x,y)
                 ha='center') # horizontal alignment can be left, right or center
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)

plt.show()
_images/Colorretal_-_preprocessing_18_0.png
[ ]:
# 1 – Alive with cancer; 2 – Alive, without other specifications;
# 3 – Death by cancer; 4 – Death by other causes, without other specifications
data['ULTINFO'].value_counts()
3.0    27923
2.0    23689
1.0     8371
4.0     8029
Name: ULTINFO, dtype: int64
[ ]:
mascx = np.sort(masc.ULTINFO.unique())
mascy = masc.ULTINFO.value_counts().sort_index()

femx = np.sort(fem.ULTINFO.unique())
femy = fem.ULTINFO.value_counts().sort_index()

x_ticks = ['Alive with cancer', 'Alive, without other specifications', 'Death by cancer', 'Death by other causes']
[ ]:
x = np.arange(len(x_ticks))
fig, ax = plt.subplots(figsize=(20, 8))
width = 0.35
ax1 = ax.bar(x + width/2, mascy, width, label='Men')
ax2 = ax.bar(x - width/2, femy, width, label='Women')
ax.set_xlabel('Last information', size=14)
ax.set_ylabel('Number of pacients', size=14)
ax.set_title('Number of patients by last information category', size=16)

ax.legend()
ax.set_xticks(x)
ax.set_xticklabels(list(x_ticks))
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.show()
_images/Colorretal_-_preprocessing_21_0.png
[ ]:
df_aux = data.copy()
df_aux.drop(columns=[#'S',
                     'META03','META04',
                     #'QUIMIOANT','HORMOANT','TMOANT','IMUNOANT','OUTROANT',
                     #'CICI','CICIGRUP','CICISUBGRU',
                     'REC04','TMOAPOS'], inplace=True)
corr_matrix = df_aux.corr()
abs(corr_matrix['ULTINFO']).sort_values(ascending = False)
ULTINFO          1.000000
ANODIAG          0.307997
CATEATEND        0.222954
IDADE            0.152825
NENHUMAPOS       0.123002
NAOTRAT          0.114400
OUTROAPOS        0.106963
NENHUM           0.104858
DIAGPREV         0.102796
CIRURGIA         0.085427
QUIMIOAPOS       0.079463
RECREGIO         0.074847
RECNENHUM        0.067192
RECLOCAL         0.052129
ESCOLARI         0.047074
SEXO             0.043748
QUIMIO           0.043335
DIAGTRAT         0.041150
RRAS             0.035150
RADIOAPOS        0.034604
CONSDIAG         0.034106
CIRURAPOS        0.032537
comportamento    0.031074
RADIO            0.027211
OUTROS           0.015453
IBGEATEN         0.014499
HORMONIO         0.009892
HORMOAPOS        0.007904
NENHUMANT        0.007884
TRATCONS         0.007383
IMUNOAPOS        0.007345
IBGE             0.006388
MORFO            0.004807
RECDIST          0.003953
TMO              0.001884
IMUNO            0.000166
Name: ULTINFO, dtype: float64
[ ]:
fig, ax = plt.subplots(figsize = (25, 20))
colormap = sns.diverging_palette(220, 10, as_cmap = True)

sns.heatmap(corr_matrix, cmap = colormap, annot = True, fmt = '.2f')
fig.show()
_images/Colorretal_-_preprocessing_23_0.png
[ ]:
data.iloc[:,:38].hist(bins=10, figsize=(20, 15))
plt.show()
_images/Colorretal_-_preprocessing_24_0.png
[ ]:
data.iloc[:,38:58].hist(bins=10, figsize=(20, 15))
plt.show()
_images/Colorretal_-_preprocessing_25_0.png
[ ]:
data.iloc[:, 58:].hist(bins=10, figsize=(20, 15))
plt.show()
_images/Colorretal_-_preprocessing_26_0.png

Valores faltantes

[ ]:
missing = data.isna().sum().sort_values(ascending=False)
prop = missing[missing > 0]/data.shape[0]
prop
REC04       1.000000
META04      0.994428
REC03       0.989811
META03      0.977754
REC02       0.963551
META02      0.920148
REC01       0.873407
META01      0.748695
DRS         0.062488
TRATCONS    0.061179
DIAGTRAT    0.061179
ULTINFO     0.000015
dtype: float64
[ ]:
plt.figure(figsize=(12, 5))
plt.bar(height = prop*100, x=prop.index)
plt.xlabel('Variable', size=14)
plt.ylabel('%', size=14)
plt.title('Percentage of missing data per column', size=16)
plt.xticks(rotation=30)
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.show()
_images/Colorretal_-_preprocessing_29_0.png
[ ]:
# REC04 - Local da recidiva/metástase. Formato: C99
data[data['REC04'].isna() == False]['REC04'].shape
(0,)
[ ]:
# META04 - Metástase. Formato: C99
data[data['META04'].isna() == False]['META04'].shape
(379,)
[ ]:
# REC03 - Local da recidiva/metástase. Formato: C99
data[data['REC03'].isna() == False]['REC03'].shape
(693,)
[ ]:
# META03 - Metástase. Formato: C99
data[data['META03'].isna() == False]['META03'].shape
(1513,)
[ ]:
# REC02 - Local da recidiva/metástase. Formato: C99
data[data['REC02'].isna() == False]['REC02'].shape
(2479,)
[ ]:
# META02 - Metástase. Formato: C99
data[data['META02'].isna() == False]['META02'].shape
(5431,)
[ ]:
# REC01 - Local da recidiva/metástase. Formato: C99
data[data['REC01'].isna() == False]['REC01'].shape
(8610,)
[ ]:
# META01 - Metástase. Formato: C99
data[data['META01'].isna() == False]['META01'].shape
(17092,)
[ ]:
# DRS - DRS
data[data['DRS'].isna() == False]['DRS'].shape
(63763,)
[ ]:
# TRATCONS - Diferença em dias entre as datas de consulta e tratamento
data[data['TRATCONS'].isna() == False]['TRATCONS'].shape
(63852,)
[ ]:
# DIAGTRAT - Diferença em dias entre as datas de tratamento e diagnóstico
data[data['DIAGTRAT'].isna() == False]['DIAGTRAT'].shape
(63852,)
[ ]:
# ULTINFO - Última informação do paciente
data[data['ULTINFO'].isna() == False]['ULTINFO'].shape
(68012,)

Análise das colunas

Nesta seção, as colunas serão analisadas individualmente, após isso, uma função será criada para realizar a limpeza e seleção dos dados.

As colunas foram divididas de acordo com seus tipos.

Como mostrado na imagem na página inicial, foram feitas algumas seleções nas de grupo de estadiamento clínico, morfologia e comportamento, além da retirada de várias colunas que não serão utilizadas.

Verifique a seção das funções para ver a função completa.

[ ]:
df_aux = read_csv(path, drop_id=True)
(68013, 68)
[ ]:
df_aux.columns
Index(['ESCOLARI', 'IDADE', 'SEXO', 'UFNASC', 'UFRESID', 'IBGE', 'CIDADE',
       'CATEATEND', 'DTCONSULT', 'DIAGPREV', 'DTDIAG', 'TOPO', 'TOPOGRUP',
       'DESCTOPO', 'MORFO', 'comportamento', 'DESCMORFO', 'EC', 'ECGRUP', 'T',
       'N', 'M', 'META01', 'META02', 'META03', 'META04', 'DTTRAT', 'NAOTRAT',
       'TRATAMENTO', 'TRATHOSP', 'TRATFAPOS', 'NENHUM', 'CIRURGIA', 'RADIO',
       'QUIMIO', 'HORMONIO', 'TMO', 'IMUNO', 'OUTROS', 'NENHUMANT',
       'NENHUMAPOS', 'CIRURAPOS', 'RADIOAPOS', 'QUIMIOAPOS', 'HORMOAPOS',
       'TMOAPOS', 'IMUNOAPOS', 'OUTROAPOS', 'DTULTINFO', 'ULTINFO', 'CONSDIAG',
       'TRATCONS', 'DIAGTRAT', 'ANODIAG', 'FAIXAETAR', 'DRS', 'RRAS',
       'DTRECIDIVA', 'RECNENHUM', 'RECLOCAL', 'RECREGIO', 'RECDIST', 'REC01',
       'REC02', 'REC03', 'REC04', 'IBGEATEN', 'HABILIT'],
      dtype='object')

Datas

[ ]:
# #NULL! to NaN
df_aux.loc[df_aux.DTRECIDIVA == '#NULL!', 'DTRECIDIVA'] = np.nan
df_aux.loc[df_aux.DTULTINFO == '#NULL!', 'DTULTINFO'] = np.nan
df_aux.loc[df_aux.DTTRAT == '#NULL!', 'DTTRAT'] = np.nan
  • DTCONSULT: Data da 1ª consulta (date = 10). Formato: DD/MM/YYYY

  • DTDIAG: Data do diagnóstico (date = 10). Formato: DD/MM/YYYY

  • DTTRAT: Data de inicio do tratamento (date = 10). Formato: DD/MM/YYYY

  • DTULTINFO: Data da última informação do paciente (date = 10). Formato: DD/MM/YYYY

  • DTRECIDIVA: Data da última ocorrência de recidiva (date = 10). Formato: DD/MM/YYYY

[ ]:
# Data - DTCONSULT, DTDIAG, DTTRAT, DTULTINFO, DTRECIDIVA
dates = ['DTCONSULT', 'DTDIAG', 'DTTRAT', 'DTULTINFO', 'DTRECIDIVA']
df_aux[dates].isna().sum()
DTCONSULT         0
DTDIAG            0
DTTRAT         4161
DTULTINFO         5
DTRECIDIVA    57470
dtype: int64
[ ]:
(df_aux[dates].isna().sum()/df_aux.shape[0])*100
DTCONSULT      0.000000
DTDIAG         0.000000
DTTRAT         6.117948
DTULTINFO      0.007352
DTRECIDIVA    84.498552
dtype: float64
[ ]:
df_aux[dates].head(3)
DTCONSULT DTDIAG DTTRAT DTULTINFO DTRECIDIVA
0 2000-01-05 2000-01-13 2000-01-13 00:00:00 2006-12-13 00:00:00 NaN
1 2001-06-08 2001-06-08 2001-07-30 00:00:00 2005-01-26 00:00:00 2004-10-26 00:00:00
2 2002-02-04 2002-02-04 2002-04-26 00:00:00 2003-06-08 00:00:00 NaN

Categorias numéricas

  • SEXO: Sexo do paciente (int = 1).

    1 – MASCULINO

    2 – FEMININO

[ ]:
df_aux.SEXO.value_counts()
1    35136
2    32877
Name: SEXO, dtype: int64
  • ESCOLARI: Código para escolaridade do paciente (int = 1).

    1 – ANALFABETO

    2 – ENS. FUND. INCOMPLETO

    3 – ENS. FUND. COMPLETO

    4 – ENSINO MÉDIO

    5 – SUPERIOR

    9 – IGNORADA

[ ]:
df_aux.ESCOLARI.value_counts()
2    21117
9    17133
3    11862
4     9748
5     4835
1     3318
Name: ESCOLARI, dtype: int64
  • CATEATEND: Categoria de atendimento ao diagnóstico (int = 1).

    1 - CONVENIO

    2 - SUS

    3 – PARTICULAR

    9 – SEM INFORMAÇÃO

[ ]:
df_aux.CATEATEND.value_counts()
2    39473
9    23273
1     5025
3      242
Name: CATEATEND, dtype: int64
  • DIAGPREV: Diagnóstico e tratamento anterior (int = 1).

    1 – SEM DIAGNÓSTICO / SEM TRATAMENTO

    2 – COM DIAGNÓSTICO / SEM TRATAMENTO

[ ]:
df_aux.DIAGPREV.value_counts()
2    37683
1    30330
Name: DIAGPREV, dtype: int64
  • NAOTRAT: Código da razão para não realização do tratamento (int = 1).

    1 – RECUSA DO TRATAMENTO

    2 – DOENÇA AVANÇADA, FALTA DE CONDIÇÕES CLINICAS

    3 – OUTRAS DOENÇAS ASSOCIADAS

    4 – ABANDONO DE TRATAMENTO

    5 – OBITO POR CANCER

    6 – OBITO POR OUTRAS CAUSAS, SOE

    7 – OUTRAS

    8 – NÃO SE APLICA (CASO TENHA TRATAMENTO)

    9 – SEM INFORMAÇÃO

[ ]:
df_aux.NAOTRAT.value_counts()
8    63839
5     1830
7      879
2      749
9      289
6      128
3      121
1      111
4       67
Name: NAOTRAT, dtype: int64
  • NENHUM: Tratamento recebido no hospital = nenhum (int = 1). 0 – NÃO; 1 – SIM

  • CIRURGIA: Tratamento recebido no hospital = cirurgia (int = 1). 0 – NÃO; 1 – SIM

  • RADIO: Tratamento recebido no hospital = radioterapia (int = 1). 0 – NÃO; 1 – SIM

  • QUIMIO: Tratamento recebido no hospital = quimioterapia (int = 1). 0 – NÃO; 1 – SIM

  • HORMONIO: Tratamento recebido no hospital = hormonioterapia (int = 1). 0 – NÃO; 1 – SIM

  • TMO: Tratamento recebido no hospital = tmo (int = 1). 0 – NÃO; 1 – SIM

  • IMUNO: Tratamento recebido no hospital = imunoterapia (int = 1). 0 – NÃO; 1 – SIM

  • OUTROS: Tratamento recebido no hospital = outros (int = 1). 0 – NÃO; 1 – SIM

[ ]:
df_aux.NENHUM.unique()
array([0, 1])
[ ]:
df_aux.CIRURGIA.unique()
array([1, 0])
[ ]:
df_aux.RADIO.unique()
array([1, 0])
[ ]:
df_aux.QUIMIO.unique()
array([1, 0])
[ ]:
df_aux.HORMONIO.unique()
array([0, 1])
[ ]:
df_aux.TMO.unique()
array([0, 1])
[ ]:
df_aux.IMUNO.unique()
array([0, 1])
[ ]:
df_aux.OUTROS.unique()
array([1, 0])
  • NENHUMANT: Tratamento recebido fora do hospital e antes da admissão = nenhum (int = 1). 0 – NÃO; 1 – SIM

[ ]:
df_aux.NENHUMANT.unique()
array([1, 0])
  • NENHUMAPOS: Tratamento recebido fora do hospital e durante/após admissão = nenhum (int = 1). 0 – NÃO; 1 – SIM

  • CIRURAPOS: Tratamento recebido fora do hospital e durante/após admissão = cirurgia (int = 1). 0 – NÃO; 1 – SIM

  • RADIOAPOS: Tratamento recebido fora do hospital e durante/após admissão = radioterapia (int = 1). 0 – NÃO; 1 – SIM

  • QUIMIOAPOS: Tratamento recebido fora do hospital e durante/após admissão = quimioterapia (int = 1). 0 – NÃO; 1 – SIM

  • HORMOAPOS: Tratamento recebido fora do hospital e durante/após admissão = hormonioterapia (int = 1). 0 – NÃO; 1 – SIM

  • TMOAPOS: Tratamento recebido fora do hospital e durante/após admissão = tmo (int = 1). 0 – NÃO; 1 – SIM

  • IMUNOAPOS: Tratamento recebido fora do hospital e durante/após admissão = imunoterapia (int = 1). 0 – NÃO; 1 – SIM

  • OUTROAPOS: Tratamento recebido fora do hospital e durante/após admissão = outros (int = 1). 0 – NÃO; 1 – SIM

[ ]:
df_aux.NENHUMAPOS.unique()
array([1, 0])
[ ]:
df_aux.CIRURAPOS.unique()
array([0, 1])
[ ]:
df_aux.RADIOAPOS.unique()
array([0, 1])
[ ]:
df_aux.QUIMIOAPOS.unique()
array([0, 1])
[ ]:
df_aux.HORMOAPOS.unique()
array([0, 1])
[ ]:
df_aux.TMOAPOS.unique() ### drop
array([0])
[ ]:
df_aux.IMUNOAPOS.unique()
array([0, 1])
[ ]:
df_aux.OUTROAPOS.unique()
array([0, 1])
  • ULTINFO: Última informação sobre o paciente (int = 1).

    1 – VIVO, COM CÂNCER

    2 – VIVO, SOE

    3 – OBITO POR CANCER

    4 – OBITO POR OUTRAS CAUSAS, SOE

[ ]:
df_aux.ULTINFO.value_counts()
3.0    27923
2.0    23689
1.0     8371
4.0     8029
Name: ULTINFO, dtype: int64
  • RECNENHUM: Sem recidiva (int = 1). 0 - Não; 1 - Sim

  • RECLOCAL: Recidiva local (int = 1). 0 - Não; 1 - Sim

  • RECREGIO: Recidiva regional (int = 1). 0 - Não; 1 - Sim

  • RECDIST: Recidiva a distância / metástase (int = 1). 0 - Não; 1 - Sim

[ ]:
df_aux.RECNENHUM.value_counts()
1    59744
0     8269
Name: RECNENHUM, dtype: int64
[ ]:
df_aux.RECLOCAL.value_counts()
0    65555
1     2458
Name: RECLOCAL, dtype: int64
[ ]:
df_aux.RECREGIO.value_counts()
0    65757
1     2256
Name: RECREGIO, dtype: int64
[ ]:
df_aux.RECDIST.value_counts()
0    63810
1     4203
Name: RECDIST, dtype: int64

Categorias com letras

  • TRATAMENTO: Código de combinação dos tratamentos realizados (char = 1).

    A – Cirurgia

    B – Radioterapia

    C – Quimioterapia

    D – Cirurgia + Radioterapia

    E – Cirurgia + Quimioterapia

    F – Radioterapia + Quimioterapia

    G – Cirurgia + Radio + Quimio

    H – Cirurgia + Radio + Quimio + Hormonio

    I – Outras combinações de tratamento

    J – Nenhum tratamento realizado
  • TRATHOSP: Código de combinação dos tratamentos realizados no hospital (char = 1).

    A – Cirurgia

    B – Radioterapia

    C – Quimioterapia

    D – Cirurgia + Radioterapia

    E – Cirurgia + Quimioterapia

    F – Radioterapia + Quimioterapia

    G – Cirurgia + Radio + Quimio

    H – Cirurgia + Radio + Quimio + Hormonio

    I – Outras combinações de tratamento

    J – Nenhum tratamento realizado

  • TRATFAPOS: Código de combinação dos tratamentos realizados após admissão fora do hospital (char = 1).

    A – Cirurgia

    B – Radioterapia

    C – Quimioterapia

    D – Cirurgia + Radioterapia

    E – Cirurgia + Quimioterapia

    F – Radioterapia + Quimioterapia

    G – Cirurgia + Radio + Quimio

    H – Cirurgia + Radio + Quimio + Hormonio

    I – Outras combinações de tratamento

    J – Nenhum tratamento realizado

    K – Sem informação

[ ]:
np.sort(df_aux.TRATAMENTO.unique())
array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype=object)
[ ]:
np.sort(df_aux.TRATHOSP.unique())
array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype=object)
[ ]:
np.sort(df_aux.TRATFAPOS.unique())
array(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'I', 'J'], dtype=object)

Numéricas

  • IDADE: Idade do paciente (int = 3).

[ ]:
df_aux.IDADE.nunique()
103
  • CONSDIAG: Diferença em dias entre as datas de consulta o diagnóstico (num = dias).

  • TRATCONS: Diferença em dias entre as datas de consulta e tratamento (num = dias).

  • DIAGTRAT: Diferença em dias entre as datas de tratamento e diagnóstico (num = dias).

[ ]:
df_aux.CONSDIAG.isna().sum()
0
[ ]:
df_aux.TRATCONS.isna().sum()
4161
[ ]:
df_aux.DIAGTRAT.isna().sum()
4161
  • ANODIAG: Ano de diagnóstico (int = 4). Formato: 9999

[ ]:
np.sort(df_aux.ANODIAG.unique())
array([2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
       2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021])
  • IBGE: Código da cidade de residência do paciente segundo IBGE com digito verificador (int = 7).

[ ]:
df_aux.IBGE.nunique()
1361
  • IBGEATEN

[ ]:
df_aux.IBGEATEN.isna().sum()
0
  • MORFO: Código da morfologia (char = 5). Formato: 99999

[ ]:
df_aux.MORFO.unique()
array([81403, 82113, 84803, 80103, 84813, 82493, 80323, 82403, 84903,
       82632, 82633, 82102, 81402, 82463, 85603, 81473, 82203, 82443,
       82453, 82433, 90703, 89003, 88103, 96873, 95913, 95903, 96553,
       96803, 96903, 96503, 80003, 82623, 80203, 80102, 82553, 82103,
       82603, 84303, 80703, 81482, 80413, 83103, 97023, 82612, 82613,
       85743, 89363, 85103, 88903, 80043, 91203, 82153, 96843, 80133,
       88003, 81233, 84403, 82303, 80833, 96733, 97283, 82213, 85503,
       82013, 83233, 88503, 81903, 81243, 87203, 85723, 81433, 82513,
       97143, 84703, 81203, 85763, 80213, 96983, 80763, 96993, 80702,
       96703, 88043, 89333, 89803, 80503, 85703, 88583, 88513, 84603,
       88013, 88023, 84413, 80123, 81413, 80513, 80523, 95713, 82413,
       95953, 80843, 84823, 80023, 80333, 80723, 96833, 81303, 95963,
       97583, 82313, 80713, 88303, 80303, 96753, 88533, 80733, 96523,
       89013, 80113, 87463, 88053, 84713, 91403, 80153, 89353, 88523,
       88913, 80753, 89343, 84723, 83133, 85713, 81223, 93643, 82903,
       88063, 89203])
  • RRAS: RRAS (int = 200). [1,2,3, … ,16,17,99]

[ ]:
np.sort(df_aux.RRAS.unique())
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       99])
[ ]:
df_aux.RRAS.value_counts()
6     17026
13     7279
12     6948
9      4751
15     4272
99     4250
10     3285
1      2874
14     2731
8      2536
17     2422
16     2028
2      1775
7      1771
5      1479
11     1362
4       899
3       325
Name: RRAS, dtype: int64
  • comportamento

[ ]:
df_aux.comportamento.unique()
array([3, 2])

Textuais

  • UFNASC: UF de nascimento (char = 2). Outras opções: SI - Sem informação; OP - Outro país.

  • UFRESID: UF de residência (char = 2). Outras opções: OP - Outro país.

  • CIDADE: Cidade de residência do paciente (char = 200).

[ ]:
df_aux.UFNASC.unique()
array(['SP', 'MG', 'BA', 'PR', 'SI', 'MA', 'SE', 'MT', 'GO', 'PA', 'AM',
       'MS', 'RO', 'CE', 'PI', 'AL', 'OP', 'PE', 'ES', 'RJ', 'SC', 'PB',
       'RS', 'RN', 'DF', 'AC', 'RR', 'TO', 'AP'], dtype=object)
[ ]:
df_aux.UFRESID.unique()
array(['MG', 'SP', 'MT', 'PA', 'RO', 'ES', 'MS', 'PE', 'PR', 'GO', 'BA',
       'SE', 'TO', 'CE', 'RJ', 'PB', 'SC', 'AM', 'MA', 'DF', 'AP', 'AL',
       'PI', 'AC', 'RS', 'RR', 'RN', 'OP'], dtype=object)
[ ]:
df_aux.CIDADE.value_counts().head(10)
SAO PAULO                17026
RIBEIRAO PRETO            1452
CAMPINAS                  1382
SAO JOSE DO RIO PRETO     1295
PIRACICABA                1002
JUNDIAI                    943
SAO BERNARDO DO CAMPO      932
MARILIA                    809
GUARULHOS                  787
OSASCO                     749
Name: CIDADE, dtype: int64
  • FAIXAETAR: Faixa etária do paciente (char = 5).

    00-09

    10-19

    20-29

    30-39

    40-49

    50-59

    60-69

    70+

[ ]:
df_aux.FAIXAETAR.unique()
array(['10-19', '00-09', '70+', '60-69', '50-59', '40-49', '30-39',
       '20-29'], dtype=object)
  • DRS: Departamentos Regionais de Saúde (char = 200).

    DRS 01 SĂO PAULO

    DRS 15 SĂO JOSÉ DO RIO PRETO

    DRS 06 BAURU

    DRS 07 CAMPINAS

    DRS 09 MARÍLIA

    DRS 13 RIBEIRĂO PRETO

    DRS 10 PIRACICABA

    DRS 17 TAUBATÉ

    DRS 16 SOROCABA

    DRS 05 BARRETOS

    DRS 03 ARARAQUARA

    DRS 02 ARAÇATUBA

    DRS 04 SANTOS

    DRS 14 SĂO JOĂO DA BOA VISTA

    DRS 08 FRANCA

    DRS 11 PRESIDENTE PRUDENTE

    DRS 12 REGISTRO

[ ]:
df_aux.DRS.unique()
array([nan, 'DRS 10  PIRACICABA', 'DRS 01  SÃO PAULO', 'DRS 07  CAMPINAS',
       'DRS 08  FRANCA', 'DRS 03  ARARAQUARA', 'DRS 06  BAURU',
       'DRS 15  SÃO JOSÉ DO RIO PRETO', 'DRS 04  SANTOS',
       'DRS 09  MARÍLIA', 'DRS 11  PRESIDENTE PRUDENTE',
       'DRS 16  SOROCABA', 'DRS 02  ARAÇATUBA', 'DRS 13  RIBEIRÃO PRETO',
       'DRS 05  BARRETOS', 'DRS 17  TAUBATÉ',
       'DRS 14  SÃO JOÃO DA BOA VISTA', 'DRS 12  REGISTRO'], dtype=object)
[ ]:
df_aux.DRS.isna().sum()
4250
  • DESCTOPO: Descrição da Topografia (char = 80).

  • DESCMORFO: Descrição da morfologia (char = 80).

[ ]:
df_aux.DESCTOPO.value_counts().head(10)
RETO SOE                     28308
COLON SIGMOIDE               10445
COLON SOE                     8364
COLON ASCENDENTE              5921
JUNCAO RETOSSIGMOIDIANA       4657
COLON DESCENDENTE             3011
COLON TRANSVERSO              2574
CECO                          2479
COLON ANGULO HEPATICO DO       716
COLON ANGULO ESPLENICO DO      563
Name: DESCTOPO, dtype: int64
[ ]:
df_aux.DESCMORFO.value_counts().head(10)
ADENOCARCINOMA SOE                        38560
ADENOCARCINOMA TUBULAR                    19706
ADENOCARCINOMA MUCINOSO                    2569
ADENOCARCINOMA EM ADENOMA TUBULOVILOSO     1120
ADENOCARCINOMA VILOSO                       642
CARCINOMA SOE                               512
CARCINOMA DE CELULAS EM ANEL DE SINETE      499
ADENOCARCINOMA PRODUTOR DE MUCINA           472
ADENOCARCINOMA IN SITU SOE                  447
CARCINOMA NEUROENDOCRINO SOE                379
Name: DESCMORFO, dtype: int64
  • HABILIT

[ ]:
df_aux.HABILIT.value_counts()
CACON     41391
UNACON    26622
Name: HABILIT, dtype: int64

Categorias com letras e números

  • TOPO: Código da topografia (char = 4). Formato: C999

  • TOPOGRUP: Grupo da topografia (char = 3). Formato: C99

[ ]:
df_aux.TOPO.nunique()
12
[ ]:
df_aux.TOPOGRUP.unique()
array(['C18', 'C20', 'C19'], dtype=object)
  • META01: Metástase (char = 3). Formato: C99

  • META02: Metástase (char = 3). Formato: C99

  • META03: Metástase (char = 3). Formato: C99

  • META04: Metástase (char = 3). Formato: C99

[ ]:
print(df_aux.META01.isna().sum())
print(df_aux.META02.isna().sum())
print(df_aux.META03.isna().sum())
print(df_aux.META04.isna().sum())
50921
62582
66500
67634
  • REC01: Local da recidiva/metástase (char = 3). Formato: C99

  • REC02: Local da recidiva/metástase (char = 3). Formato: C99

  • REC03: Local da recidiva/metástase (char = 3). Formato: C99

  • REC04: Local da recidiva/metástase (char = 3). Formato: C99

[ ]:
print(df_aux.REC01.isna().sum())
print(df_aux.REC02.isna().sum())
print(df_aux.REC03.isna().sum())
print(df_aux.REC04.isna().sum())
59403
65534
67320
68013
  • EC: Estadio clínico (char = 5). [0,IIIB,IA, …]

  • ECGRUP: Grupo do estadiamento clínico (char = 3). [0,I,II,III,IV,Y,X]

[ ]:
np.sort(df_aux.EC.unique())
array(['0', 'I', 'II', 'IIA', 'IIB', 'IIC', 'III', 'IIIA', 'IIIB', 'IIIC',
       'IV', 'IVA', 'IVB', 'IVC', 'X', 'Y'], dtype=object)
[ ]:
np.sort(df_aux.ECGRUP.unique())
array(['0', 'I', 'II', 'III', 'IV', 'X', 'Y'], dtype=object)
[ ]:
df_aux.ECGRUP.value_counts()
III    19576
II     18092
IV     16842
I       8055
X       3639
Y        973
0        836
Name: ECGRUP, dtype: int64
  • T: Classificação TNM - T (char = 5).

  • N: Classificação TNM - N (char = 5).

  • M: Classificação TNM - M (char = 3).

[ ]:
np.sort(df_aux['T'].unique())
array(['0', '1', '1A', '1B', '2', '3', '4', '4A', '4B', 'IS', 'X', 'Y'],
      dtype=object)
[ ]:
np.sort(df_aux['N'].unique())
array(['0', '1', '1A', '1B', '1C', '2', '2A', '2B', 'X', 'Y'],
      dtype=object)
[ ]:
np.sort(df_aux['M'].unique())
array(['0', '1', '1A', '1B', 'X', 'Y'], dtype=object)

Primeiro pré-processamento

[ ]:
df = variables_preprocessing(df_aux)
df.head(3)
ESCOLARI IDADE SEXO IBGE CATEATEND DTCONSULT DIAGPREV DTDIAG EC ECGRUP ... CONSDIAG TRATCONS DIAGTRAT ANODIAG FAIXAETAR DRS RRAS DTRECIDIVA RECNENHUM IBGEATEN
4 4 19 2 3538709 9 2004-06-22 2 2004-06-22 IV IV ... 0 34.0 34.0 2004 10-19 10 14 NaN 1 3538709
6 9 19 1 3537107 2 2006-12-20 2 2006-10-17 IIIA III ... 64 6.0 70.0 2006 10-19 07 15 NaN 1 3509502
7 4 19 1 3516200 9 2007-10-05 2 2007-09-26 IIB II ... 9 6.0 15.0 2007 10-19 08 13 NaN 1 3516200

3 rows × 33 columns

[ ]:
df.shape
(33565, 33)
[ ]:
df.isna().sum().sort_values(ascending=False).head(8)
DTRECIDIVA    28500
DIAGTRAT       1644
TRATCONS       1644
DTTRAT         1644
DTULTINFO         5
ULTINFO           1
OUTROS            0
NENHUMANT         0
dtype: int64
[ ]:
df.columns
Index(['ESCOLARI', 'IDADE', 'SEXO', 'IBGE', 'CATEATEND', 'DTCONSULT',
       'DIAGPREV', 'DTDIAG', 'EC', 'ECGRUP', 'DTTRAT', 'TRATHOSP', 'NENHUM',
       'CIRURGIA', 'RADIO', 'QUIMIO', 'HORMONIO', 'TMO', 'IMUNO', 'OUTROS',
       'NENHUMANT', 'DTULTINFO', 'ULTINFO', 'CONSDIAG', 'TRATCONS', 'DIAGTRAT',
       'ANODIAG', 'FAIXAETAR', 'DRS', 'RRAS', 'DTRECIDIVA', 'RECNENHUM',
       'IBGEATEN'],
      dtype='object')
[ ]:
save_csv(df, '/content/drive/MyDrive/Trabalho/Cancer/Datasets/colorretal_pp.csv')
CSV file saved successfully!

Criação de novas colunas

Nesta seção, novas colunas serão criadas baseadas na diferença em dias das datas e na coluna de última informação.

[ ]:
df = read_csv('/content/drive/MyDrive/Trabalho/Cancer/Datasets/colorretal_pp.csv')
df.head(2)
(33565, 33)
ESCOLARI IDADE SEXO IBGE CATEATEND DTCONSULT DIAGPREV DTDIAG EC ECGRUP ... CONSDIAG TRATCONS DIAGTRAT ANODIAG FAIXAETAR DRS RRAS DTRECIDIVA RECNENHUM IBGEATEN
0 4 19 2 3538709 9 2004-06-22 2 2004-06-22 IV IV ... 0 34.0 34.0 2004 10-19 10 14 NaN 1 3538709
1 9 19 1 3537107 2 2006-12-20 2 2006-10-17 IIIA III ... 64 6.0 70.0 2006 10-19 7 15 NaN 1 3509502

2 rows × 33 columns

[ ]:
# NULL! to NaN
df.loc[df.DTRECIDIVA == '#NULL!', 'DTRECIDIVA'] = np.nan
df.loc[df.DTTRAT == '#NULL!', 'DTTRAT'] = np.nan
df.loc[df.DTULTINFO == '#NULL!', 'DTULTINFO'] = np.nan
[ ]:
# Dates - DTCONSULT, DTDIAG, DTTRAT, DTULTINFO, DTRECIDIVA
lista_datas = ['DTCONSULT', 'DTDIAG', 'DTTRAT', 'DTULTINFO', 'DTRECIDIVA']
df[lista_datas].isna().sum()
DTCONSULT         0
DTDIAG            0
DTTRAT         1644
DTULTINFO         5
DTRECIDIVA    28500
dtype: int64
[ ]:
df[lista_datas].head(10)
DTCONSULT DTDIAG DTTRAT DTULTINFO DTRECIDIVA
0 2004-06-22 2004-06-22 2004-07-26 00:00:00 2018-02-14 00:00:00 NaN
1 2006-12-20 2006-10-17 2006-12-26 00:00:00 2014-04-22 00:00:00 NaN
2 2007-10-05 2007-09-26 2007-10-11 00:00:00 2020-09-11 00:00:00 NaN
3 2015-06-09 2015-06-10 NaN 2015-07-13 00:00:00 NaN
4 2015-02-26 2015-03-20 2015-04-10 00:00:00 2015-08-02 00:00:00 NaN
5 2017-06-22 2017-06-01 2017-08-01 00:00:00 2019-02-14 00:00:00 NaN
6 2021-07-12 2021-06-09 2021-07-12 00:00:00 2021-07-12 00:00:00 NaN
7 2013-08-20 2013-08-20 2013-08-20 00:00:00 2021-02-15 00:00:00 2018-04-18 00:00:00
8 2010-12-28 2010-12-31 2011-01-11 00:00:00 2012-05-05 00:00:00 2012-01-11 00:00:00
9 2010-12-12 2010-12-12 2011-02-17 00:00:00 2011-02-19 00:00:00 NaN

Colunas das diferença de datas

Serão calculadas as diferenças entre as datas de consulta, diagnóstico e tratamento e, a seguir, a diferença entre a data da última informação e as três primeiras.

Este processo será realizado pela função get_dates_diff, que descarta as linhas vazias das colunas DTTRAT e DTULTINFO, converte as colunas de data para o formato datetime e então calcula a diferença entre as datas em dias.

A ideia está apresentada abaixo.

Veja a função completa na seção de funções.

Colunas de datas

  • Consulta - \(t_1\)

  • Diagnóstico - \(t_2\)

  • Tratamento - \(t_3\)

  • Recidiva - \(t_4\)

  • Última informação - \(t_5\)


Diferença, em dias, entre as datas:

\[CONSDIAG = t_2 - t_1\]
\[DIAGTRAT = t_3 - t_2\]
\[TRATCONS = t_3 - t_1\]

Última informação:

\[ULTICONS = t_5 - t_1\]
\[ULTIDIAG = t_5 - t_2\]
\[ULTITRAT = t_5 - t_3\]
[ ]:
dates = ['CONSDIAG', 'DIAGTRAT', 'TRATCONS', 'ULTICONS', 'ULTIDIAG', 'ULTITRAT']
[ ]:
df = get_dates_diff(df, lista_datas)
print(df.shape)
df[dates].head(3)
(31916, 31)
CONSDIAG DIAGTRAT TRATCONS ULTICONS ULTIDIAG ULTITRAT
0 0 34 34 4985 4985 4951
1 -64 70 6 2680 2744 2674
2 -9 15 6 4725 4734 4719
[ ]:
df.head(3)
ESCOLARI IDADE SEXO IBGE CATEATEND DIAGPREV EC ECGRUP TRATHOSP NENHUM ... DIAGTRAT ANODIAG FAIXAETAR DRS RRAS RECNENHUM IBGEATEN ULTICONS ULTIDIAG ULTITRAT
0 4 19 2 3538709 9 2 IV IV I 0 ... 34 2004 10-19 10 14 1 3538709 4985 4985 4951
1 9 19 1 3537107 2 2 IIIA III I 0 ... 70 2006 10-19 7 15 1 3509502 2680 2744 2674
2 4 19 1 3516200 9 2 IIB II F 0 ... 15 2007 10-19 8 13 1 3516200 4725 4734 4719

3 rows × 31 columns

Criação do label de óbito

Nesta seção, rótulos serão criados com base nas informações mais recentes, uma coluna apenas se a pessoa morreu ou não (obito_geral) e outra para morte por câncer (obito_cancer).

Outras três colunas terão a informação de quantos anos após o diagnóstico a pessoa viveu (vivo_ano1, vivo_ano3, vivo_ano5).

Este processo vai ser feito pela função get_labels, disponível na seção das funções.

Labels de óbito

  • Óbito por qualquer razão - obito_geral;

  • Óbito por câncer - obito_cancer;

  • Paciente vivo após um ano - vivo_ano1;

  • Paciente vivo após três anos - vivo_ano3;

  • Paciente vivo após cinco anos - vivo_ano5.

Última informação

1 - Vivo com câncer

2 - Vivo, sem outras informações

3 - Óbito por câncer

4 - Óbitos por outras causas

[ ]:
df.head(2)
ESCOLARI IDADE SEXO IBGE CATEATEND DIAGPREV EC ECGRUP TRATHOSP NENHUM ... DIAGTRAT ANODIAG FAIXAETAR DRS RRAS RECNENHUM IBGEATEN ULTICONS ULTIDIAG ULTITRAT
0 4 19 2 3538709 9 2 IV IV I 0 ... 34 2004 10-19 10 14 1 3538709 4985 4985 4951
1 9 19 1 3537107 2 2 IIIA III I 0 ... 70 2006 10-19 7 15 1 3509502 2680 2744 2674

2 rows × 31 columns

[ ]:
df.ULTINFO.value_counts()
3.0    13136
2.0    10430
1.0     4589
4.0     3761
Name: ULTINFO, dtype: int64
[ ]:
df = get_labels(df)
df.shape
(31916, 36)
[ ]:
columns = ['ULTINFO', 'obito_geral', 'obito_cancer', 'vivo_ano1', 'vivo_ano3', 'vivo_ano5']

df[columns].head(2)
ULTINFO obito_geral obito_cancer vivo_ano1 vivo_ano3 vivo_ano5
0 2.0 0 0 1 1 1
1 3.0 1 1 1 1 1
[ ]:
df[columns][df.obito_geral == 0].head(10)
ULTINFO obito_geral obito_cancer vivo_ano1 vivo_ano3 vivo_ano5
0 2.0 0 0 1 1 1
2 2.0 0 0 1 1 1
5 2.0 0 0 1 0 0
6 1.0 0 0 0 0 0
7 1.0 0 0 1 1 1
21 1.0 0 0 0 0 0
22 1.0 0 0 0 0 0
29 2.0 0 0 1 1 1
31 2.0 0 0 1 1 1
33 2.0 0 0 1 1 1

Inputer escolaridade

Os valores 9 da variável ESCOLARI serão inseridos usando as colunas IDADE, ECGRUP e SEXO.

[ ]:
cols = ['ESCOLARI', 'IDADE', 'ECGRUP', 'SEXO']
df_esc = df[cols].copy()
df_esc.head(3)
ESCOLARI IDADE ECGRUP SEXO
0 4 19 IV 2
1 9 19 III 1
2 4 19 II 1
[ ]:
df_esc.loc[df_esc.ESCOLARI == 9, 'ESCOLARI'] = np.nan
df_esc.loc[df_esc.ECGRUP == 'I', 'ECGRUP'] = 1
df_esc.loc[df_esc.ECGRUP == 'II', 'ECGRUP'] = 2
df_esc.loc[df_esc.ECGRUP == 'III', 'ECGRUP'] = 3
df_esc.loc[df_esc.ECGRUP == 'IV', 'ECGRUP'] = 4
df_esc.ESCOLARI.value_counts(dropna=False)
NaN    9759
2.0    8580
3.0    6041
4.0    4155
5.0    2116
1.0    1265
Name: ESCOLARI, dtype: int64
[ ]:
from sklearn.impute import KNNImputer

X = df_esc.values
imputer = KNNImputer(n_neighbors=5, weights='distance')
df_esc.ESCOLARI = imputer.fit_transform(X)
df_esc.head(3)
ESCOLARI IDADE ECGRUP SEXO
0 4.000000 19 4 2
1 3.546918 19 3 1
2 4.000000 19 2 1
[ ]:
df['ESCOLARI_2'] = df_esc.ESCOLARI.round()
df.ESCOLARI_2.value_counts(dropna=False)
3.0    11666
2.0    11291
4.0     5544
5.0     2122
1.0     1293
Name: ESCOLARI_2, dtype: int64
[ ]:
df.ESCOLARI.value_counts()
9    9759
2    8580
3    6041
4    4155
5    2116
1    1265
Name: ESCOLARI, dtype: int64
[ ]:
save_csv(df, '/content/drive/MyDrive/Trabalho/Cancer/Datasets/colorretal_labels.csv')
CSV file saved successfully!