python大数据分析练习题

2017-02-24 11:39:10 qq_16633405 阅读数 7136

在下载了pycharm软件以及通过前两篇文章,配置了相应的模块包之后,那就开始对常用的模块的学习,以便后期利用这些模块对数据做模型化处理。

 

如果你已经决定把Python作为你的编程语言,那么,你脑海中的下一个问题会是:“进行数据分析有哪些Python库可用?”

Python有很多库可用来进行数据分析。但不必担心,你不需要学习所有那些可用库。你只须了解5个Python库,就可以完成绝大多数数据分析任务。下面逐一简单介绍这5个库,并提供你一些最好的教程来学习它们。

1.Numpy
对于科学计算,它是Python创建的所有更高层工具的基础。以下是它提供的一些功能:
1. N维数组,一种快速、高效使用内存的多维数组,它提供矢量化数学运算 。
2. 你可以不需要使用循环,就对整个数组内的数据行标准数学运算。
3. 非常便于传送数据到用低级语言(如C或C++)编写的外部库,也便于外部库以Numpy数组形式返回数据。
NumPy不提供高级数据分析功能,但有了对NumPy数组和面向数组的计算的理解,能帮助你更有效地使用像Pandas之类的工具。
教程:
1. Scipy.org提供了Numpy库的简要说明


http://scipy.org/

 

2. 这个教程棒极了,完全注重于Numpy的可用性

 

2.Scipy
Scipy库依赖于NumPy,它提供便捷和快速的N维向量数组操作。SciPy库的建立就是和NumPy数组一起工作,并提供许多对用户友好的和有效的数值例程,如:数值积分和优化。SciPy提供模块用于优化、线性代数、积分以及其它数据科学中的通用任务。
教程:
我找不到比Scipy.org更好的教程了,它学习Scipy的最佳教程


3.Pandas
Pandas包含高级数据结构,以及和让数据分析变得快速、简单的工具。它建立在NumPy之上,使以NumPy为中心的应用变得简单。
1. 带有坐标轴的数据结构,支持自动或明确的数据对齐。这能防止由于数据没有对齐,以及处理不同来源的、采用不同索引的数据而产生的常见错误。
2. 使用Pandas更容易处理缺失数据。
3. 合并流行数据库(如:基于SQL的数据库)中能找到 的关系操作。
Pandas是进行数据清洗/整理(data munging)的最好工具。


教程:
1. Pandas快速入门
2. Alfred Essa有一系列关于Pandas的视频,这些视频应该会让你很好地了解基本概念。
http://alfredessa.com/data-analysis-tutorial/2-pandas-library/

3. 还有,不可错过Shane Neeley提供的教程视频,它全面介绍了Numpy, Scipy和Matplotlib

 

Matplotlib
Matlplotlib是Python的一个可视化模块。它让你方便地制作线条图、饼图、柱状图以及其它专业图形。使用Matplotlib,你可以定制所做图表的任一方面。在IPython中使用时,Matplotlib有一些互动功能,如:缩放和平移。它支持所有的操作系统下不同的GUI后端(back ends),并且可以将图形输出为常见地矢量图和图形格式,如:PDF、SVG、JPG、PNG、BMP和GIF等。
教程:


1. ShowMeDo网站上有一个关于很好地教程


2. 推荐这本书Packt出版社的操作宝典,对于初学者来说,这本书真是极棒的~

 

5.Scikit-learn
Scikit-learn是一个用于机器学习的Python模块。它建立在Scipy之上,提供了一套常用机器学习算法,让使用者通过一个统一的接口来使用。Scikit-learn有助于你迅速地在你的数据集上实现流行的算法。
看一下Scikit-learn中提供的算法列表,你就会马上意识到它包含了许多用于标准机器学习任务的工具,如:聚类、分类和回归等。

教程:
1. Scikit-learn入门

 

2. 来自于Scikit-learn.org的教程

结束语:还有其它一些库,如:用于自然语言处理的Nltk,用于网站数据抓取的Scrappy ,用于网络挖掘的Pattern ,用于深度学习的Theano等。

但是,如果你正开始学习Python,我建议你首先熟悉这5个库。
我说过,这些教程都非常适合初学者。不过,在学习这些教程前,先要熟悉Python语言的基本编程知识。

 

 

 

2018-09-09 12:54:58 oikinkl 阅读数 4142

