<jupyter_start><jupyter_text>မင်္ဂလာပါ၊ Data Science Using Python - Week 5 (day 2) က ကြိုဆိုပါတယ်။ Data Scientist တယောက်ရဲ့ တာဝန်၊ ဝတ္တရားများData Scientist တယောက် ဘာတွေ လုပ်ရသလဲဆိုတာကို မပြောခင် Data Science ဟာ ဘာလဲဆိုတာကို အရင်ကြည့်ရအောင်။![Data Science Venn Diagram](https://i.ibb.co/4NpbV0C/data-science.png)ပုံမှာပြထားသလိုပဲ Data Science ဆိုတာ * Statistics - စာရင်းအင်းပညာ (စာရင်းကိုင်ပညာ - Accounting မဟုတ်)* Computer Science - ကွန်ပျူတာသိပ္ပံနဲ့* Domain Knowledge - လုပ်ငန်းနဲ့ ဆိုင်တဲ့ အသိပညာ ဗဟုသုတ၃ မျိုးနဲ့ ဖွဲ့စည်းထားတယ်။ ဒါ့အပြင် အဲဒီ ၃ မျိုးရဲ့ ပေါင်းကူးပညာရပ်တွေ ဖြစ်တဲ့ ... * Software Engineering* Machine Learning* (Traditional) Science/Research တွေလဲ ပါတယ်။ ဒီတော့ ဒီအတိုင်း ပြောနေရတာ ပျင်းစရာ ကောင်းတဲ့အတွက် လက်တွေ့ lab လုပ်ပြီး ကြည့်ကြစို့။  Research and Data AnalyticsNon-tech industry ကြီးတွေ (Telco/Finance/Bank/Insurance) မှာ Data Scientist တွေဟာ Data Analytics တပိုင်းအဖြစ် အလုပ်လုပ်ရတယ်။ ဆိုလိုတာက Business Data ကို လေ့လာပြီး Business ရဲ့ မေးခွန်းတွေကို ဖြေရတယ်။ ဒီတော့ အရင်အပါတ်က boston dataset ကို တခေါက် load လုပ်ပြီး လေ့လာကြည့်ကြစို့။<jupyter_code>from utils import load_boston_dataset
df = load_boston_dataset()
df.head()<jupyter_output><empty_output><jupyter_text>ဒီ Data ကို Industry လုပ်ငန်းခွင်မှာတော့ Data Warehouse/Data Mart တွေကနေ ယူရတယ် (Data Warehouse/Data Mart ဆိုတာ RDBMS - Relational DataBase Management System တွေပါပဲ)။ ဒီလို ယူဖို့ Data Engineer တွေနဲ့ တွဲအလုပ်လုပ်ရတယ်။ တော်တော် Advanced ဖြစ်တဲ့ Grab/Uber လို Tech တပိုင်း ကုမ္ပဏီတွေမှာတော့ Data Engineer တွေ ဆောက်ပေးထားတဲ့ Feature Store လို System တွေကနေ ယူလို့လဲ ရတတ်တယ်။ ဒီလို Data တွေ ရလာရင် အရင်ဆုံး Business ရဲ့ မေးခွန်းတွေကို အဖြေပေးရတယ်။ ဥပမာ ... * What is the Average Crime Rate ?* What is the 25 percentile of Tax paid ?* What is the 75 percentile of Apartment Price ?* What is the mean/median/mode of Apartment Price ?* What is the mean/median/mode of Apartment Age ?* Is there any correlation between Crime Rate and Tax paid ?* Are old Apartment prices valued lower than new Apartment ? Pandas DataFrame `describe` functionpandas library ရဲ့ `describe` function ဟာ တချက်တည်းနဲ့ မေးခွန်း တော်တော်များများကို ပြေလည်စေတဲ့ function ဖြစ်တယ်။ စမ်းကြည့်ရအောင်<jupyter_code>df.describe()<jupyter_output><empty_output><jupyter_text>အပေါ်က ဥပမာမှာ ပြထားသလိုပဲ တချက်တည်းနဲ့ uni-variate analysis ရလာဒ်တွေ ဖြစ်တဲ့ ... * minimum (`min`)* maximum (`max`)* 25/50/75 percentiles (50 percentile is also median)* average (`mean`)* standard deviation (`std`) နဲ့* number of values (`count`)တို့ကို တချက်တည်းနဲ့ ရှာတွေ့နိုင်တယ်။* What is the Average Crime Rate ?    > 3.613524* What is the 25 percentile of Tax paid ?    > 279.000000* What is the 75 percentile of Apartment Price ?    > 25.000000 (၂ သောင်းခွဲ ??? how old is this dataset anyway ??)* What is the mean/median/mode of Apartment Price ?    > mean : 22.532806    > median : 21.200000    > mode : unknown* What is the mean/median/mode of Apartment Age ?    > mean : 28.148861	    > median : 77.500000    > mode : unknown* Is there any correlation between Crime Rate and Tax paid ?    > unknown - need bi-variate analytics (for next weeks)* Are old Apartment prices valued lower than new Apartment ?    > unknown - need bi-variate analytics (for next weeks)  Finding Modeဒီအတိုင်း စမ်းကြည့်တော့ ... ```pythonfrom collections import Counterdata = Counter(df.MEDV)print (data.most_common(1))   Returns the highest occurring item this will print a list of tuple [(50.0, 16)]  the amount 50.0 appears the most, 16 times.```<jupyter_code>from collections import Counter
data = Counter(df.MEDV)
print (data.most_common(1))  # Returns the highest occurring item<jupyter_output><empty_output><jupyter_text>များသောအားဖြင့် **ordinal** data ကိုပဲ သုံးကြတာဖြစ်တယ်။ > စကားမစပ် statistics မှာ data type 3 မျိုးရှိတယ်၊ numerical/ordinal/norminal data လို့ ခေါ်တယ်။  numerical ကို continuous/discrete ဆိုပြီး ၂ မျိုး ခွဲနိုင်တယ်။ နောက်ပိုင်းမှာ ခဏခဏ တွေ့ရပါလိမ့်မယ်။ဒီတော့ Apartment Price ကို ပိုပြီး အဓိပ္ပါယ်ရှိအောင် Binning လုပ်ကြစို့။<jupyter_code>from matplotlib import pyplot
# matplotlib ကို နောင်အပါတ်များတွင် အကျယ် ဆွေးနွေးပါမည်။

binned_MEDV_freq, binned_MEDV_range, _ = pyplot.hist(df.MEDV, 20)
print ("frequencies : ")
print (binned_MEDV_freq)
print ("bin values : ")
print (binned_MEDV_range)
max_index = max(
    range(0, len(binned_MEDV_freq)), 
    key=lambda x : binned_MEDV_freq[x]
)
print (max_index)
print ("max freq : {}".format(binned_MEDV_freq[max_index]))
print ("max bin range : {} - {}".format(binned_MEDV_range[max_index], binned_MEDV_range[max_index + 1]))
# so find mode of apartment age here<jupyter_output><empty_output><jupyter_text>Machine LearningData Scientist တွေရဲ့ **အဓိက** တာဝန်၊ ဝတ္တရားကတော့ Machine Learning ပါပဲ။ Machine Learning Model တွေကို Train ရတာ၊ အသုံးချဖို့ လုပ်ဆောင်ပေးရတာ ဖြစ်ပါတယ်။ အရင်အပါတ်က ဥပမာ ပေးခဲ့သလိုပဲ Machine Learning ဆိုတာ Machine (computer) အတွက် function တခုကို code အဖြစ် မရေးပေးနိုင်တဲ့အခါ Model တခုခုကို အခြေခံပြီး အဲဒီ function ကို (code အဖြစ် မရေးတော့ပဲ) တည်ဆောက်တာ ဖြစ်ပါတယ်။ Model တွေ အများကြီးရှိပြီး ဒီသင်တန်းမှာ အဲဒီ အခြေခံ Model တွေကို တခုပြီးတခု လေ့လာသွားမှာ ဖြစ်ပါတယ်။<jupyter_code>from utils import show_scatter_plot
from utils import show_scatter_plot_with_line
show_scatter_plot(df.AGE, df.MEDV, "age vs price", xlabel="age", ylabel="price")
show_scatter_plot(df.RM, df.MEDV, "rm vs price", xlabel="rm", ylabel="price")
from sklearn.linear_model import LinearRegression
m_age = LinearRegression()
m_age.fit(df.AGE.values.reshape(-1,1), df.MEDV)
print ("age_model coefficient: {}; intercept: {}".format(m_age.coef_, m_age.intercept_))
show_scatter_plot_with_line(df.AGE, df.MEDV, "age vs price", "age", "price", a=m_age.coef_, b=m_age.intercept_)
m_rm = LinearRegression()
m_rm.fit(df.RM.values.reshape(-1,1), df.MEDV)
print ("room_model coefficient: {}; intercept: {}".format(m_rm.coef_, m_rm.intercept_))
show_scatter_plot_with_line(df.RM, df.MEDV, "rm vs price", "rm", "price", a=m_rm.coef_, b=m_rm.intercept_)<jupyter_output><empty_output><jupyter_text>Behind the SceneThink about this equation: $Xw = y$, where $X$ is a $m \times n$ matrix, $y$ is $m \times 1$ vector and $w$ is $n \times 1$ vector.In our example, $X$ is `AGE` data series comprising $m$ records, $y$ is the `MEDV` data series comprising $m$ values. We want a weight vector $w$ that gives $\hat{y} = Xw$ that is **as close to $y$ as possible**. > We CANNOT use inverse matrix because we CANNOT find determinent of $m \times 1$ matrix. > Thus, we use the **least square** method.   Software Engineeringအောက်က ပုံမှာ ပြထားတဲ့အတိုင်း တကယ် လက်တွေ့ လုပ်ငန်းခွင်မှာ Machine Learning Code ရဲ့ ပမာဏက သေးတယ် (အဲဒီ Code ထွက်လာအောင် စိုက်ထုတ်ရတဲ့ အားထုတ်မှုကို မဆိုလို)။ ![](https://i.ibb.co/BBhBhXq/ml-vs-rest.png)Machine-Learning Engineer Title ထားတဲ့ FAANG (Facebook/Apple/Amazon/Netflix/Google) တို့လို Tech Company တွေမှာ Data Scientist တွေဟာ Software Engineer တပိုင်းအဖြစ် အလုပ်လုပ်ရတယ်။ ဒါကြောင့် Software Development Lifecycle ကိုနားလည်ပြီး အဆင့်တိုင်းကို ကျွမ်းကျွမ်းကျင်ကျင် လုပ်နိုင်ရမယ်။  Rock Paper Scissor Game1. စမရေးခင် software component (function) တွေကို နေရာချပါ။ ```pythondef ask_input():     R/P/S ကြိုက်ရာ ရွေးခိုင်းမည့် function ဖြစ်သည်။    passdef ask_exit():     ထွက်မလား၊ နောက်တပွဲ ကစားမလားလို့ မေးဖို့ function ဖြစ်သည်။    passdef who_wins(player_a, player_b):     မည်သူနိုင်သည်ကို အဖြေထုတ်ပေးမည့် function ဖြစ်သည်။    passdef main():     main function ဖြစ်သည်    passmain()```2. ပြီးရင် Test Case တွေ ရေးပါ။ ```Case 1:    Call: ask_exit()    Input: Y    Expected Output: TrueCase 2:    Call: ask_exit()    Input: N    Expected Output: FalseCase 3:    Call: ask_exit()    Input: B 1 N    Expected Output: False...Case 11:     Input: R N S Y    Computer Choice: R P    Expected Output: "neither wins" "player_a wins"Case 12:    Input: R Y    Computer Choice: R    Expected Output: "neither wins"Case 13:    Input: R N R N R Y    Computer Choice: R P S    Expected Output: "neither wins" "player_b wins" "player_a wins"```3. Program ကို ရေးပါ၊ စမ်းပါ၊ မမှန်မချင်း ရေးပါ။```pythondef ask_exit():    while True:        choice = input("Want to exit ? : ")        return True if choice.upper() == "Y"         return False if choice.upper() == "N"def main():    user_exit = False    while not user_exit:         other playing things        user_exit = ask_exit()```<jupyter_code>%%writefile lab_rps.py
def ask_exit():
    while True:
        choice = input("Want to exit ? : ")
        if choice.upper() == "Y": return True 
        if choice.upper() == "N": return False 

def main():
    user_exit = False
    while not user_exit:
        
        user_exit = ask_exit()
%%writefile lab_rps.py
import random 

def ask_exit():
    while True:
        choice = input("Want to exit ? : ")
        if choice.upper() == "Y": return True 
        if choice.upper() == "N": return False 

def ask_input():
    user_input = ""
    while user_input.lower() not in ["r", "p", "s"]:
        user_input = input("[R]ock/[P]aper/[S]cissor ? : ")
    return user_input.lower()

rules = {
    "r" : {
        "r" : "neither",
        "p" : "player_b",
        "s" : "player_a"
    },
    "p" : {
        "r" : "player_a",
        "p" : "neither",
        "s" : "player_b"
    },
    "s" : {
        "r" : "player_b",
        "p" : "player_a",
        "s" : "neither"
    }
}

def who_wins(player_a, player_b):
    return rules[player_a[0]][player_b[0]]

def main():
    user_exit = False
    while not user_exit:
        player_a = ask_input()
        player_b = ["r", "p", "s"][random.randint(0, 2)]
        print ("{} wins".format(who_wins(player_a, player_b)))
        user_exit = ask_exit()

if __name__ == "__main__":
    main()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.20387846105983615, 'fraction_numerical': 0.012547962252411076, 'mean_word_length': 4.616773442050087, 'pattern_counts': {'":': 5, '<': 25, '<?xml version=': 0, '>': 39, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '278581', 'license': 'Apache-2.0', 'n_tokens_mistral': 5692, 'n_tokens_neox': 5654, 'n_words': 996, 'path': 'week05/02_what_ds_does.ipynb', 'repo_name': 'neolaw84/data_science_using_python_labs', 'size': '9643'}