UFO长啥样?--Python数据分析来告诉你
前言
真心讲,长这么大,还没有见过UFO长啥样,偶然看到美国UFO报告中心有关于UFO时间记录的详细信息,突然想分析下这些记录里都包含了那些有趣的信息,于是有了这次的分析过程。
当然,原始数据包含的记录信息比较多,我只是进了了比较简单的分析,有兴趣的童鞋可以一起来分析,别忘了也给大家分享下您的分析情况哦。
本次分析的主要内容涉及以下几个方面:
- UFO长啥样?
- UFO在哪些地方出现的次数较多?
- UFO在哪些年份出现的次数较多?
- 热力图同时显示哪些州和哪些年UFO出现次数最多
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
% matplotlib inline
plt.style.use('ggplot')
1 数据整理与清洗
df = pd.read_csv('nuforc_events.csv')
print(df.shape) # 查看数据的结构
print(df.head())
(110265, 13)
Event_Time Event_Date Year Month Day Hour Minute \
0 2017-04-20T14:15:00Z 2017-04-20 2017.0 4.0 20.0 14.0 15.0
1 2017-04-20T04:56:00Z 2017-04-20 2017.0 4.0 20.0 4.0 56.0
2 2017-04-19T23:55:00Z 2017-04-19 2017.0 4.0 19.0 23.0 55.0
3 2017-04-19T23:50:00Z 2017-04-19 2017.0 4.0 19.0 23.0 50.0
4 2017-04-19T23:29:00Z 2017-04-19 2017.0 4.0 19.0 23.0 29.0
City State Shape Duration \
0 Palmyra NJ Other 5 minutes
1 Bridgeview IL Light 20 seconds
2 Newton AL Triangle 5 seconds
3 Newton AL Triangle 5-6 minutes
4 Denver CO Light 1 hour
Summary \
0 I observed an aircraft that seemed to look odd.
1 Bridgeview, IL, blue light. ((anonymous report))
2 Silent triangle UFO.
3 My friend and I stepped outside hoping to catc...
4 Moved slow but made quick turns staying and ci...
Event_URL
0 http://www.nuforc.org/webreports/133/S133726.html
1 http://www.nuforc.org/webreports/133/S133720.html
2 http://www.nuforc.org/webreports/133/S133724.html
3 http://www.nuforc.org/webreports/133/S133723.html
4 http://www.nuforc.org/webreports/133/S133721.html
- 由于存在许多包含NaN的数据信息,在进行分析之前,先用dropna()方法去除包含NaN的行数
df_clean = df.dropna()
print(df_clean.shape) # 查看去除Nan后还有多少行
print(df_clean.head())
(95004, 13)
Event_Time Event_Date Year Month Day Hour Minute \
0 2017-04-20T14:15:00Z 2017-04-20 2017.0 4.0 20.0 14.0 15.0
1 2017-04-20T04:56:00Z 2017-04-20 2017.0 4.0 20.0 4.0 56.0
2 2017-04-19T23:55:00Z 2017-04-19 2017.0 4.0 19.0 23.0 55.0
3 2017-04-19T23:50:00Z 2017-04-19 2017.0 4.0 19.0 23.0 50.0
4 2017-04-19T23:29:00Z 2017-04-19 2017.0 4.0 19.0 23.0 29.0
City State Shape Duration \
0 Palmyra NJ Other 5 minutes
1 Bridgeview IL Light 20 seconds
2 Newton AL Triangle 5 seconds
3 Newton AL Triangle 5-6 minutes
4 Denver CO Light 1 hour
Summary \
0 I observed an aircraft that seemed to look odd.
1 Bridgeview, IL, blue light. ((anonymous report))
2 Silent triangle UFO.
3 My friend and I stepped outside hoping to catc...
4 Moved slow but made quick turns staying and ci...
Event_URL
0 http://www.nuforc.org/webreports/133/S133726.html
1 http://www.nuforc.org/webreports/133/S133720.html
2 http://www.nuforc.org/webreports/133/S133724.html
3 http://www.nuforc.org/webreports/133/S133723.html
4 http://www.nuforc.org/webreports/133/S133721.html
- 由于1900年以前的数据较少,这里选择1900年以后的数据来进行分析,如下:
df_clean = df_clean[df_clean['Year']>=1900] # 获取1900年以后的数据来进行分析
- 查看导入的每列数据的数据类型,通过运行结果,可以看到,“Event_Date”列并不是日期类型,因此要将之转换。
- 可以采用pd.to_datetime()方法来操作
df_clean.dtypes
Event_Time object
Event_Date object
Year float64
Month float64
Day float64
Hour float64
Minute float64
City object
State object
Shape object
Duration object
Summary object
Event_URL object
dtype: object
- 用pd.to_datetime()方法来将str格式的日期转换成日期类型
pd.to_datetime(df_clean['Event_Date']) # 1061-12-31年不能显示
# OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1061-12-31 00:00:00
df_clean.dtypes
Event_Time object
Event_Date object
Year float64
Month float64
Day float64
Hour float64
Minute float64
City object
State object
Shape object
Duration object
Summary object
Event_URL object
dtype: object
2 UFO长啥样?
- 按UFO出现的形状类型来分析,统计不同类型的UFO出现的次数
s_shape = df_clean.groupby('Shape')['Event_Date'].count()
print(type(s_shape))
s_shape.sort_values(inplace=True)
s_shape
<class 'pandas.core.series.Series'>
Shape
Changed 1
Hexagon 1
Pyramid 1
Flare 1
Round 2
Crescent 2
Delta 7
Cross 287
Cone 383
Egg 842
Teardrop 866
Chevron 1187
Diamond 1405
Cylinder 1495
Rectangle 1620
Flash 1717
Cigar 2313
Changing 2378
Formation 3070
Oval 4332
Disk 5841
Sphere 6482
Other 6658
Unknown 6887
Fireball 7785
Triangle 9358
Circle 9818
Light 20254
Name: Event_Date, dtype: int64
剔除特殊情况
- 剔除出现次数少于10次的类型
- 剔除“Unknown”及“Other”类型
s_shape_normal = s_shape[s_shape.values>10]
s_shape_normal
Shape
Cross 287
Cone 383
Egg 842
Teardrop 866
Chevron 1187
Diamond 1405
Cylinder 1495
Rectangle 1620
Flash 1717
Cigar 2313
Changing 2378
Formation 3070
Oval 4332
Disk 5841
Sphere 6482
Other 6658
Unknown 6887
Fireball 7785
Triangle 9358
Circle 9818
Light 20254
Name: Event_Date, dtype: int64
s_shape_normal = s_shape_normal[s_shape_normal.index.isin(['Unknown', 'Other'])==False]
s_shape_normal
Shape
Cross 287
Cone 383
Egg 842
Teardrop 866
Chevron 1187
Diamond 1405
Cylinder 1495
Rectangle 1620
Flash 1717
Cigar 2313
Changing 2378
Formation 3070
Oval 4332
Disk 5841
Sphere 6482
Fireball 7785
Triangle 9358
Circle 9818
Light 20254
Name: Event_Date, dtype: int64
from matplotlib import font_manager as fm
from matplotlib import cm
labels = s_shape_normal.index
sizes = s_shape_normal.values
explode = (0.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.1) # "explode" , show the selected slice
fig, axes = plt.subplots(figsize=(10,5),ncols=2) # 设置绘图区域大小
ax1, ax2 = axes.ravel()
colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darks
patches, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.0f%%',explode=explode,
shadow=False, startangle=150, colors=colors, labeldistance=1.2,pctdistance=1.05, radius=0.95)
# labeldistance: 控制labels显示的位置
# pctdistance: 控制百分比显示的位置
# radius: 控制切片突出的距离
ax1.axis('equal')
# 重新设置字体大小
proptease = fm.FontProperties()
proptease.set_size('xx-small')
# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'
plt.setp(autotexts, fontproperties=proptease)
plt.setp(texts, fontproperties=proptease)
ax1.set_title('Shapes', loc='center')
# ax2 只显示图例(legend)
ax2.axis('off')
ax2.legend(patches, labels, loc='center left', fontsize=9)
# plt.tight_layout()
# plt.savefig("pie_shape_ufo.png", bbox_inches='tight')
plt.savefig('ufo_shapes.jpg')
plt.show()
运行结果如下:

3 UFO在美国那些州(state)出现的次数比较多?
按”State”进行分组运算,统计ufo在各个州出现的次数
s_state = df_clean.groupby('State')['Event_Date'].count()
print(type(s_state))
s_state.head()
<class 'pandas.core.series.Series'>
State
AB 438
AK 472
AL 930
AR 791
AZ 3488
Name: Event_Date, dtype: int64
将分析得到的结果进行可视化显示,如下:
fig, ax1 = plt.subplots(figsize=(12,8))
width = 0.5
state = s_state.index
x_pos1 = np.arange(len(state))
y1 = s_state.values
ax1.bar(x_pos1, y1,color='#4F81BD',align='center', width=width, label='Amounts', linewidth=0)
ax1.set_title('Amount of reporting UFO events by State ')
ax1.set_xlim(-1, len(state))
ax1.set_xticks(x_pos1)
ax1.set_xticklabels(state, rotation = -90)
ax1.set_ylabel('Amount')
fig.savefig('ufo_state.jpg')
plt.show()
运行结果如下:

从上图可看出,ufo在加州(CA)出现的总次数明显比其他地方多,难道是ufo偏爱加州人民?
4 UFO在哪些年份出现的次数较多?
按”Year”进行分组运算,统计ufo在各个年份出现的次数
# df_clean['Year'].astype(int)
s_year = df_clean.groupby(df_clean['Year'].astype(int))['Event_Date'].count()
print(type(s_year))
s_year.head()
<class 'pandas.core.series.Series'>
Year
1905 1
1910 2
1920 1
1925 1
1929 1
Name: Event_Date, dtype: int64
将分析得到的结果进行可视化显示,如下:
fig, ax = plt.subplots(figsize=(12,20))
# fig, ax1 = plt.subplots(figsize=(12,8))
# fig, axes = plt.subplots(nrows=2, figsize=(12,8))
# fig, axes = plt.subplots(ncols=2, figsize=(18,4))
year = s_year.index
y_pos = np.arange(len(year))
x_value = s_year.values
ax.barh(y_pos, x_value,color='#4F81BD',align='center', label='Amounts', linewidth=0)
ax.set_title('Amount of reporting UFO events by Year ')
ax.set_ylim(-0.5, len(year)-0.5)
ax.set_yticks(y_pos)
ax.set_yticklabels(year, rotation = 0, fontsize=6)
ax.set_xlabel('Amount')
plt.savefig('ufo_year.jpg')
plt.show()
运行结果如下:

从上图可看出,近年来UFO出现的报告次数最多
5 1997年以后的UFO事件分析
- 通过上述分析可看出,1997年以前,报告发现UFO的事件相对较少,下面将针对1997年以后的情况进行分析
df_97 = df_clean[(df_clean['Year']>=1997)]
df_97['Year'] = df_97['Year'].astype(int)
# df_97.astype({'Year':int})
print(df_97.shape)
print(df_97.head())
(86041, 13)
Event_Time Event_Date Year Month Day Hour Minute \
0 2017-04-20T14:15:00Z 2017-04-20 2017 4.0 20.0 14.0 15.0
1 2017-04-20T04:56:00Z 2017-04-20 2017 4.0 20.0 4.0 56.0
2 2017-04-19T23:55:00Z 2017-04-19 2017 4.0 19.0 23.0 55.0
3 2017-04-19T23:50:00Z 2017-04-19 2017 4.0 19.0 23.0 50.0
4 2017-04-19T23:29:00Z 2017-04-19 2017 4.0 19.0 23.0 29.0
City State Shape Duration \
0 Palmyra NJ Other 5 minutes
1 Bridgeview IL Light 20 seconds
2 Newton AL Triangle 5 seconds
3 Newton AL Triangle 5-6 minutes
4 Denver CO Light 1 hour
Summary \
0 I observed an aircraft that seemed to look odd.
1 Bridgeview, IL, blue light. ((anonymous report))
2 Silent triangle UFO.
3 My friend and I stepped outside hoping to catc...
4 Moved slow but made quick turns staying and ci...
Event_URL
0 http://www.nuforc.org/webreports/133/S133726.html
1 http://www.nuforc.org/webreports/133/S133720.html
2 http://www.nuforc.org/webreports/133/S133724.html
3 http://www.nuforc.org/webreports/133/S133723.html
4 http://www.nuforc.org/webreports/133/S133721.html
将数据按”Year”和”State”进行分组运算,如下:
df_amount_year = df_97.groupby(['Year', 'State'])['Event_Date'].size().reset_index()
df_amount_year.columns = ['Year', 'State', 'Amount']
print(df_amount_year.head())
Year State Amount
0 1997 AB 6
1 1997 AK 5
2 1997 AL 8
3 1997 AR 10
4 1997 AZ 127
import seaborn as sns
df_pivot = df_amount_year.pivot_table(index='State', columns='Year', values='Amount')
f, ax = plt.subplots(figsize = (10, 15))
cmap = sns.cubehelix_palette(start = 1, rot = 3, gamma=0.8, as_cmap = True)
sns.heatmap(df_pivot, cmap = cmap, linewidths = 0.05, ax = ax)
ax.set_title('Amounts per State and Year since Year 1997')
ax.set_xlabel('Year')
ax.set_ylabel('State')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
f.savefig('ufo_per_year_state.jpg')

- 上图中,颜色越深的地方,表示UFO事件报告的次数越多。
原始数据来源于美国的UFO事件报告中心。
更多精彩内容请关注公众号:
“Python数据之道”
UFO长啥样?--Python数据分析来告诉你的更多相关文章
- Python数据分析入门之pandas基础总结
Pandas--"大熊猫"基础 Series Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组...) Series1 = pd.Series(np.r ...
- 小白学 Python 数据分析(21):pyecharts 好玩的图表(系列终篇)
人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Pandas (一)概述 小白学 Python 数据分析(3):P ...
- [Python数据分析]新股破板买入,赚钱几率如何?
这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...
- 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化
继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...
- Python数据采集分析告诉你为何上海二手房你都买不起
感谢关注Python爱好者社区公众号,在这里,我们会每天向您推送Python相关的文章实战干货. 来吧,一起Python. 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的 ...
- Python数据分析入门
Python数据分析入门 最近,Analysis with Programming加入了Planet Python.作为该网站的首批特约博客,我这里来分享一下如何通过Python来开始数据分析.具体内 ...
- 零基础学习Python数据分析
网上虽然有很多Python学习的教程,但是大多是围绕Python网页开发等展开.数据分析所需要的Python技能和网页开发等差别非常大,本人就是浪费了很多时间来看这些博客.书籍.所以就有了本文,希望能 ...
- 《Python 数据分析》笔记——pandas
Pandas pandas是一个流行的开源Python项目,其名称取panel data(面板数据)与Python data analysis(Python 数据分析)之意. pandas有两个重要的 ...
- 【python数据分析实战】电影票房数据分析(二)数据可视化
目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...
随机推荐
- 【bzoj1593-预定旅馆】线段树维护连续区间
题解: 这题非常经典啊似乎..经典模型要记住啊.. 对于每个节点维护该区间里的最大的连续区间,然后我们就可以logn递归找最前面的一段. 那就维护mx(无限制),lmx(必须从左边开始),rmx(必须 ...
- Linux 中使用 dd 测试磁盘性能
翻译自 : Linux I/O Performance Tests using dd 基本说明 dd 可以用来做简单的低级别复制文件. 这样做, 一般都是可一直直接访问设备文件. 需要说明的是, 错误 ...
- R、Python、Scala和Java,到底该使用哪一种大数据编程语言?
有一个大数据项目,你知道问题领域(problem domain),也知道使用什么基础设施,甚至可能已决定使用哪种框架来处理所有这些数据,但是有一个决定迟迟未能做出:我该选择哪种语言?(或者可能更有针对 ...
- embed标签 阻止点击事件 让父元素处理点击事件
由于规定页面显示的PDF文件要有固定大小,使得页面风格统一 最开始发现了CSS样式pointer-events 写出如下代码,在360急速浏览器急速模式中访问可在点击PDF控件时可跳转页面 <a ...
- bASE--Risk
//参考base-4.0.2.jar public class Risk implements Serializable //规则名public String ruleName; //规则包名publ ...
- OSI与TCP/IP各层的结构与功能,都有哪些协议
前言: 今天更新一下计算机网络的一些非常重要的知识,可能很多人都不知学计算机网络有什么用,我想说的是它真的比较重要,像咱们学校只要是学计算机这个专业都要学习这门课程.另外大家要是去一些像BAT,阿里, ...
- linux c 执行新程序
学习进程时,linu c上说新开的进程一般要执行另外一个程序,同时与父进程执行同一个程序没有意义 如下是如何执行一个新的程序 使用exec函数簇 exec函数簇包含如下函数
- Java21个基础知识点
类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: (1) 装载:查找和导入Class文件: (2) 链接:把类的二进制 ...
- 1002: 当不成勇者的Water只好去下棋了---课程作业---图的填色
1002: 当不成勇者的Water只好去下棋了 Time Limit: 1 Sec Memory Limit: 128 MB Description 由于魔王BOSS躲起来了,说好要当勇者的Wate ...
- jQuery -《锋利的jQuery》————读后小结
jQuery是一个优秀的javascript库. 我用的是vs2012自带的 jquery-1.8.2.js这个库,在Scripts这个文件夹下面 首先,我们使用jQuery要在head标签内引入j ...