<jupyter_start><jupyter_text>1. 확률분포의 추정  확률분포의 결정  연습 문제 9.1.1다음 코드로 사이킷런 패키지가 제공하는 보스턴 집값 데이터를 살펴보고 각각의 데이터의 확률분포 특성을 설명하라. 각 데이터에 적합한 확률분포가 존재한다면 어떤 확률분포인지도 설명하라.<jupyter_code>from sklearn.datasets import load_boston
boston = load_boston()
dfX = pd.DataFrame(boston.data, columns=boston.feature_names)
dfy = pd.DataFrame(boston.target, columns=["MEDV"])
df = pd.concat([dfX, dfy], axis=1)
df.head()
df.info()
df.describe()<jupyter_output><empty_output><jupyter_text>모멘트 방법 다음과 같은 표본 데이터가 주어졌을 때,  (1) 표본 데이터의 분포를 시각화하라.  (2) 모멘트 방법을 통해 이론적 모멘트를 추정하라<jupyter_code># 주어진 자료
df = pd.DataFrame({'produce':[7, 8, 10, 11, 12, 14], 'days':[10, 10, 20, 30, 20, 10]})
df
# 확률로 변환
df['probs'] = df.days/df.days.sum()
df
# 표본 데이터 시각화
sns.barplot(x='produce', y='probs', data=df)
plt.title('어느 공장의, 100일 동안의 제품 생산율의 (표본)분포')
plt.show()<jupyter_output><empty_output><jupyter_text>위의 표본 데이터는 어떤 분포에서 나온 데이터일까?  답 = 이항분포But why?- 문제에 대한 해석이 불완전했어<jupyter_code># np.sum((df.produce * df.days - mean) ** 2) / (df.days.sum() - 1) 
# 모멘트 방법으로 모수 추정 - 표본의 모멘트가 모수의 모멘트라고 가정
# 표본평균 = 기댓값
mean = np.sum(df.produce*df.probs)
# 표본분산 = 분산
var = np.sum(((df.produce - mean) ** 2) * df.probs)
print('1차 모멘트 기댓값은 "{}", 2차 모멘트 분산은 "{}"'.format(mean, var))
# 다른 방법으로 구하기 1 -  좋은 코드
mean = np.average(df.produce, weights=df.probs)
var = np.average((df.produce - mean)**2, weights=df.probs)
print(mean, var)
# 다른 방법으로 구하기 2 - 이론적으로  var는 이게 제일 정확
mean = np.sum(df.produce * df.days) / df.days.sum()
var = np.sum(((df.produce - mean) ** 2) * df.days) / (df.days.sum() - 1)
print(mean, var)
# 해당 모수로 확률질량함수 그려보기
mu = -(var / mean) + 1
N = mean / mu
print(mu, N)

# rv = sp.stats.binom(round(N), mu)
rv = sp.stats.binom(16, mu)
# xx = np.arange(round(N)+1)
xx = np.arange(16+1)
plt.bar(xx, rv.pmf(xx))
plt.show()
# 모멘트로 만든 이론 분포와 표본분포 비교해보기
df2 = pd.DataFrame({'이론':rv.pmf(xx)})
df2.reset_index(inplace=True)
df2.rename(columns={'index':'produce'}, inplace=True)
df_new = pd.merge(df2, df, on='produce', how='left').drop(columns='days').fillna(0)
df_new.rename(columns={'probs':'표본'}, inplace=True)
df_new
df_new = df_new.drop(columns='produce').stack().reset_index()
df_new.columns = ['표본값', '유형', '비율']
df_new.pivot('표본값', '유형', '비율')
sns.barplot(x='표본값', y='비율', hue='유형', data=df_new)
plt.title('데이터 표본분포와 모멘트로 추정하여 만든 이론분포')
plt.show()<jupyter_output><empty_output><jupyter_text>연습 문제 9.1.2위 연습 문제에서 나온 보스턴 집값 데이터 각각에 대해 seaborn의 `distplot()` 함수로 히스토그램을 그려라. 그리고 `distplot()` 함수의 모수 추정 기능을 사용하여 각각의 데이터에 적합한 확률분포의 확률밀도함수를 그려라. (범주형 데이터는 제외한다.)<jupyter_code>df.info()
from sklearn.datasets import load_boston
boston = load_boston()
dfX = pd.DataFrame(boston.data, columns=boston.feature_names)
dfy = pd.DataFrame(boston.target, columns=["MEDV"])
df = pd.concat([dfX, dfy], axis=1)
 
sns.distplot(df.CRIM, kde=False, norm_hist=True, fit=sp.stats.lognorm) # CRIM
plt.show()
sns.distplot(df.ZN, kde=False, norm_hist=True) # ZN
plt.show()
sns.distplot(df.INDUS, kde=False, norm_hist=True) # ZN
plt.show()

sns.distplot(df.NOX, kde=False, norm_hist=True) # ZN
plt.show()
sns.distplot(df.RM, kde=False, norm_hist=True) # ZN
plt.show()
sns.distplot(df.AGE, kde=False, norm_hist=True) # ZN
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1828428303068253, 'fraction_numerical': 0.018159048215403883, 'mean_word_length': 4.97196261682243, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '476024', 'license': 'MIT', 'n_tokens_mistral': 1919, 'n_tokens_neox': 2251, 'n_words': 328, 'path': 'Math/9_Estimation_and_testing.ipynb', 'repo_name': 'sejinkim/TIL', 'size': '3194'}