日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据分析】数据分析(EDA)学习总结!

發布時間:2025/3/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据分析】数据分析(EDA)学习总结! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:張永泰,北京工業大學,Datawhale優秀學習者

探索性數據分析(Exploratory Data Analysis,EDA)是一種探索數據的結構和規律的一種數據分析方法。其主要的工作包含:對數據進行清洗,對數據進行描述(描述統計量,圖表),查看數據的分布,比較數據之間的關系,培養對數據的直覺和對數據進行總結。

EDA可以幫助我們找到適合的數據模型,本文針對文本數據,將進行具體的數據探索性分析講解。

一、數據及背景

https://tianchi.aliyun.com/competition/entrance/531810/information(阿里天池-零基礎入門NLP賽事)

二、實驗環境

導入需要使用的包

import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split import seaborn as sns import scipy from collections import Counter

三、數據探索

首先,利用Pandas對數據進行讀取。

df_train = pd.read_csv(train_path, sep='\t') df_test = pd.read_csv(test_path, sep='\t')

3.1 簡單查看數據

df_train.head(), len(df_train)

發現text域的數據是字符串。我們想要得到整數序列。可以用字符串分割split()。

print(len(df_train['text'][0]), type(df_train['text'][0])) df_train.head()

3.2 長度分布

3.2.1 describe

這里與教程中的方法有所不同。vectorize是numpy中很方便的函數,作用和pandas中apply差不多。用法:

np.vectorize(function)(array)

輸入待處理的array,以及逐元素處理函數function,返回經過處理后的ndarray。原來的array則不受影響。

當前我使用的函數split_df負責將一行數據按空格切分成整數列表,然后計算該列表的長度。

def split_df(df_row):return len(str(df_row).split()) len_dist = np.vectorize(split_df)(df_train['text']) len_test_dist = np.vectorize(split_df)(df_test['text'])

使用describe函數查看訓練集和測試集中的數據長度分布

print(pd.Series(len_dist).describe())

print(pd.Series(len_test_dist).describe())

通過數據描述可以看到:

  • 訓練集共200,000條新聞,每條新聞平均907個字符,最短的句子長度為2,最長的句子長度為57921,其中75%以下的數據長度在1131以下。

  • 測試集共50,000條新聞,每條新聞平均909個字符,最短句子長度為14,最長句子41861,75%以下的數據長度在1133以下。

  • 訓練集和測試集就長度來說似乎是同一分布。

3.2.2 直方圖

繪制直方圖查看訓練集和測試集中的數據長度分布

fig, ax = plt.subplots(1,1,figsize=(12,6))ax = plt.hist(x=len_dist, bins=100) ax = plt.hist(x=len_test_dist, bins=100)plt.xlim([0, max(max(len_dist), max(len_test_dist))]) plt.xlabel("length of sample") plt.ylabel("number of sample") plt.legend(['train_len','test_len'])plt.show()

使用seaborn繪制更好的圖。seaborn計算的縱坐標是頻率,而不是出現次數。由于訓練集和測試集的數據量不一樣,因此用頻率更加科學、更能看出是否符合同一分布。

plt.figure(figsize=(15,5)) ax = sns.distplot(len_dist, bins=100) ax = sns.distplot(len_test_dist, bins=100) plt.xlim([0, max(max(len_dist), max(len_test_dist))]) plt.xlabel("length of sample") plt.ylabel("prob of sample") plt.legend(['train_len','test_len'])

通過直方圖,我們能直觀感受到訓練集和測試集的長度分布都屬于右偏分布。按理說分析到這份兒上就該停了。

3.2.3 同分布驗證

import scipy scipy.stats.ks_2samp(len_dist, len_test_dist) Ks_2sampResult(statistic=0.004049999999999998, pvalue=0.5279614323123156)

P值為0.52,比指定的顯著水平(假設為5%)大,我們認為二者同分布。

3.2.4 截斷位置

在輸入模型進行訓練之前,我們要把所有的數據長度統一化,數據肯定要截斷。但是在什么位置截斷合適呢?