1. 生成任意多个随机数,并升序排列

代码如下:

# _*_ coding:utf-8 _*_
import random

s = set([])
for i in range(int(raw_input())):
    s.add(random.randint(1, 1000))
print sorted(s)

结果如下:

2. 统计重复单词的次数:

此处认为单词之间以空格为分隔符,并且不包含,和.

1. 用户输入一个英文句子

2. 打印出每个单词及其重复的次数

例如:

输入:hello java hello python

输出:hello 2

            java 1

            python 1

代码如下:

# _*_ coding:utf-8 _*_
words_dict = {}
sentence = raw_input()
words_list = sentence.split(' ')
# print words_list

for num in words_list:
    count = words_list.count(num)
    words_dict[num] = count

managed_list = sorted(words_dict.items())
# print managed_list

for i in range(len(managed_list)):
    print managed_list[i][0], managed_list[i][1]

结果如下:

3. 数字重复统计

1. 随机生成1000个整数

2. 数字的范围[20,100]

3. 升序输出所有的不同的数字及其每个数字重复的次数

代码如下:

# _*_ coding:utf-8 _*_
import random

check_list = [random.randint(20, 100) for i in range(1000)]
result_dict = {}

for num in check_list:
    count = check_list.count(num)
    result_dict[num] = count

processed_list = sorted(result_dict.items())
print '升序输出的结果如下:'
for i in range(len(result_dict)):
    print processed_list[i][0],

print ''
for i in range(len(result_dict)):
    print processed_list[i][0], '重复的次数:', processed_list[i][1]

结果如下(部分结果截图):

4. 列表的练习

代码如下:

# _*_ coding:utf-8 _*_
names = ['fentiao', 'fendai', 'fensi', 'apple']
print 'I have %s, %s, %s and %s' % (names[0], names[1], names[2], names[-1])
print 'I have ' + ', '.join(names[:-1]) + ' and ' + names[-1]

结果如下(两个print得到的结果是一样的,但是第一个有明显的缺陷,如果列表元素过多,

每一个都要写出来太麻烦,第二个方法是对列表操作的理解,明显简单,且可以操作任意元素的列表。):

5. 列表的练习—实现一个简单的用户管理系统

代码如下:

# _*_ coding:utf-8 _*_
users = ['root', 'westos']
passwds = ['123', '456']
for i in range(3):
    name = raw_input('请输入用户名:')
    passwd = raw_input('请输入用户密码:')
    if name in users:
        count = users.index(name)
        if passwd == passwds[count]:
            print '登陆成功'
            break
        else:
            print '密码错误登陆失败,还有%d次机会,请重新登陆' % (2 - i)
    else:
        print '用户名不存在,还有%d次机会,请重新登陆' % (2 - i)
else:
    print '三次登陆机会用完'

结果如下:

6.列表练习—用户管理系统2.0

  • 后台管理员只有一个 用户:admin 密码:admin
  • 当管理员登陆成功后,才可以管理信息
  • 管理用户信息包含:

           添加用户信息

           删除用户信息

           查看用户信息

           退出

代码如下:

# 系统中以存用户信息
users = ['root', 'westos']
passwds = ['123', '456']

print '管理员登陆:'.center(50, '*')
user = raw_input('用户名:')
passwd = raw_input('密码:')
if user == 'admin' and passwd == 'admin':
    print '管理员登陆成功'
    print '管理信息'.center(50, '*')
    while True:
        print """
            1 -添加用户信息
            2 -删除用户信息
            3 -查看用户信息
            4 -退出
            """
        choice = raw_input('请输入要进行的操作:')
        if choice == '1':
            adduser = raw_input('请输入要添加的用户名:')
            if adduser in users:
                print '用户已经存在'
            else:
                passwd = raw_input('请输入用户密码:')
                users.append(adduser)
                passwds.append(passwd)
                print '用户%s添加成功' % adduser
        elif choice == '2':
            deluser = raw_input('请输入要删除的用户名:')
            if deluser in users:
                tmp = users.index(deluser)
                users.remove(deluser)
                passwds.pop(tmp)
                print '用户%s已经删除' % deluser
            else:
                print '用户不存在'
        elif choice == '3':
            print '用户信息如下:'
            print '\t用户名\t密码'
            userCount = len(users)
            for i in range(userCount):
                print '\t%s\t%s' % (users[i], passwds[i])
        elif choice == '4':
            print '感谢使用,再见'
            exit()
        else:
            print '请输入正确的选择:'
