<jupyter_start><jupyter_text>Những lưu ý khi làm EDA1. Đi từ tổng quan, dùng mấy cái infor, describe để xem biến số, biến chữ, biến nào đủ, biến nào thiếu2. Hiểu ý nghĩa của từng biến trong cột, giá trị của chúng. Biến giá trị và biến phụ thuộc (kết quả cuối cùng)3. Chia các biến thành các nhóm liên quan, có thể theo con người, bên ngoài, ... (thử áp dụng mấy cái model)4. Phân tích độc lập từng biến (distribution và sự khác biệt giữa nhóm yes và nhóm no)5. Phân tích sự tương quan giữa các biến (bảng correlation) Lưu ýĐể làm cho nhanh, thì dùng mấy cái script có sẵn hét<jupyter_code># Hi this is for practicing EDA with bank marketing database
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
bank = pd.read_csv('bank-additional-full.csv', sep =';')
bank.head(3)
bank = bank.rename(columns = {'nr.employed' : 'nr_employed','emp.var.rate':'emp_var_rate','cons.price.idx':'cons_price_idx', 'cons.conf.idx':'cons_conf_idx'})
bank.head(3)
bank.info()
bank.describe()
bank.describe(include = 'object')
bank.median()
bank.info()
bank_y = bank[bank.y == 'yes']
bank_n = bank[bank.y =='no']
bank_n.head(3)<jupyter_output><empty_output><jupyter_text>Nhận xét- Không có giá trị trốngcần phân loại các biến theo từng nhóm1. Nhóm thông tin cá nhân:'age','job','marital','education','default','housing','loan'2. Nhóm xã hội: 'emp_var_rate','cons_price_idx','euribor3m','nr_employed'3. Nhóm chương trình chiến dịch: 'contact','month','day_of_week','duration','campaign','pdays','previous','poutcome'<jupyter_code>bank.month
# để nhìn hết một lượt
pd.plotting.scatter_matrix(bank,alpha=0.5, figsize=(14,14))
# bank.hist(grid=True, figsize=(15,15))
bank[['age','duration','campaign']].hist(grid=True, figsize=(15,15))<jupyter_output><empty_output><jupyter_text>Phân tích nhóm thông tin cá nhân'age','job','marital','education','default','housing','loan'<jupyter_code># histogram
# compare yes and no
bank.age.plot.hist()
bank_y['age'].head()
# sns.distplot(bank_y.age,kde=False)
sns.distplot(bank_n.age,kde=False)
sns.distplot(bank_y.age,kde=False)
plt.title('Distribution of Age between Yes and No')
plt.legend()
def visualize_numerical(df, column, target = 'y'):
    fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20,4)) # Create 2 charts in 1 row
    
    sns.histplot(df[column], ax=ax1, kde=True);
    ax1.set_xlabel(column);
    ax1.set_ylabel('Density');
    ax1.set_title(f'{column}  Distribution');

    sns.boxplot(x=target, y=column, data=df, showmeans=True, ax=ax2);
    ax2.set_xlabel('Target');
    ax2.set_ylabel(column);
    plt.show()
visualize_numerical(bank,'age',target = 'y')
# def visualize_numerical_lst(df, numerical = ['age', 'duration', 'campaign', 'pdays', 'previous', 'emp_var_rate',\
#                             'cons_price_idx', 'cons_conf_idx', 'euribor3m', 'nr_employed'], target = 'y'):
#     for column in numerical:
#         visualize_numerical(df,column)
#         print()
# visualize_numerical_lst(bank)
def visualize_categorical(df, column, target = 'y'):
        fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20,4)) 
        data1 = df.groupby(column).size()
        ax1.pie(x=data1 , autopct="%.2f%%",textprops=dict(color='black'), explode=[0.05]*len(data1) , labels=data1.index.tolist(),      pctdistance=0.7, radius=1.1,  startangle=90)
        ax1.set_title(f'{column}  Distribution', loc='center')

        data2 = get_col_target(column, target,df)   
        data2.plot(kind='bar',stacked = True, ax=ax2);
        plt.xticks(rotation=45);        
        plt.show()


def get_col_target(rows, cols,data):
    
    cols_lst = data[cols].unique().tolist()
    rows_lst = data.groupby(rows)[rows].count().sort_values(ascending = False).index.tolist()

    group_df = data.groupby([rows,cols]).size()
    dic = {}
    for item in cols_lst:
        vals = []
        for i in rows_lst:
            try:
                vals.append(group_df.loc[(i, item)])
            except:
                vals.append(0)
            finally:
                continue
        dic[item] = vals

    df = pd.DataFrame(dic,index = rows_lst)
    return(df)
visualize_categorical(bank,'housing')
get_col_target('housing', 'y',bank) 
def grou_by_yes(df,column,target):
    
k = bank[['housing','y']].groupby(['housing','y']).size()
k = k.reset_index()
k.set_axis(['housing','y','count'],axis=1).set_index('housing')

# để tạo thành biểu đồ cột trồng
new = pd.pivot_table(bank,values='age',index=['housing'],columns=['y'],aggfunc=len)
new = new.sort_values('no',ascending=False)
new
new['total_row'] = new['no'] + new['yes']
new['per_no'] = new.no/new.total_row*100
new['per_yes'] = new.yes/new.total_row*100
new_2 = new[['per_no','per_yes']]
new_2
fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20,4)) 
data2 = new_2.set_index('housing')
data2.plot(kind='bar',stacked = True, ax=ax2);
plt.xticks(rotation=45);        
plt.show()

# dùng để chia ra biến nào là biến số biến nào là biến chữ
categorical_feature = bank.select_dtypes(exclude = np.number)
numeric_feature = bank.select_dtypes(include = np.number)
categorical_feature

# vẽ heat map để ra được correlation
figsize= (10, 10)
fig, ax = plt.subplots(figsize=figsize)
sns.heatmap(numeric_feature.corr(),annot=True,cmap='Blues')
# sns.heatmap(bank,annot=True,cmap='Blues')
# chart này để tính tỉ lệ phần trăm thành công cho các biến categorical
def visualize_categorical_w_success(df, column, target = 'y'):
    
        fig, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(20,4))    
        #chart number
        data2 = get_col_target(column, target,df)   
        ax1 = data2.plot(kind='bar',stacked = True, ax=ax1);
        ax1.set_title(f' Quantity distribution by {column}', loc='center')
    
        #chart successing rate
        data = get_col_target(column, target,df)
        data['yes_rate'] = round(data['yes']*100/(data['yes'] + data['no']),2)
        yes_rate_df =  data['yes_rate'].sort_values(ascending = False)

        #Rotation
        sns.barplot(y = yes_rate_df.values, x = yes_rate_df.index, ax=ax2)
        ax2.set_title(f' Successing rate by {column}')
        for ax in fig.axes:
            ax.tick_params(labelrotation=45)
visualize_categorical_w_success(bank,'job')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15765981189223657, 'fraction_numerical': 0.01881077634305755, 'mean_word_length': 4.3715753424657535, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 13, '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': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '145233', 'license': 'MIT', 'n_tokens_mistral': 2609, 'n_tokens_neox': 2539, 'n_words': 489, 'path': 'practice_EDA.ipynb', 'repo_name': 'lethuthao1368/learn_EDA_ML', 'size': '6273'}