学んだことでTitanic: Machine Learning from Disasterにチャレンジ

前回は書籍「scikit-learnとTensorFlowによる実践機械学習」の2章をやりました。今回はそこで学んだ前処理、パイプラインなどを使って、Kaggleの課題にランダムフォレストでチャレンジしてみます。

できたコードがこちら。


import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import OneHotEncoder, StandardScaler, Imputer
from sklearn.ensemble import RandomForestRegressor

df_train = pd.read_csv('../input/train.csv')
df_test = pd.read_csv('../input/test.csv')

#数値と文字列の属性を分ける
X_train_cat_attributes = ["Sex", "Ticket"]
X_train_num_attributes = ["Pclass", "Age", "SibSp", "Parch", "Fare"]

#不要な属性を削除
X_train = df_train.drop(["PassengerId", "Survived"], axis=1)
Y_train = df_train["Survived"]

X_test = df_test.drop(["PassengerId"], axis=1)

#パイプラインに流し込んだときに不要な属性を削除する関数
class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names].values

#数値属性を処理するパイプライン。       
num_pipeline = Pipeline([
    ('selector', DataFrameSelector(X_train_num_attributes)),
    ('imputer', Imputer(strategy="median")), #欠損値を埋める
    ('std_scaler', StandardScaler()) #正規化する
])

#文字列属性を処理するパイプライン
cat_pipeline = Pipeline([
    ('selector', DataFrameSelector(X_train_cat_attributes)),
    ('cat_encoder', OneHotEncoder(sparse=False)), #数値に変換する
])

#複数のパイプラインに流し込んで結果を結合してくれる便利なもの
full_pipeline = FeatureUnion(transformer_list=[
    ("num_pipeline", num_pipeline),
    ("cat_pipeline", cat_pipeline),
])

#正規化などを行う
full_pipeline.fit(pd.concat([X_test, X_train], ignore_index=True))

#データの前処理
X_train_prepared = full_pipeline.transform(X_train)

#ランダムフォレストで学習
forest_reg = RandomForestRegressor()
forest_reg.fit(X_train_prepared, Y_train)

X_test_prepared = full_pipeline.transform(X_test)

#推測と結果の出力
Y_prediction = forest_reg.predict(X_test_prepared)
submission = pd.DataFrame({
'PassengerId': df_test['PassengerId'],
'Survived': Y_prediction.round().astype(int)
})
submission.to_csv('submission.csv', index=False)

結果

スコアが0.77511になった。最初に用意されているgender_submission.csvが0.76555なのでそれを上回ることができ、データ分析しないよりはましだったと言える結果がでた。

気になったこと

パイプラインのDataFrameSelectorあたりの実装が野暮ったく感じるけどこんなもんなんだろうか

感想と次にやること

これまでできるようになったのは「Kaggleのチュートリアルの通りやる方法」と「scikit-learnとTensorFlowによる実践機械学習の2章のやり方」の2つ。その二つの道具を使って、タイタニックの問題を処理した。
チュートリアルと本の写経から離れたことで、実は理解できていないという箇所が発見でき改めて復習できたし、単純な問題とはいえ自力で結果を出すことができて自信になった。

同じコードで決定木も試したら決定木の方がスコアがよかった。パラメータの調整などに進みたい。

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習の2章の復習

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習の2章をやった。2章はエンドツーエンドの機械学習プロジェクトということでデータの入手から前処理、本番稼働までを体験できる章だ。

機械学習プロジェクトを進めているところを途中の思考も含めて一緒に体験できるような内容になっていてなかなかいいんじゃないかと思う。

なお、私の場合は本書の通りやって動かないところが多かった。公式のカーネルが公開されているのでそちらと見比べて進めると良い。

handson-ml/02_end_to_end_machine_learning_project.ipynb at master · ageron/handson-ml · GitHub

復習のためもう一度読みながら要点を箇条書きに記録する。

データの取得

  • データ入手の方法(早速書籍のURLにデータがないので注意)
  • データスヌーピングバイアスを避けるために20%のテストセットを自力で作る方法とscikit-learnで分割する方法。
  • サンプルの偏りをなくすためのstratified samplingを使ってテストセットを作る方法。

