# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directoryee
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
por = "../input/student-alcohol-consumption/student-por.csv"

d3 = pd.read_csv(por)
d3.columns
d3.describe()
"""
# Visual number of record for each unique value for every cols
"""
%%time
import matplotlib.pyplot as plt 
import seaborn

import plotly.express as px

%matplotlib inline
correlate = d3.corr()

print(len(d3.columns))

fig, ax = plt.subplots(figsize=(20,20)) 

plt.imshow(correlate)
plt.show()
print(d3[d3["G2"] == 0]["G2"].count())
fig, ax = plt.subplots(figsize=(20,20)) 

hm = seaborn.heatmap(correlate, annot=True)

hm.set_xticklabels(hm.get_xticklabels(), rotation=45, horizontalalignment='right')

print(0)
"""
## Add new feature:
- Một cột cho illegaly drinking. Ở Bồ Đào Nha, phải đủ 18 tuổi mới được sử dụng rượu bia, do đó, ta có thể thêm cột để đánh dấu là người dùng uống rượu thế là trước hay sau.
- Max học vấn của cha mẹ
- Coi nhưng người có mức sử dụng rượu = 0 là không uống, tạo 1 feature mới, là uống hay không.
"""
"""
## Một số việc cần làm
- Tính feature importance, bằng cách sử dụng mô hình học máy có sẵn hay xài gì cũng được. Xem xem liệu nó có ảnh hưởng tới các cột thuộc tính khác hay không ?
"""
d4 = d3.copy()
## add illegal drinking
def illegal_drinking(alc, age):
    if alc > 1 and age < 16:
        return True
    return False


d4["illegal_drink"] = d4.apply(lambda x : illegal_drinking(x["Walc"], x["age"]), axis=1)
d4["illegal_drink"].describe()
## add max parent edu
d4["Pedu"] = d4[["Fedu", "Medu"]].max(axis=1)

d4["Pedu"].describe()
## add is drinking
d4["Drinking"] = (d4["Walc"] > 1)
d4["Drinking_2"] = (d4["Dalc"] > 1)
d4["Drinking"].describe()
d4.columns
# Check count matrix of 

def visualize_col_show(df, col):
    unique_value = df[col].value_counts()
    
    unique_value.plot.pie(autopct='%.2f')
    
    keys = unique_value.astype(bool).keys()
    values = unique_value[unique_value.keys()]
    
    plt.xlabel(col)
    plt.ylabel("Number of records")
    plt.title("Distribution in number of records and corresponding key.")
    plt.show()
    plt.clf()
    
visualize_col_show(d4, "illegal_drink")
visualize_col_show(d4, "Pedu")
visualize_col_show(d4, "Drinking")
correlate = d4.corr()

fig, ax = plt.subplots(figsize=(30,30)) 
hm = seaborn.heatmap(correlate, annot=True)
hm.set_xticklabels(hm.get_xticklabels(), rotation=45, horizontalalignment='right')

print(0)
"""
## Tập các giả thiết

Dữ liệu được tổng hợp từ học sinh cấp 2 trong 2 trường thuộc Bồ Đào Nha. Gồm các thông tin về địa lý, nhân khẩu và điểm.

1. Ảnh hưởng của sử dụng đồ uống có cồn đến hiệu quả học tập của học sinh (được mô tả trong cột G1, G2, G3)
2. Thống kê sự ảnh hưởng của giới tính đến sự tiếp cận đến đồ uống có cồn 
3. Ảnh hưởng của lối sống thành thị đến sự sử dụng đồ uống có cồn ở học sinh
4. Ảnh hưởng của tình trạng gia đình (ly thân hay không)
5. Trình độ học vấn của cha mẹ (Có thể liên quan đến cả tình trạng gia đình, do có thể nếu ở với người có trình độ học vấn cao hơn thì có thể học sinh sẽ ngoan hơn, và ngược lai)
* Nếu cha mẹ vẫn sống với nhau thì có thể lấy max trình độ học vấn của 2 người
6. Thời gian học tập, thể hiện mức độ chăm chỉ và chú tâm vào học tập của học sinh. Có thể thời gian học tập càng nhiều thì học sinh đó càng chăm chỉ và nghiêm túc, và nếu nghiêm túc thì có thể tránh được đồ có cồn, hoặc vì nghiêm túc quá mà lại nốc đồ có cồn. Ai mà biết được :V
7. Higher:
8. Romantic: liệu học sinh trong mối quan hệ tình cảm có nốc đồ có cồn hay không ?
9. Goout: Theo lý thuyết thì nên ra ngoài chơi, nên có thể việc này không ảnh hướng nhiều lắm.
9. 5. famrel: Ảnh hưởng của các mối quan hệ gia đình đối với việc sử dụng đồ có cồn. Việc các mối quan hệ gia đình không tốt có thể tiến tới hiện tượng sử dụng rượu gia tăng
10. absences: Nghiên cứu xem liệu uống rượu có làm ảnh hưởng đến việc đến trường của sinh viên hay không.

...

Nghiên cứu ảnh hưởng của đồ có cồn đến điểm:
1. Ảnh hưởng đến điểm 2 kì và tổng kết
2. Ảnh hưởng đến sức khỏe
3. Ảnh hưởng đến các mối quan hệ: cái này thì phải xem xét do uống bia mà mất bạn thì cũng hơi lạ.
"""
"""
# New notebook
Examinate correlation of every other columns to "Dalc" and "Walc".
"""
"""
## Cài đặt các hàm trực quan
"""
%%time
def visualize_col(df, col, title="", legends=None):
    unique_value = df[col].value_counts()
    
    fig, ax = plt.subplots(figsize=(10,10)) 
    
    keys = unique_value.keys()
    values = unique_value[unique_value.keys()]
    
    plt.bar(keys, values)
    
    plt.xlabel(col)
    plt.ylabel("Number of records")
    if legends is not None:
        plt.legend(legends)
    plt.title(title)
    plt.show()
    plt.clf()
