判断属性education和race是否相关。


随着人工智能的不断发展,数据挖掘这门技术也越来越重要,很多人都开启了学习数据挖掘,我所学习的专业也学习这门课程,记录自己学习过程。

一、作业一题目要求

数据库adult.data: https://archive.ics.uci.edu/ml/datasets/Adult
信息: 48842 样本, 14个属性
任务:判断属性education和race是否相关。
计算内容:均值、协方差、列联表、计算期望值、p值、置信度.

二、解决方案

1.数据下载和预处理

点击题目所给的链接进行下载数据,但是需要将数据进行预处理,将adult.data的后缀改为xx.csv,给每一列添加表头即属性。

图1
education和race都是类别属性,则利用它们的频数来计算频率.

2.代码如下:

# 引入包
import pandas as pd 
import numpy as np 
from scipy import stats

# 读取数据
D = pd.read_csv('adult1.csv')

#显示Education这一列中有多少个不同值,且每个不同值有多少个重复即频数,且求出该属性的均值
Ed=D['Education'].value_counts(dropna=False, normalize=True)
Ed1=np.array(Ed)
#所得向量是行向量
pt1=Ed1
#print(pt1.shape)
#转置
p1=Ed1.reshape(-1,1)
#print('Education 的样本均值为:\n',p1)
#print(p1.shape)

#显示Race这一列中有多少个不同值,且每个不同值有多少个重复即频数,且求出该属性的均值
Ra=D['Race'].value_counts(dropna=False, normalize=True)
Ra2=np.array(Ra)
#所得向量是行向量
pt2=Ra2
#转置
p2=Ra2.reshape(-1,1)
#print('Race 的样本均值为:',p2)

#样本均值
u=np.vstack((p1,p2))
print('样本均值为:\n',u)
print('#######################################################')
#print(u.shape)

#X1和X2的联和概率质量函数P12
Crosstab=pd.crosstab(D['Education'],D['Race'],margins=False)
Ct=np.array(Crosstab)
P12=Ct/48842
#print(P12)

#sigama12的计算
sigama12=P12-p1*pt2
#print(sigama12)

#sigama21的计算
sigama21=sigama12.T
#print(sigama21)

#sigama11的计算
P1=np.diag(p1)
sigama11=P1-p1*pt1

#sigama22的计算
P2=np.diag(p2)
sigama22=P2-p2*pt2

sigama1112=np.append(sigama11,sigama12,axis=1)
sigama2122=np.append(sigama21,sigama22,axis=1)

#协方差矩阵
sigama=np.append(sigama1112,sigama2122,axis=0)
print('样本协方差矩阵为:\n',sigama)
print('#######################################################')

#列联表矩阵形式
Crosstab=pd.crosstab(D['Education'],D['Race'],margins=True)
#每一对值出现的观察频数
print('列联表为:\n',Crosstab)
print('#######################################################')
Crosstab_1=pd.crosstab(D['Education'],D['Race'],margins=False)
Ct=np.array(Crosstab_1)
#每一对值出现的观察频率
Ct_1=Ct/48842

#列计数
Ct_row=np.sum(Ct,axis=0)
#行计数
Ct_column=np.sum(Ct,axis=1)

#print(Ct_row)
#print(Ct_column)

Ct_column_T=Ct_column.reshape(-1,1)##16×1
#print(Ct_column_T.shape)
#print(Ct_column_T)

#每一对值的期望出现频率
e=(Ct_column_T*Ct_row)/48842
print('每一对值的期望出现频率为:\n',e)
print('#######################################################')

#计算卡方统计量量化每一对值出现的观察频数与期望频数之间的差异 X_2
X_2=0#初始化X_2
for i in range(0,16):
    for j in range(0,5):
        k=((Ct[i,j]-e[i,j])**2)/e[i,j]
        X_2=X_2+k
print('卡方统计量:',X_2)
print('#######################################################')

#自由度
q=(16-1)*(5-1)
print('自由度:',q)
print('#######################################################')

#计算p值
F=stats.chi2.cdf(X_2,q)
p_value=1-F
print('p值为:',p_value)
print('#######################################################')

##在a的显著性水平下,统计量的临界值
a=0.1#计算出p值为0.0,则取a=0.1>p值
z=F_1=stats.chi2.pdf(1-a,q)
print('在a=0.1的显著性水平下,统计量的临界值:',z)
print('#######################################################')

##置信度
confidence_level=1-a
print('置信度为:',confidence_level)
print('#######################################################')

##假设检验
if p_value<0.1:
    print('拒绝零假设,二者相关')
else:
    print('不拒绝零假设,二者独立')
D = pd.read_csv('adult1.csv') ##我将处理好的adult1.csv 这个表上传到Jupyter主页,如果不上传也想用的话,将其所在地址复制到单引号里面D = pd.read_csv('\D:\XXXX\adult1.csv')就可

三、 总结

第一次接触Anaconda这个软件,一开始以为安装这个软件很快就可以完成,不用花费很多时间,但是!我还是太天真了!安装这个软件花费了我一个下午。第一次学习Python,很多函数还是不知道,所以根据课本的公式,还是要上网查询函数进行运用。我的预处理是不当的,里面有的属性存在空值,进行处理的时候还要进行是否存在空值判断,我直接一上来就计算频率,后面才意识到是否存在空值,碰巧作业需要的两个属性没有空值,所以我就没有重新进行预处理。
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷漠的打工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值