データの可視化

  • データを可視化する方法。corrメソッドを使ったstandard correlation coefficientを求める方法。これはPandasのscatter_matrix関数でも求められる。
  • データの属性を組み合わせて新しい有用な属性を作る方法

機械学習アルゴリズムに渡せるようにデータを準備する

  • データを予測子とラベル(ターゲット)に分ける。それらを何度もできるように関数にする
  • データのクリーニング。データのクリーニングには、特定の値を取り除く、属性全体を取り除く、値を設定する(0、平均、中央値など)がある。DataFrameのdropna(), drop(), fillna()などで簡単にできる。
  • 中央値を入れるのはscikit-learnのImputerを使えば簡単にできる。
  • テキストのデータは数値に変換する必要がある。Pandasのfactorize()関数などを使って数値にマッピングする方法がある。
  • 単純な数値への変換だと値に意味があると判断されると困るので、ワンホットエンコーディングという方法でマッピングする方法がある。これもscikit-learnがいい感じにやってくれる。
  • scikit-learnにない変換器を作りたい時も特定の関数を実装してTransformerMixinを規定クラスに追加すればパイプラインなどでも使える形になる
  • 特徴量のスケーリングもscikit-learnがあれば簡単
  • データの変換のステップはパイプラインでまとめる

ここまでやってみてCategoricalEncoderがscikit-learnに含まれてなかったりしたので公式が提供しているJupyter notebookを本節以降の部分を消して、ここまではうまくいったと仮定して進めることにした。

モデルを選択して訓練する

ここまで長かったけどデータの前処理のパイプラインができたのでモデルを色々簡単に試すことができる。

  • 線形回帰モデルでの訓練と予測
  • mean_squared_error関数でのRMSE測定
  • 過小適合してる時は強力なモデルを選ぶか、訓練アルゴリズムにより良い特徴量を与えるか、モデルの制約を緩めるか
  • 決定木を使った予測
  • scikit-learnを使った交差検証(cross-validation)、K分割交差検証(K-fold cross-validation)をする方法
  • ランダムフォレストを使った予測

モデルの微調整

  • scikit-learnのGridSearchCVを使うとハイパーパラメーターの自動調整ができる。
  • 探索空間が大き時はランダムサーチを使うと良い
  • 最後にテストセットでシステムを評価するが、当然交差検証より性能が低くなるのが普通なので、テストセットで性能が少し下がったからといってハイパーパラメーターをいじるのはよくない

システムを本番稼働、モニタリング、メンテナンスする

  • 一定間隔でシステムの性能をチェックし、モニタリングのコードをかこう
  • 新しいデータを使って定期的にモデルを訓練しないとデータの変化によってモデルが腐るのは普通のこと

やってみての感想

データの準備が9割ぐらいで、お楽しみのモデルの適用やパラメーターの調整などはわずかというのを体感できた。またその過程でどう考えてというのもこのデータの場合だけだけど筆者の思考を追体験できるような感じが楽しかった。

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

 

 

 

好きなチームものの映画を分類した

チームで力を合わせて力を発揮する映画が好きなので分類した。特に好きなものについて紹介する。

f:id:toyoshi:20180926211156p:plain

A 全員凄いけどさらにチームになって最強になるパターン

もともと一流の人たちが力を合わせてさらにすごいことをするのがこのパターン。感情移入はしにくいものの「こいつらが力を合わせたらどうなってしまうのか見てみたい」というワクワクがある。

アベンジャーズ

サノスという最強悪人から地球を守る映画。そりゃわくわくするよね。映画で連続ドラマやってるようなものだし。

ぼくらの七日間戦争

子ども達が工場に立てこもる話。見たのが昔すぎてちょっと記憶が曖昧だけど、各自は別に落ちこぼれではないのだけど学校や親への反抗から力をあわせるのが小・中学生の頃に体験してすごくよかった。

ぼくらの七日間戦争

ぼくらの七日間戦争

B 各自特殊な能力はあるけれど、一人では活躍できない

才能や能力は普通の人以上だが、工具や文具のようにそれ単体では主人公にはなれないような人たちがチームになって大きなことを成し遂げるパターン。

グレイテスト・ショーマン

