博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据分析应用实战(一)
阅读量:5049 次
发布时间:2019-06-12

本文共 6533 字,大约阅读时间需要 21 分钟。

Part 1.前言介绍

  • 数据集地址:
  • 数据问题描述与简介:
  • 解决目标问题:
    1. Is the true population mean really 98.6 degrees F?
    2. Is the distribution of temperatures normal?
    3. At what temperature should we consider someone's temperature to be "abnormal"?
    4. Is there a significant difference between males and females in normal temperature?
    5. Is there a relationship between body temperature and heart rate?

Part 2.问题解决

  • Q1: 人体体温的总体均值是否为98.6华氏度
  • A1:通过数据本身的.mean()方法可以得到测试数据集的均值并进行比较
tep_mean = named_df["Temperature"].mean()tep_round = round(tep_mean, 1)
  • Q2: 判断人体温度是否符合正太分布
  • A2:本文采用shapiro_wiki进行判断,由返回的p_value进行判断,若p_value>0.05,则可认为该数据集近似于正态分布
shapiro_stats, shapiro_p_value = stats.shapiro(named_df["Temperature"])
  • Q3:找出体温的异常数据
  • A3:本文采用箱型图的四分位距进行判断,落在设定的上下限以外的即认定为异常数据
percentile = np.percentile(named_df["Temperature"], [0, 25, 50, 75, 100])                               # 利用箱型图的四分位距来对数据进行异常的判断IQR = percentile[3] - percentile[1]up_limit = percentile[3] + IQR * 1.5                                                                    # 上限设定为上四分位+1.5倍IQR(四分位距)距离down_limit = percentile[1] - IQR * 1.5
  • Q4:男女提问正常数据下是否存在明显差异
  • A4:这里通过T检验(先检验方差齐性),在已经提出异常数据的前提下进行检验判断,返回的p_value小于阈值0.05(95%置信度)则可认定为存在明显差异
sorted_df = named_df[(named_df["Temperature"] <= up_limit) & (named_df["Temperature"] >= down_limit)]   # 剔除上回所显示的异常数据males = sorted_df[sorted_df["Gender"] == 1]                                                             # 将原数据进行男女判断分类females = sorted_df[sorted_df["Gender"] == 2]bool_sta,bool_p_value = stats.levene(males["Temperature"],females["Temperature"])equal_v = bool_p_value>0.05t_stats,t_p_value = stats.ttest_ind(males["Temperature"],females["Temperature"],equal_var=equal_v)      # 利用T检验进行两组方差是否相同仍未知的独立数据的比较,equal_v=True则可认为其方差相等
  • Q5:体温与心率间的相关性
  • A5:由上述可知数据符合正态分布,所以可以采用皮尔森相关系数进行判断两者之间的相关性
pearson = sorted_df.corr()temp_and_rate = pearson["Temperature"]["HeartRate"]                                                     # 取人体温度与心率的系数结果if temp_and_rate > 0.8 & temp_and_rate <= 1.0:                                                          # python中不存在switch-case语句    print("人体的温度与心率具有相关性:极强")elif temp_and_rate > 0.6 & temp_and_rate <= 0.8:    print("人体的温度与心率具有相关性:强")elif temp_and_rate > 0.4 & temp_and_rate <= 0.6:    print("人体的温度与心率具有相关性:中等")elif temp_and_rate > 0.2 & temp_and_rate <= 0.4:    print("人体的温度与心率具有相关性:弱")elif temp_and_rate >= 0 & temp_and_rate <= 0.2:    print("人体的温度与心率具有相关性:极弱")

Part 3.完整代码

