实战-用Python分析英国人的肥胖现象
来源:互联网 发布:心火怎甘扬汤止沸 知乎 编辑:程序博客网 时间:2024/04/29 15:43
英文原文: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 pdimport matplotlib.pyplot as pltimport 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 dataKinds 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()#记得关掉
的确,Total占了半壁江山T_T.把Total剔除.
new_data = data.drop('Total',axis=1)#沿列
- 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 0
- 实战-用Python分析英国人的肥胖现象
- 英国人的迷信
- 英国人最喜欢的座右铭
- 英国人的“大吵大闹”
- 英国人最常用的密码
- 一次挂起现象的分析
- Python中奇怪的现象
- 多鼠标的资料少到英国人用Google翻译我的文章看-_-!
- 西班牙人理论和英国人理论的管理
- 避免肥胖的十五条法则
- 分析:Handler的奇怪现象,<%@加不上
- 分析oracle主键的跳号现象
- win8的DPC_WATCHDOG_VIOLATION蓝屏,现象与分析
- 关于UITableView的一个崩溃现象分析
- python中all()的“奇怪”现象
- python爬虫实战:分析豆瓣中最新电影的影评
- Python 爬虫实战:分析豆瓣中最新电影的影评
- python实战(1):简单的数据采集与分析
- 极限编程对于简单设计的四条规则
- Chrome插件开发——本地天气
- Mybatis动态插入数据(使用trim标签)
- Glide优势与特点
- 知识点(面试)
- 实战-用Python分析英国人的肥胖现象
- 【BZOJ 3251】树上三角形 暴力
- C语言堆栈入门——堆和栈的区别
- android studio 各种令人费解的问题
- JAVA值传递
- Redis启动报错
- java的值传递和引用传递
- [project X]tiny210 操作说明(合入到主基线的版本)
- 搜索之散列法建立简易字典