サーカス発祥の話。小人症や、女性なのにヒゲが生えてる、めちゃくちゃ背が高いみたいな異常とされる人たちがサーカスという形でまとまることで大きな価値を生み出すという作品。短所を長所にするという点でとても勇気がわく

猿の惑星 創世記

猿が協力して脱出する話。チンパンジー、オランウータン、ゴリラなどの猿の特徴が活かされてる。

ガーディアンズ・オブ・ギャラクシー

マイナーなマーベルヒーローが力を合わせる話。宇宙のはみ出し者らがチームプレーで大きなことを成し遂げるところにグッとくる。冷静になると各自かなりスキルは高いんだけど作中では落ちこぼれという設定なのでこの枠。

C ダメなやつらが集まってなんか成し遂げる

一番好きなパターン。もう才能とかスキルとか全然ない人たちが歯を食いしばったらなんかできたっていうパターン。

がんばれ!ベアーズ

オールタイムベストの作品の一つ。本当にダメな人たちが野球をやってエリートチームと優勝を争う話。どれぐらいダメって言葉が通じない人がチームの中にいるレベル。最後の監督の采配のところは何度見ても涙が出てしまう。常に自分はチャレンジする側であるベアーズの一員だし、誰かくすぶっている人がいるときは自分がベアーズの監督のように振る舞いたいと思う。

スタンドバイミー

死体を探しに行く話。これほどいろんなことを真似したくなる映画って他にあります?

グーニーズ

海賊船を探して借金を返す話。子どもの頃に見て私の「映画ってこうじゃなくっちゃ」の基準になってる作品。私も小児喘息を患っていたというのもあるが、主人公が喘息持ちという弱い設定もよい。悪い敵、お宝発見、ピンチ、逆転、全てを失ってからのおまけなど映画のワクワクが全て詰まってる。

グーニーズ [Blu-ray]

グーニーズ [Blu-ray]

おわりに

皆さんはどのパターンの映画が好きですか。私が見たことがある・思い出せた映画はこんなものですが、皆さんの好きなチームものについてもぜひ教えてください。

内向的な人のための発信術

内向的な私が身につけてきた発信術を紹介します。もし他にもなんかいい方法があればぜひ私に教えてください

内向的な性質について私が感じた課題

  • 相手に嫌なことを伝えるのが難しい
  • 会議などで考えをまとめるのに時間がかかったり、発言しないことによって意見がないと思われてしまう
  • 初対面の人に自分のことをうまく話せない

言いにくいことがある時は最初に話すトピックの「数」を宣言して退路を断つ

言いにくいことを伝えるのはとても嫌だ。相手がどう反応するかわからないから不安だし、傷ついたら申し訳ないからです。でもどうしても伝えないといけないときもあります。

そういう場合は私はまず箇条書きで伝えることを簡単に数行でまとめて手元に紙で準備しておいて、最初に

「今日は3つ話したいことがあるんですが」

と数を宣言してしまうようにしています。さらに

「1つはちょっと伝えにくいことなんだけど」

するとあとは宣言した以上は嫌でも話さないといけなくなるのでスムーズです。この方法のポイントは数を伝えるだけなら嫌なことじゃないということです。これによって「話さなきゃいけなかったけど話せなかった」ということを防ぐことができます。

言いにくいことはグダグダ考えずにメモをそのまま読み上げてまず伝える

嫌なことを伝えるときは紙に書いておいてそのままそれを一字一句読み上げるようにしています。例えば手元に

「この間AさんにXXという発言をしていたと思うが、それでAさんはひどく落ち込んだそうです。その発言はどういう気持ちでしたんですか?」

と書いておいてそのまま読み上げます。ポイントは本当に一字一句読み上げることです。これが読み上げじゃないと「えーっと、この間XXってAさんに言ってたと思うんですが、それはあなたは多分悪気はなくて・・・私はあんまり気にしてないんですが・・・」というような感じでなかなか難しくなってしまいます。色々言いたいことはあるかもしれませんが、まずは伝えたいことをはっきり伝えて、そのあとフォローした方が相手には伝わります。

会議には話したいことを事前に共有しておく

会議の時は事前に話したいことを箇条書きで数行用意しておいて、メールやチャットなどで全員に送っておきます。また会議の最初にプロジェクターに写してしまうというのもよいです。こういうことをしてしまえば自分が発言しなくてもその通りに話が進むのでとても楽です。

