logo

单变量数据探索分析

王哲峰 / 2023-02-09


目录

针对单变量观测分析,可以将数据按照类型拆分成数值型、类别型、 时间类型、字符串(object 型)、图像

数值变量

关于数值变量分析,一般会有下面几点:

  1. 是否存在异常值
  2. 数据的整体分布情况

基于数值观察

可以直接通过 Pandas 的 describe() 函数去观测数值数据的分位数, 基于分位数判断这些数据是否符合预期

import pandas as pd

df = pd.read_csv("data.csv")
df[""].describe(percentiles = np.array(list(range(10))) * 0.1)

可视化

plt.figure(figsize = (10, 8))

ax = plt.subplot(221)
sns.boxplot(data = df[""], ax = ax)
plt.ylabel("")

plt.subplot(222)
sns.distplot(data = df[""])
plt.xlabel("")

类别变量

关于类别变量,一般可以分为两类:

而关于单个类别变量的分析,需要重点观测其分布情况,包括:

基于数值观察

使用 pandas 的 nuniquevalue_counts 等函数进行观察即可

df[""].nunique()
df[""].value_counts()
df[""].value_counts(normalize = True)

可视化

同样地,可以通过可视化的方式来看数据的分布,此处我们可以直接用柱状图图来进行观测。 在数据的 nunique 值非常大的时候,一般会选择摘取出现次数最多的 Top N 个数据进行观测

plt.figure(figsize = (10, 8))

ax = plt.subplot(221)
sns.countplot(x = "", data = df)
plt.xlabel("")

plt.subplot(222)
df[""].value_counts(normalize = True).plot(kind = "bar")
plt.xlabel("")

时间变量

关于时间类型的数据,需要重点观测下面的几点内容:

因为时间变量的特殊性,存在非常多特殊的问题需要思考:

dts = np.random.randint(low = 1, high = 30, size = df.shape[0])
df['dt'] = dts
df['dt'] = '2020-11-' + df['dt'].astype(str)
df['dt'] = pd.to_datetime(df['dt'])

df['day'] = df['dt'].apply(lambda x: x.day)
df['week_day'] = df['dt'].apply(lambda x: x.day % 7) 

字符串

字符串类型的数据是最为复杂的一类数据,所有的数值、类别、时间等信息全部可以设置为字符串类型, 因而第一时间,需要判断字符串是不是真正意义上的字符串类型:

此处,重点介绍稍微复杂的文本类的字符串的分析。因为文本信息非常多,里面包含的信息也十分复杂, 这从早期的文本相关的数据竞赛的特征工程技巧中就可以发现,典型的包括:

wordcloud 可视化

# !pip install wordcloud

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator  

plt.figure(figsize = [10, 8])
text = 'I love dog dog dog, mikey. My brother likes dog too. But his brother likes cats.' 

wordcloud = WordCloud().generate(text)  
plt.imshow(wordcloud, interpolation = 'bilinear')
plt.axis("off")
plt.show() 

scattertext 可视化

# !pip install scattertext

import scattertext as st

df = st.SampleCorpora.ConventionData2012.get_data().assign(
    parse = lambda df: df.text.apply(
        st.whitespace_nlp_with_sentences
    )
)

corpus = st.CorpusFromParsedDocuments(
    df, 
    category_col = 'party', 
    parsed_col = 'parse'
).build().get_unigram_corpus().compact(st.AssociationCompactor(2000))

html = st.produce_scattertext_explorer(
    corpus,
    category = 'democrat', 
    category_name = 'Democratic', 
    not_category_name = 'Republican',
    minimum_term_frequency = 0, 
    pmi_threshold_coefficient = 0,
    width_in_pixels = 1000, 
    metadata = corpus.get_df()['speaker'],
    transform = st.Scalers.dense_rank
)
open('./demo_compact.html', 'w').write(html)

图像

图像数据和文本数据都属于特殊的数据,暂时将其放在单变量一起介绍。 图像的数据可以直接进行可视化,有些朋友会加入不同的算子或者预处理之类的, 然后再进行可视化看效果

关于图像的可视化方式有非常多,可以基于 PIL、基于 matplotlib.imagecv2scipyskimage 等等,下面是一个基于 PIL 的图像可视化案例

from PIL import Image
import numpy as np 

img_path = './pic/picture.jpg'
I = np.array(Image.open(path) )
plt.imshow(I) 

参考