99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀數(shù)據(jù)分析:Python分析學生數(shù)據(jù)
數(shù)據(jù)分析:Python分析學生數(shù)據(jù)
2017-12-11
收藏

數(shù)據(jù)分析:Python分析學生數(shù)據(jù)

本文為優(yōu)達學城數(shù)據(jù)分析入門課程的mini項目,所用數(shù)據(jù)集為優(yōu)達學城某段時間內(nèi)的學生數(shù)據(jù)。

數(shù)據(jù)簡介
全部數(shù)據(jù)包含三個文件,其內(nèi)容分別為:
    enrollments.csv:
    daily-engagement.csv
    project-submissions.csv
字段的意義見table_desc.txt,文末附錄會給出。
載入數(shù)據(jù)

import csv

def readcsv_Dict(file):
    with open(file) as fd:
        reader=csv.DictReader(fd)        #以字典形式讀取CSV,適用于帶headline的數(shù)據(jù)
        return list(reader)
enrollments=readcsv_Dict("./enrollments.csv")
engagements=readcsv_Dict("./daily-engagement.csv")
submissions=readcsv_Dict("./project-submissions.csv")
print(len(enrollments),len(engagements),len(submissions))
輸出為:1640,136240,3642
預覽數(shù)據(jù)

enrollments[0]

engagements[0]

submissions[0]

數(shù)據(jù)處理
格式修正

從CSV中讀出的數(shù)據(jù)是以字符串存儲在內(nèi)存中的,需要對原數(shù)據(jù)中的數(shù)值類型與時間類型進行還原。

from datetime import datetime as dt
def parase_data(data):
    if data=="":
        return None
    else:
        return dt.strptime(data, '%Y/%m/%d')

def parase_maybe_int(i):
    if i=="":
        return None
    else:
        return int(i)

#字符串轉(zhuǎn)換
for line in enrollments:
    line['join_date']=parase_data(line['join_date'])
    line['cancel_date']=parase_data(line['cancel_date'])
    line['days_to_cancel']=parase_maybe_int(line['days_to_cancel'])
    line['is_udacity']=(line['is_udacity']=='TRUE')
    line['is_canceled']=(line['is_canceled']=='TRUE')

for line in engagements:
    line['utc_date']=parase_data(line['utc_date'])
    line['num_courses_visited']=parase_maybe_int(float(line['num_courses_visited']))
    line['total_minutes_visited']=float(line['total_minutes_visited'])
    line['lessons_completed']=parase_maybe_int(float(line['lessons_completed']))
    line['projects_completed']=parase_maybe_int(float(line['projects_completed']))

for line in submissions:
    line['creation_date']=parase_data(line['creation_date'])
    line['completion_date']=parase_data(line['completion_date'])

# print(enrollments[0])
# print(engagements[0])
# print(submissions[0])

字段修正

注意到engagements中的學生賬戶字段標識與另兩文件中的不一樣,將其修改為與另兩者一致的’account_key’。

#修改不一致的鍵值(這里也可以直接對原文件進行修改)
for line in engagements:
    line['account_key']=line['acct']
    del line['acct']

print(engagements[0])
計算學生數(shù)

計算三個文件中分別有多少學生的數(shù)據(jù)。

def get_unique_stu(stu_list):
    unique_stu=set()
    for stu in stu_list:
        unique_stu.add(stu['account_key'])
    return unique_stu
unique_enroller=get_unique_stu(enrollments)
unique_engager=get_unique_stu(engagements)
unique_submitter=get_unique_stu(submissions)
print(len(unique_enroller),len(unique_engager),len(unique_submitter))

輸出為:1302,1237,743
處理異常值

可以看到enrollments中的學生數(shù)要多于engagement中的學生數(shù),這是不合理的,正常來說應該是engagement中的學生數(shù)大于等于enrollments的學生數(shù),所以數(shù)據(jù)中一定存在異常值。

找出在enrollments中存在卻不在engagement中存在的學生,這里排除掉當天注冊又注銷的學生。

def find_outlier():
    for enroll_stu in enrollments:
        stu=enroll_stu['account_key']
        if stu not in unique_engager and enroll_stu['join_date']!=enroll_stu['cancel_date']:
            print(enroll_stu)

find_outlier()

發(fā)現(xiàn)異常值有一個共同點:(‘is_udacity’, True),都為優(yōu)達學城的測試賬號。

刪除掉這些測試賬號。

test_acct=[]

for stu in enrollments:
    if stu['is_udacity']:
        test_acct.append(stu['account_key'])
