在做数据分析的过程中。我们往往是–理解需求–获取数据–清洗数据–简单描述统计–统计型分析报告;
其实到这里还没完。如果我们还需要深入探索数据的价值,那么,单变量的分布检验–探索变量间的关系–建立关系模型–评估–总结等。
接下来就来看看数据分析的其中重要的一环–探索变量间的关系。
探索变量之间的关系
探索数据变量之间是否存在某种关系/关联。大致步骤有:
- 变量的类型:类别型/数值型
- 可视化给出可能的方向:散点图、箱型图、直方图、…
- 需建立更严格的分析方式:假设检验。假设变量间存在某种函数/逻辑等关联关系,进行检验。
一、准备工具和数据
1.1、工具:我们用python3
通常我们把用于做数据分析的几个库直接先导入,基本是固定导入使用。
import numpy as np #科学计算基础库,多维数组对象ndarray
import pandas as pd #数据处理库,DataFrame(二维数组)
import matplotlib as mpl #画图基础库
import matplotlib.pyplot as plt #最常用的绘图库
from scipy import stats #scipy库的stats模块
mpl.rcParams["font.family"]="SimHei" #使用支持的黑体中文字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负号 "-"
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
# % matplotlib inline #jupyter中用于直接嵌入图表,不用plt.show()
import warnings
warnings.filterwarnings("ignore") #用于排除警告
#用于显示使用库的版本
print("numpy_" + np.__version__)
print("pandas_" + pd.__version__)
print("matplotlib_"+ mpl.__version__)
numpy_1.17.4
pandas_0.23.4
matplotlib_2.2.3
1.2、案例数据
某餐厅顾客消费记录数据作为主要的案例数据。
数据源:https://download.csdn.net/download/weixin_41685388/12144418
'''
某餐厅顾客消费记录.
解释数据结构:
total_bill:消费,tip:小费,sex:服务员性别,
smoker:是否抽烟,day:星期几,time:午餐/晚餐,size:本桌人数
'''
tips = pd.read_csv(r"E:\tips.txt",sep='\t',encoding='utf-8') #导入txt格式数据
display(tips.shape) #样本量
display(tips.sample(5)) #随机抽样5行
(244, 7)
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
96 | 27.28 | 4.00 | Male | Yes | Fri | Dinner | 2 |
230 | 24.01 | 2.00 | Male | Yes | Sat | Dinner | 4 |
17 | 16.29 | 3.71 | Male | No | Sun | Dinner | 3 |
110 | 14.00 | 3.00 | Male | No | Sat | Dinner | 2 |
235 | 10.07 | 1.25 | Male | No | Sat | Dinner | 2 |
二、数据变量与变量间的关系
2.1、类别型数据 ~ 类别型数据间的独立性检验
通用:用卡方检验
小样本:用费舍尔检验(劣势:只能检验2*2)
- 问题1:探索案例数据中服务员性别与星期几的关系?
卡方检验
'''①看变量的类型:类别型/数值型'''
display(tips.sample(3)) #随机抽样3行
statistics = tips[["sex","day"]].describe() #统计
display(statistics)
#两个变量均是类别型数据,统计往往是进行分类汇总,即需要生成交叉表,用pd.crosstab()
count=pd.crosstab(tips.sex, tips.day)
display(count)
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
116 | 29.93 | 5.07 | Male | No | Sun | Dinner | 4 |
146 | 18.64 | 1.36 | Female | No | Thur | Lunch | 3 |
169 | 10.63 | 2.00 | Female | Yes | Sat | Dinner | 2 |
sex | day | |
---|---|---|
count | 244 | 244 |
unique | 2 | 4 |
top | Male | Sat |
freq | 157 | 87 |
day | Fri | Sat | Sun | Thur |
---|---|---|---|---|
sex | ||||
Female | 9 | 28 | 18 | 32 |
Male | 10 | 59 | 58 | 30 |
'''②可视化给出可能的方向'''
count.T.plot(kind='bar')
plt.show()
count=pd.crosstab(tips.sex, tips.day) #构造交叉表
print(stats.chi2_contingency(count,correction=False))
#chi2 卡方检验 contingency列联表 列联表中每个格子数量至少为5
#对性别和星期几进行卡方检验
chi2, p, dof, ex = stats.chi2_contingency(count, correction=False) #卡方检验,p值很小,AB有关
print(p)
#P值很小,拒绝原假设,说明性别与星期几有关系
#独立性检验中,H0:AB无关,H1:AB有关系
(13.22200137240661, 0.004180302092822257, 3, array([[ 6.77459016, 31.0204918 , 27.09836066, 22.10655738],
[12.22540984, 55.9795082 , 48.90163934, 39.89344262]]))
0.004180302092822257
- 问题2:探索服务员性别与顾客是否吸烟是否有关?