タイタニックのデータを使って xfeat で特徴量作成 + lightGBM で学習をしてみた
(9/23 修正)制度評価指標をf1値に、lightGBMの学習モデルをLGBMClassifier()に修正
特徴量エンジニアリングのライブラリ xfeat が公開されていたのでチュートリアルを参考にkaggleのタイタニックのデータを使って特徴量を作り、lightGBMを回してみました。
【リリース】特徴量エンジニアリングのライブラリ xfeat を公開しました。データフレームから特徴量を作成するための各種エンコーダーを実装しています。cuDF を使うことでエンコーダーによっては 10~30 倍の高速化が可能となります。Code: https://t.co/IbqRET9YA2 Slides: https://t.co/8CY0IdCuJM pic.twitter.com/xM5HxRMQtj
— PFN-tech account (@preferred_jp) June 19, 2020
使用するkaggleのタイタニックのデータはこちらからダウンロードしてください。
なお、xfeat ライブラリは、git をインストールしたうえで、下記コマンドをターミナルに入力すればインストールできます。
pip install git+https://github.com/pfnet-research/xfeat.git
なお、ブログで使ったコードはこちらになります。
では内容を見てみましょう。
import pandas as pd import numpy as np import os from IPython.display import display import xfeat # xfeatのチュートリアルで紹介されているラベルエンコーダー from xfeat import SelectCategorical, LabelEncoder, Pipeline, ConcatCombination, SelectNumerical, ArithmeticCombinations, LambdaEncoder # ホールドアウト法 from sklearn.model_selection import train_test_split # lightGBM import lightgbm as lgb # 二乗平均平方根誤差 (RMSE) from sklearn.metrics import mean_squared_error
csvを読み込んでfeather形式に変換します。
feather形式は、C++で実装されており、読み込みが非常に高速とのことです。
pandasのデータフレームに対してdf.to_feather(filepath)とすることによってFeather形式でのシリアライズが可能。
path = os.getcwd() + "/" d_name = ["train", "test"] # feather形式に変換。 for i in d_name: xfeat.utils.compress_df(pd.read_csv(path + i + ".csv")).to_feather(path + i + ".ftr") # feather形式のデータを読込 dtrain = pd.read_feather("./train.ftr") dtest = pd.read_feather("./test.ftr") display(dtrain.head(3)) display(dtrain.tail(3)) display(dtrain.dtypes) display(dtest.head(3)) display(dtest.tail(3)) display(dtest.dtypes)
xfeat のラベルエンコーディング
特にカラムを指定しなくても、カテゴリカルデータ(object)なのか、数値データ(int、float等)なのかを勝手に認識してラベルエンコーディング可能なのは便利ですね。
# SelectCategorical() カテゴリカルデータ(object)のみをラベルエンコーディング # 除外するカラムをexclude_colsに指定 encoder1 = Pipeline([ SelectCategorical(exclude_cols=["Name"]), LabelEncoder(output_suffix=""), ]) display(encoder1.fit_transform(dtrain).head()) display(encoder1.fit_transform(dtest).head())
カテゴリカルデータのみのラベルエンコーディングと、複数のカテゴリカルデータを組み合わせてラベルエンコーディングを合わせて実行
# SelectCategorical() カテゴリカルデータ(object)のみをラベルエンコーディング # ConcatCombination() 複数のカテゴリカルデータを組み合わせてラベルエンコーディング # r=2 は結合するカラムの数 encoder2 = Pipeline([ SelectCategorical(exclude_cols=["Name"]), ConcatCombination(drop_origin=True, output_suffix="", r=2), LabelEncoder(output_suffix=""), ]) display(encoder2.fit_transform(dtrain).head()) display(encoder2.fit_transform(dtest).head())
4つの項目から2つを選ぶ組み合わせ 4C2 = 6 6通りが出力される
数値データのみのラベルエンコーディング
# SelectNumerical() 数値データのみをラベルエンコーディング # train.csv のみに含まれる目的変数 Survived は数値データなので、SelectNumerical() の対象となる # train.csv はSurvivedカラムを含み、test.csvは Survivedを含まないので、SelectNumericalのexclude_cols(除外するカラム)でSurvivedを指定したい場合は、 # train.csvとtest.csvそれぞれ分けてラベルエンコーディングする必要がある encoder3_1 = Pipeline([ # 除外するカラムをexclude_colsに指定 SelectNumerical(exclude_cols=["PassengerId", "Survived"]), LabelEncoder(output_suffix=""), ]) display(encoder3_1.fit_transform(dtrain).head()) encoder3_2 = Pipeline([ SelectNumerical(exclude_cols=["PassengerId"]), LabelEncoder(output_suffix=""), ]) display(encoder3_2.fit_transform(dtest).head())
数値データのみのラベルエンコーディングと、複数の数値データを加算して新しい項目を作る処理を合わせて実行
# SelectNumerical() 数値データのみをラベルエンコーディング # ArithmeticCombinations() 複数の数値データを加算して新しい項目を作る # encode3_x と同様にtrain.csv と test.csv で分ける encoder4_1 = Pipeline([ SelectNumerical(exclude_cols=["PassengerId", "Survived"]), ArithmeticCombinations( drop_origin=True, operator="+", r=2, output_suffix="", ), ]) display(encoder4_1.fit_transform(dtrain).head()) encoder4_2 = Pipeline([ SelectNumerical(exclude_cols=["PassengerId"]), ArithmeticCombinations( drop_origin=True, operator="+", r=2, output_suffix="", ), ]) display(encoder4_2.fit_transform(dtest).head())
本ブログでは省略しますが、lambdaを使った処理を組み合わせたり、処理をpickleデータに保存する方法もチュートリアルでは紹介されています。
では、学習データとして使用するデータをチョイスします。
# SelectCategorical dtrain_en1 = encoder1.fit_transform(dtrain) dtest_en1 = encoder1.fit_transform(dtest) display(dtrain_en1.head()) display(dtest_en1.head()) # SelectCategorical + ConcatCombination dtrain_en2 = encoder2.fit_transform(dtrain) dtest_en2 = encoder2.fit_transform(dtest) display(dtrain_en2.head()) display(dtest_en2.head()) # SelectNumerical dtrain_en3_1 = encoder3_1.fit_transform(dtrain) dtest_en3_2 = encoder3_2.fit_transform(dtest) display(dtrain_en3_1.head()) display(dtest_en3_2.head()) # SelectNumerical + ArithmeticCombinations dtrain_en4_1 = encoder4_1.fit_transform(dtrain) dtest_en4_2 = encoder4_2.fit_transform(dtest) display(dtrain_en4_1.head()) display(dtest_en4_2.head())
選択したデータをtrainデータ、testデータにそれぞれマージします。
# データ結合 train = pd.concat([dtrain_en1, dtrain_en2], axis=1) train = pd.concat([train, dtrain_en3_1], axis=1) train = pd.concat([train, dtrain_en4_1], axis=1) train = pd.concat([train, dtrain["Survived"]], axis=1) test = pd.concat([dtest_en1, dtest_en2], axis=1) test = pd.concat([test, dtest_en3_2], axis=1) test = pd.concat([test, dtest_en4_2], axis=1) display(train.head()) display(train.shape) display(test.head()) display(test.shape)
学習のための特徴量、およびパラメーターを設定します。
# 特徴量とするカラムのリスト features = [ "Sex", "Ticket", "Cabin", "Embarked", "SexTicket", "SexCabin", "SexEmbarked", "TicketCabin", "TicketEmbarked", "CabinEmbarked", "PclassSibSp", "PclassParch", "PclassFare", "AgeSibSp", "AgeParch", "AgeFare", "SibSpParch", "SibSpFare", "ParchFare" ]
lightGBMで学習を行っていきます。
# ホールドアウト法 X_train, X_test, y_train, y_test = train_test_split(train[features], train["Survived"], random_state=42) # 学習モデルの作成 model_lgb = lgb.LGBMClassifier() # モデルのインスタンスの作成 model_lgb.fit(X_train, y_train)
バリデーションデータについて、予測値と実績値を比較して誤差率を算定してみます。
# validationデータで誤差率を算定 val_pred = model_lgb.predict(X_test) val_score = f1_score(y_test, val_pred) print(f'f1 score は {val_score}')
出力:f1 score は 0.7314285714285713
気を取り直してテストデータで予測値を作成します。
pred = model_lgb.predict(test[features]) # gender_submission の Survived カラムを予測値に入れ替える gs["Survived"] = pred display(gs.head()) display(gs.tail())
Survived の値が小数点になってしまっているので、0、1に置き換えます
# 0.6以上の場合は 1、0.6未満の場合は 0 に置換 gs["Survived"].mask(gs["Survived"] >= 0.6, 1, inplace=True) gs["Survived"].mask(gs["Survived"] < 0.6, 0, inplace=True) display(gs.head()) display(gs.tail())
# csvへの出力 gs.to_csv(path + "submission.csv", index=False)
バリデーションデータでの結果は芳しくなかったですが、とりあえずxfeat のラベルエンコーダーを使ってlightGBMの学習ができました。
今回はタイタニックのデータを使った分類ですが、回帰でやるとどうなるか、そのうち試してみようと思います。
以上になります、最後までお読みいただきありがとうございました。
参考サイト
通勤時の学習用にChromebookを買ってみたので使用感をまとめた
(後記)LINEとサブディスプレイ使用について追記 Linuxでマウスなしでもコピペできるように設定で変更できることを追記 Linuxへのjupyter lab のインストールを追記 LinuxへのVS Code、Dockerのインストールを追記
緊急事態宣言も明け、テレワークから通勤に変わったため、通勤中もプログラミングの学習ができるよう、Asus製のChromeブック C223 を買ったので、レビューしたいと思います。
スペック
詳細は公式HP参照。
重量は約1kgと非常に軽く、片手で持つとさすがにちょっと気になりますが、カバンに入れている分には気になりません。
ディスプレイは11.6Wでちょっと小さいですが、プログラミングする分には今の所困っていません。
なお、タッチパネルはなく、セパレートやコンバーチブルではないのでタブレット使用はできませんが、その分安くて軽いです。
あまりタッチパネルやタブレットとしての併用は考えていないので、全く困っていません。
キーボードはキータッチが軽めでちょっとおもちゃっぽい気がします。
充電はUSB TypeCで行います。
ノーマルのUSBコネクタが1つ、TypeCが2つしかないので、充電でコネクタが1つ塞がるのは気になるのですが、TypeCのコネクタは左右両方についているので、充電ケーブルを左右どちらからでもさせるのは地味にいいなと思いました。
アプリ
ChromeブックなのでWindowsやMacのソフトウェアはインストールできませんが、Google Play ストア経由でAndoroidのアプリが使用できます。
試してみたアプリの個人的な感想を書いておきます。
Pydroid
全画面表示は問題なくできるのですが、データ分析やらで愛用しているjupyter notebook、jupyter labをインストールはできるのですが、立ち上げるとエラーになってしまい、色々試したのですがうまく行かなかったのでアンインストールしました・・・。
Linux
なんとLinuxを使う事ができます。
古い機種だとLinuxを使うことができないこともあるようなので、ChromebookでLinuxを使いたい場合は、キチンと調べた方がよさそうです。
300MBほどありますので、通信環境が良い場所でダウンロードしましょう。
マウスがあればコピペができるのですが(なぜか右クリックでコピペされます)、キーボード+タッチパネルだとコピペができないのが不便です。
Ctrl + Shift + pでLinuxの設定画面を開き、Ctrl + C behavior と、 Ctrl + V behavior にチェックを入れればコピペできるようになります。
Google Chrome
問題なく使えます。
ChromeストアでChromeのアプリをインストールすることも可能です。
Slack
概ね問題なく使えますが、普段使いしているWindowsやiPhoneのアプリに比べ、アイコンつけたり、ワークスペースを切り替えたりするのにひと手間余計にかかるので、若干使いづらいです。
こころなしか、ちょっと重い気もします。
Netflix
全画面表示も可能で問題なく使えますが、Netflixのプランによってダウンロードができるデバイスの数や同時に再生できるデバイスの数が決まっているので注意しましょう。
私は一番安いプランだったので、ストリーミング再生はできたのですがiPhoneですでにダウンロードしており、ChromeBookに動画をダウンロードすることができませんでした。。
DMM
残念ながらスマホと同様の縦型表示しかできず、なぜか動画のダウンロードもできないので使用するのは厳しそうです。
YouTube
ChromeブラウザでYouTubeが立ち上がるだけなので、ブックマークと同じです。。
使用自体は問題なくできました。
メール
まだ他のメールアプリを試していないのですが、標準搭載されているのがGmailアプリなので、Gmail以外のアカウントをメインで使用していると面倒そうだな・・・と感じました。
私はGmailをメインで使用しているので問題ないのですが、他のメールアプリもおいおい試したいと思います。
GitHub
ブラウザ使ったほうが便利ですw
Python環境
先述の通りPydroidはJupyter Notebookがうまく立ち上がらないのでお役御免に。
普段使っているAnacondaの導入はうまく行きませんでした。。。
仮想環境は構築できていませんが、Linux+CLIでなんとかPython、Jupyter Notebookのインストールができました。
メモリが4GBと心もとないので、kaggleの重いデータを回すとすぐメモリーエラーを起こします。。。
コードするだけと割り切って、読み込むデータを一部だけにする等の工夫をしないと厳しいですが、通勤時間専用機と割り切れば問題なさそうです。
参考にしたサイト
(追記)下記サイトを参考に、
sudo pip3 install jupyter lab
と入力したらjupyter lab もインストールできました。
(追記)下記サイトを参考に、VS CodeとDockerをインストールできた
フォルダ操作
フォルダ用のアプリを使います。
ダウンロード用フォルダ、Google Play用のフォルダ、Linux用のフォルダに分かれており、ダウンロードしたプログラミング用のデータ等は、ダウンロード用のフォルダから、Linux用のフォルダにコピペしてやれば問題なく使えます。
Git
上述のLinuxアプリ+CLIでGitを使えます。
GUIベースのものですと、Source TreeはLinux及びAndroidアプリに対応していないので不可、KrakenがLinuxに対応しているとのことですが、インストールエラーが出たので私は早々に諦めました。。
commit、push、cloneはできました。その他のコマンドはそもそも私がGitに慣れていないのでおいおい。。
参考にしたサイト
ブログ更新
このブログは、Google Chrome ブラウザを使って更新していますが、問題な更新できております。
スクリーンショット
Shift+Ctrl+ウィンドウを表示ボタンでできます。
スクリーンショット用のよいアプリがありましたら、教えていただけると喜びます!
電車内での使用・バッテリー
電車内で座れれば十分使用できます。
ちょっと肘が窮屈かな・・・とは思います、隣の人に迷惑にならないように使用しましょう。
覗かれて困るようなものを表示する予定はないのですが、見られているかな?と思うと気になるので覗き見防止フィルムを買いました。
家電量販店にサイズが合うものがコチラしかなかったので購入しました。
画面に両面テープで貼り付ける必要があるのがちょっと気になりますが、覗き見防止の機能はバッチリ果たされています。
片道1時間程度の電車内で使用していますが、今の所バッテリー切れにはなっていません。
カタログによると11時間ほど持つことになっていますが、バッテリーフル充電の状態で使用開始すると、あと7時間くらい持つ、と表示されます。
動画みたり、重い処理をしているともう少し短いかもしれませんね。
その他試したいこと
ディスプレイへの投影 USB TypeC ⇔ HDMI 変換コネクタを使えばできるようです。Amazonでポチったのでおいおい使用感を書きたいと思います。
VS Code の導入 Jupyter Notebook だとWebアプリ等の開発には不向きなので、VS Code等のツールが導入できるか試していきたいと思います。
Pipenv等の仮想環境の導入 たくさんあってどれにしたらいいのか悩みますが・・・、導入したいと思います。
Web会議での使用 マイク・スピーカーは標準装備されており、zoomやGoogle Meetのアプリはあるので問題なく使えると思いますが、いまのところ使用する機会がないので、おいおい試してみたいと思います。
追記
ディスプレイへの投影 HDMI-TypeCコネクタを購入。問題なくサブディスプレイを使用できた。携帯使用がメインなので使い所は帰ってきてからデータをGitにアップしたりするときに限られそうだが、大きな画面でできるのは便利。
外出先でのディスプレイ使用等が見込めるなら十分アリ。
LINE 認証コードを打てばスマホと併用できるPC版LINEと違い、スマホの乗換え扱いとなり、今使っているスマホ版のLINEが使えなくなってしまうようで、お役御免。
以上になります、最後までお読みいただきありがとうございました。
groupby と .agg() で DataFrameの集約を便利にするテクニック
DataFrame型をgroupbyで集約する時、agg() を使って、平均値や個数のカウントをまとめて行うテクニックです。
今回のコードはこちら。
今回は、外部データ、UCIの学生の成績のデータセットを使います。
データの内容を詳しく知りたい場合は、こちらをご覧ください。
import pandas as pd import os # DataFrameの表示数を変更 pd.set_option('display.max_columns', 100) pd.set_option('display.max_rows', 500) # カレントディレクトリの参照 path = os.getcwd()
外部データをURLから読み込みます。
外部に保存されているのが zipファイルのため、zipファイルの展開も併せて行います。
# 外部データのzipファイルの読み込みに必要 import zipfile import requests import io # データがあるurlを指定 url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip' # データをurlから取得 r = requests.get(url, stream=True) # zipファイル内のstudent-mat.csvをカレントディレクトリ内に展開 with zipfile.ZipFile(io.BytesIO(r.content)) as existing_zip: existing_zip.extract('student-mat.csv', './')
# データの読込 df = pd.read_csv(path + "\student-mat.csv", sep = ';')
必須ではありませんが、displayを使うと、まとめて1つのセルで .head()や .tail() を実行できるようになるので便利です。
# まとめて表示できるようにする from IPython.display import display # まとめて df を表示 display(df.head()) display(df.tail()) display(df.dtypes)
手前ミソですが、詳しくは下記サイトご参照ください。
このデータの性別(sex)ごとに、年齢はどうなのか、成績(G1~G3)はどうなのか、という集計をするとき、下記のようにgroupbyと.agg()を組み合わせると非常に便利です。
# 集計 df.groupby('sex').agg( count=('sex', 'count'), # sex の個数をカウント age_mean=('age', 'mean'), # age の平均値 G1_mean=('G1', 'mean'), # G1 の平均値 G1_median=('G1', 'median'), # G1 の中央値 G2_mean=('G2', 'sum'), # G2 の合計 G2_median=('G2', 'max'), # G2 の最大値 G3_mean=('G3', 'min'), # G3 の最小値 G3_median=('G3', 'std') # G3 の標準偏差 )
以上になります、最後までお読みいただきありがとうございました。
参考サイト
ポートフォリオを作りたい
データサイエンティストを目指して転職したものの、今のキャリアのままでいいのか…と悩んでいたところ、ポートフォリオを作ったらいいよ!とアドバイスをいただきました。
しかし、IT企業に勤めているわけでも、エンジニアでもないので、意図的に作りにいかないとポートフォリオを作ることはなさそう・・・。
ということで、作りたいポートフォリオを考えてみました。
とその前にポートフォリオってどんなものがあるんだろう
ググってみました。
データサイエンティストや機械学習エンジニアのポートフォリオが見つからなかったので、Web系ではありますが、参考になりました。
- Naoto Suzuki 's Portfolio
スキルセットと連絡先、WebサイトとスクリプトのGitHubが公開されています。
- HodaLab!
スキルセットがフロント、バック、デブオプスと分けられていてわかりやすいですし、職歴まで書いてありますし、何よりポートフォリオサイト自体がステキ・・・。
つくりたいポートフォリオ
自分が関心があって、企業等に関心をもってもらえそう?なモノをリストアップしてみました。
・AWS等によるデータ分析基盤の構築
やはり基礎となるのはデータ分析。
インフラの構築から機械学習までできればベストだなあ、と思っております。
参考記事
【レポート】AWSで構築するデータレイク基盤概要とアーキテクチャ例のご紹介 #AWSSummit | Developers.IO
[CTO Night & Day 2019] AWS で構築するデータレイク基盤と amazon.com での導入事例 #ctonight
【脳筋Tech】ダイエットの進捗を楽しくするための仕組みを作ってみた💪! - 継続は力なり
・ラズパイ+カメラを使った画像認識
IoT系と画像解析の学習のために。
画像だけでなく、センサー系一通りできるようにもなりたい。
参考記事
Raspberry PiとOpenCVによる画像認識で人の顔を判別する | パソコン工房 NEXMAG
ラズパイとAWS IoT連携 (Pythonで温度情報をクラウド送信) - Qiita
・kaggleコンペ
人様のNotebook参考に作ったもの+コンペ中につき更新中ではあるものの、コチラは対応済み。
コンペ終わったら感想ブログ書こう・・・!
・自然言語処理+Webアプリ
すごく大変そうだけど、やってみたい・・・!
参考記事
Pythonで検索エンジンを自作する方法 Part.1 - ログミーTech
以上になります、最後までお読みいただきありがとうございました。
jupyter notebook (jupyter labも可)の表示を便利にするテクニック
(追記)一番最後に、行数の多いデータの情報をざっくりつかむために便利なテクニックを追加しました。
jupyter notebook を使うと、DataFrameの中身や型、構成などを逐次確認できるので便利です。
import pandas as pd # DataFrame の作成 df = pd.DataFrame(data=[('a',1,2,3,4,5,6,7),('b',8,9,10,11,12,13,14), ('c',15,16,17,18,19,20,21),('d',22,23,24,25,26,27,28), ('e',29,30,31,32,33,34,35),('f',36,37,38,39,40,41,42), ('g',43,44,45,46,47,48,49)]) df.columns = ['category', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
ですが、セル1行に一度に入力しても、一番最後しか実行されません。
df.dtypes df.shape df.head() df.plot()
1個1個セルに入力すればよいのですが、ちょっと面倒です。
また、print関数をつかってもいいのですが、DataFrameの表示が見づらくなってしまいます。
print(df.dtypes) print(df.shape) print(df) df.plot()
こんな時は、IPython.display を使うとDataFrameもキレイに表示できるので便利です。
from IPython.display import display display(df.dtypes) display(df.shape) display(df.head()) display(df.plot())
(追記) また、今回は違いますが、行数の多いデータの場合、下記を使えば、情報をざっくりつかみやすいです。
display(df.head()) #最初の5行を表示 display(df.tail()) #最後の5行を表示 display(df.dtypes) #型を表示 display(df.shape) #構成を表示
なお、コードはこちらになります。
以上になります、最後までお読みいただきありがとうございました。
参考サイト
写経ですが、自分の好きなモノを投稿するアプリを作りました
追記:ログイン機能カットした誰でも投稿できる版のアプリを追加
アプリの名前を、Favo-Write(Favorite + Write)に決定
コード、アプリのURLをログイン機能カット版に修正
追記2:2022/1/22 にアプリの公開を停止しました。
だらさん主催の一週間でwebサービスを作るハッカソンに参加しました。
5/18~5/24の1週間でWebサービスを作るイベントです! Hello worldレベルのサービスでもOKですのでぜひご参加をお願いします! #駆け出しエンジニア 仲間が多い方は是非シェアもお願いします~
— だら@Flutterもやってる (@dala00) 2020年5月17日
お題は「Like」です。https://t.co/ORZQGb6Yu2 #Crieit #web1week #StayHome
今回のテーマは、「Like」でした。
どんなアプリか
マンガでも食べ物でも何でもいいので、好きなモノを投稿するアプリです。
(追記)アプリの名前を、Favorite(好きな) + Write(書く)で、Favo-Write(フェーバライト)にしました。
(会員登録機能がないので、見る事すらできないクソアプリですが、、)
http://favowrite.herokuapp.com/favowrite.herokuapp.com
コードはこちら
環境
flask
Heroku
制作について
オリジナルアプリでもなんでもなく、、、こちらの書籍のブログアプリを写経させていただきました。。
会員登録機能がないので、自分用のメモアプリでしかないのですが。。。
デプロイについてはコチラの記事を参考にさせていただきました。
反省点
デプロイされたWebサービスを作るのが全くの初めてでしたため、どういう機能はどのくらい手間やサーバーへの負荷がかかるかや、Herokuの容量制限等の知識がなく、紆余曲折しまくり、今の写経も6日目のスタートでした。
おまけに会員登録機能もないし、非会員の閲覧機能もないので、自分しか見れない・・・
(追記)ログイン機能をカットして、誰でも投稿・閲覧できるようにしました。
ですが、デプロイ自体を期間内にやりおえたので謎の充実感はあります笑
以上になります、最後までお読みいただきありがとうございました。
全4巻以内、Kindleで読めるマンガをまとめてみた(ネタバレなし)
やや落ち着いて来た感もありますが、自粛自粛で室内にこもりがちな今日、マンガなどはいかがでしょうか。
ですが、某海賊マンガや某少年探偵マンガ、某不良警察官マンガのように、全数十巻、全百何巻と言われるとなかなか手が出ないですよね。
某鬼と戦うマンガぐらいの巻数(2020/5/17時点だと20巻)でも、一からキャッチアップするのは辛いかなと個人的には思います。
そこで、何十番煎じかわかりませんが、全4巻くらい、Kindleで読めるマンガで、思い出深いものをまとめてみました。
なお、一応全部読んだことありますが、うろ覚えなところはご容赦ください。
七夕の国 全4巻
因習に縛られた超常的異能を受け継ぐ村の一族と、その異能をめぐる謎を描いた作品。
と言っても世界を巻き込むような大事件になるわけでもなく、現実の中で起こりそうな感じで(それがなおエグい)進んでいきます。
寄生獣の岩明均先生が書いているだけあって、人間の黒い部分の描き方がエグかった記憶があります。
この作品が気にいっていただけた方で、まだ読んでいない方は、寄生獣(全10巻)も読んじゃいましょう。
アニメでもいいかもしれません、実写映画は見てないので知らない・・・。
蜜の島 全4巻
世間から隔絶された島に訪れた男二人組が、違和感ありありな島の風習に戸惑いながら、島の風習(というより考え方?)の謎を解き明かす話です。
ネタバレ厳禁で謎を一緒に解きながら読むと〇。
読後感は・・・読まれたことのある方はわかっていただけると思いますが、割とよくなかったと思います。 (注:作品のクオリティが、ではないです)
こいつ・・・、と思うこと必死。
地底旅行 全4巻
原作の方は読んだことないのですが、ジュールベルヌの小説、地底旅行をマンガ化した作品。
なんと初版は1864年と150年以上前!
タイトルどおり、地底に広がる世界を旅行(というより探検)する話です。
主人公の1人、リーデンブロック教授のいっちゃってる感豪快さが記憶に残っています。
ドラえもんのび太の創生日記とか、竜の騎士とか、地底に国があるかも系の作品に影響を与えているんじゃないでしょうか。
伝説の勇者の婚活 全4巻
世界を救った勇者が婚活を始めたら・・・、という内容。
主人公のユーリ(勇者)が史上最強、かつ超いいヤツでありながら、超朴念仁なので、婚活中の対応を見る度、やきもきしてしまいます笑
個人的に一番好きなキャラは武器屋のブゥキンさんです。
プラネテス 全4巻
発売された当時(雑誌掲載は1999年から2004年)は宇宙+日常(と言ってもギャグではなく、リアルな生活)を描くマンガって珍しかったと思います。
なので読んだとき、スゲー、未来はこんな感じなのか・・・と思った記憶。
主人公のハチマキ含め、それ相応の代償や葛藤もありつつ、夢に向かって突き進んでいく感じがまたリアルでイイ。
なお、ゆるーい感じのアニメ版とは別物です。
ザ・ムーン 全4巻
浮浪雲、銭ゲバのジョージ秋山先生が描く、ロボット漫画。
少年少女の心が1つになることで、無敵のロボ、ザ・ムーンが悪を倒すため動き出す・・・とだけ聞くと一見冒険活劇風でありますが、黒い方のジョージ秋山先生が描いているので、一筋縄ではいきません。
特にラスト・・・。
なお、ぼくらの(全11巻)に出てくるロボット、ジ・アースの元ネタだったりします。
ぼくらの作品中でも、「少年少女があつまってロボットを動かす話があって~」みたいな下りがあります。
その作品、最後どうなるの?と聞かれて最後まで読んでない、と答えてますが、最後まで読んでなくてよかったね・・・。
以上になります、最後までお読みいただきありがとうございました。