else:
    print '管理员登陆失败'

结果如下:

 

2017-06-28 15:09:32 u012063773 阅读数 73874

作为一个学习用Python进行数据分析的新手来说,通过本文来记录分享一些我在用Python中的pandas、numpy来分析Excel表中数据的数据清洗和整理的工作,目的是熟悉numpy以及pandas基础操作,所有操作利用Excel均可以方便实现。备注:本文中使用的是ipython完成的编辑



数据来源及结构

  本文所分析的数据是通过爬虫抓取的微博数据。选取新浪微博为数据平台,选取我国34个省的旅游政务官方微博为研究对象,利用爬虫软件Gooseeker爬取微博信息,包括用户名、粉丝数、开博日期、当月原创微博总数No、当月总微博数N、单条博文的转发数、单条博文的评论数、条博文的点赞数。

  爬取的数据表格 test.xlsx 包括以下几个sheet中,基本表结构见下

  


1、All(所有博文):所有字段见下:其中有用字段是‘用户名、微博内容、时间、转发数、评论数、点赞数’,共有6585条数据(备注:转发数中的缺失值为“转发”,评论数中的缺失值为“评论”,点赞数中的缺失值为“赞”):



2、sf(各省信息表,此表中:省份名完整



3、sfwibo (此表记录的是各个微博账号对应的省份名,省份名不完整,已知各个省份名只有前两个字完整)



 4、base_info2(爬取的微博账户的相关信息)(备注:此处的“昵称”与sfweibo中的“微博用户名”等同)



 

 


  本文思路:

Step1:对于All表:1)取出有用字段。2)处理缺失值。3)数据透视

Step2:对于sf 和sfweibo 表:1)以省份名做数据连接成sf_sfweibo。2)并与All表做数据连接sf_sfweibo_All。

Step3:对于base_info表:1)与sf_sfweibo_All做数据连接 2)计算h值 3)处理数据4)计算相关性

Step4:导出最后结果到一个Excel文件中,完成数据处理。、

 

 


 数据处理过程:

step1 :



# -*- coding=utf-8 -*-

导入需要的包

 

from__future__import division

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from numpy.randomimport randn

from pandasimport Series, DataFrame

from datetimeimport datetime

import xlrd, openpyxl

 

xlsx_file = pd.ExcelFile('test1.xlsx')

All = xlsx_file.parse('All')

 1)取出有用字段

# 删掉表格中的无用列,保留有用列

d1 = All.drop(All.columns[:11], axis=1, inplace = False)

All = d1.drop(d1.columns[-1], axis=1, inplace = False)

 

# 显示表格前五行

All.head()


# 查看去重未处理前表中记录长度

len(All)

 

# 获取到重复的行的行号的前20

All[All.duplicated()==True].index[:20]

 

# 删除掉重复的行,在原值上直接修改

All.drop_duplicates(inplace=True)

len(All)#通过运行结果,可以发现确实删掉了,当前记录条数为6159

 

2)处理缺失值

# 处理缺失值,先获取该列,将列中的"转发"评论"""替换掉

# 为什么不在读取表格的时候直接设置呢?因为如果一开始就设置替换,会导致整张表中的"转发"评论"""均会被替换掉,造成信息损失

All[u'转发数'][All[u'转发数']==u'转发'] = '0'

All[u'评论数'][All[u'评论数']==u'评论'] = '0'

All[u'点赞数'][All[u'点赞数']==u''] = '0' #等价于# All[u'点赞数'].replace(u'','0')

 

All.head()


3)数据透视

All.describe()


备注:出现这个结果说明了数据类型不是数值型

#查看表中各个列的数据类型

All.dtypes

 

# 为了能进行数据透视,需要将对应列的数据类型转换成数值型

# DataFrame表中的某列数据进行转换类型

All[u'转发数']=All[u'转发数'].astype('int64')

All[u'评论数'] = All[u'评论数'].astype('int64')

All[u'点赞数'] = All[u'点赞数'].astype('int64')

All.describe()

 

# 查看表中各个列的数据类型

All.dtypes

 

#将预处理过的表保存到All.xlsx

All.to_excel('All.xlsx',index=False)

 

# 数据透视表