import pandas as pdimport requests as reqfrom scipy import statsimport numpy as npr = req.get('http://jse.amstat.org/datasets/normtemp.dat.txt')                                          # 利用request爬取指定路径下的数据content = r.text                                                                                        # 获取爬取数据的内容cell_list = []                                                                                          # 建立新列表用于存储处理规整后的数据的元素cells = content.split('\n')                                                                             # 进行相关的数据清洗与切割处理for x in cells:    if (x):        cell_list.append(list(map(lambda y: float(y), x.split())))                                      # 进行一步str转float确保数值可参与后续计算df = pd.DataFrame(cell_list)                                                                            # 将list数据列表转换为DataFramenamed_df = df.rename(columns={0: 'Temperature', 1: 'Gender', 2: 'HeartRate'})                           # 更正列索引名# Q1:Is the true population mean really 98.6 degrees F?tep_mean = named_df["Temperature"].mean()tep_round = round(tep_mean, 1)                                                                          # 取一位小数位if tep_round == 98.6:    print("真正的总体均值确实是98.6华氏度")else:    print("真正的总体均值不是98.6华氏度,真实的总体均温为" + str(tep_round))# Q2:Is the distribution of temperatures normal?shapiro_stats, shapiro_p_value = stats.shapiro(named_df["Temperature"])                                 # shapiro_stats:统计数 shapiro_p_value:测试指标if shapiro_p_value > 0.05:                                                                              # 依据shapiro_wiki测试判断是否近似于正态分布    print("依据shapiro_wiki,该分布近似于正态分布")else:    print("依据shapiro_wiki,该分布无法近似于正态分布")# Q3:At what temperature should we consider someone's temperature to be "abnormal"?percentile = np.percentile(named_df["Temperature"], [0, 25, 50, 75, 100])                               # 利用箱型图的四分位距来对数据进行异常的判断IQR = percentile[3] - percentile[1]up_limit = percentile[3] + IQR * 1.5                                                                    # 上限设定为上四分位+1.5倍IQR(四分位距)距离down_limit = percentile[1] - IQR * 1.5                                                                  # 下限设定为下四分位+1.5倍IQR(四分位距)距离abnormal = named_df[(named_df["Temperature"] > up_limit) | (named_df["Temperature"] < down_limit)]print("依据箱型图测试异常数据为\n", abnormal)# Q4:Is there a significant difference between males and females in normal temperature?sorted_df = named_df[(named_df["Temperature"] <= up_limit) & (named_df["Temperature"] >= down_limit)]   # 剔除上回所显示的异常数据males = sorted_df[sorted_df["Gender"] == 1]                                                             # 将原数据进行男女判断分类females = sorted_df[sorted_df["Gender"] == 2]bool_sta,bool_p_value = stats.levene(males["Temperature"],females["Temperature"])equal_v = bool_p_value>0.05t_stats,t_p_value = stats.ttest_ind(males["Temperature"],females["Temperature"],equal_var=equal_v)      # 利用T检验进行两组方差是否相同仍未知的独立数据的比较,equal_v=True则可认为其方差相等if t_p_value <= 0.05:                                                                                      # 远小于0.05则可认定为两组数据间存在明显差异    print("异性之间在正常温度下存在明显差异")else:    print("异性之间在正常温度下并无明显差异")# Q5:Is there a relationship between body temperature and heart rate?pearson = sorted_df.corr()                                                                                          # 获取各个数据之间的相关性表temp_and_rate = pearson["Temperature"]["HeartRate"]                                                     # 取人体温度与心率的系数结果if 0.8 < temp_and_rate <= 1.0:                                                          # python中不存在switch-case语句    print("人体的温度与心率具有相关性:极强")elif 0.6 < temp_and_rate <= 0.8:    print("人体的温度与心率具有相关性:强")elif 0.4 < temp_and_rate <= 0.6:    print("人体的温度与心率具有相关性:中等")elif 0.2 < temp_and_rate <= 0.4:    print("人体的温度与心率具有相关性:弱")elif 0 <= temp_and_rate <= 0.2:    print("人体的温度与心率具有相关性:极弱")

Part 4.运行结果

真正的总体均值不是98.6华氏度,真实的总体均温为98.2依据shapiro_wiki,该分布近似于正态分布依据箱型图测试异常数据为      Temperature  Gender  HeartRate0           96.3     1.0       70.065          96.4     2.0       69.0129        100.8     2.0       77.0异性之间在正常温度下存在明显差异人体的温度与心率具有相关性:弱

转载于:https://www.cnblogs.com/S031602219/p/11364400.html

你可能感兴趣的文章
关于Redis处理高并发
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
asp.net core 系列 16 Web主机 IWebHostBuilder
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>
Market entry case
查看>>
bzoj1230 开关灯 线段树
查看>>
LinearLayout
查看>>
学习python:day1
查看>>
css3动画属性
查看>>
第九次团队作业-测试报告与用户使用手册
查看>>