Skip to content

Commit

Permalink
add new post
Browse files Browse the repository at this point in the history
  • Loading branch information
vekee committed Jun 4, 2024
1 parent e1cca50 commit c6c7040
Show file tree
Hide file tree
Showing 4 changed files with 287 additions and 0 deletions.
132 changes: 132 additions & 0 deletions content/posts/jp/20240501_use-linear-approximation/index.ja.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
+++
author = "DUAN DAHAI"
title = "システム開発で線型近似式で業務予測を実施"
date = "2024-05-01"
description = "システム開発で線型近似式で業務予測を実施"
tags = [
"AI",
"linear approximation"
]
categories = [
"ソリューション"
]
+++

最近のプロジェクトに、線型近似式で電力消費量を予測している処理を触っていましたので、Pythonを用いて線形近似式の使い方をこのブログで記録したと考えています。

線形近似式は、データの傾向を直線で近似する手法です。簡単な統計手法の一つであり、過去のデータに基づいて将来の値を予測するためや、データの相関関係を理解するために広く用いられます。

#### 必要なライブラリのインストール
```
pip install numpy pandas matplotlib scikit-learn
```
#### データの準備(江東区有明マンションの平均売買㎡単価)
| 年月 | 江東区有明マンションの平均売買㎡単価 |
| ------------- | ------------- |
| 202105 | 72 |
| 202107 | 73 |
| 202109 | 74 |
| 202111 | 75 |
| 202201 | 76 |
| 202203 | 78 |
| 202205 | 79 |
| 202207 | 80 |
| 202209 | 81 |
| 202211 | 82 |
| 202301 | 82 |
| 202303 | 83 |
| 202305 | 84 |
| 202307 | 85 |
| 202309 | 85 |
| 202311 | 86 |
| 202401 | 87 |
| 202403 | 87 |
| 202405 | 88 |


#### 検証ソース(未来202407, 202409, 202411, 202501の㎡単価予測)
```
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from datetime import datetime
# データの準備
x_data = [202105, 202107, 202109, 202111, 202201, 202203, 202205, 202207, 202209, 202211, 202301, 202303, 202305, 202307, 202309, 202311, 202401, 202403, 202405]
x = np.array([datetime.strptime(str(date), '%Y%m').timestamp() for date in x_data])
y = np.array([72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 87, 88])
model = LinearRegression()
model.fit(x[:, np.newaxis], y)
# 予測
x_new_data = [202407, 202409, 202411, 202501]
x_new = np.array([datetime.strptime(str(date), '%Y%m').timestamp() for date in x_new_data])
y_new = model.predict(x_new[:, np.newaxis])
print(y_new)
# 散布図と線形回帰結果の可視化
plt.figure(figsize=(10, 6))
# 散布図
x_dates = [datetime.strptime(str(date), '%Y%m') for date in x_data]
plt.scatter(x_dates, y, color='blue', label='real data')
# 線形回帰の直線
plt.plot(x_dates, model.predict(x[:, np.newaxis]), color='green', linestyle='-', label='regression line')
# 予測値
x_new_dates = [datetime.strptime(str(date), '%Y%m') for date in x_new_data]
plt.plot(x_new_dates, y_new, 'ro', label='Predicted value')
plt.yticks(range(68, 99, 2))
plt.xlim(x_dates[0], x_new_dates[-1])
plt.xlabel('year-month')
plt.ylabel('Average sales price per square meter of Ariake apartments in Koto Ward')
plt.title('Prediction by linear regression')
plt.legend()
plt.grid(True)
plt.tight_layout()
# 散布図保存
output_path = 'scatter_plot_with_regression.png'
plt.savefig(output_path)
```

#### 予測
回帰直線から予測値を算出するには、以下の式を使用します。
```
y = mx + b
```
* y は予測したい値
* x は説明変数(年月)
* m は傾き
* b は切片
回帰直線から m と b の値を読み取り、上記の式に代入することで、予測値を算出することができます。

* 予測結果
- 2024年7月:89.80744105
- 2024年9月:90.7152807
- 2024年11月:91.60847778
- 2025年1月:92.50167486

* 散布図
![scatter_plot_with_regression](scatter_plot_with_regression.png)