All_pivot= All.pivot_table(values=[u'转发数',u'评论数',u'点赞数',u'微博内容'],index=[u'用户名'],\

                         aggfunc={u'转发数':np.sum,u'评论数':np.sum,u'点赞数':np.sum,u'微博内容':np.size})

# 给该列换名称

All_pivot.rename(columns={u'微博内容':u'当月总微博数'},inplace=True)

All_pivot

 

# 将完成的透视表保存

All_pivot.to_excel('All_pivot.xlsx')

 step2

1)以省份名做数据连接成sf_sfweibo

# 读取test1.xlsx 中的sf

sf = xlsx_file.parse('sf')

sf.head()

 

#读取test1.xlsx中的sfweibo

sfweibo = xlsx_file.parse('sfweibo')

sfweibo.head()


# 通过上面的表格输出可以看出,要想将sfsfweibo进行连接,需要对sf以及sf微博中的省份名

# 但是,由于sfweibo 中的省份名是不完整的,已知名称中肯定包含省份中的前两个字,为此,需要对两个表格切割后,进行连接

sf[u'省份前两字'] = np.nan

for iin range(len(sf[u'省份名'])):

    sf[u'省份前两字'][i] = sf[u'省份名'][i][:2]

 

sfweibo[u'省份前两字'] = np.nan

for iin range(len(sfweibo[u'省份名'])):

    sfweibo[u'省份前两字'][i] = sfweibo[u'省份名'][i][:2]

 

# 显示表格的前五行

sf.head()

 

# 显示表格的前五行

sfweibo.head()

 

# 保存数据

sf.to_excel('sf.xlsx',index=False)

sfweibo.to_excel('sfweibo.xlsx',index=False)

 

# 连接两表

sf_sfweibo = sf.merge(sfweibo,on=u'省份前两字')

sf_sfweibo.head()

 

# 获取连接后表格中需要的字段名,并重新排列

sf_sfweibo1 = sf_sfweibo.iloc[:,[4,1,2]]

sf_sfweibo1.head()

 

# 存储连接后的表

sf_sfweibo1.to_excel('sf_sfweibo.xlsx',index=False)

 2)并与All表做数据连接sf_sfweibo_All

#连接sf_sfweiboAll_pivot两表

sf_sfweibo = sf_sfweibo1

sf_sfweibo_All_pivot =pd.merge(sf_sfweibo,All_pivot,left_on=u'微博用户名',right_on=u'用户名',right_index=True)

#显示连接后的表格的前五行
sf_sfweibo_All_pivot.head()

 

# 将连接后的表进行存储

sf_sfweibo_All_pivot.to_excel('sf_sfweibo_All_pivot.xlsx',index=False)

 step3:

1)与sf_sfweibo_All做数据连接 

# 处理爬取的用户的基本信息表base_info

base = xlsx_file.parse('base_info')

base.head()

 

#base表与sf_sfweibo_All_pivot进行连接

sf_sfweibo_All_pivot_base = base.merge(sf_sfweibo_All_pivot,left_on=u'昵称',right_on=u'微博用户名')

ssapb = sf_sfweibo_All_pivot_base # 名称太长,换个名称

 

ssapb.head()

 

# 替换某列的名字

ssapb.rename(columns={u'当月总微博数_x':u'当月总微博数'},inplace=True)

 

# 删除其中的多余列

ssapb = ssapb.drop([u'昵称',u'当月总微博数_y'],axis=1)

 

# 读取第一行的数

ssapb.iloc[0]

 

 

# 添加一列(当月原创数= 当月总微博数-当月转发数)

ssapb[u'当月原创数'] = ssapb[u'当月总微博数']-ssapb[u'当月转发数']

 

#将某列同时与某段字符串连接,通过观察网页可以发现这是网址的特点

linkfix = "?is_ori=1&is_forward=1&is_text=1&is_pic=1&is_video=1&is_music=1&is_\

article=1&key_word=&start_time=2017-05-01&end_time=2017-05-31&is_search=1&is_searchadv=1#_0"

ssapb[u'当月博文网址'] = ssapb[u'主页链接']+linkfix

 

allfix = "?profile_ftype=1&is_all=1#_0"

ssapb[u'全部博文网址'] = ssapb[u'主页链接']+allfix

 

#计算出篇均转发/点赞/评论,并添加列

ssapb[u'篇均点赞'] = ssapb[u'点赞数']/ssapb[u'当月总微博数']

