数据挖掘学习日记
随着人工智能的不断发展,数据挖掘这门技术也越来越重要,很多人都开启了学习数据挖掘,我所学习的专业也学习这门课程,记录自己学习过程。
一、作业一题目要求
数据库adult.data: https://archive.ics.uci.edu/ml/datasets/Adult
信息: 48842 样本, 14个属性
任务:判断属性education和race是否相关。
计算内容:均值、协方差、列联表、计算期望值、p值、置信度.
二、解决方案
1.数据下载和预处理
点击题目所给的链接进行下载数据,但是需要将数据进行预处理,将adult.data的后缀改为xx.csv,给每一列添加表头即属性。
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')就可