<jupyter_start><jupyter_text>今天的範例，帶著大家一起發現具有特徵的資料<jupyter_code># library
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy import stats
import math
import statistics
import seaborn as sns
from IPython.display import display
import sklearn
print(sklearn.__version__)
#如果只有 0.19 記得要更新至 最新版本
%matplotlib inline<jupyter_output>0.23.1<jupyter_text>產生一組資料集<jupyter_code>#用字典產生一組資料
data={'sex': ['Male','Male','Male','Male','Male','Female','Female','Female','Female','Female','Male','Male','Male','Male','Male','Female','Female','Female','Female','Female'],
      'insomnia':['Y','N','N','N','N','N','Y','Y','Y','N','Y','N','N','N','N','N','Y','Y','Y','N'],
     'age':[23,40,5,30,1,40,16,27,43,8,23,39,5,29,1,42,13,29,41,10],
     'height':[180,170,100,176,70,160,170,166,155,35,170,168,101,175,72,163,169,163,151,40],
     'weight':[100,68,20,70,10,45,50,58,58,17,101,65,22,79,12,40,53,52,56,14]}
#轉成 dataframe格式 
data=pd.DataFrame(data)
display(data)

print(data.info())<jupyter_output><empty_output><jupyter_text>我們要找那些資料點和失眠相關，具有特徵的變異性?  具有變異性的資料   連續型資料<jupyter_code># 計算變異數的方法
print("男孩身高變異數=",statistics.variance(data['age']))
print("男孩身高變異數=",np.var(data['age'],ddof=1))
#最後，畫圖看分布
plt.hist(data['age'],alpha=.4,bins=40)
plt.title('boy,skewness={0},kurtosis={1}'.format(round(stats.skew(data['age']),2),round(stats.kurtosis(data['age']),2)))
plt.axvline(x=np.mean(data['age']))
plt.show()
## 可由變異數等分散變量與圖形，判斷資料是否有變異性，以這個例子，年紀是具有變異性的特徵。<jupyter_output><empty_output><jupyter_text>離散型資料<jupyter_code>data[['insomnia','sex']].groupby('sex').count()
data[data['insomnia']=='Y'].groupby('sex').count()
#當離散型資料不集中於某一個欄位，如此資料集，則稱為具有變異性<jupyter_output><empty_output><jupyter_text>衍生資料的方法:把原始資料做一些轉換，萃取出和目標變數相關的特徵，大致上可以分成以下幾種類型， 稱作 ICR 步驟。* 指示器變量(Indicator)* 資料組合(Combination)* 資料重新定義(Reshape)  指示器變量(Indicator)這邊我們運用 Weight 這個變數來當例子，進行示範![image.png](attachment:image.png)<jupyter_code># 運用 apply function  做變數轉換
data['weight_new']=data['weight'].apply((lambda x: 1 if x >=100 else 0))

display(data.head(5))<jupyter_output><empty_output><jupyter_text>資料組合(Combination)![image.png](attachment:image.png)<jupyter_code># 運用四則運算，來做計算
data['BMI']=round(data['weight']/data['height']/data['height']*100*100,2)

display(data.head(5))<jupyter_output><empty_output><jupyter_text>資料重新定義(Reshape) 1. 資料收集長度調整:預測地下水水位，時雨量比10分鐘及時雨量還好，沒有時間遞延問題，透過調整增強數據所能表達的信息。2. 數值到分類的映射: 可以將年齡，分成兒童、青少年、青年與青壯年各個年級的資料。3. 合併稀疏分類: 發現年齡中，某一個年齡層人數偏少，可以做合併的動作。4. 表達類別型資料的距離:重新定義類別資料距離: 比如年齡資料，兒童、青少年與成年可轉換為1,2,3。5. 創造虛擬資料:這取決與機器學習算法的實現，將類別特徵轉換到虛擬變量中去。<jupyter_code>## 數值到分類的映射
# 運用 apply function  做變數轉換
def age_map(x): 
    if(x<=12):
        return('child')
    else: 
        if(x<=18):
            return('teens')
        else:
            return('adult')
    
data['age_category']=data['age'].apply(age_map)

display(data)

## 合併稀疏分類
contTable = pd.crosstab(data['age_category'], data['insomnia'])
contTable
# 有兩個零的存在，太過稀疏，有時候會將 age_category中的 child  和 teens 合併，但如果最後應用端要把 age 分成三種類型的話，就不會合併

##現在假設要合併的話可以怎麼做?
#產生一個新的 mapping function 然後做調整
def age_map_2(x): 
    if(x<=18):
        return('child_teens')
    else:
        return('adult')
    
data['age_category']=data['age'].apply(age_map_2)

display(data)
#定義類別資料距離
data['age_category']=data['age'].apply(age_map)
size_mapping = {'child':1, 'teens':2, 'adult':3}
data['age_conti'] = data['age_category'].map(size_mapping)
display(data)
# 先將需要的欄取出
b = data[['age_category']]
#columns 代表取出欄位,透過 prefix 來調整欄位名稱
dummy=pd.get_dummies(b, columns=['age_category'], prefix=['age'])
#資料合併
data=pd.concat([data,dummy],axis=1)
display(data)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.20116375727348296, 'fraction_numerical': 0.050983651981158215, 'mean_word_length': 9.524781341107872, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '606951', 'license': 'MIT', 'n_tokens_mistral': 2118, 'n_tokens_neox': 2179, 'n_words': 161, 'path': 'Sample Code/Day_39_SampleCode.ipynb', 'repo_name': 'YenLinWu/DataScienceMarathon', 'size': '3609'}