一.数据分析的步骤:

1.查看数据并提出问题

2.数据清洗

3.代码编写,提取出结果数据,并分析是否有异常数据,修改代码

4.根据数据选择合适的图表进行展示

5.根据图表小组讨论交流获得最终的结果

二.环境与原始数据准备

安装Anaconda2版本,同时更新软件包更新最新版本  conda upgrade --all

下载first.zip文件,解压

里面有3张csv文件分别是enrollments.csv,daily_engagements.csv,project_submission.csv和一个ipython的notebook

启动cmd 切换到解压之后的文件 输入 jupyter notebook 启动ipython笔记本

三.分析数据

1.从csv加载数据

import unicodecsv

def readcsv(filename):
with open(filename,'rb') as f:
#以字典的形式存放每一行数据
reader = unicodecsv.DictReader(f)
return list(reader)
## 从 daily_engagement.csv 和 project_submissions.csv 载入数据并存
## 储至下面的变量中,然后检查每张表的第1行。 daily_engagement = readcsv('daily-engagement.csv')
project_submissions = readcsv('project-submissions.csv')
enrollments = readcsv('enrollments.csv') print daily_engagement[0]
print project_submissions[0]
print enrollments[0]

2.修正数据类型

from datetime import datetime as dt

# 将字符串格式的时间转为 Python datetime 类型的时间。
# 如果没有时间字符串传入,返回 None
def parse_date(date):
if date == '':
return None
else:
return dt.strptime(date, '%Y-%m-%d') # 将可能是空字符串或字符串类型的数据转为 整型 或 None。
def parse_maybe_int(i):
if i == '':
return None
else:
return int(i)
# 清理 enrollments 表格中的数据类型(取消的日期,参加日期,退出的天数,是否取消,是否是Udacity测试账号)
for enrollment in enrollments:
enrollment['cancel_date'] = parse_date(enrollment['cancel_date'])
enrollment['join_date'] = parse_date(enrollment['join_date'])
enrollment['days_to_cancel'] = parse_maybe_int(enrollment['days_to_cancel'])
enrollment['is_canceled'] = enrollment['is_canceled'] == 'True'
enrollment['is_udacity'] = enrollment['is_udacity'] == 'True' enrollments[0] # 清理 engagement 的数据类型(时间,课程数量,课程完成数量,项目完成情况,共花费多少时间)
for engagement_record in daily_engagement:
engagement_record['utc_date'] = parse_date(engagement_record['utc_date'])
engagement_record['num_courses_visited'] = int(float(engagement_record['num_courses_visited']))
engagement_record['lessons_completed'] = int(float(engagement_record['lessons_completed']))
engagement_record['projects_completed'] = int(float(engagement_record['projects_completed']))
engagement_record['total_minutes_visited'] = float(engagement_record['total_minutes_visited']) daily_engagement[0] # 清理 submissions 的数据类型(项目创建的时间,完成的时间)
for submission in project_submissions:
submission['creation_date'] = parse_date(submission['creation_date'])
submission['completion_date'] = parse_date(submission['completion_date']) project_submissions[0]

3.修改数据中的格式问题

## 将 daily_engagement 表中的 "acct" 重命名为 ”account_key"
for engagement_record in daily_engagement:
engagement_record['account_key'] = engagement_record['acct']
del [engagement_record['acct']]

4.探索数据

## 计算每张表中的总行数,和独立学生(拥有独立的 account keys)的数量
def unique_student_data(data):
unique_data = set()
for data_point in data:
unique_data.add(data_point['account_key'])
return unique_data
len(enrollments)
unique_enrolled_students = unique_student_data(enrollments)
len(unique_enrolled_students) len(daily_engagement)
unique_daily_engagement = unique_student_data(daily_engagement)
len(unique_daily_engagement) len(project_submissions)
unique_project_submissions = unique_student_data(project_submissions)
len(unique_project_submissions)

5.找出问题数据

