StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Pythonメモ: Tweepyのややこしいレスポンスデータの読み方 〜Twitter API活用の最初の難関〜

Twitterのbot作りは良い勉強になる

 以前のエントリで紹介したように、Tweepyというライブラリを使うと、かなり簡単にPythonでTwitterを自動操作出来るようになります。


www.statsbeginner.net


 つぶやいたり、フォロー/アンフォローしたり、RTしたりふぁぼったりといったアクションをTweepyを使って記述し、自動で実行できる環境に置けば、自前のbotが出来上がります。botといえば、ブログ記事の紹介ツイートを定期的に流したり、新しいフォロワーにフォロバするといった使い方がよくされていますが、自作のプログラムであれば例えば特定のキーワードを含むツイートをしているユーザを検索してそのプロフィールを取得してデータベース化するとか、ふぁぼやRTをよくしてくれる人を一定の基準を設けてリストに登録していくといった複合的な作業も、自動化できて手間が省けます。


 私は自分がメインで使ってる個人アカウントとは別に、仕事や趣味の情報を収集・発信するためのアカウントをいくつか運営していて*1、それらのアカウントではフォロバなどいくつかのアクションを自動化しています。初心者なので勉強しながら色々な機能を作ってみて、自動化できた操作が増えるたびに「これは便利!」と実感しています。暴走したら困る*2のでまだメインのアカウントにはほとんど組み込んでないけどw
 動作環境は単純で、Tweepyを使って書いたPythonのスクリプトを、AWS(EC2)で借りた一番安いスペックのLinuxサーバに置いて、cronでPythonインタープリタごと起動して動かしてます。このへん、一連の環境作りを後日エントリにまとめようと思います。


 今は、機械学習の練習台にと思って、スパム的なアカウントや、過激なネトウヨアカウントなどを識別して自動的にフォローを外すなどの機能を加えるため、学習用のデータを集めているところです。そのためのデータ収集も、ある程度自動化しています*3
 最近思うんですが、初心者がプログラミングの勉強を進める上で、「Twitterのbotづくり」はとても良い演習の題材な気がします。基本的なコーディングに慣れるし、私の場合はラッパーを介して単純化してしまっているものの「Web APIを使う」ことの入門にもなるし、「プログラムを自動で定期実行させる」ことの練習にもなります。私の場合、「AWSでLinuxサーバを借りてSSHでログインしてcronの設定をして・・・」という作業を初めてやってみるいい機会にもなりました。
 また、機械学習の練習にも良いのではと感じます。私もいま、特定の傾向を持つツイートのデータを集めてるんですが、単語で分割して頻度を数えてクラスタリングするみたいな単純な分析を試せるし、データを分析可能な形に成形するための処理を書く勉強にもなります。「データを取ってくる」→「加工する」→「解析する」→「レポートする」が一通り出来ないといけないので、Web APIを使った演習はためになると思いました。今後、WikipediaのAPIとかも使ってみたいと思っています。

Twitter APIを使う上での最初の難関

 さて、Tweepyを使えば、TwitterのREST APIを手軽に叩けるようになるのは事実なのですが、恐らく最初の難関となるのが、レスポンスデータが膨大すぎて意味分からんということです*4
 これはTwitterのAPIを(Tweepy等のラッパーを使わずに)生に近い形で叩いた場合に受け取るJSONを読む場合にもある程度言えることではありますが、後述する理由で、Tweepyの場合はさらにデータが膨大になっています。せっかくデータが得られても、中にどういう情報が入っているかがちんぷんかんぷんだと、やる気が失せます。
 「フォローする」「つぶやく」といったアクションだけを自動化するならレスポンスは特に気にしなくていいですが、自分のフォロワー/フレンド一覧を取得して何かやるとか、特定の内容のツイートを選んでRTするとか、他人のアカウントの特性(プロフの内容、フォロー/フレンドの傾向、最近のツイート等)を調べてフォローするかどうか決めるとかいう処理を行うには、どうしてもget系の機能で取得したレスポンスを読む必要が出てきます。


 ちなみに、たとえば私自身のツイート1件分のデータを要求した場合のレスポンスは、以下のようなデータです。なんかヤバいので画像にしました。


f:id:midnightseminar:20170212181117p:plain


 もはや、文字も小さすぎてよく分かりませんw
 このエントリの後ろのほうにテキストで掲載してますが、とりあえずここでは、大量の文字列が返ってきて吐き気がするイメージだけをつかんでいただければと思います。
 ツイート1件分でこんなのが返ってくると、必要な情報をどうやって取り出せばいいのか検討もつかず、いきなりやる気がなくなってしまう人も多いと思います。しかもこの例はまだマシな方で、場合によっては1つのツイートのデータが1000項目ぐらいの情報を含んでいる場合すらあります。


 しかしこのデータは、冷静に見ていけばそんなに複雑なわけでもなく、パターンが分かってしまえば欲しいデータを取り出すのに苦労はしなくなります。かなり多くのデータ項目が含まれてはいるのですが、だいたいよく使うものは限られてくるし、全体の構造がいったん頭に入ると、それがどこにあってどうやって取り出せるのかも簡単に分かります
 必要な情報のとり方がわかると、俄然やる気が出てきます。ツイートの位置情報はどこにどういう形式で入っているのかとか、何件くらいリツイートされているんだろうとか、そういうのが分かりだすと、「この情報を使ってこういう自動処理ができるのでは?」っていう想像力が働いて、色々プログラムを書いてみたくなってきます。


 そこで、本エントリでは、Tweepyを使っていて返される代表的なレスポンスデータの全体の構造と、よく使いそうなデータがどのように入っているのかをメモしておこうと思います。


 なお大前提ですが、TwitterのAPIでは「つぶやき」は「Status」と呼ばれ、あるアカウントがフォローしている相手のことは「Friend」と呼ばれます。フォローを外すアクションは「Destroy Friendship」という怖い名前で呼ばれます。ユーザ名(@がつくやつ)は「Screen Name」と呼ばれ、システム的に振られているID(数字の並びになっている)と区別されます。あとはだいたい、ふだん使っている機能のまんまかなと思います(followerとか)。
 また、以下の説明は、冒頭にリンクを貼った以前のエントリでやったように、「api」という変数名でTweepyのAPIハンドラオブジェクトを生成していることを前提とします。
 
 

レスポンスの種類

 まず、そもそも返されるデータにはどんな種類のものがあるのかですが、これはTweepyのreferenceを眺めるとわかります。


API Reference — tweepy 3.5.0 documentation

 
 色々なメソッドの使用法が書かれてますが(これも後日エントリにまとめようかと思います)、それぞれの一番下に、「Return type」って欄がありますよね。


 Return type: list of Status objects
 Return type: Status object
 Return type: User object
 Return type: list of DirectMessage objects


 みたいなやつです。
 各メソッドを使ったときに返り値として得られるデータは、いくつかの種類のTweepyオブジェクトの1つ、もしくはオブジェクトのリストです。


 このリファレンスを見ていると、「Status」オブジェクトと「User」オブジェクトがたくさん登場していますね。「List」オブジェクトとか「Frendship」オブジェクトとか「DirectMessage」オブジェクトもありますが、多くの機能で、返り値がStatusオブジェクトかUserオブジェクト、またはそれらのリストになっています。
 また、よく使うであろうものとしては、.followers_ids()メソッドや.friends_ids()メソッドで返ってくる、id(整数)のリストですね。あるアカウントを自分がすでにフォローしているかを判定するといった場合は、このidリストを使います。
 botを作って実行したいような事はたいてい、idリストかStatusオブジェクトかUserオブジェクトを使うのだぐらいに思っておいてもいいような気がします。


 StatusオブジェクトとかUserオブジェクトとか言ってますが、このStatusとかUserとかは要するにクラスになっています。たとえば、

>>> mytweet1 = api.user_timeline(count=1)[0]


 このように、自分のタイムラインを取得するメソッド「.user_timeline()」を使用すると、Statusクラスのオブジェクトのリストが返されます。上の例では、ユーザ名等を省略しているので「自分自身のタイムライン」が参照されており、その0番目要素、つまり「自分の最新のつぶやき」データを取得して、mytweet1という変数名に渡しています。このmytweet1という変数の中身はstatusクラスのインスタンスになっており、

>>> print(mytweet1.id)
830561754123956224


 のように、アトリビュートとして中身の情報を取り出すことができます(↑の例では.idでツイートのIDを表示)。
 要は、そのクラスのオブジェクトにどのようなアトリビュートが入っているのかを理解しておけば、レスポンスデータを使いこなして様々な処理を行うことができるわけですね。

レスポンスデータの構造

 Tweepyのレスポンスデータが、先ほど貼り付けた画像のようにパッと見めちゃめちゃややこしい理由の一つは、データがだいぶ冗長な構成になってるからです。同じ情報が何箇所にも入ってるんです。冗長化している原因は主に2つあります。
 1つは、Twitter APIが返すデータがそもそも、「ユーザのデータを取得するとそのユーザの最新のツイートのデータが付いてくる」「ツイートのデータを取得するとそのユーザのデータが付いてくる」ようになっていることですね。もともと入れ子になってるわけです。
 もう1つは、Tweepyは、Tweepyで作ったオブジェクトのアトリビュートとして直接取り出せるデータの他に、Twitter APIが返してくる生のJSONのデータも埋め込んでくれているからです。このおかげで、取り出せるデータがほぼまるごと、「素のアトリビュートの1項目」と「アトリビュートの1つとして埋め込まれたJSON内の1項目」で重複する形になっています。
 この1つ目と2つ目の要因が重なって、たとえばある1つのツイートのデータを取得すると、そのツイートの性質を表すさまざまなデータ項目と、それがJSONでまとまった項目が含まれるのに加えて、そのツイートの主であるユーザの性質を表すさまざまなデータ項目と、それがJSONにまとまった項目も得られるわけですね。んでJSONの中身も入れ子になっていると。
 私は今のところJSONのデータを使っていませんが、Tweepy以外の手段(たとえばurllib2)でAPIをコールする作業と統合するようなことを考えると、JSONで見るように揃えておいたほうが良いのかもしれません。


 主なTweepyオブジェクトのデータの構造を、途中のデータを省略した形で、改行とインデントを加えて整理すると以下のようになります。入れ子構造がつかめると、データを見るのが楽になります。
 なお以下はあくまで例で、同じ種類のオブジェクトでも、中身によって構成が違うことがあります。

Userオブジェクト

 Userオブジェクトは、ユーザのID、Screen Name、フォロワー数、地域など様々な情報を含んでいますが、大雑把には以下のように、なっています、jsonデータとstatsuデータが埋め込まれていること、statusデータにはそれ自身のjsonデータも埋め込まれているところがポイントかなと思います。
 他の種類のオブジェクトでもそうなのですが、Tweepyのデータは(hoge=hage, hogee=hagee)というように、丸カッコで括られて、項目名=値という書式で入っています。JSONが埋め込まれる時は、「_json={ }」という項目として埋め込まれ、{ }の中にJSONの書式で、「'hoge':hage, 'hogee':hagee」というようなデータが書き込まれます
 

User(
	【省略】
	_json={
		【省略】
		'status': {【省略】}
		【省略】
	}, 
	【省略】
	status=Status(
		【省略】
		_json={【省略】}
		【省略】
	), 
	【省略】
)

 
 Userオブジェクトの1階層目には、たとえばユーザのscreen nameが入っています。user1という変数名でオブジェクトが与えられたとすると、
 user1.screen_name
 というふうに記述すれば、screen_nameを取り出せます。
 JSONが埋め込まれて階層的になっている場合に、たとえばあえてJSON内の情報を取り出したいとすると(1階層目から直接同じ情報が取れますが)、
 user1._json['screen_name']
のように記述します。jsonから取り出す書式は、Pythonの辞書型と同じと覚えておけばいいですね。
 
 

Statusオブジェクト

 Statusオブジェクトは以下のようになっています。Status(つぶやき)なので、当然、つぶやきのIDやテキストなど様々な特性がデータ項目として埋め込まれていて、その並びの中に、「author」や「user」という項目名でuserオブジェクトが埋め込まれています。
 authorとuserは似たような情報が入ってて混乱しますが、userのほうは既に非推奨(depreciated)となっているので、authorのほうを使ったほうが良いようです*5
 それに加えてJSONも埋まっているので、なかなかややこしいデータになっています。
 

Status(
	【省略】
	author=User(
		【省略】
		_json={【省略】}
		【省略】
	), 
	【省略】
	user=User(
		【省略】
		_json={【省略】}
		【省略】
	), 
	【省略】
	_json={
		【省略】
		'user': {【省略】}
		【省略】
	}, 
	【省略】
)

 
 

RTありのStatusオブジェクト

 リツイートされたものは一気に複雑になります。要は、1階層目ではそのリツイート自体の情報(時刻とか)を表現しなければならず、その中にretweeted_statusという情報を埋め込んで、RTされた元のツイートのデータを入れているわけですね。そしてまたユーザのデータが埋め込まれたり、JSONも埋め込まれたりすることによって、大変複雑になっています。
 結果として階層が深くなっており、
 OBJECT.retweeted_status.author._json['screen_name']
 のような取り出し方があり得ますw
 

Status(
	【省略】
	author=User(
		【省略】
		_json={【省略】}
		【省略】
	), 
	【省略】
	user=User(
		【省略】
		_json={【省略】}
		【省略】
	), 
	【省略】
	retweeted_status=Status(
		【省略】
		author=User(
			【省略】
			_json={【省略】}
			【省略】
		), 
		【省略】
		user=User(
			【省略】
			_json={【省略】}
			【省略】
		), 
		【省略】
		_json={
			【省略】
			'user': {【省略】}
			【省略】
		}, 
		【省略】
	), 
	【省略】
	_json={
		【省略】
		'retweeted_status': {
			【省略】
			'user': {【省略】}
			【省略】
		}
		【省略】
	}, 
	【省略】
)

 
 

