Udacity 数据分析入门总结

和自甴很熟 提交于 2019-12-06 18:44:47

课程网站:https://classroom.udacity.com/courses/ud170

目录

学习内容

  • *Python数据分析
    1.数据读取
    2.数据修正(数值和日期格式的转化)
    3.数据探索(熟悉数据内容,提出问题)
    4.问题处理(异常值、特殊值和特定数据提取)
    5.数据可视化(关键数据可视化图表呈现)

  • *Numpy和Pandas处理一维数据
    待学习

  • *Numpy和Pandas处理二维数据
    待学习

学习感受

课程篇

Udacity的课程总是一如既往的详细,均是从基础开始讲起,最重要的是讲解知识时提出许多具有启发性的问题,加上合理的练习设计,学起来总是事半功倍。

内容篇

第一部分内容比较基础,重点在于对列表、字典和元组的理解和使用。主要通过合理的建立字典和列表,将我们感兴趣的数据放入,而将不感兴趣和异常值去除。

而这个操作一般都是:建立字典——for循环——if条件选择——输出目标值到新字典。

内容的重点在于:熟悉数据内容,提出能从数据中获得的有趣问题,以何种思路去回答问题,以及如何根据问题获得有价值的信息。

总结回顾

按照学习内容依次总结:

1.读取csv文件:

# 用到特殊库文件unicodecsv
import unicodecsv

def read_csv(file):
    with open(file, 'rb') as f:
        reader = unicodecsv.DictReader(f)
        return list(reader)

读取csv格式文件,并返回列表。

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)

# 清理文件表格中的数据类型

其中涉及到日期修改,用到datetime库的strptime函数,在使用时格式为dt.strptime(date, “%Y-%m-%d”)。当然其输出格式可以多种选择,可以自行搜索文档查看格式。

数据类型转换可以直接强制转换为对应类型:int(i),其中有部分数据需要将尾数去掉,如课程完成值为1.5,需要转化为1,可利用如下代码:

b = int(float(a))

3.数据探索

提供数据为:
enrollments(第一个项目完成情况(内含学员账号、加入时间、取消时间等))
daily-engagement(每天学习情况(内含学员账号、浏览课程时间、完成课程总数和完成项目总数))
project-submissions(提交项目情况(内含提交项目日期、项目状态等))

提问:
学员花费在课程上时间与学员提交项目关系?(求得数据中学员花费在课程上的总时间)

# 导入 defaultdict ,可输出空列表
from collections import defaultdict

# 定义在数据 data 中寻找特定项 value 的函数
def find_special_value(value, data):
    engagement_by_account = defaultdict(list)
    # 在数据中提取 “account_key”,并将对应数据传递给 “engagement_by_account”, 形成字典 “engagement_by_account”
    for data_point in data:
        account_key = data_point["account_key"]
        engagement_by_account[account_key].append(data_point)

    # 创建空字典,储存结果   
    total_by_account = {}
    # 字典 “engagement_by_account” 用两次for循环查找数据中对应 "value" 项,并将其累加,存入字典 “total_by_account”中,注意其中的 "items"
    for account_key, engagement_by_student in engagement_by_account.items():
        total = 0
        for engagement_record in engagement_by_student:
            total += engagement_record[value]
        total_by_account[account_key] = total

    # 提取字典中 “value” 值并存入元组 "total_value" 中
    total_value = total_by_account.values()

学员完成课程数与学员完成项目数关系?

# 访问次数道理与求累计学习时间相同,将value值改为 "num_courses_visited"即可

学员访问课程教室天数与项目完成关系?

def find_lessons_value(value, data):
    engagement_by_account = defaultdict(list)
    for engagement_record in data:
        account_key = engagement_record["account_key"]
        engagement_by_account[account_key].append(engagement_record)

    total_by_account = {}
    for account_key, engagement_by_student in engagement_by_account.items():
        total = 0
        for engagement_record in engagement_by_student:
        # 特别之处在于,访问天数的计算:只能是每天为1或者0,即如果当天有访问次数记录,只记为1次;没有记录,记为0次!
            if engagement_record[value]:
                total += 1
        total_by_account[account_key] = total

    total_value = total_by_account.values()

4.问题处理

异常值、特殊值和特定数据提取

数据集daily-engagement中键值问题“acct”:

# 将 "acct" 对应内容 Value 赋值给 "account_key" , 删除 "acct"
def engagement in daily-engagement:
    engagement["account_key"] = engagement["acct"]
    del engagement["acct"]

数据集中出现重复注册问题:

# 通过 “account_key” 的唯一账号,剔除重复用户
def get_unique_student(data):
    unique_student = set()
    for data_point in data:     
        unique_student.add(data_point["account_key"])
    return unique_student

官方测试账号异常问题:

# 为所有 Udacity 测试帐号建立一组 set 
udacity_test_accounts = set()
for enrollment in enrollments:
    if enrollment['is_udacity']:
        udacity_test_accounts.add(enrollment['account_key'])

# 通过 "account_key" 找到不是官方测试账号的数据存入 non_udacity_account 中
def remove_udacity_accounts(data):
    non_udacity_data = []
    for data_point in data:
        if data_point["account_key"] not in udacity_accounts:
            non_udacity_data.append(data_point)
    return non_udacity_data

5.数据可视化

得到对应结果后,可通过强大、神奇的numpy来处理,比如:

    import numpy

    total_value = total_by_account.values()

    print "mean:",  np.mean(total_value)
    print "standard Deviation", np.std(total_value)
    print "Minium", np.min(total_value)
    print "Maxium", np.max(total_value)

最后再将结果可视化,比如最基本的直方图:

# 关键数据可视化图表呈现

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)

可以非常直观的看到提出数据分布!!!
这里写图片描述

学习原因及计划

  • 原因
    数据分析与处理是进行深度学习必不可少的一门学科,在对大型、复杂数据进行处理时,不仅仅需要熟练的编程技巧,更需要扎实的理论和丰富的经验来分析和理解数据的特性,并根据其特性来进行合适的模型选择。

    学习完Udacity的深度学习纳米课程已经两个多月了,但在实战项目中,发现对数据的预处理不足,会导致模型的训练效果大打折扣,且Python的基础不扎实,需要一段时间的磨练,决定花一周的时间学习数据分析入门和用 MongoDB 进行数据整理课程,打基础同时锻炼编程能力,更深入的理解编程思想。

  • 计划
    这里写图片描述
    这里写图片描述

    写在最后的最后,希望我能坚持到底,享受这个过程,成为更好的自己,得到nice的结果!


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!