会議でのチェックイン・チェックアウト

スクラムのプラクティスの一つにチェックイン・チェックアウトというのがあります。これはミーティングの最初と最後に全員が一言だけ今の気持ちを表明するというものです。特に会議の最初で全員が一度発言をするとその後の会話が活発になる効果があるとのことです。これは自分が強制的に発信できるだけでなく、周りの人の気持ちも聞けるのでなかなか良いプラクティスです。

参考:アジャイルなふりかえりにチェックイン!「場を設定する」アクティビティを実践しよう - RAKUS Developers Blog | ラクス エンジニアブログ

初対面の人には自己紹介を先に送る

初対面の人と話すのはとても難しいことの一つです。私は相手の話を聞くのは平気ですが、自分の話をするのが苦手なので、デフォルト状態で望むと自分の話はしないで会話が終わってしまいます。それだと得られるものが少ないし、相手にも失礼です。
その対策に私は自分の略歴やこれまでのブログの主要な投稿などをまとめたEvernoteのノートを作ってあります。そしてその共有URLを事前に相手に送るようにしています。

これは時間の節約になるし、相手が共通点を見つけておいてくれると話も弾むのでおすすめです。もちろん私の方も相手について過去の記事や会社のサイトがあればそれを見るなどして調査などしたりしています。

初対面の人には気持ちをメッセージで送る

私はよくランチのあとなどで「えっ?さっきの会話楽しんでたんですか?」と言われることがあります。私としてはすごく楽しく、興味深く会話に参加しているつもりでもあまり感情が表に出ないのでなかなか伝わらないようなのです。なので特に初対面の人などには「さっきはとても楽しかったです。特にXXの話などは〜」と別れてからメッセージを送るようにしています。

それでも困ったら、できないことは仕組みにするか「助けて」とお願いする

仕組みにするのは例えば話さなきゃいけないのに話せない人とは週1回の定例にするとか、週に1回必ずメールすると決めるとかです。「助けて」の方は私は日程調整が苦手でなんどやってもできなかったので他の人に「助けて、できない」と言ってお願いしました。これは仕事や家庭でも同じです。

最後に

なんどか「箇条書きしておいて」というのが出てきましたが、これはゼロ秒思考 頭がよくなる世界一シンプルなトレーニングという書籍で紹介されている方法でやっています。これはとりあえず考えをアウトプットするのにとても良い方法だし簡単なので知っておいて損はないと思う。悩んでる人はぜひお試しください。

《ゼロ秒思考》全ての人におすすめする究極の思考法とその実践効果 | Travewriter

ゼロ秒思考 頭がよくなる世界一シンプルなトレーニング

スマートスピーカーを半年使ってみて今どんな感じか

私はAlexaを家庭に導入している。使いこなしているほどではないが半年経った。今日使い方を人に話す機会があり、半年経ったからこそわかったことがいくつかあると気が付いたので紹介する。

今はリビングと寝室に1台づつ。妻と幼児が2人の構成。

Kindleの読み上げてAirPodsで聞く

普段それなりに本を読むが皿を洗ったり掃除をしたりといった自分が退屈に感じる時にKindleに読み上げてもらってイヤホンで聞いている。さすがKindle公式アプリだけあって、iPhoneの読み上げより固有名詞に強かったり、iPhoneの画像があると止まってしまうという不都合もない。

読み上げの欠点は読むスピードを上げたり読み飛ばすのが難しいことなので、自伝や会社の歴史(最近だとSHOE DOGとか)の最初から最後まで通読するタイプものを自然と選んでいる。

適当な音楽をかける

子どもと一緒の時はイヤホンをしにくいのでAmazon Musicで適当な音楽をかける。私は普段音楽を聞かないが、Amazon Musicだと映画のサントラも充実しているので好きな映画のサントラをかけたりすると気がまぎれる。あと子どもを急がせるときに運動会の曲をかけさせるなどの使い方もできる。

娘たちも幼稚園で習った曲やAKB48の曲などをAlexaにリクエストしたりしている。幼児だと「アレクサ」というウェイクワードが難しいようだがデバイスの方にウェイクワードを言ったのと同じ効果が得られる物理ボタンがついていてそれを使いこなしている。

朝、天気を聞く

こんなもん使わんだろと思っていたけど、食事中などにわざわざスマホを探したり触ったりしなくていいので情報を得るスピード自体は遅いがトータルとして清潔だし行儀がいいという感じで天気を聞くようになった。あとスマホを見るのに比べて家族全員に情報が伝わるのでその後の会話がスムーズという副次的効果もある。

エアコンのON/OFF

寝たままON/OFFできるようになったのでとても楽だ。特に消す時にリモコンを探したり移動しなくていいのはかなり良い。

テレビのON/OFF

消す時がリモコンを探さなくていいので楽。家事をしながらでも消せる。あと以前は子どもがテレビを見ているところに食事の時間だからと消そうとするとめちゃくちゃ子どもが怒るということがあったが、Alexaにやらせることで騒ぎになることが減った。不思議だ。

照明ON/OFF

寝たまま消せるので楽。

タイマー

料理をしていて手が汚れたままタイマーが使えるのは便利。子どもに「後15分遊んだらおわりね」という使い方の時も、そのまま「アレクサ15分タイマー」といえばタイマーがセットされるのが楽(キッチンタイマーだと子どもが勝手に延長したりする)

いま何時と聞く

朝目が覚めた時に使う。目をつむったまま今の時間を知ることができる。

そのほかの自動化

まとめ

  • 「天気をきく」「時間を聞く」「テレビを消す」といった、スマホだけで不便に感じてないこともスマートスピーカースマホやリモコンを手にすることなくできるようになることには価値がある
  • 子どもに間接的に指示するのは親子共に良い効果がある
  • 要望:KindleアプリにAlexaなしで読み上げができる機能が早くついてほしい

最近のコーヒー環境2018

f:id:toyoshi:20180317105951p:plain

最近のコーヒー環境 2016」から1年ちょっとたったので最新のアップデートを記録しておく。

変わったこと

淹れ方とか器具を以前は工夫してたけどどうでもよくなってきた。それより安定した味で飲むためには微粉を捨てれば手っ取り早いということを覚えた。

焙煎からの時間と微粉が味に一番影響する。



味に影響する要素(調査:私の主観2018)


当たり前だが豆の種類と焙煎からの時間が味を一番決めるのでそこは変わらない。焙煎しているところで買ってきて二週間以内に使い切ることが大事だ。
しかしその次に大きな要素が微粉の量である。最近私はおかし作り用のふるいで微粉を捨てるようにしている。これで味がめちゃくちゃ安定するようになって心の平穏を得た。

微粉を捨てることで雑味や渋みがすごく減る。逆に言えば物足りないなという気分なるときもあるのでたまに捨てなかったりする。特に私の場合は仕事場にはカットミルを置いているが自宅では臼のハンドミルを使っており微粉が多いので自宅では必要な工程だ。

ふるいにかけた味が好みかどうかはともかくとにかく安定するようになるので、安定しないことで悩んでいる人は試す価値はある。

抽出のやり方の違いはそんなに気にしない

抽出方法は上記の影響に比べるとなんでもないので気にしなくなった。1分蒸らしたらウェーブドリッパーに1回目は少なめにお湯を淹れて抽出して、2回目、3回目はたっぷりとお湯をいれて終わり。抽出量が足りなくても抽出時間が長くなると味が変わるので単にサーバーの方にお湯を足して量を増やす。

余裕があればお湯の温度を下げる

湯の温度は低いほうがスッキリした味になる。初めて買ってきた豆の時や、朝余裕があるときは80度にお湯の温度を下げて抽出する。そのあと熱湯をコーヒーに足して飲む。

豆の買い方

岐阜に行った時にYAJIMA COFFEEで買う。それが切れたら近くの店で丸山珈琲の豆を買う。
他にも岐阜や名古屋はコーヒー焙煎しているところがいっぱいあってとても良い

電話が嫌な私が店を予約するときに考えること

家族で飲食店に行く場合。

電話をかける前

まず当然だけど今日店が休みだったら嫌なので定休日を確認する。そして営業日なら次に営業時間を確認する。営業時間内に電話したいからだ。