Friendshipオブジェクト

 簡単なやつもみてみましょう。
 api.show_friendship(source, target)というメソッドを用いると、特定の2ユーザ(sourceとtarget)間の関係を表示させることができます。もちろんどちらかが自分自身でも構いません。フォローしてるかどうかとか、ブロックしてるかどうかとかがわかります。
 このメソッドの返り値は簡単な構造になっていて、

(
Friendship(【省略】), 
Friendship(【省略】)
)


というものです。source側から見た関係と、target側から見た関係が、それぞれFriendshipオブジェクトになっていて、そのタプルが返されます。
 
 

SearchResultオブジェクト

 api.search()というメソッドがあって、これはキーワードで検索して該当するツイートが得られるというやつなのですが、この返り値はstatusのリストになっています。
 つまり実体としては、
 [Status(), Status(), Status()]
 というようなデータが得られるので、たとえばインデックスで[0]を指定して1個目を取り出したとすると、1件目でヒットしたツイートの内容が、Statusオブジェクトとして取得出来ます。
 
 

レスポンスの中身

 さて、では実際にレスポンスの中身を見ていきたいと思いますが、正直、項目が多すぎて、いちいち説明してるととんでもない分量になりますし、私も何なのか理解してない項目がたくさんあります。
 なので、以下では、レスポンスの取得例を、改行とインデントで整理したテキストを貼り付けて、いくつかの項目についてその意味を述べておくに留めます(すいません)。階層関係を掴みやすくするために、たとえばjsonが埋まっている場合は「##### ここからstatus/_json #####」といったテキストを挟んであります。


 こうやって改行とインデントによって、項目を分離しかつ階層関係が把握されるだけでも、中身は随分と読みやすくなります。私はすべて「肉眼でパース」(笑)して改行とインデントを手作業で入れていったので、全部読んだことになりますが、数百項目を順番に読んで行ってもそんなに疲れませんでした。*6
 各項目は、項目名を見れば何のことなのかだいたい分かると思いますし、Twitter APIが返すJSONの中身に対応しているので、API関連の情報をググれば意味はすぐに突き止められます。Twitter本家のAPIリファレンスを日本語で解説したサイトをみるとかもオススメです。


 以下、膨大な量のテキストを引用形式で貼り付けていきますが、スマホだと右端で折り返されてわけのわからない表示になる可能性があります。また、パソコンでみるにしても、テキストエディタかなんかにコピペして縮小したり拡大したりしながら見たほうがいいかもしれません。

Userオブジェクト

 idはシステム的に振られている数字の並び。
 screen_nameは「@〜」のところ。
 nameってのは表示名(頻繁に変えても大丈夫なやつ)です。
 id_strってのは、idがシングルクォーテーションで囲んであって、文字列型として扱えるやつです。
 statuses_countはツイート数。followers_countはフォロワー数。friends_countはフォロー数。
 protected(True or False)は鍵垢かどうか。色々な処理を書いていると、「相手が鍵垢だとエラーになる処理」とかがあって、エラーを回避するために事前に鍵垢かどうかをチェックする必要が出てきます。
 Followingは自分がフォローしてるかどうか。
 verifiedは認証済みユーザかどうか。
 langは言語、time_zoneはそのまんま。日本人ユーザのデータばかり集めたいときに使ったりとか。
 locationは自分で入力してある居場所で、ツイート(status)に自動でついてくるplaceとは別です。


 ・・・といったところですかね。これらのデータに、
 OBJECT.id
 OBJECT.screen_name
 みたいな書式でアクセスしてください。
 その他詳しくは、Syncerの解説をみるのが良いです。

User(
	time_zone='Tokyo', 
	profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', 
	listed_count=38, 
	is_translation_enabled=True, 
	profile_background_tile=False, 
	profile_location=None, 
	name='bata', 
	profile_sidebar_border_color='C0DEED', 
	screen_name='statsbeginner', 
	url='https://t.co/6HCF2FYowE', 
	follow_request_sent=False, 
	
	##### ここからuser/_json #####
	_json={
		'time_zone': 'Tokyo', 
		'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
		'listed_count': 38, 
		'is_translation_enabled': True, 
		'profile_background_tile': False, 
		'profile_location': None, 
		'name': 'bata', 
		'profile_sidebar_border_color': 'C0DEED', 
		'screen_name': 'statsbeginner', 
		'url': 'https://t.co/6HCF2FYowE', 
		'follow_request_sent': False, 
		'id_str': '257791390', 
		'default_profile_image': False, 
		'profile_use_background_image': True, 
	
		##### ここからuser/_json/status #####
		'status': {
			'favorite_count': 1, 
			'possibly_sensitive': False, 
			'coordinates': None, 
			'source': '<a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow">Hatena</a>', 
			'text': '去年、国立がん研究センターとJTの論争が話題になった頃にあわせて紹介した砂糖の話が、ウェルク事件に絡めて取り上げられていたw / “60年後にばれた米「砂糖業界」の大陰謀(上)「低脂肪ダイエット」のウソ--大西睦子\xa0|\xa0新潮社フ…” https://t.co/BQkMW7m6de', 
			'contributors': None, 
			'created_at': 'Mon Jan 23 05:15:50 +0000 2017', 
			'truncated': False, 
			'retweeted': False, 
			'in_reply_to_screen_name': None, 
			'is_quote_status': False, 
			'in_reply_to_user_id': None, 
			'id_str': '823398817370247168', 
			'retweet_count': 0, 
			'in_reply_to_status_id_str': None, 
			'id': 823398817370247168, 
			'in_reply_to_status_id': None, 
			'entities': {
				'urls': [{
					'display_url': 'htn.to/3i7io9', 
					'expanded_url': 'http://htn.to/3i7io9', 
					'url': 'https://t.co/BQkMW7m6de', 
					'indices': [117, 140]
				}], 
				'user_mentions': [], 
				'symbols': [], 
				'hashtags': []
			}, 
			'favorited': False, 
			'in_reply_to_user_id_str': None, 
			'lang': 'ja', 
			'place': None, 
			'geo': None
		}, 
		##### ここまでuser/_json/status #####
		
		'entities': {
			'description': {'urls': []}, 
			'url': {
				'urls': [{
					'display_url': 'statsbeginner.hatenablog.com', 
					'expanded_url': 'http://statsbeginner.hatenablog.com/', 
					'url': 'https://t.co/6HCF2FYowE', 
					'indices': [0, 23]
				}]
			}
		}, 
		'statuses_count': 13014, 
		'contributors_enabled': False, 
		'profile_link_color': '1DA1F2', 
		'notifications': False, 
		'id': 257791390, 
		'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
		'profile_sidebar_fill_color': 'DDEEF6', 
		'utc_offset': 32400, 
		'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
		'profile_text_color': '333333', 
		'followers_count': 1873, 
		'default_profile': True, 
		'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		'favourites_count': 1088, 
		'location': 'つくば市', 
		'needs_phone_verification': False, 
		'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
		'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		'protected': False, 
		'friends_count': 818, 
		'following': False, 
		'suspended': False, 
		'is_translator': False, 
		'profile_background_color': 'C0DEED', 
		'translator_type': 'none', 
		'geo_enabled': True, 
		'verified': False, 
		'has_extended_profile': False, 
		'lang': 'ja'
	}, 
	##### ここまでuser/_json #####
	
	default_profile_image=False, 
	profile_use_background_image=True, 
	
	##### ここからuser/stastus #####
	status=Status(
		favorite_count=1, 
		possibly_sensitive=False, 
		coordinates=None, 
		source='Hatena', 
		text='去年、国立がん研究センターとJTの論争が話題になった頃にあわせて紹介した砂糖の話が、ウェルク事件に絡めて取り上げられていたw / “60年後にばれた米「砂糖業界」の大陰謀(上)「低脂肪ダイエット」のウソ--大西睦子\xa0|\xa0新潮社フ…” https://t.co/BQkMW7m6de', 
		contributors=None, 
		created_at=datetime.datetime(2017, 1, 23, 5, 15, 50), 
		in_reply_to_user_id_str=None, 
		source_url='http://www.hatena.ne.jp/guide/twitter', 
		truncated=False, 
		_api=<tweepy.api.API object at 0x117919198>, 
		retweeted=False, 
		in_reply_to_screen_name=None, 
		is_quote_status=False, 
		in_reply_to_user_id=None, 
		id_str='823398817370247168', 
		retweet_count=0, 
		in_reply_to_status_id_str=None, 
		id=823398817370247168, 
		in_reply_to_status_id=None, 
		entities={
			'urls': [{
				'display_url': 'htn.to/3i7io9', 
				'expanded_url': 'http://htn.to/3i7io9', 
				'url': 'https://t.co/BQkMW7m6de', 
				'indices': [117, 140]
			}], 
			'user_mentions': [], 
			'symbols': [], 
			'hashtags': []
		}, 
		favorited=False, 
		
		##### ここからuser/status/_json #####
		_json={
			'favorite_count': 1, 
			'possibly_sensitive': False, 
			'coordinates': None, 
			'source': '<a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow">Hatena</a>', 
			'text': '去年、国立がん研究センターとJTの論争が話題になった頃にあわせて紹介した砂糖の話が、ウェルク事件に絡めて取り上げられていたw / “60年後にばれた米「砂糖業界」の大陰謀(上)「低脂肪ダイエット」のウソ--大西睦子\xa0|\xa0新潮社フ…” https://t.co/BQkMW7m6de', 
			'contributors': None, 
			'created_at': 'Mon Jan 23 05:15:50 +0000 2017', 
			'truncated': False, 
			'retweeted': False, 
			'in_reply_to_screen_name': None, 
			'is_quote_status': False, 
			'in_reply_to_user_id': None, 
			'id_str': '823398817370247168', 
			'retweet_count': 0, 
			'in_reply_to_status_id_str': None, 
			'id': 823398817370247168, 
			'in_reply_to_status_id': None, 
			'entities': {
				'urls': [{
					'display_url': 'htn.to/3i7io9', 
					'expanded_url': 'http://htn.to/3i7io9', 
					'url': 'https://t.co/BQkMW7m6de', 
					'indices': [117, 140]
				}], 
				'user_mentions': [], 
				'symbols': [], 
				'hashtags': []
			}, 
			'favorited': False, 
			'in_reply_to_user_id_str': None, 
			'lang': 'ja', 
			'place': None, 
			'geo': None
		}, 
		##### ここまでuser/status/_json #####
		
		lang='ja', 
		place=None, 
		geo=None
	), 
	##### ここまでuser/stastus #####
	
	entities={
		'description': {'urls': []}, 
		'url': {
			'urls': [{
				'display_url': 'statsbeginner.hatenablog.com', 
				'expanded_url': 'http://statsbeginner.hatenablog.com/', 
				'url': 'https://t.co/6HCF2FYowE', 
				'indices': [0, 23]
			}]
		}
	}, 	
	statuses_count=13014, 
	contributors_enabled=False, 
	profile_link_color='1DA1F2', 
	notifications=False, 
	id=257791390, 
	profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', 
	profile_sidebar_fill_color='DDEEF6', 
	utc_offset=32400, 
	description='統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
	profile_text_color='333333', 
	suspended=False, 
	followers_count=1873, 
	default_profile=True, 
	profile_image_url='http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
	favourites_count=1088, 
	_api=<tweepy.api.API object at 0x117919198>, 
	location='つくば市', 
	needs_phone_verification=False, 
	created_at=datetime.datetime(2011, 2, 26, 4, 59, 47), 
	profile_image_url_https='https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
	protected=False, 
	friends_count=818, 
	following=False, 
	id_str='257791390', 
	is_translator=False, 
	profile_background_color='C0DEED', 
	translator_type='none', 
	geo_enabled=True, 
	verified=False, 
	has_extended_profile=False, 
	lang='ja'
)

 
 

Statusオブジェクト

 idはツイートのID。ツイートを個別に指定して何かの処理をやる時に必ず使います。
 textがツイートの本文。
 created_atはツイートの日時が入っていて、Pythonのdatetime型のデータが得られます。
 他のツイートへのリプライだった場合はin_reply_to_screen_nameとかに値が入ります。
 retweet_countはRT数。favorite_countはふぁぼ数。
 retweetedとfavorited(True or False)は自分がRT・ふぁぼしたかどうかです。
 placeは位置情報(緯度経度じゃなくて、IPアドレスかなんかをベースに自動で振られるやつ)。上述したとおり、Userオブジェクトに入っているプロフのlocationとは別です。
 sourceで、パソコンからなのかスマホアプリからなのか等が判別できます。
 possibly_sensitiveは何のことかわからないのですが、何かのフィルタリングに使われるやつかな?
 下の例では出てきませんが、スマホ等からのつぶやきで緯度経度情報がある場合は、coordinatesって項目の中に数値が入ります。


 上述したように、authorとuserに似たような情報が入ってますが、userはすでに非推奨となっているので、authorの情報を使ったほうがいいようです。
 その他詳しくはSyncerの解説で確認するのがいいかと。

