数据分析之旅(四)

来源:互联网 发布:本地电影点播软件 编辑:程序博客网 时间:2024/05/30 02:22

解决数据分析中问题的步骤
1. 确定哪些数据是异常点;
2. 打印出部分的数据异常点;
3. 看看能不能发现什么问题;

话说上一回,学员第一周的上课最长时间(10568.100867332541 minutes)超过了每周的总分钟数(10080 minutes)
首先,要先找到这个拥有异常数据点的学生: 因为字典total_minutes_by_account 的Key值是有顺序的

这里写图片描述

因此我觉得可以找出该学生在字典total_minutes_by_account 的下标即可

i = 0for each in total_minutes_by_account.values():    i += 1    if each == 10568.100867332541:        print(i) # 108        break

接下来,打印出该学生的相关数据:

for each in paid_engagement_in_first_week:    account_key = each['account_key']    num_courses_visited = each['num_courses_visited']    if account_key == '108' :        print(each)

Output:
这里写图片描述

这里写图片描述

错误: 做到这里,我思考时得出了一个错误的结论 - -||,以为因为每个人可以上好几节课(num_courses_visited可以为0,1,2,3……),所以有好几节课的时间累积起来,最终导致的这个数据异常点

分析:
可以从结果看出,应该只包含一周的数据才对而实际上时间跨度从2015.1.7到了 2015.4.26。还记得之前那个within_one_week()函数吗,可能出问题的地方就在这里:

def within_one_week(join_date, engagement_date):    time_delta = engagement_date - join_date # time_delta = 参与日期 - 注册日期    return time_delta.days < 7

在这里只检查了注册日期与参与日期是否最多相差7天,那么,如果参与日期在注册日期之前呢?(即有这样一种情况:学生注册后又注销,继而再注册,其第一次注册的数据都会被当做第一周的数据) ,因此需要确保注册日期和参与日期相隔 ≥ 0
Ps: 在这里我的理解是:这种情况下,参与日期 - 注册日期 < 0 < 7
修改within_one_week(join_date, engagement_date) 函数:

def within_one_week(join_date, engagement_date):    time_delta = engagement_date - join_date    return time_delta.days < 7 and time_delta.days >= 0

再从头运行一下相关的Cell ,结果最大为:3564.7332644989997 minutes ,并打印出拥有数据异常点的学生:
这里写图片描述

正常啦~


学生在第一周参与的课程情况

任务: 利用上面的求参与度的代码来看一下学生在第一周参与的课程情况,求出平均值,标准差,最大最小值

这里只需对之前的代码加以小小的修改:

from collections import defaultdictdef 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_dataengagement_by_account = group_data(paid_engagement_in_first_week,                                   'account_key')def sum_grouped_items(grouped_data, field_name):    summed_data = {}    for key, data_points in grouped_data.items():        total = 0        for data_point in data_points:            total += data_point[field_name]        summed_data[key] = total    return summed_datatotal_minutes_by_account = sum_grouped_items(engagement_by_account,                                             'total_minutes_visited')import numpy as npdef describe_data(data):    data = list(data)    print('Mean:', np.mean(data))    print('Standard deviation:', np.std(data))    print('Minimum:', np.min(data))    print('Maximum:', np.max(data))describe_data(total_minutes_by_account.values())lessons_completed_by_account = sum_grouped_items(engagement_by_account,                                                 'lessons_completed')describe_data(lessons_completed_by_account.values())

问题:
describe_data(data)函数里,将data转化为列表list,不然运行代码会出现

    TypeError: unsupported operand type(s) for /: 'dict_values' and 'int'

Output:

Mean: 306.708326753Standard deviation: 412.996933409Minimum: 0.0Maximum: 3564.7332645Mean: 1.63618090452Standard deviation: 3.00256129983Minimum: 0Maximum: 36
1 0
原创粉丝点击