首页 > 其他分享 >udemy课程和评论的大数据分析

udemy课程和评论的大数据分析

时间:2022-12-24 01:23:30浏览次数:40  
标签:数据分析 num df comments udemy courses 课程 subscribers

一、选题的背景

Udemy 是一个面向学生和专业人士的在线学习平台。Udemy拥有超过5000万学生和57,000名教师,他们以超过65种语言教授课程。与其他在线教育平台不同的是,Udemy 不仅开放各种课程,更开放了教学的机会,也就是说,只要你愿意,你也可以成为老师。用户可以随时在平台上学习任何课程,也可以建立自己的课程,将自己擅长的专业与知识介绍给全世界,Udemy类似于国内慕课网以及腾讯课堂。Udemy课程对提高工作所需的技能非常有用。在本篇文章中,我们将对Udemy课程和评论进行数据分析,以便于我们更加直观的了解大家对于udemy的看法和评价分布是怎么样的,以及此网站的教学内容是怎么样的。

 二、大数据分析设计方案

1.本数据集的数据内容与数据特征分析

本案例数据基于平台的课程(id、标题、价格、种类,主题,语言等)共计20个特征,数据共计200000条以及平台的评论(id,课程名,评价,日期 等)6个特征,数据共计220000条,对Udemy平台的数据进行分析

                           课程:                                                                                                      

字段名称 字段类型 字段说明
id float64 id
title object 标题
is_paid bool 课程是否付费
price float64 价格
headline object 课程内容摘要
num_subscribers float64 订阅者数量
avg_rating float64 网站上显示的平均评分
num_reviews float64 评论次数
num_comments float64 评论数
num_lectures float64 讲座数
content_length_min float64 内容长度
published_time object 发布时间
last_update_date object 最后更新时间
category object 类别
subcategory object 子类别
topic object 排名
language object 语言
course_url object 课程地址
instructor_name object 讲师姓名
instructor_url object 讲师地址

                                   评论:

字段名称 字段类型 字段说明
id int64 id
course_id int64 课程id
rate float64 评分
date object 日期
display_name object 显示的昵称
comment object 评论

 

2.数据分析的课程设计方案概述

(1)首先导入模块读取数据

(2)数据清洗填充缺失值

(3)对数据集每一种数据关系进行python可视化处理,直观的展现出Udemy的课程情况以及大家的评价的分布是怎么样的

三、数据分析步骤

1.数据源

本次课程设计的数据集来源于Kaggle国外数据集网站进行采集

附上网址:https://www.kaggle.com/

2.导入模块 读取数据

 1 import pandas as pd
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 import seaborn as sns
 5 import plotly
 6 import plotly.express as px
 7 import matplotlib.ticker as ticker
 8 import ast
 9 
10 plotly.offline.init_notebook_mode (connected = True)
11 
12 class color:
13     BOLD = '\033[1m'
14     END = '\033[0m'
15 
16 
17 courses = pd.read_csv("Course_info.csv")
18 
19 print(courses.info())

显示结果

 

 数据字列的统计信息

1 courses.describe().transpose()

 

1 courses.head()

 

 3.数据清洗 填充缺失值

1 print(color.BOLD + 'Missing values - Count: \n' + color.END)
2 print(courses.isnull().sum())
3 print('--'*20)
4 
5 print(color.BOLD + 'Missing values - Percentage: \n' + color.END)
6 print(round(courses.isnull().mean() * 100, 2)) 

显示结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4.价格分配 绘制直方图

1 plt.rcParams['font.sans-serif'] = [u'SimHei']
2 plt.rcParams['axes.unicode_minus'] = False
3 fig, ax = plt.subplots(figsize=(10,6), dpi=100)
4 sns.histplot(data=courses, x='price', bins=75)
5 plt.xlabel("Price ($)")
6 plt.title("Udemy课程价格分布")

显示结果

显示各类价格分布的方框图

1 plt.figure(figsize=(8,5), dpi=100)
2 sns.boxplot(data=courses, x='price', y='category')