Status(
	
	##### ここからstatus/author #####
	author=User(
		time_zone='Tokyo', 
		profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', 
		listed_count=38, 
		is_translation_enabled=True, 
		profile_background_tile=False, 
		name='bata', 
		profile_sidebar_border_color='C0DEED', 
		screen_name='statsbeginner', 
		url='https://t.co/6HCF2FYowE', 
		follow_request_sent=False, 
	
		##### ここからstatus/author/_json #####
		_json={
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 800, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13014, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 'expanded_url': 'http://statsbeginner.hatenablog.com/', 'url': 'https://t.co/6HCF2FYowE', 'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		}, 
		##### ここまでstatus/author/_json #####
	
		default_profile_image=False, 
		profile_use_background_image=True, 
		entities={
			'description': {'urls': []}, 
			'url': {
				'urls': [{
					'display_url': 'statsbeginner.hatenablog.com', 
					'expanded_url': 'http://statsbeginner.hatenablog.com/', 
					'url': 'https://t.co/6HCF2FYowE', 
					'indices': [0, 23]
				}]
			}
		}, 
		statuses_count=13014, 
		contributors_enabled=False, 
		profile_link_color='1DA1F2', 
		notifications=False, 
		id=257791390, 
		profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', 
		profile_sidebar_fill_color='DDEEF6', 
		utc_offset=32400, 
		description='統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
		profile_text_color='333333', 
		followers_count=1873, 
		default_profile=True, 
		profile_image_url='http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		favourites_count=1088, 
		_api=<tweepy.api.API object at 0x117919198>, 
		location='つくば市', 
		created_at=datetime.datetime(2011, 2, 26, 4, 59, 47), 
		profile_image_url_https='https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		protected=False, 
		friends_count=800, 
		following=False, 
		id_str='257791390', 
		is_translator=False, 
		profile_background_color='C0DEED', 
		translator_type='none', 
		geo_enabled=True, 
		verified=False, 
		has_extended_profile=False, 
		lang='ja'
	), 
	##### ここまでstatus/autor #####
	
	possibly_sensitive=False, 
	coordinates=None, 
	source='Twitter for iPhone', 
	favorite_count=0, 
	text='ボーカル2人って知らなかった/クリスタルキング 大都会 https://t.co/fuCvYig0eu', 
	
	##### ここからstatus/user #####
	user=User(
		time_zone='Tokyo', 
		profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', 
		listed_count=38, 
		is_translation_enabled=True, 
		profile_background_tile=False, 
		name='bata', 
		profile_sidebar_border_color='C0DEED', 
		screen_name='statsbeginner', 
		url='https://t.co/6HCF2FYowE', 
		follow_request_sent=False, 
		
		##### ここからstatus/user/_json #####
		_json={
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 800, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13014, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 
						'expanded_url': 'http://statsbeginner.hatenablog.com/', 
						'url': 'https://t.co/6HCF2FYowE', 
						'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		},
		##### ここまでstatus/user/_json #####
		
		default_profile_image=False, 
		profile_use_background_image=True, 
		entities={
			'description': {'urls': []}, 
			'url': {
				'urls': [{
					'display_url': 'statsbeginner.hatenablog.com', 
					'expanded_url': 'http://statsbeginner.hatenablog.com/', 
					'url': 'https://t.co/6HCF2FYowE', 
					'indices': [0, 23]
				}]
			}
		}, 
		statuses_count=13014, 
		contributors_enabled=False, 
		profile_link_color='1DA1F2', 
		notifications=False, 
		id=257791390, 
		profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', 
		profile_sidebar_fill_color='DDEEF6', 
		utc_offset=32400, 
		description='統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
		profile_text_color='333333', 
		followers_count=1873, 
		default_profile=True, 
		profile_image_url='http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		favourites_count=1088, 
		_api=<tweepy.api.API object at 0x117919198>, 
		location='つくば市', 
		created_at=datetime.datetime(2011, 2, 26, 4, 59, 47), 
		profile_image_url_https='https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		protected=False, 
		friends_count=800, 
		following=False, 
		id_str='257791390', 
		is_translator=False, 
		profile_background_color='C0DEED', 
		translator_type='none', 
		geo_enabled=True, 
		verified=False, 
		has_extended_profile=False, 
		lang='ja'
	), 
	##### ここまでstatus/user #####
	
	contributors=None, 
	created_at=datetime.datetime(2017, 1, 22, 6, 5, 33), 
	in_reply_to_user_id_str=None, 
	source_url='http://twitter.com/download/iphone', 
	id=823048940182376452, 
	_api=<tweepy.api.API object at 0x117919198>, 
	retweeted=False, 
	in_reply_to_screen_name=None, 
	is_quote_status=False, 
	in_reply_to_user_id=None, 
	entities={
		'urls': [{
			'display_url': 'youtube.com/watch?v=ADgZso…', 
			'expanded_url': 'https://www.youtube.com/watch?v=ADgZsoSzDp0&feature=share', 
			'url': 'https://t.co/fuCvYig0eu', 
			'indices': [28, 51]
		}], 
		'user_mentions': [], 
		'symbols': [], 
		'hashtags': []
	}, 
	retweet_count=0, 
	possibly_sensitive_appealable=False, 
	in_reply_to_status_id_str=None, 
	truncated=False, 
	in_reply_to_status_id=None, 
	id_str='823048940182376452', 
	favorited=False, 
	
	##### ここから_json #####
	_json={
		'favorite_count': 0, 
		'possibly_sensitive': False, 
		'coordinates': None, 
		'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>', 
		'text': 'ボーカル2人って知らなかった/クリスタルキング 大都会 https://t.co/fuCvYig0eu', 
	
		##### ここから_json/user #####
		'user': {
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 800, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13014, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 
						'expanded_url': 'http://statsbeginner.hatenablog.com/', 
						'url': 'https://t.co/6HCF2FYowE', 
						'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		}, 
		##### ここまでstatus/_json/user #####
		
		'contributors': None, 
		'created_at': 'Sun Jan 22 06:05:33 +0000 2017', 
		'truncated': False, 
		'retweeted': False, 
		'in_reply_to_screen_name': None, 
		'is_quote_status': False, 
		'in_reply_to_user_id': None, 
		'id_str': '823048940182376452', 
		'retweet_count': 0, 
		'possibly_sensitive_appealable': False, 
		'in_reply_to_status_id_str': None, 
		'id': 823048940182376452, 
		'in_reply_to_status_id': None, 
		'entities': {
			'urls': [{
				'display_url': 'youtube.com/watch?v=ADgZso…', 
				'expanded_url': 'https://www.youtube.com/watch?v=ADgZsoSzDp0&feature=share', 
				'url': 'https://t.co/fuCvYig0eu', 
				'indices': [28, 51]
			}], 
			'user_mentions': [], 
			'symbols': [], 
			'hashtags': []
		}, 
		'favorited': False, 
		'in_reply_to_user_id_str': None, 
		'lang': 'ja', 
		'place': None, 
		'geo': None
	}, 
	##### ここまでstatus/_json #####
	
	lang='ja', 
	place=None, 
	geo=None
)

 
 

RetweetありのStatusオブジェクト

 以下はRTありの場合です。1000項目以上あってヤヴァいですが、UserとStatusを知っていればだいたい分かります。
 1階層目は、「RTである私のツイート」としての情報が入っていて、retweeted_statusの中に、RTされた元のツイートの情報が入っています。たとえば、Status直下の、私自身のツイート情報としてはsourceが'Twitter for Mac'になっていますが、retweeted_status中のsourceは'Twitter for iPhone'になっています。ピコ太郎さんがiPhoneのTwitterクライアントから投稿したツイートを、私がMacのTwitterクライアントからRTしたということです。


 下の例ではたまたま、extended_entitiesが入っているので、詳しいことを知りたければSyncerの解説を。「エンティティはテキストに含まれているURLアドレスやハッシュタグにリンクを付けてリッチテキスト化するための情報です。拡張エンティティはテキストに画像や動画を加えるための情報」です。
 この、entitiesやextended_entitiesは、階層が深くなる代表的な項目ですね。私は今のところ情報として使ったことがありません。

Status(

	##### ここからstatus/author #####
	author=User(
		time_zone='Tokyo', 
		profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', 
		listed_count=38, 
		is_translation_enabled=True, 
		profile_background_tile=False, 
		name='bata', 
		profile_sidebar_border_color='C0DEED', 
		screen_name='statsbeginner', 
		url='https://t.co/6HCF2FYowE', 
		follow_request_sent=False, 
	
		##### ここからstatus/author/_json #####
		_json={
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 775, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13015, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 
						'expanded_url': 'http://statsbeginner.hatenablog.com/', 
						'url': 'https://t.co/6HCF2FYowE', 
						'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		}, 
		##### ここまでstatus/author/_json #####
	
		default_profile_image=False, 
		profile_use_background_image=True, 
		entities={
			'description': {'urls': []}, 
			'url': {
				'urls': [{
					'display_url': 'statsbeginner.hatenablog.com', 
					'expanded_url': 'http://statsbeginner.hatenablog.com/', 
					'url': 'https://t.co/6HCF2FYowE', 
					'indices': [0, 23]
				}]
			}
		}, 
		statuses_count=13015, 
		contributors_enabled=False, 
		profile_link_color='1DA1F2', 
		notifications=False, 
		id=257791390, 
		profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1	/bg.png', 
		profile_sidebar_fill_color='DDEEF6', 
		utc_offset=32400, 
		description='統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
		profile_text_color='333333', 
		followers_count=1873, 
		default_profile=True, 
		profile_image_url='http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		favourites_count=1088, 
		_api=<tweepy.api.API object at 0x117919198>, 
		location='つくば市', 
		created_at=datetime.datetime(2011, 2, 26, 4, 59, 47), 
		profile_image_url_https='https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		protected=False, 
		friends_count=775, 
		following=False, 
		id_str='257791390', 
		is_translator=False, 
		profile_background_color='C0DEED', 
		translator_type='none', 
		geo_enabled=True, 
		verified=False, 
		has_extended_profile=False, 
		lang='ja'
	), 
	##### ここまでstatus/author #####
	
	possibly_sensitive=False, 
	
	##### ここからstatus/extended_entities #####
	extended_entities={
		'media': [
			{
				'type': 'photo', 
				'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'source_user_id': 747329673659482113, 
				'source_user_id_str': '747329673659482113', 
				'display_url': 'pic.twitter.com/uP5PYzWhHL', 
				'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'sizes': {
					'large': {
						'resize': 'fit', 
						'h': 1536, 
						'w': 2048
					}, 
					'small': {
						'resize': 'fit', 
						'h': 510, 
						'w': 680
					}, 
					'medium': {
						'resize': 'fit', 
						'h': 900, 
						'w': 1200
					}, 
					'thumb': {
						'resize': 'crop', 
						'h': 150, 
						'w': 150
					}
				}, 
				'indices': [36, 59], 
				'id_str': '823362891273281537', 
				'source_status_id_str': '823362903805804546', 
				'source_status_id': 823362903805804546, 
				'expanded_url': 'https://twitter.com/pikotaro_ppap/status	/823362903805804546/photo/1',
				'id': 823362891273281537, 
				'url': 'https://t.co/uP5PYzWhHL'
			}
		]
	}, 
	##### ここまでstatus/extenced_entities #####
	
	coordinates=None, 
	source='Twitter for Mac', 
	favorite_count=0, 
	text='RT @pikotaro_ppap: PONで華原朋美様とお写真ピコ! https://t.co/uP5PYzWhHL', 
	
	##### ここからstatus/user #####
	user=User(time_zone='Tokyo', 
		profile_background_image_url='http://abs.twimg.com/images/themes/theme1/bg.png', 
		listed_count=38, 
		is_translation_enabled=True, 
		profile_background_tile=False, 
		name='bata', 
		profile_sidebar_border_color='C0DEED', 
		screen_name='statsbeginner', 
		url='https://t.co/6HCF2FYowE', 
		follow_request_sent=False, 
	
		##### ここからstatus/user/_json #####
		_json={
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1	/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 775, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13015, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 
						'expanded_url': 'http://statsbeginner.hatenablog.com/', 
						'url': 'https://t.co/6HCF2FYowE', 
						'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes	/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		}, 
		##### ここまでstatus/user/_json #####
	
		default_profile_image=False, 
		profile_use_background_image=True, 
		entities={
			'description': {'urls': []}, 
			'url': {
				'urls': [{
					'display_url': 'statsbeginner.hatenablog.com', 
					'expanded_url': 'http://statsbeginner.hatenablog.com/', 
					'url': 'https://t.co/6HCF2FYowE', 
					'indices': [0, 23]
				}]
			}
		}, 
		statuses_count=13015, 
		contributors_enabled=False, 
		profile_link_color='1DA1F2', 
		notifications=False, 
		id=257791390, 
		profile_background_image_url_https='https://abs.twimg.com/images/themes/theme1/bg.png', 
		profile_sidebar_fill_color='DDEEF6', 
		utc_offset=32400, 
		description='統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
		profile_text_color='333333', 
		followers_count=1873, 
		default_profile=True, 
		profile_image_url='http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		favourites_count=1088, 
		_api=<tweepy.api.API object at 0x117919198>, 
		location='つくば市', 
		created_at=datetime.datetime(2011, 2, 26, 4, 59, 47), 
		profile_image_url_https='https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
		protected=False, 
		friends_count=775, 
		following=False, 
		id_str='257791390', 
		is_translator=False, 
		profile_background_color='C0DEED', 
		translator_type='none', 
		geo_enabled=True, 
		verified=False, 
		has_extended_profile=False, 
		lang='ja'
	), 
	##### ここまでstatus/user #####
	
	contributors=None, 
	created_at=datetime.datetime(2017, 1, 23, 18, 12, 9), 
	in_reply_to_user_id_str=None, 
	source_url='http://itunes.apple.com/us/app/twitter/id409789998?mt=12', 
	id=823594183499780096, 
	_api=<tweepy.api.API object at 0x117919198>, 
	retweeted=True, 
	in_reply_to_screen_name=None, 
	is_quote_status=False, 
	in_reply_to_user_id=None, 
	
	##### ここからstatus/entities #####
	entities={
		'urls': [], 
		'user_mentions': [{
			'id_str': '747329673659482113', 
			'id': 747329673659482113, 
			'name': 'ピコ太郎(PIKOTARO)(公式)', 
			'indices': [3, 17], 
			'screen_name': 'pikotaro_ppap'
		}], 
		'symbols': [], 
		'hashtags': [], 
		'media': [{
			'type': 'photo', 
			'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
			'source_user_id': 747329673659482113, 
			'source_user_id_str': '747329673659482113', 
			'display_url': 'pic.twitter.com/uP5PYzWhHL', 
			'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
			'sizes': {
				'large': {
					'resize': 'fit', 
					'h': 1536, 
					'w': 2048
				}, 
				'small': {
					'resize': 'fit', 
					'h': 510, 
					'w': 680
				}, 
				'medium': {
					'resize': 'fit', 
					'h': 900, 
					'w': 1200
				}, 
				'thumb': {
					'resize': 'crop', 
					'h': 150, 
					'w': 150
				}
			}, 
			'indices': [36, 59], 
			'id_str': '823362891273281537', 
			'source_status_id_str': '823362903805804546', 
			'source_status_id': 823362903805804546, 
			'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
			'id': 823362891273281537, 
			'url': 'https://t.co/uP5PYzWhHL'
		}]
	}, 
	##### ここまでstatus/entities #####

	##### ここからstatus/retweeted_status #####	
	retweeted_status=Status(

		##### ここからstatus/retweeted_status/author #####	
		author=User(
			time_zone=None, 
			profile_background_image_url=None, 
			listed_count=385, 
			is_translation_enabled=False, 
			profile_background_tile=False, 
			name='ピコ太郎(PIKOTARO)(公式)', 
			profile_sidebar_border_color='C0DEED', 
			screen_name='pikotaro_ppap', 
			url='https://t.co/02EEvEpRWi', 
			follow_request_sent=False, 

			##### ここからstatus/retweeted_status/author/_json #####	
			_json={
				'time_zone': None, 
				'description': '(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
				'following': False, 
				'profile_background_image_url': None, 
				'listed_count': 385, 
				'is_translation_enabled': False, 
				'profile_background_tile': False, 
				'profile_text_color': '333333', 
				'profile_image_url': 'http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'favourites_count': 3, 
				'has_extended_profile': True, 
				'notifications': False, 
				'location': '', 
				'profile_use_background_image': True, 
				'name': 'ピコ太郎(PIKOTARO)(公式)', 
				'created_at': 'Mon Jun 27 07:24:13 +0000 2016', 
				'profile_image_url_https': 'https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'screen_name': 'pikotaro_ppap', 
				'protected': False, 
				'profile_background_color': 'F5F8FA', 
				'url': 'https://t.co/02EEvEpRWi', 
				'follow_request_sent': False, 
				'friends_count': 97, 
				'default_profile': True, 
				'default_profile_image': False, 
				'followers_count': 88696, 
				'translator_type': 'none', 
				'id_str': '747329673659482113', 
				'statuses_count': 1210, 
				'contributors_enabled': False, 
				'profile_link_color': '1DA1F2', 
				'is_translator': False, 
				'id': 747329673659482113, 
				'entities': {
					'description': {
						'urls': []
					}, 
					'url': {
						'urls': [{
							'display_url': 'm.youtube.com/channel/UCKpIO…', 
							'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
							'url': 'https://t.co/02EEvEpRWi', 
							'indices': [0, 23]
						}]
					}
				}, 
				'geo_enabled': False, 
				'profile_sidebar_fill_color': 'DDEEF6', 
				'profile_banner_url': 'https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
				'verified': False, 
				'profile_background_image_url_https': None, 
				'lang': 'en', 
				'utc_offset': None, 
				'profile_sidebar_border_color': 'C0DEED'
			}, 
			##### ここまでstatus/retweeted_status/author/_json #####	
			
			default_profile_image=False, 
			profile_use_background_image=True, 
			entities={
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'm.youtube.com/channel/UCKpIO…', 
						'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
						'url': 'https://t.co/02EEvEpRWi', 
						'indices': [0, 23]
					}]
				}
			}, 
			statuses_count=1210, 
			contributors_enabled=False, 
			profile_link_color='1DA1F2', 
			notifications=False, 
			id=747329673659482113, 
			profile_background_image_url_https=None, 
			profile_sidebar_fill_color='DDEEF6', 
			utc_offset=None, 
			description='(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
			profile_text_color='333333', 
			followers_count=88696, 
			default_profile=True, 
			profile_image_url='http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
			favourites_count=3, 
			_api=<tweepy.api.API object at 0x117919198>, 
			location='', 
			created_at=datetime.datetime(2016, 6, 27, 7, 24, 13), 
			profile_image_url_https='https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
			protected=False, 
			friends_count=97, 
			following=False, 
			profile_banner_url='https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
			id_str='747329673659482113', 
			is_translator=False, 
			profile_background_color='F5F8FA', 
			translator_type='none', 
			geo_enabled=False, 
			verified=False, 
			has_extended_profile=True, 
			lang='en'
		), 
		##### ここまでstatus/retweeted_status/author #####

		possibly_sensitive=False, 

		##### ここからstatus/retweeted_status/extended_entities #####
		extended_entities={
			'media': [{
				'type': 'photo', 
				'id_str': '823362891273281537', 
				'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'display_url': 'pic.twitter.com/uP5PYzWhHL', 
				'url': 'https://t.co/uP5PYzWhHL', 
				'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
				'sizes': {
					'large': {
						'resize': 'fit', 
						'h': 1536, 
						'w': 2048
					}, 
					'small': {
						'resize': 'fit', 
						'h': 510, 
						'w': 680
					}, 
					'medium': {
						'resize': 'fit', 
						'h': 900, 
						'w': 1200
					}, 
					'thumb': {
						'resize': 'crop', 
						'h': 150, 
						'w': 150
					}
				}, 
				'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'indices': [17, 40], 
				'id': 823362891273281537
			}]
		}, 
		##### ここまでstatus/retweeted_status/extended_entities #####

		coordinates=None, 
		source='Twitter for iPhone', 
		favorite_count=855, 
		text='PONで華原朋美様とお写真ピコ! https://t.co/uP5PYzWhHL', 

		##### ここからstatus/retweeted_status/user #####
		user=User(
			time_zone=None, 
			profile_background_image_url=None, 
			listed_count=385, 
			is_translation_enabled=False, 
			profile_background_tile=False, 
			name='ピコ太郎(PIKOTARO)(公式)', 
			profile_sidebar_border_color='C0DEED', 
			screen_name='pikotaro_ppap', 
			url='https://t.co/02EEvEpRWi', 
			follow_request_sent=False, 

			##### ここからstatus/retweeted_status/user/_json #####
			_json={
				'time_zone': None, 
				'description': '(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
				'following': False, 
				'profile_background_image_url': None, 
				'listed_count': 385, 
				'is_translation_enabled': False, 
				'profile_background_tile': False, 
				'profile_text_color': '333333', 
				'profile_image_url': 'http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'favourites_count': 3, 
				'has_extended_profile': True, 
				'notifications': False, 
				'location': '', 
				'profile_use_background_image': True, 
				'name': 'ピコ太郎(PIKOTARO)(公式)', 
				'created_at': 'Mon Jun 27 07:24:13 +0000 2016', 
				'profile_image_url_https': 'https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'screen_name': 'pikotaro_ppap', 
				'protected': False, 
				'profile_background_color': 'F5F8FA', 
				'url': 'https://t.co/02EEvEpRWi', 
				'follow_request_sent': False, 
				'friends_count': 97, 
				'default_profile': True, 
				'default_profile_image': False, 
				'followers_count': 88696, 
				'translator_type': 'none', 
				'id_str': '747329673659482113', 
				'statuses_count': 1210, 
				'contributors_enabled': False, 
				'profile_link_color': '1DA1F2', 
				'is_translator': False, 
				'id': 747329673659482113, 
				'entities': {
					'description': {'urls': []}, 
					'url': {
						'urls': [{
							'display_url': 'm.youtube.com/channel/UCKpIO…', 
							'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
							'url': 'https://t.co/02EEvEpRWi', 
							'indices': [0, 23]
						}]
					}
				}, 
				'geo_enabled': False, 
				'profile_sidebar_fill_color': 'DDEEF6', 
				'profile_banner_url': 'https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
				'verified': False, 
				'profile_background_image_url_https': None, 
				'lang': 'en', 
				'utc_offset': None, 
				'profile_sidebar_border_color': 'C0DEED'
			}, 
			##### ここまでstatus/retweeted_status/user/_json #####

			default_profile_image=False, 
			profile_use_background_image=True, 
			entities={
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'm.youtube.com/channel/UCKpIO…', 
						'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
						'url': 'https://t.co/02EEvEpRWi', 
						'indices': [0, 23]
					}]
				}
			}, 
			statuses_count=1210, 
			contributors_enabled=False, 
			profile_link_color='1DA1F2', 
			notifications=False, 
			id=747329673659482113, 
			profile_background_image_url_https=None, 
			profile_sidebar_fill_color='DDEEF6', 
			utc_offset=None, 
			description='(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
			profile_text_color='333333', 
			followers_count=88696, 
			default_profile=True, 
			profile_image_url='http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
			favourites_count=3, 
			_api=<tweepy.api.API object at 0x117919198>, 
			location='', 
			created_at=datetime.datetime(2016, 6, 27, 7, 24, 13), 
			profile_image_url_https='https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
			protected=False, 
			friends_count=97, 
			following=False, 
			profile_banner_url='https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
			id_str='747329673659482113', 
			is_translator=False, 
			profile_background_color='F5F8FA', 
			translator_type='none', 
			geo_enabled=False, 
			verified=False, 
			has_extended_profile=True, 
			lang='en'
		), 
		##### ここまでstatus/retweeted_status/user #####

		contributors=None, 
		created_at=datetime.datetime(2017, 1, 23, 2, 53, 8), 
		in_reply_to_user_id_str=None, 
		source_url='http://twitter.com/download/iphone', 
		id=823362903805804546, 
		_api=<tweepy.api.API object at 0x117919198>, 
		retweeted=True, 
		in_reply_to_screen_name=None, 
		is_quote_status=False, 
		in_reply_to_user_id=None, 

		##### ここからstatus/retweeted_status/entities #####
		entities={
			'urls': [], 
			'user_mentions': [], 
			'symbols': [], 
			'hashtags': [], 
			'media': [{
				'type': 'photo', 
				'id_str': '823362891273281537', 
				'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'display_url': 'pic.twitter.com/uP5PYzWhHL', 
				'url': 'https://t.co/uP5PYzWhHL', 
				'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
				'sizes': {
					'large': {
						'resize': 'fit', 
						'h': 1536, 
						'w': 2048
					}, 
					'small': {
						'resize': 'fit', 
						'h': 510, 
						'w': 680
					}, 
					'medium': {
						'resize': 'fit', 
						'h': 900, 
						'w': 1200
					}, 
					'thumb': {
						'resize': 'crop', 
						'h': 150, 
						'w': 150
					}
				}, 
				'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'indices': [17, 40], 
				'id': 823362891273281537
			}]
		}, 
		##### ここまでstatus/retweeted_status/entities #####

		retweet_count=133, 
		possibly_sensitive_appealable=False, 
		in_reply_to_status_id_str=None, 
		truncated=False, 
		in_reply_to_status_id=None, 
		id_str='823362903805804546', 
		favorited=False, 

		##### ここからstatus/retweeted_status/_json #####
		_json={
			'favorite_count': 855, 
			'possibly_sensitive': False, 

			##### ここからstatus/retweeted_status/_json/extended_entities #####
			'extended_entities': {
				'media': [{
					'type': 'photo', 
					'id_str': '823362891273281537', 
					'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'display_url': 'pic.twitter.com/uP5PYzWhHL', 
					'url': 'https://t.co/uP5PYzWhHL', 
					'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
					'sizes': {
						'large': {
							'resize': 'fit', 
							'h': 1536, 
							'w': 2048
						}, 
						'small': {
							'resize': 'fit', 
							'h': 510, 
							'w': 680
						}, 
						'medium': {
							'resize': 'fit', 
							'h': 900, 
							'w': 1200
						}, 
						'thumb': {
							'resize': 'crop', 
							'h': 150, 
							'w': 150
						}
					}, 
					'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'indices': [17, 40], 
					'id': 823362891273281537
				}]
			}, 
			##### ここまでstatus/retweeted_status/_json/extended_entities #####

			'coordinates': None, 
			'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>', 
			'text': 'PONで華原朋美様とお写真ピコ! https://t.co/uP5PYzWhHL', 

			##### ここからstatus/retweeted_status/_json/user #####
			'user': {
				'time_zone': None, 
				'description': '(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
				'following': False, 
				'profile_background_image_url': None, 
				'listed_count': 385, 
				'is_translation_enabled': False, 
				'profile_background_tile': False, 
				'profile_text_color': '333333', 
				'profile_image_url': 'http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'favourites_count': 3, 
				'has_extended_profile': True, 
				'notifications': False, 
				'location': '', 
				'profile_use_background_image': True, 
				'name': 'ピコ太郎(PIKOTARO)(公式)', 
				'created_at': 'Mon Jun 27 07:24:13 +0000 2016', 
				'profile_image_url_https': 'https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'screen_name': 'pikotaro_ppap', 
				'protected': False, 
				'profile_background_color': 'F5F8FA', 
				'url': 'https://t.co/02EEvEpRWi', 
				'follow_request_sent': False, 
				'friends_count': 97, 
				'default_profile': True, 
				'default_profile_image': False, 
				'followers_count': 88696, 
				'translator_type': 'none', 
				'id_str': '747329673659482113', 
				'statuses_count': 1210, 
				'contributors_enabled': False, 
				'profile_link_color': '1DA1F2', 
				'is_translator': False, 
				'id': 747329673659482113, 
				'entities': {
					'description': {'urls': []}, 
					'url': {
						'urls': [{
							'display_url': 'm.youtube.com/channel/UCKpIO…', 
							'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
							'url': 'https://t.co/02EEvEpRWi', 
							'indices': [0, 23]
						}]
					}
				}, 
				'geo_enabled': False, 
				'profile_sidebar_fill_color': 'DDEEF6', 
				'profile_banner_url': 'https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
				'verified': False, 
				'profile_background_image_url_https': None, 
				'lang': 'en', 
				'utc_offset': None, 
				'profile_sidebar_border_color': 'C0DEED'
			}, 
			##### ここまでstatus/retweeted_status/_json/user #####			
			
			'contributors': None, 
			'created_at': 'Mon Jan 23 02:53:08 +0000 2017', 
			'truncated': False, 
			'retweeted': True, 
			'in_reply_to_screen_name': None, 
			'is_quote_status': False, 
			'in_reply_to_user_id': None, 
			'id_str': '823362903805804546', 
			'retweet_count': 133, 
			'possibly_sensitive_appealable': False, 
			'in_reply_to_status_id_str': None, 
			'id': 823362903805804546, 
			'in_reply_to_status_id': None, 

			##### ここからstatus/retweeted_status/_json/entities #####			
			'entities': {
				'urls': [], 
				'user_mentions': [], 
				'symbols': [], 
				'hashtags': [], 
				'media': [{
					'type': 'photo', 
					'id_str': '823362891273281537', 
					'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'display_url': 'pic.twitter.com/uP5PYzWhHL', 
					'url': 'https://t.co/uP5PYzWhHL', 
					'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
					'sizes': {
						'large': {
							'resize': 'fit', 
							'h': 1536, 
							'w': 2048
						}, 
						'small': {
							'resize': 'fit', 
							'h': 510, 
							'w': 680
						}, 
						'medium': {
							'resize': 'fit', 
							'h': 900, 
							'w': 1200
						}, 
						'thumb': {
							'resize': 'crop', 
							'h': 150, 
							'w': 150
						}
					}, 
					'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'indices': [17, 40], 
					'id': 823362891273281537
				}]
			}, 
			##### ここまでstatus/retweeted_status/_json/entities #####			

			'favorited': False, 
			'in_reply_to_user_id_str': None, 
			'lang': 'ja', 
			'place': None, 
			'geo': None
		}, 
		##### ここまでstatus/retweeted_status/_json #####

		lang='ja', 
		place=None, 
		geo=None
	), 
	##### ここまでstatus/retweeted_status #####

	retweet_count=133, 
	possibly_sensitive_appealable=False, 
	in_reply_to_status_id_str=None, 
	truncated=False, 
	in_reply_to_status_id=None, 
	id_str='823594183499780096', 
	favorited=False, 

	##### ここからstatus/_json #####
	_json={
		'favorite_count': 0, 
		'possibly_sensitive': False, 

		##### ここからstatus/_json/extended_entities #####	
		'extended_entities': {
			'media': [{
				'type': 'photo', 
				'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'source_user_id': 747329673659482113, 
				'source_user_id_str': '747329673659482113', 
				'display_url': 'pic.twitter.com/uP5PYzWhHL', 
				'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'sizes': {
					'large': {
						'resize': 'fit', 
						'h': 1536, 
						'w': 2048
					}, 
					'small': {
						'resize': 'fit', 
						'h': 510, 
						'w': 680
					}, 
					'medium': {
						'resize': 'fit', 
						'h': 900, 
						'w': 1200
					}, 
					'thumb': {
						'resize': 'crop', 
						'h': 150, 
						'w': 150
					}
				}, 
				'indices': [36, 59], 
				'id_str': '823362891273281537', 
				'source_status_id_str': '823362903805804546', 
				'source_status_id': 823362903805804546, 
				'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
				'id': 823362891273281537, 
				'url': 'https://t.co/uP5PYzWhHL'
			}]
		}, 
		##### ここまでstatus/_json/extended_entities #####

		'coordinates': None, 
		'source': '<a href="http://itunes.apple.com/us/app/twitter/id409789998?mt=12" rel="nofollow">Twitter for Mac</a>', 
		'text': 'RT @pikotaro_ppap: PONで華原朋美様とお写真ピコ! https://t.co/uP5PYzWhHL', 

		##### ここからstatus/_json/user #####
		'user': {
			'time_zone': 'Tokyo', 
			'description': '統計学とプログラミングの勉強ブログを書いています(私は初心者なので専門的なものではない)。剣道初心者で、とりあえず1級審査に向けて稽古中。TX通勤。博士(工学)。', 
			'following': False, 
			'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme1/bg.png', 
			'listed_count': 38, 
			'is_translation_enabled': True, 
			'profile_background_tile': False, 
			'profile_text_color': '333333', 
			'profile_image_url': 'http://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'favourites_count': 1088, 
			'notifications': False, 
			'location': 'つくば市', 
			'profile_use_background_image': True, 
			'name': 'bata', 
			'created_at': 'Sat Feb 26 04:59:47 +0000 2011', 
			'profile_image_url_https': 'https://pbs.twimg.com/profile_images/517659681313923073/_m3UMIAR_normal.jpeg', 
			'screen_name': 'statsbeginner', 
			'protected': False, 
			'profile_background_color': 'C0DEED', 
			'url': 'https://t.co/6HCF2FYowE', 
			'follow_request_sent': False, 
			'friends_count': 775, 
			'default_profile': True, 
			'default_profile_image': False, 
			'followers_count': 1873, 
			'translator_type': 'none', 
			'id_str': '257791390', 
			'statuses_count': 13015, 
			'contributors_enabled': False, 
			'profile_link_color': '1DA1F2', 
			'is_translator': False, 
			'id': 257791390, 
			'entities': {
				'description': {'urls': []}, 
				'url': {
					'urls': [{
						'display_url': 'statsbeginner.hatenablog.com', 
						'expanded_url': 'http://statsbeginner.hatenablog.com/', 
						'url': 'https://t.co/6HCF2FYowE', 
						'indices': [0, 23]
					}]
				}
			}, 
			'geo_enabled': True, 
			'profile_sidebar_fill_color': 'DDEEF6', 
			'has_extended_profile': False, 
			'verified': False, 
			'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme1/bg.png', 
			'lang': 'ja', 
			'utc_offset': 32400, 
			'profile_sidebar_border_color': 'C0DEED'
		}, 
		##### ここまでstatus/_json/user #####

		'contributors': None, 
		'created_at': 'Mon Jan 23 18:12:09 +0000 2017', 
		'truncated': False, 
		'retweeted': True, 
		'in_reply_to_screen_name': None, 
		'is_quote_status': False, 
		'in_reply_to_user_id': None, 
		'id_str': '823594183499780096', 

		##### ここからstatus/_json/retweeted_status #####
		'retweeted_status': {
			'favorite_count': 855, 
			'possibly_sensitive': False, 

			##### ここからstatus/_json/retweeted_status/extended_entities #####
			'extended_entities': {
				'media': [{
					'type': 'photo', 
					'id_str': '823362891273281537', 
					'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'display_url': 'pic.twitter.com/uP5PYzWhHL', 
					'url': 'https://t.co/uP5PYzWhHL', 
					'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
					'sizes': {
						'large': {
							'resize': 'fit', 
							'h': 1536, 
							'w': 2048
						}, 
						'small': {
							'resize': 'fit', 
							'h': 510, 
							'w': 680
						}, 
						'medium': {
							'resize': 'fit', 
							'h': 900, 
							'w': 1200
						}, 
						'thumb': {
							'resize': 'crop', 
							'h': 150, 
							'w': 150
						}
					}, 
					'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'indices': [17, 40], 
					'id': 823362891273281537
				}]
			}, 
			##### ここまでstatus/_json/retweeted_status/extended_entities #####

			'coordinates': None, 
			'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>', 
			'text': 'PONで華原朋美様とお写真ピコ! https://t.co/uP5PYzWhHL', 

			##### ここからstatus/_json/retweeted_status/user #####
			'user': {
				'time_zone': None, 
				'description': '(OFFICIAL)シンガーソングライタ ー「ピコ太郎」と、申しやすっ。目指せ紅白歌合戦とサマソニ。リスペクトシンガー→恩人ジャスティンビーバー、クラフトワーク、M.I.A、杏里、石川さゆり、アリアナグランデ For international inquiries:ppap-world@av.avex.co.jp', 
				'following': False, 
				'profile_background_image_url': None, 
				'listed_count': 385, 
				'is_translation_enabled': False, 
				'profile_background_tile': False, 
				'profile_text_color': '333333', 
				'profile_image_url': 'http://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'favourites_count': 3, 
				'has_extended_profile': True, 
				'notifications': False, 
				'location': '', 
				'profile_use_background_image': True, 
				'name': 'ピコ太郎(PIKOTARO)(公式)', 
				'created_at': 'Mon Jun 27 07:24:13 +0000 2016', 
				'profile_image_url_https': 'https://pbs.twimg.com/profile_images/822403634931433472/udAnDIVV_normal.jpg', 
				'screen_name': 'pikotaro_ppap', 
				'protected': False, 
				'profile_background_color': 'F5F8FA', 
				'url': 'https://t.co/02EEvEpRWi', 
				'follow_request_sent': False, 
				'friends_count': 97, 
				'default_profile': True, 
				'default_profile_image': False, 
				'followers_count': 88696, 
				'translator_type': 'none', 
				'id_str': '747329673659482113', 
				'statuses_count': 1210, 
				'contributors_enabled': False, 
				'profile_link_color': '1DA1F2', 
				'is_translator': False, 
				'id': 747329673659482113, 
				'entities': {
					'description': {'urls': []}, 
					'url': {
						'urls': [{
							'display_url': 'm.youtube.com/channel/UCKpIO…', 
							'expanded_url': 'https://m.youtube.com/channel/UCKpIOnsk-gcwHXIzuk24ExA', 
							'url': 'https://t.co/02EEvEpRWi', 
							'indices': [0, 23]
						}]
					}
				}, 
				'geo_enabled': False, 
				'profile_sidebar_fill_color': 'DDEEF6', 
				'profile_banner_url': 'https://pbs.twimg.com/profile_banners/747329673659482113/1484911282', 
				'verified': False, 
				'profile_background_image_url_https': None, 
				'lang': 'en', 
				'utc_offset': None, 
				'profile_sidebar_border_color': 'C0DEED'
			}, 
			##### ここまでstatus/_json/retweeted_status/user #####

			'contributors': None, 
			'created_at': 'Mon Jan 23 02:53:08 +0000 2017', 
			'truncated': False, 
			'retweeted': True, 
			'in_reply_to_screen_name': None, 
			'is_quote_status': False, 
			'in_reply_to_user_id': None, 
			'id_str': '823362903805804546', 
			'retweet_count': 133, 
			'possibly_sensitive_appealable': False, 
			'in_reply_to_status_id_str': None, 
			'id': 823362903805804546, 
			'in_reply_to_status_id': None, 

			##### ここからstatus/_json/retweeted_status/entities #####
			'entities': {
				'urls': [], 
				'user_mentions': [], 
				'symbols': [], 
				'hashtags': [], 
				'media': [{
					'type': 'photo', 
					'id_str': '823362891273281537', 
					'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'display_url': 'pic.twitter.com/uP5PYzWhHL', 
					'url': 'https://t.co/uP5PYzWhHL', 
					'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
					'sizes': {
						'large': {
							'resize': 'fit', 
							'h': 1536, 
							'w': 2048
						}, 
						'small': {
							'resize': 'fit', 
							'h': 510, 
							'w': 680
						}, 
						'medium': {
							'resize': 'fit', 
							'h': 900, 
							'w': 1200
						}, 
						'thumb': {
							'resize': 'crop', 
							'h': 150, 
							'w': 150
						}
					}, 
					'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
					'indices': [17, 40], 
					'id': 823362891273281537
				}]
			}, 
			##### ここまでstatus/_json/retweeted_status/entities #####

			'favorited': False, 
			'in_reply_to_user_id_str': None, 
			'lang': 'ja', 
			'place': None, 
			'geo': None
		}, 
		##### ここまでstatus/_json/retweeted_status #####

		'retweet_count': 133, 
		'possibly_sensitive_appealable': False, 
		'in_reply_to_status_id_str': None, 
		'id': 823594183499780096, 
		'in_reply_to_status_id': None, 

		##### ここからstatus/_json/entities #####
		'entities': {
			'urls': [], 
			'user_mentions': [{
				'id_str': '747329673659482113', 
				'id': 747329673659482113, 
				'name': 'ピコ太郎(PIKOTARO)(公式)', 
				'indices': [3, 17], 
				'screen_name': 'pikotaro_ppap'
			}], 
			'symbols': [], 
			'hashtags': [], 
			'media': [{
				'type': 'photo', 
				'media_url': 'http://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'source_user_id': 747329673659482113, 
				'source_user_id_str': '747329673659482113', 
				'display_url': 'pic.twitter.com/uP5PYzWhHL', 
				'media_url_https': 'https://pbs.twimg.com/media/C20sL--VIAEra5v.jpg', 
				'sizes': {
					'large': {
						'resize': 'fit', 
						'h': 1536, 
						'w': 2048
					}, 
					'small': {
						'resize': 'fit', 
						'h': 510, 
						'w': 680
					}, 
					'medium': {
						'resize': 'fit', 
						'h': 900, 
						'w': 1200
					}, 
					'thumb': {
						'resize': 'crop', 
						'h': 150, 
						'w': 150
					}
				}, 
				'indices': [36, 59], 
				'id_str': '823362891273281537', 
				'source_status_id_str': '823362903805804546', 
				'source_status_id': 823362903805804546, 
				'expanded_url': 'https://twitter.com/pikotaro_ppap/status/823362903805804546/photo/1', 
				'id': 823362891273281537, 
				'url': 'https://t.co/uP5PYzWhHL'
			}]
		}, 
		##### ここまでstatus/_json/entities #####

		'favorited': False, 
		'in_reply_to_user_id_str': None, 
		'lang': 'ja', 
		'place': None, 
		'geo': None
	}, 
	##### ここまでstatus/_json #####

	lang='ja', 
	place=None, 
	geo=None
)

 
 