test_acct=list(set(test_acct))

def remove_test_acct(stu_list):
    tmp=[]
    for stu in stu_list:
        if stu['account_key'] not in test_acct:
            tmp.append(stu)
    return tmp

enrollments=remove_test_acct(enrollments)
engagements=remove_test_acct(engagements)
submissions=remove_test_acct(submissions)
print(len(test_acct))

有6個測試賬號。
篩選數(shù)據(jù)

由于整個數(shù)據(jù)集中包含了七天免費試用的學生,這一部分學生數(shù)據(jù)明顯是沒有意義的,需要篩選出付費學生的數(shù)據(jù)。

paid_students_join_date={}
for stu in enrollments:
    #未注銷或者取消時間超過七天的學生
    if not stu['is_canceled'] or stu['days_to_cancel']>7:
        #當字典中不存在條目時創(chuàng)建,且只保留最新的join_date
        if stu['account_key'] not in paid_students_join_date or stu['join_date']>paid_students_join_date[stu['account_key']]:
            paid_students_join_date[stu['account_key']]=stu['join_date']
paid_acct=list(set(paid_students_join_date.keys()))

def remove_free_acct(stu_list):
    tmp=[]
    for stu in stu_list:
        if stu['account_key'] in paid_acct:
            tmp.append(stu)
    return tmp

paid_enrollments=remove_free_acct(enrollments)
paid_engagements=remove_free_acct(engagements)
paid_submissions=remove_free_acct(submissions)

print(len(paid_acct))
共有995名付費學生。
分析數(shù)據(jù)
一周數(shù)據(jù)

這里只分析一周內(nèi)的數(shù)據(jù)。

paid_engagement_1stweek=[]

for stu in paid_engagements:
    days=(stu['utc_date']-paid_students_join_date[stu['account_key']]).days
    if (days>=0 and days<7):
        paid_engagement_1stweek.append(stu)

print(len(paid_engagement_1stweek))

一周內(nèi)有6919條數(shù)據(jù)。
學習時間

from collections import defaultdict

#整合同一學生賬戶的信息
def group_data(data,key_name):
    grouped_data=defaultdict(list)      #value為列表的字典
    for data_point in data:
        grouped_data[data_point[key_name]].append(data_point)    #將同一賬戶的信息整合
    return grouped_data

#在整合信息中計算某個字段的累加值
def count_total(grouped_data,field_name):
    total_dic={}
    for acct in grouped_data:
        total=0
        for info in grouped_data[acct]:
            total+=info[field_name]
        total_dic[acct]=total
    return total_dic


engager_acct_1stweek=group_data(paid_engagement_1stweek,'account_key')

total_minutes_byacct=count_total(engager_acct_1stweek,'total_minutes_visited')
total_minutes=list(total_minutes_byacct.values())

import numpy as np
print(np.mean(total_minutes),np.max(total_minutes),np.min(total_minutes),np.std(total_minutes))
輸出:306.708326753 3564.7332645 0.0 412.99693341
完成課程數(shù)

total_lessons_byacct=count_total(engager_acct_1stweek,'lessons_completed')
total_lessons=list(total_lessons_byacct.values())
print(np.mean(total_lessons),np.max(total_lessons),np.min(total_lessons),np.std(total_lessons))
輸出:1.63618090452 36 0 3.00256129983
課程訪問量

total_courses_visited_byacct=count_total(engager_acct_1stweek,'num_courses_visited')
total_courses_visited=list(total_courses_visited_byacct.values())
print(np.mean(total_lessons),np.max(total_lessons),np.min(total_lessons),np.std(total_lessons))
輸出:1.63618090452 36 0 3.00256129983
學習天數(shù)

當’num_courses_visited’字段不為零時則學習天數(shù)加一天。

total_studydays_byacct={}
for acct in engager_acct_1stweek:
    total_studydays=0
    for info in engager_acct_1stweek[acct]:
        if info['num_courses_visited']==0:
            continue
        else:
            total_studydays+=1
    total_studydays_byacct[acct]=total_studydays

total_studydays=list(total_studydays_byacct.values())
print(np.mean(total_studydays),np.max(total_studydays),np.min(total_studydays),np.std(total_studydays))
輸出為:2.86733668342 7 0 2.25519800292
通過情況

以課程746169184與3176718735為例,計算通過這兩門課程的學生數(shù)。