免费或付费课程-柱状图

 1 fig, ax = plt.subplots(figsize=(7,5), dpi=100)
 2 ax = sns.countplot(data=courses, x='is_paid', palette='magma_r')
 3 ax.set_xticklabels(labels=['免费', '付费'])
 4 ax.set_xlabel("Free/Paid courses")
 5 ax.set_ylabel("Number of courses")
 6 ax.set_title("Udemy上免费和付费课程的份额")
 7 percentage = round(courses['is_paid'].value_counts() * 100 /len(courses), 2)
 8 patches = ax.patches
 9 for i in range(len(patches)):
10    x = patches[i].get_x() + patches[i].get_width()/2
11    y = patches[i].get_height()+.05
12    ax.annotate('{:.2f}%'.format(percentage[i]), (x, y), ha='center')

 

 

 上面的图表显示了Udemy课程的价格分布以及类别分布(方框图)。大多数课程的定价在0到200美元之间。并非所有课程都属于付费课程。大约有21738门课程是免费提供的,而187996门课程则需要付费购买。对于付费课程类别,近20%的课程以19.99美元出售,约8.34%的课程以199.99美元出售。免费和付费课程的份额在下面的seaborn计数图中可见。总的来说,大约10%的课程是免费的,剩下的课程(89.64%)需要购买

 不同语言课程数的计数图

1 plt.figure(figsize=(16, 8), dpi=120)
2 sns.countplot(data=courses, x='language', order=courses['language'].value_counts().index, palette='magma')
3 plt.xlabel("")
4 plt.ylabel("每种语言的课程数量")
5 plt.title("不同语言提供的Udemy课程")
6 plt.xticks(rotation=90);

 

 

 根据课程数据集,有79种语言提供Udemy课程。英语(59%)、葡萄牙语(8.8%)和西班牙语(8.3%)是Udemy上排名前三的语言。提供课程的前15种语言如下图所示:

 

1 share_of_languages_top_15 = round(courses['language'].value_counts() * 100 / len(courses), 2)[:15]
2 
3 
4 fig = px.pie(share_of_languages_top_15, values=share_of_languages_top_15.values, 
5              names=share_of_languages_top_15.index, hole=0.25,
6             )
7 fig.update_traces(textposition='inside', texttemplate = '%{label}<br>%{value}%', rotation=150)
8 fig.update_layout(title_text='Top 15 languages in which courses are offered', title_x=0.5, showlegend=False)
9 fig.show()

 

 

每个类别的课程数量

1 plt.figure(figsize=(10, 6), dpi=100)
2 sns.countplot(data=courses, y='category', order=courses['category'].value_counts().sort_values(ascending=False).index, palette='magma')
3 plt.xlabel("课程数量")
4 plt.ylabel("")
5 plt.title("每个类别提供的课程数量");

 每个类别中的订阅用户数量

 

1 category_subs = courses.groupby('category')['num_subscribers'].agg('sum').sort_values(ascending=False)
2 fig, ax = plt.subplots(figsize=(10, 6), dpi=100)
3 sns.barplot(y=category_subs.index, x=category_subs.values, palette='magma', ci=0)
4 ax.set_xlabel("订户数量")
5 ax.set_ylabel("")
6 ax.xaxis.set_major_formatter(ticker.EngFormatter())
7 ax.set_title("每个类别的订户数量");

 由此我们可以了解Udemy 课程分为13个类别,然后将这些类别进一步分为130个子类别。有3818个独特的主题,提供不同的课程。发展类课程数量最多(31643门),其次是IT与软件(30479门)和教学与学术(26293门)。类别“开发”也因拥有最高用户数量(约2.13亿)而位居榜首,其次是IT和软件(1.06亿)和商业(7000万)

评论次数最多的前5门课程

1 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
2 
3 def top5_courses(df, col):
4     top5_df = df.nlargest(5, col).reset_index(drop=True)
5     return top5_df[my_cols]
6 top5_courses(courses, 'num_reviews')

 

 

 订阅人数最多的前5名课程

1 top5_courses(courses, 'num_subscribers')

 

 评论最多的前5门课程

1 top5_courses(courses, 'num_comments')

 

 价格最贵的Udemy课程

1 top5_courses(courses, 'price')

 

 

子类别级数据可视化

 1 courses_subcat_df = courses.groupby(['category'])['subcategory'].value_counts().to_frame()
 2 courses_subcat_df.columns = ['number of courses']
 3 courses_subcat_df = courses_subcat_df.reset_index()
 4 
 5 subscribers_subcat_df = courses.groupby(['category', 'subcategory'])['num_subscribers'].sum().to_frame()
 6 subscribers_subcat_df.columns = ['number of subscribers']
 7 subscribers_subcat_df = subscribers_subcat_df.reset_index()
 8 
 9 
10 fig = px.sunburst(courses_subcat_df, path=['category', 'subcategory'],
11 values='number of courses', color='category',
12 color_continuous_scale='RdBu', width=600, height=600)
13 fig.update_layout(title_text='Number of courses offered in different subcategories', title_x=0.5)
14 fig.show()
15 
16 
17 fig = px.sunburst(subscribers_subcat_df, path=['category', 'subcategory'], values='number of subscribers',
18 color_continuous_scale='RdBu', width=600, height=600)
19 fig.update_layout(title_text='Number of subscribers in different subcategories', title_x=0.5)
20 fig.show()

显示结果

 已经知道,“开发”类别拥有最高的用户数(约2.13亿)。在“开发”类别下,“Web开发”和“编程语言”等子类别的用户分别为7660万和5850万。sunburst图表显示了不同类别的每个子类别级别的课程数量和订阅人数。音乐类别的用户数量最少(约850万),乐器类别的用户最多(约390万)

教师收入前10

1 courses['earnings_$'] =  courses['price'] * courses['num_subscribers']
2 
3 instructor_earnings = pd.DataFrame(courses.groupby('instructor_name')['earnings_$'].sum().round(2))
4 instructor_earnings = instructor_earnings.sort_values(by='earnings_$', ascending=False)
5 instructor_earnings['earnings_$'] = instructor_earnings['earnings_$'].apply(lambda x: "{:,}".format(x))
6 
7 
8 print(color.BOLD + 'Top 10 instructors with their earnings in $:' + color.END)
9 instructor_earnings.head(10)

Udemy平台上有72731名讲师。讲师的总收入是通过乘以“价格”和“数字订阅者”列来计算的。以上数据框显示了收入排名前十的讲师。请注意,在计算收益时,不考虑提供的折扣和优惠券,因为它们的信息不可用

5.全年数据可视化

 1 courses['published_time'] = pd.to_datetime(courses['published_time'].str[0:10])
 2 courses['published_year'] = courses['published_time'].dt.year
 3 courses['published_month'] = courses['published_time'].dt.month_name()
 4 
 5 # Group the year column and perform operations for data visualization
 6 courses_year_count = courses['published_year'].value_counts()
 7 
 8 courses_num_subs = courses.groupby('published_year')['num_subscribers'].sum()
 9 
10 courses_num_reviews = courses.groupby('published_year')['num_reviews'].sum()
11 
12 courses_num_comments = courses.groupby('published_year')['num_comments'].sum()
13 
14 courses_num_lectures = courses.groupby('published_year')['num_lectures'].sum()
15 
16 group_courses_year = pd.pivot_table(courses, index='published_year', 
17                                values=['id', 'num_subscribers', 'num_reviews', 'num_comments', 'num_lectures'], 
18                                aggfunc={'id': len, 'num_subscribers': np.sum, 'num_reviews':np.sum, 
19                                         'num_comments':np.sum, 'num_lectures':np.sum})
20 
21 print(color.BOLD + 'Year-wise count and sum values for different features:' + color.END)
22 group_courses_year

 

 

 

 年度特征数据可视化

 1 dict_cols = dict({'id': 'Number of courses published', 'num_subscribers': 'Total subscribers', 
 2                   'num_comments': 'Total comments', 'num_reviews': 'Total reviews',
 3                  'num_lectures': 'Total lectures'})
 4 
 5 for key, val in dict_cols.items():
 6     df = group_courses_year
 7     fig, ax = plt.subplots(figsize=(8,5), dpi=100)
 8     sns.barplot(data=df, x=df.index, y=df[key], palette='magma')
 9     ax.set_xlabel("Year")
10     ax.set_ylabel(val)
11     ax.set_title(f'{val} per year')
12     ax.yaxis.set_major_formatter(ticker.EngFormatter());