Friendshipオブジェクト

 先に来てるほうがSourceから見た関係、後で来るほうがTargetからみた関係です。_jsonが含まれないです。
 そのまんまですが、followingはフォローしてる。followed_byはフォローされてる。
 following_receivedとfollowing_requestedは恐らく、前者がフォローリクエストを送って承認されたらTrue、後者はフォローリクエストされて承認した場合にTrueになるやつだと思います。
 marked_spamはスパム報告したアカウントはTrue、blockingはブロックしているアカウントがTrue、blocked_byは逆にブロックされていた場合にTrueですね。botの処理を書いていると、相手からブロックされている場合や相手が鍵垢の場合に単純に実行するとエラーになってしまうような処理も出てくるので、そういう場合に、ブロックされていないかどうかをチェックして処理を分岐させるのに使ったりできます。

(
Friendship(
    followed_by=False, 
    blocking=False, 
    following_received=False, 
    id=257791390, 
    live_following=False, 
    muting=False, 
    notifications_enabled=False, 
    can_dm=False, 
    following=False, 
    following_requested=False, 
    _api=<tweepy.api.API object at 0x11240bef0>, 
    want_retweets=False, 
    id_str='257791390', 
    screen_name='statsbeginner', 
    marked_spam=False, 
    blocked_by=True, 
    all_replies=False
), 
Friendship(
    followed_by=False, 
    following_received=False, 
    id=150598902, 
    following=False, 
    following_requested=False, 
    _api=<tweepy.api.API object at 0x11240bef0>, 
    id_str='150598902', 
    screen_name='InsideCHIKIRIN'
)
)

 
 