ssapb[u'篇均转发'] = ssapb[u'转发数']/ssapb[u'当月总微博数']

ssapb[u'篇均评论'] = ssapb[u'评论数']/ssapb[u'当月总微博数']

 

# 读取表中的第一行数据

ssapb.iloc[0]

 


# 存储表格

ssapb.to_excel('ssapb.xlsx',index=False)


  2)计算h值 

# All表分组,获取表格的index

gb = All.groupby(u'用户名')

gb1 = gb.size()

gbindex = gb1.index

print gbindex,gb1

 


#根据h指数的定义,分别计算转发/评论/点赞h指数

# 再记录下每个用户名的最大互动度max(转发+评论+点赞)

 

sortAllf = All.sort_values(by=[u'用户名',u'转发数'],ascending=[True,False])

sortAllc = All.sort_values(by=[u'用户名',u'评论数'],ascending=[True,False])

sortAlll = All.sort_values(by=[u'用户名',u'点赞数'],ascending=[True,False])

mm = (sortAllf,sortAllc,sortAlll)

 

# 将计算得到的结果重新存储到一个新的DataFrame

All_h =pd.DataFrame(np.arange(136).reshape(34,4),columns=['fh','ch','lh','max_hdd'],index=gbindex)

fh=[]

ch=[]

lh=[]

max_hdd = []

for jin range(len(mm)):

    for iin gbindex:

        tempdf =mm[j][mm[j][u'用户名']==i]

        tempdf['hdd'] = tempdf[u'转发数']+tempdf[u'评论数']+tempdf[u'点赞数']

       max_hdd.append(tempdf['hdd'].max())

        tempdf['numf'] = range(len(tempdf))

        if  j==0:

            a =len(tempdf[tempdf[u'转发数']>=tempdf['numf']+1])

           fh.append(a)

        elif  j==1:

            b =len(tempdf[tempdf[u'评论数']>=tempdf['numf']+1])

           ch.append(b)

        else:

            c = len(tempdf[tempdf[u'点赞数']>=tempdf['numf']+1])

           lh.append(c)

 

      

All_h['fh']=fh

All_h['ch']=ch

All_h['lh']=lh

 

# 因为,前面的循环一共循环了三遍,使得All_h重复了3遍,因此只要获取前34位即可

All_h['max_hdd']=max_hdd[:34]

 

# 插入一个综合h指数,该指数是转发/评论/点赞h指数三个的均值

All_h.insert(3,'HS',All_h.iloc[:,:3].mean(1))

#更改列名称

All_h.rename(columns={'fh':u'转发h指数','ch':u'评论h指数',\

                   'lh':u'点赞h指数','HS':u'综合h指数','max_hdd':u'单篇最大互动度'},inplace=True)

All_h.head()

 

#连接ssapbAll_h表格

ssapb_All_h= pd.merge(ssapb, All_h, left_on=u'微博用户名',right_on=u'用户名',right_index=True)

 

#加一列原创率

ssapb_All_h[u'原创率'] = ssapb_All_h[u'当月原创数']/ssapb_All_h[u'当月总微博数']

 

ssapb_All_h.iloc[0]

 

# 存档

ssapb_All_h.to_excel('ssapb_All_h.xlsx',index=False)


3)计算相关性

# 获取原DataFrame中的几列存储到新的DataFrame中,计算综合h指数与其他分指数之间的相关性

f1 = ssapb_All_h.loc[:,[u'综合h指数',u'转发h指数',u'评论h指数',u'点赞h指数']]

# 计算f1中各列数据的相关性

corr1 = f1.corr()

# 将该相关性结果存档

corr1.to_excel('corr1.xlsx')

 

corr1

 

# 获取原DataFrame中的几列存储到新的DataFrame中,计算综合h指数与其他微博信息之间的相关性

f2 = ssapb_All_h.loc[:,[u'综合h指数',u'转发数',u'评论数',u'点赞数',u'篇均转发',u'篇均评论',u'篇均点赞']]

corr2 = f2.corr()

corr2.to_excel('corr2.xlsx')


corr2

 

# 获取原DataFrame中的几列存储到新的DataFrame中,计算综合h指数与其他信息之间的相关性

f3 = ssapb_All_h.loc[:,[u'综合h指数',u'原创率',u'粉丝数',u'微博总数',u'单篇最大互动度']]

corr3 = f3.corr()

corr3.to_excel('corr3.xlsx')

corr3

 

# 重新排序列

aa =ssapb_All_h.iloc[:,[8,9,10,5,15,16,0,1,2,3,4,6,14,7,11,12,13,24,20,21,22,23,17,18,19,25]]


aa.to_excel('finally.xlsx')

aa.iloc[0]

 

 4)处理数据,处理浮点位数/转成百分位数

# 将表中的浮点类型保留至小数点后四为

f = lambda x:'%.4f' % x

aa.ix[:,21:] = aa.ix[:,21:].applymap(f)

aa.ix[:,21:] = aa.ix[:,21:].astype('float64')

 

aa.iloc[0]

 

# 将原创率转成百分比形式

f1 = lambda x :'%.2f%%' %  (x*100)

aa[[u'原创率']]= aa[[u'原创率']].applymap(f1)


aa.to_excel('finally1.xlsx',index=False)

aa.iloc[0]

 

aa.sort_values(by=u'综合h指数', ascending=False, inplace=True)

# 按照综合h指数降序排序,添加一个排序位数

aa['rank'] =np.arange(34)+1

 

# 要想得到综合h指数/排名"的列,需要将aa['rank']aa[u'综合h指数']进行合并成一列,这就要求必须连接字符串类型

aa['rank'] = aa['rank'].astype('string_')

aa[u'综合h指数'] = aa[u'综合h指数'].astype('string_')

 

# 连接成一列

aa[u'综合h指数/排名'] = aa[u'综合h指数']+'/'+ aa['rank']

 

aa.iloc[0]

 

step4

1)存储最终数据

# 删除掉一列rank

del aa['rank']

# 将该数据类型换回来,换成浮点型

aa[u'综合h指数'] = aa[u'综合h指数'].astype('float64')

aa.to_excel('finally2.xlsx',index=False)




 结语:


至此,本次分析操作过程已全部结束,希望这些操作可以新手有一定的参考帮助

应亲们的需求,该链接是本文的原数据表,https://github.com/clover95/DataAnalysisbyPython/tree/master/weibo


2018-06-09 21:11:41 qq_36184813 阅读数 1785

本次作业是emu193课程ipython的教程课后作业,原地址请见:

https://nbviewer.jupyter.org/github/schmit/cme193-ipython-notebooks-lecture/blob/master/Exercises.ipynb

一.IPython的使用

ipython是一个很好用的网页python编辑、终端集成插件。使用它,可以很方便地进行代码的编写与运行。在我这次的作业中,我感受到它最大的便利是

    1.可以直接在网页上输出运行的结果,如图片、表格等,比普通的python的终端更简洁、易读。

    2.可以对同一行代码很方便地进行多次修改与运行,避免了在普通终端中每行代码只能使用一次的麻烦。

ipython中代码的运行方式很简单,只用按住shift+Enter就可以运行当前文本框里的代码了。这次作业,我都将使用ipython来完成。




二.作业题目

本次作业是在一个很著名的教学数据集Anscombe上面进行的(在文章开头链接中,找到data文件夹就可以下载)。该数据集因为其可视化后的特殊效果而广为使用。

有什么特殊效果呢?我们在题目中去寻找吧。

Part 1

For each of the four datasets...

  • Compute the mean and variance of both x and y
  • Compute the correlation coefficient between x and y
  • Compute the linear regression line: y=β0+β1x+ϵy=β0+β1x+ϵ (hint: use statsmodels and look at the Statsmodels notebook)


第一部分,让我们计算几个数据集中x、y的一些统计特征。最后,我们要通过x和y的关系拟合出一个线性方程出来。

我们可以直接使用三个数据分析库完成这三个工作:

    1、使用pandas来读取csv文件,并对表格的各项进行分类、统计。

    2、使用statsmodels来进行曲线的拟合,在数据集上进行训练和测试。

    代码如下:

import numpy as np
import scipy as sp
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

import statsmodels.api as sm
import statsmodels.formula.api as smf

#分数据集输出x和y的均值
print('The mean of x and y:')
print(anascombe.groupby(['dataset'])[['x', 'y']].mean())

#分数据集输出x和y的方差
print('\nThe varience of x and y:')
print(anascombe.groupby(['dataset'])[['x', 'y']].var())

#分数据集输出x和y的关联系数
print('\nThe correlation coefficient between x and y:')
print(anascombe.groupby(['dataset'])[['x', 'y']].corr());

#对每一个数据集学习一个拟合曲线出来
datasets = ['I', 'II', 'III', 'IV']
for dataset in datasets:
    lin_model = smf.ols('y ~ x', anascombe[anascombe['dataset'] == dataset]).fit()
    print('\nThe linear model for dataset', dataset)
    print(lin_model.summary())

print('\n')

输出结果如下:

The mean of x and y:
           x         y
dataset               
I        9.0  7.500909
II       9.0  7.500909
III      9.0  7.500000
IV       9.0  7.500909

The varience of x and y:
            x         y
dataset                
I        11.0  4.127269
II       11.0  4.127629
III      11.0  4.122620
IV       11.0  4.123249

The correlation coefficient between x and y:
                  x         y
dataset                      
I       x  1.000000  0.816421
        y  0.816421  1.000000
II      x  1.000000  0.816237
        y  0.816237  1.000000
III     x  1.000000  0.816287
        y  0.816287  1.000000
IV      x  1.000000  0.816521
        y  0.816521  1.000000

The linear model for dataset I
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.667
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.99
Date:                Sat, 09 Jun 2018   Prob (F-statistic):            0.00217
Time:                        20:38:34   Log-Likelihood:                -16.841
No. Observations:                  11   AIC:                             37.68
Df Residuals:                       9   BIC:                             38.48
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0001      1.125      2.667      0.026       0.456       5.544
x              0.5001      0.118      4.241      0.002       0.233       0.767
==============================================================================
Omnibus:                        0.082   Durbin-Watson:                   3.212
Prob(Omnibus):                  0.960   Jarque-Bera (JB):                0.289
Skew:                          -0.122   Prob(JB):                        0.865
Kurtosis:                       2.244   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

The linear model for dataset II
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.666
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.97
Date:                Sat, 09 Jun 2018   Prob (F-statistic):            0.00218
Time:                        20:38:34   Log-Likelihood:                -16.846
No. Observations:                  11   AIC:                             37.69
Df Residuals:                       9   BIC:                             38.49
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0009      1.125      2.667      0.026       0.455       5.547
x              0.5000      0.118      4.239      0.002       0.233       0.767
==============================================================================
Omnibus:                        1.594   Durbin-Watson:                   2.188
Prob(Omnibus):                  0.451   Jarque-Bera (JB):                1.108
Skew:                          -0.567   Prob(JB):                        0.575
Kurtosis:                       1.936   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

The linear model for dataset III
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.666
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.97
Date:                Sat, 09 Jun 2018   Prob (F-statistic):            0.00218
Time:                        20:38:34   Log-Likelihood:                -16.838
No. Observations:                  11   AIC:                             37.68
Df Residuals:                       9   BIC:                             38.47
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0025      1.124      2.670      0.026       0.459       5.546
x              0.4997      0.118      4.239      0.002       0.233       0.766
==============================================================================
Omnibus:                       19.540   Durbin-Watson:                   2.144
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               13.478
Skew:                           2.041   Prob(JB):                      0.00118
Kurtosis:                       6.571   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

The linear model for dataset IV
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.667
Model:                            OLS   Adj. R-squared:                  0.630
Method:                 Least Squares   F-statistic:                     18.00
Date:                Sat, 09 Jun 2018   Prob (F-statistic):            0.00216
Time:                        20:38:34   Log-Likelihood:                -16.833
No. Observations:                  11   AIC:                             37.67
Df Residuals:                       9   BIC:                             38.46
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0017      1.124      2.671      0.026       0.459       5.544
x              0.4999      0.118      4.243      0.002       0.233       0.766
==============================================================================
Omnibus:                        0.555   Durbin-Watson:                   1.662
Prob(Omnibus):                  0.758   Jarque-Bera (JB):                0.524
Skew:                           0.010   Prob(JB):                        0.769
Kurtosis:                       1.931   Cond. No.                         29.1
==============================================================================

Part 2

Using Seaborn, visualize all four datasets.

hint: use sns.FacetGrid combined with plt.scatter

对于这一题来说,我们也可以通过调用:

  1.seaborn来进行针对不同数据集,不同的特征的绘图操作。

  2.matplotlib来进行散点图的绘制操作

代码如下:

import matplotlib.pyplot as plt
import seaborn as sns

g = sns.FacetGrid(anascombe, col='dataset', hue="y")
g.map(plt.scatter, 'x', 'y')

