垃圾邮件与工作日之间的相关性

Correlation between spam and weekdays

我正在尝试检查 垃圾邮件与工作日之间是否存在关联

我的 dataframe 如下所示:

  Spam? Day
0   1.0 Saturday
1   1.0 Saturday
3   0.0 Saturday
5   1.0 Saturday
7   0.0 Friday
... ... ...
346 0.0 Friday
348 1.0 Friday
361 0.0 Saturday
383 1.0 Thursday
387 1.0 Friday

其中 1 表示垃圾邮件,0 表示垃圾邮件。

我试过如下

corr = (numpy.corrcoef(df['Spam?'],df['Days']))

我遇到了这个错误:

TypeError: unsupported operand type(s) for /: 'str' and 'int'

您正在使用分类 features/labels。看相关性其实意义不大。

相反,您应该只看直方图:

pd.crosstab(df['day'], df['spam']).plot.bar()

得到这样的东西:

以上将为您提供每个 spam/day 组合的 绝对 计数。您还可以使用 value_counts:

可视化 relative 计数
df.groupby('day')['spam'].value_counts(normalize=True).unstack('spam').plot.bar()

你得到:

将工作日转换为从 0 到 6 的数字,然后 运行 numpy.corrcoef

鉴于您有一个分类变量和一个分类变量,Cramer 的 V 是您应该使用的理想指标 -

import scipy.stats as ss
def cramers_corrected_stat(confusion_matrix):
    """ calculate Cramers V statistic for categorical-categorical association.
        uses correction from Bergsma and Wicher, 
        Journal of the Korean Statistical Society 42 (2013): 323-328
    """
    chi2 = ss.chi2_contingency(confusion_matrix)[0]
    n = confusion_matrix.sum().sum()
    phi2 = chi2/n
    r,k = confusion_matrix.shape
    phi2corr = max(0, phi2 - ((k-1)*(r-1))/(n-1))    
    rcorr = r - ((r-1)**2)/(n-1)
    kcorr = k - ((k-1)**2)/(n-1)
    return np.sqrt(phi2corr / min( (kcorr-1), (rcorr-1)))
cramers_corrected_stat(pd.crosstab(df['Spam?'], df['Day']))