Saved Searchオブジェクト

 検索のクエリを保存しといてショートカット的に使うやつですね。
 queryのところが、検索キーワードです。positionってなんだろ?ぐぐったけど分かりません。nameがqueryと異なる場合があるのかは不明。

[
SavedSearch(
	_api=<tweepy.api.API object at 0x11240bef0>, 
	query='Python', 
	id=829013630154788864, 
	id_str='829013630154788864', 
	created_at=datetime.datetime(2017, 2, 7, 17, 7, 6), 
	name='Python', 
	position=None
), 
SavedSearch(
	_api=<tweepy.api.API object at 0x11240bef0>, 
	query='機械学習', 
	id=829013886934212608, 
	id_str='829013886934212608', 
	created_at=datetime.datetime(2017, 2, 7, 17, 8, 7), 
	name='機械学習', 
	position=None
)
]

*1:Twitterの規約では、目的や内容が重複していなければ、複数のアカウントの保有は禁じられていない。

*2:リクエストを投げすぎて制限に引っかかったり、最悪の場合アカウントが凍結されたり。へんなつぶやきやフォロー/アンフォローで人に迷惑をかけたり。

*3:データ収集対象としては、メイン垢のリストも使っている

*4:第二の関門はリクエスト数制限、第三の関門はカーソリングかな。

*5:ずっと悩んでたけどStack Overflowで質問して判明。

*6:簡易的に、データ項目名だけ一覧で取得するには、オブジェクトをdir()に与えればいいです。

Pythonメモ: Pandasのデータフレームに空のデータフレームを合体させたらint型の列がfloat型になってた

 こんな事象に陥る人が他にいるのか分からないのですが、ググって解決しなかった問題が解決したので、せっかくだからメモしておきます。


 Pandasのデータフレームに、整数型で値が入っている列があるとします。

>>> import pandas as pd
>>> import numpy
>>> 
>>> df1 = pd.DataFrame({
...     'ID':[123456789012345678, 123456789012345673, 12345678901234567],
...     'Name':['Ichiro','Jiro','Saburo']
...     },
...     columns = ['ID', 'Name']
... )
>>> 
>>> type(df1['ID'][0])  # 列ごと取り出すとPandasのSeriesですと言われるので
<class 'numpy.int64'>


 このデータフレームに、列の構成は同じで行が空になっているデータフレームをappendで下からくっつけたら、整数型の列がfloat型に変わりました。

>>> df2 = pd.DataFrame({
...     'ID':[],
...     'Name':[]
...     },
...     columns = ['ID', 'Name']
... )
>>> 
>>> df12 = df1.append(df2)
>>> 
>>> type(df12['ID'][0])
<class 'numpy.float64'>
>>> 
>>> print([v for v in df12['ID']])
[1.2345678901234568e+17, 1.2345678901234568e+17, 12345678901234568.0]
>>> 


 しかも桁数が大きいので、指数表示になっていますね。
 Nameはもちろん、文字列型になっています。

>>> type(df12['Name'][0])
<class 'str'>


 空のデータフレームをくっつけるみたいな変なことが起きないように処理を組んでおけばいいと思うのですが、私が書いてたTwitterのbot(仕事関係の情報をつぶやくアカウントを半分botにしています)内のデータ集計の部分でpandasを使っていて、こういう事象が発生し得る状態になってしまっていました。 
 しかも、いったんfloat型になったものがその後の処理で結果的にint型に変換されるようになっていたので、なかなか気づきませんでした。なんで気づいたかというと、これがまたヤバいのですが、桁数が大きいので、指数表示になったときに「...568」で止まって以降の数字が切り上げ(?)されてしまっているように、元の数字に戻らないわけです。
 一応試しにやってみると、

>>> df12[['ID']] = df12[['ID']].astype(numpy.int64) # 整数型に変換する
>>> 
>>> print([v for v in df12['ID']])
[123456789012345680, 123456789012345680, 12345678901234568]


 数字が変わってしまっておりますね。このせいで、私のbot内でも、ユーザIDが指数表示を経て別の数字に変わってしまっているものが一部あり、「そのIDのユーザは見つかりません」というエラーが出ていました。そこから辿っていって、Pandasに空のデータフレームを扱わせてfloat型を経由していることに気づいたわけです。
 
 
 そもそもユーザIDを整数型で持つ必要はなく、文字列型にすればいいわけですが、TwitterのAPIから帰ってくるIDが単なる数字の並びになっていて、int型として認識されていたので、そのままにしてました。
 素人なのでよく知りませんが、IDを整数型にしてるケースってけっこうあるんですかね?

 
 TwitterIDが33bitになったため、値をINT型に入れているとエラーに。 | iconDecotter-Log
 世界規模のWebサービスを作るときにDBのユーザーIDをINT型にしてはいけない理由 | 着ぐるみ追い剥ぎペンギン


 こういう記事をからすると、文字列型にしてるのが当然ってわけでもないんだろうか。メリット・デメリット等、私はよく分かりませんが、文字列のほうが間違いが少なそうなので、あとでbotの修正をしようと思います。
 ちなみに、IDを文字列型として扱いたい場合、Tweepyのレスポンスの中にある「id」という項目ではなく「id_str」という項目を取得すればよいです。

ブログのドメイン変更/TwitterのAPIについての悩み

 ブログのURLを変更しました。


 旧URL http://statsbeginner.hatenablog.com/
  ↓
 新URL http://www.statsbeginner.net/


 旧URLのままでもアクセスできるようですが。


 ・・・そのことだけ書いて終わりというのもなんなので、最近の悩みを書いておきます。


 Tweepyを使ってPythonからTwitterのAPIを触っているのですが、他の人のユーザ情報を取得しようとしたときに、ブロックされているかどうかの判断がうまくできません。
 Tweepyが返すuserオブジェクト(Twitterが返すJsonでも同じですが)をみると、'protected'という項目があるので、これがTrueかFalseかで「鍵垢かどうか」はわかります。それは分かるのですが、ブロックされていることを示す情報が、見当たらないんですよね。
 ブロックされている場合、たとえばuserオブジェクトからstatusという項目が抜け落ちます。そのユーザの最新ツイートを取得できないということなのです。これである種の判断はできるのですが、statusが外されるのは鍵垢の場合も同じなんです。


 念のため、ブロックされている場合に返ってくるuserオブジェクトと、鍵垢である場合に返ってくるuserオブジェクトを比較したのですが、全て同じでした。
 だから、「鍵垢であるがブロックはされていない」ケースと、「鍵垢でありブロックもされている」ケースの区別がつきません。'protected'=Falseである(鍵垢である)かつstatusがないというケースについては、「鍵垢ではないが、ブロックされているのだろう」と判断できるのですが。


 Twitterのアプリとか使ってると、「◯◯さんにブロックされているので、◯◯さんのツイートを表示できません」って出るので、APIの中に対応する情報があるのでは?とは思っています。Tweepyはカバーしている機能が限定的なので、公式APIに対応する項目があるならurllib2とかやればいいのですが、調べても今のところよく分からない状況です。


f:id:midnightseminar:20170204112547j:plain


【追記】
 ブロックされているかを確認する方法は、分かりました。
 Friendshipオブジェクトというのがあり、その属性でblocked_byという項目があるので、ここがTrueになっていたらブロックされているということですね。
 なお、認証に使っているユーザ(つまり自分のアカウント)についてはブロックされているかが分かりますが、source_screen_nameのところに他のユーザを入れた場合は、blocked_by等の項目はNone(不明)という値になります。

>>> api.show_friendship(source_screen_name='statsbeginner', target_screen_name='InsideCHIKIRIN')
(
Friendship(
    followed_by=False, 
    blocking=False, 
    following_received=False, 
    id=257791390, 
    live_following=False, 
    muting=False, 
    notifications_enabled=False, 
    can_dm=False, 
    following=False, 
    following_requested=False, 
    _api=<tweepy.api.API object at 0x11240bef0>, 
    want_retweets=False, 
    id_str='257791390', 
    screen_name='statsbeginner', 
    marked_spam=False, 
    blocked_by=True, 
    all_replies=False
), 
Friendship(
    followed_by=False, 
    following_received=False, 
    id=150598902, 
    following=False, 
    following_requested=False, 
    _api=<tweepy.api.API object at 0x11240bef0>, 
    id_str='150598902', 
    screen_name='InsideCHIKIRIN'
)
)

(↑見やすいように改行とインデントを入れています。)


 相手が鍵垢であった場合も、値がNoneになったりはせず、ブロックされていればTrueと表示されます。
【/追記】


 あともう1個悩みがあって、Tweepyで取得してデータを色々加工して記録してるのですが、稀にどこかの処理でTwitter ID(数字の並び)がfloat型になってしまっているようで、桁数が多いと指数表示で後ろのほうが省略されてしまい、一応また別の処理で自動的にint型に戻るのですがその時に数字がずれて別IDになってしまいます。floatにするようなことは明示的にはしていないので、どこかのエラーなのですがまだ把握できていません。
 int型で扱ってるのは、APIから返ってくる整数の文字列が自動的にint型として認識されるからそれに合わせてるのですが、数字じゃなくてIDなのだから、あとで明示的に全部str型に直すようにします。


参考↓
www.statsbeginner.net


【追記】
 IDがfloat型になってしまう現象も、Pandasで空のデータフレームを扱った際の挙動であることが判明し、これはエントリを起こしました。
www.statsbeginner.net


【/追記】

Power Pointのスライドマスタ設定が分かりにくいのでメモ

 統計学習とは関係ない話です。

パワポのスライドマスタ機能は分かりにくい

 会社でパワポの資料を作るときは、会社の公式のスライドマスタを使うんですが、スライド番号とかconfidentialとか日付の表示について、微妙にマスタをいじることがあります。表示するページとしないページがあるとかですね。


 ところが、スライドマスタの仕様は単純ではなくて、理解できていなくて困ったことがあります。困っている人が多いから、スライドマスタまわりの機能はあまり活用されていないような気もします。


 今はWindows 7でPower Point 2010を使っているので、その前提で、気づいたことをメモしておきます。というか、仕事中にメモしていたことを貼りつけただけです。
 以下はとくに、スライド番号の表示を制御する場合の話です。パワポをよく見たら「マスタ」ではなく「マスター」になっていたので、以下「マスター」に統一します。
 
 

3階層の仕組みになっている

 パワーポイントの設定は、「マスター」「レイアウト」「スライド」という3つの階層でそれぞれ定義されているようです。
 この3階層の構造が頭に入っていないと、スライドマスターを使いこなすことは不可能。ところが、マスターとレイアウトの違いについても、考えたこと自体ないという人は多いと思います。
 最も上位の(包括的な)階層は「マスター」であり、マスターに「レイアウト」がぶら下がり、レイアウトに各「スライド」がぶら下がっている。逆にいうと、複数のスライドに適用される共通デザインが「レイアウト」に定義されており、複数のレイアウトに適用される共通デザインが「マスター」に定義されているということです。
 ちなみにマスターは、1つのファイル上に複数作成できます。


f:id:midnightseminar:20161228165501p:plain


 一番大きな単位である「マスター」に全体的な設定をして、このマスターの基本的な設定を引き継ぎつつバリエーションを持たせた「レイアウト」を作成します。それで「スライド」を1ページ新規に追加したとき、このスライドにどのマスタのどのレイアウトを適用するかを選択するわけです。


f:id:midnightseminar:20161228165522p:plain


 この3階層構造の存在や、何がどう継承されるかのルールを知らなかったり、後述の「コピペ等による例外」が起きることによって、スライド番号関係ではよく混乱が発生します。


 以下具体的に、スライド番号の表示に関する設定がどのように行われるのかをみていきます。
 
 

第一階層:マスターレベルでの定義

  1. 「表示」タブから「スライドマスター」を選択してマスター表示に切り替える
  2. 左のペイン(枠)のマスターを1つ選択し右クリック
  3. 「マスターのレイアウト」をクリック
  4. 「スライド番号」にチェックして「OK」
  5. スライド番号のプレースホルダが表示されるので、好きなように書式設定する


なお、

  • チェックを外すことはできない。プレースホルダを削除すると、上記チェックも自動的に外れるという仕様。
  • スライド番号が表示されている別のマスタからスライド番号のプレースホルダをコピペすると、自動的にチェックが入る。


f:id:midnightseminar:20161228165606p:plain
 
  

第二階層:レイアウトレベルでの定義

 第一階層の「マスター」においてスライド番号を表示する設定になっていることを前提として……

  1. スライドマスターを表示
  2. 左ペインからレイアウトを選択
  3. スライドマスタータブの「フッター」にチェック
  4. スライド番号のプレースホルダが表示されるので好きなように書式設定


なお、

  • スライド番号が表示されている別のレイアウトからスライド番号のプレースホルダをコピペすると、自動的にチェックが入る。(ただしスライド番号が設定されているマスタの配下のレイアウトの場合のみ。)
  • 若干謎仕様だが、マスターにぶら下がるレイアウトの並びの中で先頭にあるものが「タイトルスライド」用レイアウトとして認識される(後で出てくる)

 
 

第三階層:スライドレベルでの定義

  1. マスター表示ではなく普通にスライドを表示している状態で、左ペインのスライド一覧からスライドを選択し、右クリックして「レイアウト」を選択
  2. スライド番号が設定されたレイアウトを選択
  3. 「挿入」タブの「スライド番号」メニューをクリック
  4. 「スライド番号」にチェックを入れる


なお、

  • 左ペインのスライド一覧から複数のスライドをまとめて選択し、まとめてスライド番号を挿入することもできる。
  • 「タイトルスライドに表示しない」にチェックしている場合、タイトルレイアウトが適用されたスライドには表示されない。(表紙のページだけ番号を表示しないケースはよくあり、その場合はスライド番号の開始番号を0にしたりして、2枚目が1ページになるようにする。)
  • そこでいう「タイトルスライド」は、前述の、「マスタ配下で先頭に置いたレイアウト」が適用されているスライドということになる。
  • スライド番号が表示されている別のスライドからスライド番号のプレースホルダをコピペすると、自動的にチェックが入る。(ただしスライド番号が設定されているレイアウトを選択している場合のみ)


 タイトルスライドとは何ぞやというのを理解するのに苦労しました。昔のパワポでは、タイトル用か否かという設定値があったみたいですが、PowerPoint 2010では、「先頭のレイアウト」がタイトル用ということになるみたいです。
 
 

書式の設定

 スライド番号の数字の書式設定について。大きさとかフォントとか色とかのことです。
マスター>レイアウト>スライドの階層構造において上位階層から引き継がれるのは、

  • スライド番号の有無
  • デフォルトの書式


のみです。スライド番号を新たに表示したばあい、そのデフォルト書式として上位階層の書式が引き継がれるわけです。
 下位階層の書式を変更したり削除したりしても、上位階層に反映されないのはもちろん、同一階層の別のレイアウト or スライドにも反映されません。だから、あるマスターにぶら下がるレイアウトの全てに関してスライド番号の書式を共通で変更したいときは、必ず「マスター」をいじることになります。
 また、下位階層でスライド番号の書式を自分で変更した場合、その後に上位階層の書式を変更したとしても、自分で設定を変更していたレイアウト or スライドにおける書式には反映されません。デフォルト設定のまま表示しているものだけが変更されます。
 
 

ややこしい例外:上位階層と下位階層の矛盾

 ややこしい例外があります。
 例外と言っても、これによる混乱はけっこう頻繁に起きます。

  • 例外発生の第1パターン:レイアウト又はスライドに関して、上位階層の設定によりスライド番号が非表示になっているときに、別のレイアウト又はスライドからスライド番号のプレースホルダをコピペしてきた場合、スライド番号として表示はされる。
  • ところがこの場合、表示有無のところのチェックは入らない。つまり、「表示のチェックが入っていないのにスライド番号が表示されている」という、矛盾した状態になる。
  • この場合、スライド番号の書式が、急に黒字で大きめサイズのフォントになったりする。フォントの種類については、「スタイル」の「フォントパターン」で設定されている日本語の本文用フォントが適用されているのだが、サイズと色が何から継承されているのかは分からなかった。私がやると必ず黒で18ptになり、これは固定なのかもしれない。
  • 例外発生の第2パターン:下位階層にスライド番号が表示されているときに、上位階層のスライド番号を消した(非表示に変えた)場合、下位階層のスライド番号は消えるのではなく、第2パターンと同じく18ptの黒フォントに変わる。この場合も、表示のチェックが入っていないのにスライド番号が表示されている状態になる。


f:id:midnightseminar:20161228171220p:plain


 なお、第三階層の「スライド」までスライド番号が表示されているときに、第一階層の「マスター」のスライド番号を削除すると、上述のとおり第二階層の「レイアウト」上のスライド番号は18pt黒色のフォントに替わるのですが、なぜか、第三階層のスライド上のスライド番号は書式が変わりません。
 ややこしいですね。この他、細かくいえば色々なパターンがあると思われ、全て試したわけではないです。

教訓

 以上を踏まえると、パワーポイントのスライドマスタ機能でスライド番号の表示を制御するに当たっては、

  • マスター>レイアウト>スライドという3層の階層構造を理解しておく。
  • スライド番号の書式を変えたり削除したりする場合は、上位階層を分けて上位階層で設定するようにしておかないと、自分で個別設定した部分だけ上位階層による制御が効かなくなる。
  • スライド番号のオブジェクト(プレースホルダ)を、ページをまたいでコピペするのはやめたほうが良い。コピペ元とコピペ先で別のレイアウトが適用されている場合、上記の例外が生じる。
  • マスターやレイアウト上でスライド番号の表示を消す時、下位階層ですでに表示されている部分については消えてくれず、18pt黒字に変わって残るので、下位階層においてそれが適用されていた範囲をしっかり確認してから消さなければならない。


 デフォルトのフォントやカラーセットを指定する「テーマ」というものもあってけっこうややこしいですが、これについてはまだよく理解していないです。

R での多項分布に従う乱数の発生(単なるメモ)

 エントリを起こすほどのことでもない単なるメモですが、ちょっとググった感じでは日本語でrmultinom()関数の使い方がぱっと分かるように書かれたページがぱっとは見つからなかったので、一応書いておきます。ヘルプをみればぱっと分かりますが。
 スプラトゥーンで弱い味方と連続でマッチングすることが多いので(言い訳)、「不公平なモデル」と「公平なモデル」の挙動をみて自分を精神的に納得させるためにシミュレーションしようと考えていて、パーツとして使い方を確認したものです。


 引数はn、size、probとあり、

  • nには試行回数(サンプルサイズ)を入れる。
  • sizeには、1回の試行における頻度の総数を入れる。
  • probに入れるベクトルが、クラス数と、各クラスの実現確率を表す。確率は足して1になってなくても自動的に正規化される。


 すると、行がクラス、列が各回の試行、値は各試行時の各クラスの頻度になっている行列が帰ってきます。
 Rのヘルプにも、「単に見るだけなら転置したほうが見やすいよね」と書いてあるので、転置させた表示もしておきます。

> d <- rmultinom(n=30, size = 50, prob = c(0.1,0.5,3,1))  # 乱数を発生
> print(d)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,]    1    2    1    2    0    1    1    1    0     0     0     2     2     2     1     0     1     1     0     2     1
[2,]    5    6    6    5    9    6    4    5    3     4     7     2     3     9     5     5     4     5     4     7     8
[3,]   33   34   32   34   29   36   36   36   30    33    34    35    36    28    36    30    35    35    36    32    30
[4,]   11    8   11    9   12    7    9    8   17    13     9    11     9    11     8    15    10     9    10     9    11
     [,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30]
[1,]     1     0     2     0     1     3     0     1     0
[2,]     7     3     5     3     8     9     3     5     8
[3,]    36    32    28    33    30    27    34    36    35
[4,]     6    15    15    14    11    11    13     8     7
> print(t(d))  # 転置して表示
      [,1] [,2] [,3] [,4]
 [1,]    1    5   33   11
 [2,]    2    6   34    8
 [3,]    1    6   32   11
 [4,]    2    5   34    9
 [5,]    0    9   29   12
 [6,]    1    6   36    7
 [7,]    1    4   36    9
 [8,]    1    5   36    8
 [9,]    0    3   30   17
[10,]    0    4   33   13
[11,]    0    7   34    9
[12,]    2    2   35   11
[13,]    2    3   36    9
[14,]    2    9   28   11
[15,]    1    5   36    8
[16,]    0    5   30   15
[17,]    1    4   35   10
[18,]    1    5   35    9
[19,]    0    4   36   10
[20,]    2    7   32    9
[21,]    1    8   30   11
[22,]    1    7   36    6
[23,]    0    3   32   15
[24,]    2    5   28   15
[25,]    0    3   33   14
[26,]    1    8   30   11
[27,]    3    9   27   11
[28,]    0    3   34   13
[29,]    1    5   36    8
[30,]    0    8   35    7


 当然ですが、sizeを1にすると、probで設定した確率でいずれか1つのクラスが「1」になります。確率に傾斜のある選択を表現するのに便利ですね。

「かけ算の順序」にこだわる教え方を擁護できるかも知れない理屈を一応考えてみる

叩かれる先生たち

 数日前の茂木健一郎氏のブログ記事に限らず、かけ算の順序にこだわった教授法が不毛だとしてネット上で叩かれているのはよくみかける。Wikipediaにもページが設けられているし、この問題について考察した書籍も出ているようだ。


かけ算には順序があるのか (岩波科学ライブラリー)

かけ算には順序があるのか (岩波科学ライブラリー)

  • 作者:高橋 誠
  • 発売日: 2011/05/27
  • メディア: 単行本(ソフトカバー)


 要約すると、日本の小学校ではかけ算を「かけられる数×かける数」「1あたり量×いくつ分」という順序で考えるように教えることになっているらしく、「子どもが6人いて、1人に4個ずつみかんを配ります。みかんは何個必要でしょうか」みたいな問題を解く時に「4×6=24」と書けば正解だが、「6×4=24」だと不正解ということにされてしまい、そういうプリントを見つけた親が「こんなバカなことがあるか」と画像をTwitterでさらして教師を叩くというのが、この季節の風物詩になっているという問題である。季節性があるのは、小2の10月頃からかけ算を教え始めるからだろう。


togetter.com
togetter.com
d.hatena.ne.jp


 中には足し算でも同じ問題が生じているとの記事もある。

togetter.com


擁護できるかどうかを考えてみる

 ネット上では「順序こだわり教育」に反対の声が99%ぐらいを占めており、小学校の先生たちはもっぱら叩かれている。私は叩かれている人をみると擁護してみたくなるほうなので、擁護するロジックはないものかと少し考えてみた。
 すこし考えただけであって、大して調べ物もしていないのだが、とりあえず現時点では、

  • 式を書く順序にいったんこだわることに全く意味がないとも言えない。
  • しかし「6×4=24」という式にバツを付けるのはやっぱり行き過ぎだろう。
  • とは言え、目くじらを立てるほど有害なことなのかもハッキリせず、ネット上の批判は過剰反応な気もする。


 という感じの印象を持った。もっと調べたら印象が変わるかもしれないが、あまり調べる気はない。

欧米でも順序にこだわる人はいるらしい

 まず前提として、かけ算を書く順序にこだわるのは日本の学校だけではなく、欧米でもそういう事例はあるようだ。上で参照したようなかけ算の順序問題についての記事を読んでいくと、欧米では「かける数×かけられる数」の順で書くように指導されているという話がよく紹介されている(よく読んでないのでどの国でというのは知らん)。日本とは逆に教えているわけである。
 欧米人が逆の順序で教えていて大きな問題がないのであれば、日本で採用されている順序に絶対的な意味はないということになる(言語や文化によって、どっち順のほうが理解しやすいというのはあるかもしれないが)。
 と同時に、欧米でも一応順序を気にして教えているケースがあるのだとすると、べつに日本の先生だけが特別おかしいというわけでもないということになる。
 そもそも、PISAの国際学力比較で日本の子どもの数学的リテラシーはべつに低くはないので、全体として日本の算数教育だけがめちゃめちゃ大きく間違っているというわけではないのだと思う。もちろん、だからといって、順序こだわり教育という特定の教授法が効果的であることの証にはならないのだが。

擁護派の代表的な主張

 順序こだわり教育の擁護派の主張として最も代表的なものは、「文章題にでてくる数字を順番に並べて適当に式を書いている子どもがいるから」というもののようだ。(追記:最もなのか確かめてはないが。)
 たしかに、文章に出てくる数字をそのままに並べて適当に記号を書いて計算しても、当たってしまうことはけっこうありそうだから、子どもの理解を確かめるために、「かけられる数×かける数」という概念整理にいったんこだわり、その順で式が表現されていなければ理解の程度を疑ってみるというのは分からなくはない。


 生徒はひょっとしたら、現実の問題をかけ算として処理する概念操作を完全に理解した上で、自分の好みで先生とは逆順に式を書いているだけかもしれない。また、かけ算の概念を理解するための方法として、「かけられる数×かける数」という枠組みは、ある生徒には有益だが別の生徒には有害かもしれない。そもそも、「かけられる数」と「かける数」に区別して考える方法を採るとしても、どっちかを先に書かなければならないと決めつける本質的な理由はない(実際、欧米の学校では「かける数」を先に書くらしいし)。


 しかし先生たちの言い分を勝手に代弁すると、学習の初期に、しかも1人で何十人かの生徒を相手にするような場面では、ひとまずある特定の枠組みに沿って教えざるを得ないとは言えるだろう。また、少なくとも教えた通りに式を書いていないのであれば、ひとまず「コイツ理解してないのでは?」と疑ってみるのは正当なことであろう。
 順序こだわり教育を批判している大人たちは、子どもたちが「現実の問題をかけ算として処理する概念操作を完全に理解した上で、自分の好みで先生とは逆順に式を書いているだけ」だと暗に想定しているのだと思うが、その想定が外れているケースもけっこうありそうには思う。実際、低学年の子供に勉強を教えてみるとわかるのだが、大人からみると「なんで?」と不思議になるような手順でモノを考えていることはよくある。


 もちろん、本質的に重要なのは式を書く順序などではなく、概念の操作が上手くできているかの見極めだから、「6×4=24」と書いたからといって形式的にバツを付けるのは、杓子定規が行き過ぎているとは言えるのだが。

計算ではなく数式化の練習をしているのだと考えてみる

 「4かける6」みたいな単純な計算であれば、書く順番が逆だからといってバツを付けるのはやり過ぎであるように思えるし、そもそも「かける数×かけられる数」という表記が「逆」だというわけですらない。
 しかし大人でも、ある程度複雑なできごとを数式に置き直す際は、頭が混乱しないように数式を書く順番やまとめ方を工夫するはずだ。「数学的に演算内容が同じであればどう書いても問題がない」というわけではなく、「頭が混乱しにくいように書く」スキルというものが存在するわけである。


 小学校における算数の指導が、「頭が混乱しにくいように現実の問題を数式に置き換える練習」でもあるのだとすれば、順序にこだわった教授法にも意味があるのかもしれない。小学校の教材がが扱うのは大人から見れば単純な例だから、大人から見ると「そんなところで順序にこだわっても意味ないだろ」と思ってしまうのだが、複雑な計算において大人が行っていることを、子どものレベルで行っているだけだと考えれば、順序に意味を持たせるのもさほど変な教育というわけではないのではないだろうか。どの書き方が混乱しにくいのかは人によるから、正解不正解とは関係なく指導されるほうが望ましいとは思うが、少なくとも「混乱しにくい順序に整理するよう教育することに意味がない」とは言えない。
 まぁそれでも、繰り返しになるが、バツをつけて順番を守らせることが大事なのではなく、概念の操作がきちんとできているかを確認しないといけないと思うが。

コーディング規約のようなものだと思ってみる

 プログラミングを行う際に「コーディング規約」を定めたりするように、演算内容が同じであっても複数の人間が読みやすいようにロジックを表現するという努力には意味がある場合がある。
 かけ算を、「かけられる数×かける数」「1あたり量×いくつ分」の順で表現することを叩きこむ作業が、単なる計算の訓練ではなく「計算をめぐるコミュニケーション」の訓練も兼ねていると理解すれば、先生が言うとおりの順番で書かなければ不正解という指導にも意味はあるかもしれない。


 そもそも、「計算が合っていればどう書いても良い」という立場をとると、極端にいえば、「4×6=24」と書かずに「4,6,24」とか「24(6・4)」とか書いてあってもマルを付けなければならない。あるいは、子どもが「みかん1個は必ず10の房から成る」と思い込んでおり、まず房単位で数えたあとに9を引いてみかんの個数に直すという変わった考え方をしていて、「10×4×6=240、9×4×6=216、240−216=24」という謎の式を書いていても、結論は合っているからマルを付けなければならない。

 さすがに順序こだわり派じゃない先生もそこまで寛容ではないだろう。では、「6×4=24」にバツを付けるのは、これらのケースと本質的にどう違うのか?
 恐らく本質的にはあまり違わなくて、単に程度の問題ということだろう。理解可能な別の表現で書いているか、見たこともない謎の表現で書いているかの違いである。


 もちろん、「10×4×6=240、9×4×6=216、240−216=24」でも論理的に正解に辿り着いているのだから、余裕があれば「君は面白い考え方をするな」と褒めてやればいいと思う。しかし学校の先生にそこまで求めるのも酷だとは思うので、「私は理解してますよ」ということを先生にわかりやすく伝えるコミュニケーション作法を、生徒にある程度強要するのもやむを得ないというか、それも教育の一環であるとは言えるのではないだろうか。

過剰反応かも(その1)

 ところで、さきほど「ネット上の批判は過剰反応な気もする」と書いたのだが、それはかけ算順序問題について、ひょっとしたら誤解とか誇張もあるかもしれないとも思ったためである。
 私も詳しく調べてはいないので、現時点では「以下のような想像から、ネット上の批判は過剰反応かもしれないと思っているが、この想像は間違っているかもしれない」程度の話として書き留めておく。


 まず1つめ。ネット上で、「最近の子どもはかわいそうだ」「最近は教師が劣化している」みたいなコメントをみかけた気がするのだが、この順序論争は何十年も前からあるらしいので、「最近は〜」と怒っている人はたまたま自分が順序にこだわらない担任に当たったか、自分がどのような教え方をされたかを覚えていないだけだろう。
 実際私は、小2の授業でどんな教え方をされたかなんて、全く覚えてない。かけ算で覚えてるのは、九九のテープ(CDじゃなかった)を聴かされて歌で覚えたということぐらいだ。覚えてないということは、私も「4×6が正解で6×4は不正解」という指導をされていた可能性を否定できないし、「最近の教師は〜」と怒っている人達も、じつはそういう指導のもとでかけ算の文章題に取り組んでいた可能性はある。
 順序こだわり教育を受けても、順序こだわり教育を批判できる人間に育つのであれば、デメリットがあったとしても限られているんじゃないだろうか。また、順序こだわり教育のおかげでかけ算の概念操作に慣れることができ、慣れた結果として次第に自己流の式の書き方ができるようになっていって、慣れる前のことは忘れただけかもしれない。

過剰反応かも(その2)

 また、「6×4」にバツを付けるやり方が行われているのは小2のごく一時期に限られるかも知れない。
 「順序違いの式を不正解にするのは小2の秋〜冬だけであり、高学年になったらどう書いても正解にされている」のと、「高学年や中学生になっても、順序が違えば不正解にされる」のとでは、先生が叩かれるべきか否かの評価は異なるはずである。小2の秋〜冬のかけ算導入期にそういう教え方をしているだけであれば、算数や勉強に限らず何事も最初は先生の流儀を押し付けることによって学習が進む面があるのだから、「バツを付けるのはちょっと杓子定規が行き過ぎているなぁ」程度に思っておけばいいような気はする。
 しかしその辺が、ネット上の論争ではハッキリしていないのでは?
 ひょっとしたら、批判している人たちは、小2の一時期に限って起きている現象を過大に受け止めて怒っている可能性もあるのではないだろうか(高学年でもバツを付けるのが蔓延しているのかもしれないが、私はそれを判断できるほど調べてはない)。

過剰反応かも(その3)

 もう1つ誤解がありそうなのは、学習指導要領や参考書において「かけられる数×かける数」という思想が根強いのが事実であり、Twitterで逆順の式にバツを付けた例がたまに報告されるからと言って、実際にほとんどの先生がバツを付けているのかどうかはよく分からないということ。式にバツを付けて答えにはマルを付けている先生がいるという話もみかけたし、実際にはマルかバツを付けた上で個別に指導しているかもしれないし、順序を気にしない先生も多いかもしれない。
 バツを付けられた子どもの親がTwitterで騒ぎ、裏付けとして別の人が「かけられる数×かける数」の思想が表現された指導マニュアルを引用すると、あたかも「順序が違ったらバツ」という指導が日本中で蔓延しているかのように思えてくるのだが、本当にそうなのかはよく分からない。(調査データがあるのかもしれないが、調べてない。)

効果のある教授法なのか

 色々論争が行われているのだが、結局のところ重要なのは、「交換法則が成り立つので、数学的には順序はどうでもいい」とかいう話ではなく、小学校2年生におけるかけ算の導入初期に、順序にこだわった教授法を採ったほうが概念の理解が進むのか否かだ。順序にこだわったほうが理解が進むという効果が実際にあるのであれば、数学的にどうかとかは関係なく、こだわる意味はあると言える。
 これについては何か調査や実験のデータがありそうな気がするが、私は調べてない。Wikipediaの記事中で紹介されている研究だと、例えば式を逆に書いている生徒であっても絵はちゃんと描けているという報告があり、これは式を逆に書いていても理解に問題はないと取ることも可能だ(報告ではそういう解釈はされてないが)。


 なんかデータとかあったら誰か教えてください。

まとめ

 まとめるとですね、

  • 計算そのものだけではなく、現実の問題をかけ算の処理に置き換えるという概念操作を教えたい。
  • その教え方の枠組は色々あり得るが、とりあえず、文章題を「かけられる数×かける数」「1あたり量×いくつ分」の形に整理するという教授法を採用することとする。
  • その形に整理するように子どもたちに教えたところ、式を逆順で書いている生徒が何人かいた。
  • 逆順で書いている生徒が、かけ算の概念操作は完ペキに理解した上で好みで逆に書いているのか、教えたことを理解してないのかは、この時点ではハッキリ分からない。
  • かけ算に慣れてくれば自己流の計算方法を許してもいいと思うが、最初のうちは、教えたことが伝わってるかをきちんと確認したいから、教えた通りの考え方で式を書いてほしい。
  • だからとりあえず、逆順に書いた生徒の式にはバツをつけて、「1あたり量×いくつ分」の形で書いてね!と指導した。
  • なお、逆順にバツをつけるのはあくまで小2のかけ算導入初期のみであって、高学年になればみんなかけ算の概念操作を理解していると信じられるから、逆順に書いていてもそれは単なる好みだろうとみなしてバツはつけない。
  • 先生によっては、小2のかけ算導入期であっても、バツは付けず生徒に個別に問いかけて、理解の度合いを確かめている。


 というのが実情だった場合、バツをつけるのはやり過ぎ感もあるものの、順序に意味を持たせた教え方には一応理由があるし、「最初ぐらい俺の教えたとおりに書いてくれよ」と思う先生の気持ちも分かるし、実際うるさく言うのは最初だけであってべつに大きな弊害はないわけなので、声を大にして先生を叩くほどのことではないように思える。
 まぁ私がいいたいのは要するに、ネット上(とくにツイッター)では「自分の子供の先生」を叩く人がやけに多くて、先生が気の毒ってことなんですが。ただまぁやはり、理解してるのかも知れないから、バツ付けて放置はかわいそうだと思うが。

追記

出版社が出してる授業ガイドで6年生向けにも順序こだわり教育が推奨されているらしく、交換法則を教えた上でやっているのであれば一貫性がなく、やばみしかない。
http://b.hatena.ne.jp/entry/309247508/comment/uncorrelatedb.hatena.ne.jp
www.anlyznews.com

 

機械翻訳に関する記事を読んで面白いと思ったこと(与太話)

 短いし大したことは言わないし正確に理解もできていないので、ブログ記事にするのもためらわれますが、Twitterの字数では書けないのでここに書きます。
 以下の、機械翻訳の現状に関する記事を読み、大変参考になりました。


rekken.g.hatena.ne.jp


 それで学説史的に興味深いなと感じたのでメモしておきます。与太話です。
 1960年代から70年代にかけて「認知革命」というアカデミアのムーブメントがあったと言われます。心理学、言語学、脳科学、計算機科学とかそういった分野にまたがる運動だったんだけど、心理学の方面から見た時によく言われるのは、「記号(表象)の関係をモデル化する」という研究が推し進められたのが特徴であったということ。それまでは、パブロフとかスキナーといった名前が有名だけど、「行動主義」という考え方があって、心の中身はモデル化することはできないから、外面的に観察できる「刺激」と「反応」のパターンだけを分析しようみたいな話だったらしい。
 行動主義への反動として捉えてしまうと理解が狭くなるとの意見はあってWikipediaにも載ってますが(リンク)、細かいことは知りません。
 面白いと思ったのは、「刺激と反応のパターンをみるだけじゃなくて、記号を媒介にして心のモデルを考えたほうがいろいろ分かるよ」というムーブメントが昔あったのが、今やある意味逆転して、脳の構造ににたニューラルネットワークを構築して入力と出力を大量に与えてやると、処理の中身をモデルとして理解するのは困難だけどとにかく結構正確な対応が得られる的な状態になってしまっておるのだと。
 これを半世紀前の「認知革命」の逆流として学説史を描いてくれるような人がいたら面白いなぁと思った。見方によっては逆流ではない、みたいなのも含めて。
 もちろんそういう理解が正しくなければ、そんな描かれ方はしないわけで、私には判断が付きませんが。


 もう1つ面白いと思うことがあります。ニューラルネットの歴史が語られる時って、「基本構想は1940年代ぐらいからあったもののなかなか性能が出なかった。しかしバックプロパゲーションというブレイクスルーがあり、さらにオートエンコーダによる事前学習が……」みたいな説明がされますよね。それで私はたまたま自分がやってる研究に登場するから名前を知ってるんですが、認知革命期の心理学者でDavid Rumelhart(リンク)という人がおりました。私が読んでいたのは、この人が、人間が「物語」を作ったり理解するときに、文単位における「文法」のような共通の構造があるのではないかという仮説を立てて、「ストーリー・グラマー」というモデルを考案していた研究です。これはだいぶ思いつきめいた研究で、特に深まることもなく人々に忘れられていったのですが、一応同じ研究をしてたThorndykeという人(有名なEdward Thorndikeとは別人のPerry Thorndyke)の実験が今も学部向けの心理学の教科書に載ってたりします。
 ストーリー・グラマー論(理論というほどじゃないので論にしとく)はチョムスキーの生成文法理論の影響を明らかに受けているもので、というか生成文法ブームにのって調子にのって物語の構造分析にも適用できるか試したくなりましたみたいな研究なんですが、物語を理解するときの心の挙動を、記号を媒介にしてモデル化しようとしているという意味で、まさに認知革命的な研究です。
 で、じつはこのRumelhartは計算機科学の分野でも有名で、バックプロパゲーションの手法を提案したことと、並列分散処理のモデルを提案したことで知られてるんですよね。80年代くらいに。彼の研究が、現在のニューラルネットにおけるバックプロパゲーションの処理や、GPGPUなども駆使した並列分散処理においてどれほど貢献しているのかというのは私は全く知りませんし、ほとんど貢献はないのかもしれませんが、なんかすごい奇遇な気がして面白いです。認知革命の権化みたいな心理学者が提案した(のと類似の)技術によって、認知革命的アプローチが不要になってきているのだとすれば。


 「何が面白いの?」と言われたら、単に「俺が別々に知ってた話が予想外のつながり方をしてて面白い」っていう個人的な話なので、この記事にディープな意味合いは何もないと思っていただければと思います。
 昼休みに思いつきで書きなぐってるので、あとで消すかもしれません。今から仕事します。