年度发布的课程数量:

 

 

 

 

 

 

 

 

 

 

 

 

 6.Comments数据集

1 comments = pd.read_csv("Comments.csv")
2 comments.info()

comments.head()

 清洗数据 填充缺失值

1 print(color.BOLD + 'Number of missing values:' + color.END)
2 print(comments.isnull().sum())
3 print("---"*20)
4 print(color.BOLD + 'Percentage of missing values:' + color.END)
5 print(round(comments.isnull().mean() * 100, 2))

 根据课程评分创建名为“review”的新列

通过查看注释数据帧的示例,rate列和comments列是相关的。现在,我们基于comments数据帧中的rate列创建一个新标签。比率值介于0.5和5.0之间。如果比率值大于3.0,则新标签review为正值,如果比率等于3.0,则为中性。否则,review为负值。这个新变量可以用作分类目的的目标标签

1 comments = comments.dropna(axis=0).reset_index(drop=True)
2 
3 dict_id = dict(zip(courses['id'], courses['title']))
4 comments['course_title'] = comments['course_id'].map(dict_id)
5 
6 comments['review'] = pd.cut(comments['rate'], bins=[0, 2.5, 3.0, 5.0], labels=['Negative', 'Neutral', 'Positive'])
7 comments.head()

显示结果

 

 对于分类问题,将考虑评论栏和审查目标标签。本节的主要目标是分析用户的评论,然后确定评论的语言。需要过滤注释列,因为它包含几个特殊字符、符号和表情符号

 1 comments['comment'] = comments['comment'].str.replace("\n", " ")
 2 
 3 spl_ch = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '=', '_', '+'
 4          '[', ']', '{', '}', '|', ':', '"', ';', "'", ',', '.', '/', '<', '>', '`', '~', '?']
 5 
 6 for ch in spl_ch:
 7     comments = comments[comments['comment'] != ch]
 8     
 9 comments = comments.reset_index(drop=True)
10 comments = comments[~comments['comment'].str.isdigit()].reset_index(drop=True)

总结:

借助数据分析工具对与Udemy课程和评论相关的两个数据集进行了调查。对于这两个数据集,分析特征之间的关系,并从现有特征创建新列。以下是所执行分析的总结:


近20%的课程定价为19.99美元。在全部课程中,约10%的课程是免费的。


课程以79种语言提供,59%的课程以英语授课。


“发展”类别的课程和订阅人数最多。


从评论数据集分析中,约91%的评论对课程持肯定态度,5%的评论持否定态度,其余评论持中立态度。


英语是发表评论的首选语言。其次是西班牙语和葡萄牙语。

 

2020年,Udemy上发布的评论数量达到了最高值。