## 计算出有问题的数据点条数(在 enrollments 中存在,但在 engagement 表中缺失)
num_problem_students = 0
for enrollment in enrollments:
if enrollment['account_key'] not in unique_daily_engagement and enrollment['join_date'] != enrollment['cancel_date']:
num_problem_students +=1
print enrollment
print num_problem_students

6.追踪剩余的问题(移除数据集的测试账号)

# 为所有 Udacity 测试帐号建立一组 set
udacity_test_account = set()
for enrollment in enrollments:
if enrollment['is_udacity']:
udacity_test_account.add(enrollment['account_key'])
len(udacity_test_account) # 通过 account_key 删除所有 Udacity 的测试帐号
def remove_udacity_account(data):
non_udacity_data = []
for data_point in data:
if data_point['account_key'] not in udacity_test_account:
non_udacity_data.append(data_point)
return non_udacity_data # 从3张表中移除所有 Udacity 的测试帐号
non_udacity_enrollments = remove_udacity_account(enrollments)
non_udacity_engagement = remove_udacity_account(daily_engagement)
non_udacity_submissions = remove_udacity_account(project_submissions)
#创建一个叫 paid_students 的字典,并在字典中存储所有还没有取消或者注册时间超过7天的学生
paid_students = {}
for enrollment in non_udacity_enrollments:
  #如果没有取消并且退课的期限已经超过,就记录学生的key和报名时间
if not enrollment['is_canceled'] or enrollment['days_to_cancel'] > 7:
account_key = enrollment['account_key']
enrollment_date = enrollment['join_date']
     #如果account_key不在已缴费的记录中,则将学生记录添加进paid_student中
if account_key not in paid_students or enrollment_date > paid_students[account_key]:
paid_students[account_key] = enrollment_date
len(paid_students)#获取了所有已入学的学生记录

7.获取第一周就已经付费报名的学生

#计算时间差,一周以内,按天计算
def within_one_week(join_date ,engagement_date):
time_delta = join_date - enrollment_date
return time_delta.days >= 0 and time_delta.days < 7 #存放已报名的用户
def remove_free_trial_cancels(data):
new_data = []
for data_point in data:
if data_point['account_key'] in paid_students:
new_data.append(data_point)
return new_data paid_enrollment = remove_free_trial_cancels(non_udacity_enrollments)
paid_engagement = remove_free_trial_cancels(non_udacity_engagement)
paid_project_missions = remove_free_trial_cancels(non_udacity_submissions) print len(paid_enrollment)
print len(paid_engagement)
print len(paid_project_missions)
## 创建一个 engagement 记录的列表,该列表只包括付费学生以及加入的前7天的学生的记录
## 输入符合要求的行数
paid_engagement_in_first_week = []
for engagement_record in paid_engagement:
join_date = paid_students[engagement_record['account_key']]
engagement_record_date = engagement_record['utc_date']
if within_one_week(join_date,engagement_record_date):
paid_engagement_in_first_week.append(engagement_record)
len(paid_engagement_in_first_week)
from collections import defaultdict
import numpy as np
#创建基于 student 对 engagement 进行分组的字典,字典的键为帐号(account key),值为包含互动记录的列表
def group_data(data,key_name):
grouped_data = defaultdict(list)
for data_point in data:
key = data_point[key_name]
grouped_data[key].append(data_point)
return grouped_data # 创建一个包含学生在第1周在教室所花总时间和字典。键为帐号(account key),值为数字(所花总时间)
def sum_grouped_items(grouped_data,field_name):
sumed_data = {}
for key,data_points in grouped_data.items():
total = 0
for data_point in data_points:
total += data_point[field_name]
sumed_data[key] = total
return sumed_data # 汇总和描述关于教室所花时间的数据
def describe_data(data):
print 'Mean:', np.mean(data)
print 'Standard deviation:', np.std(data)
print 'Minimum:', np.min(data)
print 'Maximum:', np.max(data)

8.获取学习时间最长的学生和时间

total_minutes_by_account = sum_grouped_items(engagement_by_account,'total_minutes_visited')

