垃圾邮件与工作日之间的相关性
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']))
我正在尝试检查 垃圾邮件与工作日之间是否存在关联 。
我的 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
:
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']))