考慮到數據長度分布是長尾分布,log一下看看是不是正態分布,如果是正態分布,使用3sigma法則作為截斷的參考。如果不是,則就只能瞎猜了

測量擬合分布的均值和方差sigma原則:

  • 原則:數值分布在中的概率為0.6526;

  • 原則:數值分布在中的概率為0.9544;

  • 原則:數值分布在中的概率為0.9974;

由于“小概率事件”和假設檢驗的基本思想 “小概率事件”通常指發生的概率小于5%的事件,認為在一次試驗中該事件是幾乎不可能發生的。由此可見X落在以外的概率小于千分之三,在實際問題中常認為相應的事件是不會發生的,基本上可以把區間看作是隨機變量X實際可能的取值區間,這稱之為正態分布的“”原則。

log_len_dist = np.log(1+len_dist) log_len_test_dist = np.log(1+len_test_dist) plt.figure(figsize=(15,5)) ax = sns.distplot(log_len_dist) ax = sns.distplot(log_len_test_dist) plt.xlabel("log length of sample") plt.ylabel("prob of log") plt.legend(['train_len','test_len'])

從log圖上也能看出二者(很像)同分布。

下面我想驗證一下我的猜想:該分布為正態分布,且訓練集和測試集為同分布。

先驗證訓練集分布為正態分布:

_, lognormal_ks_pvalue = scipy.stats.kstest(rvs=log_len_dist, cdf='norm') print('P value is ', lognormal_ks_pvalue)P value is 0.0

?0???擬合優度檢驗,p值為0,意思就是說這不是一個正態分布。

之前我們把數據log了一下,但是這里有更科學的變換方式。log只是box-cox變換的特殊形式。我們使用box-cox變換再次做一下驗證,是否為正態分布:

trans_data, lam = scipy.stats.boxcox(len_dist+1) scipy.stats.normaltest(trans_data) NormaltestResult(statistic=1347.793358118494, pvalue=2.1398873511704724e-293)

e后面跟了那么多負數,我佛了。這說明我們的假設不成立。

但總歸是要猜一個截斷值的。看log圖上8.5的位置比較靠譜。np.exp(8.5)=4914約等于5000,因此我初步決定把截斷長度定為5000。

3.3 類別信息

3.3.1 簡單查看類別信息表

先改造一下df_train,多加幾個字段,分別是:

  • text-split,將text字段分詞

  • len,每條新聞長度

  • first_char,新聞第一個字符

  • last_char,新聞最后一個字符

  • most_freq,新聞最常出現的字符

df_train['text_split'] = df_train['text'].apply(lambda x:x.split()) df_train['len'] = df_train['text'].apply(lambda x:len(x.split())) df_train['first_char'] = df_train['text_split'].apply(lambda x:x[0]) df_train['last_char'] = df_train['text_split'].apply(lambda x:x[-1]) df_train['most_freq'] = df_train['text_split'].apply(lambda x:np.argmax(np.bincount(x))) df_train.head()

構建一個類別信息表。

  • count,該類別新聞個數

  • len_mean,該類別新聞平均長度

  • len_std,該類別新聞長度標準差

  • len_min,該類別新聞長度最小值

  • len_max,該類別新聞長度最大值

  • freq_fc,該類別新聞最常出現的第一個字符

  • freq_lc,該類別新聞最常出現的最后一個字符

  • freq_freq,該類別新聞最常出現的字符

df_train_info = pd.DataFrame(columns=['count','len_mean','len_std','len_min','len_max','freq_fc','freq_lc','freq_freq']) for name, group in df_train.groupby('label'):count = len(group) # 該類別新聞數len_mean = np.mean(group['len']) # 該類別長度平均值len_std = np.std(group['len']) # 長度標準差len_min = np.min(group['len']) # 最短的新聞長度len_max = np.max(group['len']) # 最長的新聞長度freq_fc = np.argmax(np.bincount(group['first_char'])) # 最頻繁出現的首詞freq_lc = np.argmax(np.bincount(group['last_char'])) # 最頻繁出現的末詞freq_freq = np.argmax(np.bincount(group['most_freq'])) # 該類別最頻繁出現的詞df_train_info.loc[name] = [count,len_mean,len_std,len_min,len_max,freq_fc,freq_lc,freq_freq] df_train_info

3.3.2 類別分布

之前的討論是從數據集總體驗證同分布的,我們還需要驗證訓練集的類別足夠均勻。

在數據集中標簽的對應的關系如下

label_2_index_dict = {'科技': 0, '股票': 1, '體育': 2, '娛樂': 3, '時政': 4, '社會': 5, '教育': 6, '財經': 7, '家居': 8, '游戲': 9, '房產': 10, '時尚': 11, '彩票': 12, '星座': 13} index_2_label_dict = {v:k for k,v in label_2_index_dict.items()}plt.figure() plt.bar(x=range(14), height=np.bincount(df_train['label'])) plt.xlabel("label") plt.ylabel("number of sample") plt.xticks(range(14), list(index_2_label_dict.values()), fontproperties=zhfont, rotation=60) plt.show()

從統計結果可以看出

  • 賽題的數據集類別分布存在較為不均勻的情況。在訓練集中科技類新聞最多,其次是股票類新聞,最少的新聞是星座新聞。

  • 科技類新聞最多,星座類新聞最少。這個國家的人大部分是唯物主義者哈,神秘學受眾比較少(啊這,我在分析什么?)。

  • 由于類別不均衡,會嚴重影響模型的精度。但是我們也是有辦法應對的。

3.3.3 類別長度

df_train['len'] = df_train['text'].apply(lambda x: len(x.split())) plt.figure() ax = sns.catplot(x='label', y='len', data=df_train, kind='strip') plt.xticks(range(14), list(index_2_label_dict.values()), fontproperties=zhfont, rotation=60)

在散點圖中,股票類新聞的長度都飄到天上去了,可以看出股票分析類文章真的很容易寫得又臭又長啊(發現:不同類別的文章長度不同,可以把長度作為一個Feature,以供機器學習模型訓練)!

3.4 字符分布

訓練集中總共包括6869個字,最大數字為7549,最小數字為0,其中編號3750的字出現的次數最多,編號3133的字出現的次數最少,僅出現一次。

# 內存警告!!!沒有8G內存不要運行該代碼 all_lines = ' '.join(list(df_train['text'])) word_count = Counter(all_lines.split(" ")) word_count = sorted(word_count.items(), key=lambda d:d[1], reverse=True)print(len(word_count)) # 6869print(word_count[0]) # ('3750', 7482224)print(word_count[-1]) # ('3133', 1)

下面代碼統計了不同字符在多少個句子中出現過,其中字符3750、字符900和字符648在20w新聞的覆蓋率接近99%,很有可能是標點符號。

%%time df_train['text_unique'] = df_train['text'].apply(lambda x: ' '.join(list(set(x.split(' '))))) all_lines = ' '.join(list(df_train['text_unique'])) word_count = Counter(all_lines.split(" ")) word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse=True) # 打印整個訓練集中覆蓋率前5的詞 for i in range(5):print("{} occurs {} times, {}%".format(word_count[i][0], word_count[i][1], (word_count[i][1]/200000)*100))

四、分析總結

數據分析肯定要有結論,沒有結論的數據分析是不完整的。

  • 訓練集共200,000條新聞,每條新聞平均907個字符,最短的句子長度為2,最長的句子長度為57921,其中75%以下的數據長度在1131以下。測試集共50,000條新聞,每條新聞平均909個字符,最短句子長度為14,最長句子41861,75%以下的數據長度在1133以下。

  • 訓練集和測試集就長度來說似乎是同一分布,但是不屬于正態分布。

  • 賽題的數據集類別分布存在較為不均勻的情況。在訓練集中科技類新聞最多,其次是股票類新聞,最少的新聞是星座新聞。需要用采樣方法解決。文章最長的是股票類新聞。不同類別的文章長度不同,可以把長度和句子個數作為一個Feature,以供機器學習模型訓練。

  • 訓練集中總共包括6869個字,最大數字為7549,最小數字為0,其中編號3750的字出現的次數最多,編號3133的字出現的次數最少,僅出現一次,其中字符3750、字符900和字符648在20w新聞的覆蓋率接近99%,很有可能是標點符號。

  • 900很有可能是句號,2662和885則很有可能為感嘆號和問號,3750出現頻率很高但是基本不在新聞最后出現,因此初步判斷為逗號。按照這種劃分,訓練集中每條新聞平均句子個數約為19。

  • 在訓練集中,不同類別新聞出現詞匯有特色。但是需要把共有的常用詞停用。自然想到利用TF-IDF編碼方式。

  • 往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群請掃碼進群:

    總結

    以上是生活随笔為你收集整理的【数据分析】数据分析(EDA)学习总结!的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产馆在线观看 | 人人爽久久涩噜噜噜网站 | 国产极品一区二区 | 中文字幕视频在线 | 美女扒开腿男人爽桶 | jizzjizz8| 91精品国产91综合久久蜜臀 | 四虎成人精品在永久免费 | 伊人三区 | 粗大黑人巨茎大战欧美成人免费看 | 逼逼av网站 | 一本视频 | 国产婷婷色综合av蜜臀av | 欧美粉嫩videosex极品 | 狼干综合 | 女色综合 | 日本国产在线视频 | 人人草人人射 | 欧美黑人又粗又大的性格特点 | 色香色香欲天天天影视综合网 | 午夜欧美日韩 | 日韩国产在线观看 | 蜜桃视频导航 | 久久香蕉精品视频 | 成人区人妻精品一区二区网站 | 久久午夜夜伦鲁鲁一区二区 | 一区二区三区免费在线观看视频 | 久久视精品 | 污夜影院| 亚洲人人精品 | 亚洲第一福利视频 | 亚洲综合三区 | 色图18p | 亚洲福利视频网 | 3d欧美精品动漫xxxx无尽 | 国产一区在线观看视频 | 非洲黑寡妇性猛交视频 | 欧美日韩精品 | 日韩欧美一区二区三区免费观看 | 亚洲国产爱 | 日本黄色网页 | 日韩99 | 3d欧美精品动漫xxxx无尽 | 六十路息与子猛烈交尾 | 日本美女动态图 | 青青青视频免费 | www.我爱av | 欧洲亚洲精品 | 欧美一区二区三区激情 | 国产清纯白嫩初高中在线观看性色 | 中文日韩在线观看 | 男女日批在线观看 | 国产欧美日韩综合精品一区二区三区 | 69日影院 | 色漫在线观看 | 大片视频免费观看视频 | 狠狠操综合网 | 91影院在线播放 | 日本a级片在线播放 | 我爱52av | 日本精品视频一区二区 | 国产精品一区二区久久久 | 国产传媒一区二区三区 | 国产欧美一区二区三区精品酒店 | 波多野结衣一区二区三区免费视频 | 欧美熟妇乱码在线一区 | 亚洲色图.com | 麻豆影视在线播放 | 朝桐光在线观看 | 51av视频 | 国产高清不卡视频 | 国产精品人八做人人女人a级刘 | 欧美影视| 欧美一级啪啪 | 午夜宅男影院 | 丝袜一区二区三区 | 亚洲精品视频一区二区 | 国产精品乱码久久久 | 色偷偷成人 | 国产无限资源 | 苍井空亚洲精品aa片在线播放 | 亚洲天堂三区 | 国产成人精品亚洲男人的天堂 | 国产小视频在线看 | 黄色国产在线视频 | 国产超碰91 | 日本色婷婷 | 黄色污污视频软件 | 看av在线 | 久久婷婷五月综合色国产香蕉 | 中文字幕乱码免费 | 亚洲AV无码精品黑人黑人 | 大陆一级黄色片 | 天天干中文字幕 | 精品国产露脸精彩对白 | 成人免费在线观看av | 成人午夜免费在线观看 | 天干夜天干天天天爽视频 | 欧美激情综合色综合啪啪五月 |