passing_acct=set()
project_key=['746169184','3176718735']
pass_flag=['PASSED','DISTINCTION']
for stu in paid_submissions:
    if (stu['lesson_key'] in project_key) and (stu['assigned_rating'] in pass_flag):
        passing_acct.add(stu['account_key'])

print(len(passing_acct))

付費學生共有995名,最近一周有647名學生通過了這兩門課程。
兩群體數(shù)據(jù)對比

對比通過課程的學生與未通過學生的一系列數(shù)據(jù),來發(fā)現(xiàn)規(guī)律。

#目前已有數(shù)據(jù)
# total_courses_visited_byacct
# total_lessons_byacct
# total_minutes_byacct
# total_studydays_byacct

def compare_stu_data(data_to_compare):
    passing_stu_data={}
    non_passing_stu_data={}
    for stu_acct in data_to_compare:
        if stu_acct in passing_acct:
            passing_stu_data[stu_acct]=data_to_compare[stu_acct]
        else:
            non_passing_stu_data[stu_acct]=data_to_compare[stu_acct]
    return passing_stu_data,non_passing_stu_data
課程瀏覽量

passing_stu_courses_visited,non_passing_stu_courses_visited=compare_stu_data(total_courses_visited_byacct)
passing_visited_data,non_passing_visited_data=list(passing_stu_courses_visited.values()),list(non_passing_stu_courses_visited.values())
print(np.mean(passing_visited_data),np.max(passing_visited_data),np.min(passing_visited_data),np.std(passing_visited_data))
print(np.mean(non_passing_visited_data),np.max(non_passing_visited_data),np.min(non_passing_visited_data),np.std(non_passing_visited_data))
輸出:
4.72642967543 25 0 3.7002397793
2.58908045977 18 0 2.90670969025

差異顯著。課程瀏覽量在一定程度上可以體現(xiàn)學生的學習興趣,通過課程的學生的學習興趣要比未通過的學生高。
課程完成量

passing_stu_lessons,non_passing_stu_lessons=compare_stu_data(total_lessons_byacct)
passing_lessons_data,non_passing_lessons_data=list(passing_stu_lessons.values()),list(non_passing_stu_lessons.values())
print(np.mean(passing_lessons_data),np.max(passing_lessons_data),np.min(passing_lessons_data),np.std(passing_lessons_data))
print(np.mean(non_passing_lessons_data),np.max(non_passing_lessons_data),np.min(non_passing_lessons_data),np.std(non_passing_lessons_data))
輸出:
2.05255023184 36 0 3.14222705558
0.862068965517 27 0 2.54915994183

差異顯著。這個沒什么好解釋的。
學習時間

passing_stu_minutes,non_passing_stu_minutes=compare_stu_data(total_minutes_byacct)
passing_minutes_data,non_passing_minutes_data=list(passing_stu_minutes.values()),list(non_passing_stu_minutes.values())
print(np.mean(passing_minutes_data),np.max(passing_minutes_data),np.min(passing_minutes_data),np.std(passing_minutes_data))
print(np.mean(non_passing_minutes_data),np.max(non_passing_minutes_data),np.min(non_passing_minutes_data),np.std(non_passing_minutes_data))

輸出:
394.586046483 3564.7332645 0.0 448.49951933
143.326474266 1768.5227493 0.0 269.538619008

差異顯著。同樣無需解釋。
學習天數(shù)

passing_stu_studydays,non_passing_stu_studydays=compare_stu_data(total_studydays_byacct)
passing_studydays_data,non_passing_studydays_data=list(passing_stu_studydays.values()),list(non_passing_stu_studydays.values())
print(np.mean(passing_studydays_data),np.max(passing_studydays_data),np.min(passing_studydays_data),np.std(passing_studydays_data))
print(np.mean(non_passing_studydays_data),np.max(non_passing_studydays_data),np.min(non_passing_studydays_data),np.std(non_passing_studydays_data))

輸出:
3.38485316847 7 0 2.25882147092
1.90517241379 7 0 1.90573144136

差異顯著。
可視化

%matplotlib inline
import matplotlib.pyplot as plt
學習時間

plt.xlabel("total_minutes")
plt.ylabel("num of stu")
plt.hist(passing_minutes_data,bins=30)
plt.hist(non_passing_minutes_data,bins=30)

學習天數(shù)

通過的學生:

plt.xlabel("study days")
plt.ylabel("num of stu")

plt.hist(passing_studydays_data,bins=7)

未通過的學生:
plt.xlabel("study days")
plt.ylabel("num of stu")

plt.hist(non_passing_studydays_data,bins=7)

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }