<jupyter_start><jupyter_text>필요 모듈 및 데이터 로드<jupyter_code>import sys
import os

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import itertools
dacon_data_path = os.path.join("./data/dacon_data")
sys.path.insert(0, dacon_data_path)
case = pd.read_csv("./Case.csv")
p_info = pd.read_csv("./PatientInfo.csv")
p_route = pd.read_csv("./PatientRoute.csv")
pol = pd.read_csv("./Policy.csv")
reg = pd.read_csv("./Region.csv")
st = pd.read_csv("./SearchTrend.csv")
sf = pd.read_csv("./SeoulFloating.csv")
ta = pd.read_csv("./TimeAge.csv")
time = pd.read_csv("./Time.csv")
tg = pd.read_csv("./TimeGender.csv")
tp = pd.read_csv("./TimeProvince.csv")
wt = pd.read_csv("./Weather.csv")<jupyter_output><empty_output><jupyter_text>utils<jupyter_code>def uniform_pdf(x):
    """ Uniform Distribution(균등 분포) 확률 밀도 함수 """
    return 1 if 0 <= x < 1 else 0
def uniform_cdf(x):
    """ 균등 분포 누적 분포 함수 """
    if x < 0:
        return 0
    elif 0 <= x < 1:
        return x
    else:
        return 1
def normal_pdf(x, mu=0.0, sigma=1.0):
    """평균이 mu이고, 표준편차가 sigma인 정규 분포(Normal Distribution)
    확률 밀도 함수
    """
    return math.exp(-(x - mu) ** 2 / (2 * sigma ** 2)) / (SQRT_TWO_PI * sigma)
def normal_cdf(x, mu=0.0, sigma=1.0):
    """평균이 mu이고, 표준편차가 sigma인
    정규 분포(Normal Distribution)의 누적 분포 함수(Cumulative Distribution Function)
    math.erf() 함수(error function)를 이용해서 구현"""
    return (1 + math.erf((x - mu) / (math.sqrt(2) * sigma))) / 2
def inverse_normal_cdf(p, mu=0.0, sigma=1.0, tolerance=0.00001):
    """누적 확률 p를 알고 있을 때 정규 분포 확률 변수 x = ?"""
    # 표준 정규 분포가 아니라면 표준 정규 분포로 변환
    if mu != 0.0 or sigma != 1.0:
        return mu + sigma * inverse_normal_cdf(p, tolerance=tolerance)
    low_z = -10.0 # 하한(lower bound)
    high_z = 10.0 # 상한(upper bound)
    while high_z - low_z > tolerance:
        mid_z = (low_z + high_z) / 2.0 # 중간 값
        mid_p = normal_cdf(mid_z) # 중간 값에서의 누적 확률
        if mid_p < p:
            low_z = mid_z
        else:
            high_z = mid_z
    return mid_z<jupyter_output><empty_output><jupyter_text>data EDA<jupyter_code>data_list = [case, p_info, p_route, pol, reg, st, sf, ta, time, tg, tp, wt]
data_str_list = ['case', 'p_info', 'p_route', 'pol', 'reg', 'st', 'sf', 'ta', 'time', 'tg', 'tp', 'wt']
def data_shape_print(d_list, d_str_list):
    
    col_list = []
    
    for d_idx in range(len(d_list)):
        print(str(d_idx+1),'_',d_str_list[d_idx], ': ', d_list[d_idx].shape)
        print('columns : ', list(d_list[d_idx].columns))
        print()
        for c_idx in list(d_list[d_idx].columns):
            col_list.append(c_idx)
        
    return col_list
    
col_list = data_shape_print(data_list, data_str_list)
from collections import Counter

col_d = dict(sorted(dict(Counter(col_list)).items(), key=lambda item: item[1]))
col_d<jupyter_output><empty_output><jupyter_text>사용할 데이터 추출 - 그룹화 할 수 있는 데이터(mapper?)    + date    + location(city, province)<jupyter_code># 확진자 중 기저질환 보유 여부
_per = float(list(p_info.disease.value_counts())[0]/len(p_info))
print("percentge : %s%%"%round(_per*100,2))
# util
def group_cals_func(df, group_col, target_col, agg):
    
    grouped = df.groupby(group_col)
    
    if agg == 'mean':
        return grouped[target_col].mean().sort_values(ascending=False)
    elif agg == 'sum':
        return grouped[target_col].sum().sort_values(ascending=False)
# 감염 케이스 별 확진자 수 
group_cals_func(case, 'infection_case', 'confirmed', 'mean')
province_code_mapper = dict(zip(wt.code, wt.province))
province_code_mapper<jupyter_output><empty_output><jupyter_text>감염 케이스 중 집단 감염일 확률?<jupyter_code>_per = len(case[case['group'] == True])/len(case)*100
print("percentage : %s%%"%round(_per,3))<jupyter_output>percentage : 55.357%<jupyter_text>contact number 따른 확률변수? - 데이터를 수집한다.- 수집한 데이터가 어떤 확률변수의 표본 데이터라고 가정- 데이터를 사용하여 해당 확률변수의 확률분포함수의 모양을 결정- 결정된 확률변수로부터 다음에 생성될 데이터나 데이터 특성을 예측<jupyter_code>import scipy.stats as stats
import sympy
_p_info = p_info[['sex','age','province','infection_case','contact_number','symptom_onset_date','confirmed_date','released_date','deceased_date']]
_p_info
case.infection_case
p_info
p_info.infection_case.value_counts()
# 연령대 별 감염 수
age_infect_cnt_dict = dict(zip(p_info.age.value_counts().index, p_info.age.value_counts().values)) 
age_infect_cnt_dict
# 연령대별 감염률
age_infect_rate_dict = {}
for k,v in age_infect_cnt_dict.items():
    age_infect_rate_dict[k] = v/sum([v for k,v in age_infect_cnt_dict.items()])    

age_infect_rate_dict
age_infect_cnt_df = pd.DataFrame(list(age_infect_cnt_dict.items()), columns=['age', 'cnt'])
age_infect_cnt_df.plot.hist(bins=14)
age_infect_rate_df = pd.DataFrame(list(age_infect_rate_dict.items()), columns=['age', 'rate'])
age_infect_rate_df.plot.hist(bins=14)
sns.distplot(age_infect_rate_df['rate'])
sns.distplot(p_info['contact_number'])
p_info['age_rate'] = p_info['age'].map(age_infect_rate_dict)
p_info
# 연령대에 따른 확률분포 도식화?
sns.distplot(p_info['age_rate'])
# 유동 인구수
sns.distplot(sf['fp_num'])
import seaborn as sns
print(sp.stats.describe(x))
print(x.describe())<jupyter_output>count    432000.000000
mean      27860.034884
std       13122.838441
min        4480.000000
25%       18940.000000
50%       25690.000000
75%       34000.000000
max      127640.000000
Name: fp_num, dtype: float64<jupyter_text>기댓값- 확률밀도함수나 확률분포함수는 확률변수의 전체적인 성격을 설명하는데, 때로 우리는 몇 개의 수치로 확률분포의 성질을 요약하고자 하기도 함- 이러한 성질을 요약하는 수치들 중 하나로 변수의 expectation을 생각해보자<jupyter_code>age_infect_rate_dict
len(age_infect_rate_dict)
# 미성년 (0s or 10s)
# 청장년 (20s ~ 50s)
# 노년 (60s ~ 100s)
# 10명을 임의로 선정했을 때 미성년일 확률?

a = list(age_infect_rate_dict.keys())
# 임의로 두 명을 뽑았을 때 나올 수 있는 모든 가정의 수
# p = itertools.permutations(a, 2)  # 순열

b = itertools.combinations(a,2) # 조합
len(list(itertools.combinations(a,2)))
age_infect_rate_dict
# 두 명을 뽑았을때 미성년이 나오는 모든 경우의 수
len(d) + len(a)
# debug 용 function
def permutations_with_replacement(data, n=2):
    _list = [data]*n
    return list(itertools.product(*_list))
num_of_cases = permutations_with_replacement(a,2)
num_of_cases
len(num_of_cases)
# 미성년일 확률
prob_of_minor = age_infect_rate_dict['0s']+age_infect_rate_dict['10s']
print('Probability of minor : ', prob_of_minor)

# 성년일 확률
prob_of_adult = 1-(prob_of_minor)
print('Probability of adult : ', prob_of_adult)<jupyter_output>Probability of minor :  0.062046004842615014
Probability of adult :  0.937953995157385<jupyter_text>관심있는 변수 -> 두 명을 추출했을 때, 추출한 인원 중 한 명 이상이 미성년일 확률- P(X=0) = 0.003849706716929806    + 임의의 두 명이 모두 미성년인 경우        - P(X=1) = 0.00002964048361274893    + 임의의 두 명 중 한 명만 미성년인 경우        - P(X=2) = 0.9923154068079466    + 임의의 두 명이 모두 성인인 경우<jupyter_code># P(X=2)
x_0 = prob_of_minor**2
print(x_0)

# P(X=1) 
x_1 = 2*(x_0**2)
print(x_1)

# P(X=1) 
x_2 = (1-x_0)**2
print(x_2)
# x(추출한 인원 중 한 명 이상이 미성년)의 기대값
# E(X) = x_2*0 + x_1*1 + x_1*1 + x_0*2
e = x_2*0 + x_1*1 + x_1*1 + x_0*2
e

# 이거 맞나??
# x(추출한 인원 중 한 명 이상이 성년)의 기대값
# E(X) = x_2*0 + x_1*1 + x_1*1 + x_0*2
e2 = x_2*2 + x_1*1 + x_1*1 + x_0*0
e2
# probabilily mass function
rand_var_dict = {'x_0': x_0, 'x_1':x_1,'x_2':x_2}
rand_var_dict
_k = [k for k,v in rand_var_dict.items()]
_v = [v for k,v in rand_var_dict.items()]
plt.bar(_k, _v)
plt.ylabel("Probability")
plt.xlabel("Random Variable")
plt.show()
plt.close()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14645560908465244, 'fraction_numerical': 0.04638678596008259, 'mean_word_length': 4.2235801581595975, 'pattern_counts': {'":': 0, '<': 36, '<?xml version=': 0, '>': 32, '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': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '511077', 'license': 'MIT', 'n_tokens_mistral': 3824, 'n_tokens_neox': 4022, 'n_words': 666, 'path': '4_code/Choi/covid_data_analysis_test.ipynb', 'repo_name': 'HS-2021/Statistics', 'size': '7265'}