python学生分布_python数据分析之数据分布

转自链接:https://blog.csdn.net/YEPAO01/article/details/99197487

一、查看数据分布趋势

1 importpandas as pd2 importnumpy as np3 importmatplotlib.pyplot as plt4 %matplotlib inline

#读取源数据

df = pd.read_csv('http://jse.amstat.org/datasets/normtemp.dat.txt', header=None, sep='\s+', names = ['体温','性别','心率'])

df.head()

#下载到本地

re = requests.get("http://jse.amstat.org/datasets/normtemp.dat.txt")

re.encoding = "utf-8"

with open("normtemp.dat.txt","w") as f:

f.write(re.text)

df = pd.read_csv("normtemp.dat.txt", header=None, sep="\s+")

df.columns = ['体温','性别','心率']

df.head()

#2 不下载

columns = ['体温','性别','心率']

df = pd.read_csv("http://jse.amstat.org/datasets/normtemp.dat.txt", header=None, sep="\s+")

df.columns = ['体温','性别','心率']

#查看数据基本特征

df.describe()

绘制散点图

#散点图

fig = plt.figure(figsize=(16,5))

df1= df[df["性别"]==1]

df1.shape

plt.scatter(df1.index, df1["体温"], c="r", label="male")

plt.legend()

df2= df[df["性别"]==2]

df2.shape

plt.scatter(df2.index, df2["体温"], c="b", label="female")

plt.legend()

plt.ylabel("tw")

plt.xlabel("x")

plt.grid()

1438959-20191130205933690-209073494.png

柱形图

#柱形图

x = np.arange(0,130,1)

y=df_tw.values

plt.bar(x,y)

1438959-20191130210036828-64880377.png

绘制直方图查看体温分布趋势

df_tw.hist(bins=20,alpha = 0.5) df_tw.plot(kind= 'kde', secondary_y=True)

1438959-20190812002302739-1331612512.png

计算温度个数

#针对温度数据, 计算温度的个数

df_tm01 = df_tm.value_counts() #计数

df_tm01.sort_index(inplace=True) #按照温度排序

print(df_tm01.head())96.3 1

96.4 1

96.7 2

96.8 1

96.9 1Name: 体温, dtype: int64

plt.scatter(df_tm01.index,df_tm01.values)

1438959-20191130210226270-918028318.png

检验是否符合正太

方法1 :scipy.stats.normaltest (a, axis=0)

参数:a - 待检验数据;axis - 可设置为整数或置空,如果设置为 none,则待检验数据被当作单独的数据集来进行检验。该值默认为 0,即从 0 轴开始逐行进行检验。

返回:k2 - s^2 + k^2,s 为 skewtest 返回的 z-score,k 为 kurtosistest 返回的 z-score,即标准化值;p-value - p值

importscipy.stats

scipy.stats.normaltest(df_tm)

NormaltestResult(statistic=2.703801433319236, pvalue=0.2587479863488212)

得到的p值>0.05

方法2 Shapiro-Wilk test

方法:scipy.stats.shapiro(x)

官方文档:SciPy v1.1.0 Reference Guide

参数:x - 待检验数据

返回:W - 统计数;p-value - p值

scipy.stats.shapiro(df_tm.values)

(0.9865770936012268, 0.233174666762352)

得到的p值 0.23 > 0.05, 符合正态分布

方法3: scipy.stats.kstest

方法:scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative =‘two-sided’, mode =‘approx’)

官方文档:SciPy v0.14.0 Reference Guide

参数:rvs - 待检验数据,可以是字符串、数组;

cdf - 需要设置的检验,这里设置为 norm,也就是正态性检验;

alternative - 设置单双尾检验,默认为 two-sided

返回:W - 统计数;p-value - p值

u =df_tm.mean()

std=df_tm.std()

scipy.stats.kstest(df_tm.values,'norm',args=(u,std))

KstestResult(statistic=0.06472685044046644, pvalue=0.6450307317439967)

方法4: Anderson-Darling test

方法:scipy.stats.anderson (x, dist =‘norm’ )

该方法是由 scipy.stats.kstest 改进而来的,可以做正态分布、指数分布、Logistic 分布、Gumbel 分布等多种分布检验。默认参数为 norm,即正态性检验。

官方文档:SciPy v1.1.0 Reference Guide

参数:x - 待检验数据;dist - 设置需要检验的分布类型

返回:statistic - 统计数;critical_values - 评判值;significance_level - 显著性水平

scipy.stats.anderson(df_tm.values,dist="norm")

AndersonResult(statistic=0.5201038826714353, critical_values=array([0.56 , 0.637, 0.765, 0.892, 1.061]), significance_level=array([15. , 10. , 5. , 2.5, 1. ]))

结论:三种检验的pvalue值均大于5%,因此体温值服从正态分布。第四种方法返回的不是pvalue值.

使用箱型图查看是否存在异常值.

#箱型图

df_tm.plot.box(vert=False, grid = True)

1438959-20191130211204910-1962998662.png

查找具体的异常值数据

#上四分位数

q3 = df_tm.quantile(q=0.75)#下四分位数

q1 = df_tm.quantile(q=0.25)#四分位差

iqr = q3-q1print("上四分位数:{}\n下四分位数:{}\n四分位差{}".format(q3,q1,iqr))

df_tm_01= df_tm[(df_tm>q3+1.5*iqr) | (df_tm

上四分位数:98.7下四分位数:97.8四分位差0.9000000000000057异常值:

096.3

65 96.4

129 100.8Name: 体温, dtype: float64

利用python计算两者之间的相关性系数

需要了解统计学三大相关系数: 绝对值越大,相关性越强

pearson

kendall

spearman

相关系数 相关强度

0.8-1.0 极强

0.6-0.8 强

0.4-0.6 中等

0.2-0.4 弱

0.0-0.2 极弱

1438959-20191130211347352-2071430536.png

#相关系数

df["体温"].corr(df["心率"], method='pearson')0.24328483580230698

#spearman 相关系数

df["体温"].corr(df["心率"], method='spearman')0.265460363879611

#kendall 相关系数

df["体温"].corr(df["心率"], method='kendall')0.17673221630037853

df = df[["体温","心率"]]print(df.corr(method='pearson'),"\n")print(df.corr(method='spearman'),"\n")print(df.corr(method='kendall'),"\n")

体温 心率

体温1.000000 0.243285心率0.243285 1.000000体温 心率

体温1.00000 0.26546心率0.26546 1.00000体温 心率

体温1.000000 0.176732心率0.176732 1.000000

fig = plt.figure(figsize=(16,5))

plt.scatter(df.index, df["体温"])

plt.scatter(df.index, df["心率"])

1438959-20191130211504517-1495330934.png

二、python中实现数据分布的方法

参考链接:https://www.cnblogs.com/pinking/p/7898313.html

#二项分布

from scipy.stats importbinom#几何分布

from scipy.stats importgeom#泊松分布

from scipy.stats importpoisson#均匀分布

from scipy.stats importuniform#指数分布

from scipy.stats importexpon#正太分布

from scipy.stats import norm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值