#### 線形近似式の利点、欠点と利用例
線形近似式には、以下のような利点と欠点があります。
* 利点
- 理解しやすい: 式がシンプルで、関係性を直感的に理解しやすい。
- 計算しやすい: 式が単純なので、計算が容易。
- 汎用性が高い: 様々なデータに適用できる。
- 外挿可能: 既知のデータ範囲外での値を推定できる(ただし、注意が必要)。
- 頑健性がある: ある程度のノイズや誤差に対して比較的頑健。
* 欠点
- 精度が限られる: 複雑な関係性を単純な直線で近似するため、必ずしも高い精度が得られるとは限らない。
- 非線形性を表現できない: 非線形な関係性には適用できない。
- 外挿の精度が保証されない: 外挿はあくまで推定であり、実際の値との誤差が大きくなる可能性がある。
- 誤解を招く可能性がある: 線形関係が存在しない場合、誤った解釈を招く可能性がある。
* 具体的な利用例
- 売上予測: 過去の売上データに基づいて、将来の売上を予測する。
- 株価予測: 過去の株価データに基づいて、将来の株価を予測する。
- 成長曲線の推定: 生物の成長曲線などを推定する。
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from datetime import datetime

# データの準備
x_data = [202105, 202107, 202109, 202111, 202201, 202203, 202205, 202207, 202209, 202211, 202301, 202303, 202305, 202307, 202309, 202311, 202401, 202403, 202405]
x = np.array([datetime.strptime(str(date), '%Y%m').timestamp() for date in x_data])
y = np.array([72, 73, 74, 75, 76, 78, 79, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 87, 88])

model = LinearRegression()
model.fit(x[:, np.newaxis], y)

# 予測
x_new_data = [202407, 202409, 202411, 202501]
x_new = np.array([datetime.strptime(str(date), '%Y%m').timestamp() for date in x_new_data])
y_new = model.predict(x_new[:, np.newaxis])
print(y_new)

# 散布図と線形回帰結果の可視化
plt.figure(figsize=(10, 6))

# 散布図
x_dates = [datetime.strptime(str(date), '%Y%m') for date in x_data]
plt.scatter(x_dates, y, color='blue', label='real data')

# 線形回帰の直線
plt.plot(x_dates, model.predict(x[:, np.newaxis]), color='green', linestyle='-', label='regression line')

# 予測値
x_new_dates = [datetime.strptime(str(date), '%Y%m') for date in x_new_data]
plt.plot(x_new_dates, y_new, 'ro', label='Predicted value')

plt.yticks(range(68, 99, 2))
plt.xlim(x_dates[0], x_new_dates[-1])
plt.xlabel('year-month')
plt.ylabel('Average sales price per square meter of Ariake apartments in Koto Ward')
plt.title('Prediction by linear regression')
plt.legend()
plt.grid(True)
plt.tight_layout()

# 散布図保存
output_path = 'scatter_plot_with_regression.png'
plt.savefig(output_path)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
110 changes: 110 additions & 0 deletions content/posts/zh/20240309-system-design-document/index.zh-cn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
+++
author = "DUAN DAHAI"
title = "日本DX(数字转型)开发经验分享:系统开发的各个阶段及设计文档"
date = "2024-03-09"
description = "中小規模プロジェクトの設計書種類-バックエンド編"
tags = [
"design",
"document"
]
categories = [
"ソリューション"
]
+++

我是一名在日本从事数字转型(DX)开发超过10年的资深全栈工程师,曾参与过各类各样的ToB,ToC以及个人项目,从设计开发标准严格的大型银行项目到只有要件没有设计,直接开发的先端技术应用小部队项目都有经历,最近抽空总结了日本这边常见的系统开发的各个阶段及其对应的设计文档类型,希望能够对需要的人提供些微帮助,由于本人没有经历过中文的软件开发流程,个别用词完全为日语直译或者照搬中文翻译,如有不当,请多多包容(抱拳)。

##### 通常在日本经历的系统开发的各个阶段

* 需求分析 (Requirements Analysis)
* 基本设计 (High-Level Design / Architecture Design)
* 详细设计 (Low-Level Design / Detailed Design)
* 开发制造 (Implementation / Coding)
* 单元测试 (Unit Testing)
* 集成测试 (Integration Testing)
* 系统测试 (System Testing)
* 生产发布 (Production Release)

##### 需求分析 (Requirements Analysis)
需求定义阶段,我们需要理解行业背景知识,明确了解用户的业务需求和期望,将其准确地转化为系统的功能和非功能需求,并将其文档化。

* 需求规格说明书:描述系统的功能和非功能需求。
* 应用场景说明书:将系统的功能需求描述为场景或使用案例
* 外部接口或页面定义说明书:定义与外部系统或用户界面相关的需求和规格。

##### 基本设计 (High-Level Design / Basic Design)
基本设计也称为概要设计,通常确定系统的整体结构和主要组件,将需求转化为可行的解决方案,并确定系统的架构和外部接口。

画面端(前端)设计文档:
* 用户界面设计文档:定义用于用户操作的界面的设计、布局、导航流程和UI组件规范。
* 界面跳转图:定义各个界面的跳转关系和用户操作的界面跳转的图表。
* 用户可用性测试设计文档:定义用于确保用户可用性的测试用例和测试方法。

业务处理端(后端)设计文档:
* 数据库设计文档:定义后端使用的数据库的结构、表、关系和数据流。
* 软件各功能设计文档:定义后端逻辑和处理的详细设计。其中包括数据处理、业务逻辑、算法、对数据库的访问等。
* API设计文档:定义前端和后端之间通信接口的API的设计。其中包括终端点、请求/响应格式、认证/授权等。
* 安全设计文档:定义后端的安全需求、访问控制、认证、加密、安全策略等。
* 性能设计文档:描述后端的性能目标、负载测试策略、瓶颈识别等与性能相关的设计。
* 错误处理设计文档:描述后端的错误处理方法和异常处理设计。

##### 详细设计 (Low-Level Design / Detailed Design)
详细设计阶段是在基本设计的基础上,对系统的各个组件进行详细设计的阶段。在这个阶段,我们通常需要确定每个组件的具体实现方式,并定义其程序逻辑和数据结构。

画面端(前端)设计文档:
* 画面详细设计书(Screen Detail Design Document)
- 各个画面的布局、设计、组件的详细信息、输入字段的规格、验证规则等。
* 画面流程图(Screen Transition Diagram)
- 画面之间的跳转关系,并明确用户操作对应的动作。
* 用户界面原型(UI Prototype)
- 确认实际操作行为的交互式原型。
* 前端事件设计书(JavaScript/TypeScript Design Document)
- 确认实际操作行为的交互式原型。

业务处理端(后端)设计文档:
* 功能设计书(Function Design Document)
- 各功能的详细处理步骤、算法、输入输出的定义、错误处理等。
* 数据库详细设计书(Database Detail Design Document)
- 数据库的具体设计,包括表的详细信息、索引、触发器、存储过程、视图等。
* API 详细设计书(API Detail Design Document)
- 各个 API 接口的详细信息、参数、请求/响应格式、认证方法等。
* 业务流程详细设计书(Business Process Detail Design Document)
- 业务流程的详细过程、顺序图、状态转换图等。
* 错误处理设计书(Error Handling Design Document)
- 各业务处理中的错误处理方法、错误消息、回滚步骤等。

共通设计文档:
* 测试用例设计书(Test Case Design Document)
- 各功能和画面的具体测试用例、测试场景、预期结果等。
* 安全性详细设计书(Security Detail Design Document)
- 系统整体的安全对策、认证和授权的详细信息、数据加密、漏洞应对方法等。
* 性能设计书(Performance Design Document)
- 系统的性能要求、负载测试计划、性能优化措施等。
* 日志设计书(Logging Design Document)
- 日志的记录内容、格式、存储位置、日志管理方法等。


##### 制造 (Implementation / Coding)
制造阶段是根据设计文档进行实际编码的阶段。在这个阶段,我们需要将设计转化为实际可执行的代码,并保证代码的质量和可维护性。
* 代码详细设计书(Code Detail Design Document)
- 描述具体的代码实现细节,包括代码结构、模块划分、命名规范、代码风格等。
* 编码规范
- 定义代码编写的标准和风格、命名规范、代码风格等。


##### 单元测试 (Unit Testing)
单元测试阶段是验证每个程序或模块是否正确工作的阶段。在这个阶段,我们需要编写测试用例代码,并确保每个模块都能正常工作。
* 单元测试设计书(Unit Test Design Document)
- 详细描述单元测试用例、测试方法、预期结果及测试覆盖率要求。
* 单元测试用例文档(Unit Test Design Document)
- 单元测试用例文档:描述每个单元测试的测试用例和预期结果。


##### 集成测试 (Integration Testing)


##### 系统测试 (System Testing)

##### 验收测试 (Acceptance Testing)

##### 生产发布 (Production Release)

0 comments on commit c6c7040

Please sign in to comment.