实战-用Python分析英国人的肥胖现象

7 篇文章 0 订阅
3 篇文章 0 订阅

英文原文:https://realpython.com/blog/python/analyzing-obesity-in-england-with-python/
译者:birdfly

本文是对这篇文章的再现和拓展.本人最近在学习<利用Python进行数据分析>,于是当练手.原作者是解析XLS文件(就是EXCEL文件),我这里解析的是CSV文件(就是以<,>为分隔符的文件,学习Python的人应该不会陌生. )

环境:
Linux ubuntu 4.4.0-21-generic
Python 2.7.12
numpy, matplotlib, pandas
sublime text3
data files
  • 准备
    导入相关的包
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

再现

  • 2014年的原始数据:

这里写图片描述

  • 用Python读取到一个DataFrame里:
#filedir->文件路径
#skiprows->指定跳过多少行或,某行
#nrows->指定读多少行
#index_col->指定0行作为DataFrame的索引
#thousands->指定数据的千分位分隔符,可能是逗号或者是点号, 如果确实这项将不会完整画出图来,之前卡在这里,一直好奇为什么错了,<利用Python进行数据分析>书中也提到这个.
df = pd.read_csv(filedir, skiprows=37, nrows=12, index_col=0, thousands=',')

在终端里看一下,数据是怎么样的:

>>> print df
         Total  Under 16  16-24  25-34  35-44  45-54  55-64  65-74  \
NaN        NaN       NaN    NaN    NaN    NaN    NaN    NaN    NaN   
2002/03   1275       400     65    136    289    216     94     52   
2003/04   1711       579     67    174    391    273    151     52   
2004/05   2035       547    107    287    487    364    174     36   
2005/06   2564       583     96    341    637    554    258     72   
2006/07   3862       656    184    461   1069    872    459    118   
2007/08   5018       747    228    564   1469   1198    598    157   
2008/09   7988       775    322   1013   2359   2133   1099    221   
2009/10  10571       632    361   1348   3132   3076   1555    378   
2010/11  11574       525    375   1425   3277   3573   1820    456   
2011/12  11736       495    391   1484   3104   3581   2119    468   
2012/13  10957       556    356   1437   2744   3305   1965    495   

         75 and over  Unnamed: 10  Unnamed: 11  
NaN              NaN          NaN          NaN  
2002/03           23          NaN          NaN  
2003/04           24          NaN          NaN  
2004/05           32          NaN          NaN  
2005/06           20          NaN          NaN  
2006/07           43          NaN          NaN  
2007/08           53          NaN          NaN  
2008/09           63          NaN          NaN  
2009/10           87          NaN          NaN  
2010/11          115          NaN          NaN  
2011/12           94          NaN          NaN  
2012/13           99          NaN          NaN  
  • 修整数据
#切片,前者是选行,后者是选列,从上面打印看出第0行和最后两列是不需要的数据,一次剔除
data = df.ix[1:,:-2]

#为我们的行列起个名字,方便画图
data.index.name='Year'
data.columns.name='Kinds'

在终端里看看DataFrame里数据是怎么样的

>>> print data
Kinds    Total  Under 16  16-24  25-34  35-44  45-54  55-64  65-74  \
Year                                                                 
2002/03   1275       400     65    136    289    216     94     52   
2003/04   1711       579     67    174    391    273    151     52   
2004/05   2035       547    107    287    487    364    174     36   
2005/06   2564       583     96    341    637    554    258     72   
2006/07   3862       656    184    461   1069    872    459    118   
2007/08   5018       747    228    564   1469   1198    598    157   
2008/09   7988       775    322   1013   2359   2133   1099    221   
2009/10  10571       632    361   1348   3132   3076   1555    378   
2010/11  11574       525    375   1425   3277   3573   1820    456   
2011/12  11736       495    391   1484   3104   3581   2119    468   
2012/13  10957       556    356   1437   2744   3305   1965    495   

Kinds    75 and over  
Year                  
2002/03           23  
2003/04           24  
2004/05           32  
2005/06           20  
2006/07           43  
2007/08           53  
2008/09           63  
2009/10           87  
2010/11          115  
2011/12           94  
2012/13           99  
  • 画个图看看,原作者也画图了
    不会画?贼简单…
new_data.plot()
plt.show()
plt.close()#记得关掉

14年英国人肥胖情况带Total
的确,Total占了半壁江山T_T.把Total剔除.

new_data = data.drop('Total',axis=1)#沿列

14年英国人肥胖情况

  • Under 16 和34-45

着重分析与对比这两个年龄段的人
这里写图片描述

  • 数据分析了

Curve Fitting尝试通过图表上的点来拟合曲线。生成的图像可能准确,也可能不准确,这取决于数据的准确性。

Polynomial Interpolation(多项式插值)一旦有了公式,你可以利用Polynomial Interpolation在图表中插入任何值。

#Y轴数值,这里是***Under 16***不同时期的肥胖个数
kids = data['Under 16'].values#numpy.ndarray

#X轴数值,即不同时期
x_axis = range(len(kids))#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#复杂度.曲线拟合时使用不同的多项式复杂度。简单来说,就是复杂度越高,绘出的曲线越精确,不过也有可能导致图表废掉
poly_degree=3
#曲线拟合
curve_fit = np.polyfit(x_axis, kids, poly_degree)
poly_interp = np.poly1d(curve_fit)
#提取***x_axis***个拟合的数值
poly_fit_values = []
for i in x_axis:
    poly_fit_values.append(poly_interp(i))

#指定X轴,Y轴, 颜色,标签
plt.plot(x_axis, poly_fit_values, '-r', label='Fitted')
plt.plot(x_axis, kids, '-b', label='Orig')
plt.legend(loc='upper right')
plt.show()
plt.close()

看看效果:
这里写图片描述
复杂度为5,被设定读取拟合x_axis+5个数据,即预测五年后的情况.
这里写图片描述

只能说It works perfect!
- 作者的观点很棒

上面两个走势线确实是一种趋势,不是bug。在一些政治辩论中,你一定听说过这样的情况,面对同样的数据争论双方得到的却是完全相反的结论。现在你明白怎样通过调整一个小参数来得出截然相反的结论了吧。

这也就是为什么对于从别人那里得到的数据和图表,我们要格外留意分辨真假,尤其是当他们不愿意分享原始数据的时候。有的时候,不妨把预测留给算命先生去。




拓展

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值