7.完整代码:

  1 ##导入模块 读取数据
  2 import pandas as pd
  3 import numpy as np
  4 import matplotlib.pyplot as plt
  5 import seaborn as sns
  6 import plotly
  7 import plotly.express as px
  8 import matplotlib.ticker as ticker
  9 import ast
 10 
 11 plotly.offline.init_notebook_mode (connected = True)
 12 
 13 class color:
 14     BOLD = '\033[1m'
 15     END = '\033[0m'
 16 
 17 
 18 courses = pd.read_csv("Course_info.csv")
 19 
 20 print(courses.info())
 21 
 22 ##数据字列的统计信息
 23 courses.describe().transpose()
 24 courses.head()
 25 
 26 ##数据清洗 填充缺失值
 27 print(color.BOLD + 'Missing values - Count: \n' + color.END)
 28 print(courses.isnull().sum())
 29 print('--'*20)
 30 
 31 print(color.BOLD + 'Missing values - Percentage: \n' + color.END)
 32 print(round(courses.isnull().mean() * 100, 2))
 33 
 34 ##价格分布
 35 plt.rcParams['font.sans-serif'] = [u'SimHei']
 36 plt.rcParams['axes.unicode_minus'] = False
 37 fig, ax = plt.subplots(figsize=(10,6), dpi=100)
 38 sns.histplot(data=courses, x='price', bins=75)
 39 plt.xlabel("Price ($)")
 40 plt.title("Udemy课程价格分布");
 41 
 42 ##显示各类价格分布的方框图
 43 plt.figure(figsize=(8,5), dpi=100)
 44 sns.boxplot(data=courses, x='price', y='category')
 45 
 46 ##免费或付费课程-Countplot
 47 fig, ax = plt.subplots(figsize=(7,5), dpi=100)
 48 ax = sns.countplot(data=courses, x='is_paid', palette='magma_r')
 49 ax.set_xticklabels(labels=['免费', '付费'])
 50 ax.set_xlabel("Free/Paid courses")
 51 ax.set_ylabel("Number of courses")
 52 ax.set_title("Udemy上免费和付费课程的份额")
 53 percentage = round(courses['is_paid'].value_counts() * 100 /len(courses), 2)
 54 patches = ax.patches
 55 for i in range(len(patches)):
 56    x = patches[i].get_x() + patches[i].get_width()/2
 57    y = patches[i].get_height()+.05
 58    ax.annotate('{:.2f}%'.format(percentage[i]), (x, y), ha='center')
 59 
 60 ##不同语言课程数的计数图
 61 plt.figure(figsize=(16, 8), dpi=120)
 62 sns.countplot(data=courses, x='language', order=courses['language'].value_counts().index, palette='magma')
 63 plt.xlabel("")
 64 plt.ylabel("每种语言的课程数量")
 65 plt.title("不同语言提供的Udemy课程")
 66 plt.xticks(rotation=90);
 67 
 68 ##排名前三的语言
 69 share_of_languages_top_15 = round(courses['language'].value_counts() * 100 / len(courses), 2)[:15]
 70 
 71 
 72 fig = px.pie(share_of_languages_top_15, values=share_of_languages_top_15.values, 
 73              names=share_of_languages_top_15.index, hole=0.25,
 74             )
 75 fig.update_traces(textposition='inside', texttemplate = '%{label}<br>%{value}%', rotation=150)
 76 fig.update_layout(title_text='Top 15 languages in which courses are offered', title_x=0.5, showlegend=False)
 77 fig.show()
 78 
 79 ##每个类别的课程数量
 80 plt.figure(figsize=(10, 6), dpi=100)
 81 sns.countplot(data=courses, y='category', order=courses['category'].value_counts().sort_values(ascending=False).index, palette='magma')
 82 plt.xlabel("课程数量")
 83 plt.ylabel("")
 84 plt.title("每个类别提供的课程数量");
 85 
 86 ##每个类别中的订户数量
 87 category_subs = courses.groupby('category')['num_subscribers'].agg('sum').sort_values(ascending=False)
 88 
 89 # Bar plot to diplay number of subscribers across categories
 90 fig, ax = plt.subplots(figsize=(10, 6), dpi=100)
 91 sns.barplot(y=category_subs.index, x=category_subs.values, palette='magma', ci=0)
 92 ax.set_xlabel("订户数量")
 93 ax.set_ylabel("")
 94 ax.xaxis.set_major_formatter(ticker.EngFormatter())
 95 ax.set_title("每个类别的订户数量");
 96 
 97 ##评论次数最多的前5门课程
 98 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
 99 def top5_courses(df, col):
100     top5_df = df.nlargest(5, col).reset_index(drop=True)
101     return top5_df[my_cols]
102 top5_courses(courses, 'num_reviews')
103 
104 ##订阅人数最多的前5名课程
105 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
106 def top5_courses(df, col):
107     top5_df = df.nlargest(5, col).reset_index(drop=True)
108     return top5_df[my_cols]
109 top5_courses(courses, 'num_subscribers')
110 
111 ##评论最多的前5门课程
112 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
113 def top5_courses(df, col):
114     top5_df = df.nlargest(5, col).reset_index(drop=True)
115     return top5_df[my_cols]
116 top5_courses(courses, 'num_comments')
117 
118 ##内容长度最高的前5门课程
119 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
120 def top5_courses(df, col):
121     top5_df = df.nlargest(5, col).reset_index(drop=True)
122     return top5_df[my_cols]
123 top5_courses(courses, 'content_length_min')
124 
125 ##价格最贵的Udemy课程
126 my_cols = ['title', 'instructor_name', 'price', 'num_reviews', 'num_subscribers', 'num_comments', 'content_length_min']
127 def top5_courses(df, col):
128     top5_df = df.nlargest(5, col).reset_index(drop=True)
129     return top5_df[my_cols]
130 top5_courses(courses, 'price')
131 
132 ##子类别级数据可视化
133 courses_subcat_df = courses.groupby(['category'])['subcategory'].value_counts().to_frame()
134 courses_subcat_df.columns = ['number of courses']
135 courses_subcat_df = courses_subcat_df.reset_index()
136 
137 subscribers_subcat_df = courses.groupby(['category', 'subcategory'])['num_subscribers'].sum().to_frame()
138 subscribers_subcat_df.columns = ['number of subscribers']
139 subscribers_subcat_df = subscribers_subcat_df.reset_index()
140 
141 fig = px.sunburst(courses_subcat_df, path=['category', 'subcategory'], 
142                   values='number of courses', color='category',
143                   color_continuous_scale='RdBu', width=600, height=600)
144 fig.update_layout(title_text='Number of courses offered in different subcategories', title_x=0.5)
145 fig.show()
146 
147 fig = px.sunburst(subscribers_subcat_df, path=['category', 'subcategory'], values='number of subscribers',
148                   color_continuous_scale='RdBu', width=600, height=600)
149 fig.update_layout(title_text='Number of subscribers in different subcategories', title_x=0.5)
150 fig.show()
151 
152 ##教师收入
153 courses['earnings_$'] =  courses['price'] * courses['num_subscribers']
154 instructor_earnings = pd.DataFrame(courses.groupby('instructor_name')['earnings_$'].sum().round(2))
155 instructor_earnings = instructor_earnings.sort_values(by='earnings_$', ascending=False)
156 instructor_earnings['earnings_$'] = instructor_earnings['earnings_$'].apply(lambda x: "{:,}".format(x))
157 
158 print(color.BOLD + 'Top 10 instructors with their earnings in $:' + color.END)
159 instructor_earnings.head(10)
160 
161 ##全年数据可视化
162 courses['published_time'] = pd.to_datetime(courses['published_time'].str[0:10])
163 courses['published_year'] = courses['published_time'].dt.year
164 courses['published_month'] = courses['published_time'].dt.month_name()
165 
166 # Group the year column and perform operations for data visualization
167 courses_year_count = courses['published_year'].value_counts()
168 
169 courses_num_subs = courses.groupby('published_year')['num_subscribers'].sum()
170 
171 courses_num_reviews = courses.groupby('published_year')['num_reviews'].sum()
172 
173 courses_num_comments = courses.groupby('published_year')['num_comments'].sum()
174 
175 courses_num_lectures = courses.groupby('published_year')['num_lectures'].sum()
176 
177 group_courses_year = pd.pivot_table(courses, index='published_year', 
178                                values=['id', 'num_subscribers', 'num_reviews', 'num_comments', 'num_lectures'], 
179                                aggfunc={'id': len, 'num_subscribers': np.sum, 'num_reviews':np.sum, 
180                                         'num_comments':np.sum, 'num_lectures':np.sum})
181 
182 print(color.BOLD + 'Year-wise count and sum values for different features:' + color.END)
183 group_courses_year
184 
185 ##年度特征数据可视化
186 dict_cols = dict({'id': 'Number of courses published', 'num_subscribers': 'Total subscribers', 
187                   'num_comments': 'Total comments', 'num_reviews': 'Total reviews',
188                  'num_lectures': 'Total lectures'})
189 
190 for key, val in dict_cols.items():
191     df = group_courses_year
192     fig, ax = plt.subplots(figsize=(8,5), dpi=100)
193     sns.barplot(data=df, x=df.index, y=df[key], palette='magma')
194     ax.set_xlabel("Year")
195     ax.set_ylabel(val)
196     ax.set_title(f'{val} per year')
197     ax.yaxis.set_major_formatter(ticker.EngFormatter());
198 
199 ##评论数据集
200 import pandas as pd
201 import numpy as np
202 import matplotlib.pyplot as plt
203 import seaborn as sns
204 import plotly
205 import plotly.express as px
206 import matplotlib.ticker as ticker
207 import ast
208 
209 plotly.offline.init_notebook_mode (connected = True)
210 
211 class color:
212     BOLD = '\033[1m'
213     END = '\033[0m'
214 
215 comments = pd.read_csv("Comments.csv")
216 comments.info()
217 comments.head()
218 
219 ##清洗数据 填充缺失值
220 print(color.BOLD + 'Number of missing values:' + color.END)
221 print(comments.isnull().sum())
222 print("---"*20)
223 print(color.BOLD + 'Percentage of missing values:' + color.END)
224 print(round(comments.isnull().mean() * 100, 2))
225 comments = comments.dropna(axis=0).reset_index(drop=True)
226 
227 dict_id = dict(zip(courses['id'], courses['title']))
228 comments['course_title'] = comments['course_id'].map(dict_id)
229 
230 ##好评率
231 comments['review'] = pd.cut(comments['rate'], bins=[0, 2.5, 3.0, 5.0], labels=['Negative', 'Neutral', 'Positive'])
232 comments.head()
233 
234 ##过滤注释列
235 comments['comment'] = comments['comment'].str.replace("\n", " ")
236 
237 spl_ch = ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '=', '_', '+'
238          '[', ']', '{', '}', '|', ':', '"', ';', "'", ',', '.', '/', '<', '>', '`', '~', '?']
239 
240 for ch in spl_ch:
241     comments = comments[comments['comment'] != ch]
242     
243 comments = comments.reset_index(drop=True)
244 comments = comments[~comments['comment'].str.isdigit()].reset_index(drop=True)

 

标签:数据分析,num,df,comments,udemy,courses,课程,subscribers
From: https://www.cnblogs.com/fish-seven/p/17001667.html

相关文章

  • 天猫商品数据分析
    一、选题的背景随着互联网与电商平台的发展,网上购物正成为国内消费者购物的重要方式。在重要的电商平台淘宝中,用户通过浏览商品详情页、收藏、加购或直接购买等方式来进行......
  • 大数据分析——景点数据分析
    一、选题背景随着我国经济、科技的不断发展和人民生活水平的不断提高,旅游逐渐成为社会的主要经济部门。旅游这项活动在伴随着经济社会的发展同时应运而生,它本质上是一种社......
  • Python网络爬虫—对京东口红销售的数据分析
    一、选题的背景 对电商来说,抓取某些数据,再进行分析,可以有效地反映出数据在某个区间内变化情况。数据受某些因素而发生巨大的影响,也可以借助分析的数据来规划相关项目的后......
  • 数据分析——近年倒闭公司数据分析
    一、选题背景原因:应届毕业生毕业找工作就是一个很大的选择。在即将找工作的这个时间段,就业公司的前景也很重要。所以将分析倒闭公司的情况作为选题。目标:分析每年倒闭公......
  • 淘宝双12购物数据分析
    一、选题的背景随着社会的发展,数据化时代,线上购物比例增幅巨大,各种的线上购物节,6.18、双十一、双十二等等。因此分析双十二活动日时段各行为数量的走势和对比,以及活动......
  • Python网络爬虫——福州小区信息的抓取和数据分析
    一、选题的背景为了能够充分了解福州当地小区的房价信息,并能够充分了解小区的位置,为每个人不同的需求,选择不同价位的房源,并通过其成交量进行参考和选择,以及剩余量爬取的信......
  • 大数据分析——我国近十年的人口比率分析
    选题背景近年来,我国人口总量惯性增长,人口增速有所放缓。与之前相比,人口老龄化加速,人口数量红利进入尾声。当前我国人口的特征是高龄少子,适龄人口生育意愿显著下降,人口老龄......
  • python数据分析练习
    第一部分:数据类型处理数据加载字段含义:user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额df=pd.read_csv('../data/CDN......
  • 关于Gmail电子邮件使用情况数据分析
    关于Gmail电子邮件使用数据分析一、选题背景    随着时代的快速发展,互联网越来越发达,越来越多的人们开始抛弃传统的书信邮件,改用了电子邮件。电子邮件有很多的优......
  • 对美国心脏病数据集进行大数据分析
    一、选题背景    本数据来源于美国2020年40万成年人与其健康状况相关的CDC年度调查数据。心脏病是美国大多数种族(非洲裔美国人、美洲印第安人和阿拉斯加原住......