运行结果如下图:


三.结果分析

仅从第一个部分来看,这四个数据集的均值、方差、相关系数三个重要的统计数据都几乎是一样的。但从真实绘制出来的图像来看,这四个数据集的分布情况其实有很大的差别。

这提示我们,在分析数据的时候,仅用少量的统计数据的分析是很有可能出现偏颇的。比较好的方法应该是进行数据可视化,可以让我们更直观地了解到数据的分布情况。

同时使用可视化和统计数据,我们才能更全面地对数据进行完整的分析。

2018-06-12 17:08:31 qq_41794348 阅读数 3688

本次作业尝试使用ipython和jupyter的notebook功能来实现py代码。

首先是要配置环境,通过命令

pip install ipython
pip install jypyter
ipython notebook

配置并打开notebook,下载作业文档,效果如下图所示:


打开exercises.ipynb,完成作业。


1. :    

For each of the four datasets...

  • Compute the mean and variance of both x and y
  • Compute the correlation coefficient between x and y
  • Compute the linear regression line: y=β0+β1x+ϵy=β0+β1x+ϵ (hint: use statsmodels and look at the Statsmodels notebook)
     

   notebook上的代码和结果如下:




I
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.667
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.99
Date:                Tue, 12 Jun 2018   Prob (F-statistic):            0.00217
Time:                        17:05:04   Log-Likelihood:                -16.841
No. Observations:                  11   AIC:                             37.68
Df Residuals:                       9   BIC:                             38.48
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0001      1.125      2.667      0.026       0.456       5.544
x              0.5001      0.118      4.241      0.002       0.233       0.767
==============================================================================
Omnibus:                        0.082   Durbin-Watson:                   3.212
Prob(Omnibus):                  0.960   Jarque-Bera (JB):                0.289
Skew:                          -0.122   Prob(JB):                        0.865
Kurtosis:                       2.244   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

 II
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.666
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.97
Date:                Tue, 12 Jun 2018   Prob (F-statistic):            0.00218
Time:                        17:05:04   Log-Likelihood:                -16.846
No. Observations:                  11   AIC:                             37.69
Df Residuals:                       9   BIC:                             38.49
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0009      1.125      2.667      0.026       0.455       5.547
x              0.5000      0.118      4.239      0.002       0.233       0.767
==============================================================================
Omnibus:                        1.594   Durbin-Watson:                   2.188
Prob(Omnibus):                  0.451   Jarque-Bera (JB):                1.108
Skew:                          -0.567   Prob(JB):                        0.575
Kurtosis:                       1.936   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

 III
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.666
Model:                            OLS   Adj. R-squared:                  0.629
Method:                 Least Squares   F-statistic:                     17.97
Date:                Tue, 12 Jun 2018   Prob (F-statistic):            0.00218
Time:                        17:05:04   Log-Likelihood:                -16.838
No. Observations:                  11   AIC:                             37.68
Df Residuals:                       9   BIC:                             38.47
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0025      1.124      2.670      0.026       0.459       5.546
x              0.4997      0.118      4.239      0.002       0.233       0.766
==============================================================================
Omnibus:                       19.540   Durbin-Watson:                   2.144
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               13.478
Skew:                           2.041   Prob(JB):                      0.00118
Kurtosis:                       6.571   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

 IV
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.667
Model:                            OLS   Adj. R-squared:                  0.630
Method:                 Least Squares   F-statistic:                     18.00
Date:                Tue, 12 Jun 2018   Prob (F-statistic):            0.00216
Time:                        17:05:04   Log-Likelihood:                -16.833
No. Observations:                  11   AIC:                             37.67
Df Residuals:                       9   BIC:                             38.46
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      3.0017      1.124      2.671      0.026       0.459       5.544
x              0.4999      0.118      4.243      0.002       0.233       0.766
==============================================================================
Omnibus:                        0.555   Durbin-Watson:                   1.662
Prob(Omnibus):                  0.758   Jarque-Bera (JB):                0.524
Skew:                           0.010   Prob(JB):                        0.769
Kurtosis:                       1.931   Cond. No.                         29.1
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.



2. :

   

Using Seaborn, visualize all four datasets.

hint: use sns.FacetGrid combined with plt.scatter

好像也没什么解释,调用对应的函数就是了。

notebook 的代码和输出结果如下: