在数据科学和分析领域,Pandas库因其强大的数据处理能力而广受欢迎。它允许用户快速加载、处理、转换、分析和可视化数据。在使用Pandas时,需要记住两种主要的数据结构:Series和DataFrame。Series是一个一维索引数组,可以存储任何数据类型(如整数、浮点数等)。而DataFrame是Pandas的主要数据结构,它是一个二维数据类(具有行和列),每列可以有不同的数据类型。DataFrame也可以指定索引和附加列。
在进行数据分析之前,需要导入一些必要的包。以下是将在数据分析中使用的包:
import numpy as np # 线性代数库
import pandas as pd # 数据处理库
import seaborn as sns # 统计图形库
import matplotlib.pyplot as plt # 绘图库
import pandasql as ps # SQL库
import wordcloud # 用于生成词云图
from wordcloud import WordCloud, STOPWORDS # 可选,用于过滤停用词
将对Kaggle上公开发布的Reddit帖子数据集进行分析。这个数据集包含了随机Reddit帖子的信息。以下是如何读取数据集的代码:
df = pd.read_csv('r_dataisbeautiful_posts.csv')
df.sample(5)
df.tail(5)
print("数据集形状:", df.shape)
探索性数据分析(EDA)是快速查看数据集以帮助了解其结构、形式和大小的过程,同时寻找模式。以下是如何运行SQL语句以及一些常见的EDA命令:
df.info()
df.describe()
现在知道正在处理的DataFrame有12列,数据类型包括布尔值、浮点数、整数和Python对象。还可以看到哪些列有缺失值,并基本了解数值数据。
Pandas库最吸引人的特性之一是其能够处理SQL和表格数据。以下是如何运行SQL语句的示例:
q1 = """SELECT removed_by, count(distinct id) as number_of_removed_posts
FROM df
WHERE removed_by is not null
GROUP BY removed_by
ORDER BY 2 DESC"""
grouped_df = ps.sqldf(q1, locals())
grouped_df
根据SQL输出绘制条形图:
removed_by = grouped_df['removed_by'].tolist()
number_of_removed_posts = grouped_df['number_of_removed_posts'].tolist()
plt.figure(figsize=(12,8))
plt.ylabel("删除的Reddit数量")
plt.bar(removed_by, number_of_removed_posts)
plt.show()
可以看到,大多数被删除的帖子(68%)是由版主删除的。删除的内容不到1%。
让看看标题中使用频率最高的词汇的词云图。首先,需要移除NULL值:
df["title"] = df["title"].fillna(value="")
word_string = " ".join(df['title'].str.lower())
然后,绘制词云图:
plt.figure(figsize=(15,15))
wc = WordCloud(background_color="purple", stopwords=STOPWORDS, max_words=2000, max_font_size=300, width=1600, height=800)
wc.generate(word_string)
plt.imshow(wc.recolor(colormap='viridis', random_state=17), interpolation="bilinear")
plt.axis('off')
让看看评论分布图:
fig, ax = plt.subplots()
_ = sns.distplot(df[df["num_comments"] < 25]["num_comments"], kde=False, rug=False, hist_kws={'alpha': 1}, ax=ax)
_ = ax.set(xlabel="评论数", ylabel="Reddit数量")
plt.ylabel("Reddit数量")
plt.xlabel("评论")
plt.show()
可以看到,大多数帖子的评论数少于5条。
现在让看看数据集变量之间的关系。以下是如何查看变量之间的相关性表,并使用热图进行可视化:
df.corr()
h_labels = [x.replace('_', ' ').title() for x in list(df.select_dtypes(include=['number', 'bool']).columns.values)]
fig, ax = plt.subplots(figsize=(10,6))
_ = sns.heatmap(df.corr(), annot=True, xticklabels=h_labels, yticklabels=h_labels, cmap=sns.cubehelix_palette(as_cmap=True), ax=ax)
df.score.describe()
fig, ax = plt.subplots()
_ = sns.distplot(df[df["score"] < 22]["score"], kde=False, hist_kws={'alpha': 1}, ax=ax)
_ = ax.set(xlabel="得分", ylabel="Reddit数量")