student_with_max_minutes = None
max_minutes = 0
for student,total_nums in total_minutes_by_account.items():
if total_nums > max_minutes:
max_minutes = total_nums
student_with_max_minutes = student
print max_minutes for engagement_record in paid_engagement_in_first_week:
if engagement_record['account_key'] == student:
print engagement_record

9.找出第一周的访问数

## 找出第1周学生访问教室天数的平均值、标准差、最小值、最大值。
for engagement_record in paid_engagement:
if engagement_record['num_courses_visited'] > 0:
engagement_record['has_visited'] = 1
else:
engagement_record['has_visited'] = 0 days_visited_by_account = sum_grouped_items(engagement_by_account,'has_visited')
describe_data(days_visited_by_account.values())

10.区分项目通过的学生

## 创建两个付费学生第1周的互动数据列表(engagement)。第1个包含通过项目的学生,第2个包含没通过项目的学生。

subway_project_lesson_keys = ['746169184', '3176718735']
#定义存放通过项目的学员的key
pass_subway_project = set()
for submission in paid_project_missions:
project = submission['lesson_key']
rating = submission['assigned_rating']
  #如果等级是passed和distinction加入到pass_subway_project集合中
if project in subway_project_lesson_keys and (rating == 'PASSED' or rating == 'DISTINCTION'):
pass_subway_project.add(submission['account_key']) passing_engagement = [] #存放通过项目的学生
non_passing_engagement =[] #存放没有通过项目的学生 for engagement_record in paid_engagement_in_first_week:
if engagement_record['account_key'] in pass_subway_project:
passing_engagement.append(engagement_record)
else:
non_passing_engagement.append(engagement_record) print len(passing_engagement)
print len(non_passing_engagement)

11.对比两组学生的数据

## 计算你所感兴趣的数据指标,并分析通过项目和没有通过项目的两组学生有何异同。
## 你可以从我们之前使用过的数据指标开始(教室的访问时间、课程完成数、访问天数)。
passing_engagement_by_account = group_data(passing_engagement,'account_key')
non_passing_engagement_by_account = group_data(non_passing_engagement,'account_key') print 'non-passing students'
non_passing_minute = sum_grouped_items(non_passing_engagement_by_account,'total_minutes_visited')
describe_data(non_passing_minute.values())
print 'passing students'
passing_minute = sum_grouped_items(passing_engagement_by_account,'total_minutes_visited')
describe_data(passing_minute.values()) print 'non-passing lessons'
non_passing_lessons = sum_grouped_items(non_passing_engagement_by_account,'lessons_completed')
describe_data(non_passing_lessons.values())
print 'passing lessons'
passing_lessons = sum_grouped_items(passing_engagement_by_account,'lessons_completed')
describe_data(passing_lessons.values()) print 'non-passing visited'
non_passing_visited = sum_grouped_items(non_passing_engagement_by_account,'has_visited')
describe_data(non_passing_visited.values())
print 'passing visited'
passing_visited = sum_grouped_items(passing_engagement_by_account,'has_visited')
describe_data(passing_visited.values())

12.绘制直方图

%pylab inline
import matplotlib.pyplot as plt
import numpy as np def describe_data(data):
print 'Mean:', np.mean(data)
print 'Standard deviation:', np.std(data)
print 'Minimum:', np.min(data)
print 'Maximum:', np.max(data)
plt.hist(data) describe_data(passing_minute.values())
describe_data(non_passing_minute.values())

13.改进图表并分析

## 至少改进一幅之前的可视化图表,尝试导入 seaborn 库使你的图表看起来更美观。
## 加入轴标签及表头,并修改一个或多个 hist() 内的变量。
%pylab inline
import seaborn as sns
sns.set(color_codes=True)
plt.hist(non_passing_minute.values(),bins=8)
plt.xlabel('mean of minut')
plt.title('Distribution of classroom visits in the first week ' +
'for students who do not pass the subway project') plt.hist(passing_minute.values(),bins=8)
plt.xlabel('mean of minut')
plt.title('Distribution of classroom visits in the first week ' +
'for students who do not pass the subway project')

Python数据分析流程的更多相关文章

  1. KNIME + Python = 数据分析+报表全流程

    Python 数据分析环境 数据分析领域有很多可选方案,例如SPSS傻瓜式分析工具,SAS专业性商业分析工具,R和python这类需要代码编程类的工具.个人选择是python这类,包括pandas,n ...

  2. 【读书笔记与思考】《python数据分析与挖掘实战》-张良均

    [读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...

  3. 小象学院Python数据分析第二期【升级版】

    点击了解更多Python课程>>> 小象学院Python数据分析第二期[升级版] 主讲老师: 梁斌 资深算法工程师 查尔斯特大学(Charles Sturt University)计 ...

  4. Python数据分析实战视频教程【小蚊子数据分析实战课程】

    点击了解更多Python课程>>> Python数据分析实战视频教程[小蚊子数据分析实战课程] [课程概述] Python数据分析实战' 适用人群:适合需提升竞争力.提升工作效率.喜 ...

  5. Python数据分析【炼数成金15周完整课程】

    点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...

  6. 快速入门 Python 数据分析实用指南

    Python 现如今已成为数据分析和数据科学使用上的标准语言和标准平台之一.那么作为一个新手小白,该如何快速入门 Python 数据分析呢? 下面根据数据分析的一般工作流程,梳理了相关知识技能以及学习 ...

  7. 小白学 Python 数据分析(15):数据可视化概述

    人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...

  8. 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  9. 小猪的Python学习之旅 —— 16.再尝Python数据分析:采集拉勾网数据分析Android就业行情...

    一句话概括本文: 爬取拉钩Android职位相关数据,利用numpy,pandas和matplotlib对招人公司 情况和招聘要求进行数据分析. 引言: 在写完上一篇<浅尝Python数据分析: ...

随机推荐

  1. https加密实现

    author:JevonWei 版权声明:原创作品 在httpd安装完成的基础上实现https加密 安装mod_ssl软件包 yum -y install mod_ssl http -M 显示mod_ ...

  2. Web桌面应用框架2:著名的WEB桌面应用分析

    前一篇文章里,分析了包括NW.js和electron这种纯JS框架在内的几种Web桌面应用开发方式,实际上还有一种最古老的方式,那就是嵌入WebView的方式. 嵌入WebView的方式和整个程序都是 ...

  3. webmagic爬取渲染网站

    最近突然得知之后的工作有很多数据采集的任务,有朋友推荐webmagic这个项目,就上手玩了下.发现这个爬虫项目还是挺好用,爬取静态网站几乎不用自己写什么代码(当然是小型爬虫了~~|). 好了,废话少说 ...

  4. C# IComparable 和 IComparer 区别

    理解很重要: 开始对这两个接口的区别一直是很模糊,看到很多书后,终于知道了区别,形成了个人的理解: 关于 IComparable 比喻一个类person实现了 IComparable,那么它就要重写C ...

  5. CloseableHttpClient 源码

    public abstract class CloseableHttpClient implements HttpClient, Closeable { private final Log log = ...

  6. MPLS VPN随堂笔记1

    MPLS VPN 基础 1.MPLS vpn架构的特点 1.1.允许不同CE传递相同私网路由 1.2.SP内部(所有P路由器)不需要学习CE路由 1.3.无安全保障但有带宽保障(跟SP租用服务) 2. ...

  7. 为什么会需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  8. mac环境下安装mysql

    一,下载mysql 官网"Community " 下会看到"MySQL Community Server"下方有一个"download"点击 ...

  9. 201521123077 《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 向对象思想总结 1.2 使用常规方法总结其他上课内容 Swing一些常用组件的基本用法 Object类的clone及hashcode方法 2. 书面作业 1. clone方 ...

  10. 201521123053《Java程序设计》第四周总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 现在上课跟着老师的思路走,一般都能理解了.就是课上知识点有些难以记住. 特别讲讲这个思维导图 ...