%%time
   
def visualize_col_pie(df, col, title="", legends=None):
    unique_value = df[col].value_counts()
    
    unique_value.plot.pie(autopct='%.2f')
    
    keys = unique_value.astype(bool).keys()
    values = unique_value[unique_value.keys()]
    
    plt.xlabel(col)
    plt.ylabel("Number of records")
    plt.title(title)
    if legends is not None:
        plt.legend(legends)
    plt.show()
    plt.clf()
%%time
        
def visualize_cooccurence_matrix(df, col1, col2, normalize=False, title="", plot=True):
    col1_unique_val = df[col1].unique()
    col2_unique_val = df[col2].unique()
    
    res = df.groupby([col1, col2]).size()
    
    col1_unique_val = sorted(col1_unique_val)
    col2_unique_val = sorted(col2_unique_val)
    
    if isinstance(col1_unique_val[0], np.int64):
        col1_unique_val = range(col1_unique_val[0], col1_unique_val[-1] + 1, 1)
    if isinstance(col2_unique_val[0], np.int64):
        col2_unique_val = range(col2_unique_val[0], col2_unique_val[-1] + 1, 1)
    
    cooc_matrix = np.zeros((len(col1_unique_val), len(col2_unique_val)))
        
    for i, val1 in enumerate(col1_unique_val):
        for j, val2 in enumerate(col2_unique_val):
            try:
                if normalize:
                    cooc_matrix[i, j] = res[(val1, val2)] / df[df[col1] == val1][col1].count()
                else:
                    cooc_matrix[i, j] = res[(val1, val2)]
            except Exception as e:
                cooc_matrix[i, j] = 0
                
    cooc_matrix_2 = np.zeros((len(col1_unique_val), len(col2_unique_val)))      
    for i, val1 in enumerate(col1_unique_val):
        for j, val2 in enumerate(col2_unique_val):
            try:
                if normalize:
                    cooc_matrix_2[i, j] = res[(val1, val2)] / df[df[col2] == val2][col1].count()
                else:
                    cooc_matrix_2[i, j] = res[(val1, val2)]
            except Exception as e:
                cooc_matrix_2[i, j] = 0
            
    if plot:
        fig, ax = plt.subplots(figsize=(20,20)) 
    
        color = seaborn.color_palette("Blues", 100)

        fig = seaborn.heatmap(cooc_matrix, square=True, annot=cooc_matrix, fmt='g',
                       xticklabels = col2_unique_val,
                       yticklabels = col1_unique_val,
                       cmap=color,
                       cbar=False)
        plt.title(title)
        plt.show()
        plt.clf()
        
        coc = cooc_matrix_2.T
        
        width = 1 / coc.shape[0] - 0.1
        
        prev = [0] * coc.shape[0]
        
        labels = [str(x) for x in col2_unique_val]
        
        for i in range(coc.shape[1]):
            plt.bar(labels, coc[:, i], bottom=prev, label=col1_unique_val[i])
            prev = prev + coc[:, i]
            
        plt.legend(bbox_to_anchor = (1.05, 0.6))
        plt.xlabel(col2)
        plt.ylabel(col1)
        plt.show()
    
    return cooc_matrix

visualize_cooccurence_matrix(d4, 'studytime', 'Walc', True)
d4['Walc'].head(10)
dxyz = d4.copy()

dxyz['Walc'].head(10)
dxyz['Walc'] = d4['Walc'].replace({
    1: 'Very low',
    2: 'Low',
    3: 'Moderate',
    4: 'High',
    5: 'Very High'
})
dxyz['Dalc'] = d4['Dalc'].replace({
    1: 'Very low',
    2: 'Low',
    3: 'Moderate',
    4: 'High',
    5: 'Very High'
})
%%time 
import math

from matplotlib.ticker import MaxNLocator

def visualize_box_swarm_plot(data, col1, col2, title="", legends = None):
    if col1 in ['Dalc', 'Walc']:
        ax = seaborn.boxplot(x = col1, y = col2, 
                             order=['Very low', 'Low', 'Moderate', 'High', 'Very High'],
                             data=data)
    else:
        ax = seaborn.boxplot(x = col1, y = col2, data=data)
    
    plt.title("Box " + col1 + " " + col2)
    if legends is not None:
        plt.legend(legends)
    plt.show()
    plt.clf()
    
def visualize_swarm_plot(data, col1, col2, title="", legends=None):
    plt.subplots(figsize=(35,10))
    
    if col1 in ['Dalc', 'Walc']:
        ax = seaborn.swarmplot(x= col1, y= col2, order=['Very low', 'Low', 'Moderate', 'High', 'Very High'], data=data)
    else:
        ax = seaborn.swarmplot(x= col1, y= col2, data=data)
        
    ax.tick_params(axis='both', which='major', labelsize=25)
    ax.tick_params(axis='both', which='minor', labelsize=20)
    
    ticks = ax.get_yticks()
    labels = ax.get_yticklabels()
    
    cmax = data[col2].max()
    
    cmin = 0
    
    lower = math.floor(cmin)
    upper = math.ceil(cmax + 1)
    
    yint = range(lower, upper, 2)
    plt.yticks(yint)
    plt.xlabel(col1, fontsize=25)
    plt.ylabel(col2, fontsize=25)
    if legends is not None:
        plt.legend(legends)
    plt.title("Swarm " + col1 + " " + col2, fontsize=20)
    plt.show()
    plt.clf()
visualize_swarm_plot(dxyz, "Dalc", "G1")
visualize_swarm_plot(d4, "Dalc", "G1")
visualize_swarm_plot(dxyz, "Dalc", "G1")
visualize_swarm_plot(dxyz, "Walc", "G1")
visualize_swarm_plot(dxyz, "Dalc", "G2")
visualize_swarm_plot(dxyz, "Walc", "G2")
visualize_swarm_plot(dxyz, "Dalc", "G3")
visualize_swarm_plot(dxyz, "Walc", "G3")
visualize_swarm_plot(dxyz, "Drinking", "G1")
visualize_swarm_plot(dxyz, "Drinking_2", "G1")
visualize_swarm_plot(dxyz, "Drinking", "G2")
visualize_swarm_plot(dxyz, "Drinking_2", "G2")
visualize_swarm_plot(dxyz, "Drinking", "G3")
visualize_swarm_plot(dxyz, "Drinking_2", "G3")

visualize_swarm_plot(dxyz, "Walc", "absences")
visualize_swarm_plot(dxyz, "Dalc", "absences")
visualize_swarm_plot(dxyz, "Drinking", "absences")
visualize_swarm_plot(dxyz, "Drinking_2", "absences")
visualize_box_swarm_plot(dxyz, "Dalc", "G1")
visualize_box_swarm_plot(dxyz, "Walc", "G1")
visualize_box_swarm_plot(dxyz, "Dalc", "G2")
visualize_box_swarm_plot(dxyz, "Walc", "G2")
visualize_box_swarm_plot(dxyz, "Dalc", "G3")
visualize_box_swarm_plot(dxyz, "Walc", "G3")
visualize_box_swarm_plot(dxyz, "Drinking", "G1")
visualize_box_swarm_plot(dxyz, "Drinking_2", "G1")
visualize_box_swarm_plot(dxyz, "Drinking", "G2")
visualize_box_swarm_plot(dxyz, "Drinking_2", "G2")
visualize_box_swarm_plot(dxyz, "Drinking", "G3")
visualize_box_swarm_plot(dxyz, "Drinking_2", "G3")

visualize_box_swarm_plot(dxyz, "Walc", "absences")
visualize_box_swarm_plot(dxyz, "Dalc", "absences")
visualize_box_swarm_plot(dxyz, "Drinking", "absences")
visualize_box_swarm_plot(dxyz, "Drinking_2", "absences")