ただし今が昼の12時なら絶対に電話はしない。忙しい時間に電話するようなことはしたくないし、電話に出てくれたとしてもこちらが落ち着かないから。同様に18時から20時位までも電話をしない。遅い時間の場合は翌日にする。

次に時間が大丈夫だったら電話しようと決心する。事前に考えておきたいのは希望の日時がダメだった場合にどうするかだ。時間をずらしていいのか、ずらしていいなら何時間までなら大丈夫か、そもそも日を変えるのか店を変えるのか。2つか3つかは候補が欲しいところだ。これらの決定権が自分にないなら自分が電話するのは間違ってるので決定権を持ってる人に依頼する。

あとはコース料理を頼むかどうかも決めておきたい。コースしか受け付けてない店もあるからだ。予算も知りたい。その店の有名な料理が一番安いコースだとないということもよくあることだ。

電話をかける

電話が繋がったとして、まず何から伝えようか迷う。子連れの場合はまず子連れでいいのかどうかこちらとしては確認したい。そもそも子連れがダメな店は結構あって、日程を調整したあとでは時間がもったいないからだ。他にも個室が空いているか、ベビーフードの持ち込みは可能か、禁煙席はあるかなどこちらの「予約しない条件」というのがあるので先に聞きたいが最初にそれを一口で言ってしまうと相手もびっくりするだろうからグッと堪える。本当はここで並列に一気に条件を聞きたい「こちらパターン1001110です。」「ああ当店は1001111 なのでダメですね。惜しいですね。」みたいな感じが理想だ。

結局日付なのか人数なのか料理なのか何から伝えればいいのかわからないので私は最初は

「予約をしたくて電話しました」

とだけ言うようにしている。相手の予約受付ルールに乗りたいからだ。
それから大抵は「いつでしょうか?」と聞かれるので日時を伝える。
このとき日程が二週間以上先ならなんとも思わないが、それ以下の時はドキドキする。明日や明後日などの直近の予約ならなおさらだ。行きたい店なのに明日空いていると思ってるなんて失礼で恥ずかしいからだ。いかに「私は御店のような人気の店が空いているとは思ってないが・・・」と表現するか悩む。好きな人に「お付き合いしてる人っていますよね?」と聞くことはあっても「付き合ってる人いないよね?」と聞くひとはいないだろう。そんな感じで過剰にへりくだりすぎずに丁寧に聞きたいのだ。

次は結構な割合の店が

「わかりました確認しますね」

と保留になる。一番ドキドキする時だ。保留が長いと「店長と揉めてるのかな?忙しい日で迷惑がられててたら嫌だな」などと悪い想像をしながら待つ。

相手が戻ってきて日時OKなら一安心だ。これで4名以下で子どもがいない場合はまず予約確定と思っていいだろう。気持ち的にはここまででとても疲れたので一休みしたい。しかし、そうも言ってられないので次は人数を伝える。ここで子どもNGパターンがあるので油断はできない。なぜ最初に聞かないのかと思う。もう一度ドキドキさせられる。
ぜひ一度で日時と人数を一緒に聞いて欲しい。

日時と人数が確定すればあとはあまり心配事はなくなるが、他にも色々確認事項があるとあると辛い。例えば駐車場の有無などの常識的なことを聞くのはいいが「バースデーケーキの用意」など、他の店にはあるが飲食店の標準サービスとまでは言えないものを聞いてNoの時はとても申し訳ないし恥ずかしい気持ちになる。

最後に

自分で書いてみて嫌なポイントが

  • 不確定要素がある(空いてるかどうか)
  • オプションが多く、相手がそのオプションを用意しているかどうかわからない

の2点かなと思う。似たような嫌さのものは美容院の予約もあるが、私は妻が行くときに一緒に予約してもらって行くという方法で自分では予約をしなくてよくなった。妻は「大人なのに恥ずかしくないのか」というが私は恥ずかしくない。

他にも電話でなくても靴屋が嫌なので数年同じものをネットで買い続けている。靴屋は気に入ったものを探すだけでも嫌なのに、自分のサイズがないということがあるのが耐えられない。あのシステムを何とかして欲しい。

最近はネットで予約できる店が増えてきて本当にいい時代になったと感じる。