之前在知乎上刷到一篇使用Excel完成数据分析的文章,于是我想到用Python来进行同样的数据分析。
原Excel数据分析文章地址:https://zhuanlan.zhihu.com/p/47707508
使用到Python的numpy、pandas、motplotlib
代码及结果如下:
//引入相应模块
import csv
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from scipy import stats
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
%matplotlib inline
//读取数据并进行重命名
data = pd.read_csv('appendix.csv')
data.rename(columns = ({'Institution':'课程持有机构',
'Course Number':'课程编号ID',
'Launch Date':'上线日期',
'Course Title':'课程名称',
'Instructors':'讲师',
'Course Subject':'课程主题',
'Year':'课程持续时间',
'Honor Code Certificates':'是否提供认证',
'Participants (Course Content Accessed)':'学生人数',
'Audited (> 50% Course Content Accessed)':'完成50%以上课程的人数',
'Certified':'拿到认证的人数',
'% Audited':'完成50%课程人数占比',
'% Certified':'认证人数占比',
'% Certified of > 50% Course Content Accessed':'认证人数在完成50%课程人数中占比',
'% Played Video':'播放视频人数占比',
'% Posted in Forum':'粘贴到论坛占比',
'% Grade Higher Than Zero':'分数高于0的百分比',
'Total Course Hours (Thousands)':'总课程时长小时数',
'Median Hours for Certification':'拿到认证小时数的中位数',
'Median Age':'用户年龄中位数',
'% Male':'男性占比',
'% Female':'女性占比',
'% Bachelor\'s Degree or Higher':'用户学士学历及以上占比'}),inplace = True)
//数据清洗及数据去重、填充缺失值
data.drop_duplicates()
data.drop_duplicates()
data.fillna(method='ffill')
生成图表分析学生与课程之间的关系
//透视表
Popular_Courses0 = data.pivot_table(index='课程名称',values=['学生人数'],aggfunc='sum')
Popular_Courses = Popular_Courses0.sort_values(by='学生人数',ascending=False)
Popular_Courses.head(5)
//柱状图
Popular_Subject = data.pivot_table(index='课程主题',values=['学生人数'],aggfunc='sum')
Popular_Subject.sort_values(by='学生人数',ascending=False)
Popular_Subject.plot(kind='barh')
分析生成图表如下:
借助图表查看课程与课程持有机构的关系:
Institution_Subject = pd.crosstab(data.课程持有机构,data.课程主题,margins=True)
display(Institution_Subject)
Institution_Subject.plot(kind='bar',stacked=True,rot=0)
Institution_Subject_Number = data.pivot_table(index='课程主题',columns='课程持有机构',values=['学生人数'],aggfunc='size')
Institution_Subject_Number.plot(kind='barh',stacked=True,rot=0)
生成图表如下:
计算统计量,分析该网站用户特征、学习情况等:
#定义计算列
a=data['完成50%课程人数占比']
b=data['认证人数占比']
c=data['用户年龄中位数']
a1=a.sort_values(ascending=False)
b1=b.sort_values(ascending=False)
c1=c.sort_values(ascending=False)
zxd_95=1.968177896
wr0={'完成50%课程人数占比':[a.mean(),a.sem(),a.median(),stats.mode(a)[0][0],
a.std(),a.var(),a.kurt(),a.skew(),
a.max()-a.min(),a.min(),a.max(),a.sum(),
a.count(),a1.values[4],a1.values[-5],a.sem()*zxd_95],
'认证人数占比':[b.mean(),b.sem(),b.median(),stats.mode(b)[0][0],
b.std(),b.var(),b.kurt(),b.skew(),
b.max()-b.min(),b.min(),b.max(),b.sum(),
b.count(),b1.values[4],b1.values[-5],b.sem()*zxd_95]}
wr=pd.DataFrame(wr0,columns=['完成50%课程人数占比','认证人数占比'],index=['平均数','标准误差','中位数','众数','标准差','方差','峰度','偏度','区域','最小值','最大值','求和','观测数','最大(5)','最小(5)','置信度(95.0%)'])
display(wr)
t1=data[['完成50%课程人数占比','认证人数占比']]
t1.boxplot()
yh0={'用户年龄中位数':[c.mean(),c.sem(),c.median(),stats.mode(c)[0][0],
c.std(),c.var(),c.kurt(),c.skew(),
c.max()-c.min(),c.min(),c.max(),c.sum(),
c.count(),c1.values[4],c1.values[-5],c.sem()*zxd_95]}
yh=pd.DataFrame(yh0,columns=['用户年龄中位数'],index=['平均数','标准误差','中位数','众数','标准差','方差','峰度','偏度','区域','最小值','最大值','求和','观测数','最大(5)','最小(5)','置信度(95.0%)'])
display(yh)
data[['男性占比','女性占比']].agg([np.mean])
data[['用户学士学历及以上占比']].agg([np.mean])
分析生成图表如下:
箱线图: