以上为英国与美国Youtube数据,其每列对应的是:点击,喜欢,不喜欢,评论GB_video_data_numbers.csv US_video_data_numbers.csv
练习1
#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。—直方图
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/28 22:23
#@Author : GodSpeed
#@File : Numpy05次作业01.py
#@Software : PyCharm
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
'''
以上为英国与美国Youtube数据,其每列对应的是:点击,喜欢,不喜欢,评论
GB_video_data_numbers.csv US_video_data_numbers.csv
'''
#练习1
#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。
# 分析: 直方图是用来整理计量值bai的观测数据,分析其分布状态的统计方法
#按照评论数列绘制直方图,推断分布
def draw_comments_histogram(file_name,draw_name,color):
# 1.获取评论数据(评论数据为最后一列)
np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
print(np_arr)
np_arr_data = np_arr[:,3]
#comments_list = np_arr[:,3].tolist() # 提高效率的角度,这里不用转换List了
# 2. 绘制直方图
# 2.1 计算极差
# 用截取的方法去过滤太离散的数据
diff_comments = np_arr_data.ptp()
print(diff_comments)
#np_arr_data = np_arr_data[np_arr_data<30000]
#3.计算组数
g_distance = 25000
g_num = round(diff_comments)//g_distance # 注意组数必须为整数,不能为小数
print ( 'g_num = ',g_num )
plt.xlabel( '评论数' )
plt.ylabel( '频数' )
plt.title ( draw_name )
# 绘制直方图
plt.hist ( np_arr_data, bins=g_num,color=color, alpha=0.7, rwidth=0.9 ) # 频率图 增加density
plt.grid ( axis='y', alpha=0.7 )
plt.show()
if __name__ == '__main__':
# 绘制直方图
draw_comments_histogram ( 'GB_video_data_numbers.csv', '英国评论数量分布分析' ,'g')
分析不足:
数据源研究对象需要调整范围,充分保留有效数据:从直方图效果明显看出,数据源分布几乎总体分布到0到10000之间,10000 到 1000000几乎没有数据。
应对方法:
可以对数据源numpy数组采用布尔索引法来实现有效范围的截取,因此对函数中增加:
#练习1
#结合Matplotlib绘制各自的评论数量的图形,体现其评论数主要分布在哪个区间。
# 分析: 直方图是用来整理计量值bai的观测数据,分析其分布状态的统计方法
#按照评论数列绘制直方图,推断分布
def draw_comments_histogram(file_name,draw_name,color):
# 1.获取评论数据(评论数据为最后一列)
np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
#print(np_arr)
print ( np_arr.shape )
# 增加有效数据的截取
#np_arr = np_arr[np_arr<(10000)] #报错,这样就变成一维数组了
np_arr = np_arr[np_arr[:,3] < (10000)]
print(np_arr)
print ( np_arr.shape )
np_arr_data = np_arr[:,3]
#comments_list = np_arr[:,3].tolist() # 提高效率的角度,这里不用转换List了
# 2. 绘制直方图
# 2.1 计算极差
# 用截取的方法去过滤太离散的数据
diff_comments = np_arr_data.ptp()
print(diff_comments)
#np_arr_data = np_arr_data[np_arr_data<30000]
#3.计算组数
#调整组距
#g_distance = 25000
g_distance = 1000
g_num = round(diff_comments)//g_distance # 注意组数必须为整数,不能为小数
print ( 'g_num = ',g_num )
plt.xlabel( '评论数' )
plt.ylabel( '频数' )
plt.title ( draw_name )
# 绘制直方图
plt.hist ( np_arr_data, bins=g_num,color=color, alpha=0.7, rwidth=0.9 ) # 频率图 增加density
plt.grid ( axis='y', alpha=0.7 )
#调整刻度方法1:
#x_t = [i for i in range ( 0, 10500, 500 )]
#plt.xticks ( x_t, rotation=45 ) # 调整刻度
#调整刻度方法2:
# 把x轴的刻度间隔设置为500,并存在变量里
x_major_locator = MultipleLocator ( 500)
# ax为两条坐标轴的实例
ax = plt.gca ()
# 把x轴的主刻度设置为500的倍数
ax.xaxis.set_major_locator ( x_major_locator )
# 把x轴的刻度范围设置为0到10000
plt.xlim ( 0, 10000)
plt.xticks(rotation=45 )
plt.show ()
if __name__ == '__main__':
# 绘制直方图
draw_comments_histogram ( 'GB_video_data_numbers.csv', '英国评论数量分布分析' ,'g')
draw_comments_histogram ( 'US_video_data_numbers.csv', '美国评论数量分布分析' ,'r')
练习2
绘制图形,分析英国的Youtube中视频的评论数与喜欢数的关系。(注意预测分布要用散点图,而不是折线图)
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/29 00292:02
#@Author : GodSpeed
#@File : Numpy05次作业02.py
#@Software : PyCharm
'''
# 散点图
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
'''
def en_scatter_comments_liks(file_name):
#1.用np读取csv数据,赋值np.ndarrage返回
np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
comments_np = np_arr[:, 3]
likes_np = np_arr[:, 1]
#2.绘制直方图 plt.hist
plt.figure ( figsize=(8, 6) )
plt.xticks ( rotation=45 ) # x轴旋转45
plt.scatter ( comments_np, likes_np) # 绘制散点图
plt.xlabel ( "评论数" ) # 设置x轴标签
plt.ylabel ( '喜欢数' ) # 设置y轴标签
plt.title ( '评论数与喜欢数变化趋势图' ) # 设置图标题
plt.grid () # 根据x轴和y轴的数值展示轴网格
plt.draw ()
plt.savefig ( '第5节课作业01.png' ) # 保存图片
plt.show ()
if __name__ == '__main__':
en_scatter_comments_liks ( 'GB_video_data_numbers.csv')
分析:
从散点图中看出100000以后,数据非常少,因此考虑用条件索引缩小观测研究范围。
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/29 00292:02
#@Author : GodSpeed
#@File : Numpy05次作业02.py
#@Software : PyCharm
# 散点图
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
from matplotlib import pyplot as plt
import random
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
'''
练习2
绘制图形,分析英国的Youtube中视频的评论数与喜欢数的关系。(注意预测分布要用散点图,而不是折线图)
'''
def en_scatter_comments_liks(file_name):
#1.用np读取csv数据,赋值np.ndarrage返回
np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
np_arr = np_arr[np_arr[:, 3]<100000]
comments_np = np_arr[:, 3]
likes_np = np_arr[:, 1]
#2.绘制直方图 plt.hist
plt.figure ( figsize=(8, 6) )
plt.xticks ( rotation=45 ) # x轴旋转45
plt.scatter ( comments_np, likes_np) # 绘制散点图
# 把x轴的刻度间隔设置为500,并存在变量里
x_major_locator = MultipleLocator ( 500 )
# ax为两条坐标轴的实例
ax = plt.gca ()
# 把x轴的主刻度设置为500的倍数
ax.xaxis.set_major_locator ( x_major_locator )
# 把x轴的刻度范围设置为0到10000
plt.xlim ( 0, 11000 )
plt.xticks ( rotation=45 )
plt.xlabel ( "评论数" ) # 设置x轴标签
plt.ylabel ( '喜欢数' ) # 设置y轴标签
plt.title ( '评论数与喜欢数变化趋势图' ) # 设置图标题
plt.grid () # 根据x轴和y轴的数值展示轴网格
plt.draw ()
plt.savefig ( '第5节课作业01.png' ) # 保存图片
plt.show ()
if __name__ == '__main__':
en_scatter_comments_liks ( 'GB_video_data_numbers.csv')
练习3
当希望将两个国家的数据拼接一起来研究分析。
拼接全为0的数组标识为英国
拼接全为1的数组标识为美国
将两个国家的数据拼接
#!/user/bin/env python
#-*-coding: utf-8-*-
#@Time : 2020/8/29 002913:09
#@Author : GodSpeed
#@File : Numpy05次作业03.py
#@Software : PyCharm
import numpy as np
'''
# 练习3
当希望将两个国家的数据拼接一起来研究分析。
• 拼接全为0的数组标识为英国
• 拼接全为1的数组标识为美国
• 将两个国家的数据拼接
'''
#实现自定义水平拼接一列全0或是全1,返回拼接后的arr
def hstack_def_v(file_name,v_1_0):
np_arr = np.loadtxt ( file_name, delimiter=",", dtype=int, skiprows=0 )
if v_1_0 == 0:
en_col0 = np.zeros ( (np_arr.shape[0], 1), dtype=int )
elif v_1_0 == 1:
en_col0 = np.ones ( (np_arr.shape[0], 1), dtype=int )
else:
print('v_1_0 的值必须为0或1')
return np.array([])
new_np_arr = np.hstack((en_col0,np_arr))
return new_np_arr
if __name__ == '__main__':
# GB_video_data_numbers
# 从csv中读取数据英国数据,返回给np_en_arr
new_np_en_arr = hstack_def_v ( 'GB_video_data_numbers.csv', 0)
# GB_video_data_numbers
# 从csv中读取数据英国数据,返回给np_en_arr
new_np_us_arr = hstack_def_v ( 'US_video_data_numbers.csv', 1 )
if new_np_en_arr.size != 0 and new_np_us_arr.size != 0:
#将两个国家的数据拼接
np_en_and_us_arr = np.vstack ( (new_np_en_arr, new_np_us_arr) )
print(np_en_and_us_arr)
运行结果:
[[ 0 7426393 78240 13548 705]
[ 0 494203 2651 1309 0]
[ 0 142819 13119 151 1141]
…
[ 1 142463 4231 148 279]
[ 1 2162240 41032 1384 4737]
[ 1 515000 34727 195 4722]]
小结:
1、数据分析首先要根据实际需求选对图形:如研究分布采用直方图,研究两个变量的关系用散点图。; 2、如果数据出现很多没价值的数据,或个别数据特别离散,可以采用布尔索引来缩小范围。. 3、数据分析一定要采用ndarray去操作,这样效率高,符合统计要求。. |